Skip to content

Commit 1420ace

Browse files
authored
Merge branch 'main' into leolost/panel-fix-some-window-size-logic
2 parents 542f231 + 98f8caf commit 1420ace

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
}
@@ -159,13 +153,10 @@ public class Gala.PanelWindow : Object {
159153
public void set_hide_mode (Pantheon.Desktop.HideMode hide_mode) {
160154
clone.hide_mode = hide_mode;
161155

162-
destroy_barrier ();
163-
164156
if (hide_mode == NEVER) {
165157
make_exclusive ();
166158
} else {
167159
unmake_exclusive ();
168-
setup_barrier ();
169160
}
170161
}
171162

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

0 commit comments

Comments
 (0)