Skip to content

Commit f9ed6a9

Browse files
committed
Add panel hide delay
1 parent cb6f645 commit f9ed6a9

File tree

3 files changed

+115
-85
lines changed

3 files changed

+115
-85
lines changed

src/ShellClients/HideTracker.vala

Lines changed: 112 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -6,14 +6,30 @@
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+
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
}

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: 2 additions & 78 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
}
@@ -152,16 +146,13 @@ public class Gala.PanelWindow : Object {
152146
}
153147

154148
public void set_hide_mode (Pantheon.Desktop.HideMode hide_mode) {
155-
clone.hide_mode = hide_mode;
156-
157-
destroy_barrier ();
158-
159149
if (hide_mode == NEVER) {
160150
make_exclusive ();
161151
} else {
162152
unmake_exclusive ();
163-
setup_barrier ();
164153
}
154+
155+
clone.hide_mode = hide_mode;
165156
}
166157

167158
private void make_exclusive () {
@@ -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)