extern xcb_connection_t *conn;
void floating_enable(Con *con, bool automatic) {
- bool set_focus = true;
+ bool set_focus = (con == focused);
+
+ if (con->parent && con->parent->type == CT_DOCKAREA) {
+ LOG("Container is a dock window, not enabling floating mode.\n");
+ return;
+ }
if (con_is_floating(con)) {
LOG("Container is already in floating mode, not doing anything.\n");
int deco_height = config.font.height + 5;
DLOG("Original rect: (%d, %d) with %d x %d\n", con->rect.x, con->rect.y, con->rect.width, con->rect.height);
+ DLOG("Geometry = (%d, %d) with %d x %d\n", con->geometry.x, con->geometry.y, con->geometry.width, con->geometry.height);
Rect zero = { 0, 0, 0, 0 };
nc->rect = con->geometry;
/* If the geometry was not set (split containers), we need to determine a
/* add pixels for the decoration */
/* TODO: don’t add them when the user automatically puts new windows into
* 1pixel/borderless mode */
- nc->rect.height += deco_height + 4;
+ nc->rect.height += deco_height + 2;
nc->rect.width += 4;
+ /* Honor the X11 border */
+ nc->rect.height += con->border_width * 2;
+ nc->rect.width += con->border_width * 2;
+
/* Some clients (like GIMP’s color picker window) get mapped
* to (0, 0), so we push them to a reasonable position
* (centered over their leader) */
nc->rect.x, nc->rect.y);
/* Take the relative coordinates of the current output, then add them
* to the coordinate space of the correct output */
- uint32_t rel_x = (nc->rect.x - current_output->con->rect.x);
- uint32_t rel_y = (nc->rect.y - current_output->con->rect.y);
+ uint32_t rel_x = (nc->rect.x - (current_output ? current_output->con->rect.x : 0));
+ uint32_t rel_y = (nc->rect.y - (current_output ? current_output->con->rect.y : 0));
nc->rect.x = correct_output->rect.x + rel_x;
nc->rect.y = correct_output->rect.y + rel_y;
}
con->percent = 1.0;
con->floating = FLOATING_USER_ON;
+ /* 4: set the border style as specified with new_float */
+ if (automatic)
+ con->border_style = config.default_floating_border;
+
TAILQ_INSERT_TAIL(&(nc->nodes_head), con, nodes);
TAILQ_INSERT_TAIL(&(nc->focus_head), con, focused);
render_con(nc, false);
render_con(con, false);
- // TODO: don’t influence focus handling when Con was not focused before.
if (set_focus)
con_focus(con);
Con *content = output_get_content(output->con);
Con *ws = TAILQ_FIRST(&(content->focus_head));
DLOG("Moving con %p / %s to workspace %p / %s\n", con, con->name, ws, ws->name);
- con_move_to_workspace(con, ws);
+ con_move_to_workspace(con, ws, false, true);
con_focus(con_descend_focused(con));
return true;
}