aboutsummaryrefslogtreecommitdiffstatshomepage
path: root/libraries/ecore/src/lib/ecore_x/xlib/ecore_x_randr_12.c
diff options
context:
space:
mode:
Diffstat (limited to 'libraries/ecore/src/lib/ecore_x/xlib/ecore_x_randr_12.c')
-rw-r--r--libraries/ecore/src/lib/ecore_x/xlib/ecore_x_randr_12.c246
1 files changed, 191 insertions, 55 deletions
diff --git a/libraries/ecore/src/lib/ecore_x/xlib/ecore_x_randr_12.c b/libraries/ecore/src/lib/ecore_x/xlib/ecore_x_randr_12.c
index 38218a5..ec23b3c 100644
--- a/libraries/ecore/src/lib/ecore_x/xlib/ecore_x_randr_12.c
+++ b/libraries/ecore/src/lib/ecore_x/xlib/ecore_x_randr_12.c
@@ -347,9 +347,9 @@ ecore_x_randr_modes_info_get(Ecore_X_Window root,
347 ret[i]->vSyncStart = res->modes[i].vSyncStart; 347 ret[i]->vSyncStart = res->modes[i].vSyncStart;
348 ret[i]->vSyncEnd = res->modes[i].vSyncEnd; 348 ret[i]->vSyncEnd = res->modes[i].vSyncEnd;
349 ret[i]->vTotal = res->modes[i].vTotal; 349 ret[i]->vTotal = res->modes[i].vTotal;
350 if ((ret[i]->name = (malloc(res->modes[i].nameLength)))) 350 if ((ret[i]->name = (malloc(res->modes[i].nameLength + 1))))
351 strncpy(ret[i]->name, res->modes[i].name, 351 strncpy(ret[i]->name, res->modes[i].name,
352 res->modes[i].nameLength); 352 (res->modes[i].nameLength + 1));
353 else 353 else
354 ret[i]->name = NULL; 354 ret[i]->name = NULL;
355 355
@@ -380,6 +380,48 @@ ecore_x_randr_modes_info_get(Ecore_X_Window root,
380} 380}
381 381
382/* 382/*
383 * @brief add a mode to a display
384 * @param root window to which's screen's ressources are added
385 * @param mode_info
386 * @return Ecore_X_Randr_Mode of the added mode. Ecore_X_Randr_None if mode
387 * adding failed.
388 * @since 1.2.0
389 */
390EAPI Ecore_X_Randr_Mode
391ecore_x_randr_mode_info_add(Ecore_X_Window root,
392 Ecore_X_Randr_Mode_Info *mode_info)
393{
394#ifdef ECORE_XRANDR
395 RANDR_CHECK_1_2_RET(EINA_FALSE);
396 Ecore_X_Randr_Mode mode = Ecore_X_Randr_None;
397
398 if (_ecore_x_randr_root_validate(root) && mode_info)
399 mode = XRRCreateMode(_ecore_x_disp, root, (XRRModeInfo*)mode_info);
400
401 return mode;
402#else
403 return Ecore_X_Randr_None;
404#endif
405}
406
407/*
408 * @brief delete a mode from the display
409 * @param mode_info
410 * @since 1.2.0
411 */
412EAPI void
413ecore_x_randr_mode_del(Ecore_X_Randr_Mode mode)
414{
415#ifdef ECORE_XRANDR
416 RANDR_CHECK_1_2_RET();
417
418 XRRDestroyMode(_ecore_x_disp, mode);
419#else
420 return;
421#endif
422}
423
424/*
383 * @brief get detailed information for a given mode id 425 * @brief get detailed information for a given mode id
384 * @param root window which's screen's ressources are queried 426 * @param root window which's screen's ressources are queried
385 * @param mode the XID which identifies the mode of interest 427 * @param mode the XID which identifies the mode of interest
@@ -491,6 +533,83 @@ ecore_x_randr_crtcs_get(Ecore_X_Window root,
491#endif 533#endif
492} 534}
493 535
536/*
537 * @deprecated bad naming. Use ecore_x_randr_window_crtcs_get instead.
538 * @brief get the CRTCs, which display a certain window
539 * @param window window the displaying crtcs shall be found for
540 * @param num the number of crtcs displaying the window
541 * @return array of crtcs that display a certain window. NULL if no crtcs
542 * was found that displays the specified window.
543 */
544EAPI Ecore_X_Randr_Crtc *
545ecore_x_randr_current_crtc_get(Ecore_X_Window window,
546 int *num)
547{
548 return ecore_x_randr_window_crtcs_get(window, num);
549}
550
551/*
552 * @brief get the CRTCs, which display a certain window
553 * @param window window the displaying crtcs shall be found for
554 * @param num the number of crtcs displaying the window
555 * @return array of crtcs that display a certain window. NULL if no crtcs
556 * was found that displays the specified window.
557 * @since 1.2.0
558 */
559EAPI Ecore_X_Randr_Crtc *
560ecore_x_randr_window_crtcs_get(Ecore_X_Window window,
561 int *num)
562{
563#ifdef ECORE_XRANDR
564 Ecore_X_Window root;
565 Eina_Rectangle w_geo, c_geo;
566 Ecore_X_Randr_Crtc *crtcs;
567 Ecore_X_Randr_Mode mode;
568 Ecore_X_Randr_Output *ret = NULL;
569 Window tw;
570 int ncrtcs, i, nret = 0, rx = 0, ry = 0;
571
572 if (_randr_version < RANDR_1_2) goto _ecore_x_randr_window_crtcs_get_fail;
573
574 ecore_x_window_geometry_get(window,
575 &w_geo.x, &w_geo.y,
576 &w_geo.w, &w_geo.h);
577
578 root = ecore_x_window_root_get(window);
579 crtcs = ecore_x_randr_crtcs_get(root, &ncrtcs);
580 if (!crtcs) goto _ecore_x_randr_window_crtcs_get_fail;
581
582 /* now get window RELATIVE to root window - thats what matters. */
583 XTranslateCoordinates(_ecore_x_disp, window, root, 0, 0, &rx, &ry, &tw);
584 w_geo.x = rx;
585 w_geo.y = ry;
586
587 for (i = 0, nret = 0; i < ncrtcs; i++)
588 {
589 /* if crtc is not enabled, don't bother about it any further */
590 mode = ecore_x_randr_crtc_mode_get(root, crtcs[i]);
591 if (mode == Ecore_X_Randr_None) continue;
592
593 ecore_x_randr_crtc_geometry_get(root, crtcs[i],
594 &c_geo.x, &c_geo.y,
595 &c_geo.w, &c_geo.h);
596 if (eina_rectangles_intersect(&w_geo, &c_geo))
597 {
598 ret = realloc(ret, (sizeof(Ecore_X_Randr_Crtc) * ++nret));
599 ret[nret] = crtcs[i];
600 }
601 }
602 free(crtcs);
603
604 if (num) *num = nret;
605 return ret;
606
607_ecore_x_randr_window_crtcs_get_fail:
608#endif
609 if (num) *num = 0;
610 return NULL;
611}
612
494EAPI Ecore_X_Randr_Output * 613EAPI Ecore_X_Randr_Output *
495ecore_x_randr_outputs_get(Ecore_X_Window root, 614ecore_x_randr_outputs_get(Ecore_X_Window root,
496 int *num) 615 int *num)
@@ -1364,6 +1483,54 @@ ecore_x_randr_crtc_pos_relative_set(Ecore_X_Window root,
1364#endif 1483#endif
1365} 1484}
1366 1485
1486/*
1487 * @brief add given mode to given output
1488 * @param output the output the mode is added to
1489 * @param mode the mode added to the output
1490 * @return EINA_FALSE if output or mode equal Ecore_X_Randr_None, else EINA_TRUE
1491 * Additionally, if xcb backend is used, the success of the addition is reported
1492 * back directly.
1493 * @since 1.2.0
1494 */
1495EAPI Eina_Bool
1496ecore_x_randr_output_mode_add(Ecore_X_Randr_Output output,
1497 Ecore_X_Randr_Mode mode)
1498{
1499#ifdef ECORE_XRANDR
1500 RANDR_CHECK_1_2_RET(EINA_FALSE);
1501
1502 if ((output == Ecore_X_Randr_None) || (mode == Ecore_X_Randr_None))
1503 return EINA_FALSE;
1504
1505 XRRAddOutputMode(_ecore_x_disp, output, mode);
1506 return EINA_TRUE;
1507#else
1508 return EINA_FALSE;
1509#endif
1510}
1511
1512/*
1513 * @brief delete given mode from given output
1514 * @param output the output the mode is removed from
1515 * @param mode the mode removed from the output
1516 * @since 1.2.0
1517 */
1518EAPI void
1519ecore_x_randr_output_mode_del(Ecore_X_Randr_Output output,
1520 Ecore_X_Randr_Mode mode)
1521{
1522#ifdef ECORE_XRANDR
1523 RANDR_CHECK_1_2_RET();
1524
1525 if ((output == Ecore_X_Randr_None) || (mode == Ecore_X_Randr_None))
1526 return;
1527
1528 XRRDeleteOutputMode(_ecore_x_disp, output, mode);
1529#else
1530 return;
1531#endif
1532}
1533
1367EAPI Ecore_X_Randr_Mode * 1534EAPI Ecore_X_Randr_Mode *
1368ecore_x_randr_output_modes_get(Ecore_X_Window root, 1535ecore_x_randr_output_modes_get(Ecore_X_Window root,
1369 Ecore_X_Randr_Output output, 1536 Ecore_X_Randr_Output output,
@@ -2136,70 +2303,39 @@ ecore_x_randr_window_outputs_get(Ecore_X_Window window,
2136{ 2303{
2137#ifdef ECORE_XRANDR 2304#ifdef ECORE_XRANDR
2138 Ecore_X_Window root; 2305 Ecore_X_Window root;
2139 Eina_Rectangle w_geo, c_geo;
2140 Ecore_X_Randr_Crtc *crtcs; 2306 Ecore_X_Randr_Crtc *crtcs;
2141 Ecore_X_Randr_Mode mode; 2307 Ecore_X_Randr_Output *outputs, *ret = NULL;
2142 Ecore_X_Randr_Output *outputs, *ret = NULL, *tret; 2308 int ncrtcs, noutputs, i, nret = 0;
2143 Window tw;
2144 int ncrtcs, noutputs, i, nret = 0, rx = 0, ry = 0;
2145 2309
2146 if (_randr_version < RANDR_1_2) goto _ecore_x_randr_current_output_get_fail; 2310 if (_randr_version < RANDR_1_2) goto _ecore_x_randr_current_output_get_fail;
2147 2311
2148 ecore_x_window_geometry_get(window,
2149 &w_geo.x, &w_geo.y,
2150 &w_geo.w, &w_geo.h);
2151
2152 root = ecore_x_window_root_get(window); 2312 root = ecore_x_window_root_get(window);
2153 crtcs = ecore_x_randr_crtcs_get(root, &ncrtcs); 2313 if (!(crtcs = ecore_x_randr_window_crtcs_get(window, &ncrtcs)))
2154 if (!crtcs) goto _ecore_x_randr_current_output_get_fail; 2314 goto _ecore_x_randr_current_output_get_fail;
2155
2156 /* now get window RELATIVE to root window - thats what matters. */
2157 XTranslateCoordinates(_ecore_x_disp, window, root, 0, 0, &rx, &ry, &tw);
2158 w_geo.x = rx;
2159 w_geo.y = ry;
2160 2315
2161 for (i = 0; i < ncrtcs; i++) 2316 for (i = 0, nret = 0; i < ncrtcs; i++)
2162 { 2317 {
2163 /* if crtc is not enabled, don't bother about it any further */
2164 mode = ecore_x_randr_crtc_mode_get(root, crtcs[i]);
2165 if (mode == Ecore_X_Randr_None) continue;
2166 2318
2167 ecore_x_randr_crtc_geometry_get(root, crtcs[i], 2319 outputs = ecore_x_randr_crtc_outputs_get(root, crtcs[i],
2168 &c_geo.x, &c_geo.y, 2320 &noutputs);
2169 &c_geo.w, &c_geo.h); 2321 if (!outputs)
2170 if (eina_rectangles_intersect(&w_geo, &c_geo)) 2322 goto _ecore_x_randr_current_output_get_fail_free;
2171 { 2323 nret += noutputs;
2172 outputs = ecore_x_randr_crtc_outputs_get(root, crtcs[i], 2324 ret = realloc(ret, (nret * sizeof(Ecore_X_Randr_Output)));
2173 &noutputs); 2325 memcpy(&ret[nret], outputs, (noutputs * sizeof(Ecore_X_Randr_Output)));
2174 /* The case below should be impossible, but for safety reasons 2326 free(outputs);
2175 * remains */
2176 if (!outputs)
2177 {
2178 if (num) *num = 0;
2179 free(ret);
2180 free(crtcs);
2181 return NULL;
2182 }
2183 tret = realloc(ret, ((nret + noutputs) * sizeof(Ecore_X_Randr_Output)));
2184 if (!tret)
2185 {
2186 if (num) *num = 0;
2187 free(outputs);
2188 free(ret);
2189 free(crtcs);
2190 return NULL;
2191 }
2192 ret = tret;
2193 memcpy(&ret[nret], outputs, (noutputs * sizeof(Ecore_X_Randr_Output)));
2194 nret += noutputs;
2195 free(outputs);
2196 }
2197 } 2327 }
2198 free(crtcs); 2328 free(crtcs);
2199 2329
2200 if (num) *num = nret; 2330 if (num)
2331 *num = nret;
2332
2201 return ret; 2333 return ret;
2202 2334
2335_ecore_x_randr_current_output_get_fail_free:
2336 free(outputs);
2337 free(crtcs);
2338 free(ret);
2203_ecore_x_randr_current_output_get_fail: 2339_ecore_x_randr_current_output_get_fail:
2204#endif 2340#endif
2205 if (num) *num = 0; 2341 if (num) *num = 0;
@@ -2207,7 +2343,7 @@ _ecore_x_randr_current_output_get_fail:
2207} 2343}
2208 2344
2209/* 2345/*
2210 * @depricated bad naming. Use ecore_x_randr_window_outputs_get instead. 2346 * @deprecated bad naming. Use ecore_x_randr_window_outputs_get instead.
2211 * @brief get the outputs, which display a certain window 2347 * @brief get the outputs, which display a certain window
2212 * @param window window the displaying outputs shall be found for 2348 * @param window window the displaying outputs shall be found for
2213 * @param num the number of outputs displaying the window 2349 * @param num the number of outputs displaying the window
@@ -2215,7 +2351,7 @@ _ecore_x_randr_current_output_get_fail:
2215 * was found that displays the specified window. 2351 * was found that displays the specified window.
2216 */ 2352 */
2217 2353
2218EINA_DEPRECATED EAPI Ecore_X_Randr_Output * 2354EAPI Ecore_X_Randr_Output *
2219ecore_x_randr_current_output_get(Ecore_X_Window window, 2355ecore_x_randr_current_output_get(Ecore_X_Window window,
2220 int *num) 2356 int *num)
2221{ 2357{