Skip to content

Commit 3875e3d

Browse files
committed
Rewrite menus
1 parent d1acdcc commit 3875e3d

File tree

6 files changed

+67
-60
lines changed

6 files changed

+67
-60
lines changed

daemon-gtk3/DBus.vala

Lines changed: 8 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -64,27 +64,29 @@ public class Gala.Daemon.DBus : GLib.Object {
6464
}
6565
}
6666

67-
public void show_window_menu (Gala.WindowFlags flags, int display_width, int display_height, int x, int y) throws DBusError, IOError {
67+
public void show_window_menu (Gala.WindowFlags flags, int monitor, int monitor_width, int monitor_height, int x, int y) throws DBusError, IOError {
6868
if (window_menu == null) {
6969
window_menu = new WindowMenu ();
7070
window_menu.perform_action.connect (perform_action);
7171
}
7272

7373
window_menu.update (flags);
7474

75-
show_menu (window_menu, display_width, display_height, x, y, true);
75+
show_menu (window_menu, monitor, monitor_width, monitor_height, x, y, true);
7676
}
7777

78-
public void show_desktop_menu (int display_width, int display_height, int x, int y) throws DBusError, IOError {
78+
public void show_desktop_menu (int monitor, int monitor_width, int monitor_height, int x, int y) throws DBusError, IOError {
7979
if (background_menu == null) {
8080
background_menu = new BackgroundMenu ();
8181
}
8282

83-
show_menu (background_menu, display_width, display_height, x, y, false);
83+
show_menu (background_menu, monitor, monitor_width, monitor_height, x, y, false);
8484
}
8585

86-
private void show_menu (Gtk.Menu menu, int display_width, int display_height, int x, int y, bool ignore_first_release) {
87-
var window = new Window (display_width, display_height);
86+
private void show_menu (Gtk.Menu menu, int monitor, int monitor_width, int monitor_height, int x, int y, bool ignore_first_release) {
87+
var window = new Window (monitor_width, monitor_height) {
88+
title = "MODAL-%d".printf (monitor)
89+
};
8890
window.present ();
8991

9092
menu.attach_to_widget (window.content, null);

daemon/DBus.vala

Lines changed: 10 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -153,28 +153,29 @@ public class Gala.Daemon.DBus : GLib.Object {
153153
}
154154
}
155155

156-
public void show_window_menu (Gala.WindowFlags flags, int display_width, int display_height, int x, int y) throws DBusError, IOError {
156+
public void show_window_menu (Gala.WindowFlags flags, int monitor, int monitor_width, int monitor_height, int x, int y) throws DBusError, IOError {
157157
window_menu.update (flags);
158158

159-
show_menu (window_menu, display_width, display_height, x, y);
159+
show_menu (window_menu, monitor, monitor_width, monitor_height, x, y);
160160
}
161161

162-
public void show_desktop_menu (int display_width, int display_height, int x, int y) throws DBusError, IOError {
163-
show_menu (background_menu, display_width, display_height, x, y);
162+
public void show_desktop_menu (int monitor, int monitor_width, int monitor_height, int x, int y) throws DBusError, IOError {
163+
show_menu (background_menu, monitor, monitor_width, monitor_height, x, y);
164164
}
165165

166-
private void show_menu (Gtk.Popover menu, int display_width, int display_height, int x, int y) {
166+
private void show_menu (Gtk.Popover menu, int monitor, int monitor_width, int monitor_height, int x, int y) {
167167
if (!DisplayConfig.is_logical_layout ()) {
168168
var scale_factor = window.scale_factor;
169169

170-
display_width /= scale_factor;
171-
display_height /= scale_factor;
170+
monitor_width /= scale_factor;
171+
monitor_height /= scale_factor;
172172
x /= scale_factor;
173173
y /= scale_factor;
174174
}
175175

176-
window.default_width = display_width;
177-
window.default_height = display_height;
176+
window.title = "MODAL-%d".printf (monitor);
177+
window.default_width = monitor_width;
178+
window.default_height = monitor_height;
178179
window.present ();
179180

180181
Gdk.Rectangle rect = {

src/Background/BackgroundContainer.vala

Lines changed: 19 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -7,9 +7,9 @@
77

88
public class Gala.BackgroundContainer : Meta.BackgroundGroup {
99
public signal void changed ();
10-
public signal void show_background_menu (int x, int y);
10+
public signal void show_background_menu (int monitor, int x, int y);
1111

12-
public Meta.Display display { get; construct; }
12+
public Meta.Display display { private get; construct; }
1313

1414
public BackgroundContainer (Meta.Display display) {
1515
Object (display: display);
@@ -19,15 +19,6 @@ public class Gala.BackgroundContainer : Meta.BackgroundGroup {
1919
unowned var monitor_manager = display.get_context ().get_backend ().get_monitor_manager ();
2020
monitor_manager.monitors_changed.connect (update);
2121

22-
reactive = true;
23-
button_release_event.connect ((event) => {
24-
float x, y;
25-
event.get_coords (out x, out y);
26-
if (event.get_button () == Clutter.Button.SECONDARY) {
27-
show_background_menu ((int)x, (int)y);
28-
}
29-
});
30-
3122
#if HAS_MUTTER47
3223
background_color = Cogl.Color.from_string ("Black");
3324
#else
@@ -43,19 +34,32 @@ public class Gala.BackgroundContainer : Meta.BackgroundGroup {
4334
}
4435

4536
private void update () {
46-
var reference_child = (get_child_at_index (0) as BackgroundManager);
47-
if (reference_child != null)
37+
var reference_child = (BackgroundManager) get_child_at_index (0);
38+
if (reference_child != null) {
4839
reference_child.changed.disconnect (background_changed);
40+
}
4941

5042
destroy_all_children ();
5143

5244
for (var i = 0; i < display.get_n_monitors (); i++) {
5345
var background = new BackgroundManager (display, i);
54-
5546
add_child (background);
5647

57-
if (i == 0)
48+
background.button_release_event.connect ((__background, event) => {
49+
if (event.get_button () == Clutter.Button.SECONDARY) {
50+
float x, y;
51+
event.get_coords (out x, out y);
52+
53+
var _background = (BackgroundManager) __background;
54+
show_background_menu (_background.monitor_index, (int) x, (int) y);
55+
}
56+
57+
return Clutter.EVENT_STOP;
58+
});
59+
60+
if (i == 0) {
5861
background.changed.connect (background_changed);
62+
}
5963
}
6064
}
6165

src/Background/BackgroundManager.vala

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,8 @@ public class Gala.BackgroundManager : Meta.BackgroundGroup, Gala.BackgroundManag
2929
}
3030

3131
construct {
32+
reactive = true;
33+
3234
background_source = BackgroundCache.get_default ().get_background_source (display);
3335
update_background_actor (false);
3436

src/DaemonManager.vala

Lines changed: 18 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -12,8 +12,8 @@ public class Gala.DaemonManager : GLib.Object {
1212

1313
[DBus (name = "org.pantheon.gala.daemon")]
1414
public interface Daemon: GLib.Object {
15-
public abstract async void show_window_menu (WindowFlags flags, int width, int height, int x, int y) throws Error;
16-
public abstract async void show_desktop_menu (int display_width, int display_height, int x, int y) throws Error;
15+
public abstract async void show_window_menu (WindowFlags flags, int monitor, int monitor_width, int monitor_height, int x, int y) throws Error;
16+
public abstract async void show_desktop_menu (int monitor, int monitor_width, int monitor_height, int x, int y) throws GLib.Error;
1717
}
1818

1919
public Meta.Display display { get; construct; }
@@ -77,22 +77,22 @@ public class Gala.DaemonManager : GLib.Object {
7777
}
7878

7979
private void handle_daemon_window (Meta.Window window) {
80+
if (window.title == null) {
81+
return;
82+
}
83+
8084
var info = window.title.split ("-");
8185

82-
if (info.length == 0) {
83-
critical ("Couldn't handle daemon window: No title provided");
86+
if (info.length < 2) {
87+
critical ("Couldn't handle daemon window: Incorrect window title provided");
8488
return;
8589
}
8690

91+
var index = int.parse (info[1]);
92+
var monitor_geometry = display.get_monitor_geometry (index);
93+
8794
switch (info[0]) {
8895
case "LABEL":
89-
if (info.length < 2) {
90-
return;
91-
}
92-
93-
var index = int.parse (info[1]);
94-
95-
var monitor_geometry = display.get_monitor_geometry (index);
9696
window.move_frame (false, monitor_geometry.x + SPACING, monitor_geometry.y + SPACING);
9797
window.make_above ();
9898
break;
@@ -101,7 +101,7 @@ public class Gala.DaemonManager : GLib.Object {
101101
#if HAS_MUTTER46
102102
daemon_client.make_dock (window);
103103
#endif
104-
window.move_frame (false, 0, 0);
104+
window.move_resize_frame (false, monitor_geometry.x, monitor_geometry.y, monitor_geometry.width, monitor_geometry.height);
105105
window.make_above ();
106106
break;
107107
}
@@ -123,31 +123,21 @@ public class Gala.DaemonManager : GLib.Object {
123123
}
124124
}
125125

126-
public async void show_background_menu (int x, int y) {
127-
if (daemon_proxy == null) {
128-
return;
129-
}
130-
131-
int width, height;
132-
display.get_size (out width, out height);
126+
public async void show_background_menu (int monitor, int x, int y) requires (daemon_proxy != null) {
127+
var monitor_geometry = display.get_monitor_geometry (monitor);
133128

134129
try {
135-
yield daemon_proxy.show_desktop_menu (width, height, x, y);
130+
yield daemon_proxy.show_desktop_menu (monitor, monitor_geometry.width, monitor_geometry.height, x, y);
136131
} catch (Error e) {
137132
warning ("Error invoking MenuManager: %s", e.message);
138133
}
139134
}
140135

141-
public async void show_window_menu (WindowFlags flags, int x, int y) {
142-
if (daemon_proxy == null) {
143-
return;
144-
}
145-
146-
int width, height;
147-
display.get_size (out width, out height);
136+
public async void show_window_menu (WindowFlags flags, int monitor, int x, int y) requires (daemon_proxy != null) {
137+
var monitor_geometry = display.get_monitor_geometry (monitor);
148138

149139
try {
150-
yield daemon_proxy.show_window_menu (flags, width, height, x, y);
140+
yield daemon_proxy.show_window_menu (flags, monitor, monitor_geometry.width, monitor_geometry.height, x, y);
151141
} catch (Error e) {
152142
warning ("Error invoking MenuManager: %s", e.message);
153143
}

src/WindowManager.vala

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -228,7 +228,7 @@ namespace Gala {
228228
ui_group.add_child (window_group);
229229

230230
background_group = new BackgroundContainer (display);
231-
((BackgroundContainer)background_group).show_background_menu.connect (daemon_manager.show_background_menu);
231+
((BackgroundContainer) background_group).show_background_menu.connect (daemon_manager.show_background_menu);
232232
window_group.add_child (background_group);
233233
window_group.set_child_below_sibling (background_group, null);
234234

@@ -938,7 +938,15 @@ namespace Gala {
938938
if (window.can_close ())
939939
flags |= WindowFlags.CAN_CLOSE;
940940

941-
daemon_manager.show_window_menu.begin (flags, x, y);
941+
var monitor = window.get_monitor ();
942+
var monitor_geometry = window.display.get_monitor_geometry (monitor);
943+
944+
daemon_manager.show_window_menu.begin (
945+
flags,
946+
monitor,
947+
x - monitor_geometry.x,
948+
y - monitor_geometry.y
949+
);
942950
break;
943951
case Meta.WindowMenuType.APP:
944952
// FIXME we don't have any sort of app menus

0 commit comments

Comments
 (0)