xcb_flush(conn);
}
-/**
+/*
* Called when a floating window is created or resized.
* This function resizes the window if its size is higher or lower than the
* configured maximum/minimum size, respectively.
border_rect.height += render_deco_height();
}
- if (focused_con->window != NULL) {
- if (focused_con->window->min_width) {
+ i3Window *window = focused_con->window;
+ if (window != NULL) {
+ if (window->min_width) {
+ floating_con->rect.width -= border_rect.width;
+ floating_con->rect.width = max(floating_con->rect.width, window->min_width);
+ floating_con->rect.width += border_rect.width;
+ }
+
+ if (window->min_height) {
+ floating_con->rect.height -= border_rect.height;
+ floating_con->rect.height = max(floating_con->rect.height, window->min_height);
+ floating_con->rect.height += border_rect.height;
+ }
+
+ if (window->max_width) {
floating_con->rect.width -= border_rect.width;
- floating_con->rect.width = max(floating_con->rect.width, focused_con->window->min_width);
+ floating_con->rect.width = min(floating_con->rect.width, window->max_width);
floating_con->rect.width += border_rect.width;
}
- if (focused_con->window->min_height) {
+ if (window->max_height) {
floating_con->rect.height -= border_rect.height;
- floating_con->rect.height = max(floating_con->rect.height, focused_con->window->min_height);
+ floating_con->rect.height = min(floating_con->rect.height, window->max_height);
floating_con->rect.height += border_rect.height;
}
- if (focused_con->window->height_increment &&
- floating_con->rect.height >= focused_con->window->base_height + border_rect.height) {
- floating_con->rect.height -= focused_con->window->base_height + border_rect.height;
- floating_con->rect.height -= floating_con->rect.height % focused_con->window->height_increment;
- floating_con->rect.height += focused_con->window->base_height + border_rect.height;
+ if (window->height_increment &&
+ floating_con->rect.height >= window->base_height + border_rect.height) {
+ floating_con->rect.height -= window->base_height + border_rect.height;
+ floating_con->rect.height -= floating_con->rect.height % window->height_increment;
+ floating_con->rect.height += window->base_height + border_rect.height;
}
- if (focused_con->window->width_increment &&
- floating_con->rect.width >= focused_con->window->base_width + border_rect.width) {
- floating_con->rect.width -= focused_con->window->base_width + border_rect.width;
- floating_con->rect.width -= floating_con->rect.width % focused_con->window->width_increment;
- floating_con->rect.width += focused_con->window->base_width + border_rect.width;
+ if (window->width_increment &&
+ floating_con->rect.width >= window->base_width + border_rect.width) {
+ floating_con->rect.width -= window->base_width + border_rect.width;
+ floating_con->rect.width -= floating_con->rect.width % window->width_increment;
+ floating_con->rect.width += window->base_width + border_rect.width;
}
}
Con *parent = con->parent;
/* clear the pointer before calling tree_close_internal in which the memory is freed */
con->parent = NULL;
- tree_close_internal(parent, DONT_KILL_WINDOW, false, false);
+ tree_close_internal(parent, DONT_KILL_WINDOW, false);
}
char *name;
}
Con *ws = con_get_workspace(con);
+ if (con_is_internal(ws)) {
+ LOG("Can't disable floating for container in internal workspace.\n");
+ return;
+ }
Con *tiling_focused = con_descend_tiling_focused(ws);
if (tiling_focused->type == CT_WORKSPACE) {
Con *parent = con->parent;
con_detach(con);
con->parent = NULL;
- tree_close_internal(parent, DONT_KILL_WINDOW, true, false);
+ tree_close_internal(parent, DONT_KILL_WINDOW, true);
con_attach(con, tiling_focused, false);
con->percent = 0.0;
con_fix_percent(con->parent);
}
/* If the user cancelled, undo the changes. */
- if (drag_result == DRAG_REVERT)
+ if (drag_result == DRAG_REVERT) {
floating_reposition(con, initial_rect);
+ return;
+ }
/* If this is a scratchpad window, don't auto center it from now on. */
if (con->scratchpad_state == SCRATCHPAD_FRESH)
free(event);
if (dragloop->result != DRAGGING) {
- free(last_motion_notify);
ev_break(EV_A_ EVBREAK_ONE);
- return true;
+ if (dragloop->result == DRAG_SUCCESS) {
+ /* Ensure motion notify events are handled. */
+ break;
+ } else {
+ free(last_motion_notify);
+ return true;
+ }
}
}
FREE(last_motion_notify);
xcb_flush(conn);
- return false;
+ return dragloop->result != DRAGGING;
}
static void xcb_drag_prepare_cb(EV_P_ ev_prepare *w, int revents) {
* rect of the client, the event and the new coordinates (x, y).
*
*/
-drag_result_t drag_pointer(Con *con, const xcb_button_press_event_t *event, xcb_window_t
- confine_to,
+drag_result_t drag_pointer(Con *con, const xcb_button_press_event_t *event, xcb_window_t confine_to,
border_t border, int cursor, callback_t callback, const void *extra) {
xcb_cursor_t xcursor = (cursor && xcursor_supported) ? xcursor_get_cursor(cursor) : XCB_NONE;
con->rect = newrect;
- floating_maybe_reassign_ws(con);
+ bool reassigned = floating_maybe_reassign_ws(con);
/* If this is a scratchpad window, don't auto center it from now on. */
if (con->scratchpad_state == SCRATCHPAD_FRESH)
con->scratchpad_state = SCRATCHPAD_CHANGED;
- tree_render();
+ /* Workspace change will already result in a tree_render. */
+ if (!reassigned) {
+ render_con(con, false);
+ x_push_node(con);
+ }
return true;
}
* window's size hints.
*
*/
-void floating_resize(Con *floating_con, int x, int y) {
+void floating_resize(Con *floating_con, uint32_t x, uint32_t y) {
DLOG("floating resize to %dx%d px\n", x, y);
Rect *rect = &floating_con->rect;
Con *focused_con = con_descend_focused(floating_con);