[PATCH v2 weston 6/6] xwm: set grabbing cursor for the frame grab
Tiago Vignatti
tiago.vignatti at intel.com
Mon Jul 16 07:32:27 PDT 2012
This patch sets the cursor for the frame window only.
The other case left is when the client itself performs a grab instead the
titlebar drag. E.g. google-chrome without decoration does move a window (when
click-n-drag the bar on the side of the tabs) but the cursor doesn't set back
to the default one.
Signed-off-by: Tiago Vignatti <tiago.vignatti at intel.com>
---
no changes since v1.
src/xwayland/window-manager.c | 24 +++++++++++++++++++++++-
1 file changed, 23 insertions(+), 1 deletion(-)
diff --git a/src/xwayland/window-manager.c b/src/xwayland/window-manager.c
index fc866a4..2ea574e 100644
--- a/src/xwayland/window-manager.c
+++ b/src/xwayland/window-manager.c
@@ -936,6 +936,7 @@ enum cursor_type {
XWM_CURSOR_TOP_RIGHT,
XWM_CURSOR_BOTTOM_LEFT,
XWM_CURSOR_BOTTOM_RIGHT,
+ XWM_CURSOR_GRABBING,
XWM_CURSOR_LEFT_PTR,
};
@@ -948,6 +949,7 @@ static const char *cursors[] = {
"top_right_corner",
"bottom_left_corner",
"bottom_right_corner",
+ "grabbing",
"left_ptr"
};
@@ -1032,7 +1034,7 @@ weston_wm_handle_button(struct weston_wm *wm, xcb_generic_event_t *event)
struct weston_wm_window *window;
enum theme_location location;
struct theme *t = wm->theme;
- int width, height;
+ int width, height, cursor;
weston_log("XCB_BUTTON_%s (detail %d)\n",
button->response_type == XCB_BUTTON_PRESS ?
@@ -1050,6 +1052,11 @@ weston_wm_handle_button(struct weston_wm *wm, xcb_generic_event_t *event)
switch (location) {
case THEME_LOCATION_TITLEBAR:
+ /* desktop client shell will set the grabbing cursor
+ * regardless but xwayland needs to be aware about the
+ * cursor change as well so we repaint it */
+ weston_wm_window_set_cursor(wm, window->frame_id,
+ XWM_CURSOR_GRABBING);
shell_interface->move(window->shsurf,
wm->server->compositor->seat);
break;
@@ -1068,6 +1075,11 @@ weston_wm_handle_button(struct weston_wm *wm, xcb_generic_event_t *event)
default:
break;
}
+ } else if (button->response_type == XCB_BUTTON_RELEASE &&
+ button->detail == 1) {
+ cursor = get_cursor_for_location(t, width, height,
+ button->event_x, button->event_y);
+ weston_wm_window_set_cursor(wm, window->frame_id, cursor);
}
}
@@ -1075,6 +1087,7 @@ static void
weston_wm_handle_motion(struct weston_wm *wm, xcb_generic_event_t *event)
{
xcb_motion_notify_event_t *motion = (xcb_motion_notify_event_t *) event;
+ struct weston_seat *seat = wm->server->compositor->seat;
struct weston_wm_window *window;
int cursor, width, height;
@@ -1082,6 +1095,10 @@ weston_wm_handle_motion(struct weston_wm *wm, xcb_generic_event_t *event)
if (!window)
return;
+ /* don't change the cursor when pointer is performing a grab */
+ if (seat->seat.pointer->focus != &window->surface->surface)
+ return;
+
weston_wm_window_get_frame_size(window, &width, &height);
cursor = get_cursor_for_location(wm->theme, width, height,
motion->event_x, motion->event_y);
@@ -1111,12 +1128,17 @@ static void
weston_wm_handle_leave(struct weston_wm *wm, xcb_generic_event_t *event)
{
xcb_leave_notify_event_t *leave = (xcb_leave_notify_event_t *) event;
+ struct weston_seat *seat = wm->server->compositor->seat;
struct weston_wm_window *window;
window = hash_table_lookup(wm->window_hash, leave->event);
if (!window)
return;
+ /* don't change the cursor when pointer is performing a grab */
+ if (seat->seat.pointer->button_count != 0)
+ return;
+
weston_wm_window_set_cursor(wm, window->frame_id, XWM_CURSOR_LEFT_PTR);
}
--
1.7.9.5
More information about the wayland-devel
mailing list