Split pointer_focus and keyboard_focus into enter and leave events
authorKristian Høgsberg <krh@bitplanet.net>
Sat, 18 Feb 2012 06:25:44 +0000 (01:25 -0500)
committerKristian Høgsberg <krh@bitplanet.net>
Thu, 23 Feb 2012 14:35:24 +0000 (09:35 -0500)
protocol/wayland.xml
src/wayland-server.c

index a40e4b0..156859a 100644 (file)
       <arg name="state" type="uint"/>
     </event>
 
-    <event name="pointer_focus">
-      <description summary="pointer focus change event">
+    <event name="pointer_enter">
+      <description summary="pointer enter event">
        Notification that this input device's pointer is focused on
        certain surface. When an input_device enters a surface, the
        pointer image is undefined and a client should respond to this
       <arg name="surface_y" type="int"/>
     </event>
 
-    <event name="keyboard_focus">
+    <event name="pointer_leave">
+      <description summary="pointer leave event">
+      </description>
+      <arg name="time" type="uint"/>
+      <arg name="surface" type="object" interface="wl_surface"/>
+    </event>
+
+    <event name="keyboard_enter">
       <arg name="time" type="uint"/>
       <arg name="surface" type="object" interface="wl_surface"/>
       <arg name="keys" type="array"/>
     </event>
 
+    <event name="keyboard_leave">
+      <arg name="time" type="uint"/>
+      <arg name="surface" type="object" interface="wl_surface"/>
+    </event>
+
     <event name="touch_down">
       <arg name="time" type="uint"/>
       <arg name="surface" type="object" interface="wl_surface"/>
index 9e90ae5..bf81334 100644 (file)
@@ -568,19 +568,17 @@ wl_input_device_set_pointer_focus(struct wl_input_device *device,
        if (device->pointer_focus == surface)
                return;
 
-       if (device->pointer_focus_resource &&
-           (!surface ||
-            device->pointer_focus->resource.client != surface->resource.client))
+       if (device->pointer_focus_resource) {
                wl_resource_post_event(device->pointer_focus_resource,
-                                      WL_INPUT_DEVICE_POINTER_FOCUS,
-                                      time, NULL, 0, 0);
-       if (device->pointer_focus_resource)
+                                      WL_INPUT_DEVICE_POINTER_LEAVE,
+                                      time, device->pointer_focus);
                wl_list_remove(&device->pointer_focus_listener.link);
+       }
 
        resource = find_resource_for_surface(&device->resource_list, surface);
        if (resource) {
                wl_resource_post_event(resource,
-                                      WL_INPUT_DEVICE_POINTER_FOCUS,
+                                      WL_INPUT_DEVICE_POINTER_ENTER,
                                       time, surface, sx, sy);
                wl_list_insert(resource->destroy_listener_list.prev,
                               &device->pointer_focus_listener.link);
@@ -602,19 +600,17 @@ wl_input_device_set_keyboard_focus(struct wl_input_device *device,
        if (device->keyboard_focus == surface)
                return;
 
-       if (device->keyboard_focus_resource &&
-           (!surface ||
-            device->keyboard_focus->resource.client != surface->resource.client))
+       if (device->keyboard_focus_resource) {
                wl_resource_post_event(device->keyboard_focus_resource,
-                                      WL_INPUT_DEVICE_KEYBOARD_FOCUS,
-                                      time, NULL, &device->keys);
-       if (device->keyboard_focus_resource)
+                                      WL_INPUT_DEVICE_KEYBOARD_LEAVE,
+                                      time, device->keyboard_focus);
                wl_list_remove(&device->keyboard_focus_listener.link);
+       }
 
        resource = find_resource_for_surface(&device->resource_list, surface);
        if (resource) {
                wl_resource_post_event(resource,
-                                      WL_INPUT_DEVICE_KEYBOARD_FOCUS,
+                                      WL_INPUT_DEVICE_KEYBOARD_ENTER,
                                       time, surface, &device->keys);
                wl_list_insert(resource->destroy_listener_list.prev,
                               &device->keyboard_focus_listener.link);