]> git.sur5r.net Git - i3/i3/commitdiff
Display appropriate cursors when resizing or moving floating windows.
authorDeiz <silverwraithii@gmail.com>
Sun, 23 Sep 2012 19:43:43 +0000 (15:43 -0400)
committerMichael Stapelberg <michael@stapelberg.de>
Sun, 23 Sep 2012 20:05:19 +0000 (22:05 +0200)
include/floating.h
include/xcursor.h
src/floating.c
src/resize.c
src/xcursor.c

index a2f501c50222248e30c9bb7dccb3412c7c25a044..884d3cf1fe9df848a5ffdb2f2b9dd8f4e70de1b9 100644 (file)
@@ -134,8 +134,8 @@ void floating_toggle_hide(xcb_connection_t *conn, Workspace *workspace);
  *
  */
 void drag_pointer(Con *con, const xcb_button_press_event_t *event,
-                  xcb_window_t confine_to, border_t border, callback_t callback,
-                  const void *extra);
+                  xcb_window_t confine_to, border_t border, int cursor,
+                  callback_t callback, const void *extra);
 
 /**
  * Repositions the CT_FLOATING_CON to have the coordinates specified by
index fba82ad3011ae69907844b899c696aafa572430a..bfe37c3944cf098e22b91aa461cb92e7db5dde5c 100644 (file)
@@ -16,7 +16,12 @@ enum xcursor_cursor_t {
     XCURSOR_CURSOR_POINTER = 0,
     XCURSOR_CURSOR_RESIZE_HORIZONTAL,
     XCURSOR_CURSOR_RESIZE_VERTICAL,
+    XCURSOR_CURSOR_TOP_LEFT_CORNER,
+    XCURSOR_CURSOR_TOP_RIGHT_CORNER,
+    XCURSOR_CURSOR_BOTTOM_LEFT_CORNER,
+    XCURSOR_CURSOR_BOTTOM_RIGHT_CORNER,
     XCURSOR_CURSOR_WATCH,
+    XCURSOR_CURSOR_MOVE,
     XCURSOR_CURSOR_MAX
 };
 
index 3d2c1d3191fb4f8b1367bf19a2f2aaf9cf64e691..ce81e5fa48c1d2daf42e2ff45260b3a208b5d151 100644 (file)
@@ -395,7 +395,7 @@ void floating_drag_window(Con *con, const xcb_button_press_event_t *event) {
     tree_render();
 
     /* Drag the window */
-    drag_pointer(con, event, XCB_NONE, BORDER_TOP /* irrelevant */, drag_window_callback, event);
+    drag_pointer(con, event, XCB_NONE, BORDER_TOP /* irrelevant */, XCURSOR_CURSOR_MOVE, drag_window_callback, event);
     tree_render();
 }
 
@@ -479,13 +479,21 @@ void floating_resize_window(Con *con, const bool proportional,
         corner |= BORDER_LEFT;
     else corner |= BORDER_RIGHT;
 
-    if (event->event_y <= (con->rect.height / 2))
+    int cursor = 0;
+    if (event->event_y <= (con->rect.height / 2)) {
         corner |= BORDER_TOP;
-    else corner |= BORDER_BOTTOM;
+        cursor = (corner & BORDER_LEFT) ?
+            XCURSOR_CURSOR_TOP_LEFT_CORNER : XCURSOR_CURSOR_TOP_RIGHT_CORNER;
+    }
+    else {
+        corner |= BORDER_BOTTOM;
+        cursor = (corner & BORDER_LEFT) ?
+            XCURSOR_CURSOR_BOTTOM_LEFT_CORNER : XCURSOR_CURSOR_BOTTOM_RIGHT_CORNER;
+    }
 
     struct resize_window_callback_params params = { corner, proportional, event };
 
-    drag_pointer(con, event, XCB_NONE, BORDER_TOP /* irrelevant */, resize_window_callback, &params);
+    drag_pointer(con, event, XCB_NONE, BORDER_TOP /* irrelevant */, cursor, resize_window_callback, &params);
 }
 
 /*
@@ -497,13 +505,16 @@ void floating_resize_window(Con *con, const bool proportional,
  *
  */
 void drag_pointer(Con *con, const xcb_button_press_event_t *event, xcb_window_t
-                confine_to, border_t border, callback_t callback, const void *extra)
+                confine_to, border_t border, int cursor, callback_t callback, const void *extra)
 {
     uint32_t new_x, new_y;
     Rect old_rect = { 0, 0, 0, 0 };
     if (con != NULL)
         memcpy(&old_rect, &(con->rect), sizeof(Rect));
 
+    Cursor xcursor = (cursor && xcursor_supported) ?
+        xcursor_get_cursor(cursor) : XCB_NONE;
+
     /* Grab the pointer */
     xcb_grab_pointer_cookie_t cookie;
     xcb_grab_pointer_reply_t *reply;
@@ -514,7 +525,7 @@ void drag_pointer(Con *con, const xcb_button_press_event_t *event, xcb_window_t
         XCB_GRAB_MODE_ASYNC, /* pointer events should continue as normal */
         XCB_GRAB_MODE_ASYNC, /* keyboard mode */
         confine_to,          /* confine_to = in which window should the cursor stay */
-        XCB_NONE,            /* don’t display a special cursor */
+        xcursor,             /* possibly display a special cursor */
         XCB_CURRENT_TIME);
 
     if ((reply = xcb_grab_pointer_reply(conn, cookie, NULL)) == NULL) {
index b65344a276c5edbefdee04f260e0856d45ca9441..268dc3fbd119b69780bcbee89f7d47cc195829d2 100644 (file)
@@ -106,7 +106,7 @@ int resize_graphical_handler(Con *first, Con *second, orientation_t orientation,
 
     const struct callback_params params = { orientation, output, helpwin, &new_position };
 
-    drag_pointer(NULL, event, grabwin, BORDER_TOP, resize_callback, &params);
+    drag_pointer(NULL, event, grabwin, BORDER_TOP, 0, resize_callback, &params);
 
     xcb_destroy_window(conn, helpwin);
     xcb_destroy_window(conn, grabwin);
index 7683b0d37ed8fd76c0330200b4650440ea8b53ab..90fd69dd237a67cc7470f238af33a693e6175aad 100644 (file)
@@ -34,10 +34,15 @@ static Cursor load_cursor(const char *name) {
 }
 
 void xcursor_load_cursors(void) {
-    cursors[XCURSOR_CURSOR_POINTER] = load_cursor("left_ptr");
-    cursors[XCURSOR_CURSOR_RESIZE_HORIZONTAL] = load_cursor("sb_h_double_arrow");
-    cursors[XCURSOR_CURSOR_RESIZE_VERTICAL] = load_cursor("sb_v_double_arrow");
-    cursors[XCURSOR_CURSOR_WATCH] = load_cursor("watch");
+    cursors[XCURSOR_CURSOR_POINTER]             = load_cursor("left_ptr");
+    cursors[XCURSOR_CURSOR_RESIZE_HORIZONTAL]   = load_cursor("sb_h_double_arrow");
+    cursors[XCURSOR_CURSOR_RESIZE_VERTICAL]     = load_cursor("sb_v_double_arrow");
+    cursors[XCURSOR_CURSOR_WATCH]               = load_cursor("watch");
+    cursors[XCURSOR_CURSOR_MOVE]                = load_cursor("fleur");
+    cursors[XCURSOR_CURSOR_TOP_LEFT_CORNER]     = load_cursor("top_left_corner");
+    cursors[XCURSOR_CURSOR_TOP_RIGHT_CORNER]    = load_cursor("top_right_corner");
+    cursors[XCURSOR_CURSOR_BOTTOM_LEFT_CORNER]  = load_cursor("bottom_left_corner");
+    cursors[XCURSOR_CURSOR_BOTTOM_RIGHT_CORNER] = load_cursor("bottom_right_corner");
 }
 
 /*