xdg-shell: Turn "activated" into a state
authorJasper St. Pierre <jstpierre@mecheye.net>
Tue, 6 May 2014 12:44:29 +0000 (08:44 -0400)
committerKristian Høgsberg <krh@bitplanet.net>
Tue, 13 May 2014 06:34:05 +0000 (23:34 -0700)
This drops two events, and makes new window decorations race-free with
an attach in-flight.

clients/simple-egl.c
clients/simple-shm.c
clients/window.c
desktop-shell/shell.c
protocol/xdg-shell.xml

index 165ce10..2097b4c 100644 (file)
@@ -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,
 };
 
index d0cd7e3..29abb8b 100644 (file)
@@ -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,
 };
 
index c46cb72..7d88345 100644 (file)
@@ -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,
 };
 
index d7cd9c8..1704b84 100644 (file)
@@ -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);
index 19f9651..3c18610 100644 (file)
         Clients that have aspect ratio or cell sizing configuration can use
         a smaller size, however.
       </entry>
+      <entry name="activated" value="4">
+        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.
+      </entry>
     </enum>
 
     <event name="configure">
 
     <request name="set_minimized" />
 
-    <event name="activated">
-      <description summary="surface was activated">
-       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.
-      </description>
-    </event>
-
-    <event name="deactivated">
-      <description summary="surface was deactivated">
-       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.
-      </description>
-    </event>
-
     <event name="close">
       <description summary="surface wants to be closed">
         The close event is sent by the compositor when the user