diff --git a/gfx/display_servers/dispserv_null.c b/gfx/display_servers/dispserv_null.c index 22b326cbda..8e17292762 100644 --- a/gfx/display_servers/dispserv_null.c +++ b/gfx/display_servers/dispserv_null.c @@ -48,9 +48,10 @@ const video_display_server_t dispserv_null = { null_display_server_destroy, null_display_server_set_window_opacity, null_display_server_set_window_progress, - NULL, - NULL, - NULL, + NULL, /* set_window_decorations */ + NULL, /* set_resolution */ + NULL, /* get_resolution_list */ + NULL, /* get_output_options */ "null" }; diff --git a/gfx/display_servers/dispserv_win32.c b/gfx/display_servers/dispserv_win32.c index 97469906c6..da7e1f4508 100644 --- a/gfx/display_servers/dispserv_win32.c +++ b/gfx/display_servers/dispserv_win32.c @@ -282,6 +282,39 @@ static bool win32_display_server_set_resolution(void *data, return true; } +unsigned win32_display_server_get_resolution_list(struct video_display_config **conf) +{ + unsigned i; + unsigned len = 0; + + for (i = 0;; i++) + { + void *optr = NULL; + DEVMODE dm; + + if (!win32_get_video_output(&dm, i, sizeof(dm))) + continue; + + len++; + + if (*conf) + optr = realloc(*conf, len); + else + optr = malloc(len); + + if (optr) + *conf = optr; + + conf[i]->width = dm.dmPelsWidth; + conf[i]->height = dm.dmPelsHeight; + conf[i]->bpp = dm.dmBitsPerPel; + conf[i]->refreshrate = dm.dmDisplayFrequency; + conf[i]->idx = i; + } + + return len; +} + const video_display_server_t dispserv_win32 = { win32_display_server_init, win32_display_server_destroy, @@ -289,6 +322,7 @@ const video_display_server_t dispserv_win32 = { win32_display_server_set_window_progress, win32_display_server_set_window_decorations, win32_display_server_set_resolution, + win32_display_server_get_resolution_list, NULL, /* get_output_options */ "win32" }; diff --git a/gfx/display_servers/dispserv_x11.c b/gfx/display_servers/dispserv_x11.c index f4f6f16f7a..92dcf34d4b 100644 --- a/gfx/display_servers/dispserv_x11.c +++ b/gfx/display_servers/dispserv_x11.c @@ -306,9 +306,10 @@ const video_display_server_t dispserv_x11 = { x11_display_server_init, x11_display_server_destroy, x11_display_server_set_window_opacity, - NULL, + NULL, /* set_window_progress */ x11_display_server_set_window_decorations, x11_display_server_set_resolution, + NULL, /* get_resolution_list */ x11_display_server_get_output_options, "x11" }; diff --git a/gfx/video_display_server.h b/gfx/video_display_server.h index 9a39100807..ee8ddf7266 100644 --- a/gfx/video_display_server.h +++ b/gfx/video_display_server.h @@ -23,6 +23,16 @@ RETRO_BEGIN_DECLS +typedef struct video_display_config +{ + unsigned width; + unsigned height; + unsigned bpp; + unsigned refreshrate; + unsigned idx; + bool current; +} video_display_config_t; + typedef struct video_display_server { void *(*init)(void); @@ -32,6 +42,7 @@ typedef struct video_display_server bool (*set_window_decorations)(void *data, bool on); bool (*switch_resolution)(void *data, unsigned width, unsigned height, int int_hz, float hz, int center); + unsigned (*get_resolution_list)(struct video_display_config **conf); const char *(*get_output_options)(void *data); const char *ident; } video_display_server_t;