Skip to content

Commit 9944764

Browse files
committed
Add support for Mutter 49
1 parent fbfc91f commit 9944764

27 files changed

+982
-12
lines changed

meson.build

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -141,6 +141,17 @@ if mutter48_dep.found()
141141
vala_flags = ['--define', 'HAS_MUTTER43', '--define', 'HAS_MUTTER44', '--define', 'HAS_MUTTER45', '--define', 'HAS_MUTTER46', '--define', 'HAS_MUTTER47', '--define', 'HAS_MUTTER48']
142142
endif
143143

144+
mutter49_dep = dependency('libmutter-17', version: ['>= 49', '< 50'], required: false)
145+
if mutter49_dep.found()
146+
libmutter_dep = dependency('libmutter-17', version: '>= 49')
147+
mutter_dep = [
148+
libmutter_dep,
149+
dependency('mutter-mtk-17'), dependency('mutter-cogl-17'),
150+
dependency('mutter-clutter-17')
151+
]
152+
vala_flags = ['--define', 'HAS_MUTTER43', '--define', 'HAS_MUTTER44', '--define', 'HAS_MUTTER45', '--define', 'HAS_MUTTER46', '--define', 'HAS_MUTTER47', '--define', 'HAS_MUTTER48', '--define', 'HAS_MUTTER49']
153+
endif
154+
144155
if mutter_dep.length() == 0
145156
error ('No supported mutter library found!')
146157
endif

src/DaemonManager.vala

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -62,7 +62,9 @@ public class Gala.DaemonManager : GLib.Object {
6262
break;
6363

6464
case "MODAL":
65-
#if HAS_MUTTER46
65+
#if HAS_MUTTER49
66+
window.set_type (Meta.WindowType.DOCK);
67+
#elif HAS_MUTTER46
6668
client.wayland_client.make_dock (window);
6769
#endif
6870
window.move_frame (false, 0, 0);

src/DesktopIntegration.vala

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -203,7 +203,11 @@ public class Gala.DesktopIntegration : GLib.Object {
203203

204204
wm.get_display ().get_sound_player ().play_from_theme ("bell", _("Window has already focus"), null);
205205

206+
#if HAS_MUTTER49
207+
if (window.is_maximized ()) {
208+
#else
206209
if (window.get_maximized () == BOTH) {
210+
#endif
207211
notifying = false;
208212
return;
209213
}

src/KeyboardManager.vala

Lines changed: 40 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,9 @@ public class Gala.KeyboardManager : Object {
1414
public Meta.Display display { construct; private get; }
1515

1616
private GLib.Settings settings;
17+
#if HAS_MUTTER49
18+
private GLib.Cancellable? cancellable = null;
19+
#endif
1720

1821
public KeyboardManager (Meta.Display display) {
1922
Object (display: display);
@@ -104,13 +107,49 @@ public class Gala.KeyboardManager : Object {
104107
var variant = string.joinv (",", variants);
105108
var options = string.joinv (",", xkb_options);
106109

107-
#if HAS_MUTTER46
110+
#if HAS_MUTTER49
111+
if (cancellable != null) {
112+
cancellable.cancel ();
113+
cancellable = new GLib.Cancellable ();
114+
}
115+
116+
backend.set_keymap_async.begin (layout, variant, options, settings.get_string ("xkb-model"), cancellable, (obj, res) => {
117+
try {
118+
((Meta.Backend) obj).set_keymap_async.end (res);
119+
} catch (Error e) {
120+
if (e is GLib.IOError.CANCELLED) {
121+
// ignore
122+
} else {
123+
cancellable = null;
124+
}
125+
}
126+
});
127+
#elif HAS_MUTTER46
108128
backend.set_keymap (layout, variant, options, settings.get_string ("xkb-model"));
109129
#else
110130
backend.set_keymap (layout, variant, options);
111131
#endif
112132
} else if (key == "current") {
133+
#if HAS_MUTTER49
134+
if (cancellable != null) {
135+
cancellable.cancel ();
136+
cancellable = new GLib.Cancellable ();
137+
}
138+
139+
backend.set_keymap_layout_group_async.begin (settings.get_uint ("current"), cancellable, (obj, res) => {
140+
try {
141+
((Meta.Backend) obj).set_keymap_layout_group_async.end (res);
142+
} catch (Error e) {
143+
if (e is GLib.IOError.CANCELLED) {
144+
// ignore
145+
} else {
146+
cancellable = null;
147+
}
148+
}
149+
});
150+
#else
113151
backend.lock_layout_group (settings.get_uint ("current"));
152+
#endif
114153
}
115154
}
116155
}

src/ShellClients/HideTracker.vala

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -183,7 +183,7 @@ public class Gala.HideTracker : Object {
183183
}
184184

185185
focus_overlap = true;
186-
focus_maximized_overlap = VERTICAL in window.get_maximized ();
186+
focus_maximized_overlap = window.maximized_vertically;
187187
}
188188

189189
update_hidden ();

src/ShellClients/ManagedClient.vala

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -50,8 +50,13 @@ public class Gala.ManagedClient : Object {
5050
private async void start_wayland () {
5151
var subprocess_launcher = new GLib.SubprocessLauncher (INHERIT_FDS);
5252
try {
53+
#if HAS_MUTTER49
54+
wayland_client = new Meta.WaylandClient.subprocess (display.get_context (), subprocess_launcher, args);
55+
subprocess = wayland_client.get_subprocess ();
56+
#else
5357
wayland_client = new Meta.WaylandClient (display.get_context (), subprocess_launcher);
5458
subprocess = wayland_client.spawnv (display, args);
59+
#endif
5560

5661
yield subprocess.wait_async ();
5762

src/ShellClients/NotificationsClient.vala

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,9 @@ public class Gala.NotificationsClient : Object {
2121
window.set_data (NOTIFICATION_DATA_KEY, true);
2222
window.make_above ();
2323
window.stick ();
24-
#if HAS_MUTTER46
24+
#if HAS_MUTTER49
25+
window.set_type (Meta.WindowType.DOCK);
26+
#elif HAS_MUTTER46
2527
client.wayland_client.make_dock (window);
2628
#endif
2729
});

src/ShellClients/ShellClientsManager.vala

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -108,13 +108,18 @@ public class Gala.ShellClientsManager : Object, GestureTarget {
108108
}
109109

110110
public void make_dock (Meta.Window window) {
111+
#if HAS_MUTTER49
112+
window.set_type (Meta.WindowType.DOCK);
113+
#else
111114
if (Meta.Util.is_wayland_compositor ()) {
112115
make_dock_wayland (window);
113116
} else {
114117
make_dock_x11 (window);
115118
}
119+
#endif
116120
}
117121

122+
#if !HAS_MUTTER49
118123
private void make_dock_wayland (Meta.Window window) requires (Meta.Util.is_wayland_compositor ()) {
119124
foreach (var client in protocol_clients) {
120125
if (client.wayland_client.owns_window (window)) {
@@ -144,6 +149,7 @@ public class Gala.ShellClientsManager : Object, GestureTarget {
144149
// 0 means replace
145150
xdisplay.change_property (x_window, atom, (X.Atom) 4, 32, 0, (uchar[]) dock_atom, 1);
146151
}
152+
#endif
147153

148154
public void set_anchor (Meta.Window window, Pantheon.Desktop.Anchor anchor) {
149155
if (window in panel_windows) {

src/Widgets/SessionLocker.vala

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -330,7 +330,11 @@ public class Gala.SessionLocker : Clutter.Actor {
330330
#else
331331
unowned var tracker = wm.get_display ().get_cursor_tracker ();
332332
#endif
333+
#if HAS_MUTTER49
334+
tracker.inhibit_cursor_visibility ();
335+
#else
333336
tracker.set_pointer_visible (false);
337+
#endif
334338
visible = true;
335339
grab_key_focus ();
336340
modal_proxy = wm.push_modal (this, true);
@@ -398,7 +402,11 @@ public class Gala.SessionLocker : Clutter.Actor {
398402
#else
399403
unowned var tracker = wm.get_display ().get_cursor_tracker ();
400404
#endif
405+
#if HAS_MUTTER49
406+
tracker.uninhibit_cursor_visibility ();
407+
#else
401408
tracker.set_pointer_visible (true);
409+
#endif
402410
visible = false;
403411

404412
activation_time = 0;

src/WindowManager.vala

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -767,11 +767,19 @@ namespace Gala {
767767
if (current == null || current.window_type != Meta.WindowType.NORMAL || !current.can_maximize ())
768768
break;
769769

770+
#if HAS_MUTTER49
771+
if (current.is_maximized ()) {
772+
current.unmaximize ();
773+
} else {
774+
current.maximize ();
775+
}
776+
#else
770777
var maximize_flags = current.get_maximized ();
771778
if (Meta.MaximizeFlags.VERTICAL in maximize_flags || Meta.MaximizeFlags.HORIZONTAL in maximize_flags)
772779
current.unmaximize (Meta.MaximizeFlags.HORIZONTAL | Meta.MaximizeFlags.VERTICAL);
773780
else
774781
current.maximize (Meta.MaximizeFlags.HORIZONTAL | Meta.MaximizeFlags.VERTICAL);
782+
#endif
775783
break;
776784
case ActionType.HIDE_CURRENT:
777785
if (current != null && current.window_type == Meta.WindowType.NORMAL)
@@ -887,6 +895,13 @@ namespace Gala {
887895
if (window.can_maximize ())
888896
flags |= WindowFlags.CAN_MAXIMIZE;
889897

898+
#if HAS_MUTTER49
899+
if (window.is_maximized ())
900+
flags |= WindowFlags.IS_MAXIMIZED;
901+
902+
if (window.maximized_vertically && !window.maximized_horizontally)
903+
flags |= WindowFlags.IS_TILED;
904+
#else
890905
var maximize_flags = window.get_maximized ();
891906
if (maximize_flags > 0) {
892907
flags |= WindowFlags.IS_MAXIMIZED;
@@ -895,6 +910,7 @@ namespace Gala {
895910
flags |= WindowFlags.IS_TILED;
896911
}
897912
}
913+
#endif
898914

899915
if (window.allows_move ())
900916
flags |= WindowFlags.ALLOWS_MOVE;

0 commit comments

Comments
 (0)