Skip to content
Merged
Show file tree
Hide file tree
Changes from 4 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
48 changes: 25 additions & 23 deletions src/Widgets/WindowSwitcher/WindowSwitcher.vala
Original file line number Diff line number Diff line change
Expand Up @@ -13,10 +13,10 @@ public class Gala.WindowSwitcher : CanvasActor, GestureTarget, RootTarget {
private const int MIN_OFFSET = 64;
private const double GESTURE_STEP = 0.1;

public Clutter.Actor? actor { get { return this; } }
public WindowManager wm { get; construct; }
public bool opened { get; private set; default = false; }

public Clutter.Actor? actor { get { return this; } }
public float monitor_scale { get; private set; }

private GestureController gesture_controller;
private int modifier_mask;
Expand Down Expand Up @@ -50,8 +50,6 @@ public class Gala.WindowSwitcher : CanvasActor, GestureTarget, RootTarget {

private double previous_progress = 0d;

private float scaling_factor = 1.0f;

public WindowSwitcher (WindowManager wm) {
Object (wm: wm);
}
Expand Down Expand Up @@ -95,37 +93,39 @@ public class Gala.WindowSwitcher : CanvasActor, GestureTarget, RootTarget {
orientation = VERTICAL
};

shadow_effect = new ShadowEffect ("window-switcher", scaling_factor) {
unowned var display = wm.get_display ();
monitor_scale = display.get_monitor_scale (display.get_primary_monitor ());
notify["monitor-scale"].connect (scale);

scale ();

shadow_effect = new ShadowEffect ("window-switcher", monitor_scale) {
border_radius = 10,
shadow_opacity = 100
};
bind_property ("monitor-scale", shadow_effect, "monitor-scale");
add_effect (shadow_effect);


blur_effect = new BackgroundBlurEffect (40, 9, scaling_factor);
blur_effect = new BackgroundBlurEffect (40, 9, monitor_scale);
bind_property ("monitor-scale", blur_effect, "monitor-scale");
add_effect (blur_effect);

scale ();

container.button_release_event.connect (container_mouse_release);

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

unowned var monitor_manager = wm.get_display ().get_context ().get_backend ().get_monitor_manager ();
monitor_manager.monitors_changed.connect (scale);
unowned var monitor_manager = display.get_context ().get_backend ().get_monitor_manager ();
monitor_manager.monitors_changed.connect (() => {
monitor_scale = display.get_monitor_scale (display.get_primary_monitor ());
});

notify["opacity"].connect (() => visible = opacity != 0);
}

private void scale () {
unowned var display = wm.get_display ();
scaling_factor = display.get_monitor_scale (display.get_current_monitor ());

shadow_effect.monitor_scale = scaling_factor;
blur_effect.monitor_scale = scaling_factor;

var margin = Utils.scale_to_int (WRAPPER_PADDING, scaling_factor);
var margin = Utils.scale_to_int (WRAPPER_PADDING, monitor_scale);

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

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

Expand Down Expand Up @@ -184,12 +184,12 @@ public class Gala.WindowSwitcher : CanvasActor, GestureTarget, RootTarget {

ctx.set_operator (Cairo.Operator.SOURCE);

var stroke_width = Utils.scale_to_int (1, scaling_factor);
var stroke_width = Utils.scale_to_int (1, monitor_scale);
Drawing.Utilities.cairo_rounded_rectangle (
ctx,
stroke_width / 2.0, stroke_width / 2.0,
width - stroke_width, height - stroke_width,
Utils.scale_to_int (9, scaling_factor)
Utils.scale_to_int (9, monitor_scale)
);

ctx.set_source_rgba (
Expand All @@ -214,7 +214,7 @@ public class Gala.WindowSwitcher : CanvasActor, GestureTarget, RootTarget {
ctx, stroke_width * 1.5, stroke_width * 1.5,
width - stroke_width * 3,
height - stroke_width * 3,
Utils.scale_to_int (8, scaling_factor)
Utils.scale_to_int (8, monitor_scale)
);

ctx.set_line_width (stroke_width);
Expand Down Expand Up @@ -341,7 +341,8 @@ public class Gala.WindowSwitcher : CanvasActor, GestureTarget, RootTarget {

unowned var current_window = display.get_tab_current (Meta.TabList.NORMAL, workspace);
foreach (unowned var window in windows) {
var icon = new WindowSwitcherIcon (window, scaling_factor);
var icon = new WindowSwitcherIcon (window, monitor_scale);
bind_property ("monitor-scale", icon, "monitor-scale");
add_icon (icon);

if (window == current_window) {
Expand Down Expand Up @@ -370,7 +371,8 @@ public class Gala.WindowSwitcher : CanvasActor, GestureTarget, RootTarget {
var app = window_tracker.get_app_for_window (current_window);
foreach (unowned var window in windows) {
if (window_tracker.get_app_for_window (window) == app) {
var icon = new WindowSwitcherIcon (window, scaling_factor);
var icon = new WindowSwitcherIcon (window, monitor_scale);
bind_property ("monitor-scale", icon, "monitor-scale");
add_icon (icon);

if (window == current_window) {
Expand Down
42 changes: 21 additions & 21 deletions src/Widgets/WindowSwitcher/WindowSwitcherIcon.vala
Original file line number Diff line number Diff line change
Expand Up @@ -8,10 +8,7 @@ public class Gala.WindowSwitcherIcon : Clutter.Actor {
private const int WRAPPER_BORDER_RADIUS = 3;

public Meta.Window window { get; construct; }

private WindowIcon icon;
private RoundedCornersEffect rounded_corners_effect;

public float monitor_scale { get; construct set; }
public bool selected {
set {
if (value) {
Expand All @@ -25,34 +22,37 @@ public class Gala.WindowSwitcherIcon : Clutter.Actor {
}
}

public float scale_factor {
set {
var margin = Utils.scale_to_int (WindowSwitcher.WRAPPER_PADDING, value);
icon.margin_top = margin;
icon.margin_right = margin;
icon.margin_bottom = margin;
icon.margin_left = margin;

rounded_corners_effect.monitor_scale = value;
}
public WindowSwitcherIcon (Meta.Window window, float monitor_scale) {
Object (window: window, monitor_scale: monitor_scale);
}

public WindowSwitcherIcon (Meta.Window window, float scale_factor) {
Object (window: window);

construct {
layout_manager = new Clutter.BinLayout ();
reactive = true;

icon = new WindowIcon (window, Utils.scale_to_int (ICON_SIZE, scale_factor));
add_child (icon);
reload_icon ();

rounded_corners_effect = new RoundedCornersEffect (WRAPPER_BORDER_RADIUS, scale_factor);
var rounded_corners_effect = new RoundedCornersEffect (WRAPPER_BORDER_RADIUS, monitor_scale);
bind_property ("monitor-scale", rounded_corners_effect, "monitor-scale");
add_effect (rounded_corners_effect);

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

this.scale_factor = scale_factor;
notify["monitor-scale"].connect (reload_icon);
}

private void reload_icon () {
remove_all_children ();

var margin = Utils.scale_to_int (WindowSwitcher.WRAPPER_PADDING, monitor_scale);
var icon = new WindowIcon (window, Utils.scale_to_int (ICON_SIZE, monitor_scale)) {
margin_top = margin,
margin_right = margin,
margin_bottom = margin,
margin_left = margin
};
add_child (icon);
}
}