@@ -35,8 +35,11 @@ public class Gala.PanelWindow : ShellWindow, RootTarget {
3535 private GestureController workspace_gesture_controller;
3636 private WorkspaceHideTracker workspace_hide_tracker;
3737
38+ private int width = - 1 ;
39+ private int height = - 1 ;
40+
3841 public PanelWindow (WindowManager wm, Meta . Window window, Pantheon . Desktop . Anchor anchor) {
39- Object (wm: wm, anchor : anchor, window: window, position : Position . from_anchor ( anchor) );
42+ Object (wm: wm, window: window, anchor : anchor);
4043 }
4144
4245 construct {
@@ -46,7 +49,7 @@ public class Gala.PanelWindow : ShellWindow, RootTarget {
4649 }
4750 });
4851
49- notify[" anchor" ]. connect (() = > position = Position . from_anchor (anchor) );
52+ notify[" anchor" ]. connect (position_window );
5053
5154 unowned var workspace_manager = window. display. get_workspace_manager ();
5255 workspace_manager. workspace_added. connect (update_strut);
@@ -71,20 +74,50 @@ public class Gala.PanelWindow : ShellWindow, RootTarget {
7174 workspace_hide_tracker. switching_workspace_progress_updated. connect ((value ) = > workspace_gesture_controller. progress = value );
7275 workspace_hide_tracker. window_state_changed_progress_updated. connect (workspace_gesture_controller. goto);
7376
77+ window. size_changed. connect (update_target);
78+ notify[" anchor" ]. connect (update_target);
79+ update_target ();
80+
7481 add_gesture_controller (user_gesture_controller);
7582 add_gesture_controller (workspace_gesture_controller);
83+
84+ var window_actor = (Meta . WindowActor ) window. get_compositor_private ();
85+
86+ window_actor. notify[" width" ]. connect (update_clip);
87+ window_actor. notify[" height" ]. connect (update_clip);
88+ window_actor. notify[" translation-y" ]. connect (update_clip);
89+ notify[" anchor" ]. connect (update_clip);
90+ }
91+
92+ public Mtk . Rectangle get_custom_window_rect () {
93+ var window_rect = window. get_frame_rect ();
94+
95+ if (width > 0 ) {
96+ window_rect. width = width;
97+ }
98+
99+ if (height > 0 ) {
100+ window_rect. height = height;
101+
102+ if (anchor == BOTTOM ) {
103+ var geom = window. display. get_monitor_geometry (window. get_monitor ());
104+ window_rect. y = geom. y + geom. height - height;
105+ }
106+ }
107+
108+ return window_rect;
109+ }
110+
111+ public void set_size (int width, int height) {
112+ this . width = width;
113+ this . height = height;
76114 }
77115
78116 public void request_visible_in_multitasking_view () {
79117 visible_in_multitasking_view = true ;
80118 actor. add_action (new DragDropAction (DESTINATION , " multitaskingview-window" ));
81119 }
82120
83- protected override void update_target () {
84- base . update_target ();
85- workspace_hide_tracker. recalculate_all_workspaces ();
86- }
87-
88121 protected override double get_hidden_progress () {
89122 var user_workspace_hidden_progress = double . min (
90123 user_gesture_controller. progress,
@@ -214,4 +247,47 @@ public class Gala.PanelWindow : ShellWindow, RootTarget {
214247 return TOP ;
215248 }
216249 }
250+
251+ protected override void get_window_position (Mtk . Rectangle window_rect, out int x, out int y) {
252+ var monitor_rect = window. display. get_monitor_geometry (window. display. get_primary_monitor ());
253+ switch (anchor) {
254+ case TOP :
255+ x = monitor_rect. x + (monitor_rect. width - window_rect. width) / 2 ;
256+ y = monitor_rect. y;
257+ break ;
258+
259+ case BOTTOM :
260+ x = monitor_rect. x + (monitor_rect. width - window_rect. width) / 2 ;
261+ y = monitor_rect. y + monitor_rect. height - window_rect. height;
262+ break ;
263+
264+ default:
265+ warning (" Unsupported anchor %s for PanelWindow" , anchor. to_string ());
266+ x = 0 ;
267+ y = 0 ;
268+ break ;
269+ }
270+ }
271+
272+ private void update_target () {
273+ var to_value = anchor == TOP ? - get_custom_window_rect (). height : get_custom_window_rect (). height;
274+ hide_target = new PropertyTarget (CUSTOM , actor, " translation-y" , typeof (float ), 0f , (float ) to_value);
275+
276+ workspace_hide_tracker. recalculate_all_workspaces ();
277+ }
278+
279+ private void update_clip () {
280+ var monitor_geom = window. display. get_monitor_geometry (window. get_monitor ());
281+ var window_actor = (Meta . WindowActor ) window. get_compositor_private ();
282+
283+ var y = window_actor. y + window_actor. translation_y;
284+
285+ if (y + window_actor. height > monitor_geom. y + monitor_geom. height) {
286+ window_actor. set_clip (0 , 0 , window_actor. width, monitor_geom. y + monitor_geom. height - y);
287+ } else if (y < monitor_geom. y) {
288+ window_actor. set_clip (0 , monitor_geom. y - y, window_actor. width, window_actor. height);
289+ } else {
290+ window_actor. remove_clip ();
291+ }
292+ }
217293}
0 commit comments