[Xfce4-commits] <xfce4-settings:master> Simplify the case when an output has to be disabled

Nick Schermer noreply at xfce.org
Sat Aug 28 23:02:25 CEST 2010


Updating branch refs/heads/master
         to 47ccd9d3d6f0c69b977991c48ac6e7bbc5e50655 (commit)
       from d8fdc287d9f1f2721df63e28ab1cda96fee79dbf (commit)

commit 47ccd9d3d6f0c69b977991c48ac6e7bbc5e50655
Author: Lionel Le Folgoc <mrpouit at gmail.com>
Date:   Tue Jun 8 22:07:33 2010 +0200

    Simplify the case when an output has to be disabled

 xfce4-settings-helper/displays.c |   75 +++++++++++++++++++-------------------
 1 files changed, 38 insertions(+), 37 deletions(-)

diff --git a/xfce4-settings-helper/displays.c b/xfce4-settings-helper/displays.c
index 59ffb83..4c00d51 100644
--- a/xfce4-settings-helper/displays.c
+++ b/xfce4-settings-helper/displays.c
@@ -165,6 +165,24 @@ xfce_displays_helper_finalize (GObject *object)
 
 
 #ifdef HAS_RANDR_ONE_POINT_TWO
+static Status
+xfce_displays_helper_disable_crtc (Display            *xdisplay,
+                                   XRRScreenResources *resources,
+                                   RRCrtc              crtc)
+{
+    g_return_val_if_fail (xdisplay != NULL, RRSetConfigSuccess);
+    g_return_val_if_fail (resources != NULL, RRSetConfigSuccess);
+
+    /* already disabled */
+    if (crtc == None)
+        return RRSetConfigSuccess;
+
+    return XRRSetCrtcConfig (xdisplay, resources, crtc, CurrentTime,
+                             0, 0, None, RR_Rotate_0, NULL, 0);
+}
+
+
+
 static void
 xfce_displays_helper_channel_apply (XfceDisplaysHelper *helper,
                                     const gchar        *scheme)
@@ -176,7 +194,7 @@ xfce_displays_helper_channel_apply (XfceDisplaysHelper *helper,
     gchar               property[512];
     gint                min_width, min_height, max_width, max_height;
     gint                mm_width, mm_height, width, height;
-    gint                j, l, m, n, num_outputs, output_rot, noutput;
+    gint                j, l, m, n, num_outputs, output_rot;
 #ifdef HAS_RANDR_ONE_POINT_THREE
     gint                is_primary;
 #endif
@@ -188,7 +206,6 @@ xfce_displays_helper_channel_apply (XfceDisplaysHelper *helper,
     gdouble             rate;
     RRMode              mode;
     Rotation            rot;
-    RROutput           *outputs;
 
     /* flush x and trap errors */
     gdk_flush ();
@@ -271,6 +288,17 @@ xfce_displays_helper_channel_apply (XfceDisplaysHelper *helper,
                 continue;
             }
 
+            /* outputs that have to be disabled are stored without resolution */
+            if (output_res == NULL)
+            {
+                if (xfce_displays_helper_disable_crtc (xdisplay, resources,
+                                                       output_info->crtc) != RRSetConfigSuccess)
+                    g_warning ("Failed to disable CRTC for output %s.", output_info->name);
+
+                XRRFreeOutputInfo (output_info);
+                break;
+            }
+
             /* walk supported modes */
             mode = None;
             for (l = 0; l < output_info->nmode; ++l)
@@ -303,7 +331,7 @@ xfce_displays_helper_channel_apply (XfceDisplaysHelper *helper,
             }
 
             /* unsupported mode, abort for this output */
-            if (mode == None && output_res != NULL)
+            if (mode == None)
             {
                 XRRFreeOutputInfo (output_info);
                 break;
@@ -324,45 +352,18 @@ xfce_displays_helper_channel_apply (XfceDisplaysHelper *helper,
                 /* check if we really need to do something */
                 if (crtc_info->mode != mode || crtc_info->rotation != rot)
                 {
-                    /* resolution was NULL, so the user wants to disable this output */
-                    if (mode == None)
-                    {
-                        outputs = g_new0 (RROutput, crtc_info->noutput - 1);
-                        noutput = 0;
-                        /* to disable the output, remove it from the list of outputs connected to this crtc */
-                        for (l = 0; l < crtc_info->noutput; ++l)
-                        {
-                            if (crtc_info->outputs[l] == resources->outputs[m])
-                                continue;
-
-                            outputs[noutput++] = crtc_info->outputs[l];
-                        }
-                    }
-                    else
-                    {
-                        noutput = crtc_info->noutput;
-                        outputs = crtc_info->outputs;
-                    }
+                    /* get the "physical sizes" of the output */
+                    mm_width += output_info->mm_width;
+                    mm_height += output_info->mm_height;
 
-                    /* do not change the screen size if the output is going to be disabled */
-                    if (mode != None)
-                    {
-                        /* get the "physical sizes" of the output */
-                        mm_width += output_info->mm_width;
-                        mm_height += output_info->mm_height;
-
-                        /* get the sizes of the mode to enforce */
-                        width += resources->modes[j].width;
-                        height += resources->modes[j].height;
-                    }
+                    /* get the sizes of the mode to enforce */
+                    width += resources->modes[j].width;
+                    height += resources->modes[j].height;
 
                     if (XRRSetCrtcConfig (xdisplay, resources, output_info->crtc,
                                           crtc_info->timestamp, crtc_info->x, crtc_info->y,
-                                          mode, rot, outputs, noutput) != RRSetConfigSuccess)
+                                          mode, rot, crtc_info->outputs, crtc_info->noutput) != RRSetConfigSuccess)
                         g_warning ("Failed to configure %s.", output_info->name);
-
-                    if (mode == None)
-                        g_free (outputs);
                 }
 
                 XRRFreeCrtcInfo (crtc_info);



More information about the Xfce4-commits mailing list