* We will skip handling events on floating cons in fullscreen mode */
Con *fs = (ws ? con_get_fullscreen_con(ws, CF_OUTPUT) : NULL);
if (floatingcon != NULL && fs != con) {
- floating_raise_con(floatingcon);
-
/* 4: floating_modifier plus left mouse button drags */
if (mod_pressed && event->detail == XCB_BUTTON_CLICK_LEFT) {
floating_drag_window(floatingcon, event);
workspace_update_urgent_flag(con_get_workspace(con));
ipc_send_window_event("urgent", con);
}
+
+ /* Focusing a container with a floating parent should raise it to the top. Since
+ * con_focus is called recursively for each parent we don't need to use
+ * con_inside_floating(). */
+ if (con->type == CT_FLOATING_CON) {
+ floating_raise_con(con);
+ }
}
/*
return;
}
- if (focused_id == event->event) {
+ /* Floating windows should be refocused to ensure that they are on top of
+ * other windows. */
+ if (focused_id == event->event && !con_inside_floating(con)) {
DLOG("focus matches the currently focused window, not doing anything\n");
return;
}
return;
}
- DLOG("focus is different, updating decorations\n");
+ DLOG("focus is different / refocusing floating window: updating decorations\n");
/* Get the currently focused workspace to check if the focus change also
* involves changing workspaces. If so, we need to call workspace_show() to
con_focus(con);
/* We update focused_id because we don’t need to set focus again */
focused_id = event->event;
- x_push_changes(croot);
+ tree_render();
return;
}
is($x->input_focus, $floating->id, 'floating window focused');
+#############################################################################
+# 8: verify that focusing a floating window raises it to the top.
+# This test can't verify that the floating container is visually on top, just
+# that it is placed on the tail of the floating_head.
+# See issue: 2572
+#############################################################################
+
+$tmp = fresh_workspace;
+
+$first = open_floating_window;
+$second = open_floating_window;
+
+is($x->input_focus, $second->id, 'second floating window focused');
+my $ws = get_ws($tmp);
+is($ws->{floating_nodes}->[1]->{nodes}->[0]->{window}, $second->id, 'second on top');
+is($ws->{floating_nodes}->[0]->{nodes}->[0]->{window}, $first->id, 'first behind');
+
+cmd '[id=' . $first->id . '] focus';
+
+is($x->input_focus, $first->id, 'first floating window focused');
+$ws = get_ws($tmp);
+is($ws->{floating_nodes}->[1]->{nodes}->[0]->{window}, $first->id, 'first on top');
+is($ws->{floating_nodes}->[0]->{nodes}->[0]->{window}, $second->id, 'second behind');
+
done_testing;