@@ -11,34 +11,22 @@ public class Gala.PanelWindow : Object {
1111 public WindowManager wm { get ; construct; }
1212 public Meta . Window window { get ; construct; }
1313
14- public bool hidden { get ; private set ; default = false ; }
14+ public Pantheon . Desktop . Anchor anchor { get ; con struct set ; }
1515
16- public Meta . Side anchor ;
16+ private WindowPositioner window_positioner ;
1717
1818 public DelegateActor delegate_actor;
1919 private PanelClone clone;
2020
21- private uint idle_move_id = 0 ;
22-
2321 private int width = - 1 ;
2422 private int height = - 1 ;
2523
26- public PanelWindow (WindowManager wm , Meta .Window window , Meta .Side anchor ) {
27- Object (wm: wm, window: window);
28-
29- // Meta.Side seems to be currently not supported as GLib.Object property ...?
30- // At least it always crashed for me with some paramspec, g_type_fundamental backtrace
31- this . anchor = anchor;
24+ public PanelWindow (WindowManager wm, Meta . Window window, Pantheon . Desktop . Anchor anchor) {
25+ Object (wm: wm, window: window, anchor: anchor);
3226 }
3327
3428 construct {
35- window. size_changed. connect (position_window);
36-
3729 window. unmanaging. connect (() = > {
38- if (idle_move_id != 0 ) {
39- Source . remove (idle_move_id);
40- }
41-
4230 if (window_struts. remove (window)) {
4331 update_struts ();
4432 }
@@ -49,13 +37,18 @@ public class Gala.PanelWindow : Object {
4937 delegate_actor = new DelegateActor ((Meta . WindowActor ) window. get_compositor_private ());
5038 clone = new PanelClone (wm, this );
5139
52- var monitor_manager = wm. get_display (). get_context (). get_backend (). get_monitor_manager ();
53- monitor_manager. monitors_changed. connect (() = > update_anchor (anchor));
54- monitor_manager. monitors_changed_internal. connect (() = > update_anchor (anchor));
40+ var display = wm. get_display ();
5541
56- var workspace_manager = wm . get_display () . get_workspace_manager ();
42+ var workspace_manager = display . get_workspace_manager ();
5743 workspace_manager. workspace_added. connect (update_strut);
5844 workspace_manager. workspace_removed. connect (update_strut);
45+
46+ window. size_changed. connect (update_strut);
47+ window. position_changed. connect (update_strut);
48+
49+ window_positioner = new WindowPositioner (display, window, WindowPositioner . Position . from_anchor (anchor));
50+
51+ notify[" anchor" ]. connect (() = > window_positioner. position = WindowPositioner . Position . from_anchor (anchor));
5952 }
6053
6154#if HAS_MUTTER45
@@ -87,73 +80,9 @@ public class Gala.PanelWindow : Object {
8780 this . width = width;
8881 this . height = height;
8982
90- position_window ();
91- set_hide_mode (clone. hide_mode); // Resetup barriers etc.
92- }
93-
94- public void update_anchor (Meta . Side anchor) {
95- this . anchor = anchor;
96-
97- position_window ();
98- set_hide_mode (clone. hide_mode); // Resetup barriers etc.
99- }
100-
101- private void position_window () {
102- var display = wm. get_display ();
103- var monitor_geom = display. get_monitor_geometry (display. get_primary_monitor ());
104- var window_rect = window. get_frame_rect ();
105-
106- switch (anchor) {
107- case TOP :
108- position_window_top (monitor_geom, window_rect);
109- break ;
110-
111- case BOTTOM :
112- position_window_bottom (monitor_geom, window_rect);
113- break ;
114-
115- default:
116- warning (" Side not supported yet" );
117- break ;
118- }
119-
12083 update_strut ();
12184 }
12285
123- #if HAS_MUTTER45
124- private void position_window_top (Mtk . Rectangle monitor_geom, Mtk . Rectangle window_rect) {
125- #else
126- private void position_window_top (Meta . Rectangle monitor_geom, Meta . Rectangle window_rect) {
127- #endif
128- var x = monitor_geom. x + (monitor_geom. width - window_rect. width) / 2 ;
129-
130- move_window_idle (x, monitor_geom. y);
131- }
132-
133- #if HAS_MUTTER45
134- private void position_window_bottom (Mtk . Rectangle monitor_geom, Mtk . Rectangle window_rect) {
135- #else
136- private void position_window_bottom (Meta . Rectangle monitor_geom, Meta . Rectangle window_rect) {
137- #endif
138- var x = monitor_geom. x + (monitor_geom. width - window_rect. width) / 2 ;
139- var y = monitor_geom. y + monitor_geom. height - window_rect. height;
140-
141- move_window_idle (x, y);
142- }
143-
144- private void move_window_idle (int x, int y) {
145- if (idle_move_id != 0 ) {
146- Source . remove (idle_move_id);
147- }
148-
149- idle_move_id = Idle . add (() = > {
150- window. move_frame (false , x, y);
151-
152- idle_move_id = 0 ;
153- return Source . REMOVE ;
154- });
155- }
156-
15786 public void set_hide_mode (Pantheon . Desktop . HideMode hide_mode) {
15887 clone. hide_mode = hide_mode;
15988
@@ -177,7 +106,7 @@ public class Gala.PanelWindow : Object {
177106
178107 Meta . Strut strut = {
179108 rect,
180- anchor
109+ side_from_anchor ( anchor)
181110 };
182111
183112 window_struts[window] = strut;
@@ -203,4 +132,20 @@ public class Gala.PanelWindow : Object {
203132 update_struts ();
204133 }
205134 }
135+
136+ private Meta . Side side_from_anchor (Pantheon . Desktop . Anchor anchor) {
137+ switch (anchor) {
138+ case BOTTOM :
139+ return BOTTOM ;
140+
141+ case LEFT :
142+ return LEFT ;
143+
144+ case RIGHT :
145+ return RIGHT ;
146+
147+ default:
148+ return TOP ;
149+ }
150+ }
206151}
0 commit comments