Skip to content

Commit 5f5e890

Browse files
committed
Use WindowPositioner for panel positions
1 parent 2a98017 commit 5f5e890

File tree

5 files changed

+77
-124
lines changed

5 files changed

+77
-124
lines changed

src/PantheonShell.vala

Lines changed: 1 addition & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -243,25 +243,7 @@ namespace Gala {
243243
return;
244244
}
245245

246-
Meta.Side side = TOP;
247-
switch (anchor) {
248-
case TOP:
249-
break;
250-
251-
case BOTTOM:
252-
side = BOTTOM;
253-
break;
254-
255-
case LEFT:
256-
side = LEFT;
257-
break;
258-
259-
case RIGHT:
260-
side = RIGHT;
261-
break;
262-
}
263-
264-
ShellClientsManager.get_instance ().set_anchor (window, side);
246+
ShellClientsManager.get_instance ().set_anchor (window, anchor);
265247
}
266248

267249
internal static void focus_panel (Wl.Client client, Wl.Resource resource) {

src/ShellClients/HideTracker.vala

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -144,7 +144,7 @@ public class Gala.HideTracker : Object {
144144
continue;
145145
}
146146

147-
if (!panel.get_custom_window_rect ().overlap (window.get_frame_rect ())) {
147+
if (!panel.window.get_frame_rect ().overlap (window.get_frame_rect ())) {
148148
continue;
149149
}
150150

src/ShellClients/PanelWindow.vala

Lines changed: 36 additions & 85 deletions
Original file line numberDiff line numberDiff line change
@@ -13,35 +13,23 @@ public class Gala.PanelWindow : Object {
1313
public WindowManager wm { get; construct; }
1414
public Meta.Window window { get; construct; }
1515

16-
public bool hidden { get; private set; default = false; }
16+
public Pantheon.Desktop.Anchor anchor { get; construct set; }
1717

18-
public Meta.Side anchor;
18+
private WindowPositioner window_positioner;
1919

2020
private Barrier? barrier;
2121

2222
private PanelClone clone;
2323

24-
private uint idle_move_id = 0;
25-
2624
private int width = -1;
2725
private int height = -1;
2826

29-
public PanelWindow (WindowManager wm, Meta.Window window, Meta.Side anchor) {
30-
Object (wm: wm, window: window);
31-
32-
// Meta.Side seems to be currently not supported as GLib.Object property ...?
33-
// At least it always crashed for me with some paramspec, g_type_fundamental backtrace
34-
this.anchor = anchor;
27+
public PanelWindow (WindowManager wm, Meta.Window window, Pantheon.Desktop.Anchor anchor) {
28+
Object (wm: wm, window: window, anchor: anchor);
3529
}
3630

3731
construct {
38-
window.size_changed.connect (position_window);
39-
4032
window.unmanaging.connect (() => {
41-
if (idle_move_id != 0) {
42-
Source.remove (idle_move_id);
43-
}
44-
4533
destroy_barrier ();
4634

4735
if (window_struts.remove (window)) {
@@ -53,13 +41,24 @@ public class Gala.PanelWindow : Object {
5341

5442
clone = new PanelClone (wm, this);
5543

56-
var monitor_manager = wm.get_display ().get_context ().get_backend ().get_monitor_manager ();
57-
monitor_manager.monitors_changed.connect (() => update_anchor (anchor));
58-
monitor_manager.monitors_changed_internal.connect (() => update_anchor (anchor));
44+
var display = wm.get_display ();
45+
46+
var monitor_manager = display.get_context ().get_backend ().get_monitor_manager ();
47+
monitor_manager.monitors_changed.connect (() => set_hide_mode (clone.hide_mode)); //Make sure barriers are still on the primary monitor
5948

60-
var workspace_manager = wm.get_display ().get_workspace_manager ();
49+
var workspace_manager = display.get_workspace_manager ();
6150
workspace_manager.workspace_added.connect (update_strut);
6251
workspace_manager.workspace_removed.connect (update_strut);
52+
53+
window.size_changed.connect (update_strut);
54+
window.position_changed.connect (update_strut);
55+
56+
window_positioner = new WindowPositioner (display, window, WindowPositioner.Position.from_anchor (anchor));
57+
58+
notify["anchor"].connect (() => {
59+
window_positioner.position = WindowPositioner.Position.from_anchor (anchor);
60+
set_hide_mode (clone.hide_mode); // Resetup barriers etc., TODO: replace with update_strut once barriers are handled in hidetracker
61+
});
6362
}
6463

6564
#if HAS_MUTTER45
@@ -84,73 +83,9 @@ public class Gala.PanelWindow : Object {
8483
this.width = width;
8584
this.height = height;
8685

87-
position_window ();
88-
set_hide_mode (clone.hide_mode); // Resetup barriers etc.
89-
}
90-
91-
public void update_anchor (Meta.Side anchor) {
92-
this.anchor = anchor;
93-
94-
position_window ();
95-
set_hide_mode (clone.hide_mode); // Resetup barriers etc.
96-
}
97-
98-
private void position_window () {
99-
var display = wm.get_display ();
100-
var monitor_geom = display.get_monitor_geometry (display.get_primary_monitor ());
101-
var window_rect = get_custom_window_rect ();
102-
103-
switch (anchor) {
104-
case TOP:
105-
position_window_top (monitor_geom, window_rect);
106-
break;
107-
108-
case BOTTOM:
109-
position_window_bottom (monitor_geom, window_rect);
110-
break;
111-
112-
default:
113-
warning ("Side not supported yet");
114-
break;
115-
}
116-
11786
update_strut ();
11887
}
11988

120-
#if HAS_MUTTER45
121-
private void position_window_top (Mtk.Rectangle monitor_geom, Mtk.Rectangle window_rect) {
122-
#else
123-
private void position_window_top (Meta.Rectangle monitor_geom, Meta.Rectangle window_rect) {
124-
#endif
125-
var x = monitor_geom.x + (monitor_geom.width - window_rect.width) / 2;
126-
127-
move_window_idle (x, monitor_geom.y);
128-
}
129-
130-
#if HAS_MUTTER45
131-
private void position_window_bottom (Mtk.Rectangle monitor_geom, Mtk.Rectangle window_rect) {
132-
#else
133-
private void position_window_bottom (Meta.Rectangle monitor_geom, Meta.Rectangle window_rect) {
134-
#endif
135-
var x = monitor_geom.x + (monitor_geom.width - window_rect.width) / 2;
136-
var y = monitor_geom.y + monitor_geom.height - window_rect.height;
137-
138-
move_window_idle (x, y);
139-
}
140-
141-
private void move_window_idle (int x, int y) {
142-
if (idle_move_id != 0) {
143-
Source.remove (idle_move_id);
144-
}
145-
146-
idle_move_id = Idle.add (() => {
147-
window.move_frame (false, x, y);
148-
149-
idle_move_id = 0;
150-
return Source.REMOVE;
151-
});
152-
}
153-
15489
public void set_hide_mode (Pantheon.Desktop.HideMode hide_mode) {
15590
clone.hide_mode = hide_mode;
15691

@@ -177,7 +112,7 @@ public class Gala.PanelWindow : Object {
177112

178113
Meta.Strut strut = {
179114
rect,
180-
anchor
115+
side_from_anchor (anchor)
181116
};
182117

183118
window_struts[window] = strut;
@@ -270,4 +205,20 @@ public class Gala.PanelWindow : Object {
270205

271206
barrier.trigger.connect (clone.show);
272207
}
208+
209+
private Meta.Side side_from_anchor (Pantheon.Desktop.Anchor anchor) {
210+
switch (anchor) {
211+
case BOTTOM:
212+
return BOTTOM;
213+
214+
case LEFT:
215+
return LEFT;
216+
217+
case RIGHT:
218+
return RIGHT;
219+
220+
default:
221+
return TOP;
222+
}
223+
}
273224
}

src/ShellClients/ShellClientsManager.vala

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -143,16 +143,16 @@ public class Gala.ShellClientsManager : Object {
143143
xdisplay.change_property (x_window, atom, (X.Atom) 4, 32, 0, (uchar[]) dock_atom, 1);
144144
}
145145

146-
public void set_anchor (Meta.Window window, Meta.Side side) {
146+
public void set_anchor (Meta.Window window, Pantheon.Desktop.Anchor anchor) {
147147
if (window in panel_windows) {
148-
panel_windows[window].update_anchor (side);
148+
panel_windows[window].anchor = anchor;
149149
return;
150150
}
151151

152152
make_dock (window);
153153
// TODO: Return if requested by window that's not a trusted client?
154154

155-
panel_windows[window] = new PanelWindow (wm, window, side);
155+
panel_windows[window] = new PanelWindow (wm, window, anchor);
156156

157157
// connect_after so we make sure the PanelWindow can destroy its barriers and struts
158158
window.unmanaging.connect_after ((_window) => panel_windows.remove (_window));
@@ -226,8 +226,8 @@ public class Gala.ShellClientsManager : Object {
226226

227227
switch (key) {
228228
case "anchor":
229-
int parsed; // Will be used as Meta.Side which is a 4 value bitfield so check bounds for that
230-
if (int.try_parse (val, out parsed) && 0 <= parsed && parsed <= 15) {
229+
int parsed; // Will be used as Pantheon.Desktop.Anchor which is a 4 value enum so check bounds for that
230+
if (int.try_parse (val, out parsed) && 0 <= parsed && parsed <= 3) {
231231
set_anchor (window, parsed);
232232
} else {
233233
warning ("Failed to parse %s as anchor", val);

src/ShellClients/WindowPositioner.vala

Lines changed: 34 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -7,13 +7,28 @@
77

88
public class Gala.WindowPositioner : Object {
99
public enum Position {
10-
CENTER
10+
TOP,
11+
BOTTOM,
12+
CENTER;
13+
14+
public static Position from_anchor (Pantheon.Desktop.Anchor anchor) {
15+
if (anchor > 1) {
16+
warning ("Position %s not supported yet", anchor.to_string ());
17+
return CENTER;
18+
}
19+
20+
return (Position) anchor;
21+
}
1122
}
1223

1324
public Meta.Display display { get; construct; }
1425
public Meta.Window window { get; construct; }
15-
public Position position { get; private set; }
16-
public Variant? position_data { get; private set; }
26+
/**
27+
* This may only be set after the window was shown.
28+
* The initial position should only be given in the constructor.
29+
*/
30+
public Position position { get; construct set; }
31+
public Variant? position_data { get; construct set; }
1732

1833
public WindowPositioner (Meta.Display display, Meta.Window window, Position position, Variant? position_data = null) {
1934
Object (display: display, window: window, position: position, position_data: position_data);
@@ -29,29 +44,34 @@ public class Gala.WindowPositioner : Object {
2944
unowned var monitor_manager = display.get_context ().get_backend ().get_monitor_manager ();
3045
monitor_manager.monitors_changed.connect (position_window);
3146
monitor_manager.monitors_changed_internal.connect (position_window);
32-
}
3347

34-
/**
35-
* This may only be called after the window was shown.
36-
*/
37-
public void update_position (Position new_position, Variant? new_position_data = null) {
38-
position = new_position;
39-
position_data = new_position_data;
40-
41-
position_window ();
48+
notify["position"].connect (position_window);
49+
notify["position-data"].connect (position_window);
4250
}
4351

4452
private void position_window () {
4553
int x = 0, y = 0;
4654

55+
var window_rect = window.get_frame_rect ();
56+
4757
switch (position) {
4858
case CENTER:
4959
var monitor_geom = display.get_monitor_geometry (display.get_primary_monitor ());
50-
var window_rect = window.get_frame_rect ();
51-
5260
x = monitor_geom.x + (monitor_geom.width - window_rect.width) / 2;
5361
y = monitor_geom.y + (monitor_geom.height - window_rect.height) / 2;
5462
break;
63+
64+
case TOP:
65+
var monitor_geom = display.get_monitor_geometry (display.get_primary_monitor ());
66+
x = monitor_geom.x + (monitor_geom.width - window_rect.width) / 2;
67+
y = monitor_geom.y;
68+
break;
69+
70+
case BOTTOM:
71+
var monitor_geom = display.get_monitor_geometry (display.get_primary_monitor ());
72+
x = monitor_geom.x + (monitor_geom.width - window_rect.width) / 2;
73+
y = monitor_geom.y + monitor_geom.height - window_rect.height;
74+
break;
5575
}
5676

5777
window.move_frame (false, x, y);

0 commit comments

Comments
 (0)