From: Alex Wu <[email protected]>

Using the switch_mode hook to change the display mode.
---
 src/shell.c |   34 +++++++++++++++++++++++++++++++++-
 1 files changed, 33 insertions(+), 1 deletions(-)

diff --git a/src/shell.c b/src/shell.c
index 5d2c239..c8cb41e 100644
--- a/src/shell.c
+++ b/src/shell.c
@@ -121,6 +121,7 @@ struct shell_surface {
                struct weston_transform transform; /* matrix from x, y */
                uint32_t framerate;
                struct weston_surface *black_surface;
+               struct weston_mode *saved_mode;
        } fullscreen;
 
        struct weston_output *fullscreen_output;
@@ -372,6 +373,14 @@ static void
 shell_unset_fullscreen(struct shell_surface *shsurf)
 {
        /* undo all fullscreen things here */
+       if (shsurf->fullscreen.saved_mode) {
+               
shsurf->fullscreen_output->switch_mode(shsurf->fullscreen_output,
+                               shsurf->fullscreen.saved_mode->width, 
+                               shsurf->fullscreen.saved_mode->height, 
+                               shsurf->fullscreen.saved_mode->refresh);
+               shsurf->fullscreen.saved_mode = NULL;
+       }
+
        shsurf->fullscreen.type = WL_SHELL_SURFACE_FULLSCREEN_METHOD_DEFAULT;
        shsurf->fullscreen.framerate = 0;
        wl_list_remove(&shsurf->fullscreen.transform.link);
@@ -572,7 +581,23 @@ shell_configure_fullscreen(struct shell_surface *shsurf)
                weston_surface_set_position(surface, output->x, output->y);
                break;
        case WL_SHELL_SURFACE_FULLSCREEN_METHOD_DRIVER:
-               break;
+               if (output->current->width == surface->geometry.width &&
+                   output->current->height == surface->geometry.height)
+                       break;
+
+               shsurf->fullscreen.saved_mode = output->current;
+               if (output->switch_mode && 
+                   output->switch_mode(output,
+                                       surface->geometry.width,
+                                       surface->geometry.height,
+                                       shsurf->fullscreen.framerate) == 0) {
+                       weston_surface_set_position(surface, output->x, 
output->y);
+                       break;
+               } else {
+                       shsurf->fullscreen.saved_mode = NULL;
+                       fprintf(stderr, "failed to switch to mode (%dx%d, %u), 
fallback to FILL method.\n",
+                               surface->geometry.width,  
surface->geometry.height, shsurf->fullscreen.framerate);
+               }
        case WL_SHELL_SURFACE_FULLSCREEN_METHOD_FILL:
                break;
        default:
@@ -774,6 +799,12 @@ destroy_shell_surface(struct wl_resource *resource)
        if (shsurf->surface)
                wl_list_remove(&shsurf->surface_destroy_listener.link);
 
+       if (shsurf->fullscreen.saved_mode)
+               
shsurf->fullscreen_output->switch_mode(shsurf->fullscreen_output,
+                                                      
shsurf->fullscreen.saved_mode->width, 
+                                                      
shsurf->fullscreen.saved_mode->height, 
+                                                      
shsurf->fullscreen.saved_mode->refresh);
+
        wl_list_remove(&shsurf->link);
        free(shsurf);
 }
@@ -841,6 +872,7 @@ shell_get_shell_surface(struct wl_client *client,
        shsurf->fullscreen.type = WL_SHELL_SURFACE_FULLSCREEN_METHOD_DEFAULT;
        shsurf->fullscreen.framerate = 0;
        shsurf->fullscreen.black_surface = NULL;
+       shsurf->fullscreen.saved_mode = NULL;
        wl_list_init(&shsurf->fullscreen.transform.link);
 
        shsurf->surface_destroy_listener.func = shell_handle_surface_destroy;
-- 
1.7.5.4

_______________________________________________
wayland-devel mailing list
[email protected]
http://lists.freedesktop.org/mailman/listinfo/wayland-devel

Reply via email to