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");
nc->rect.height += deco_height + 4;
nc->rect.width += 4;
+ /* 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) */
+ if (nc->rect.x == 0 && nc->rect.y == 0) {
+ Con *leader;
+ if (con->window && con->window->leader != XCB_NONE &&
+ (leader = con_by_window_id(con->window->leader)) != NULL) {
+ DLOG("Centering above leader\n");
+ nc->rect.x = leader->rect.x + (leader->rect.width / 2) - (nc->rect.width / 2);
+ nc->rect.y = leader->rect.y + (leader->rect.height / 2) - (nc->rect.height / 2);
+ } else {
+ /* center the window on workspace as fallback */
+ nc->rect.x = ws->rect.x + (ws->rect.width / 2) - (nc->rect.width / 2);
+ nc->rect.y = ws->rect.y + (ws->rect.height / 2) - (nc->rect.height / 2);
+ }
+ }
+
/* Sanity check: Are the coordinates on the appropriate output? If not, we
* need to change them */
Output *current_output = get_output_containing(nc->rect.x, nc->rect.y);
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;
- /* 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) */
- if (nc->rect.x == 0 && nc->rect.y == 0) {
- Con *leader;
- if (con->window && con->window->leader != XCB_NONE &&
- (leader = con_by_window_id(con->window->leader)) != NULL) {
- DLOG("Centering above leader\n");
- nc->rect.x = leader->rect.x + (leader->rect.width / 2) - (nc->rect.width / 2);
- nc->rect.y = leader->rect.y + (leader->rect.height / 2) - (nc->rect.height / 2);
- } else {
- /* center the window on workspace as fallback */
- nc->rect.x = ws->rect.x + (ws->rect.width / 2) - (nc->rect.width / 2);
- nc->rect.y = ws->rect.y + (ws->rect.height / 2) - (nc->rect.height / 2);
- }
- }
+ /* 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;
}