@@ -32,13 +32,22 @@ public class Gala.BlurManager : Object {
3232
3333 public WindowManagerGala wm { get ; construct; }
3434
35+ private bool framebuffer_is_logical = false ;
3536 private GLib . HashTable<Meta . Window , BlurData ? > blurred_windows = new GLib .HashTable<Meta . Window , BlurData ?> (null , null );
3637
3738 private BlurManager (WindowManagerGala wm ) {
3839 Object (wm: wm);
3940 }
4041
4142 construct {
43+ var experimental_features = new Settings (" org.gnome.mutter" ). get_strv (" experimental-features" );
44+ for (var i = 0 ; i < experimental_features. length; i++ ) {
45+ if (experimental_features[i] == " scale-monitor-framebuffer" ) {
46+ framebuffer_is_logical = true ;
47+ break ;
48+ }
49+ }
50+
4251 wm. get_display (). window_created. connect ((window) = > {
4352 window. notify[" mutter-hints" ]. connect ((obj, pspec) = > parse_mutter_hints ((Meta . Window ) obj));
4453 parse_mutter_hints (window);
@@ -74,8 +83,17 @@ public class Gala.BlurManager : Object {
7483 var x_shadow_size = frame_rect. x - buffer_rect. x;
7584 var y_shadow_size = frame_rect. y - buffer_rect. y;
7685
77- blur_data. actor. set_position (x_shadow_size + left, y_shadow_size + top);
78- blur_data. actor. set_size (frame_rect. width - left - right, frame_rect. height - top - bottom);
86+ var monitor_scale = framebuffer_is_logical ? 1.0f : window. display. get_monitor_scale (window. get_monitor ());
87+ var inverse_monitor_scale = 1.0f / monitor_scale;
88+
89+ blur_data. actor. set_position (
90+ Utils . scale_to_int (x_shadow_size, inverse_monitor_scale) + left,
91+ Utils . scale_to_int (y_shadow_size, inverse_monitor_scale) + top
92+ );
93+ blur_data. actor. set_size (
94+ Utils . scale_to_int (frame_rect. width, inverse_monitor_scale) - left - right,
95+ Utils . scale_to_int (frame_rect. height, inverse_monitor_scale) - top - bottom
96+ );
7997 }
8098
8199 public void remove_blur (Meta .Window window ) {
0 commit comments