static int test_query(void) { x11display_t x11disp; // TEST isextxrandr_x11display x11disp.xrandr.isSupported = true ; TEST(true == isextxrandr_x11display(&x11disp)) ; x11disp.xrandr.isSupported = false ; TEST(false == isextxrandr_x11display(&x11disp)) ; // TEST isfree_x11display memset(&x11disp, 255, sizeof(x11disp)); TEST(0 == isfree_x11display(&x11disp)); x11disp.idmap = 0; TEST(0 == isfree_x11display(&x11disp)); x11disp.sys_display = 0; TEST(1 == isfree_x11display(&x11disp)); // TEST sysdisplay_x11display for (uintptr_t i = 15; i <= 15; --i) { x11disp.sys_display = (void*)i; TEST((struct sys_display_t*)i == sysdisplay_x11display(&x11disp)); } // TEST io_x11display TEST(0 == init_x11display(&x11disp, ":0.0")); TEST(0 == isfree_x11display(&x11disp)); TEST(0 < io_x11display(&x11disp)); int fd = io_x11display(&x11disp); TEST(0 == free_x11display(&x11disp)); TEST(1 == isfree_x11display(&x11disp)); // TEST io_x11display: same fd TEST(0 == init_x11display(&x11disp, ":0.0")); TEST(fd == io_x11display(&x11disp)); TEST(0 == free_x11display(&x11disp)); // TEST errorstring_x11display: last char is set to 0 char errstr[100] ; char errstr2[100] ; memset(errstr, 1, sizeof(errstr)) ; memset(errstr2, 1, sizeof(errstr2)) ; TEST(0 == init_x11display(&x11disp, ":0.0")) ; TEST(sizeof(errstr) == strnlen(errstr, sizeof(errstr))) ; errorstring_x11display(&x11disp, 1, errstr, sizeof(errstr)) ; uint8_t errlen = (uint8_t) strnlen(errstr, sizeof(errstr)) ; TEST(2 < errlen) ; TEST(sizeof(errstr) > errlen) ; errorstring_x11display(&x11disp, 1, errstr2, errlen) ; TEST(0 == strncmp(errstr, errstr2, (uint8_t)(errlen-2))) ; TEST(0 != errstr[errlen-1]) ; TEST(0 == errstr2[errlen-1]) ; memset(errstr, 1, sizeof(errstr)) ; TEST(0 == memcmp(errstr, errstr2 + errlen, sizeof(errstr2)-errlen)) ; TEST(0 == free_x11display(&x11disp)) ; return 0 ; ONERR: return EINVAL ; }
int set_x11videomode(const x11videomode_t * xvidmode, x11screen_t * x11screen) { int err ; XRRScreenConfiguration * screen_config = 0 ; if (!isextxrandr_x11display(display_x11screen(x11screen))) { err = ENOSYS ; goto ONERR; } Display * sys_display = display_x11screen(x11screen)->sys_display ; screen_config = XRRGetScreenInfo(sys_display, RootWindow(sys_display, number_x11screen(x11screen))) ; if (!screen_config) { err = ENOSYS ; goto ONERR; } Rotation current_rotation ; uint16_t current_size = XRRConfigCurrentConfiguration(screen_config, ¤t_rotation) ; int sizes_count ; XRRScreenSize * sizes = XRRConfigSizes(screen_config, &sizes_count) ; if ( !sizes || (current_size >= sizes_count)) { err = EOVERFLOW ; goto ONERR; } if ( xvidmode->modeid > sizes_count || xvidmode->width_in_pixel != (uint32_t) sizes[xvidmode->modeid].width || xvidmode->height_in_pixel != (uint32_t) sizes[xvidmode->modeid].height) { err = EINVAL ; goto ONERR; } if (XRRSetScreenConfig( sys_display, screen_config, RootWindow(sys_display, number_x11screen(x11screen)), xvidmode->modeid, current_rotation, CurrentTime)) { err = EOPNOTSUPP ; goto ONERR; } XRRFreeScreenConfigInfo(screen_config) ; return 0 ; ONERR: if (screen_config) { XRRFreeScreenConfigInfo(screen_config) ; } TRACEEXIT_ERRLOG(err); return err ; }
int initcurrent_x11videomode(/*out*/x11videomode_t * current_xvidmode, x11screen_t * x11screen) { int err ; XRRScreenConfiguration * screen_config = 0 ; if (!isextxrandr_x11display(display_x11screen(x11screen))) { err = ENOSYS ; goto ONERR; } Display * sys_display = display_x11screen(x11screen)->sys_display ; screen_config = XRRGetScreenInfo(sys_display, RootWindow(sys_display, number_x11screen(x11screen))) ; if (!screen_config) { err = ENOSYS ; goto ONERR; } Rotation current_rotation ; uint16_t current_size = XRRConfigCurrentConfiguration(screen_config, ¤t_rotation) ; int sizes_count ; XRRScreenSize * sizes = XRRConfigSizes(screen_config, &sizes_count) ; if ( !sizes || (current_size >= sizes_count)) { err = EOVERFLOW ; goto ONERR; } current_xvidmode->modeid = current_size ; current_xvidmode->width_in_pixel = (uint32_t) sizes[current_size].width ; current_xvidmode->height_in_pixel = (uint32_t) sizes[current_size].height ; XRRFreeScreenConfigInfo(screen_config) ; return 0 ; ONERR: if (screen_config) { XRRFreeScreenConfigInfo(screen_config) ; } TRACEEXIT_ERRLOG(err); return err ; }
int init_x11videomodeiterator(/*out*/x11videomode_iterator_t * xvidit, x11screen_t * x11screen) { int err ; XRRScreenConfiguration * screen_config = 0 ; if (!isextxrandr_x11display(display_x11screen(x11screen))) { err = ENOSYS ; goto ONERR; } Display * sys_display = display_x11screen(x11screen)->sys_display ; screen_config = XRRGetScreenInfo(sys_display, RootWindow(sys_display, number_x11screen(x11screen))) ; if (!screen_config) { err = ENOSYS ; goto ONERR; } int sizes_count ; XRRScreenSize * sizes = XRRConfigSizes(screen_config, &sizes_count) ; if ( !sizes || (UINT16_MAX < (unsigned)sizes_count)) { err = EOVERFLOW ; goto ONERR; } xvidit->nextindex = 0 ; xvidit->nrmodes = (uint16_t) sizes_count ; xvidit->config = screen_config ; return 0 ; ONERR: if (screen_config) { XRRFreeScreenConfigInfo(screen_config) ; } TRACEEXIT_ERRLOG(err); return err ; }