X-Git-Url: https://git.sur5r.net/?a=blobdiff_plain;f=src%2Fresize.c;h=ee50bfbc694514abe8b43c51a5cffed65365fa69;hb=acc58a6763e497608a9fe4ae9ff4034d18e8641c;hp=bacadf2efe6ced1092f110518d314882d11a7e93;hpb=69ce33d06d2a6ef0dfcdbe09e11e1262515c875f;p=i3%2Fi3 diff --git a/src/resize.c b/src/resize.c index bacadf2e..ee50bfbc 100644 --- a/src/resize.c +++ b/src/resize.c @@ -1,18 +1,14 @@ -#undef I3__FILE__ -#define I3__FILE__ "resize.c" /* * vim:ts=4:sw=4:expandtab * * i3 - an improved dynamic tiling window manager - * © 2009-2011 Michael Stapelberg and contributors (see also: LICENSE) + * © 2009 Michael Stapelberg and contributors (see also: LICENSE) * * resize.c: Interactive resizing. * */ #include "all.h" -extern xcb_connection_t *conn; - /* * This is an ugly data structure which we need because there is no standard * way of having nested functions (only available as a gcc extension at the @@ -51,7 +47,7 @@ DRAGGING_CB(resize_callback) { xcb_flush(conn); } -bool resize_find_tiling_participants(Con **current, Con **other, direction_t direction) { +bool resize_find_tiling_participants(Con **current, Con **other, direction_t direction, bool both_sides) { DLOG("Find two participants for resizing container=%p in direction=%i\n", other, direction); Con *first = *current; Con *second = NULL; @@ -78,8 +74,14 @@ bool resize_find_tiling_participants(Con **current, Con **other, direction_t dir /* get the counterpart for this resizement */ if (dir_backwards) { second = TAILQ_PREV(first, nodes_head, nodes); + if (second == NULL && both_sides == true) { + second = TAILQ_NEXT(first, nodes); + } } else { second = TAILQ_NEXT(first, nodes); + if (second == NULL && both_sides == true) { + second = TAILQ_PREV(first, nodes_head, nodes); + } } if (second == NULL) { @@ -88,7 +90,7 @@ bool resize_find_tiling_participants(Con **current, Con **other, direction_t dir } } - DLOG("Found participants: first=%p and second=%p.", first, second); + DLOG("Found participants: first=%p and second=%p.\n", first, second); *current = first; *other = second; if (first == NULL || second == NULL) { @@ -118,7 +120,7 @@ int resize_graphical_handler(Con *first, Con *second, orientation_t orientation, /* Open a new window, the resizebar. Grab the pointer and move the window around as the user moves the pointer. */ xcb_window_t grabwin = create_window(conn, output->rect, XCB_COPY_FROM_PARENT, XCB_COPY_FROM_PARENT, - XCB_WINDOW_CLASS_INPUT_ONLY, XCURSOR_CURSOR_POINTER, true, mask, values); + XCB_WINDOW_CLASS_INPUT_ONLY, XCURSOR_CURSOR_POINTER, true, mask, values); /* Keep track of the coordinate orthogonal to motion so we can determine * the length of the resize afterward. */ @@ -129,32 +131,30 @@ int resize_graphical_handler(Con *first, Con *second, orientation_t orientation, Rect helprect; if (orientation == HORIZ) { helprect.x = second->rect.x; - helprect.y = output->rect.y; - helprect.width = 2; - helprect.height = output->rect.height; + helprect.y = second->rect.y; + helprect.width = logical_px(2); + helprect.height = second->rect.height; initial_position = second->rect.x; xcb_warp_pointer(conn, XCB_NONE, event->root, 0, 0, 0, 0, - second->rect.x, event->root_y); + second->rect.x, event->root_y); } else { - helprect.x = output->rect.x; + helprect.x = second->rect.x; helprect.y = second->rect.y; - helprect.width = output->rect.width; - helprect.height = 2; + helprect.width = second->rect.width; + helprect.height = logical_px(2); initial_position = second->rect.y; xcb_warp_pointer(conn, XCB_NONE, event->root, 0, 0, 0, 0, - event->root_x, second->rect.y); + event->root_x, second->rect.y); } mask = XCB_CW_BACK_PIXEL; - values[0] = config.client.focused.border; + values[0] = config.client.focused.border.colorpixel; mask |= XCB_CW_OVERRIDE_REDIRECT; values[1] = 1; xcb_window_t helpwin = create_window(conn, helprect, XCB_COPY_FROM_PARENT, XCB_COPY_FROM_PARENT, - XCB_WINDOW_CLASS_INPUT_OUTPUT, (orientation == HORIZ ? - XCURSOR_CURSOR_RESIZE_HORIZONTAL : - XCURSOR_CURSOR_RESIZE_VERTICAL), true, mask, values); + XCB_WINDOW_CLASS_INPUT_OUTPUT, (orientation == HORIZ ? XCURSOR_CURSOR_RESIZE_HORIZONTAL : XCURSOR_CURSOR_RESIZE_VERTICAL), true, mask, values); xcb_circulate_window(conn, XCB_CIRCULATE_RAISE_LOWEST, helpwin); @@ -163,7 +163,7 @@ int resize_graphical_handler(Con *first, Con *second, orientation_t orientation, /* `new_position' will be updated by the `resize_callback'. */ new_position = initial_position; - const struct callback_params params = { orientation, output, helpwin, &new_position }; + const struct callback_params params = {orientation, output, helpwin, &new_position}; /* `drag_pointer' blocks until the drag is completed. */ drag_result_t drag_result = drag_pointer(NULL, event, grabwin, BORDER_TOP, 0, resize_callback, ¶ms);