12 #include "../include/tscope5/display.h"
13 #include "../include/tscope5/graphics.h"
14 #include "../include/tscope5/bitmaps.h"
15 #include "../include/tscope5/display_internal.h"
16 #include "../include/tscope5/system_internal.h"
58 ts5_check_display(
"ts5_install_display");
60 ts5_log(TS5_LOGLEVEL_1,
"ts5_install_display: check settings\n");
62 TS5_DISPLAY_STATUS request = ts5_nextdisplay;
65 if (ts5_nextdisplay.display_mode == TS5_FULLSCREEN_WINDOW) {
69 for (i = 0; i < _ts5_status.num_displays; i++) {
71 if (_ts5_status.display_status[i].adapter == ts5_nextdisplay.adapter) {
72 ts5_fatal (
"ts5_install_display: cannot open fullscreen display,",
73 " adapter already in use by another display (%d)\n", i);
82 request.refreshrate = -1;
83 request.display_mode = TS5_FULLSCREEN_WINDOW;
84 request.vsync_mode = ts5_nextdisplay.vsync_mode;
88 if (ts5_nextdisplay.display_mode == TS5_FULLSCREEN) {
92 for (i = 0; i < _ts5_status.num_displays; i++) {
94 if (_ts5_status.display_status[i].adapter == ts5_nextdisplay.adapter) {
95 ts5_fatal (
"ts5_install_display: cannot open fullscreen display,",
96 " adapter already in use by another display (%d)\n", i);
101 ALLEGRO_DISPLAY_MODE *mode;
102 mode = (ALLEGRO_DISPLAY_MODE *)al_malloc(
sizeof(ALLEGRO_DISPLAY_MODE));
103 int nmodes = al_get_num_display_modes();
106 for (i=0; i<nmodes; i++) {
108 mode = al_get_display_mode(i, mode);
110 if (mode->width==ts5_nextdisplay.w && mode->height==ts5_nextdisplay.h &&
111 (mode->refresh_rate==ts5_nextdisplay.refreshrate || mode->refresh_rate==0)) {
119 ts5_fatal (
"ts5_install_display: the requested combination of size (%d,%d)",
120 " and refreshate (%d) is not supported by display adapter %d\n",
121 ts5_nextdisplay.w, ts5_nextdisplay.h,
122 ts5_nextdisplay.refreshrate, ts5_nextdisplay.adapter);
126 request.w = ts5_nextdisplay.w;
127 request.h = ts5_nextdisplay.h;
130 request.refreshrate = ts5_nextdisplay.refreshrate;
131 request.display_mode = TS5_FULLSCREEN;
132 request.vsync_mode = ts5_nextdisplay.vsync_mode;
136 if (ts5_nextdisplay.display_mode == TS5_WINDOWED) {
140 for (i = 0; i < _ts5_status.num_displays; i++) {
142 if (_ts5_status.display_status[i].adapter == ts5_nextdisplay.adapter &&
143 (_ts5_status.display_status[i].display_mode == TS5_FULLSCREEN ||
144 _ts5_status.display_status[i].display_mode == TS5_FULLSCREEN_WINDOW)) {
146 ts5_fatal (
"ts5_install_display: cannot open display,",
147 " adapter already in use by a fullscreen display (%d)\n", i);
152 if (ts5_nextdisplay.w < 320 ) {
154 ts5_log(TS5_LOGLEVEL_1,
"ts5_install_display: adjusting display width to %d (was %d)\n",
155 request.w, ts5_nextdisplay.w);
157 else if (ts5_nextdisplay.w > _ts5_status.display_adapter_status[ts5_nextdisplay.adapter].w) {
158 request.w = _ts5_status.display_adapter_status[ts5_nextdisplay.adapter].w;
159 ts5_log(TS5_LOGLEVEL_1,
"ts5_install_display: adjusting display width to %d (was %d)\n",
160 request.w, ts5_nextdisplay.w);
163 request.w = ts5_nextdisplay.w;
167 if (ts5_nextdisplay.h < 240 ) {
169 ts5_log(TS5_LOGLEVEL_1,
"ts5_install_display: adjusting display height to %d (was %d)\n",
170 request.h, ts5_nextdisplay.h);
172 else if (ts5_nextdisplay.h > _ts5_status.display_adapter_status[ts5_nextdisplay.adapter].h) {
173 request.h = _ts5_status.display_adapter_status[ts5_nextdisplay.adapter].h;
174 ts5_log(TS5_LOGLEVEL_1,
"ts5_install_display: adjusting display height to %d (was %d)\n",
175 request.h, ts5_nextdisplay.h);
178 request.h = ts5_nextdisplay.h;
181 request.x = ts5_nextdisplay.x;
182 request.y = ts5_nextdisplay.y;
184 if (request.x == -1) {
186 if (_ts5_status.graphics_status.coordinate_system == TS5_CARTESIAN_COORDINATES) {
187 request.x = (_ts5_status.display_adapter_status[request.adapter].w - request.w)/2;
193 request.x += _ts5_status.display_adapter_status[request.adapter].x1;
196 if (request.y == -1) {
198 if (_ts5_status.graphics_status.coordinate_system == TS5_CARTESIAN_COORDINATES) {
199 request.y = (_ts5_status.display_adapter_status[request.adapter].h - request.h)/2;
205 request.y += _ts5_status.display_adapter_status[request.adapter].y1;
209 request.refreshrate = -1;
210 request.display_mode = TS5_WINDOWED;
211 request.vsync_mode = ts5_nextdisplay.vsync_mode;
216 ts5_log(TS5_LOGLEVEL_1,
"ts5_install_display: request settings\n");
217 al_set_new_display_adapter(request.adapter);
218 al_set_new_display_refresh_rate(request.refreshrate);
219 al_set_new_display_option(ALLEGRO_VSYNC, (
int)request.vsync_mode, ALLEGRO_SUGGEST);
221 if (request.display_mode == TS5_WINDOWED) {
225 if (request.display_mode == TS5_FULLSCREEN_WINDOW) {
226 al_set_new_window_position(INT_MAX, INT_MAX);
229 al_set_new_display_flags(request.display_mode);
232 _ts5_status.num_displays++;
233 _ts5_status.active_display = _ts5_status.num_displays - 1;
236 ts5_log(TS5_LOGLEVEL_1,
"ts5_install_display: opening display\n");
238 TS5_DISPLAY **display;
239 display = al_realloc(_ts5_status.display, _ts5_status.num_displays *
sizeof(TS5_DISPLAY *));
241 if (display == NULL) {
242 ts5_fatal(
"ts5_install_display: failed to allocate memory for display pointer\n");
245 _ts5_status.display = (TS5_DISPLAY **) display;
246 _ts5_status.display[_ts5_status.active_display] = al_create_display(request.w, request.h);
248 if (!_ts5_status.display[_ts5_status.active_display]) {
249 ts5_fatal(
"ts5_install_display: could not open display\n");
252 if (ts5_nextdisplay.display_mode == TS5_FULLSCREEN_WINDOW) {
253 request.w = _ts5_status.display_adapter_status[request.adapter].w;
254 request.h = _ts5_status.display_adapter_status[request.adapter].h;
255 al_toggle_display_flag(_ts5_status.display[_ts5_status.active_display], TS5_FULLSCREEN_WINDOW, 0);
256 al_toggle_display_flag(_ts5_status.display[_ts5_status.active_display], TS5_FULLSCREEN_WINDOW, 1);
261 TS5_BITMAP **display_buffer;
262 display_buffer = al_realloc(_ts5_status.display_buffer, _ts5_status.num_displays *
sizeof(TS5_BITMAP *));
264 if (display_buffer == NULL) {
265 ts5_fatal(
"ts5_install_display: failed to allocate memory for display buffer pointer\n");
268 _ts5_status.display_buffer = (TS5_BITMAP **) display_buffer;
269 _ts5_status.display_buffer[_ts5_status.active_display] = al_create_bitmap(request.w, request.h);
271 if (!_ts5_status.display_buffer[_ts5_status.active_display]) {
272 ts5_fatal(
"ts5_install_display: could not open display buffer\n");
281 ts5_log(TS5_LOGLEVEL_1,
"ts5_install_display: copying settings\n");
283 TS5_DISPLAY_STATUS *display_status;
284 display_status = al_realloc(_ts5_status.display_status, _ts5_status.num_displays *
sizeof(TS5_DISPLAY_STATUS));
286 if (display_status == NULL) {
287 ts5_fatal(
"ts5_install_display: failed to allocate memory for display settings\n");
290 _ts5_status.display_status = (TS5_DISPLAY_STATUS *) display_status;
291 _ts5_status.display_status[_ts5_status.active_display].adapter = request.adapter;
293 if (request.display_mode==TS5_WINDOWED) {
295 al_get_window_position(_ts5_status.display[_ts5_status.active_display], &request.x, &request.y);
297 if (request.x + request.w > _ts5_status.display_adapter_status[ts5_nextdisplay.adapter].x2) {
299 int oldw = request.w;
300 request.w = _ts5_status.display_adapter_status[ts5_nextdisplay.adapter].x2 - request.x;
301 al_resize_display(_ts5_status.display[_ts5_status.active_display], request.w, request.h);
302 ts5_log(TS5_LOGLEVEL_1,
"ts5_install_display: adjusting display width to %d (was %d)\n",
306 if (request.y + request.h > _ts5_status.display_adapter_status[ts5_nextdisplay.adapter].y2) {
308 int oldh = request.h;
309 request.h = _ts5_status.display_adapter_status[ts5_nextdisplay.adapter].y2 - request.y;
310 al_resize_display(_ts5_status.display[_ts5_status.active_display], request.w, request.h);
311 al_set_window_position(_ts5_status.display[_ts5_status.active_display],
312 request.x, request.y + (request.h-oldh));
314 ts5_log(TS5_LOGLEVEL_1,
"ts5_install_display: adjusting display height to %d (was %d)\n",
317 al_get_window_position(_ts5_status.display[_ts5_status.active_display], &request.x, &request.y);
320 request.x -= _ts5_status.display_adapter_status[request.adapter].x1;
321 request.y -= _ts5_status.display_adapter_status[request.adapter].y1;
323 if (_ts5_status.graphics_status.coordinate_system == TS5_CARTESIAN_COORDINATES) {
324 request.x = request.x - (_ts5_status.display_adapter_status[request.adapter].w - request.w)/2;
325 request.y = (_ts5_status.display_adapter_status[request.adapter].h - request.h)/2 - request.y;
329 _ts5_status.display_status[_ts5_status.active_display].x = request.x;
330 _ts5_status.display_status[_ts5_status.active_display].y = request.y;
331 _ts5_status.display_status[_ts5_status.active_display].w = request.w;
332 _ts5_status.display_status[_ts5_status.active_display].h = request.h;
333 _ts5_status.display_status[_ts5_status.active_display].refreshrate = request.refreshrate;
334 _ts5_status.display_status[_ts5_status.active_display].display_mode = request.display_mode;
335 _ts5_status.display_status[_ts5_status.active_display].vsync_mode = request.vsync_mode;
337 atexit(ts5_uninstall_displays);
345 return _ts5_status.active_display;
359 ts5_check_display(
"ts5_clear_display");
360 ts5_log(TS5_LOGLEVEL_5,
"ts5_clear_display()\n");
362 if (_ts5_status.target == NULL) {
363 ts5_fatal(
"ts5_clear_display: target is a NULL pointer\n");
366 al_clear_to_color(_ts5_status.graphics_status.background_color);
381 ts5_check_display(
"ts5_flip_display");
382 ts5_log(TS5_LOGLEVEL_5,
"ts5_flip_display()\n");
384 al_set_target_backbuffer(_ts5_status.display[_ts5_status.active_display]);
385 al_draw_bitmap(_ts5_status.display_buffer[_ts5_status.active_display], 0.0, 0.0, 0);
387 al_clear_to_color(_ts5_status.graphics_status.background_color);
388 al_set_target_bitmap(_ts5_status.display_buffer[_ts5_status.active_display]);
390 return al_get_time();
421 ts5_check_display2(
"ts5_set_active_display", display);
422 ts5_log(TS5_LOGLEVEL_4,
"ts5_set_active_display(%d)\n", display);
424 int retval = _ts5_status.active_display + 1;
425 _ts5_status.active_display = display - 1;
426 _ts5_status.target = _ts5_status.display_buffer[_ts5_status.active_display];
427 al_set_target_bitmap(_ts5_status.target);
429 _ts5_status.graphics_status.target_width = al_get_bitmap_width(_ts5_status.target);
430 _ts5_status.graphics_status.target_height = al_get_bitmap_height(_ts5_status.target);
445 ts5_check_display(
"ts5_get_active_display");
446 ts5_log(TS5_LOGLEVEL_4,
"ts5_get_active_display()\n");
448 return _ts5_status.active_display + 1;
461 ts5_check_display(
"ts5_set_drawing_target");
462 ts5_log(TS5_LOGLEVEL_4,
"ts5_set_drawing_target(%p)\n", target);
464 if (target == NULL) {
465 ts5_fatal(
"ts5_set_drawing_target: target is a NULL pointer\n");
468 TS5_BITMAP *retval = _ts5_status.target;
469 _ts5_status.target = target;
470 al_set_target_bitmap(_ts5_status.target);
472 _ts5_status.graphics_status.target_width = al_get_bitmap_width(_ts5_status.target);
473 _ts5_status.graphics_status.target_height = al_get_bitmap_height(_ts5_status.target);
486 ts5_check_display(
"ts5_get_drawing_target");
487 ts5_log(TS5_LOGLEVEL_4,
"ts5_get_drawing_target()\n");
489 return _ts5_status.target;
514 ts5_check_display(
"ts5_get_num_display_adapters");
515 ts5_log(TS5_LOGLEVEL_4,
"ts5_get_num_display_adapters()\n");
517 return _ts5_status.num_display_adapters;
536 ts5_check_display(
"ts5_get_display_adapter_size");
537 ts5_log(TS5_LOGLEVEL_4,
"ts5_get_display_adapter_size(%d,%f,%f)\n", adapter, w, h);
542 ts5_fatal(
"ts5_get_display_adapter_size: adapter index not valid\n");
544 else if (adapter == 0) {
545 ww = _ts5_status.display_adapter_status[ts5_nextdisplay.adapter].w;
546 hh = _ts5_status.display_adapter_status[ts5_nextdisplay.adapter].h;
548 else if (adapter <= _ts5_status.num_display_adapters) {
549 ww = _ts5_status.display_adapter_status[adapter-1].w;
550 hh = _ts5_status.display_adapter_status[adapter-1].h;
553 ts5_fatal(
"ts5_get_display_adapter_size: adapter index not valid\n");
577 ts5_check_display(
"ts5_get_display_adapter_width");
578 ts5_log(TS5_LOGLEVEL_4,
"ts5_get_display_adapter_width(%d)\n", adapter);
598 ts5_check_display(
"ts5_get_display_adapter_height");
599 ts5_log(TS5_LOGLEVEL_4,
"ts5_get_display_adapter_height(%d)\n", adapter);
635 ts5_check_display(
"ts5_set_display_adapter");
636 ts5_log(TS5_LOGLEVEL_4,
"ts5_set_display_adapter(%d)\n", adapter);
638 int retval = ts5_nextdisplay.adapter + 1;
640 if (adapter > 0 && adapter <= _ts5_status.num_display_adapters) {
641 ts5_nextdisplay.adapter = adapter - 1;
642 ts5_log(TS5_LOGLEVEL_4,
"ts5_set_display_adapter: set display adapter for next display to %d (was %d)\n",
643 retval-1, ts5_nextdisplay.adapter+1);
646 ts5_fatal (
"ts5_set_display_adapter: adapter index not valid\n");
664 ts5_check_display2(
"ts5_get_display_adapter", display);
665 ts5_log(TS5_LOGLEVEL_4,
"ts5_get_display_adapter(%d)\n", display);
670 retval = ts5_nextdisplay.adapter + 1;
673 retval = _ts5_status.display_status[display-1].adapter + 1;
690 ts5_check_display(
"ts5_set_display_size");
691 ts5_log(TS5_LOGLEVEL_4,
"ts5_set_display_size(%f,%f)\n", w, h);
693 int oldw = ts5_nextdisplay.w;
694 int oldh = ts5_nextdisplay.h;
696 if (_ts5_status.graphics_status.coordinate_scale == TS5_RELATIVE_COORDINATES) {
697 w *= _ts5_status.display_adapter_status[ts5_nextdisplay.adapter].w;
698 h *= _ts5_status.display_adapter_status[ts5_nextdisplay.adapter].h;
701 ts5_nextdisplay.w = w;
702 ts5_nextdisplay.h = h;
704 ts5_log(TS5_LOGLEVEL_4,
"ts5_set_display_size: set display size for next display to %d x %d (was %d x %d)\n",
705 ts5_nextdisplay.w, ts5_nextdisplay.h, oldw, oldh);
722 ts5_check_display2(
"ts5_get_display_size", display);
723 ts5_log(TS5_LOGLEVEL_4,
"ts5_get_display_size(%d,%p,%p)\n", display, w, h);
729 ww = ts5_nextdisplay.w;
730 hh = ts5_nextdisplay.h;
732 if (_ts5_status.graphics_status.coordinate_scale == TS5_RELATIVE_COORDINATES) {
733 ww /= _ts5_status.display_adapter_status[ts5_nextdisplay.adapter].w;
734 hh /= _ts5_status.display_adapter_status[ts5_nextdisplay.adapter].h;
739 ww = _ts5_status.display_status[display-1].w;
740 hh = _ts5_status.display_status[display-1].h;
742 if (_ts5_status.graphics_status.coordinate_scale == TS5_RELATIVE_COORDINATES) {
743 ww /= _ts5_status.display_adapter_status[_ts5_status.display_status[display-1].adapter].w;
744 hh /= _ts5_status.display_adapter_status[_ts5_status.display_status[display-1].adapter].h;
769 ts5_check_display2(
"ts5_get_display_width", display);
770 ts5_log(TS5_LOGLEVEL_4,
"ts5_get_display_width(%d)\n", display);
790 ts5_check_display2(
"ts5_get_display_height", display);
791 ts5_log(TS5_LOGLEVEL_4,
"ts5_get_display_height(%d)\n", display);
814 ts5_check_display(
"ts5_set_display_position");
815 ts5_log(TS5_LOGLEVEL_4,
"ts5_set_display_position(%f,%f)\n", x, y);
817 int oldx = ts5_nextdisplay.x;
818 int oldy = ts5_nextdisplay.y;
820 if (_ts5_status.graphics_status.coordinate_scale == TS5_RELATIVE_COORDINATES) {
822 if (_ts5_status.graphics_status.coordinate_system == TS5_CARTESIAN_COORDINATES) {
823 x *= _ts5_status.display_adapter_status[ts5_nextdisplay.adapter].w/2.0;
824 y *= _ts5_status.display_adapter_status[ts5_nextdisplay.adapter].h/2.0;
827 x *= _ts5_status.display_adapter_status[ts5_nextdisplay.adapter].w;
828 y *= _ts5_status.display_adapter_status[ts5_nextdisplay.adapter].h;
832 if (_ts5_status.graphics_status.coordinate_system == TS5_CARTESIAN_COORDINATES) {
834 x += _ts5_status.display_adapter_status[ts5_nextdisplay.adapter].w/2;
835 x -= ts5_nextdisplay.w/2;
837 y += _ts5_status.display_adapter_status[ts5_nextdisplay.adapter].h/2;
838 y -= ts5_nextdisplay.h/2;
841 x += _ts5_status.display_adapter_status[ts5_nextdisplay.adapter].x1;
842 y += _ts5_status.display_adapter_status[ts5_nextdisplay.adapter].y1;
844 ts5_nextdisplay.x = x;
845 ts5_nextdisplay.y = y;
847 ts5_log(TS5_LOGLEVEL_4,
"ts5_set_display_position: set display position for next display to (%d,%d) (was (%d,%d))\n",
848 ts5_nextdisplay.x, ts5_nextdisplay.y, oldx, oldy);
867 ts5_check_display2(
"ts5_get_display_position", display);
868 ts5_log(TS5_LOGLEVEL_4,
"ts5_get_display_position(%d,%p,%p)\n", display, x, y);
871 double dw, dh, aw, ah;
877 al_get_window_position(_ts5_status.display[display-1],
878 &_ts5_status.display_status[display-1].x,
879 &_ts5_status.display_status[display-1].y);
881 xx = _ts5_status.display_status[display-1].x;
882 yy = _ts5_status.display_status[display-1].y;
884 xx -= _ts5_status.display_adapter_status[adapter].x1;
885 yy -= _ts5_status.display_adapter_status[adapter].y1;
887 dw = _ts5_status.display_status[display-1].w;
888 dh = _ts5_status.display_status[display-1].h;
890 aw = _ts5_status.display_adapter_status[adapter].w;
891 ah = _ts5_status.display_adapter_status[adapter].h;
895 xx = ts5_nextdisplay.x;
896 yy = ts5_nextdisplay.y;
898 dw = ts5_nextdisplay.w;
899 dh = ts5_nextdisplay.h;
901 aw = _ts5_status.display_adapter_status[ts5_nextdisplay.adapter].w;
902 ah = _ts5_status.display_adapter_status[ts5_nextdisplay.adapter].h;
906 if (xx!=-1 && yy!=-1) {
909 if (_ts5_status.graphics_status.coordinate_system == TS5_CARTESIAN_COORDINATES) {
910 xx = xx + dw/2.0 - aw/ 2.0;
911 yy = ah/2.0 - yy - dh/2.0;
915 if (_ts5_status.graphics_status.coordinate_scale == TS5_RELATIVE_COORDINATES) {
917 if (_ts5_status.graphics_status.coordinate_system == TS5_CARTESIAN_COORDINATES) {
948 ts5_check_display2(
"ts5_get_display_x", display);
949 ts5_log(TS5_LOGLEVEL_4,
"ts5_get_display_x(%d)\n", display);
968 ts5_check_display2(
"ts5_get_display_y", display);
969 ts5_log(TS5_LOGLEVEL_4,
"ts5_get_display_y(%d)\n", display);
995 ts5_check_display(
"ts5_set_refreshrate");
996 ts5_log(TS5_LOGLEVEL_4,
"ts5_set_refreshrate(%d)\n", rate);
998 int retval = ts5_nextdisplay.refreshrate;
1000 ts5_nextdisplay.refreshrate = rate;
1002 ts5_log(TS5_LOGLEVEL_4,
"ts5_set_refreshrate: set refreshrate for next display to %d (was %d)\n",
1003 ts5_nextdisplay.refreshrate, retval);
1019 ts5_check_display2(
"ts5_get_refreshrate", display);
1020 ts5_log(TS5_LOGLEVEL_4,
"ts5_get_refreshrate(%d)\n", display);
1025 retval = ts5_nextdisplay.refreshrate;
1028 retval = _ts5_status.display_status[display-1].refreshrate;
1058 ts5_check_display(
"ts5_set_display_mode");
1059 ts5_log(TS5_LOGLEVEL_4,
"ts5_set_display_mode(%d)\n", mode);
1061 int retval = ts5_nextdisplay.display_mode;
1063 if (mode != TS5_WINDOWED && mode != TS5_FULLSCREEN && mode != TS5_FULLSCREEN_WINDOW) {
1064 ts5_fatal (
"ts5_set_display_mode: requested display mode not available (%d)\n", mode);
1069 ts5_nextdisplay.display_mode = mode;
1071 ts5_log(TS5_LOGLEVEL_4,
"ts5_set_display_mode: set display mode for next display to %d (was %d)\n",
1072 ts5_nextdisplay.display_mode, retval);
1089 ts5_check_display2(
"ts5_get_display_mode", display);
1090 ts5_log(TS5_LOGLEVEL_4,
"ts5_get_display_mode(%d)\n", display);
1095 retval = ts5_nextdisplay.display_mode;
1098 retval = _ts5_status.display_status[display-1].display_mode;
1116 ts5_check_display(
"ts5_set_vsync_mode");
1117 ts5_log(TS5_LOGLEVEL_4,
"ts5_set_vsync_mode(%d)\n", mode);
1119 int retval = ts5_nextdisplay.vsync_mode;
1121 if (mode < TS5_VSYNC_WHATEVER || mode > TS5_VSYNC_OFF) {
1122 ts5_fatal(
"ts5_set_vsync_mode: mode should be 0, 1 or 2 (is %d)\n", mode);
1125 ts5_nextdisplay.vsync_mode = mode;
1127 ts5_log(TS5_LOGLEVEL_4,
"ts5_set_vsync_mode: set vsync mode for next display to %d (was %d)\n",
1128 ts5_nextdisplay.vsync_mode, retval);
1145 ts5_check_display2(
"ts5_get_vsync_mode", display);
1146 ts5_log(TS5_LOGLEVEL_4,
"ts5_get_vsync_mode(%d)\n", display);
1151 retval = ts5_nextdisplay.vsync_mode;
1154 retval = _ts5_status.display_status[display-1].vsync_mode;