princeamd pushed a commit to branch enlightenment-0.17.

commit 4ad30863fd103195fb2c95e0602c9a56592ddfbc
Author: Christopher Michael <[email protected]>
Date:   Tue Feb 19 10:59:41 2013 +0000

    Backport: eec7305 :: Update some comments. Add code to create any clones on 
initial startup. Add function to find a monitor object based on crtc.
    
    Signed-off-by: Christopher Michael <[email protected]>
    
    SVN revision: 84211
    Signed-off-by: Deon Thomas <[email protected]>
---
 src/modules/conf_randr/e_smart_randr.c | 97 +++++++++++++++++++++++++++++-----
 1 file changed, 85 insertions(+), 12 deletions(-)

diff --git a/src/modules/conf_randr/e_smart_randr.c 
b/src/modules/conf_randr/e_smart_randr.c
index 1190178..ee6d621 100644
--- a/src/modules/conf_randr/e_smart_randr.c
+++ b/src/modules/conf_randr/e_smart_randr.c
@@ -36,6 +36,8 @@ static void _e_smart_clip_unset(Evas_Object *obj);
 static void _e_smart_randr_grid_cb_move(void *data, Evas *evas EINA_UNUSED, 
Evas_Object *obj EINA_UNUSED, void *event EINA_UNUSED);
 static void _e_smart_randr_grid_cb_resize(void *data, Evas *evas EINA_UNUSED, 
Evas_Object *obj EINA_UNUSED, void *event EINA_UNUSED);
 
+static Evas_Object *_e_smart_randr_monitor_crtc_find(E_Smart_Data *sd, 
Ecore_X_Randr_Crtc crtc);
+
 /* external functions exposed by this widget */
 Evas_Object *
 e_smart_randr_add(Evas *evas)
@@ -210,40 +212,40 @@ e_smart_randr_monitors_create(Evas_Object *obj)
              int noutput = 0, j = 0;
              intptr_t *o;
 
-             /* printf("Checking Crtc: %d\n", crtcs[i]); */
+             printf("Checking Crtc: %d\n", crtcs[i]);
+
+             /* TODO: Add EFL 1.8 check here and optimize this code */
 
              /* get the geometry for this crtc */
              ecore_x_randr_crtc_geometry_get(root, crtcs[i], 
                                              &cx, &cy, &cw, &ch);
-             /* printf("\tGeometry: %d %d %d %d\n", cx, cy, cw, ch); */
+             printf("\tGeometry: %d %d %d %d\n", cx, cy, cw, ch);
 
              routputs = 
                ecore_x_randr_crtc_outputs_get(root, crtcs[i], &noutput);
-             /* printf("\t\tNum Of Outputs: %d\n", noutput); */
+             printf("\t\tNum Of Outputs: %d\n", noutput);
 
              if ((noutput == 0) || (!routputs))
                {
-                  /* int p = 0; */
-
                   /* find Possible outputs */
                   routputs = 
                     ecore_x_randr_crtc_possible_outputs_get(root, crtcs[i], 
                                                             &noutput);
                   /* printf("\t\tNum Of Possible: %d\n", noutput); */
                   if ((!noutput) || (!routputs)) continue;
-
-                  /* for (p = 0; p < noutput; p++) */
-                  /*   { */
-                  /*      printf("\t\t\tOutput %d Crtc Is: %d\n", routputs[p], 
 */
-                  /*             ecore_x_randr_output_crtc_get(root, 
routputs[p])); */
-                  /*   } */
                }
 
+             /* loop possible outputs */
              for (j = 0; j < noutput; j++)
                {
                   Ecore_X_Randr_Crtc rcrtc;
 
+                  /* get this outputs crtc */
                   rcrtc = ecore_x_randr_output_crtc_get(root, routputs[j]);
+
+                  /* if crtc is not 0 (disabled), then check if it matches 
+                   * the one we are currently working with. If it does not 
+                   * match, then this is not a possible output for us */
                   if ((rcrtc != 0) && (rcrtc != crtcs[i]))
                     continue;
 
@@ -266,6 +268,9 @@ e_smart_randr_monitors_create(Evas_Object *obj)
 
                   output = (int)(long)o;
 
+                  printf("\t\t\tOutput %d Crtc Is: %d\n", output, 
+                         ecore_x_randr_output_crtc_get(root, output));
+
                   if ((cw == 0) && (ch == 0))
                     {
                        Ecore_X_Randr_Mode *modes;
@@ -280,7 +285,6 @@ e_smart_randr_monitors_create(Evas_Object *obj)
 
                        /* get the size of the largest mode */
                        ecore_x_randr_mode_size_get(root, modes[0], &mw, &mh);
-                       /* printf("\t\t\t\tOutput Size: %d %d\n", mw, mh); */
 
                        /* free any allocated memory from ecore_x_randr */
                        free(modes);
@@ -318,6 +322,56 @@ e_smart_randr_monitors_create(Evas_Object *obj)
 
                   /* tell monitor to set the background preview */
                   e_smart_monitor_background_set(mon, cx, cy);
+
+                  /* if we have a previous crtc */
+                  if (i > 0)
+                    {
+                       /* check if this crtc is a clone of that one */
+                       Ecore_X_Randr_Crtc pcrtc = 0;
+                       Evas_Coord px = 0, py = 0;
+
+                       pcrtc = crtcs[i - 1];
+
+                       /* get the geometry for this previous crtc */
+                       ecore_x_randr_crtc_geometry_get(root, pcrtc, 
+                                                       &px, &py, NULL, NULL);
+
+                       /* check if the geometry's match */
+                       if ((px == cx) && (py == cy))
+                         {
+                            Ecore_X_Randr_Orientation orient, porient;
+
+                            orient = 
+                              ecore_x_randr_crtc_orientation_get(root, 
crtcs[i]);
+
+                            porient = 
+                              ecore_x_randr_crtc_orientation_get(root, pcrtc);
+
+                            /* check orientation */
+                            if ((porient == orient))
+                              {
+                                 Ecore_X_Randr_Mode mode = 0, pmode = 0;
+
+                                 mode = 
+                                   ecore_x_randr_crtc_mode_get(root, crtcs[i]);
+                                 pmode = 
+                                   ecore_x_randr_crtc_mode_get(root, pcrtc);
+
+                                 /* check mode */
+                                 if ((pmode == mode))
+                                   {
+                                      Evas_Object *pmon;
+
+                                      /* find monitor for this prev crtc */
+                                      if ((pmon = 
_e_smart_randr_monitor_crtc_find(sd, pcrtc)))
+                                        {
+                                           /* tell This monitor it is cloned 
into previous */
+                                           e_smart_monitor_clone_set(mon, 
pmon);
+                                        }
+                                   }
+                              }
+                         }
+                    }
                }
 
              /* free any allocated memory from ecore_x_randr */
@@ -554,3 +608,22 @@ _e_smart_randr_grid_cb_resize(void *data, Evas *evas 
EINA_UNUSED, Evas_Object *o
    EINA_LIST_FOREACH(sd->monitors, l, mon)
      e_smart_monitor_grid_set(mon, sd->o_grid, gx, gy, gw, gh);
 }
+
+static Evas_Object *
+_e_smart_randr_monitor_crtc_find(E_Smart_Data *sd, Ecore_X_Randr_Crtc crtc)
+{
+   Eina_List *l = NULL;
+   Evas_Object *mon;
+
+   if ((!sd) || (!crtc)) return NULL;
+
+   EINA_LIST_FOREACH(sd->monitors, l, mon)
+     {
+        Ecore_X_Randr_Crtc mcrtc;
+
+        if ((mcrtc = e_smart_monitor_crtc_get(mon)))
+          if ((mcrtc == crtc)) return mon;
+     }
+
+   return NULL;
+}

-- 

------------------------------------------------------------------------------
This SF.net email is sponsored by Windows:

Build for Windows Store.

http://p.sf.net/sfu/windows-dev2dev

Reply via email to