Skip to content

Commit 98f8caf

Browse files
lenemterstsdc
andauthored
Add panel hide delay (#2103)
Co-authored-by: Stanisław <[email protected]>
1 parent 60fd6ca commit 98f8caf

File tree

3 files changed

+125
-96
lines changed

3 files changed

+125
-96
lines changed

src/ShellClients/HideTracker.vala

Lines changed: 124 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -6,14 +6,27 @@
66
*/
77

88
public 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+
setup_barrier ();
28+
}
29+
}
1730

1831
private Clutter.PanAction pan_action;
1932

@@ -25,12 +38,21 @@ public class Gala.HideTracker : Object {
2538

2639
private Meta.Window current_focus_window;
2740

41+
private Barrier? barrier;
42+
43+
private uint hide_timeout_id = 0;
2844
private uint update_timeout_id = 0;
2945

3046
public HideTracker (Meta.Display display, PanelWindow panel) {
3147
Object (display: display, panel: panel);
3248
}
3349

50+
~HideTracker () {
51+
if (hide_timeout_id != 0) {
52+
Source.remove (hide_timeout_id);
53+
}
54+
}
55+
3456
construct {
3557
// Can't be local otherwise we get a memory leak :(
3658
// See https://gitlab.gnome.org/GNOME/vala/-/issues/1548
@@ -163,10 +185,6 @@ public class Gala.HideTracker : Object {
163185

164186
private void update_hidden () {
165187
switch (hide_mode) {
166-
case NEVER:
167-
toggle_display (false);
168-
break;
169-
170188
case MAXIMIZED_FOCUS_WINDOW:
171189
toggle_display (focus_maximized_overlap);
172190
break;
@@ -182,6 +200,10 @@ public class Gala.HideTracker : Object {
182200
case ALWAYS:
183201
toggle_display (true);
184202
break;
203+
204+
default:
205+
warning ("HideTracker: unsupported hide mode.");
206+
break;
185207
}
186208
}
187209

@@ -196,23 +218,44 @@ public class Gala.HideTracker : Object {
196218
#endif
197219

198220
if (should_hide && !hovered && !panel.window.has_focus ()) {
199-
// Don't hide if we have transients, e.g. an open popover, dialog, etc.
200-
var has_transients = false;
201-
panel.window.foreach_transient (() => {
202-
has_transients = true;
203-
return false;
204-
});
205-
206-
if (has_transients) {
207-
return;
208-
}
221+
trigger_hide ();
222+
} else {
223+
trigger_show ();
224+
}
225+
}
226+
227+
private void trigger_hide () {
228+
// Don't hide if we have transients, e.g. an open popover, dialog, etc.
229+
var has_transients = false;
230+
panel.window.foreach_transient (() => {
231+
has_transients = true;
232+
return false;
233+
});
234+
235+
if (has_transients) {
236+
reset_hide_timeout ();
237+
238+
return;
239+
}
209240

241+
hide_timeout_id = Timeout.add_once (HIDE_DELAY, () => {
210242
hide ();
211-
} else {
212-
show ();
243+
hide_timeout_id = 0;
244+
});
245+
}
246+
247+
private void reset_hide_timeout () {
248+
if (hide_timeout_id != 0) {
249+
Source.remove (hide_timeout_id);
250+
hide_timeout_id = 0;
213251
}
214252
}
215253

254+
private void trigger_show () {
255+
reset_hide_timeout ();
256+
show ();
257+
}
258+
216259
private bool check_valid_gesture () {
217260
if (panel.anchor != BOTTOM) {
218261
debug ("Swipe to reveal is currently only supported for bottom anchors");
@@ -236,9 +279,71 @@ public class Gala.HideTracker : Object {
236279

237280
if (delta_y < 0) { // Only allow swipes upwards
238281
panel.window.focus (pan_action.get_last_event (0).get_time ());
239-
show ();
282+
trigger_show ();
240283
}
241284

242285
return false;
243286
}
287+
288+
private void setup_barrier () {
289+
var monitor_geom = display.get_monitor_geometry (display.get_primary_monitor ());
290+
var scale = display.get_monitor_scale (display.get_primary_monitor ());
291+
var offset = InternalUtils.scale_to_int (BARRIER_OFFSET, scale);
292+
293+
switch (panel.anchor) {
294+
case TOP:
295+
setup_barrier_top (monitor_geom, offset);
296+
break;
297+
298+
case BOTTOM:
299+
setup_barrier_bottom (monitor_geom, offset);
300+
break;
301+
302+
default:
303+
warning ("Barrier side not supported yet");
304+
break;
305+
}
306+
}
307+
308+
#if HAS_MUTTER45
309+
private void setup_barrier_top (Mtk.Rectangle monitor_geom, int offset) {
310+
#else
311+
private void setup_barrier_top (Meta.Rectangle monitor_geom, int offset) {
312+
#endif
313+
barrier = new Barrier (
314+
display.get_context ().get_backend (),
315+
monitor_geom.x + offset,
316+
monitor_geom.y,
317+
monitor_geom.x + monitor_geom.width - offset,
318+
monitor_geom.y,
319+
POSITIVE_Y,
320+
0,
321+
0,
322+
int.MAX,
323+
int.MAX
324+
);
325+
326+
barrier.trigger.connect (trigger_show);
327+
}
328+
329+
#if HAS_MUTTER45
330+
private void setup_barrier_bottom (Mtk.Rectangle monitor_geom, int offset) {
331+
#else
332+
private void setup_barrier_bottom (Meta.Rectangle monitor_geom, int offset) {
333+
#endif
334+
barrier = new Barrier (
335+
display.get_context ().get_backend (),
336+
monitor_geom.x + offset,
337+
monitor_geom.y + monitor_geom.height,
338+
monitor_geom.x + monitor_geom.width - offset,
339+
monitor_geom.y + monitor_geom.height,
340+
NEGATIVE_Y,
341+
0,
342+
0,
343+
int.MAX,
344+
int.MAX
345+
);
346+
347+
barrier.trigger.connect (trigger_show);
348+
}
244349
}

src/ShellClients/PanelClone.vala

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -141,7 +141,7 @@ public class Gala.PanelClone : Object {
141141
clone.restore_easing_state ();
142142
}
143143

144-
public void show () {
144+
private void show () {
145145
if (!panel_hidden) {
146146
return;
147147
}

src/ShellClients/PanelWindow.vala

Lines changed: 0 additions & 76 deletions
Original file line numberDiff line numberDiff line change
@@ -6,8 +6,6 @@
66
*/
77

88
public class Gala.PanelWindow : Object {
9-
private const int BARRIER_OFFSET = 50; // Allow hot corner trigger
10-
119
private static HashTable<Meta.Window, Meta.Strut?> window_struts = new HashTable<Meta.Window, Meta.Strut?> (null, null);
1210

1311
public WindowManager wm { get; construct; }
@@ -17,8 +15,6 @@ public class Gala.PanelWindow : Object {
1715

1816
public Meta.Side anchor;
1917

20-
private Barrier? barrier;
21-
2218
private PanelClone clone;
2319

2420
private uint idle_move_id = 0;
@@ -42,8 +38,6 @@ public class Gala.PanelWindow : Object {
4238
Source.remove (idle_move_id);
4339
}
4440

45-
destroy_barrier ();
46-
4741
if (window_struts.remove (window)) {
4842
update_struts ();
4943
}
@@ -154,13 +148,10 @@ public class Gala.PanelWindow : Object {
154148
public void set_hide_mode (Pantheon.Desktop.HideMode hide_mode) {
155149
clone.hide_mode = hide_mode;
156150

157-
destroy_barrier ();
158-
159151
if (hide_mode == NEVER) {
160152
make_exclusive ();
161153
} else {
162154
unmake_exclusive ();
163-
setup_barrier ();
164155
}
165156
}
166157

@@ -203,71 +194,4 @@ public class Gala.PanelWindow : Object {
203194
update_struts ();
204195
}
205196
}
206-
207-
private void destroy_barrier () {
208-
barrier = null;
209-
}
210-
211-
private void setup_barrier () {
212-
var display = wm.get_display ();
213-
var monitor_geom = display.get_monitor_geometry (display.get_primary_monitor ());
214-
var scale = display.get_monitor_scale (display.get_primary_monitor ());
215-
var offset = InternalUtils.scale_to_int (BARRIER_OFFSET, scale);
216-
217-
switch (anchor) {
218-
case TOP:
219-
setup_barrier_top (monitor_geom, offset);
220-
break;
221-
222-
case BOTTOM:
223-
setup_barrier_bottom (monitor_geom, offset);
224-
break;
225-
226-
default:
227-
warning ("Barrier side not supported yet");
228-
break;
229-
}
230-
}
231-
232-
#if HAS_MUTTER45
233-
private void setup_barrier_top (Mtk.Rectangle monitor_geom, int offset) {
234-
#else
235-
private void setup_barrier_top (Meta.Rectangle monitor_geom, int offset) {
236-
#endif
237-
barrier = new Barrier (
238-
wm.get_display ().get_context ().get_backend (),
239-
monitor_geom.x + offset,
240-
monitor_geom.y,
241-
monitor_geom.x + monitor_geom.width - offset,
242-
monitor_geom.y,
243-
POSITIVE_Y,
244-
0,
245-
0,
246-
int.MAX,
247-
int.MAX
248-
);
249-
250-
barrier.trigger.connect (clone.show);
251-
}
252-
253-
#if HAS_MUTTER45
254-
private void setup_barrier_bottom (Mtk.Rectangle monitor_geom, int offset) {
255-
#else
256-
private void setup_barrier_bottom (Meta.Rectangle monitor_geom, int offset) {
257-
#endif
258-
barrier = new Barrier (
259-
wm.get_display ().get_context ().get_backend (),
260-
monitor_geom.x + offset,
261-
monitor_geom.y + monitor_geom.height,
262-
monitor_geom.x + monitor_geom.width - offset,
263-
monitor_geom.y + monitor_geom.height,
264-
NEGATIVE_Y,
265-
0,
266-
0,
267-
int.MAX,
268-
int.MAX
269-
);
270-
271-
barrier.trigger.connect (clone.show);
272-
}
273197
}

0 commit comments

Comments
 (0)