|
[A5] al_get_desktop_resolution / available resolutions |
Edgar Reynaldo
Major Reynaldo
May 2007
|
Is a function to retrieve the native desktop resolution planned to be included in Allegro 5? I'm asking this because the most reliable way to get a display going is to use the native fullscreen mode of the computer. Also, will there be a way to get a list of the supported resolutions in A5 the way there was with Allegro 4? My Website! | EAGLE GUI Library Demos | My Deviant Art Gallery | Spiraloid Preview | A4 FontMaker | Skyline! (Missile Defense) Eagle and Allegro 5 binaries | Older Allegro 4 and 5 binaries | Allegro 5 compile guide |
Thomas Fjellstrom
Member #476
June 2000
|
I believe the first mode given from the mode enumeration stuff is usually the current one, but theres also al_get_monitor_info. You can get the width and height of each monitor via that. Also, if you're always just going to set the desktop mode, forget a normal ALLEGRO_FULLSCREEN window, use ALLEGRO_FULLSCREEN_WINDOW instead. That will always create a window the size of the screen regardless of what you passed to al_create_display, and will skip any mode set. Edgar Reynaldo said: Also, will there be a way to get a list of the supported resolutions in A5 the way there was with Allegro 4? Yes. al_get_display_mode. -- |
Edgar Reynaldo
Major Reynaldo
May 2007
|
I looked at the manual, but I must be blind since I missed both those functions. Okay, so I would use something like this to set a desktop sized fullscreen display and to enumerate the modes available, right? : 1/// Set up a fullscreen display using the desktop width and height
2int nva = al_get_num_video_adapters();
3if (nva < 1) {return 0;}
4
5ALLEGRO_MONITOR_INFO aminfo;
6al_get_monitor_info(0 , &aminfo);
7int desktop_width = aminfo.x2 - aminfo.x1 + 1;
8int desktop_height = aminfo.y2 - aminfo.y1 + 1;
9
10al_set_new_display_flags(ALLEGRO_FULLSCREEN);
11ALLEGRO_DISPLAY* display = al_create_display(desktop_width , desktop_height);
12if (!display) {return 0;}
13
14/// Enumerate available modes
15int mode_flags[3] = {
16 ALLEGRO_FULLSCREEN | ALLEGRO_DIRECT3D ,
17 ALLEGRO_FULLSCREEN | ALLEGRO_OPENGL ,
18 ALLEGRO_FULLSCREEN | ALLEGRO_OPENGL_3_0
19};
20const char* mode_driver_text[3] = {
21 "ALLEGRO_DIRECT3D",
22 "ALLEGRO_OPENGL",
23 "ALLEGRO_OPENGL_3_0"
24};
25for (int i = 0 ; i < 3 ; i++) {
26 al_set_new_display_flags(mode_flags[i]);
27 output_log << "Modes available for " << mode_driver_text[i] << " :" << endl;
28 int num_modes = al_get_num_display_modes();
29 for (int j = 0 ; j < num_modes ; ++j) {
30 ALLEGRO_DISPLAY_MODE admode;
31 if (al_get_display_mode(j , &admode) == &admode) {
32 output_log << admode.width << " X " << admode.height << " @ ";
33 output_log << admode.refresh_rate << "Hz using";
34 PrintPixelFormat(output_log , admode.format);
35 output_log << endl;
36 }
37 }
38}
Thomas Fjellstrom said: Also, if you're always just going to set the desktop mode, forget a normal ALLEGRO_FULLSCREEN window, use ALLEGRO_FULLSCREEN_WINDOW instead. About your suggestion to use ALLEGRO_FULLSCREEN_WINDOW instead of ALLEGRO_FULLSCREEN - does using that mode preserve the contents of video memory when the user switches away from the program using Alt-Tab? My Website! | EAGLE GUI Library Demos | My Deviant Art Gallery | Spiraloid Preview | A4 FontMaker | Skyline! (Missile Defense) Eagle and Allegro 5 binaries | Older Allegro 4 and 5 binaries | Allegro 5 compile guide |
Thomas Fjellstrom
Member #476
June 2000
|
Edgar Reynaldo said: Okay, so I would use something like this to set a desktop sized fullscreen display and to enumerate the modes available, right? I suppose you could use something like that. Quote: About your suggestion to use ALLEGRO_FULLSCREEN_WINDOW instead of ALLEGRO_FULLSCREEN - does using that mode preserve the contents of video memory when the user switches away from the program using Alt-Tab? I believe so. And even if it doesn't, just make sure you handle the ALLEGRO_EVENT_DISPLAY_LOST and ALLEGRO_EVENT_DISPLAY_FOUND events, and redraw when you get the latter event. -- |
Matthew Leverton
Supreme Loser
January 1999
|
void get_desktop_resolution(int adapter, int *w, int *h) { ALLEGRO_MONITOR_INFO info; al_get_monitor_info(adapter, &info); *w = info.x2 - info.x1; *h = info.y2 - info.y1; } Side note: maybe al_get_monitor_info() and similar void functions should instead return false if the adapter is out of range. |
Elias
Member #358
May 2000
|
Maybe we should have al_get_desktop_resolution(monitor, *w, *h) and al_get_desktop_position(monitor, *x, *y) instead of al_get_monitor_info, since this question seems to come up repeatedly And I agree about the return value - right now you're more or less required to call al_get_num_video_adapters before calling al_get_monitor_info. -- |
Edgar Reynaldo
Major Reynaldo
May 2007
|
Matthew Leverton said: Side note: maybe al_get_monitor_info() and similar void functions should instead return false if the adapter is out of range. I agree, if that happens to matter. The manual entry for ALLEGRO_MONITOR_INFO doesn't specify whether x2 and y2 are inclusive or exclusive. Are they the bottom right pixel or one past it? It makes a difference when calculating the width and height of the monitor, so I thought I'd ask. My Website! | EAGLE GUI Library Demos | My Deviant Art Gallery | Spiraloid Preview | A4 FontMaker | Skyline! (Missile Defense) Eagle and Allegro 5 binaries | Older Allegro 4 and 5 binaries | Allegro 5 compile guide |
Matthew Leverton
Supreme Loser
January 1999
|
Edgar Reynaldo said: Are they the bottom right pixel or one past it? It's "one past." So you don't need to add 1 to get the correct sizes. Elias said: Maybe we should have al_get_desktop_resolution(monitor, *w, *h) and al_get_desktop_position(monitor, *x, *y) instead of al_get_monitor_info I prefer the A5 functions. Seems less hacky than using multiple integer pointers. |
|