@@ -11,33 +11,21 @@ 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 private PanelClone clone;
1919
20- private uint idle_move_id = 0 ;
21-
2220 private int width = - 1 ;
2321 private int height = - 1 ;
2422
25- public PanelWindow (WindowManager wm , Meta .Window window , Meta .Side anchor ) {
26- Object (wm: wm, window: window);
27-
28- // Meta.Side seems to be currently not supported as GLib.Object property ...?
29- // At least it always crashed for me with some paramspec, g_type_fundamental backtrace
30- this . anchor = anchor;
23+ public PanelWindow (WindowManager wm, Meta . Window window, Pantheon . Desktop . Anchor anchor) {
24+ Object (wm: wm, window: window, anchor: anchor);
3125 }
3226
3327 construct {
34- window. size_changed. connect (position_window);
35-
3628 window. unmanaging. connect (() = > {
37- if (idle_move_id != 0 ) {
38- Source . remove (idle_move_id);
39- }
40-
4129 if (window_struts. remove (window)) {
4230 update_struts ();
4331 }
@@ -47,13 +35,18 @@ public class Gala.PanelWindow : Object {
4735
4836 clone = new PanelClone (wm, this );
4937
50- var monitor_manager = wm. get_display (). get_context (). get_backend (). get_monitor_manager ();
51- monitor_manager. monitors_changed. connect (() = > update_anchor (anchor));
52- monitor_manager. monitors_changed_internal. connect (() = > update_anchor (anchor));
38+ var display = wm. get_display ();
5339
54- var workspace_manager = wm . get_display () . get_workspace_manager ();
40+ var workspace_manager = display . get_workspace_manager ();
5541 workspace_manager. workspace_added. connect (update_strut);
5642 workspace_manager. workspace_removed. connect (update_strut);
43+
44+ window. size_changed. connect (update_strut);
45+ window. position_changed. connect (update_strut);
46+
47+ window_positioner = new WindowPositioner (display, window, WindowPositioner . Position . from_anchor (anchor));
48+
49+ notify[" anchor" ]. connect (() = > window_positioner. position = WindowPositioner . Position . from_anchor (anchor));
5750 }
5851
5952#if HAS_MUTTER45
@@ -83,73 +76,9 @@ public class Gala.PanelWindow : Object {
8376 this . width = width;
8477 this . height = height;
8578
86- position_window ();
87- set_hide_mode (clone. hide_mode); // Resetup barriers etc.
88- }
89-
90- public void update_anchor (Meta . Side anchor) {
91- this . anchor = anchor;
92-
93- position_window ();
94- set_hide_mode (clone. hide_mode); // Resetup barriers etc.
95- }
96-
97- private void position_window () {
98- var display = wm. get_display ();
99- var monitor_geom = display. get_monitor_geometry (display. get_primary_monitor ());
100- var window_rect = window. get_frame_rect ();
101-
102- switch (anchor) {
103- case TOP :
104- position_window_top (monitor_geom, window_rect);
105- break ;
106-
107- case BOTTOM :
108- position_window_bottom (monitor_geom, window_rect);
109- break ;
110-
111- default:
112- warning (" Side not supported yet" );
113- break ;
114- }
115-
11679 update_strut ();
11780 }
11881
119- #if HAS_MUTTER45
120- private void position_window_top (Mtk . Rectangle monitor_geom, Mtk . Rectangle window_rect) {
121- #else
122- private void position_window_top (Meta . Rectangle monitor_geom, Meta . Rectangle window_rect) {
123- #endif
124- var x = monitor_geom. x + (monitor_geom. width - window_rect. width) / 2 ;
125-
126- move_window_idle (x, monitor_geom. y);
127- }
128-
129- #if HAS_MUTTER45
130- private void position_window_bottom (Mtk . Rectangle monitor_geom, Mtk . Rectangle window_rect) {
131- #else
132- private void position_window_bottom (Meta . Rectangle monitor_geom, Meta . Rectangle window_rect) {
133- #endif
134- var x = monitor_geom. x + (monitor_geom. width - window_rect. width) / 2 ;
135- var y = monitor_geom. y + monitor_geom. height - window_rect. height;
136-
137- move_window_idle (x, y);
138- }
139-
140- private void move_window_idle (int x, int y) {
141- if (idle_move_id != 0 ) {
142- Source . remove (idle_move_id);
143- }
144-
145- idle_move_id = Idle . add (() = > {
146- window. move_frame (false , x, y);
147-
148- idle_move_id = 0 ;
149- return Source . REMOVE ;
150- });
151- }
152-
15382 public void set_hide_mode (Pantheon . Desktop . HideMode hide_mode) {
15483 clone. hide_mode = hide_mode;
15584
@@ -173,7 +102,7 @@ public class Gala.PanelWindow : Object {
173102
174103 Meta . Strut strut = {
175104 rect,
176- anchor
105+ side_from_anchor ( anchor)
177106 };
178107
179108 window_struts[window] = strut;
@@ -199,4 +128,20 @@ public class Gala.PanelWindow : Object {
199128 update_struts ();
200129 }
201130 }
131+
132+ private Meta . Side side_from_anchor (Pantheon . Desktop . Anchor anchor) {
133+ switch (anchor) {
134+ case BOTTOM :
135+ return BOTTOM ;
136+
137+ case LEFT :
138+ return LEFT ;
139+
140+ case RIGHT :
141+ return RIGHT ;
142+
143+ default:
144+ return TOP ;
145+ }
146+ }
202147}
0 commit comments