71
71
#include "wayland/meta-xwayland-private.h"
72
72
#endif
73
73
74
- G_DEFINE_TYPE ( MetaX11Display , meta_x11_display , G_TYPE_OBJECT )
74
+ #include "meta-dbus-x11.h"
75
75
76
76
static GQuark quark_x11_display_logical_monitor_data = 0 ;
77
77
@@ -80,6 +80,14 @@ typedef struct _MetaX11DisplayLogicalMonitorData
80
80
int xinerama_index ;
81
81
} MetaX11DisplayLogicalMonitorData ;
82
82
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
+
83
91
static char * get_screen_name (Display * xdisplay ,
84
92
int number );
85
93
@@ -92,6 +100,15 @@ static void unset_wm_check_hint (MetaX11Display *x11_display);
92
100
static void prefs_changed_callback (MetaPreference pref ,
93
101
void * data );
94
102
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
+
95
112
static void
96
113
meta_x11_display_unmanage_windows (MetaX11Display * x11_display )
97
114
{
@@ -113,13 +130,68 @@ meta_x11_display_unmanage_windows (MetaX11Display *x11_display)
113
130
g_list_free_full (windows , g_object_unref );
114
131
}
115
132
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
+
116
183
static void
117
184
meta_x11_display_dispose (GObject * object )
118
185
{
119
186
MetaX11Display * x11_display = META_X11_DISPLAY (object );
187
+ MetaX11DisplayPrivate * priv =
188
+ meta_x11_display_get_instance_private (x11_display );
120
189
121
190
x11_display -> closing = TRUE;
122
191
192
+ g_clear_handle_id (& priv -> dbus_name_id , g_bus_unown_name );
193
+ g_clear_object (& priv -> dbus_api );
194
+
123
195
g_clear_pointer (& x11_display -> alarm_filters , g_ptr_array_unref );
124
196
125
197
if (x11_display -> empty_region != None )
@@ -1112,6 +1184,23 @@ on_window_visibility_updated (MetaDisplay *display,
1112
1184
meta_x11_display_increment_focus_sentinel (x11_display );
1113
1185
}
1114
1186
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
+
1115
1204
/**
1116
1205
* meta_x11_display_new:
1117
1206
*
@@ -1144,7 +1233,7 @@ meta_x11_display_new (MetaDisplay *display,
1144
1233
MetaBackend * backend = meta_get_backend ();
1145
1234
MetaMonitorManager * monitor_manager =
1146
1235
meta_backend_get_monitor_manager (backend );
1147
-
1236
+ MetaSettings * settings = meta_backend_get_settings ( backend );
1148
1237
/* A list of all atom names, so that we can intern them in one go. */
1149
1238
const char * atom_names [] = {
1150
1239
#define item (x ) #x ,
@@ -1213,6 +1302,7 @@ meta_x11_display_new (MetaDisplay *display,
1213
1302
x11_display = g_object_new (META_TYPE_X11_DISPLAY , NULL );
1214
1303
x11_display -> gdk_display = gdk_display ;
1215
1304
x11_display -> display = display ;
1305
+ initialize_dbus_interface (x11_display );
1216
1306
1217
1307
/* here we use XDisplayName which is what the user
1218
1308
* probably put in, vs. DisplayString(display) which is
@@ -1282,7 +1372,7 @@ meta_x11_display_new (MetaDisplay *display,
1282
1372
"monitors-changed-internal" ,
1283
1373
G_CALLBACK (on_monitors_changed_internal ),
1284
1374
x11_display ,
1285
- 0 );
1375
+ G_CONNECT_AFTER );
1286
1376
1287
1377
init_leader_window (x11_display , & timestamp );
1288
1378
x11_display -> timestamp = timestamp ;
@@ -1814,6 +1904,8 @@ on_monitors_changed_internal (MetaMonitorManager *monitor_manager,
1814
1904
}
1815
1905
1816
1906
x11_display -> has_xinerama_indices = FALSE;
1907
+
1908
+ update_ui_scaling_factor (x11_display );
1817
1909
}
1818
1910
1819
1911
void
0 commit comments