summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGiovanni Campagna <gcampagn@redhat.com>2013-07-25 11:16:51 +0200
committerGiovanni Campagna <gcampagna@src.gnome.org>2013-08-17 16:56:58 +0200
commitc74d40ac41c5bb73c5fd830ae404541d32f75d2c (patch)
tree311f1474e2c076470ac135280c488ed0be96ae15
parentc21f7d43bd9a95990b14608e0e6a3be99ca9fcd6 (diff)
downloadmutter-c74d40ac41c5bb73c5fd830ae404541d32f75d2c.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.c52
-rw-r--r--src/meta/atomnames.h1
2 files changed, 51 insertions, 2 deletions
diff --git a/src/core/monitor.c b/src/core/monitor.c
index d8072956d..407f2b39f 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)