Skip to content

Commit 263b41a

Browse files
authored
Merge pull request #33 from BuddiesOfBudgie/scaling
GNOME 47 Scaling
2 parents 022fb54 + 675bd38 commit 263b41a

File tree

3 files changed

+110
-3
lines changed

3 files changed

+110
-3
lines changed
Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
<!DOCTYPE node PUBLIC
2+
'-//freedesktop//DTD D-BUS Object Introspection 1.0//EN'
3+
'http://www.freedesktop.org/standards/dbus/1.0/introspect.dtd'>
4+
<node>
5+
<interface name="org.gnome.Mutter.X11">
6+
<property name="UiScalingFactor" type="i" access="readwrite" />
7+
</interface>
8+
</node>

src/meson.build

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -875,6 +875,13 @@ dbus_input_mapping_built_sources = gnome.gdbus_codegen('meta-dbus-input-mapping'
875875
)
876876
mutter_built_sources += dbus_input_mapping_built_sources
877877

878+
dbus_x11_built_sources = gnome.gdbus_codegen('meta-dbus-x11',
879+
join_paths(dbus_interfaces_dir, 'org.gnome.Mutter.X11.xml'),
880+
interface_prefix: 'org.gnome.Mutter.',
881+
namespace: 'MetaDBus',
882+
)
883+
mutter_built_sources += dbus_x11_built_sources
884+
878885
if have_profiler
879886
mutter_sources += [
880887
'core/meta-profiler.c',

src/x11/meta-x11-display.c

Lines changed: 95 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -71,7 +71,7 @@
7171
#include "wayland/meta-xwayland-private.h"
7272
#endif
7373

74-
G_DEFINE_TYPE (MetaX11Display, meta_x11_display, G_TYPE_OBJECT)
74+
#include "meta-dbus-x11.h"
7575

7676
static GQuark quark_x11_display_logical_monitor_data = 0;
7777

@@ -80,6 +80,14 @@ typedef struct _MetaX11DisplayLogicalMonitorData
8080
int xinerama_index;
8181
} MetaX11DisplayLogicalMonitorData;
8282

83+
typedef struct _MetaX11DisplayPrivate
84+
{
85+
MetaDBusX11 *dbus_api;
86+
guint dbus_name_id;
87+
} MetaX11DisplayPrivate;
88+
89+
G_DEFINE_TYPE_WITH_PRIVATE (MetaX11Display, meta_x11_display, G_TYPE_OBJECT)
90+
8391
static char *get_screen_name (Display *xdisplay,
8492
int number);
8593

@@ -92,6 +100,15 @@ static void unset_wm_check_hint (MetaX11Display *x11_display);
92100
static void prefs_changed_callback (MetaPreference pref,
93101
void *data);
94102

103+
static MetaBackend *
104+
backend_from_x11_display (MetaX11Display *x11_display)
105+
{
106+
MetaDisplay *display = meta_x11_display_get_display (x11_display);
107+
MetaContext *context = meta_display_get_context (display);
108+
109+
return meta_context_get_backend (context);
110+
}
111+
95112
static void
96113
meta_x11_display_unmanage_windows (MetaX11Display *x11_display)
97114
{
@@ -113,13 +130,68 @@ meta_x11_display_unmanage_windows (MetaX11Display *x11_display)
113130
g_list_free_full (windows, g_object_unref);
114131
}
115132

133+
static void
134+
on_bus_acquired (GDBusConnection *connection,
135+
const char *name,
136+
gpointer user_data)
137+
{
138+
MetaX11Display *x11_display = user_data;
139+
MetaX11DisplayPrivate *priv =
140+
meta_x11_display_get_instance_private (x11_display);
141+
142+
g_dbus_interface_skeleton_export (G_DBUS_INTERFACE_SKELETON (priv->dbus_api),
143+
connection,
144+
"/org/gnome/Mutter/X11",
145+
NULL);
146+
}
147+
148+
static void
149+
update_ui_scaling_factor (MetaX11Display *x11_display)
150+
{
151+
MetaX11DisplayPrivate *priv =
152+
meta_x11_display_get_instance_private (x11_display);
153+
MetaBackend *backend = backend_from_x11_display (x11_display);
154+
MetaContext *context = meta_backend_get_context (backend);
155+
int ui_scaling_factor = 1;
156+
157+
switch (meta_context_get_compositor_type (context))
158+
{
159+
case META_COMPOSITOR_TYPE_WAYLAND:
160+
{
161+
#ifdef HAVE_XWAYLAND
162+
MetaWaylandCompositor *wayland_compositor =
163+
meta_context_get_wayland_compositor (context);
164+
MetaXWaylandManager *xwayland_manager =
165+
&wayland_compositor->xwayland_manager;
166+
167+
ui_scaling_factor = meta_xwayland_get_effective_scale (xwayland_manager);
168+
#endif
169+
break;
170+
}
171+
case META_COMPOSITOR_TYPE_X11:
172+
{
173+
MetaSettings *settings = meta_backend_get_settings (backend);
174+
175+
ui_scaling_factor = meta_settings_get_ui_scaling_factor (settings);
176+
break;
177+
}
178+
}
179+
180+
meta_dbus_x11_set_ui_scaling_factor (priv->dbus_api, ui_scaling_factor);
181+
}
182+
116183
static void
117184
meta_x11_display_dispose (GObject *object)
118185
{
119186
MetaX11Display *x11_display = META_X11_DISPLAY (object);
187+
MetaX11DisplayPrivate *priv =
188+
meta_x11_display_get_instance_private (x11_display);
120189

121190
x11_display->closing = TRUE;
122191

192+
g_clear_handle_id (&priv->dbus_name_id, g_bus_unown_name);
193+
g_clear_object (&priv->dbus_api);
194+
123195
g_clear_pointer (&x11_display->alarm_filters, g_ptr_array_unref);
124196

125197
if (x11_display->empty_region != None)
@@ -1112,6 +1184,23 @@ on_window_visibility_updated (MetaDisplay *display,
11121184
meta_x11_display_increment_focus_sentinel (x11_display);
11131185
}
11141186

1187+
static void
1188+
initialize_dbus_interface (MetaX11Display *x11_display)
1189+
{
1190+
MetaX11DisplayPrivate *priv =
1191+
meta_x11_display_get_instance_private (x11_display);
1192+
1193+
priv->dbus_api = meta_dbus_x11_skeleton_new ();
1194+
priv->dbus_name_id =
1195+
g_bus_own_name (G_BUS_TYPE_SESSION,
1196+
"org.gnome.Mutter.X11",
1197+
G_BUS_NAME_OWNER_FLAGS_NONE,
1198+
on_bus_acquired,
1199+
NULL, NULL,
1200+
x11_display, NULL);
1201+
update_ui_scaling_factor (x11_display);
1202+
}
1203+
11151204
/**
11161205
* meta_x11_display_new:
11171206
*
@@ -1144,7 +1233,7 @@ meta_x11_display_new (MetaDisplay *display,
11441233
MetaBackend *backend = meta_get_backend ();
11451234
MetaMonitorManager *monitor_manager =
11461235
meta_backend_get_monitor_manager (backend);
1147-
1236+
MetaSettings *settings = meta_backend_get_settings (backend);
11481237
/* A list of all atom names, so that we can intern them in one go. */
11491238
const char *atom_names[] = {
11501239
#define item(x) #x,
@@ -1213,6 +1302,7 @@ meta_x11_display_new (MetaDisplay *display,
12131302
x11_display = g_object_new (META_TYPE_X11_DISPLAY, NULL);
12141303
x11_display->gdk_display = gdk_display;
12151304
x11_display->display = display;
1305+
initialize_dbus_interface (x11_display);
12161306

12171307
/* here we use XDisplayName which is what the user
12181308
* probably put in, vs. DisplayString(display) which is
@@ -1282,7 +1372,7 @@ meta_x11_display_new (MetaDisplay *display,
12821372
"monitors-changed-internal",
12831373
G_CALLBACK (on_monitors_changed_internal),
12841374
x11_display,
1285-
0);
1375+
G_CONNECT_AFTER);
12861376

12871377
init_leader_window (x11_display, &timestamp);
12881378
x11_display->timestamp = timestamp;
@@ -1814,6 +1904,8 @@ on_monitors_changed_internal (MetaMonitorManager *monitor_manager,
18141904
}
18151905

18161906
x11_display->has_xinerama_indices = FALSE;
1907+
1908+
update_ui_scaling_factor (x11_display);
18171909
}
18181910

18191911
void

0 commit comments

Comments
 (0)