diff options
author | Giovanni Campagna <gcampagn@redhat.com> | 2013-07-25 11:16:51 +0200 |
---|---|---|
committer | Giovanni Campagna <gcampagna@src.gnome.org> | 2013-08-18 00:34:16 +0200 |
commit | 5c27a91684411c4a878f73584fdce29e438f8df4 (patch) | |
tree | bc1b86d0b849550e12fa3831b3b64b7b8ff48f8b | |
parent | 764c472edbc3d8bb727f7a15a6f335f6f0f62b89 (diff) | |
download | mutter-5c27a91684411c4a878f73584fdce29e438f8df4.tar.gz |
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.
https://bugzilla.gnome.org/show_bug.cgi?id=705670
-rw-r--r-- | src/core/monitor.c | 52 | ||||
-rw-r--r-- | 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 d101e779e..16b982946 100644 --- a/src/core/monitor.c +++ b/src/core/monitor.c @@ -33,6 +33,7 @@ #include <clutter/clutter.h> #ifdef HAVE_RANDR +#include <X11/Xatom.h> #include <X11/extensions/Xrandr.h> #include <X11/extensions/dpms.h> #endif @@ -339,6 +340,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) @@ -540,7 +569,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++; } @@ -1164,7 +1193,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, @@ -1237,6 +1281,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) |