Skip to content

Commit 1e8438e

Browse files
authored
Merge branch 'main' into leolost/panel-window-use-window-positioner
2 parents d76d71e + 50f89d3 commit 1e8438e

37 files changed

+1600
-866
lines changed

.github/workflows/main.yml

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,24 @@ jobs:
4040
ninja -C build
4141
ninja -C build install
4242
43+
fedora:
44+
runs-on: ubuntu-latest
45+
46+
container:
47+
image: fedora:latest
48+
49+
steps:
50+
- uses: actions/checkout@v4
51+
- name: Install Dependencies
52+
run: |
53+
dnf install -y desktop-file-utils gettext gsettings-desktop-schemas-devel atk-devel libcanberra-devel clutter-devel libgee-devel glib2-devel gnome-desktop3-devel granite-devel granite-7-devel gtk3-devel gtk4-devel libhandy-devel mutter-devel xml2 sqlite-devel meson valac valadoc
54+
- name: Build
55+
env:
56+
DESTDIR: out
57+
run: |
58+
meson build
59+
ninja -C build install
60+
4361
lint:
4462

4563
runs-on: ubuntu-latest

lib/App.vala

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -158,8 +158,8 @@ public class Gala.App : GLib.Object {
158158
return windows.data;
159159
}
160160

161-
public GLib.SList<Posix.pid_t?> get_pids () {
162-
var results = new GLib.SList<Posix.pid_t?> ();
161+
public GLib.SList<pid_t?> get_pids () {
162+
var results = new GLib.SList<pid_t?> ();
163163
foreach (unowned var window in windows) {
164164
var pid = window.get_pid ();
165165
if (pid < 1) {

meson.build

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -158,6 +158,17 @@ if mutter46_dep.found()
158158
vala_flags = ['--define', 'HAS_MUTTER43', '--define', 'HAS_MUTTER44', '--define', 'HAS_MUTTER45', '--define', 'HAS_MUTTER46']
159159
endif
160160

161+
mutter47_dep = dependency('libmutter-15', version: ['>= 47', '< 48'], required: false)
162+
if mutter47_dep.found()
163+
libmutter_dep = dependency('libmutter-15', version: '>= 47')
164+
mutter_dep = [
165+
libmutter_dep,
166+
dependency('mutter-mtk-15'), dependency('mutter-cogl-15'),
167+
dependency('mutter-cogl-pango-15'), dependency('mutter-clutter-15')
168+
]
169+
vala_flags = ['--define', 'HAS_MUTTER43', '--define', 'HAS_MUTTER44', '--define', 'HAS_MUTTER45', '--define', 'HAS_MUTTER46', '--define', 'HAS_MUTTER47']
170+
endif
171+
161172
if mutter_dep.length() == 0
162173
error ('No supported mutter library found!')
163174
endif

po/fr.po

Lines changed: 7 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -8,10 +8,10 @@ msgstr ""
88
"Project-Id-Version: gala\n"
99
"Report-Msgid-Bugs-To: https://github.com/elementary/gala/issues\n"
1010
"POT-Creation-Date: 2024-10-15 19:33+0000\n"
11-
"PO-Revision-Date: 2024-08-27 08:16+0000\n"
12-
"Last-Translator: Nathan <[email protected]>\n"
13-
"Language-Team: French <https://l10n.elementary.io/projects/desktop/gala/fr/"
14-
">\n"
11+
"PO-Revision-Date: 2024-11-13 15:14+0000\n"
12+
"Last-Translator: Stella Ménier <[email protected]>\n"
13+
"Language-Team: French <https://l10n.elementary.io/projects/desktop/gala/fr/>"
14+
"\n"
1515
"Language: fr\n"
1616
"MIME-Version: 1.0\n"
1717
"Content-Type: text/plain; charset=UTF-8\n"
@@ -122,18 +122,15 @@ msgid "Updated translations"
122122
msgstr "Mise à jour des traductions"
123123

124124
#: data/gala.metainfo.xml.in:49
125-
#, fuzzy
126-
#| msgid "Fix a potential crash when taking screenshots"
127125
msgid "Fix a potential crash when moving windows between workspaces"
128126
msgstr ""
129-
"Correction d'un plantage potentiel lors de la prise de captures d'écran"
127+
"Correction d'un plantage potentiel lors du déplacement de fenêtres entre "
128+
"espaces de travail"
130129

131130
#: data/gala.metainfo.xml.in:50
132-
#, fuzzy
133-
#| msgid "Fix notification position after changing DPI"
134131
msgid "Fix notification animation when entering multitasking view"
135132
msgstr ""
136-
"Correction de la position des notifications après la modification du DPI"
133+
"Correction de l'animation des notifications en entrant dans la vue multitâche"
137134

138135
#: data/gala.metainfo.xml.in:65
139136
msgid "Improve keyboard navigation in Multitasking View"

src/Background/Background.vala

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -108,15 +108,38 @@ namespace Gala {
108108
var settings = background_source.gnome_background_settings;
109109

110110
color_string = settings.get_string ("primary-color");
111+
#if HAS_MUTTER47
112+
var color = Cogl.Color.from_string (color_string);
113+
#else
111114
var color = Clutter.Color.from_string (color_string);
115+
#endif
116+
if (color == null) {
117+
#if HAS_MUTTER47
118+
color = Cogl.Color.from_string ("black");
119+
#else
120+
color = Clutter.Color.from_string ("black");
121+
#endif
122+
}
112123

113124
var shading_type = settings.get_enum ("color-shading-type");
114125

115126
if (shading_type == GDesktop.BackgroundShading.SOLID) {
116127
background.set_color (color);
117128
} else {
118129
color_string = settings.get_string ("secondary-color");
130+
#if HAS_MUTTER47
131+
var second_color = Cogl.Color.from_string (color_string);
132+
#else
119133
var second_color = Clutter.Color.from_string (color_string);
134+
#endif
135+
if (second_color == null) {
136+
#if HAS_MUTTER47
137+
second_color = Cogl.Color.from_string ("black");
138+
#else
139+
second_color = Clutter.Color.from_string ("black");
140+
#endif
141+
}
142+
120143
background.set_gradient ((GDesktop.BackgroundShading) shading_type, color, second_color);
121144
}
122145
}

src/Background/BackgroundContainer.vala

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -49,7 +49,11 @@ namespace Gala {
4949
}
5050

5151
public void set_black_background (bool black) {
52+
#if HAS_MUTTER47
53+
set_background_color (black ? Cogl.Color.from_string ("Black") : null);
54+
#else
5255
set_background_color (black ? Clutter.Color.from_string ("Black") : null);
56+
#endif
5357
}
5458

5559
private void update () {

src/InternalUtils.vala

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -71,8 +71,12 @@ namespace Gala {
7171
}
7272

7373
unowned Meta.X11Display x11display = display.get_x11_display ();
74+
#if HAS_MUTTER47
75+
x11display.set_stage_input_region (rects);
76+
#else
7477
var xregion = X.Fixes.create_region (x11display.get_xdisplay (), rects);
7578
x11display.set_stage_input_region (xregion);
79+
#endif
7680
}
7781

7882
/**

src/ScreenshotManager.vala

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -65,7 +65,9 @@ namespace Gala {
6565
var flash_actor = new Clutter.Actor ();
6666
flash_actor.set_size (width, height);
6767
flash_actor.set_position (x, y);
68-
#if HAS_MUTTER46
68+
#if HAS_MUTTER47
69+
flash_actor.set_background_color (Cogl.Color.from_string ("white"));
70+
#elif HAS_MUTTER46
6971
flash_actor.set_background_color (Clutter.Color.from_pixel (0xffffffffu));
7072
#else
7173
flash_actor.set_background_color (Clutter.Color.get_static (Clutter.StaticColor.WHITE));
@@ -151,8 +153,12 @@ namespace Gala {
151153
window_actor.get_position (out actor_x, out actor_y);
152154

153155
var rect = window.get_frame_rect ();
156+
#if HAS_MUTTER45
157+
if (!include_frame) {
158+
#if else
154159
if ((include_frame && window.is_client_decorated ()) ||
155160
(!include_frame && !window.is_client_decorated ())) {
161+
#endif
156162
rect = window.frame_rect_to_client_rect (rect);
157163
}
158164

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
}

0 commit comments

Comments
 (0)