[Xfce4-commits] <xfce4-settings:xrandr-display-settings> Do some code refactoring
Jérôme Guelfucci
noreply at xfce.org
Sun Jun 13 13:04:02 CEST 2010
Updating branch refs/heads/xrandr-display-settings
to 926e3aa02318d37c684d3caa74cf3637099ae9fb (commit)
from e75d59d2dc773ca0365968b4c6e39468548dc065 (commit)
commit 926e3aa02318d37c684d3caa74cf3637099ae9fb
Author: Lionel Le Folgoc <mrpouit at gmail.com>
Date: Sat Jun 12 16:29:30 2010 +0200
Do some code refactoring
Share more code between xfce_randr_new() and xfce_randr_reload() so that they
have the same behavior wrt outputs.
dialogs/display-settings/xfce-randr.c | 185 ++++++++++++++++++++-------------
1 files changed, 115 insertions(+), 70 deletions(-)
diff --git a/dialogs/display-settings/xfce-randr.c b/dialogs/display-settings/xfce-randr.c
index 491d00b..feb7b91 100644
--- a/dialogs/display-settings/xfce-randr.c
+++ b/dialogs/display-settings/xfce-randr.c
@@ -35,66 +35,17 @@
#ifdef HAS_RANDR_ONE_POINT_TWO
-XfceRandr *
-xfce_randr_new (GdkDisplay *display,
- GError **error)
+static gboolean
+xfce_randr_populate (XfceRandr *randr,
+ Display *xdisplay,
+ GdkWindow *root_window)
{
- XfceRandr *randr;
- Display *xdisplay;
- GdkWindow *root_window;
XRRScreenConfiguration *screen_config;
RRCrtc crtc;
XRRCrtcInfo *crtc_info;
gint n;
- gint major, minor;
-
- g_return_val_if_fail (GDK_IS_DISPLAY (display), NULL);
- g_return_val_if_fail (error == NULL || *error == NULL, NULL);
- /* get the x display */
- xdisplay = gdk_x11_display_get_xdisplay (display);
-
- /* check if the randr extension is available */
- if (XRRQueryVersion (xdisplay, &major, &minor) == FALSE)
- {
- g_set_error (error, 0, 0, _("Unable to query the version of the RandR extension being used"));
- return NULL;
- }
-
- /* we need atleast randr 1.2, 2.0 will probably break the api */
- if (major < 1 || (major == 1 && minor < 2))
- {
- /* 1.1 (not 1.2) is required because of the legacy code in xfce-randr-legacy.c */
- g_set_error (error, 0, 0, _("This system is using RandR %d.%d. For the display settings to work "
- "version 1.1 is required at least"), major, minor);
- return NULL;
- }
-
- /* allocate the structure */
- randr = g_slice_new0 (XfceRandr);
-
- randr->has_1_3 = (major > 1 || (major == 1 && minor >= 3));
-
- /* set display */
- randr->display = display;
-
- /* get the root window */
- root_window = gdk_get_default_root_window ();
-
- /* get the screen resource */
- randr->resources = XRRGetScreenResources (xdisplay, GDK_WINDOW_XID (root_window));
-
- /* set some layout */
- randr->layout = XFCE_DISPLAY_LAYOUT_SINGLE;
-
- /* allocate space for the settings */
- randr->mode = g_new0 (RRMode, randr->resources->noutput);
- randr->preferred_mode = g_new0 (RRMode, randr->resources->noutput);
- randr->rotation = g_new0 (Rotation, randr->resources->noutput);
- randr->rotations = g_new0 (Rotation, randr->resources->noutput);
- randr->position = g_new0 (XfceOutputPosition, randr->resources->noutput);
- randr->status = g_new0 (XfceOutputStatus, randr->resources->noutput);
- randr->output_info = g_new0 (XRROutputInfo *, randr->resources->noutput);
+ g_return_val_if_fail (randr->resources != NULL, FALSE);
/* walk the outputs */
for (n = 0; n < randr->resources->noutput; n++)
@@ -112,11 +63,7 @@ xfce_randr_new (GdkDisplay *display,
for (n++; n < randr->resources->noutput; n++)
randr->output_info[n] = NULL;
- /* cleanup */
- xfce_randr_free (randr);
-
- /* return nothing, then we'll fallback on screens (randr 1.1) code */
- return NULL;
+ return FALSE;
}
/* do not query disconnected outputs */
@@ -165,6 +112,77 @@ xfce_randr_new (GdkDisplay *display,
XRRFreeScreenConfigInfo (screen_config);
}
+ return TRUE;
+}
+
+
+
+XfceRandr *
+xfce_randr_new (GdkDisplay *display,
+ GError **error)
+{
+ XfceRandr *randr;
+ Display *xdisplay;
+ GdkWindow *root_window;
+ gint major, minor;
+
+ g_return_val_if_fail (GDK_IS_DISPLAY (display), NULL);
+ g_return_val_if_fail (error == NULL || *error == NULL, NULL);
+
+ /* get the x display */
+ xdisplay = gdk_x11_display_get_xdisplay (display);
+
+ /* check if the randr extension is available */
+ if (XRRQueryVersion (xdisplay, &major, &minor) == FALSE)
+ {
+ g_set_error (error, 0, 0, _("Unable to query the version of the RandR extension being used"));
+ return NULL;
+ }
+
+ /* we need atleast randr 1.2, 2.0 will probably break the api */
+ if (major < 1 || (major == 1 && minor < 2))
+ {
+ /* 1.1 (not 1.2) is required because of the legacy code in xfce-randr-legacy.c */
+ g_set_error (error, 0, 0, _("This system is using RandR %d.%d. For the display settings to work "
+ "version 1.1 is required at least"), major, minor);
+ return NULL;
+ }
+
+ /* allocate the structure */
+ randr = g_slice_new0 (XfceRandr);
+
+ randr->has_1_3 = (major > 1 || (major == 1 && minor >= 3));
+
+ /* set display */
+ randr->display = display;
+
+ /* get the root window */
+ root_window = gdk_get_default_root_window ();
+
+ /* get the screen resource */
+ randr->resources = XRRGetScreenResources (xdisplay, GDK_WINDOW_XID (root_window));
+
+ /* set some layout */
+ randr->layout = XFCE_DISPLAY_LAYOUT_SINGLE;
+
+ /* allocate space for the settings */
+ randr->mode = g_new0 (RRMode, randr->resources->noutput);
+ randr->preferred_mode = g_new0 (RRMode, randr->resources->noutput);
+ randr->rotation = g_new0 (Rotation, randr->resources->noutput);
+ randr->rotations = g_new0 (Rotation, randr->resources->noutput);
+ randr->position = g_new0 (XfceOutputPosition, randr->resources->noutput);
+ randr->status = g_new0 (XfceOutputStatus, randr->resources->noutput);
+ randr->output_info = g_new0 (XRROutputInfo *, randr->resources->noutput);
+
+ if (!xfce_randr_populate (randr, xdisplay, root_window))
+ {
+ /* cleanup */
+ xfce_randr_free (randr);
+
+ /* return nothing, then we'll fallback on screens (randr 1.1) code */
+ return NULL;
+ }
+
return randr;
}
@@ -204,28 +222,55 @@ xfce_randr_reload (XfceRandr *randr)
gint n;
Display *xdisplay;
GdkWindow *root_window;
-
- /* free the screen resources */
- XRRFreeScreenResources (randr->resources);
/* free the output info cache */
for (n = 0; n < randr->resources->noutput; n++)
if (G_LIKELY (randr->output_info[n]))
XRRFreeOutputInfo (randr->output_info[n]);
-
- /* get the x display and the root window */
+
+ /* free the screen resources */
+ XRRFreeScreenResources (randr->resources);
+
+ /* free the settings */
+ g_free (randr->mode);
+ g_free (randr->preferred_mode);
+ g_free (randr->rotation);
+ g_free (randr->rotations);
+ g_free (randr->status);
+ g_free (randr->position);
+ g_free (randr->output_info);
+
+ /* get the x display */
xdisplay = gdk_x11_display_get_xdisplay (randr->display);
+
+ /* get the root window */
root_window = gdk_get_default_root_window ();
/* get the screen resource */
+#ifdef HAS_RANDR_ONE_POINT_THREE
+ /* xfce_randr_reload() is only called after a xrandr notification, which
+ means that X is aware of the new hardware already. So, if possible,
+ do not reprobe the hardware again. */
+ if (randr->has_1_3)
+ randr->resources = XRRGetScreenResourcesCurrent (xdisplay, GDK_WINDOW_XID (root_window));
+ else
+#endif
randr->resources = XRRGetScreenResources (xdisplay, GDK_WINDOW_XID (root_window));
- /* cache the output info again */
- for (n = 0; n < randr->resources->noutput; n++)
- {
- /* get the output info */
- randr->output_info[n] = XRRGetOutputInfo (xdisplay, randr->resources, randr->resources->outputs[n]);
- }
+ /* set some layout */
+ randr->layout = XFCE_DISPLAY_LAYOUT_SINGLE;
+
+ /* allocate space for the settings */
+ randr->mode = g_new0 (RRMode, randr->resources->noutput);
+ randr->preferred_mode = g_new0 (RRMode, randr->resources->noutput);
+ randr->rotation = g_new0 (Rotation, randr->resources->noutput);
+ randr->rotations = g_new0 (Rotation, randr->resources->noutput);
+ randr->position = g_new0 (XfceOutputPosition, randr->resources->noutput);
+ randr->status = g_new0 (XfceOutputStatus, randr->resources->noutput);
+ randr->output_info = g_new0 (XRROutputInfo *, randr->resources->noutput);
+
+ /* repopulate */
+ xfce_randr_populate (randr, xdisplay, root_window);
}
More information about the Xfce4-commits
mailing list