Prevent workspace change during global fullscreen
Patch status: merged
Patch by Mats
Long description:
While in global fullscreen, the workspace could be changed leaving the fullscreen container still visible on top but losing its focus.
To apply this patch, use:
curl http://cr.i3wm.org/patch/686/raw.patch | git am
b/src/commands.c
16 |
@@ -958,6 +958,12 @@ void cmd_workspace(I3_CMD, char *which) { |
17 |
|
18 |
DLOG("which=%s\n", which); |
19 |
|
20 |
+ if (con_get_fullscreen_con(croot, CF_GLOBAL)) { |
21 |
+ LOG("Cannot switch workspace while in global fullscreen\n"); |
22 |
+ ysuccess(false); |
23 |
+ return; |
24 |
+ } |
25 |
+ |
26 |
if (strcmp(which, "next") == 0) |
27 |
ws = workspace_next(); |
28 |
else if (strcmp(which, "prev") == 0) |
29 |
@@ -986,6 +992,12 @@ void cmd_workspace(I3_CMD, char *which) { |
30 |
void cmd_workspace_number(I3_CMD, char *which) { |
31 |
Con *output, *workspace = NULL; |
32 |
|
33 |
+ if (con_get_fullscreen_con(croot, CF_GLOBAL)) { |
34 |
+ LOG("Cannot switch workspace while in global fullscreen\n"); |
35 |
+ ysuccess(false); |
36 |
+ return; |
37 |
+ } |
38 |
+ |
39 |
long parsed_num = ws_name_to_number(which); |
40 |
|
41 |
if (parsed_num == -1) { |
42 |
@@ -1020,6 +1032,12 @@ void cmd_workspace_number(I3_CMD, char *which) { |
43 |
* |
44 |
*/ |
45 |
void cmd_workspace_back_and_forth(I3_CMD) { |
46 |
+ if (con_get_fullscreen_con(croot, CF_GLOBAL)) { |
47 |
+ LOG("Cannot switch workspace while in global fullscreen\n"); |
48 |
+ ysuccess(false); |
49 |
+ return; |
50 |
+ } |
51 |
+ |
52 |
workspace_back_and_forth(); |
53 |
|
54 |
cmd_output->needs_tree_render = true; |
55 |
@@ -1038,6 +1056,12 @@ void cmd_workspace_name(I3_CMD, char *name) { |
56 |
return; |
57 |
} |
58 |
|
59 |
+ if (con_get_fullscreen_con(croot, CF_GLOBAL)) { |
60 |
+ LOG("Cannot switch workspace while in global fullscreen\n"); |
61 |
+ ysuccess(false); |
62 |
+ return; |
63 |
+ } |
64 |
+ |
65 |
DLOG("should switch to workspace %s\n", name); |
66 |
if (maybe_back_and_forth(cmd_output, name)) |
67 |
return; |
b/testcases/t/100-fullscreen.t
72 |
@@ -192,6 +192,26 @@ cmd 'focus left'; |
73 |
is($x->input_focus, $window->id, 'fullscreen window still focused'); |
74 |
|
75 |
################################################################################ |
76 |
+# Verify that changing workspace while in global fullscreen does not work. |
77 |
+################################################################################ |
78 |
+ |
79 |
+$tmp = fresh_workspace; |
80 |
+$window = open_window; |
81 |
+ |
82 |
+cmd 'fullscreen global'; |
83 |
+is($x->input_focus, $window->id, 'window focused'); |
84 |
+is(focused_ws(), $tmp, 'workspace selected'); |
85 |
+ |
86 |
+$other = get_unused_workspace; |
87 |
+cmd "workspace $other"; |
88 |
+is($x->input_focus, $window->id, 'window still focused'); |
89 |
+is(focused_ws(), $tmp, 'workspace still selected'); |
90 |
+ |
91 |
+# leave global fullscreen so that is does not interfere with the other tests |
92 |
+$window->fullscreen(0); |
93 |
+sync_with_i3; |
94 |
+ |
95 |
+################################################################################ |
96 |
# Verify that fullscreening a window on a second workspace and moving it onto |
97 |
# the first workspace unfullscreens the first window. |
98 |
################################################################################ |