[Xfce4-commits] <xfce4-settings:master> Only store connected outputs

Nick Schermer noreply at xfce.org
Sat Aug 28 23:04:42 CEST 2010


Updating branch refs/heads/master
         to 1f0803d8b9dc41627de78b6a2cbdceee45b4f53d (commit)
       from fc3fc69e9198463f2c70d5cea28b2f71fe8e6782 (commit)

commit 1f0803d8b9dc41627de78b6a2cbdceee45b4f53d
Author: Lionel Le Folgoc <mrpouit at gmail.com>
Date:   Fri Jun 25 20:42:28 2010 +0200

    Only store connected outputs
    
    This will avoid lots of loops to get the number of connected outputs, and
    repeated tests to check that an output is connected before using it.

 dialogs/display-settings/main.c       |  113 +++++---------------
 dialogs/display-settings/xfce-randr.c |  188 +++++++++++++++-----------------
 dialogs/display-settings/xfce-randr.h |   12 ++-
 3 files changed, 122 insertions(+), 191 deletions(-)

diff --git a/dialogs/display-settings/main.c b/dialogs/display-settings/main.c
index 3e10ff0..b390b71 100644
--- a/dialogs/display-settings/main.c
+++ b/dialogs/display-settings/main.c
@@ -137,29 +137,6 @@ display_setting_combo_box_get_value (GtkComboBox *combobox,
 
 
 
-static gint
-display_setting_get_n_active_outputs (void)
-{
-    gint noutput;
-
-    noutput = 0;
-
-    if (xfce_randr)
-    {
-        gint i;
-
-        for (i = 0; i < xfce_randr->resources->noutput; i++)
-        {
-            if (xfce_randr->status[i] != XFCE_OUTPUT_STATUS_NONE)
-                noutput++;
-        }
-    }
-
-    return noutput;
-}
-
-
-
 #ifdef HAS_RANDR_ONE_POINT_TWO
 static void
 display_setting_reflections_changed (GtkComboBox *combobox,
@@ -528,7 +505,7 @@ display_setting_output_toggled (GtkToggleButton *togglebutton,
     if (!xfce_randr)
         return;
 
-    if (display_setting_get_n_active_outputs () > 1)
+    if (xfce_randr->noutput > 1)
     {
         GObject *radio;
         radio = gtk_builder_get_object (builder, "randr-on");
@@ -560,7 +537,7 @@ display_setting_output_status_populate (GtkBuilder *builder)
     if (!xfce_randr)
         return;
 
-    if (display_setting_get_n_active_outputs () <= 1)
+    if (xfce_randr->noutput <= 1)
         return;
 
     radio_on = gtk_builder_get_object (builder, "randr-on");
@@ -619,6 +596,9 @@ display_settings_treeview_selection_changed (GtkTreeSelection *selection,
 static void
 display_settings_treeview_populate (GtkBuilder *builder)
 {
+#ifdef HAS_RANDR_ONE_POINT_TWO
+    guint             m;
+#endif
     gint              n;
     GtkListStore     *store;
     GObject          *treeview;
@@ -650,39 +630,35 @@ display_settings_treeview_populate (GtkBuilder *builder)
 #ifdef HAS_RANDR_ONE_POINT_TWO
     if (xfce_randr)
     {
-        /* walk all the outputs */
-        for (n = 0; n < xfce_randr->resources->noutput; n++)
+        /* walk all the connected outputs */
+        for (m = 0; m < xfce_randr->noutput; ++m)
         {
-            /* only show screen that are primary or secondary */
-            if (xfce_randr->status[n] == XFCE_OUTPUT_STATUS_NONE)
-                continue;
-
             /* get a friendly name for the output */
             name = xfce_randr_friendly_name (xfce_randr,
-                                             xfce_randr->resources->outputs[n],
-                                             xfce_randr->output_info[n]->name);
+                                             xfce_randr->resources->outputs[m],
+                                             xfce_randr->output_info[m]->name);
 
-            if (xfce_randr->mode[n] == None && lucent_display_icon == NULL)
+            if (xfce_randr->mode[m] == None && lucent_display_icon == NULL)
                 lucent_display_icon =
                     exo_gdk_pixbuf_lucent (display_icon, 50);
 
             /* insert the output in the store */
             gtk_list_store_append (store, &iter);
-            if (xfce_randr->mode[n] == None)
+            if (xfce_randr->mode[m] == None)
                 gtk_list_store_set (store, &iter,
                                     COLUMN_OUTPUT_NAME, name,
                                     COLUMN_OUTPUT_ICON, lucent_display_icon,
-                                    COLUMN_OUTPUT_ID, n, -1);
+                                    COLUMN_OUTPUT_ID, m, -1);
             else
                 gtk_list_store_set (store, &iter,
                                     COLUMN_OUTPUT_NAME, name,
                                     COLUMN_OUTPUT_ICON, display_icon,
-                                    COLUMN_OUTPUT_ID, n, -1);
+                                    COLUMN_OUTPUT_ID, m, -1);
 
             g_free (name);
 
             /* select active output */
-            if (n == xfce_randr->active_output)
+            if (m == xfce_randr->active_output)
                 gtk_tree_selection_select_iter (selection, &iter);
         }
     }
@@ -813,7 +789,7 @@ display_settings_dialog_new (GtkBuilder *builder)
     if (xfce_randr != NULL)
     {
         radio = gtk_builder_get_object (builder, "randr-on");
-        if (display_setting_get_n_active_outputs () > 1)
+        if (xfce_randr->noutput > 1)
         {
             gtk_widget_show (GTK_WIDGET (radio));
             g_signal_connect (G_OBJECT (radio), "toggled", G_CALLBACK (display_setting_output_toggled), builder);
@@ -824,7 +800,7 @@ display_settings_dialog_new (GtkBuilder *builder)
         }
 
         radio = gtk_builder_get_object (builder, "randr-off");
-        if (display_setting_get_n_active_outputs () > 1)
+        if (xfce_randr->noutput > 1)
         {
             gtk_widget_show (GTK_WIDGET (radio));
             g_signal_connect (G_OBJECT (radio), "toggled", G_CALLBACK (display_setting_output_toggled), builder);
@@ -902,27 +878,14 @@ display_settings_minimal_dialog_response (GtkDialog  *dialog,
     gboolean    use_first_screen;
     gboolean    use_second_screen;
     gboolean    use_both;
-    gint        first, second;
+    guint       first, second;
     gint        m, n, found;
 
     if (response_id == 1)
     {
-        /* OK */
-
-        first = second = -1;
-
-        for (n = 0; n < xfce_randr->resources->noutput; n++)
-        {
-            if (xfce_randr->status[n] != XFCE_OUTPUT_STATUS_NONE)
-            {
-                if (first < 0)
-                    first = n;
-                else if (second < 0)
-                    second = n;
-                else
-                    break;
-            }
-        }
+        /* TODO: handle correctly more than 2 outputs? */
+        first = 0;
+        second = 1;
 
         first_screen_radio = gtk_builder_get_object (builder, "radiobutton1");
         second_screen_radio = gtk_builder_get_object (builder, "radiobutton2");
@@ -999,7 +962,7 @@ main (gint argc, gchar **argv)
     GdkDisplay *display;
     gboolean    succeeded = TRUE;
     gint        event_base, error_base;
-    guint       ui_ret;
+    guint       first, second;
 
     /* setup translation domain */
     xfce_textdomain (GETTEXT_PACKAGE, LOCALEDIR, "UTF-8");
@@ -1157,39 +1120,17 @@ main (gint argc, gchar **argv)
         }
         else
         {
-            gint n;
-            gint first, second;
-
-            if (xfce_randr->resources->noutput < 2 || xfce_randr == NULL)
+            if (xfce_randr->noutput < 2 || xfce_randr == NULL)
                 goto err1;
 
-            first = second = -1;
-
-            for (n = 0; n < xfce_randr->resources->noutput; n++)
-            {
-                if (xfce_randr->status[n] != XFCE_OUTPUT_STATUS_NONE)
-                {
-                    if (first < 0)
-                        first = n;
-                    else if (second < 0)
-                        second = n;
-                    else
-                        break;
-                }
-            }
-
-            if (first < 0 || second < 0)
-                goto err1;
+            /* TODO: handle correctly more than 2 outputs? */
+            first = 0;
+            second = 1;
 
             builder = gtk_builder_new ();
 
-            ui_ret =
-                gtk_builder_add_from_string (builder,
-                                             minimal_display_dialog_ui,
-                                             minimal_display_dialog_ui_length,
-                                             &error);
-
-            if (ui_ret != 0)
+            if (gtk_builder_add_from_string (builder, minimal_display_dialog_ui,
+                                             minimal_display_dialog_ui_length, &error) != 0)
             {
                 GObject    *first_screen_radio;
                 GObject    *second_screen_radio;
diff --git a/dialogs/display-settings/xfce-randr.c b/dialogs/display-settings/xfce-randr.c
index c855bc6..ae87c30 100644
--- a/dialogs/display-settings/xfce-randr.c
+++ b/dialogs/display-settings/xfce-randr.c
@@ -40,24 +40,21 @@ static void
 xfce_randr_list_clone_modes (XfceRandr *randr)
 {
     GArray *clone_modes;
-    gint    l, m, n, candidate, found;
-    guint   i;
+    gint    l, n, candidate, found;
+    guint   m;
 
-    clone_modes = g_array_new (FALSE, FALSE, sizeof (RRMode));
+    clone_modes = g_array_new (TRUE, FALSE, sizeof (RRMode));
 
     /* walk all available modes */
-    for (n = 0; n < randr->resources->nmode; n++)
+    for (n = 0; n < randr->resources->nmode; ++n)
     {
         candidate = TRUE;
-        /* walk all active outputs */
-        for (m = 0; m < randr->resources->noutput; m++)
+        /* walk all connected outputs */
+        for (m = 0; m < randr->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++)
+            for (l = 0; l < randr->output_info[m]->nmode; ++l)
             {
                 if (randr->resources->modes[n].id == randr->output_info[m]->modes[l])
                 {
@@ -76,12 +73,7 @@ xfce_randr_list_clone_modes (XfceRandr *randr)
     }
 
     /* 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);
+    randr->clone_modes = (RRMode *) g_array_free (clone_modes, FALSE);
 }
 
 
@@ -89,28 +81,17 @@ xfce_randr_list_clone_modes (XfceRandr *randr)
 static Rotation
 xfce_randr_get_safe_rotations (XfceRandr *randr,
                                Display   *xdisplay,
-                               GdkWindow *root_window,
-                               gint       num_output)
+                               guint      num_output)
 {
-    XRRScreenConfiguration *screen_config;
-    XRRCrtcInfo            *crtc_info;
-    gint                    n;
-    Rotation                dummy, rot;
+    XRRCrtcInfo *crtc_info;
+    Rotation     rot;
+    gint         n;
 
-    g_return_val_if_fail (num_output >= 0
-                          && num_output < randr->resources->noutput,
-                          RR_Rotate_0);
-
-    if (randr->output_info[num_output]->ncrtc < 1)
-    {
-        screen_config = XRRGetScreenInfo (xdisplay, GDK_WINDOW_XID (root_window));
-        rot = XRRConfigRotations (screen_config, &dummy);
-        XRRFreeScreenConfigInfo (screen_config);
-        return rot;
-    }
+    g_return_val_if_fail (num_output < randr->noutput, RR_Rotate_0);
+    g_return_val_if_fail (randr->output_info[num_output]->ncrtc > 0, RR_Rotate_0);
 
     rot = XFCE_RANDR_ROTATIONS_MASK | XFCE_RANDR_REFLECTIONS_MASK;
-    for (n = 0; n < randr->output_info[num_output]->ncrtc; n++)
+    for (n = 0; n < randr->output_info[num_output]->ncrtc; ++n)
     {
         crtc_info = XRRGetCrtcInfo (xdisplay, randr->resources,
                                     randr->output_info[num_output]->crtcs[n]);
@@ -167,76 +148,88 @@ xfce_randr_populate (XfceRandr *randr,
                      Display   *xdisplay,
                      GdkWindow *root_window)
 {
-    XRRCrtcInfo            *crtc_info;
-    gint                    n;
+    GPtrArray     *outputs;
+    XRROutputInfo *output_info;
+    XRRCrtcInfo   *crtc_info;
+    gint           n;
+    guint          m;
 
     g_return_val_if_fail (randr != NULL, FALSE);
     g_return_val_if_fail (randr->resources != NULL, FALSE);
 
-    /* allocate space for the settings */
-    randr->mode = g_new0 (RRMode, randr->resources->noutput);
-    randr->modes = g_new0 (XfceRRMode *, 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);
+    /* prepare the temporary cache */
+    outputs = g_ptr_array_new_with_free_func ((GDestroyNotify) XRRFreeOutputInfo);
 
     /* walk the outputs */
-    for (n = 0; n < randr->resources->noutput; n++)
+    for (n = 0; n < randr->resources->noutput; ++n)
     {
-        /* reset */
-        randr->status[n] = XFCE_OUTPUT_STATUS_NONE;
-
         /* get the output info */
-        randr->output_info[n] = XRRGetOutputInfo (xdisplay, randr->resources, randr->resources->outputs[n]);
+        output_info = XRRGetOutputInfo (xdisplay, randr->resources,
+                                        randr->resources->outputs[n]);
 
-        /* check if the device is really a randr 1.2 device */
-        if (n == 0 && strcmp (randr->output_info[n]->name, "default") == 0)
+        /* forget about disconnected outputs */
+        if (output_info->connection != RR_Connected)
         {
-            /* make sure we don't free the not yet allocated outputs */
-            for (n++; n < randr->resources->noutput; n++)
-            {
-                randr->output_info[n] = NULL;
-                randr->modes[n] = NULL;
-            }
+            XRRFreeOutputInfo (output_info);
+            continue;
+        }
 
+        /* cache it */
+        g_ptr_array_add (outputs, output_info);
+
+        /* check if the device is really a randr 1.2 device */
+        if (n == 0 && strcmp (output_info->name, "default") == 0)
+        {
+            /* free the cache */
+            g_ptr_array_unref (outputs);
             return FALSE;
         }
+    }
+
+    /* migrate the temporary cache */
+    randr->noutput = outputs->len;
+    randr->output_info = (XRROutputInfo **) g_ptr_array_free (outputs, FALSE);
 
+    /* allocate final space for the settings */
+    randr->mode = g_new0 (RRMode, randr->noutput);
+    randr->modes = g_new0 (XfceRRMode *, randr->noutput);
+    randr->rotation = g_new0 (Rotation, randr->noutput);
+    randr->rotations = g_new0 (Rotation, randr->noutput);
+    randr->position = g_new0 (XfceOutputPosition, randr->noutput);
+    randr->status = g_new0 (XfceOutputStatus, randr->noutput);
+
+    /* walk the connected outputs */
+    for (m = 0; m < randr->noutput; ++m)
+    {
         /* fill in supported modes */
-        randr->modes[n] = xfce_randr_list_supported_modes (randr->resources, randr->output_info[n]);
+        randr->modes[m] = xfce_randr_list_supported_modes (randr->resources, randr->output_info[m]);
 
-        /* do not query disconnected outputs */
-        if (randr->output_info[n]->connection == RR_Connected)
-        {
 #ifdef HAS_RANDR_ONE_POINT_THREE
-            /* find the primary screen if supported */
-            if (randr->has_1_3 && XRRGetOutputPrimary (xdisplay, GDK_WINDOW_XID (root_window)) == randr->resources->outputs[n])
-                randr->status[n] = XFCE_OUTPUT_STATUS_PRIMARY;
-            else
+        /* find the primary screen if supported */
+        if (randr->has_1_3 && XRRGetOutputPrimary (xdisplay, GDK_WINDOW_XID (root_window)) == randr->resources->outputs[m])
+            randr->status[m] = XFCE_OUTPUT_STATUS_PRIMARY;
+        else
 #endif
-                randr->status[n] = XFCE_OUTPUT_STATUS_SECONDARY;
+            randr->status[m] = XFCE_OUTPUT_STATUS_SECONDARY;
 
-            if (randr->output_info[n]->crtc != None)
-            {
-                crtc_info = XRRGetCrtcInfo (xdisplay, randr->resources,
-                                            randr->output_info[n]->crtc);
-                randr->mode[n] = crtc_info->mode;
-                randr->rotation[n] = crtc_info->rotation;
-                randr->rotations[n] = crtc_info->rotations;
-                randr->position[n].x = crtc_info->x;
-                randr->position[n].y = crtc_info->y;
-                XRRFreeCrtcInfo (crtc_info);
-                continue;
-            }
+        if (randr->output_info[m]->crtc != None)
+        {
+            crtc_info = XRRGetCrtcInfo (xdisplay, randr->resources,
+                                        randr->output_info[m]->crtc);
+            randr->mode[m] = crtc_info->mode;
+            randr->rotation[m] = crtc_info->rotation;
+            randr->rotations[m] = crtc_info->rotations;
+            randr->position[m].x = crtc_info->x;
+            randr->position[m].y = crtc_info->y;
+            XRRFreeCrtcInfo (crtc_info);
+        }
+        else
+        {
+            /* output disabled */
+            randr->mode[m] = None;
+            randr->rotation[m] = RR_Rotate_0;
+            randr->rotations[m] = xfce_randr_get_safe_rotations (randr, xdisplay, m);
         }
-
-        /* output either disabled or disconnected */
-        randr->mode[n] = None;
-        randr->rotation[n] = RR_Rotate_0;
-        randr->rotations[n] = xfce_randr_get_safe_rotations (randr, xdisplay,
-                                                             root_window, n);
     }
 
     /* clone modes: same RRModes present for all outputs */
@@ -309,10 +302,10 @@ xfce_randr_new (GdkDisplay  *display,
 static void
 xfce_randr_cleanup (XfceRandr *randr)
 {
-    gint n;
+    guint n;
 
     /* free the output/mode info cache */
-    for (n = 0; n < randr->resources->noutput; n++)
+    for (n = 0; n < randr->noutput; ++n)
     {
         if (G_LIKELY (randr->output_info[n]))
             XRRFreeOutputInfo (randr->output_info[n]);
@@ -382,7 +375,7 @@ static void
 xfce_randr_save_device (XfceRandr     *randr,
                         const gchar   *scheme,
                         XfconfChannel *channel,
-                        gint           output,
+                        guint          output,
                         const gchar   *distinct)
 {
     gchar        property[512];
@@ -482,7 +475,7 @@ xfce_randr_save (XfceRandr     *randr,
                  XfconfChannel *channel)
 {
     gchar        property[512];
-    gint         n, num_outputs = 0;
+    guint        n;
 
     g_return_if_fail (XFCONF_IS_CHANNEL (channel));
 
@@ -490,20 +483,16 @@ xfce_randr_save (XfceRandr     *randr,
     g_snprintf (property, sizeof (property), "/%s/Layout", scheme);
     xfconf_channel_set_string (channel, property, "Outputs");
 
-    /* parse all outputs */
-    for (n = 0; n < randr->resources->noutput; n++)
+    /* save connected outputs */
+    for (n = 0; n < randr->noutput; ++n)
     {
-        /* do not save disconnected ones */
-        if (randr->status[n] != XFCE_OUTPUT_STATUS_NONE)
-        {
-            g_snprintf (property, sizeof (property), "Output%d", num_outputs++);
-            xfce_randr_save_device (randr, scheme, channel, n, property);
-        }
+        g_snprintf (property, sizeof (property), "Output%u", n);
+        xfce_randr_save_device (randr, scheme, channel, n, property);
     }
 
     /* store the number of outputs saved */
     g_snprintf (property, sizeof (property), "/%s/NumOutputs", scheme);
-    xfconf_channel_set_int (channel, property, num_outputs);
+    xfconf_channel_set_int (channel, property, randr->noutput);
 
     /* tell the helper to apply this theme */
     xfconf_channel_set_string (channel, "/Schemes/Apply", scheme);
@@ -606,14 +595,13 @@ xfce_randr_friendly_name (XfceRandr   *randr,
 
 XfceRRMode *
 xfce_randr_find_mode_by_id (XfceRandr *randr,
-                            gint       output,
+                            guint      output,
                             RRMode     id)
 {
     gint n;
 
     g_return_val_if_fail (randr != NULL, NULL);
-    g_return_val_if_fail (output >= 0 && output < randr->resources->noutput,
-                          NULL);
+    g_return_val_if_fail (output < randr->noutput, NULL);
 
     if (id == None)
         return NULL;
diff --git a/dialogs/display-settings/xfce-randr.h b/dialogs/display-settings/xfce-randr.h
index d01a017..28c3732 100644
--- a/dialogs/display-settings/xfce-randr.h
+++ b/dialogs/display-settings/xfce-randr.h
@@ -55,7 +55,6 @@ typedef enum   _XfceOutputStatus   XfceOutputStatus;
 
 enum _XfceOutputStatus
 {
-    XFCE_OUTPUT_STATUS_NONE,
     XFCE_OUTPUT_STATUS_PRIMARY,
     XFCE_OUTPUT_STATUS_SECONDARY
 };
@@ -89,16 +88,19 @@ struct _XfceRandr
     XRRScreenResources  *resources;
 
     /* the active selected layout */
-    gint                 active_output;
+    guint                active_output;
+
+    /* number of connected outputs */
+    guint                noutput;
 
     /* cache for the output/mode info */
     XRROutputInfo      **output_info;
     XfceRRMode         **modes;
 
-    /* modes common to all enabled outputs */
+    /* modes common to all connected outputs */
     RRMode              *clone_modes;
 
-    /* selected settings for all outputs */
+    /* selected settings for all connected outputs */
     RRMode              *mode;
     Rotation            *rotation;
     Rotation            *rotations;
@@ -128,7 +130,7 @@ gchar      *xfce_randr_friendly_name   (XfceRandr     *randr,
                                         const gchar   *name);
 
 XfceRRMode *xfce_randr_find_mode_by_id (XfceRandr     *randr,
-                                        gint           output,
+                                        guint          output,
                                         RRMode         id);
 
 #endif /* !HAS_RANDR_ONE_POINT_TWO */



More information about the Xfce4-commits mailing list