diff options
author | Jasper St. Pierre <jstpierre@mecheye.net> | 2014-02-08 18:29:49 -0500 |
---|---|---|
committer | Kristian Høgsberg <krh@bitplanet.net> | 2014-02-19 09:50:40 -0800 |
commit | 8c6aa45f97149782914d8002e0f717251b0387d2 (patch) | |
tree | f54642cf5e9d89b0b9b0de562842336684a0ceef /clients | |
parent | ed7cae34251fc5fb3208870501f8e3fde6c157f2 (diff) | |
download | weston-8c6aa45f97149782914d8002e0f717251b0387d2.tar.gz |
xdg-shell: Replace the set_* atrocity with a new approach
Rather than require that the client implement two methods for every state,
simply have one global request, change_state, and one global event,
request_change_state.
Diffstat (limited to 'clients')
-rw-r--r-- | clients/simple-egl.c | 86 | ||||
-rw-r--r-- | clients/simple-shm.c | 25 | ||||
-rw-r--r-- | clients/window.c | 101 |
3 files changed, 58 insertions, 154 deletions
diff --git a/clients/simple-egl.c b/clients/simple-egl.c index b00b2cc5..675662f0 100644 --- a/clients/simple-egl.c +++ b/clients/simple-egl.c @@ -95,7 +95,7 @@ struct window { struct xdg_surface *xdg_surface; EGLSurface egl_surface; struct wl_callback *callback; - int fullscreen, configured, opaque, buffer_size, frame_sync; + int fullscreen, opaque, buffer_size, frame_sync; }; static const char *vert_shader_text = @@ -281,23 +281,25 @@ handle_surface_configure(void *data, struct xdg_surface *surface, } static void -handle_surface_request_set_maximized(void *data, struct xdg_surface *xdg_surface) +handle_surface_change_state(void *data, struct xdg_surface *xdg_surface, + uint32_t state, + uint32_t value, + uint32_t serial) { -} + struct window *window = data; -static void -handle_surface_request_unset_maximized(void *data, struct xdg_surface *xdg_surface) -{ -} + switch (state) { + case XDG_SURFACE_STATE_FULLSCREEN: + window->fullscreen = value; -static void -handle_surface_request_set_fullscreen(void *data, struct xdg_surface *xdg_surface) -{ -} + if (!value) + handle_surface_configure(window, window->xdg_surface, + window->window_size.width, + window->window_size.height); + break; + } -static void -handle_surface_request_unset_fullscreen(void *data, struct xdg_surface *xdg_surface) -{ + xdg_surface_ack_change_state(xdg_surface, state, value, serial); } static void @@ -318,54 +320,13 @@ handle_surface_delete(void *data, struct xdg_surface *xdg_surface) static const struct xdg_surface_listener xdg_surface_listener = { handle_surface_configure, - handle_surface_request_set_maximized, - handle_surface_request_unset_maximized, - handle_surface_request_set_fullscreen, - handle_surface_request_unset_fullscreen, + handle_surface_change_state, handle_surface_activated, handle_surface_deactivated, handle_surface_delete, }; static void -configure_callback(void *data, struct wl_callback *callback, uint32_t time) -{ - struct window *window = data; - - wl_callback_destroy(callback); - - window->configured = 1; -} - -static struct wl_callback_listener configure_callback_listener = { - configure_callback, -}; - -static void -set_fullscreen(struct window *window, int fullscreen) -{ - struct wl_callback *callback; - - window->fullscreen = fullscreen; - window->configured = 0; - - if (fullscreen) { - xdg_surface_set_fullscreen(window->xdg_surface); - callback = wl_display_sync(window->display->display); - wl_callback_add_listener(callback, - &configure_callback_listener, - window); - - } else { - xdg_surface_unset_fullscreen(window->xdg_surface); - handle_surface_configure(window, window->xdg_surface, - window->window_size.width, - window->window_size.height); - window->configured = 1; - } -} - -static void create_surface(struct window *window) { struct display *display = window->display; @@ -396,7 +357,9 @@ create_surface(struct window *window) if (!window->frame_sync) eglSwapInterval(display->egl.dpy, 0); - set_fullscreen(window, window->fullscreen); + xdg_surface_request_change_state(window->xdg_surface, + XDG_SURFACE_STATE_FULLSCREEN, + window->fullscreen, 0); } static void @@ -453,9 +416,6 @@ redraw(void *data, struct wl_callback *callback, uint32_t time) if (callback) wl_callback_destroy(callback); - if (!window->configured) - return; - gettimeofday(&tv, NULL); time = tv.tv_sec * 1000 + tv.tv_usec / 1000; if (window->frames == 0) @@ -657,7 +617,9 @@ keyboard_handle_key(void *data, struct wl_keyboard *keyboard, struct display *d = data; if (key == KEY_F11 && state) - set_fullscreen(d->window, d->window->fullscreen ^ 1); + xdg_surface_request_change_state(d->window->xdg_surface, + XDG_SURFACE_STATE_FULLSCREEN, + !d->window->fullscreen, 0); else if (key == KEY_ESC && state) running = 0; } @@ -845,8 +807,6 @@ main(int argc, char **argv) * queued up as a side effect. */ while (running && ret != -1) { wl_display_dispatch_pending(display.display); - while (!window.configured) - wl_display_dispatch(display.display); redraw(&window, NULL, 0); } diff --git a/clients/simple-shm.c b/clients/simple-shm.c index db2da5df..f84d08ce 100644 --- a/clients/simple-shm.c +++ b/clients/simple-shm.c @@ -120,22 +120,10 @@ handle_configure(void *data, struct xdg_surface *surface, } static void -handle_request_set_maximized(void *data, struct xdg_surface *xdg_surface) -{ -} - -static void -handle_request_unset_maximized(void *data, struct xdg_surface *xdg_surface) -{ -} - -static void -handle_request_set_fullscreen(void *data, struct xdg_surface *xdg_surface) -{ -} - -static void -handle_request_unset_fullscreen(void *data, struct xdg_surface *xdg_surface) +handle_change_state(void *data, struct xdg_surface *xdg_surface, + uint32_t state, + uint32_t value, + uint32_t serial) { } @@ -157,10 +145,7 @@ handle_delete(void *data, struct xdg_surface *xdg_surface) static const struct xdg_surface_listener xdg_surface_listener = { handle_configure, - handle_request_set_maximized, - handle_request_unset_maximized, - handle_request_set_fullscreen, - handle_request_unset_fullscreen, + handle_change_state, handle_activated, handle_deactivated, handle_delete, diff --git a/clients/window.c b/clients/window.c index 4dd6b36f..e5fa5411 100644 --- a/clients/window.c +++ b/clients/window.c @@ -3750,6 +3750,9 @@ window_do_resize(struct window *window) surface_set_synchronized(surface); surface_resize(surface); } + + if (!window->fullscreen && !window->maximized) + window->saved_allocation = window->pending_allocation; } static void @@ -3839,31 +3842,29 @@ handle_surface_configure(void *data, struct xdg_surface *xdg_surface, } static void -handle_surface_request_set_maximized(void *data, struct xdg_surface *xdg_surface) +handle_surface_change_state(void *data, struct xdg_surface *xdg_surface, + uint32_t state, + uint32_t value, + uint32_t serial) { struct window *window = data; - window_set_maximized(window, 1); -} -static void -handle_surface_request_unset_maximized(void *data, struct xdg_surface *xdg_surface) -{ - struct window *window = data; - window_set_maximized(window, 0); -} + switch (state) { + case XDG_SURFACE_STATE_MAXIMIZED: + window->maximized = value; + break; + case XDG_SURFACE_STATE_FULLSCREEN: + window->fullscreen = value; + break; + } -static void -handle_surface_request_set_fullscreen(void *data, struct xdg_surface *xdg_surface) -{ - struct window *window = data; - window_set_fullscreen(window, 1); -} + if (!window->fullscreen && !window->maximized) + window_schedule_resize(window, + window->saved_allocation.width, + window->saved_allocation.height); -static void -handle_surface_request_unset_fullscreen(void *data, struct xdg_surface *xdg_surface) -{ - struct window *window = data; - window_set_fullscreen(window, 0); + xdg_surface_ack_change_state(xdg_surface, state, value, serial); + window_schedule_redraw(window); } static void @@ -3889,10 +3890,7 @@ handle_surface_delete(void *data, struct xdg_surface *xdg_surface) static const struct xdg_surface_listener xdg_surface_listener = { handle_surface_configure, - handle_surface_request_set_maximized, - handle_surface_request_unset_maximized, - handle_surface_request_set_fullscreen, - handle_surface_request_unset_fullscreen, + handle_surface_change_state, handle_surface_activated, handle_surface_deactivated, handle_surface_delete, @@ -4125,39 +4123,6 @@ window_schedule_redraw(struct window *window) window_schedule_redraw_task(window); } -static void -configure_sync_callback(void *data, - struct wl_callback *callback, uint32_t time) -{ - struct window *window = data; - - DBG("scheduling redraw from maximize sync callback\n"); - - wl_callback_destroy(callback); - - window->redraw_task_scheduled = 0; - window_schedule_redraw_task(window); -} - -static struct wl_callback_listener configure_sync_callback_listener = { - configure_sync_callback, -}; - -static void -window_delay_redraw(struct window *window) -{ - struct wl_callback *callback; - - DBG("delay scheduled redraw for maximize configure\n"); - if (window->redraw_task_scheduled) - wl_list_remove(&window->redraw_task.link); - - window->redraw_task_scheduled = 1; - callback = wl_display_sync(window->display->display); - wl_callback_add_listener(callback, - &configure_sync_callback_listener, window); -} - int window_is_fullscreen(struct window *window) { @@ -4173,13 +4138,10 @@ window_set_fullscreen(struct window *window, int fullscreen) if (window->fullscreen == fullscreen) return; - window->fullscreen = fullscreen; - if (window->fullscreen) - xdg_surface_set_fullscreen(window->xdg_surface); - else - xdg_surface_unset_fullscreen(window->xdg_surface); - - window_delay_redraw(window); + xdg_surface_request_change_state(window->xdg_surface, + XDG_SURFACE_STATE_FULLSCREEN, + fullscreen ? 1 : 0, + 0); } int @@ -4197,13 +4159,10 @@ window_set_maximized(struct window *window, int maximized) if (window->maximized == maximized) return; - window->maximized = maximized; - if (window->maximized) - xdg_surface_set_maximized(window->xdg_surface); - else - xdg_surface_unset_maximized(window->xdg_surface); - - window_delay_redraw(window); + xdg_surface_request_change_state(window->xdg_surface, + XDG_SURFACE_STATE_MAXIMIZED, + maximized ? 1 : 0, + 0); } void |