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
This commit is contained in:
Giovanni Campagna 2013-07-25 11:16:51 +02:00 committed by Giovanni Campagna
parent 764c472edb
commit 5c27a91684
2 changed files with 51 additions and 2 deletions

View File

@ -33,6 +33,7 @@
#include <clutter/clutter.h> #include <clutter/clutter.h>
#ifdef HAVE_RANDR #ifdef HAVE_RANDR
#include <X11/Xatom.h>
#include <X11/extensions/Xrandr.h> #include <X11/extensions/Xrandr.h>
#include <X11/extensions/dpms.h> #include <X11/extensions/dpms.h>
#endif #endif
@ -339,6 +340,34 @@ wl_transform_from_xrandr_all (Rotation rotation)
return ret; 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 static int
compare_outputs (const void *one, compare_outputs (const void *one,
const void *two) 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_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++; n_actual_outputs++;
} }
@ -1165,6 +1194,21 @@ wl_transform_to_xrandr (enum wl_output_transform transform)
g_assert_not_reached (); 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 static void
apply_config_xrandr (MetaMonitorManager *manager, apply_config_xrandr (MetaMonitorManager *manager,
MetaCRTCInfo **crtcs, MetaCRTCInfo **crtcs,
@ -1237,6 +1281,10 @@ apply_config_xrandr (MetaMonitorManager *manager,
DefaultRootWindow (manager->xdisplay), DefaultRootWindow (manager->xdisplay),
(XID)output_info->output->output_id); (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 */ /* Disable CRTCs not mentioned in the list */

View File

@ -72,6 +72,7 @@ item(_MUTTER_TIMESTAMP_PING)
item(_MUTTER_FOCUS_SET) item(_MUTTER_FOCUS_SET)
item(_MUTTER_SENTINEL) item(_MUTTER_SENTINEL)
item(_MUTTER_VERSION) item(_MUTTER_VERSION)
item(_MUTTER_PRESENTATION_OUTPUT)
item(WM_CLIENT_MACHINE) item(WM_CLIENT_MACHINE)
item(MANAGER) item(MANAGER)
item(TARGETS) item(TARGETS)