diff options
| author | Victor Kareh <[email protected]> | 2026-05-04 08:44:22 -0400 |
|---|---|---|
| committer | Victor Kareh <[email protected]> | 2026-05-27 16:26:58 -0400 |
| commit | b088eed936e7a9d3cb58e4657a286852883553ad (patch) | |
| tree | 286341181f5c151a2c64f9e4ad014898e4fdb41a | |
| parent | 44abf81c35f81743c72a117b28908ac72d2e78d5 (diff) | |
| download | mate-desktop-master.tar.bz2 mate-desktop-master.tar.xz | |
Expose the RandR hotplug_mode_update property on MateRROutput so
consumers can check whether an output supports dynamic mode updates on
hotplug events (e.g. virtual machine guest resizing).
| -rw-r--r-- | libmate-desktop/mate-rr-private.h | 1 | ||||
| -rw-r--r-- | libmate-desktop/mate-rr.c | 47 | ||||
| -rw-r--r-- | libmate-desktop/mate-rr.h | 1 |
3 files changed, 49 insertions, 0 deletions
diff --git a/libmate-desktop/mate-rr-private.h b/libmate-desktop/mate-rr-private.h index 553c91a..be575ed 100644 --- a/libmate-desktop/mate-rr-private.h +++ b/libmate-desktop/mate-rr-private.h @@ -47,6 +47,7 @@ struct MateRRScreenPrivate int rr_minor_version; Atom connector_type_atom; + Atom hotplug_mode_update_atom; }; struct MateRROutputInfoPrivate diff --git a/libmate-desktop/mate-rr.c b/libmate-desktop/mate-rr.c index 77aef21..5bd4998 100644 --- a/libmate-desktop/mate-rr.c +++ b/libmate-desktop/mate-rr.c @@ -90,6 +90,7 @@ struct MateRROutput guint8 * edid_data; int edid_size; char * connector_type; + gboolean hotplug_mode_update; }; struct MateRROutputWrap @@ -667,6 +668,7 @@ mate_rr_screen_initable_init (GInitable *initable, GCancellable *canc, GError ** int ignore; priv->connector_type_atom = XInternAtom (dpy, "ConnectorType", FALSE); + priv->hotplug_mode_update_atom = XInternAtom (dpy, "hotplug_mode_update", FALSE); #ifdef HAVE_RANDR if (XRRQueryExtension (dpy, &event_base, &ignore)) @@ -1243,6 +1245,31 @@ out: #endif } +static gboolean +get_hotplug_mode_update (MateRROutput *output) +{ +#ifdef HAVE_RANDR + XRRPropertyInfo *info; + GdkDisplay *display; + + display = gdk_display_get_default (); + gdk_x11_display_error_trap_push (display); + info = XRRQueryOutputProperty (DISPLAY (output), output->id, + output->info->screen->priv->hotplug_mode_update_atom); + gdk_display_flush (display); + if (gdk_x11_display_error_trap_pop (display)) + return FALSE; + + if (info) + { + XFree (info); + return TRUE; + } +#endif + + return FALSE; +} + #ifdef HAVE_RANDR static gboolean output_initialize (MateRROutput *output, XRRScreenResources *res, GError **error) @@ -1272,6 +1299,7 @@ output_initialize (MateRROutput *output, XRRScreenResources *res, GError **error output->height_mm = info->mm_height; output->connected = (info->connection == RR_Connected); output->connector_type = get_connector_type_string (output); + output->hotplug_mode_update = get_hotplug_mode_update (output); /* Possible crtcs */ a = g_ptr_array_new (); @@ -1339,6 +1367,7 @@ output_copy (const MateRROutput *from) output->connected = from->connected; output->n_preferred = from->n_preferred; output->connector_type = g_strdup (from->connector_type); + output->hotplug_mode_update = from->hotplug_mode_update; array = g_ptr_array_new (); for (p_crtc = from->possible_crtcs; *p_crtc != NULL; p_crtc++) @@ -1458,6 +1487,24 @@ mate_rr_output_get_connector_type (MateRROutput *output) return output->connector_type; } +/** + * mate_rr_output_get_hotplug_mode_update: + * @output: a #MateRROutput + * + * Returns whether the output has the hotplug_mode_update property, + * which indicates that the display should apply a new preferred mode + * on hotplug events to handle dynamic guest resizing in virtual machines. + * + * Returns: %TRUE if the output has hotplug_mode_update + */ +gboolean +mate_rr_output_get_hotplug_mode_update (MateRROutput *output) +{ + g_return_val_if_fail (output != NULL, FALSE); + + return output->hotplug_mode_update; +} + gboolean _mate_rr_output_name_is_laptop (const char *name) { diff --git a/libmate-desktop/mate-rr.h b/libmate-desktop/mate-rr.h index a1a541d..430537e 100644 --- a/libmate-desktop/mate-rr.h +++ b/libmate-desktop/mate-rr.h @@ -136,6 +136,7 @@ MateRRMode * mate_rr_output_get_current_mode (MateRROutput *output); MateRRCrtc * mate_rr_output_get_crtc (MateRROutput *output); const char * mate_rr_output_get_connector_type (MateRROutput *output); gboolean mate_rr_output_is_laptop (MateRROutput *output); +gboolean mate_rr_output_get_hotplug_mode_update (MateRROutput *output); void mate_rr_output_get_position (MateRROutput *output, int *x, int *y); |
