diff --git a/include/ui/sdl2.h b/include/ui/sdl2.h
index 84c27f0..fd6bfdd 100644
--- a/include/ui/sdl2.h
+++ b/include/ui/sdl2.h
@@ -13,11 +13,17 @@ struct sdl2_console {
     int hidden;
 };
 
+void sdl2_window_create(struct sdl2_console *scon);
+void sdl2_window_destroy(struct sdl2_console *scon);
+void sdl2_window_resize(struct sdl2_console *scon);
+
 void sdl2_reset_keys(struct sdl2_console *scon);
 void sdl2_process_key(struct sdl2_console *scon,
                       SDL_KeyboardEvent *ev);
 
 void sdl2_2d_update(DisplayChangeListener *dcl,
                     int x, int y, int w, int h);
+void sdl2_2d_switch(DisplayChangeListener *dcl,
+                    DisplaySurface *new_surface);
 
 #endif /* SDL2_H */
diff --git a/ui/sdl2-2d.c b/ui/sdl2-2d.c
index 7b0039b..29ada53 100644
--- a/ui/sdl2-2d.c
+++ b/ui/sdl2-2d.c
@@ -59,3 +59,45 @@ void sdl2_2d_update(DisplayChangeListener *dcl,
     SDL_RenderCopy(scon->real_renderer, scon->texture, &rect, &rect);
     SDL_RenderPresent(scon->real_renderer);
 }
+
+void sdl2_2d_switch(DisplayChangeListener *dcl,
+                    DisplaySurface *new_surface)
+{
+    struct sdl2_console *scon = container_of(dcl, struct sdl2_console, dcl);
+    DisplaySurface *old_surface = scon->surface;
+    int format = 0;
+
+    scon->surface = new_surface;
+
+    if (scon->texture) {
+        SDL_DestroyTexture(scon->texture);
+        scon->texture = NULL;
+    }
+
+    if (!new_surface) {
+        sdl2_window_destroy(scon);
+        return;
+    }
+
+    if (!scon->real_window) {
+        sdl2_window_create(scon);
+    } else if (old_surface &&
+               ((surface_width(old_surface)  != surface_width(new_surface)) ||
+                (surface_height(old_surface) != surface_height(new_surface)))) {
+        sdl2_window_resize(scon);
+    }
+
+    SDL_RenderSetLogicalSize(scon->real_renderer,
+                             surface_width(new_surface),
+                             surface_height(new_surface));
+
+    if (surface_bits_per_pixel(scon->surface) == 16) {
+        format = SDL_PIXELFORMAT_RGB565;
+    } else if (surface_bits_per_pixel(scon->surface) == 32) {
+        format = SDL_PIXELFORMAT_ARGB8888;
+    }
+    scon->texture = SDL_CreateTexture(scon->real_renderer, format,
+                                      SDL_TEXTUREACCESS_STREAMING,
+                                      surface_width(new_surface),
+                                      surface_height(new_surface));
+}
diff --git a/ui/sdl2.c b/ui/sdl2.c
index 59b67a6..eff9cb3 100644
--- a/ui/sdl2.c
+++ b/ui/sdl2.c
@@ -68,7 +68,7 @@ static struct sdl2_console *get_scon_from_window(uint32_t window_id)
     return NULL;
 }
 
-static void sdl2_window_create(struct sdl2_console *scon)
+void sdl2_window_create(struct sdl2_console *scon)
 {
     int flags = 0;
 
@@ -95,7 +95,7 @@ static void sdl2_window_create(struct sdl2_console *scon)
     sdl_update_caption(scon);
 }
 
-static void sdl2_window_destroy(struct sdl2_console *scon)
+void sdl2_window_destroy(struct sdl2_console *scon)
 {
     if (!scon->real_window) {
         return;
@@ -107,7 +107,7 @@ static void sdl2_window_destroy(struct sdl2_console *scon)
     scon->real_window = NULL;
 }
 
-static void sdl2_window_resize(struct sdl2_console *scon)
+void sdl2_window_resize(struct sdl2_console *scon)
 {
     if (!scon->real_window) {
         return;
@@ -118,48 +118,6 @@ static void sdl2_window_resize(struct sdl2_console *scon)
                       surface_height(scon->surface));
 }
 
-static void sdl_switch(DisplayChangeListener *dcl,
-                       DisplaySurface *new_surface)
-{
-    struct sdl2_console *scon = container_of(dcl, struct sdl2_console, dcl);
-    DisplaySurface *old_surface = scon->surface;
-    int format = 0;
-
-    scon->surface = new_surface;
-
-    if (scon->texture) {
-        SDL_DestroyTexture(scon->texture);
-        scon->texture = NULL;
-    }
-
-    if (!new_surface) {
-        sdl2_window_destroy(scon);
-        return;
-    }
-
-    if (!scon->real_window) {
-        sdl2_window_create(scon);
-    } else if (old_surface &&
-               ((surface_width(old_surface)  != surface_width(new_surface)) ||
-                (surface_height(old_surface) != surface_height(new_surface)))) {
-        sdl2_window_resize(scon);
-    }
-
-    SDL_RenderSetLogicalSize(scon->real_renderer,
-                             surface_width(new_surface),
-                             surface_height(new_surface));
-
-    if (surface_bits_per_pixel(scon->surface) == 16) {
-        format = SDL_PIXELFORMAT_RGB565;
-    } else if (surface_bits_per_pixel(scon->surface) == 32) {
-        format = SDL_PIXELFORMAT_ARGB8888;
-    }
-    scon->texture = SDL_CreateTexture(scon->real_renderer, format,
-                                      SDL_TEXTUREACCESS_STREAMING,
-                                      surface_width(new_surface),
-                                      surface_height(new_surface));
-}
-
 static void sdl_update_caption(struct sdl2_console *scon)
 {
     char win_title[1024];
@@ -710,7 +668,7 @@ static void sdl_cleanup(void)
 static const DisplayChangeListenerOps dcl_2d_ops = {
     .dpy_name          = "sdl2-2d",
     .dpy_gfx_update    = sdl2_2d_update,
-    .dpy_gfx_switch    = sdl_switch,
+    .dpy_gfx_switch    = sdl2_2d_switch,
     .dpy_refresh       = sdl_refresh,
     .dpy_mouse_set     = sdl_mouse_warp,
     .dpy_cursor_define = sdl_mouse_define,
