[Xfce4-commits] <xfce4-settings:master> Add initial support for extended mode

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


Updating branch refs/heads/master
         to 097cdf7ea4c56b285a53b4390aee74cf77dd55b3 (commit)
       from f9a91e7d8e5c4d06fe606a55cc0f1cce857c4fab (commit)

commit 097cdf7ea4c56b285a53b4390aee74cf77dd55b3
Author: Lionel Le Folgoc <mrpouit at gmail.com>
Date:   Tue Jun 8 22:50:50 2010 +0200

    Add initial support for extended mode
    
    It adds the ability to detect the outputs' relative positions and store them in
    xfconf. It's probably not that beautiful, but at least it works with two
    outputs, and well, it's a start.

 dialogs/display-settings/xfce-randr.c |   83 ++++++++++++++++++++++++++-------
 dialogs/display-settings/xfce-randr.h |   41 +++++++++++------
 2 files changed, 93 insertions(+), 31 deletions(-)

diff --git a/dialogs/display-settings/xfce-randr.c b/dialogs/display-settings/xfce-randr.c
index 0fb2f3f..d123a73 100644
--- a/dialogs/display-settings/xfce-randr.c
+++ b/dialogs/display-settings/xfce-randr.c
@@ -35,6 +35,45 @@
 
 #ifdef HAS_RANDR_ONE_POINT_TWO
 
+static void
+xfce_randr_compute_position (XfceRandr *randr,
+                             gint      *pos_x,
+                             gint      *pos_y)
+{
+    gint m, n;
+
+    for (n = 0; n < randr->resources->noutput; ++n)
+    {
+        randr->position[n].output = -1;
+
+        if (randr->status[n] == XFCE_OUTPUT_STATUS_NONE || randr->mode[n] == None)
+            continue;
+
+        for (m = 0; m < randr->resources->noutput; ++m)
+        {
+            if (randr->status[m] == XFCE_OUTPUT_STATUS_NONE || m == n
+                || randr->mode[m] == None)
+                continue;
+
+            randr->position[n].output = m;
+            if (pos_x[n] < pos_x[m])
+                randr->position[n].option = XFCE_OUTPUT_POSITION_LEFT_OF;
+            else if (pos_x[n] > pos_x[m])
+                randr->position[n].option = XFCE_OUTPUT_POSITION_RIGHT_OF;
+            else if (pos_y[n] < pos_y[m])
+                randr->position[n].option = XFCE_OUTPUT_POSITION_ABOVE;
+            else if (pos_y[n] > pos_y[m])
+                randr->position[n].option = XFCE_OUTPUT_POSITION_BELOW;
+            else
+                randr->position[n].option = XFCE_OUTPUT_POSITION_SAME_AS;
+
+            break;
+        }
+    }
+}
+
+
+
 XfceRandr *
 xfce_randr_new (GdkDisplay  *display,
                 GError     **error)
@@ -47,6 +86,7 @@ xfce_randr_new (GdkDisplay  *display,
     XRRCrtcInfo            *crtc_info;
     gint                    n;
     gint                    major, minor;
+    gint                   *pos_x, *pos_y;
 
     g_return_val_if_fail (GDK_IS_DISPLAY (display), NULL);
     g_return_val_if_fail (error == NULL || *error == NULL, NULL);
@@ -95,7 +135,11 @@ xfce_randr_new (GdkDisplay  *display,
     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);
-    
+
+    /* keep track of the positions */
+    pos_x = g_new0 (gint, randr->resources->noutput);
+    pos_y = g_new0 (gint, randr->resources->noutput);
+
     /* walk the outputs */
     for (n = 0; n < randr->resources->noutput; n++)
     {
@@ -152,6 +196,8 @@ xfce_randr_new (GdkDisplay  *display,
                 randr->rotation[n] = crtc_info->rotation;
                 randr->rotations[n] = crtc_info->rotations;
                 XRRFreeCrtcInfo (crtc_info);
+                pos_x[n] = crtc_info->x;
+                pos_y[n] = crtc_info->y;
                 continue;
             }
         }
@@ -162,6 +208,10 @@ xfce_randr_new (GdkDisplay  *display,
         randr->rotations[n] = XRRConfigRotations (screen_config, &randr->rotation[n]);
         XRRFreeScreenConfigInfo (screen_config);
     }
+
+    /* compute the relative positions of outputs */
+    xfce_randr_compute_position (randr, pos_x, pos_y);
+
     return randr;
 }
 
@@ -238,7 +288,7 @@ xfce_randr_save_device (XfceRandr     *randr,
     const gchar *resolution_name = NULL;
     gdouble      refresh_rate = 0.00;
     XRRModeInfo *mode;
-    const gchar *position_name;
+    const gchar *position_option;
     gint         n;
     gint         degrees;
 
@@ -303,27 +353,26 @@ xfce_randr_save_device (XfceRandr     *randr,
         xfconf_channel_reset_property (channel, property, FALSE);
 #endif
 
-    /* save the position */
+    /* first, remove any existing position */
     g_snprintf (property, sizeof (property), "/%s/%s/Position", scheme, distinct);
-    if (randr->layout == XFCE_DISPLAY_LAYOUT_EXTEND
-        && randr->status[output] == XFCE_OUTPUT_STATUS_SECONDARY)
+    xfconf_channel_reset_property (channel, property, TRUE);
+    /* then save the new one */
+    if (G_LIKELY (resolution_name != NULL)
+        && randr->position[output].output >= 0
+        && randr->position[output].output < randr->resources->noutput)
     {
         /* convert the position into a string */
-        switch (randr->position[output])
+        switch (randr->position[output].option)
         {
-            case XFCE_OUTPUT_POSITION_LEFT:  position_name = "Left";   break;
-            case XFCE_OUTPUT_POSITION_RIGHT: position_name = "Right";  break;
-            case XFCE_OUTPUT_POSITION_TOP:   position_name = "Top";    break;
-            default:                         position_name = "Bottom"; break;
+            case XFCE_OUTPUT_POSITION_LEFT_OF:  position_option = "LeftOf";  break;
+            case XFCE_OUTPUT_POSITION_RIGHT_OF: position_option = "RightOf"; break;
+            case XFCE_OUTPUT_POSITION_ABOVE:    position_option = "Above";   break;
+            case XFCE_OUTPUT_POSITION_BELOW:    position_option = "Below";   break;
+            default:                            position_option = "SameAs";  break;
         }
-
+        g_snprintf (property, sizeof (property), "/%s/%s/Position/%s", scheme, distinct, position_option);
         /* save the position */
-        xfconf_channel_set_string (channel, property, position_name);
-    }
-    else
-    {
-        /* remove an existing postion */
-        xfconf_channel_reset_property (channel, property, FALSE);
+        xfconf_channel_set_string (channel, property, randr->output_info[randr->position[output].output]->name);
     }
 }
 
diff --git a/dialogs/display-settings/xfce-randr.h b/dialogs/display-settings/xfce-randr.h
index 840e2b5..37bfb77 100644
--- a/dialogs/display-settings/xfce-randr.h
+++ b/dialogs/display-settings/xfce-randr.h
@@ -24,11 +24,13 @@
 #ifndef __XFCE_RANDR_H__
 #define __XFCE_RANDR_H__
 
-#define XFCE_RANDR_MODE(randr)           (randr->mode[randr->active_output])
-#define XFCE_RANDR_PREFERRED_MODE(randr) (randr->preferred_mode[randr->active_output])
-#define XFCE_RANDR_ROTATION(randr)       (randr->rotation[randr->active_output])
-#define XFCE_RANDR_ROTATIONS(randr)      (randr->rotations[randr->active_output])
-#define XFCE_RANDR_OUTPUT_INFO(randr)    (randr->output_info[randr->active_output])
+#define XFCE_RANDR_MODE(randr)            (randr->mode[randr->active_output])
+#define XFCE_RANDR_PREFERRED_MODE(randr)  (randr->preferred_mode[randr->active_output])
+#define XFCE_RANDR_ROTATION(randr)        (randr->rotation[randr->active_output])
+#define XFCE_RANDR_ROTATIONS(randr)       (randr->rotations[randr->active_output])
+#define XFCE_RANDR_OUTPUT_INFO(randr)     (randr->output_info[randr->active_output])
+#define XFCE_RANDR_POSITION_OPTION(randr) (randr->position[randr->active_output].option)
+#define XFCE_RANDR_POSITION_OUTPUT(randr) (randr->position[randr->active_output].output)
 
 /* check for randr 1.2 or better */
 #if RANDR_MAJOR > 1 || (RANDR_MAJOR == 1 && RANDR_MINOR >= 2)
@@ -43,10 +45,11 @@
 #endif
 
 #ifdef HAS_RANDR_ONE_POINT_TWO
-typedef struct _XfceRandr          XfceRandr;
-typedef enum   _XfceDisplayLayout  XfceDisplayLayout;
-typedef enum   _XfceOutputPosition XfceOutputPosition;
-typedef enum   _XfceOutputStatus   XfceOutputStatus;
+typedef struct _XfceRandr                XfceRandr;
+typedef struct _XfceOutputPosition       XfceOutputPosition;
+typedef enum   _XfceDisplayLayout        XfceDisplayLayout;
+typedef enum   _XfceOutputPositionOption XfceOutputPositionOption;
+typedef enum   _XfceOutputStatus         XfceOutputStatus;
 
 enum _XfceDisplayLayout
 {
@@ -55,12 +58,13 @@ enum _XfceDisplayLayout
     XFCE_DISPLAY_LAYOUT_EXTEND
 };
 
-enum _XfceOutputPosition
+enum _XfceOutputPositionOption
 {
-    XFCE_OUTPUT_POSITION_LEFT,
-    XFCE_OUTPUT_POSITION_RIGHT,
-    XFCE_OUTPUT_POSITION_TOP,
-    XFCE_OUTPUT_POSITION_BOTTOM
+    XFCE_OUTPUT_POSITION_LEFT_OF,
+    XFCE_OUTPUT_POSITION_RIGHT_OF,
+    XFCE_OUTPUT_POSITION_ABOVE,
+    XFCE_OUTPUT_POSITION_BELOW,
+    XFCE_OUTPUT_POSITION_SAME_AS
 };
 
 enum _XfceOutputStatus
@@ -70,6 +74,15 @@ enum _XfceOutputStatus
     XFCE_OUTPUT_STATUS_SECONDARY
 };
 
+struct _XfceOutputPosition
+{
+    /* option... */
+    XfceOutputPositionOption option;
+
+    /* ... relative to the position of */
+    gint                     output;
+};
+
 struct _XfceRandr
 {
     /* xrandr 1.3 capable */



More information about the Xfce4-commits mailing list