[Xfce4-commits] <xfce4-settings:xrandr-display-settings> Store clone modes

Jérôme Guelfucci noreply at xfce.org
Wed Jun 16 18:36:01 CEST 2010


Updating branch refs/heads/xrandr-display-settings
         to 8f62672f2134ccb25fac883ef7c6b183529ee9db (commit)
       from 323f5e08c48775df76ed7b727080137032de6ebe (commit)

commit 8f62672f2134ccb25fac883ef7c6b183529ee9db
Author: Lionel Le Folgoc <mrpouit at 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;



More information about the Xfce4-commits mailing list