From b383d55988ba6e1ec9a20406dad13bd57048052e Mon Sep 17 00:00:00 2001 From: Giovanni Campagna Date: Thu, 25 Jul 2013 11:16:51 +0200 Subject: [PATCH] MonitorManager: store the presentation mode bit in XRandR Use a private output property to store if the output is in presentation mode or not, so that this information is not lost after the configuration read back from the server. --- src/core/monitor.c | 52 ++++++++++++++++++++++++++++++++++++++++++-- src/meta/atomnames.h | 1 + 2 files changed, 51 insertions(+), 2 deletions(-) diff --git a/src/core/monitor.c b/src/core/monitor.c index 54112bd7f..1ae430bf1 100644 --- a/src/core/monitor.c +++ b/src/core/monitor.c @@ -32,6 +32,7 @@ #include #ifdef HAVE_RANDR +#include #include #include #endif @@ -341,6 +342,34 @@ wl_transform_from_xrandr_all (Rotation rotation) return ret; } +static gboolean +output_get_presentation_xrandr (MetaMonitorManager *manager, + MetaOutput *output) +{ + MetaDisplay *display = meta_get_display (); + gboolean value; + Atom actual_type; + int actual_format; + unsigned long nitems, bytes_after; + unsigned char *buffer; + + XRRGetOutputProperty (manager->xdisplay, + (XID)output->output_id, + display->atom__MUTTER_PRESENTATION_OUTPUT, + 0, G_MAXLONG, False, False, XA_CARDINAL, + &actual_type, &actual_format, + &nitems, &bytes_after, &buffer); + + if (actual_type != XA_CARDINAL || actual_format != 32 || + nitems < 1) + return FALSE; + + value = ((int*)buffer)[0]; + + XFree (buffer); + return value; +} + static int compare_outputs (const void *one, const void *two) @@ -541,7 +570,7 @@ read_monitor_infos_from_xrandr (MetaMonitorManager *manager) } meta_output->is_primary = ((XID)meta_output->output_id == primary_output); - meta_output->is_presentation = FALSE; + meta_output->is_presentation = output_get_presentation_xrandr (manager, meta_output); n_actual_outputs++; } @@ -1177,7 +1206,22 @@ wl_transform_to_xrandr (enum wl_output_transform transform) g_assert_not_reached (); } - + +static void +output_set_presentation_xrandr (MetaMonitorManager *manager, + MetaOutput *output, + gboolean presentation) +{ + MetaDisplay *display = meta_get_display (); + int value = presentation; + + XRRChangeOutputProperty (manager->xdisplay, + (XID)output->output_id, + display->atom__MUTTER_PRESENTATION_OUTPUT, + XA_CARDINAL, 32, PropModeReplace, + (unsigned char*) &value, 1); +} + static void apply_config_xrandr (MetaMonitorManager *manager, MetaCRTCInfo **crtcs, @@ -1250,6 +1294,10 @@ apply_config_xrandr (MetaMonitorManager *manager, DefaultRootWindow (manager->xdisplay), (XID)output_info->output->output_id); } + + output_set_presentation_xrandr (manager, + output_info->output, + output_info->is_presentation); } /* Disable CRTCs not mentioned in the list */ diff --git a/src/meta/atomnames.h b/src/meta/atomnames.h index 064679914..8abcc60dc 100644 --- a/src/meta/atomnames.h +++ b/src/meta/atomnames.h @@ -72,6 +72,7 @@ item(_MUTTER_TIMESTAMP_PING) item(_MUTTER_FOCUS_SET) item(_MUTTER_SENTINEL) item(_MUTTER_VERSION) +item(_MUTTER_PRESENTATION_OUTPUT) item(WM_CLIENT_MACHINE) item(MANAGER) item(TARGETS)