From 973d7879e33e624f99f24fdd3dd0ddd8c9ca4dad Mon Sep 17 00:00:00 2001 From: "Jasper St. Pierre" Date: Tue, 6 May 2014 08:44:29 -0400 Subject: [PATCH] xdg-shell: Turn "activated" into a state This drops two events, and makes new window decorations race-free with an attach in-flight. --- clients/simple-egl.c | 12 ------------ clients/simple-shm.c | 12 ------------ clients/window.c | 20 ++++---------------- desktop-shell/shell.c | 10 ++++++---- protocol/xdg-shell.xml | 27 +++++---------------------- 5 files changed, 15 insertions(+), 66 deletions(-) diff --git a/clients/simple-egl.c b/clients/simple-egl.c index 165ce10..2097b4c 100644 --- a/clients/simple-egl.c +++ b/clients/simple-egl.c @@ -304,16 +304,6 @@ handle_surface_configure(void *data, struct xdg_surface *surface, } static void -handle_surface_activated(void *data, struct xdg_surface *xdg_surface) -{ -} - -static void -handle_surface_deactivated(void *data, struct xdg_surface *xdg_surface) -{ -} - -static void handle_surface_delete(void *data, struct xdg_surface *xdg_surface) { running = 0; @@ -321,8 +311,6 @@ handle_surface_delete(void *data, struct xdg_surface *xdg_surface) static const struct xdg_surface_listener xdg_surface_listener = { handle_surface_configure, - handle_surface_activated, - handle_surface_deactivated, handle_surface_delete, }; diff --git a/clients/simple-shm.c b/clients/simple-shm.c index d0cd7e3..29abb8b 100644 --- a/clients/simple-shm.c +++ b/clients/simple-shm.c @@ -124,16 +124,6 @@ handle_configure(void *data, struct xdg_surface *surface, } static void -handle_activated(void *data, struct xdg_surface *xdg_surface) -{ -} - -static void -handle_deactivated(void *data, struct xdg_surface *xdg_surface) -{ -} - -static void handle_delete(void *data, struct xdg_surface *xdg_surface) { running = 0; @@ -141,8 +131,6 @@ handle_delete(void *data, struct xdg_surface *xdg_surface) static const struct xdg_surface_listener xdg_surface_listener = { handle_configure, - handle_activated, - handle_deactivated, handle_delete, }; diff --git a/clients/window.c b/clients/window.c index c46cb72..7d88345 100644 --- a/clients/window.c +++ b/clients/window.c @@ -3868,6 +3868,7 @@ handle_surface_configure(void *data, struct xdg_surface *xdg_surface, window->maximized = 0; window->fullscreen = 0; window->resizing = 0; + window->focused = 0; wl_array_for_each(p, states) { uint32_t state = *p; @@ -3881,6 +3882,9 @@ handle_surface_configure(void *data, struct xdg_surface *xdg_surface, case XDG_SURFACE_STATE_RESIZING: window->resizing = 1; break; + case XDG_SURFACE_STATE_ACTIVATED: + window->focused = 1; + break; default: /* Unknown state */ break; @@ -3894,20 +3898,6 @@ handle_surface_configure(void *data, struct xdg_surface *xdg_surface, } static void -handle_surface_activated(void *data, struct xdg_surface *xdg_surface) -{ - struct window *window = data; - window->focused = 1; -} - -static void -handle_surface_deactivated(void *data, struct xdg_surface *xdg_surface) -{ - struct window *window = data; - window->focused = 0; -} - -static void handle_surface_delete(void *data, struct xdg_surface *xdg_surface) { struct window *window = data; @@ -3916,8 +3906,6 @@ handle_surface_delete(void *data, struct xdg_surface *xdg_surface) static const struct xdg_surface_listener xdg_surface_listener = { handle_surface_configure, - handle_surface_activated, - handle_surface_deactivated, handle_surface_delete, }; diff --git a/desktop-shell/shell.c b/desktop-shell/shell.c index d7cd9c8..1704b84 100644 --- a/desktop-shell/shell.c +++ b/desktop-shell/shell.c @@ -2009,16 +2009,14 @@ static void shell_surface_lose_keyboard_focus(struct shell_surface *shsurf) { if (--shsurf->focus_count == 0) - if (shell_surface_is_xdg_surface(shsurf)) - xdg_surface_send_deactivated(shsurf->resource); + shell_surface_state_changed(shsurf); } static void shell_surface_gain_keyboard_focus(struct shell_surface *shsurf) { if (shsurf->focus_count++ == 0) - if (shell_surface_is_xdg_surface(shsurf)) - xdg_surface_send_activated(shsurf->resource); + shell_surface_state_changed(shsurf); } static void @@ -3557,6 +3555,10 @@ xdg_send_configure(struct weston_surface *surface, s = wl_array_add(&states, sizeof *s); *s = XDG_SURFACE_STATE_RESIZING; } + if (shsurf->focus_count > 0) { + s = wl_array_add(&states, sizeof *s); + *s = XDG_SURFACE_STATE_ACTIVATED; + } serial = wl_display_next_serial(shsurf->surface->compositor->wl_display); xdg_surface_send_configure(shsurf->resource, width, height, &states, serial); diff --git a/protocol/xdg-shell.xml b/protocol/xdg-shell.xml index 19f9651..3c18610 100644 --- a/protocol/xdg-shell.xml +++ b/protocol/xdg-shell.xml @@ -276,6 +276,11 @@ Clients that have aspect ratio or cell sizing configuration can use a smaller size, however. + + Client window decorations should be painted as if the window is + active. Do not assume this means that the window actually has + keyboard or pointer focus. + @@ -331,28 +336,6 @@ - - - The activated_set event is sent when this surface has been - activated, which means that the surface has user attention. - Window decorations should be updated accordingly. You should - not use this event for anything but the style of decorations - you display, use wl_keyboard.enter and wl_keyboard.leave for - determining keyboard focus. - - - - - - The deactivate event is sent when this surface has been - deactivated, which means that the surface lost user attention. - Window decorations should be updated accordingly. You should - not use this event for anything but the style of decorations - you display, use wl_keyboard.enter and wl_keyboard.leave for - determining keyboard focus. - - - The close event is sent by the compositor when the user -- 2.7.4