Skip to content

Commit 1c70d89

Browse files
authored
WindowSwitcher: correctly scale icons and rounded corners (#2606)
1 parent 099cd69 commit 1c70d89

File tree

2 files changed

+43
-45
lines changed

2 files changed

+43
-45
lines changed

src/Widgets/WindowSwitcher/WindowSwitcher.vala

Lines changed: 22 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -13,10 +13,10 @@ public class Gala.WindowSwitcher : CanvasActor, GestureTarget, RootTarget {
1313
private const int MIN_OFFSET = 64;
1414
private const double GESTURE_STEP = 0.1;
1515

16+
public Clutter.Actor? actor { get { return this; } }
1617
public WindowManager wm { get; construct; }
1718
public bool opened { get; private set; default = false; }
18-
19-
public Clutter.Actor? actor { get { return this; } }
19+
public float monitor_scale { get; private set; default = 1.0f; }
2020

2121
private GestureController gesture_controller;
2222
private int modifier_mask;
@@ -50,8 +50,6 @@ public class Gala.WindowSwitcher : CanvasActor, GestureTarget, RootTarget {
5050

5151
private double previous_progress = 0d;
5252

53-
private float scaling_factor = 1.0f;
54-
5553
public WindowSwitcher (WindowManager wm) {
5654
Object (wm: wm);
5755
}
@@ -95,37 +93,31 @@ public class Gala.WindowSwitcher : CanvasActor, GestureTarget, RootTarget {
9593
orientation = VERTICAL
9694
};
9795

98-
shadow_effect = new ShadowEffect ("window-switcher", scaling_factor) {
96+
notify["monitor-scale"].connect (scale);
97+
scale ();
98+
99+
shadow_effect = new ShadowEffect ("window-switcher", monitor_scale) {
99100
border_radius = 10,
100101
shadow_opacity = 100
101102
};
103+
bind_property ("monitor-scale", shadow_effect, "monitor-scale");
102104
add_effect (shadow_effect);
103105

104106

105-
blur_effect = new BackgroundBlurEffect (40, 9, scaling_factor);
107+
blur_effect = new BackgroundBlurEffect (40, 9, monitor_scale);
108+
bind_property ("monitor-scale", blur_effect, "monitor-scale");
106109
add_effect (blur_effect);
107110

108-
scale ();
109-
110111
container.button_release_event.connect (container_mouse_release);
111112

112113
// Redraw the components if the colour scheme changes.
113114
style_manager.notify["prefers-color-scheme"].connect (content.invalidate);
114115

115-
unowned var monitor_manager = wm.get_display ().get_context ().get_backend ().get_monitor_manager ();
116-
monitor_manager.monitors_changed.connect (scale);
117-
118116
notify["opacity"].connect (() => visible = opacity != 0);
119117
}
120118

121119
private void scale () {
122-
unowned var display = wm.get_display ();
123-
scaling_factor = display.get_monitor_scale (display.get_current_monitor ());
124-
125-
shadow_effect.monitor_scale = scaling_factor;
126-
blur_effect.monitor_scale = scaling_factor;
127-
128-
var margin = Utils.scale_to_int (WRAPPER_PADDING, scaling_factor);
120+
var margin = Utils.scale_to_int (WRAPPER_PADDING, monitor_scale);
129121

130122
container.margin_left = margin;
131123
container.margin_right = margin;
@@ -150,7 +142,7 @@ public class Gala.WindowSwitcher : CanvasActor, GestureTarget, RootTarget {
150142
container.get_preferred_size (null, null, out container_nat_width, null);
151143

152144
var max_width = float.min (
153-
geom.width - Utils.scale_to_int (MIN_OFFSET * 2, scaling_factor), // Don't overflow the monitor
145+
geom.width - Utils.scale_to_int (MIN_OFFSET * 2, monitor_scale), // Don't overflow the monitor
154146
container_nat_width // Ellipsize the label if it's longer than the icons
155147
);
156148

@@ -184,12 +176,12 @@ public class Gala.WindowSwitcher : CanvasActor, GestureTarget, RootTarget {
184176

185177
ctx.set_operator (Cairo.Operator.SOURCE);
186178

187-
var stroke_width = Utils.scale_to_int (1, scaling_factor);
179+
var stroke_width = Utils.scale_to_int (1, monitor_scale);
188180
Drawing.Utilities.cairo_rounded_rectangle (
189181
ctx,
190182
stroke_width / 2.0, stroke_width / 2.0,
191183
width - stroke_width, height - stroke_width,
192-
Utils.scale_to_int (9, scaling_factor)
184+
Utils.scale_to_int (9, monitor_scale)
193185
);
194186

195187
ctx.set_source_rgba (
@@ -214,7 +206,7 @@ public class Gala.WindowSwitcher : CanvasActor, GestureTarget, RootTarget {
214206
ctx, stroke_width * 1.5, stroke_width * 1.5,
215207
width - stroke_width * 3,
216208
height - stroke_width * 3,
217-
Utils.scale_to_int (8, scaling_factor)
209+
Utils.scale_to_int (8, monitor_scale)
218210
);
219211

220212
ctx.set_line_width (stroke_width);
@@ -334,14 +326,17 @@ public class Gala.WindowSwitcher : CanvasActor, GestureTarget, RootTarget {
334326
container.remove_all_children ();
335327
select_icon (null);
336328

329+
monitor_scale = display.get_monitor_scale (display.get_current_monitor ());
330+
337331
var windows = display.get_tab_list (Meta.TabList.NORMAL, workspace);
338332
if (windows == null) {
339333
return false;
340334
}
341335

342336
unowned var current_window = display.get_tab_current (Meta.TabList.NORMAL, workspace);
343337
foreach (unowned var window in windows) {
344-
var icon = new WindowSwitcherIcon (window, scaling_factor);
338+
var icon = new WindowSwitcherIcon (window, monitor_scale);
339+
bind_property ("monitor-scale", icon, "monitor-scale");
345340
add_icon (icon);
346341

347342
if (window == current_window) {
@@ -356,6 +351,8 @@ public class Gala.WindowSwitcher : CanvasActor, GestureTarget, RootTarget {
356351
container.remove_all_children ();
357352
select_icon (null);
358353

354+
monitor_scale = display.get_monitor_scale (display.get_current_monitor ());
355+
359356
var windows = display.get_tab_list (Meta.TabList.NORMAL, workspace);
360357
if (windows == null) {
361358
return false;
@@ -370,7 +367,8 @@ public class Gala.WindowSwitcher : CanvasActor, GestureTarget, RootTarget {
370367
var app = window_tracker.get_app_for_window (current_window);
371368
foreach (unowned var window in windows) {
372369
if (window_tracker.get_app_for_window (window) == app) {
373-
var icon = new WindowSwitcherIcon (window, scaling_factor);
370+
var icon = new WindowSwitcherIcon (window, monitor_scale);
371+
bind_property ("monitor-scale", icon, "monitor-scale");
374372
add_icon (icon);
375373

376374
if (window == current_window) {

src/Widgets/WindowSwitcher/WindowSwitcherIcon.vala

Lines changed: 21 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -8,10 +8,7 @@ public class Gala.WindowSwitcherIcon : Clutter.Actor {
88
private const int WRAPPER_BORDER_RADIUS = 3;
99

1010
public Meta.Window window { get; construct; }
11-
12-
private WindowIcon icon;
13-
private RoundedCornersEffect rounded_corners_effect;
14-
11+
public float monitor_scale { get; construct set; }
1512
public bool selected {
1613
set {
1714
if (value) {
@@ -25,34 +22,37 @@ public class Gala.WindowSwitcherIcon : Clutter.Actor {
2522
}
2623
}
2724

28-
public float scale_factor {
29-
set {
30-
var margin = Utils.scale_to_int (WindowSwitcher.WRAPPER_PADDING, value);
31-
icon.margin_top = margin;
32-
icon.margin_right = margin;
33-
icon.margin_bottom = margin;
34-
icon.margin_left = margin;
35-
36-
rounded_corners_effect.monitor_scale = value;
37-
}
25+
public WindowSwitcherIcon (Meta.Window window, float monitor_scale) {
26+
Object (window: window, monitor_scale: monitor_scale);
3827
}
3928

40-
public WindowSwitcherIcon (Meta.Window window, float scale_factor) {
41-
Object (window: window);
42-
29+
construct {
4330
layout_manager = new Clutter.BinLayout ();
4431
reactive = true;
4532

46-
icon = new WindowIcon (window, Utils.scale_to_int (ICON_SIZE, scale_factor));
47-
add_child (icon);
33+
reload_icon ();
4834

49-
rounded_corners_effect = new RoundedCornersEffect (WRAPPER_BORDER_RADIUS, scale_factor);
35+
var rounded_corners_effect = new RoundedCornersEffect (WRAPPER_BORDER_RADIUS, monitor_scale);
36+
bind_property ("monitor-scale", rounded_corners_effect, "monitor-scale");
5037
add_effect (rounded_corners_effect);
5138

5239
get_accessible ().accessible_name = window.title;
5340
get_accessible ().accessible_role = LIST_ITEM;
5441
get_accessible ().notify_state_change (Atk.StateType.FOCUSABLE, true);
5542

56-
this.scale_factor = scale_factor;
43+
notify["monitor-scale"].connect (reload_icon);
44+
}
45+
46+
private void reload_icon () {
47+
remove_all_children ();
48+
49+
var margin = Utils.scale_to_int (WindowSwitcher.WRAPPER_PADDING, monitor_scale);
50+
var icon = new WindowIcon (window, Utils.scale_to_int (ICON_SIZE, monitor_scale)) {
51+
margin_top = margin,
52+
margin_right = margin,
53+
margin_bottom = margin,
54+
margin_left = margin
55+
};
56+
add_child (icon);
5757
}
5858
}

0 commit comments

Comments
 (0)