66 */
77
88public class Gala.HideTracker : Object {
9- private const uint UPDATE_TIMEOUT = 200 ;
9+ private const int BARRIER_OFFSET = 50 ; // Allow hot corner trigger
10+ private const int UPDATE_TIMEOUT = 200 ;
11+ private const int HIDE_DELAY = 500 ;
1012
1113 public signal void hide ();
1214 public signal void show ();
1315
1416 public Meta . Display display { get ; construct; }
1517 public unowned PanelWindow panel { get ; construct; }
16- public Pantheon . Desktop . HideMode hide_mode { get ; set ; default = NEVER ; }
18+
19+ private Pantheon . Desktop . HideMode _hide_mode = NEVER ;
20+ public Pantheon . Desktop . HideMode hide_mode {
21+ get {
22+ return _hide_mode;
23+ }
24+ set {
25+ _hide_mode = value ;
26+
27+ destroy_barrier ();
28+ if (hide_mode != NEVER ) {
29+ setup_barrier ();
30+ }
31+ }
32+ }
1733
1834 private Clutter . PanAction pan_action;
1935
@@ -25,6 +41,9 @@ public class Gala.HideTracker : Object {
2541
2642 private Meta . Window current_focus_window;
2743
44+ private Barrier ? barrier;
45+
46+ private uint hide_timeout_id = 0 ;
2847 private uint update_timeout_id = 0 ;
2948
3049 public HideTracker (Meta .Display display , PanelWindow panel ) {
@@ -196,6 +215,13 @@ public class Gala.HideTracker : Object {
196215#endif
197216
198217 if (should_hide && ! hovered && ! panel. window. has_focus ()) {
218+ trigger_hide ();
219+ } else {
220+ trigger_show ();
221+ }
222+ }
223+
224+ private void trigger_hide () {
199225 // Don't hide if we have transients, e.g. an open popover, dialog, etc.
200226 var has_transients = false ;
201227 panel. window. foreach_transient (() = > {
@@ -204,15 +230,29 @@ public class Gala.HideTracker : Object {
204230 });
205231
206232 if (has_transients) {
233+ reset_hide_timeout ();
234+
207235 return ;
208236 }
209237
210- hide ();
211- } else {
212- show ();
238+ hide_timeout_id = Timeout . add_once (HIDE_DELAY , () = > {
239+ hide ();
240+ hide_timeout_id = 0 ;
241+ });
242+ }
243+
244+ private void reset_hide_timeout () {
245+ if (hide_timeout_id != 0 ) {
246+ Source . remove (hide_timeout_id);
247+ hide_timeout_id = 0 ;
213248 }
214249 }
215250
251+ private void trigger_show () {
252+ reset_hide_timeout ();
253+ show ();
254+ }
255+
216256 private bool check_valid_gesture () {
217257 if (panel. anchor != BOTTOM ) {
218258 debug (" Swipe to reveal is currently only supported for bottom anchors" );
@@ -236,9 +276,75 @@ public class Gala.HideTracker : Object {
236276
237277 if (delta_y < 0 ) { // Only allow swipes upwards
238278 panel. window. focus (pan_action. get_last_event (0 ). get_time ());
239- show ();
279+ trigger_show ();
240280 }
241281
242282 return false ;
243283 }
284+
285+ private void destroy_barrier () {
286+ barrier = null ;
287+ }
288+
289+ private void setup_barrier () {
290+ var monitor_geom = display. get_monitor_geometry (display. get_primary_monitor ());
291+ var scale = display. get_monitor_scale (display. get_primary_monitor ());
292+ var offset = InternalUtils . scale_to_int (BARRIER_OFFSET , scale);
293+
294+ switch (panel. anchor) {
295+ case TOP :
296+ setup_barrier_top (monitor_geom, offset);
297+ break ;
298+
299+ case BOTTOM :
300+ setup_barrier_bottom (monitor_geom, offset);
301+ break ;
302+
303+ default:
304+ warning (" Barrier side not supported yet" );
305+ break ;
306+ }
307+ }
308+
309+ #if HAS_MUTTER45
310+ private void setup_barrier_top (Mtk .Rectangle monitor_geom , int offset ) {
311+ #else
312+ private void setup_barrier_top (Meta . Rectangle monitor_geom, int offset) {
313+ #endif
314+ barrier = new Barrier (
315+ display. get_context (). get_backend (),
316+ monitor_geom. x + offset,
317+ monitor_geom. y,
318+ monitor_geom. x + monitor_geom. width - offset,
319+ monitor_geom. y,
320+ POSITIVE_Y ,
321+ 0 ,
322+ 0 ,
323+ int . MAX ,
324+ int . MAX
325+ );
326+
327+ barrier. trigger. connect (trigger_show);
328+ }
329+
330+ #if HAS_MUTTER45
331+ private void setup_barrier_bottom (Mtk . Rectangle monitor_geom, int offset) {
332+ #else
333+ private void setup_barrier_bottom (Meta . Rectangle monitor_geom, int offset) {
334+ #endif
335+ barrier = new Barrier (
336+ display. get_context (). get_backend (),
337+ monitor_geom. x + offset,
338+ monitor_geom. y + monitor_geom. height,
339+ monitor_geom. x + monitor_geom. width - offset,
340+ monitor_geom. y + monitor_geom. height,
341+ NEGATIVE_Y ,
342+ 0 ,
343+ 0 ,
344+ int . MAX ,
345+ int . MAX
346+ );
347+
348+ barrier. trigger. connect (trigger_show);
349+ }
244350}
0 commit comments