diff options
Diffstat (limited to 'libmate-desktop/mate-rr.c')
-rw-r--r-- | libmate-desktop/mate-rr.c | 221 |
1 files changed, 126 insertions, 95 deletions
diff --git a/libmate-desktop/mate-rr.c b/libmate-desktop/mate-rr.c index e5a242a..e49707b 100644 --- a/libmate-desktop/mate-rr.c +++ b/libmate-desktop/mate-rr.c @@ -39,6 +39,7 @@ #undef MATE_DISABLE_DEPRECATED #include "mate-rr.h" +#include "mate-rr-config.h" #include "private.h" #include "mate-rr-private.h" @@ -162,6 +163,7 @@ static void mode_free (MateRRMode *mode); static void mate_rr_screen_finalize (GObject*); static void mate_rr_screen_set_property (GObject*, guint, const GValue*, GParamSpec*); +static void mate_rr_screen_get_property (GObject*, guint, GValue*, GParamSpec*); static gboolean mate_rr_screen_initable_init (GInitable*, GCancellable*, GError**); static void mate_rr_screen_initable_iface_init (GInitableIface *iface); G_DEFINE_TYPE_WITH_CODE (MateRRScreen, mate_rr_screen, G_TYPE_OBJECT, @@ -435,9 +437,12 @@ fill_out_screen_info (Display *xdisplay, { #ifdef HAVE_RANDR XRRScreenResources *resources; + MateRRScreenPrivate *priv; - g_return_val_if_fail (xdisplay != NULL, FALSE); - g_return_val_if_fail (info != NULL, FALSE); + g_assert (xdisplay != NULL); + g_assert (info != NULL); + + priv = info->screen->priv; /* First update the screen resources */ @@ -451,7 +456,7 @@ fill_out_screen_info (Display *xdisplay, */ #if (RANDR_MAJOR > 1 || (RANDR_MAJOR == 1 && RANDR_MINOR >= 3)) /* Runtime check for RandR 1.3 or higher */ - if (info->screen->priv->rr_major_version == 1 && info->screen->priv->rr_minor_version >= 3) + if (priv->rr_major_version == 1 && priv->rr_minor_version >= 3) resources = XRRGetScreenResourcesCurrent (xdisplay, xroot); else resources = XRRGetScreenResources (xdisplay, xroot); @@ -511,7 +516,7 @@ fill_out_screen_info (Display *xdisplay, info->primary = None; #if (RANDR_MAJOR > 1 || (RANDR_MAJOR == 1 && RANDR_MINOR >= 3)) /* Runtime check for RandR 1.3 or higher */ - if (info->screen->priv->rr_major_version == 1 && info->screen->priv->rr_minor_version >= 3) { + if (priv->rr_major_version == 1 && priv->rr_minor_version >= 3) { gdk_error_trap_push (); info->primary = XRRGetOutputPrimary (xdisplay, xroot); #if GTK_CHECK_VERSION (3, 0, 0) @@ -533,15 +538,18 @@ static ScreenInfo * screen_info_new (MateRRScreen *screen, gboolean needs_reprobe, GError **error) { ScreenInfo *info = g_new0 (ScreenInfo, 1); - + MateRRScreenPrivate *priv; + g_assert (screen != NULL); - + + priv = screen->priv; + info->outputs = NULL; info->crtcs = NULL; info->modes = NULL; info->screen = screen; - if (fill_out_screen_info (screen->priv->xdisplay, screen->priv->xroot, info, needs_reprobe, error)) + if (fill_out_screen_info (priv->xdisplay, priv->xroot, info, needs_reprobe, error)) { return info; } @@ -586,13 +594,14 @@ screen_on_event (GdkXEvent *xevent, { #ifdef HAVE_RANDR MateRRScreen *screen = data; + MateRRScreenPrivate *priv = screen->priv; XEvent *e = xevent; int event_num; if (!e) return GDK_FILTER_CONTINUE; - event_num = e->type - screen->priv->randr_event_base; + event_num = e->type - priv->randr_event_base; if (event_num == RRScreenChangeNotify) { /* We don't reprobe the hardware; we just fetch the X server's latest @@ -624,8 +633,8 @@ screen_on_event (GdkXEvent *xevent, (guint32) rr_event->timestamp, (guint32) rr_event->config_timestamp, rr_event->serial, - (guint32) screen->priv->info->resources->timestamp, - (guint32) screen->priv->info->resources->configTimestamp); + (guint32) priv->info->resources->timestamp, + (guint32) priv->info->resources->configTimestamp); g_signal_connect (dialog, "response", G_CALLBACK (gtk_widget_destroy), NULL); gtk_widget_show (dialog); @@ -680,37 +689,38 @@ mate_rr_screen_initable_init (GInitable *initable, GCancellable *canc, GError ** { MateRRScreen *self = MATE_RR_SCREEN (initable); + MateRRScreenPrivate *priv = self->priv; Display *dpy = GDK_SCREEN_XDISPLAY (self->priv->gdk_screen); int event_base; int ignore; - self->priv->connector_type_atom = XInternAtom (dpy, "ConnectorType", FALSE); + priv->connector_type_atom = XInternAtom (dpy, "ConnectorType", FALSE); #ifdef HAVE_RANDR if (XRRQueryExtension (dpy, &event_base, &ignore)) { - self->priv->randr_event_base = event_base; + priv->randr_event_base = event_base; - XRRQueryVersion (dpy, &self->priv->rr_major_version, &self->priv->rr_minor_version); - if (self->priv->rr_major_version > 1 || (self->priv->rr_major_version == 1 && self->priv->rr_minor_version < 2)) { + XRRQueryVersion (dpy, &priv->rr_major_version, &priv->rr_minor_version); + if (priv->rr_major_version > 1 || (priv->rr_major_version == 1 && priv->rr_minor_version < 2)) { g_set_error (error, MATE_RR_ERROR, MATE_RR_ERROR_NO_RANDR_EXTENSION, "RANDR extension is too old (must be at least 1.2)"); return FALSE; } - self->priv->info = screen_info_new (self, TRUE, error); + priv->info = screen_info_new (self, TRUE, error); - if (!self->priv->info) { + if (!priv->info) { return FALSE; } - XRRSelectInput (self->priv->xdisplay, - self->priv->xroot, + XRRSelectInput (priv->xdisplay, + priv->xroot, RRScreenChangeNotifyMask); - gdk_x11_register_standard_event_type (gdk_screen_get_display (self->priv->gdk_screen), + gdk_x11_register_standard_event_type (gdk_screen_get_display (priv->gdk_screen), event_base, RRNotify + 1); - gdk_window_add_filter (self->priv->gdk_root, screen_on_event, self); + gdk_window_add_filter (priv->gdk_root, screen_on_event, self); return TRUE; } @@ -741,21 +751,24 @@ void gdk_window_remove_filter (screen->priv->gdk_root, screen_on_event, screen); screen_info_free (screen->priv->info); + + G_OBJECT_CLASS (mate_rr_screen_parent_class)->finalize (gobject); } void - mate_rr_screen_set_property (GObject *gobject, guint property_id, const GValue *value, GParamSpec *property) +mate_rr_screen_set_property (GObject *gobject, guint property_id, const GValue *value, GParamSpec *property) { MateRRScreen *self = MATE_RR_SCREEN (gobject); + MateRRScreenPrivate *priv = self->priv; switch (property_id) { case SCREEN_PROP_GDK_SCREEN: - self->priv->gdk_screen = g_value_get_object (value); - self->priv->gdk_root = gdk_screen_get_root_window (self->priv->gdk_screen); - self->priv->xroot = gdk_x11_drawable_get_xid (self->priv->gdk_root); - self->priv->xdisplay = GDK_SCREEN_XDISPLAY (self->priv->gdk_screen); - self->priv->xscreen = gdk_x11_screen_get_xscreen (self->priv->gdk_screen); + priv->gdk_screen = g_value_get_object (value); + priv->gdk_root = gdk_screen_get_root_window (priv->gdk_screen); + priv->xroot = gdk_x11_drawable_get_xid (priv->gdk_root); + priv->xdisplay = GDK_SCREEN_XDISPLAY (priv->gdk_screen); + priv->xscreen = gdk_x11_screen_get_xscreen (priv->gdk_screen); return; default: G_OBJECT_WARN_INVALID_PROPERTY_ID (gobject, property_id, property); @@ -764,13 +777,30 @@ void } void +mate_rr_screen_get_property (GObject *gobject, guint property_id, GValue *value, GParamSpec *property) +{ + MateRRScreen *self = MATE_RR_SCREEN (gobject); + MateRRScreenPrivate *priv = self->priv; + + switch (property_id) + { + case SCREEN_PROP_GDK_SCREEN: + g_value_set_object (value, priv->gdk_screen); + return; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (gobject, property_id, property); + return; + } +} + +void mate_rr_screen_class_init (MateRRScreenClass *klass) { GObjectClass *gobject_class = G_OBJECT_CLASS (klass); g_type_class_add_private (klass, sizeof (MateRRScreenPrivate)); gobject_class->set_property = mate_rr_screen_set_property; - gobject_class->get_property = NULL; + gobject_class->get_property = mate_rr_screen_get_property; gobject_class->finalize = mate_rr_screen_finalize; g_object_class_install_property( @@ -781,44 +811,41 @@ mate_rr_screen_class_init (MateRRScreenClass *klass) "GDK Screen", "The GDK Screen represented by this MateRRScreen", GDK_TYPE_SCREEN, - G_PARAM_WRITABLE | G_PARAM_CONSTRUCT_ONLY | G_PARAM_STATIC_NICK | G_PARAM_STATIC_BLURB - ) + G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY | G_PARAM_STATIC_STRINGS) ); - screen_signals[SCREEN_CHANGED] = g_signal_newv("screen-changed", + screen_signals[SCREEN_CHANGED] = g_signal_new("screen-changed", G_TYPE_FROM_CLASS (gobject_class), - G_SIGNAL_RUN_LAST | G_SIGNAL_NO_RECURSE | G_SIGNAL_NO_HOOKS, - NULL, + G_SIGNAL_RUN_FIRST | G_SIGNAL_NO_RECURSE | G_SIGNAL_NO_HOOKS, + G_STRUCT_OFFSET (MateRRScreenClass, changed), NULL, NULL, g_cclosure_marshal_VOID__VOID, G_TYPE_NONE, - 0, - NULL); + 0); } void mate_rr_screen_init (MateRRScreen *self) { - self->priv = G_TYPE_INSTANCE_GET_PRIVATE (self, MATE_RR_TYPE_SCREEN, MateRRScreenPrivate); + MateRRScreenPrivate *priv = G_TYPE_INSTANCE_GET_PRIVATE (self, MATE_TYPE_RR_SCREEN, MateRRScreenPrivate); + self->priv = priv; - self->priv->gdk_screen = NULL; - self->priv->gdk_root = NULL; - self->priv->xdisplay = NULL; - self->priv->xroot = None; - self->priv->xscreen = NULL; - self->priv->info = NULL; - self->priv->rr_major_version = 0; - self->priv->rr_minor_version = 0; + priv->gdk_screen = NULL; + priv->gdk_root = NULL; + priv->xdisplay = NULL; + priv->xroot = None; + priv->xscreen = NULL; + priv->info = NULL; + priv->rr_major_version = 0; + priv->rr_minor_version = 0; } /** - * mate_rr_screen_new: (skip) + * mate_rr_screen_new: * Creates a new #MateRRScreen instance * * @screen: the #GdkScreen on which to operate - * @callback: an optional callback for screen-changed signal - * @data: * @error: will be set if XRandR is not supported * * Returns: a new #MateRRScreen instance or NULL if screen could not be created, @@ -826,27 +853,10 @@ mate_rr_screen_init (MateRRScreen *self) */ MateRRScreen * mate_rr_screen_new (GdkScreen *screen, - MateRRScreenChanged callback, - gpointer data, GError **error) { _mate_desktop_init_i18n (); - MateRRScreen *self = g_initable_new (MATE_RR_TYPE_SCREEN, NULL, error, "gdk-screen", screen, NULL); - if (self && callback) { - g_signal_connect (self, "screen-changed", G_CALLBACK (callback), data); - } - return self; -} -/** - * mate_rr_screen_destroy: - * - * Destroy the screen and all associated resources - * Deprecated: 3.0 - */ -void -mate_rr_screen_destroy (MateRRScreen *self) -{ - g_object_run_dispose (G_OBJECT (self)); + return g_initable_new (MATE_TYPE_RR_SCREEN, NULL, error, "gdk-screen", screen, NULL); } void @@ -856,7 +866,7 @@ mate_rr_screen_set_size (MateRRScreen *screen, int mm_width, int mm_height) { - g_return_if_fail (MATE_RR_IS_SCREEN (screen)); + g_return_if_fail (MATE_IS_RR_SCREEN (screen)); #ifdef HAVE_RANDR gdk_error_trap_push (); @@ -888,19 +898,23 @@ mate_rr_screen_get_ranges (MateRRScreen *screen, int *min_height, int *max_height) { - g_return_if_fail (MATE_RR_IS_SCREEN (screen)); + MateRRScreenPrivate *priv; + + g_return_if_fail (MATE_IS_RR_SCREEN (screen)); + + priv = screen->priv; if (min_width) - *min_width = screen->priv->info->min_width; + *min_width = priv->info->min_width; if (max_width) - *max_width = screen->priv->info->max_width; + *max_width = priv->info->max_width; if (min_height) - *min_height = screen->priv->info->min_height; + *min_height = priv->info->min_height; if (max_height) - *max_height = screen->priv->info->max_height; + *max_height = priv->info->max_height; } /** @@ -920,20 +934,25 @@ mate_rr_screen_get_timestamps (MateRRScreen *screen, guint32 *change_timestamp_ret, guint32 *config_timestamp_ret) { - g_return_if_fail (MATE_RR_IS_SCREEN (screen)); + MateRRScreenPrivate *priv; + + g_return_if_fail (MATE_IS_RR_SCREEN (screen)); + + priv = screen->priv; #ifdef HAVE_RANDR if (change_timestamp_ret) - *change_timestamp_ret = screen->priv->info->resources->timestamp; + *change_timestamp_ret = priv->info->resources->timestamp; if (config_timestamp_ret) - *config_timestamp_ret = screen->priv->info->resources->configTimestamp; + *config_timestamp_ret = priv->info->resources->configTimestamp; #endif } static gboolean force_timestamp_update (MateRRScreen *screen) { + MateRRScreenPrivate *priv = screen->priv; MateRRCrtc *crtc; XRRCrtcInfo *current_info; Status status; @@ -941,21 +960,21 @@ force_timestamp_update (MateRRScreen *screen) timestamp_updated = FALSE; - crtc = screen->priv->info->crtcs[0]; + crtc = priv->info->crtcs[0]; if (crtc == NULL) goto out; - current_info = XRRGetCrtcInfo (screen->priv->xdisplay, - screen->priv->info->resources, + current_info = XRRGetCrtcInfo (priv->xdisplay, + priv->info->resources, crtc->id); if (current_info == NULL) goto out; gdk_error_trap_push (); - status = XRRSetCrtcConfig (screen->priv->xdisplay, - screen->priv->info->resources, + status = XRRSetCrtcConfig (priv->xdisplay, + priv->info->resources, crtc->id, current_info->timestamp, current_info->x, @@ -1018,7 +1037,7 @@ mate_rr_screen_refresh (MateRRScreen *screen, MateRRMode ** mate_rr_screen_list_modes (MateRRScreen *screen) { - g_return_val_if_fail (MATE_RR_IS_SCREEN (screen), NULL); + g_return_val_if_fail (MATE_IS_RR_SCREEN (screen), NULL); g_return_val_if_fail (screen->priv->info != NULL, NULL); return screen->priv->info->modes; @@ -1034,7 +1053,7 @@ mate_rr_screen_list_modes (MateRRScreen *screen) MateRRMode ** mate_rr_screen_list_clone_modes (MateRRScreen *screen) { - g_return_val_if_fail (MATE_RR_IS_SCREEN (screen), NULL); + g_return_val_if_fail (MATE_IS_RR_SCREEN (screen), NULL); g_return_val_if_fail (screen->priv->info != NULL, NULL); return screen->priv->info->clone_modes; @@ -1050,7 +1069,7 @@ mate_rr_screen_list_clone_modes (MateRRScreen *screen) MateRRCrtc ** mate_rr_screen_list_crtcs (MateRRScreen *screen) { - g_return_val_if_fail (MATE_RR_IS_SCREEN (screen), NULL); + g_return_val_if_fail (MATE_IS_RR_SCREEN (screen), NULL); g_return_val_if_fail (screen->priv->info != NULL, NULL); return screen->priv->info->crtcs; @@ -1066,7 +1085,7 @@ mate_rr_screen_list_crtcs (MateRRScreen *screen) MateRROutput ** mate_rr_screen_list_outputs (MateRRScreen *screen) { - g_return_val_if_fail (MATE_RR_IS_SCREEN (screen), NULL); + g_return_val_if_fail (MATE_IS_RR_SCREEN (screen), NULL); g_return_val_if_fail (screen->priv->info != NULL, NULL); return screen->priv->info->outputs; @@ -1081,15 +1100,18 @@ MateRRCrtc * mate_rr_screen_get_crtc_by_id (MateRRScreen *screen, guint32 id) { + MateRRCrtc **crtcs; int i; - g_return_val_if_fail (MATE_RR_IS_SCREEN (screen), NULL); + g_return_val_if_fail (MATE_IS_RR_SCREEN (screen), NULL); g_return_val_if_fail (screen->priv->info != NULL, NULL); + + crtcs = screen->priv->info->crtcs; - for (i = 0; screen->priv->info->crtcs[i] != NULL; ++i) + for (i = 0; crtcs[i] != NULL; ++i) { - if (screen->priv->info->crtcs[i]->id == id) - return screen->priv->info->crtcs[i]; + if (crtcs[i]->id == id) + return crtcs[i]; } return NULL; @@ -1104,15 +1126,18 @@ MateRROutput * mate_rr_screen_get_output_by_id (MateRRScreen *screen, guint32 id) { + MateRROutput **outputs; int i; - g_return_val_if_fail (MATE_RR_IS_SCREEN (screen), NULL); + g_return_val_if_fail (MATE_IS_RR_SCREEN (screen), NULL); g_return_val_if_fail (screen->priv->info != NULL, NULL); - - for (i = 0; screen->priv->info->outputs[i] != NULL; ++i) + + outputs = screen->priv->info->outputs; + + for (i = 0; outputs[i] != NULL; ++i) { - if (screen->priv->info->outputs[i]->id == id) - return screen->priv->info->outputs[i]; + if (outputs[i]->id == id) + return outputs[i]; } return NULL; @@ -1401,7 +1426,7 @@ mate_rr_screen_get_output_by_name (MateRRScreen *screen, { int i; - g_return_val_if_fail (MATE_RR_IS_SCREEN (screen), NULL); + g_return_val_if_fail (MATE_IS_RR_SCREEN (screen), NULL); g_return_val_if_fail (screen->priv->info != NULL, NULL); for (i = 0; screen->priv->info->outputs[i] != NULL; ++i) @@ -1583,6 +1608,12 @@ void mate_rr_screen_set_primary_output (MateRRScreen *screen, MateRROutput *output) { + MateRRScreenPrivate *priv; + + g_return_if_fail (MATE_IS_RR_SCREEN (screen)); + + priv = screen->priv; + #ifdef HAVE_RANDR #if (RANDR_MAJOR > 1 || (RANDR_MAJOR == 1 && RANDR_MINOR >= 3)) RROutput id; @@ -1592,9 +1623,9 @@ mate_rr_screen_set_primary_output (MateRRScreen *screen, else id = None; - /* Runtime check for RandR 1.3 or higher */ - if (screen->priv->rr_major_version == 1 && screen->priv->rr_minor_version >= 3) - XRRSetOutputPrimary (screen->priv->xdisplay, screen->priv->xroot, id); + /* Runtime check for RandR 1.3 or higher */ + if (priv->rr_major_version > 1 || (priv->rr_major_version == 1 && priv->rr_minor_version >= 3)) + XRRSetOutputPrimary (priv->xdisplay, priv->xroot, id); #endif #endif /* HAVE_RANDR */ } |