aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorLei Li <lilei@linux.vnet.ibm.com>2013-09-04 17:07:16 +0800
committerAnthony Liguori <aliguori@amazon.com>2013-11-06 21:47:13 -0800
commit898ae2846de4dcb19da0b80f99ef2215dd137e56 (patch)
tree0e0593e998a5cd198843606b07f833e2647da534
parent5f3e31012e334f3410e04abae7f88565df17c91a (diff)
downloadqemu-898ae2846de4dcb19da0b80f99ef2215dd137e56.tar.gz
sdl: Reverse support for video mode setting
Currently, If the setting of video mode failed, qemu will exit. It should go back to the previous setting if the new screen resolution failed. This patch fixes LP#1216368, add support to revert to existing surface for the failure of video mode setting. Reported-by: Sascha Krissler <sascha@srlabs.de> Signed-off-by: Lei Li <lilei@linux.vnet.ibm.com> Reviewed-by: Paolo Bonzini <pbonzini@redhat.com> Message-id: 1378285636-7091-1-git-send-email-lilei@linux.vnet.ibm.com Signed-off-by: Anthony Liguori <aliguori@amazon.com>
-rw-r--r--ui/sdl.c23
1 files changed, 19 insertions, 4 deletions
diff --git a/ui/sdl.c b/ui/sdl.c
index 39a42d6b0c2..9d8583c4e6a 100644
--- a/ui/sdl.c
+++ b/ui/sdl.c
@@ -86,6 +86,7 @@ static void sdl_update(DisplayChangeListener *dcl,
static void do_sdl_resize(int width, int height, int bpp)
{
int flags;
+ SDL_Surface *tmp_screen;
// printf("resizing to %d %d\n", w, h);
@@ -98,12 +99,26 @@ static void do_sdl_resize(int width, int height, int bpp)
if (gui_noframe)
flags |= SDL_NOFRAME;
- real_screen = SDL_SetVideoMode(width, height, bpp, flags);
+ tmp_screen = SDL_SetVideoMode(width, height, bpp, flags);
if (!real_screen) {
- fprintf(stderr, "Could not open SDL display (%dx%dx%d): %s\n", width,
- height, bpp, SDL_GetError());
- exit(1);
+ if (!tmp_screen) {
+ fprintf(stderr, "Could not open SDL display (%dx%dx%d): %s\n",
+ width, height, bpp, SDL_GetError());
+ exit(1);
+ }
+ } else {
+ /*
+ * Revert to the previous video mode if the change of resizing or
+ * resolution failed.
+ */
+ if (!tmp_screen) {
+ fprintf(stderr, "Failed to set SDL display (%dx%dx%d): %s\n",
+ width, height, bpp, SDL_GetError());
+ return;
+ }
}
+
+ real_screen = tmp_screen;
}
static void sdl_switch(DisplayChangeListener *dcl,