diff -Naur snes9x-1.51-src/unix/unix.cpp snes9x-1.51-src/unix/unix.cpp --- snes9x-1.51-src/unix/unix.cpp 2007-05-11 01:51:58.000000000 -0700 +++ snes9x-1.51-src/unix/unix.cpp 2007-05-11 01:52:09.000000000 -0700 @@ -574,8 +574,6 @@ S9xInitInputDevices (); S9xInitDisplay (argc, argv); - if (!S9xGraphicsInit ()) - OutOfMemory (); S9xSetupDefaultKeymap(); S9xTextMode (); @@ -748,6 +746,7 @@ (*CleanUp7110)(); S9xSetSoundMute (TRUE); + S9xUnmapAllControls (); S9xDeinitDisplay (); Memory.SaveSRAM (S9xGetFilename (".srm", SRAM_DIR)); S9xSaveCheatFile (S9xGetFilename (".cht", PATCH_DIR)); diff -Naur snes9x-1.51-src/unix/x11.cpp snes9x-1.51-src/unix/x11.cpp --- snes9x-1.51-src/unix/x11.cpp 2007-05-11 02:10:22.000000000 -0700 +++ snes9x-1.51-src/unix/x11.cpp 2007-05-11 02:10:31.000000000 -0700 @@ -275,6 +275,7 @@ void Convert16To24 (int width, int height); void Convert16To24Packed (int width, int height); void SetupImage (); +void TakedownImage (); int ErrorHandler (Display *, XErrorEvent *); void TVMode (int width, int height); @@ -314,36 +315,7 @@ #endif S9xTextMode (); - uint32 i; - - for (i = 0; i < sizeof (GUI.to_free) / sizeof (GUI.to_free [0]); i++) - if (GUI.to_free [i]) - { - free (GUI.to_free [i]); - GUI.to_free [i] = NULL; - } - - if (GUI.image) - { -#ifdef MITSHM - if (GUI.use_shared_memory) - { - XShmDetach (GUI.display, &GUI.sm_info); - GUI.image->data = NULL; - XDestroyImage (GUI.image); - if (GUI.sm_info.shmaddr) - shmdt (GUI.sm_info.shmaddr); - if (GUI.sm_info.shmid >= 0) - shmctl (GUI.sm_info.shmid, IPC_RMID, 0); - GUI.image = NULL; - } - else -#endif - { - XDestroyImage (GUI.image); - GUI.image = NULL; - } - } + TakedownImage (); XSync (GUI.display, False); XCloseDisplay (GUI.display); } @@ -715,36 +687,7 @@ ; } - uint32 i; - - for (i = 0; i < sizeof (GUI.to_free) / sizeof (GUI.to_free [0]); i++) - if (GUI.to_free [i]) - { - free (GUI.to_free [i]); - GUI.to_free [i] = NULL; - } - - if (GUI.image) - { -#ifdef MITSHM - if (GUI.use_shared_memory) - { - XShmDetach (GUI.display, &GUI.sm_info); - GUI.image->data = NULL; - XDestroyImage (GUI.image); - if (GUI.sm_info.shmaddr) - shmdt (GUI.sm_info.shmaddr); - if (GUI.sm_info.shmid >= 0) - shmctl (GUI.sm_info.shmid, IPC_RMID, 0); - GUI.image = NULL; - } - else -#endif - { - XDestroyImage (GUI.image); - GUI.image = NULL; - } - } + TakedownImage (); #ifdef MITSHM GUI.use_shared_memory = 1; @@ -884,8 +827,47 @@ } GUI.image_date = (uint8 *) GUI.image->data; GUI.bytes_per_line = GUI.image->bytes_per_line; + + S9xGraphicsInit (); +} + +void TakedownImage () +{ + uint32 i; + + for (i = 0; i < sizeof (GUI.to_free) / sizeof (GUI.to_free [0]); i++) + if (GUI.to_free [i]) + { + free (GUI.to_free [i]); + GUI.to_free [i] = NULL; + } + + if (GUI.image) + { +#ifdef MITSHM + if (GUI.use_shared_memory) + { + XShmDetach (GUI.display, &GUI.sm_info); + GUI.image->data = NULL; + XDestroyImage (GUI.image); + if (GUI.sm_info.shmaddr) + shmdt (GUI.sm_info.shmaddr); + if (GUI.sm_info.shmid >= 0) + shmctl (GUI.sm_info.shmid, IPC_RMID, 0); + GUI.image = NULL; + } + else +#endif + { + XDestroyImage (GUI.image); + GUI.image = NULL; + } + } + + S9xGraphicsDeinit (); } + int ErrorHandler (Display *, XErrorEvent *) { #ifdef MITSHM @@ -1002,6 +984,8 @@ IPPU.RenderThisFrame = TRUE; IPPU.FrameSkip = Settings.SkipFrames; SetupImage (); + extern void S9xReRefresh(); + S9xReRefresh (); } #ifdef USE_DGA_EXTENSION if (XF86.start_full_screen) diff -Naur snes9x-1.51-src/unix/xf86.cpp snes9x-1.51-src/unix/xf86.cpp --- snes9x-1.51-src/unix/xf86.cpp 2007-05-11 01:51:58.000000000 -0700 +++ snes9x-1.51-src/unix/xf86.cpp 2007-05-11 01:52:09.000000000 -0700 @@ -404,6 +404,8 @@ break; } ourvideo.scrnBegin = ourvideo.vidMemBegin + (320 - IMAGE_WIDTH) * ourvideo.screendepth / 2 + ourvideo.width * ourvideo.screendepth * 8; + + S9xGraphicsInit (); } void S9xGraphicsMode ()