Updating branch refs/heads/xrandr-display-settings to 8f62672f2134ccb25fac883ef7c6b183529ee9db (commit) from 323f5e08c48775df76ed7b727080137032de6ebe (commit)
commit 8f62672f2134ccb25fac883ef7c6b183529ee9db Author: Lionel Le Folgoc <mrpo...@gmail.com> Date: Tue Jun 15 21:54:18 2010 +0200 Store clone modes These modes are supported by all connected/active outputs, and therefore can be used when the user wants to have cloned outputs. dialogs/display-settings/xfce-randr.c | 54 +++++++++++++++++++++++++++++++++ dialogs/display-settings/xfce-randr.h | 3 ++ 2 files changed, 57 insertions(+), 0 deletions(-) diff --git a/dialogs/display-settings/xfce-randr.c b/dialogs/display-settings/xfce-randr.c index 8f968dd..f967855 100644 --- a/dialogs/display-settings/xfce-randr.c +++ b/dialogs/display-settings/xfce-randr.c @@ -36,6 +36,56 @@ #ifdef HAS_RANDR_ONE_POINT_TWO +static void +xfce_randr_get_clone_modes (XfceRandr *randr) +{ + GArray *clone_modes; + gint l, m, n, candidate, found; + guint i; + + clone_modes = g_array_new (FALSE, FALSE, sizeof (RRMode)); + + /* walk all available modes */ + for (n = 0; n < randr->resources->nmode; n++) + { + candidate = TRUE; + /* walk all active outputs */ + for (m = 0; m < randr->resources->noutput; m++) + { + if (randr->status[m] == XFCE_OUTPUT_STATUS_NONE) + continue; + + found = FALSE; + /* walk supported modes from this output */ + for (l = 0; l < randr->output_info[m]->nmode; l++) + { + if (randr->resources->modes[n].id == randr->output_info[m]->modes[l]) + { + found = TRUE; + break; + } + } + + /* if it is not present in one output, forget it */ + candidate &= found; + } + + /* common to all outputs, can be used for clone mode */ + if (candidate) + clone_modes = g_array_append_val (clone_modes, randr->resources->modes[n].id); + } + + /* return a "normal" array (last value -> None) */ + randr->clone_modes = g_new0 (RRMode, clone_modes->len + 1); + + for (i = 0; i < clone_modes->len; i++) + randr->clone_modes[i] = g_array_index (clone_modes, RRMode, i); + + g_array_free (clone_modes, TRUE); +} + + + static Rotation xfce_randr_get_safe_rotations (XfceRandr *randr, Display *xdisplay, @@ -150,6 +200,8 @@ xfce_randr_populate (XfceRandr *randr, root_window, n); } + xfce_randr_get_clone_modes (randr); + return TRUE; } @@ -228,6 +280,7 @@ xfce_randr_free (XfceRandr *randr) XRRFreeScreenResources (randr->resources); /* free the settings */ + g_free (randr->clone_modes); g_free (randr->mode); g_free (randr->preferred_mode); g_free (randr->rotation); @@ -258,6 +311,7 @@ xfce_randr_reload (XfceRandr *randr) XRRFreeScreenResources (randr->resources); /* free the settings */ + g_free (randr->clone_modes); g_free (randr->mode); g_free (randr->preferred_mode); g_free (randr->rotation); diff --git a/dialogs/display-settings/xfce-randr.h b/dialogs/display-settings/xfce-randr.h index 9eaae46..1b354b2 100644 --- a/dialogs/display-settings/xfce-randr.h +++ b/dialogs/display-settings/xfce-randr.h @@ -96,6 +96,9 @@ struct _XfceRandr /* selected display layout */ XfceDisplayLayout layout; + /* modes common to all enabled outputs */ + RRMode *clone_modes; + /* selected settings for all outputs */ RRMode *mode; RRMode *preferred_mode; _______________________________________________ Xfce4-commits mailing list Xfce4-commits@xfce.org http://foo-projects.org/mailman/listinfo/xfce4-commits