@@ -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 ; con struct 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}
0 commit comments