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.
This commit is contained in:
Giovanni Campagna 2013-07-25 11:16:51 +02:00
parent 25f82424b8
commit b383d55988
2 changed files with 51 additions and 2 deletions

View File

@ -32,6 +32,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
@ -341,6 +342,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)
@ -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_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++;
} }
@ -1177,7 +1206,22 @@ 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,
@ -1250,6 +1294,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)