diff --git a/TODO b/TODO
index 7c555cb6..84fad7cd 100644
--- a/TODO
+++ b/TODO
@@ -1,7 +1,7 @@
Core wayland protocol
- - enter notify needs coordinates for cases where pointer focus
- changes without motion (surfaces coming or going)
+ - generate pointer_focus on raise/lower, move windows, all kinds of
+ changes in surface stacking.
- generate marshal stubs as static inline functions.
diff --git a/clients/window.c b/clients/window.c
index c01ca05b..b2c4f033 100644
--- a/clients/window.c
+++ b/clients/window.c
@@ -400,7 +400,8 @@ window_handle_key(void *data, struct wl_input_device *input_device,
static void
window_handle_pointer_focus(void *data,
struct wl_input_device *input_device,
- uint32_t time, struct wl_surface *surface)
+ uint32_t time, struct wl_surface *surface,
+ int32_t x, int32_t y, int32_t sx, int32_t sy)
{
struct input *input = data;
diff --git a/compositor.c b/compositor.c
index 0ce2d09a..6d7a627e 100644
--- a/compositor.c
+++ b/compositor.c
@@ -641,7 +641,9 @@ wlsc_input_device_set_keyboard_focus(struct wlsc_input_device *device,
static void
wlsc_input_device_set_pointer_focus(struct wlsc_input_device *device,
struct wlsc_surface *surface,
- uint32_t time)
+ uint32_t time,
+ int32_t x, int32_t y,
+ int32_t sx, int32_t sy)
{
if (device->pointer_focus == surface)
return;
@@ -651,12 +653,13 @@ wlsc_input_device_set_pointer_focus(struct wlsc_input_device *device,
wl_surface_post_event(&device->pointer_focus->base,
&device->base,
WL_INPUT_DEVICE_POINTER_FOCUS,
- time, NULL);
+ time, NULL, 0, 0, 0, 0);
if (surface)
wl_surface_post_event(&surface->base,
&device->base,
WL_INPUT_DEVICE_POINTER_FOCUS,
- time, &surface->base);
+ time, &surface->base,
+ x, y, sx, sy);
device->pointer_focus = surface;
}
@@ -711,7 +714,8 @@ notify_motion(struct wlsc_input_device *device, uint32_t time, int x, int y)
case WLSC_DEVICE_GRAB_MOTION:
es = pick_surface(device, &sx, &sy);
- wlsc_input_device_set_pointer_focus(device, es, time);
+ wlsc_input_device_set_pointer_focus(device, es,
+ time, x, y, sx, sy);
if (es)
wl_surface_post_event(&es->base, &device->base,
@@ -806,6 +810,12 @@ notify_button(struct wlsc_input_device *device,
(device->modifier_state & MODIFIER_SUPER))
shell_move(NULL, &compositor->shell,
&surface->base, device, time);
+ else if (state && button == BTN_MIDDLE &&
+ device->grab == WLSC_DEVICE_GRAB_MOTION &&
+ (device->modifier_state & MODIFIER_SUPER))
+ shell_resize(NULL, &compositor->shell,
+ &surface->base, device, time,
+ WLSC_DEVICE_GRAB_RESIZE_BOTTOM_RIGHT);
else
wl_surface_post_event(&surface->base, &device->base,
WL_INPUT_DEVICE_BUTTON,
@@ -896,7 +906,9 @@ handle_surface_destroy(struct wlsc_listener *listener,
if (device->pointer_focus == surface) {
device->grab = WLSC_DEVICE_GRAB_NONE;
focus = pick_surface(device, &sx, &sy);
- wlsc_input_device_set_pointer_focus(device, focus, time);
+ wlsc_input_device_set_pointer_focus(device, focus, time,
+ device->x, device->y,
+ sx, sy);
fprintf(stderr, "lost pointer focus surface, reverting to %p\n", focus);
}
}
diff --git a/protocol.xml b/protocol.xml
index a0c32a72..50a3480f 100644
--- a/protocol.xml
+++ b/protocol.xml
@@ -124,6 +124,10 @@
+
+
+
+
diff --git a/wayland-client.c b/wayland-client.c
index 5ac65419..b55511e2 100644
--- a/wayland-client.c
+++ b/wayland-client.c
@@ -81,8 +81,6 @@ struct wl_visual {
struct wl_output {
struct wl_proxy proxy;
- struct wl_listener listener;
- int32_t width, height;
};
struct wl_shell {