Skip to content

Commit 8f0d29c

Browse files
committed
X11: Use XFixesSetWindowShape to hide windows and disallow input
1 parent 3cf1cbd commit 8f0d29c

File tree

3 files changed

+57
-0
lines changed

3 files changed

+57
-0
lines changed

lib/Utils.vala

Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -400,5 +400,50 @@ namespace Gala {
400400

401401
return texture;
402402
}
403+
404+
private static HashTable<Meta.Window, X.XserverRegion?> regions = new HashTable<Meta.Window, X.XserverRegion?> (null, null);
405+
406+
public static void x11_set_window_pass_through (Meta.Window window) {
407+
unowned var x11_display = window.display.get_x11_display ();
408+
409+
#if HAS_MUTTER46
410+
var x_window = x11_display.lookup_xwindow (window);
411+
#else
412+
var x_window = window.get_xwindow ();
413+
#endif
414+
unowned var xdisplay = x11_display.get_xdisplay ();
415+
416+
regions[window] = X.Fixes.create_region_from_window (xdisplay, x_window, 0);
417+
418+
X.Xrectangle rect = {};
419+
420+
var region = X.Fixes.create_region (xdisplay, {rect});
421+
422+
X.Fixes.set_window_shape_region (xdisplay, x_window, 2, 0, 0, region);
423+
424+
X.Fixes.destroy_region (xdisplay, region);
425+
}
426+
427+
public static void x11_unset_window_pass_through (Meta.Window window) {
428+
unowned var x11_display = window.display.get_x11_display ();
429+
430+
#if HAS_MUTTER46
431+
var x_window = x11_display.lookup_xwindow (window);
432+
#else
433+
var x_window = window.get_xwindow ();
434+
#endif
435+
unowned var xdisplay = x11_display.get_xdisplay ();
436+
437+
var region = regions[window];
438+
439+
if (region == null) {
440+
return;
441+
}
442+
443+
X.Fixes.set_window_shape_region (xdisplay, x_window, 2, 0, 0, region);
444+
445+
regions.remove (window);
446+
X.Fixes.destroy_region (xdisplay, region);
447+
}
403448
}
404449
}

src/ShellClients/PanelClone.vala

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -127,6 +127,10 @@ public class Gala.PanelClone : Object {
127127

128128
panel_hidden = true;
129129

130+
if (!Meta.Util.is_wayland_compositor ()) {
131+
Utils.x11_set_window_pass_through (panel.window);
132+
}
133+
130134
if (panel.anchor != TOP && panel.anchor != BOTTOM) {
131135
warning ("Animated hide not supported for side yet.");
132136
return;
@@ -146,6 +150,10 @@ public class Gala.PanelClone : Object {
146150
return;
147151
}
148152

153+
if (!Meta.Util.is_wayland_compositor ()) {
154+
Utils.x11_unset_window_pass_through (panel.window);
155+
}
156+
149157
clone.save_easing_state ();
150158
clone.set_easing_mode (Clutter.AnimationMode.EASE_OUT_QUAD);
151159
clone.set_easing_duration (get_animation_duration ());

vapi/xfixes-4.0.vapi

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,8 +6,12 @@ namespace X {
66
namespace Fixes {
77
[CCode (cheader_filename = "X11/extensions/Xfixes.h", cname = "XFixesCreateRegion")]
88
public static X.XserverRegion create_region (X.Display display, [CCode (array_length = true)] X.Xrectangle[] rectangles);
9+
[CCode (cheader_filename = "X11/extensions/Xfixes.h", cname = "XFixesCreateRegionFromWindow")]
10+
public static X.XserverRegion create_region_from_window (X.Display display, X.Window window, int shape_kind);
911
[CCode (cheader_filename = "X11/extensions/Xfixes.h", cname = "XFixesDestroyRegion")]
1012
public static void destroy_region (X.Display display, X.XserverRegion region);
13+
[CCode (cheader_filename = "X11/extensions/Xfixes.h", cname = "XFixesSetWindowShapeRegion")]
14+
public static void set_window_shape_region (X.Display display, X.Window win, int shape_kind, int x_off, int y_off, XserverRegion region);
1115
}
1216
[SimpleType]
1317
[CCode (cheader_filename = "X11/extensions/Xfixes.h", cname = "XserverRegion", has_type_id = false)]

0 commit comments

Comments
 (0)