From 29c8ede450d9b02ca78f195fcf10096990b2ea71 Mon Sep 17 00:00:00 2001 From: Leif Middelschulte Date: Thu, 23 Feb 2012 15:56:42 +0000 Subject: [PATCH] Improve implementation of ecore_x_randr_window_crtcs_get SVN revision: 68349 --- .../src/lib/ecore_x/xlib/ecore_x_randr_12.c | 73 +++++-------------- 1 file changed, 20 insertions(+), 53 deletions(-) diff --git a/legacy/ecore/src/lib/ecore_x/xlib/ecore_x_randr_12.c b/legacy/ecore/src/lib/ecore_x/xlib/ecore_x_randr_12.c index 13fdf5b99e..5947887602 100644 --- a/legacy/ecore/src/lib/ecore_x/xlib/ecore_x_randr_12.c +++ b/legacy/ecore/src/lib/ecore_x/xlib/ecore_x_randr_12.c @@ -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); + if (!(crtcs = ecore_x_randr_window_crtcs_get(window, num))) + 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) 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; - - 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;