Improve implementation of ecore_x_randr_window_crtcs_get
authorleif <leif@7cbeb6ba-43b4-40fd-8cce-4c39aea84d33>
Thu, 23 Feb 2012 15:56:42 +0000 (15:56 +0000)
committerleif <leif@7cbeb6ba-43b4-40fd-8cce-4c39aea84d33>
Thu, 23 Feb 2012 15:56:42 +0000 (15:56 +0000)
git-svn-id: svn+ssh://svn.enlightenment.org/var/svn/e/trunk/ecore@68349 7cbeb6ba-43b4-40fd-8cce-4c39aea84d33

src/lib/ecore_x/xlib/ecore_x_randr_12.c

index 13fdf5b..5947887 100644 (file)
@@ -2302,71 +2302,38 @@ ecore_x_randr_window_outputs_get(Ecore_X_Window window,
                                  int *num)
 {
 #ifdef ECORE_XRANDR
-   Ecore_X_Window root;
-   Eina_Rectangle w_geo, c_geo;
    Ecore_X_Randr_Crtc *crtcs;
-   Ecore_X_Randr_Mode mode;
-   Ecore_X_Randr_Output *outputs, *ret = NULL, *tret;
-   Window tw;
-   int ncrtcs, noutputs, i, nret = 0, rx = 0, ry = 0;
+   Ecore_X_Randr_Output *outputs, *ret = NULL;
+   int ncrtcs, noutputs, i, nret = 0;
 
    if (_randr_version < RANDR_1_2) goto _ecore_x_randr_current_output_get_fail;
 
-   ecore_x_window_geometry_get(window,
-                               &w_geo.x, &w_geo.y,
-                               &w_geo.w, &w_geo.h);
-
-   root = ecore_x_window_root_get(window);
-   crtcs = ecore_x_randr_crtcs_get(root, &ncrtcs);
-   if (!crtcs) goto _ecore_x_randr_current_output_get_fail;
-
-   /* now get window RELATIVE to root window - thats what matters. */
-   XTranslateCoordinates(_ecore_x_disp, window, root, 0, 0, &rx, &ry, &tw);
-   w_geo.x = rx;
-   w_geo.y = ry;
+   if (!(crtcs = ecore_x_randr_window_crtcs_get(window, num)))
+     goto _ecore_x_randr_current_output_get_fail;
 
-   for (i = 0; i < ncrtcs; i++)
+   for (i = 0, nret = 0; i < ncrtcs; i++)
      {
-        /* if crtc is not enabled, don't bother about it any further */
-        mode = ecore_x_randr_crtc_mode_get(root, crtcs[i]);
-        if (mode == Ecore_X_Randr_None) continue;
 
-        ecore_x_randr_crtc_geometry_get(root, crtcs[i],
-                                        &c_geo.x, &c_geo.y,
-                                        &c_geo.w, &c_geo.h);
-        if (eina_rectangles_intersect(&w_geo, &c_geo))
-          {
-             outputs = ecore_x_randr_crtc_outputs_get(root, crtcs[i],
-                                                      &noutputs);
-             /* The case below should be impossible, but for safety reasons
-              * remains */
-             if (!outputs)
-               {
-                  if (num) *num = 0;
-                  free(ret);
-                  free(crtcs);
-                  return NULL;
-               }
-             tret = realloc(ret, ((nret + noutputs) * sizeof(Ecore_X_Randr_Output)));
-             if (!tret)
-               {
-                  if (num) *num = 0;
-                  free(outputs);
-                  free(ret);
-                  free(crtcs);
-                  return NULL;
-               }
-             ret = tret;
-             memcpy(&ret[nret], outputs, (noutputs * sizeof(Ecore_X_Randr_Output)));
-             nret += noutputs;
-             free(outputs);
-          }
+        outputs = ecore_x_randr_crtc_outputs_get(root, crtcs[i],
+              &noutputs);
+        if (!outputs)
+          goto _ecore_x_randr_current_output_get_fail_free;
+        nret += noutputs;
+        ret = realloc(ret, (nret * sizeof(Ecore_X_Randr_Output)));
+        memcpy(&ret[nret], outputs, (noutputs * sizeof(Ecore_X_Randr_Output)));
+        free(outputs);
      }
    free(crtcs);
 
-   if (num) *num = nret;
+   if (num)
+     *num = nret;
+
    return ret;
 
+_ecore_x_randr_current_output_get_fail_free:
+   free(outputs);
+   free(crtcs);
+   free(ret);
 _ecore_x_randr_current_output_get_fail:
 #endif
    if (num) *num = 0;