xrandr: Rewrite to be based on the X11 display connection

This commit is contained in:
Jasper St. Pierre 2014-04-23 09:57:16 -04:00
parent 274047c3f8
commit 6c743dad88
5 changed files with 34 additions and 55 deletions

View File

@ -49,15 +49,6 @@ typedef struct _MetaBackendPrivate MetaBackendPrivate;
G_DEFINE_ABSTRACT_TYPE_WITH_PRIVATE (MetaBackend, meta_backend, G_TYPE_OBJECT); G_DEFINE_ABSTRACT_TYPE_WITH_PRIVATE (MetaBackend, meta_backend, G_TYPE_OBJECT);
static void
meta_backend_constructed (GObject *object)
{
MetaBackend *backend = META_BACKEND (object);
MetaBackendPrivate *priv = meta_backend_get_instance_private (backend);
priv->monitor_manager = META_BACKEND_GET_CLASS (backend)->create_monitor_manager (backend);
}
static void static void
meta_backend_finalize (GObject *object) meta_backend_finalize (GObject *object)
{ {
@ -88,6 +79,7 @@ meta_backend_real_post_init (MetaBackend *backend)
MetaBackendPrivate *priv = meta_backend_get_instance_private (backend); MetaBackendPrivate *priv = meta_backend_get_instance_private (backend);
priv->cursor_renderer = meta_backend_create_cursor_renderer (backend); priv->cursor_renderer = meta_backend_create_cursor_renderer (backend);
priv->monitor_manager = META_BACKEND_GET_CLASS (backend)->create_monitor_manager (backend);
} }
static MetaCursorRenderer * static MetaCursorRenderer *
@ -101,7 +93,6 @@ meta_backend_class_init (MetaBackendClass *klass)
{ {
GObjectClass *object_class = G_OBJECT_CLASS (klass); GObjectClass *object_class = G_OBJECT_CLASS (klass);
object_class->constructed = meta_backend_constructed;
object_class->finalize = meta_backend_finalize; object_class->finalize = meta_backend_finalize;
klass->post_init = meta_backend_real_post_init; klass->post_init = meta_backend_real_post_init;

View File

@ -205,3 +205,12 @@ meta_backend_x11_init (MetaBackendX11 *x11)
/* We do X11 event retrieval ourselves */ /* We do X11 event retrieval ourselves */
clutter_x11_disable_event_retrieval (); clutter_x11_disable_event_retrieval ();
} }
Display *
meta_backend_x11_get_xdisplay (MetaBackendX11 *x11)
{
MetaBackendX11Private *priv = meta_backend_x11_get_instance_private (x11);
return priv->xdisplay;
}

View File

@ -51,7 +51,6 @@ struct _MetaBackendX11Class
GType meta_backend_x11_get_type (void) G_GNUC_CONST; GType meta_backend_x11_get_type (void) G_GNUC_CONST;
void meta_backend_x11_handle_alarm_notify (MetaBackend *backend, Display * meta_backend_x11_get_xdisplay (MetaBackendX11 *backend);
XEvent *event);
#endif /* META_BACKEND_X11_H */ #endif /* META_BACKEND_X11_H */

View File

@ -36,6 +36,7 @@
#include <X11/extensions/Xrandr.h> #include <X11/extensions/Xrandr.h>
#include <X11/extensions/dpms.h> #include <X11/extensions/dpms.h>
#include "meta-backend-x11.h"
#include <meta/main.h> #include <meta/main.h>
#include <meta/errors.h> #include <meta/errors.h>
#include "edid.h" #include "edid.h"
@ -141,16 +142,16 @@ static gboolean
output_get_presentation_xrandr (MetaMonitorManagerXrandr *manager_xrandr, output_get_presentation_xrandr (MetaMonitorManagerXrandr *manager_xrandr,
MetaOutput *output) MetaOutput *output)
{ {
MetaDisplay *display = meta_get_display ();
gboolean value; gboolean value;
Atom actual_type; Atom atom, actual_type;
int actual_format; int actual_format;
unsigned long nitems, bytes_after; unsigned long nitems, bytes_after;
unsigned char *buffer; unsigned char *buffer;
atom = XInternAtom (manager_xrandr->xdisplay, "_MUTTER_PRESENTATION_OUTPUT", False);
XRRGetOutputProperty (manager_xrandr->xdisplay, XRRGetOutputProperty (manager_xrandr->xdisplay,
(XID)output->output_id, (XID)output->output_id,
display->atom__MUTTER_PRESENTATION_OUTPUT, atom,
0, G_MAXLONG, False, False, XA_CARDINAL, 0, G_MAXLONG, False, False, XA_CARDINAL,
&actual_type, &actual_format, &actual_type, &actual_format,
&nitems, &bytes_after, &buffer); &nitems, &bytes_after, &buffer);
@ -177,16 +178,16 @@ static int
output_get_backlight_xrandr (MetaMonitorManagerXrandr *manager_xrandr, output_get_backlight_xrandr (MetaMonitorManagerXrandr *manager_xrandr,
MetaOutput *output) MetaOutput *output)
{ {
MetaDisplay *display = meta_get_display ();
gboolean value; gboolean value;
Atom actual_type; Atom atom, actual_type;
int actual_format; int actual_format;
unsigned long nitems, bytes_after; unsigned long nitems, bytes_after;
unsigned char *buffer; unsigned char *buffer;
atom = XInternAtom (manager_xrandr->xdisplay, "Backlight", False);
XRRGetOutputProperty (manager_xrandr->xdisplay, XRRGetOutputProperty (manager_xrandr->xdisplay,
(XID)output->output_id, (XID)output->output_id,
display->atom_Backlight, atom,
0, G_MAXLONG, False, False, XA_INTEGER, 0, G_MAXLONG, False, False, XA_INTEGER,
&actual_type, &actual_format, &actual_type, &actual_format,
&nitems, &bytes_after, &buffer); &nitems, &bytes_after, &buffer);
@ -205,14 +206,13 @@ static void
output_get_backlight_limits_xrandr (MetaMonitorManagerXrandr *manager_xrandr, output_get_backlight_limits_xrandr (MetaMonitorManagerXrandr *manager_xrandr,
MetaOutput *output) MetaOutput *output)
{ {
MetaDisplay *display = meta_get_display (); Atom atom;
XRRPropertyInfo *info; XRRPropertyInfo *info;
meta_error_trap_push (display); atom = XInternAtom (manager_xrandr->xdisplay, "Backlight", False);
info = XRRQueryOutputProperty (manager_xrandr->xdisplay, info = XRRQueryOutputProperty (manager_xrandr->xdisplay,
(XID)output->output_id, (XID)output->output_id,
display->atom_Backlight); atom);
meta_error_trap_pop (display);
if (info == NULL) if (info == NULL)
{ {
@ -314,14 +314,13 @@ static gboolean
output_get_hotplug_mode_update (MetaMonitorManagerXrandr *manager_xrandr, output_get_hotplug_mode_update (MetaMonitorManagerXrandr *manager_xrandr,
XID output_id) XID output_id)
{ {
MetaDisplay *display = meta_get_display (); Atom atom;
XRRPropertyInfo *info; XRRPropertyInfo *info;
gboolean result = FALSE; gboolean result = FALSE;
meta_error_trap_push (display); atom = XInternAtom (manager_xrandr->xdisplay, "hotplug_mode_update", False);
info = XRRQueryOutputProperty (manager_xrandr->xdisplay, output_id, info = XRRQueryOutputProperty (manager_xrandr->xdisplay, output_id,
display->atom_hotplug_mode_update); atom);
meta_error_trap_pop (display);
if (info) if (info)
{ {
@ -350,9 +349,7 @@ meta_monitor_manager_xrandr_read_current (MetaMonitorManager *manager)
XRRFreeScreenResources (manager_xrandr->resources); XRRFreeScreenResources (manager_xrandr->resources);
manager_xrandr->resources = NULL; manager_xrandr->resources = NULL;
meta_error_trap_push (meta_get_display ());
dpms_capable = DPMSCapable (manager_xrandr->xdisplay); dpms_capable = DPMSCapable (manager_xrandr->xdisplay);
meta_error_trap_pop (meta_get_display ());
if (dpms_capable && if (dpms_capable &&
DPMSInfo (manager_xrandr->xdisplay, &dpms_state, &dpms_enabled) && DPMSInfo (manager_xrandr->xdisplay, &dpms_state, &dpms_enabled) &&
@ -452,10 +449,8 @@ meta_monitor_manager_xrandr_read_current (MetaMonitorManager *manager)
XRRFreeCrtcInfo (crtc); XRRFreeCrtcInfo (crtc);
} }
meta_error_trap_push (meta_get_display ());
primary_output = XRRGetOutputPrimary (manager_xrandr->xdisplay, primary_output = XRRGetOutputPrimary (manager_xrandr->xdisplay,
DefaultRootWindow (manager_xrandr->xdisplay)); DefaultRootWindow (manager_xrandr->xdisplay));
meta_error_trap_pop (meta_get_display ());
n_actual_outputs = 0; n_actual_outputs = 0;
for (i = 0; i < (unsigned)resources->noutput; i++) for (i = 0; i < (unsigned)resources->noutput; i++)
@ -637,10 +632,8 @@ meta_monitor_manager_xrandr_set_power_save_mode (MetaMonitorManager *manager,
return; return;
} }
meta_error_trap_push (meta_get_display ());
DPMSForceLevel (manager_xrandr->xdisplay, state); DPMSForceLevel (manager_xrandr->xdisplay, state);
DPMSSetTimeouts (manager_xrandr->xdisplay, 0, 0, 0); DPMSSetTimeouts (manager_xrandr->xdisplay, 0, 0, 0);
meta_error_trap_pop (meta_get_display ());
} }
static Rotation static Rotation
@ -674,16 +667,15 @@ output_set_presentation_xrandr (MetaMonitorManagerXrandr *manager_xrandr,
MetaOutput *output, MetaOutput *output,
gboolean presentation) gboolean presentation)
{ {
MetaDisplay *display = meta_get_display (); Atom atom;
int value = presentation; int value = presentation;
meta_error_trap_push (display); atom = XInternAtom (manager_xrandr->xdisplay, "_MUTTER_PRESENTATION_OUTPUT", False);
XRRChangeOutputProperty (manager_xrandr->xdisplay, XRRChangeOutputProperty (manager_xrandr->xdisplay,
(XID)output->output_id, (XID)output->output_id,
display->atom__MUTTER_PRESENTATION_OUTPUT, atom,
XA_CARDINAL, 32, PropModeReplace, XA_CARDINAL, 32, PropModeReplace,
(unsigned char*) &value, 1); (unsigned char*) &value, 1);
meta_error_trap_pop (display);
} }
static void static void
@ -694,11 +686,10 @@ meta_monitor_manager_xrandr_apply_configuration (MetaMonitorManager *manager,
unsigned int n_outputs) unsigned int n_outputs)
{ {
MetaMonitorManagerXrandr *manager_xrandr = META_MONITOR_MANAGER_XRANDR (manager); MetaMonitorManagerXrandr *manager_xrandr = META_MONITOR_MANAGER_XRANDR (manager);
MetaDisplay *display = meta_get_display ();
unsigned i; unsigned i;
int width, height, width_mm, height_mm; int width, height, width_mm, height_mm;
meta_display_grab (display); XGrabServer (manager_xrandr->xdisplay);
/* First compute the new size of the screen (framebuffer) */ /* First compute the new size of the screen (framebuffer) */
width = 0; height = 0; width = 0; height = 0;
@ -792,10 +783,8 @@ meta_monitor_manager_xrandr_apply_configuration (MetaMonitorManager *manager,
*/ */
width_mm = (width / DPI_FALLBACK) * 25.4 + 0.5; width_mm = (width / DPI_FALLBACK) * 25.4 + 0.5;
height_mm = (height / DPI_FALLBACK) * 25.4 + 0.5; height_mm = (height / DPI_FALLBACK) * 25.4 + 0.5;
meta_error_trap_push (display);
XRRSetScreenSize (manager_xrandr->xdisplay, DefaultRootWindow (manager_xrandr->xdisplay), XRRSetScreenSize (manager_xrandr->xdisplay, DefaultRootWindow (manager_xrandr->xdisplay),
width, height, width_mm, height_mm); width, height, width_mm, height_mm);
meta_error_trap_pop (display);
for (i = 0; i < n_crtcs; i++) for (i = 0; i < n_crtcs; i++)
{ {
@ -852,7 +841,6 @@ meta_monitor_manager_xrandr_apply_configuration (MetaMonitorManager *manager,
goto next; goto next;
} }
meta_error_trap_push (display);
ok = XRRSetCrtcConfig (manager_xrandr->xdisplay, ok = XRRSetCrtcConfig (manager_xrandr->xdisplay,
manager_xrandr->resources, manager_xrandr->resources,
(XID)crtc->crtc_id, (XID)crtc->crtc_id,
@ -861,7 +849,6 @@ meta_monitor_manager_xrandr_apply_configuration (MetaMonitorManager *manager,
(XID)mode->mode_id, (XID)mode->mode_id,
wl_transform_to_xrandr (crtc_info->transform), wl_transform_to_xrandr (crtc_info->transform),
outputs, n_outputs); outputs, n_outputs);
meta_error_trap_pop (display);
if (ok != Success) if (ok != Success)
{ {
@ -902,11 +889,9 @@ meta_monitor_manager_xrandr_apply_configuration (MetaMonitorManager *manager,
if (output_info->is_primary) if (output_info->is_primary)
{ {
meta_error_trap_push (display);
XRRSetOutputPrimary (manager_xrandr->xdisplay, XRRSetOutputPrimary (manager_xrandr->xdisplay,
DefaultRootWindow (manager_xrandr->xdisplay), DefaultRootWindow (manager_xrandr->xdisplay),
(XID)output_info->output->output_id); (XID)output_info->output->output_id);
meta_error_trap_pop (display);
} }
output_set_presentation_xrandr (manager_xrandr, output_set_presentation_xrandr (manager_xrandr,
@ -932,7 +917,7 @@ meta_monitor_manager_xrandr_apply_configuration (MetaMonitorManager *manager,
output->is_primary = FALSE; output->is_primary = FALSE;
} }
meta_display_ungrab (display); XUngrabServer (manager_xrandr->xdisplay);
} }
static void static void
@ -941,18 +926,17 @@ meta_monitor_manager_xrandr_change_backlight (MetaMonitorManager *manager,
gint value) gint value)
{ {
MetaMonitorManagerXrandr *manager_xrandr = META_MONITOR_MANAGER_XRANDR (manager); MetaMonitorManagerXrandr *manager_xrandr = META_MONITOR_MANAGER_XRANDR (manager);
MetaDisplay *display = meta_get_display (); Atom atom;
int hw_value; int hw_value;
hw_value = round ((double)value / 100.0 * output->backlight_max + output->backlight_min); hw_value = round ((double)value / 100.0 * output->backlight_max + output->backlight_min);
meta_error_trap_push (display); atom = XInternAtom (manager_xrandr->xdisplay, "Backlight", False);
XRRChangeOutputProperty (manager_xrandr->xdisplay, XRRChangeOutputProperty (manager_xrandr->xdisplay,
(XID)output->output_id, (XID)output->output_id,
display->atom_Backlight, atom,
XA_INTEGER, 32, PropModeReplace, XA_INTEGER, 32, PropModeReplace,
(unsigned char *) &hw_value, 1); (unsigned char *) &hw_value, 1);
meta_error_trap_pop (display);
/* We're not selecting for property notifies, so update the value immediately */ /* We're not selecting for property notifies, so update the value immediately */
output->backlight = normalize_backlight (output, hw_value); output->backlight = normalize_backlight (output, hw_value);
@ -1079,9 +1063,9 @@ meta_monitor_manager_xrandr_handle_xevent (MetaMonitorManager *manager,
static void static void
meta_monitor_manager_xrandr_init (MetaMonitorManagerXrandr *manager_xrandr) meta_monitor_manager_xrandr_init (MetaMonitorManagerXrandr *manager_xrandr)
{ {
MetaDisplay *display = meta_get_display (); MetaBackendX11 *backend = META_BACKEND_X11 (meta_get_backend ());
manager_xrandr->xdisplay = display->xdisplay; manager_xrandr->xdisplay = meta_backend_x11_get_xdisplay (backend);
if (!XRRQueryExtension (manager_xrandr->xdisplay, if (!XRRQueryExtension (manager_xrandr->xdisplay,
&manager_xrandr->rr_event_base, &manager_xrandr->rr_event_base,
@ -1130,4 +1114,3 @@ meta_monitor_manager_xrandr_class_init (MetaMonitorManagerXrandrClass *klass)
manager_class->set_crtc_gamma = meta_monitor_manager_xrandr_set_crtc_gamma; manager_class->set_crtc_gamma = meta_monitor_manager_xrandr_set_crtc_gamma;
manager_class->handle_xevent = meta_monitor_manager_xrandr_handle_xevent; manager_class->handle_xevent = meta_monitor_manager_xrandr_handle_xevent;
} }

View File

@ -70,7 +70,6 @@ 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)
@ -78,9 +77,7 @@ item(MULTIPLE)
item(TIMESTAMP) item(TIMESTAMP)
item(VERSION) item(VERSION)
item(ATOM_PAIR) item(ATOM_PAIR)
item(Backlight)
item(_XKB_RULES_NAMES) item(_XKB_RULES_NAMES)
item(hotplug_mode_update)
item(WL_SURFACE_ID) item(WL_SURFACE_ID)
/* Oddities: These are used, and we need atoms for them, /* Oddities: These are used, and we need atoms for them,