Analogy of r68344 to XCB.
authorLeif Middelschulte <leif.middelschulte@gmail.com>
Thu, 23 Feb 2012 18:22:29 +0000 (18:22 +0000)
committerLeif Middelschulte <leif.middelschulte@gmail.com>
Thu, 23 Feb 2012 18:22:29 +0000 (18:22 +0000)
SVN revision: 68358

legacy/ecore/src/lib/ecore_x/xcb/ecore_xcb_randr.c

index 2ac0d9c..b7ba574 100644 (file)
@@ -1560,6 +1560,87 @@ ecore_x_randr_crtcs_get(Ecore_X_Window root,
 }
 
 /*
+ * @depricated bad naming. Use ecore_x_randr_window_crtcs_get instead.
+ * @brief get the CRTCs, which display a certain window
+ * @param window window the displaying CRTCs shall be found for
+ * @param num the number of CRTCs displaying the window
+ * @return array of CRTCs that display a certain window. NULL if no CRTCs
+ * was found that displays the specified window.
+ */
+EINA_DEPRECATED EAPI Ecore_X_Randr_Crtc *
+ecore_x_randr_current_crtc_get(Ecore_X_Window window,
+                                 int           *num)
+{
+   return ecore_x_randr_window_crtcs_get(window, num);
+}
+
+/*
+ * @brief get the CRTCs, which display a certain window
+ * @param window window the displaying crtcs shall be found for
+ * @param num the number of crtcs displaying the window
+ * @return array of crtcs that display a certain window. NULL if no crtcs
+ * was found that displays the specified window.
+ * @since 1.2.0
+ */
+EAPI Ecore_X_Randr_Crtc *
+ecore_x_randr_window_crtcs_get(Ecore_X_Window window,
+                               int *num)
+{
+#ifdef ECORE_XCB_RANDR
+   Ecore_X_Window root;
+   Eina_Rectangle w_geo, c_geo;
+   Ecore_X_Randr_Crtc *crtcs, *ret;
+   Ecore_X_Randr_Mode mode;
+   int ncrtcs, noutputs, i, nret = 0;
+   xcb_translate_coordinates_cookie_t cookie;
+   xcb_translate_coordinates_reply_t *trans;
+#endif
+
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
+   CHECK_XCB_CONN;
+
+#ifdef ECORE_XCB_RANDR
+   RANDR_CHECK_1_2_RET(NULL);
+
+   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) return NULL;
+
+   /* now get window RELATIVE to root window - thats what matters. */
+   cookie = xcb_translate_coordinates(_ecore_xcb_conn, window, root, 0, 0);
+   trans = xcb_translate_coordinates_reply(_ecore_xcb_conn, cookie, NULL);
+   w_geo.x = trans->dst_x;
+   w_geo.y = trans->dst_y;
+   free(trans);
+
+   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))
+           {
+              ret = realloc(ret, (++nret *
+                                   sizeof(Ecore_X_Randr_Output)));
+              ret[nret] = crtcs[i];
+           }
+     }
+   free(crtcs);
+
+   if (num) *num = nret;
+   return ret;
+
+#endif
+   if (num) *num = 0;
+   return NULL;
+}
+
+/*
  * @brief get a CRTC's outputs.
  * @param root the root window which's screen will be queried
  * @param num number of outputs referenced by given CRTC
@@ -2305,13 +2386,9 @@ ecore_x_randr_window_outputs_get(Ecore_X_Window window,
 {
 #ifdef ECORE_XCB_RANDR
    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;
+   Ecore_X_Randr_Output *outputs, *ret = NULL;
    int ncrtcs, noutputs, i, nret = 0;
-   xcb_translate_coordinates_cookie_t cookie;
-   xcb_translate_coordinates_reply_t *trans;
 #endif
 
    LOGFN(__FILE__, __LINE__, __FUNCTION__);
@@ -2320,64 +2397,36 @@ ecore_x_randr_window_outputs_get(Ecore_X_Window window,
    if (num) *num = 0;
 
 #ifdef ECORE_XCB_RANDR
-   RANDR_CHECK_1_2_RET(NULL);
-
-   ecore_x_window_geometry_get(window, &w_geo.x, &w_geo.y, &w_geo.w, &w_geo.h);
+   if (_randr_version < RANDR_1_2) goto _ecore_x_randr_current_output_get_fail;
 
    root = ecore_x_window_root_get(window);
-   crtcs = ecore_x_randr_crtcs_get(root, &ncrtcs);
-   if (!crtcs) return NULL;
+   if (!(crtcs = ecore_x_randr_window_crtcs_get(window, &ncrtcs)))
+     goto _ecore_x_randr_current_output_get_fail;
 
-   /* now get window RELATIVE to root window - thats what matters. */
-   cookie = xcb_translate_coordinates(_ecore_xcb_conn, window, root, 0, 0);
-   trans = xcb_translate_coordinates_reply(_ecore_xcb_conn, cookie, NULL);
-   w_geo.x = trans->dst_x;
-   w_geo.y = trans->dst_y;
-   free(trans);
-
-   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;
    return NULL;