diff --git a/include/input_state.h b/include/input_state.h index 747a35636..4ab93cd65 100644 --- a/include/input_state.h +++ b/include/input_state.h @@ -30,11 +30,11 @@ enum pointer_values { enum pointer_mode { // Target - M_FLOATING = 1 << 0, - M_TILING = 1 << 1, + M_FLOATING = 1, + M_TILING = 2, // Action - M_DRAGGING = 1 << 2, - M_RESIZING = 1 << 3, + M_DRAGGING = 4, + M_RESIZING = 8, }; struct pointer_button_state { diff --git a/sway/handlers.c b/sway/handlers.c index d26ce5f33..0bb4f6132 100644 --- a/sway/handlers.c +++ b/sway/handlers.c @@ -17,6 +17,12 @@ #include "input_state.h" #include "resize.h" +// Event should be sent to client +#define EVENT_PASSTHROUGH false + +// Event handled by sway and should not be sent to client +#define EVENT_HANDLED true + static bool pointer_test(swayc_t *view, void *_origin) { const struct mouse_origin *origin = _origin; // Determine the output that the view is under @@ -276,7 +282,7 @@ static bool handle_key(wlc_handle view, uint32_t time, const struct wlc_modifier uint32_t key, uint32_t sym, enum wlc_key_state state) { if (locked_view_focus && state == WLC_KEY_STATE_PRESSED) { - return false; + return EVENT_PASSTHROUGH; } // reset pointer mode on keypress @@ -289,7 +295,7 @@ static bool handle_key(wlc_handle view, uint32_t time, const struct wlc_modifier if (sym < 70000 /* bullshit made up number */) { if (!isalnum(sym) && sym != ' ' && sym != XKB_KEY_Escape && sym != XKB_KEY_Tab) { // God fucking dammit - return false; + return EVENT_PASSTHROUGH; } } @@ -320,14 +326,14 @@ static bool handle_key(wlc_handle view, uint32_t time, const struct wlc_modifier if (match) { if (state == WLC_KEY_STATE_PRESSED) { handle_command(config, binding->command); - return true; + return EVENT_HANDLED; } else if (state == WLC_KEY_STATE_RELEASED) { // TODO: --released } } } } - return false; + return EVENT_PASSTHROUGH; } static bool handle_pointer_motion(wlc_handle handle, uint32_t time, const struct wlc_origin *origin) { @@ -351,13 +357,12 @@ static bool handle_pointer_motion(wlc_handle handle, uint32_t time, const struct set_focused_container(pointer_state.view); } } - return false; + return EVENT_PASSTHROUGH; } static bool handle_pointer_button(wlc_handle view, uint32_t time, const struct wlc_modifiers *modifiers, uint32_t button, enum wlc_button_state state, const struct wlc_origin *origin) { - enum { DONT_SEND_CLICK = true, SEND_CLICK = false }; // Update view pointer is on pointer_state.view = container_under_pointer(); @@ -412,7 +417,7 @@ static bool handle_pointer_button(wlc_handle view, uint32_t time, const struct w // dont change focus or mode if fullscreen if (swayc_is_fullscreen(focused)) { - return SEND_CLICK; + return EVENT_PASSTHROUGH; } // set pointer mode @@ -421,12 +426,12 @@ static bool handle_pointer_button(wlc_handle view, uint32_t time, const struct w // Return if mode has been set if (pointer_state.mode) { - return DONT_SEND_CLICK; + return EVENT_HANDLED; } // Always send mouse release if (state == WLC_BUTTON_STATE_RELEASED) { - return SEND_CLICK; + return EVENT_PASSTHROUGH; } // Check whether to change focus @@ -448,7 +453,7 @@ static bool handle_pointer_button(wlc_handle view, uint32_t time, const struct w } // Finally send click - return SEND_CLICK; + return EVENT_PASSTHROUGH; } static void handle_wlc_ready(void) { diff --git a/sway/input_state.c b/sway/input_state.c index 8450fe7a9..acf90d755 100644 --- a/sway/input_state.c +++ b/sway/input_state.c @@ -56,23 +56,24 @@ static struct mode_state { // initial view state double x, y, w, h; swayc_t *ptr; - // containers resized with tiling resize + // Containers used for resizing horizontally struct { - double x, w; + double w; swayc_t *ptr; struct { - double x, w; + double w; swayc_t *ptr; - } sib; - } lr; + } parent; + } horiz; + // Containers used for resizing vertically struct { - double y, h; + double h; swayc_t *ptr; struct { - double y, h; + double h; swayc_t *ptr; - } sib; - } tb; + } parent; + } vert; } initial; static struct { @@ -92,23 +93,19 @@ static void set_initial_view(swayc_t *view) { static void set_initial_sibling(void) { bool reset = true; - if ((initial.lr.ptr = get_swayc_in_direction(initial.ptr, lock.left ? MOVE_RIGHT: MOVE_LEFT))) { - initial.lr.x = initial.lr.ptr->x; - initial.lr.w = initial.lr.ptr->width; - initial.lr.sib.ptr = get_swayc_in_direction(initial.lr.ptr, lock.left ? MOVE_LEFT : MOVE_RIGHT); - initial.lr.sib.x = initial.lr.sib.ptr->x; - initial.lr.sib.w = initial.lr.sib.ptr->width; + if ((initial.horiz.ptr = get_swayc_in_direction(initial.ptr, lock.left ? MOVE_RIGHT: MOVE_LEFT))) { + initial.horiz.w = initial.horiz.ptr->width; + initial.horiz.parent.ptr = get_swayc_in_direction(initial.horiz.ptr, lock.left ? MOVE_LEFT : MOVE_RIGHT); + initial.horiz.parent.w = initial.horiz.parent.ptr->width; reset = false; } - if ((initial.tb.ptr = get_swayc_in_direction(initial.ptr, lock.top ? MOVE_DOWN: MOVE_UP))) { - initial.tb.y = initial.tb.ptr->y; - initial.tb.h = initial.tb.ptr->height; - initial.tb.sib.ptr = get_swayc_in_direction(initial.tb.ptr, lock.top ? MOVE_UP : MOVE_DOWN); - initial.tb.sib.y = initial.tb.sib.ptr->y; - initial.tb.sib.h = initial.tb.sib.ptr->height; + if ((initial.vert.ptr = get_swayc_in_direction(initial.ptr, lock.top ? MOVE_DOWN: MOVE_UP))) { + initial.vert.h = initial.vert.ptr->height; + initial.vert.parent.ptr = get_swayc_in_direction(initial.vert.ptr, lock.top ? MOVE_UP : MOVE_DOWN); + initial.vert.parent.h = initial.vert.parent.ptr->height; reset = false; } - // If nothing changes just undo the mode + // If nothing will change just undo the mode if (reset) { pointer_state.mode = 0; } @@ -123,6 +120,16 @@ static void reset_initial_view(void) { pointer_state.mode = 0; } +static void reset_initial_sibling(void) { + initial.horiz.ptr->width = initial.horiz.w; + initial.horiz.parent.ptr->width = initial.horiz.parent.w; + initial.vert.ptr->height = initial.vert.h; + initial.vert.parent.ptr->height = initial.vert.parent.h; + arrange_windows(initial.horiz.ptr->parent, -1, -1); + arrange_windows(initial.vert.ptr->parent, -1, -1); + pointer_state.mode = 0; +} + // Mode set left/right click static void pointer_mode_set_left(void) { @@ -228,7 +235,7 @@ void pointer_mode_update(void) { if (initial.w + dx > min_sane_w) { initial.ptr->width = initial.w + dx; } - } else { //lock.right + } else { // lock.right if (initial.w - dx > min_sane_w) { initial.ptr->width = initial.w - dx; initial.ptr->x = initial.x + dx; @@ -238,7 +245,7 @@ void pointer_mode_update(void) { if (initial.h + dy > min_sane_h) { initial.ptr->height = initial.h + dy; } - } else { //lock.bottom + } else { // lock.bottom if (initial.h - dy > min_sane_h) { initial.ptr->height = initial.h - dy; initial.ptr->y = initial.y + dy; @@ -264,34 +271,34 @@ void pointer_mode_update(void) { dx -= pointer_state.right.x; dy -= pointer_state.right.y; // resize if we can - if (initial.lr.ptr) { + if (initial.horiz.ptr) { if (lock.left) { // Check whether its fine to resize - if (initial.w + dx > min_sane_w && initial.lr.w - dx > min_sane_w) { - initial.lr.ptr->width = initial.lr.w - dx; - initial.lr.sib.ptr->width = initial.lr.sib.w + dx; + if (initial.w + dx > min_sane_w && initial.horiz.w - dx > min_sane_w) { + initial.horiz.ptr->width = initial.horiz.w - dx; + initial.horiz.parent.ptr->width = initial.horiz.parent.w + dx; } - } else { //lock.right - if (initial.w - dx > min_sane_w && initial.lr.w + dx > min_sane_w) { - initial.lr.ptr->width = initial.lr.w + dx; - initial.lr.sib.ptr->width = initial.lr.sib.w - dx; + } else { // lock.right + if (initial.w - dx > min_sane_w && initial.horiz.w + dx > min_sane_w) { + initial.horiz.ptr->width = initial.horiz.w + dx; + initial.horiz.parent.ptr->width = initial.horiz.parent.w - dx; } } - arrange_windows(initial.lr.ptr->parent, -1, -1); + arrange_windows(initial.horiz.ptr->parent, -1, -1); } - if (initial.tb.ptr) { + if (initial.vert.ptr) { if (lock.top) { - if (initial.h + dy > min_sane_h && initial.tb.h - dy > min_sane_h) { - initial.tb.ptr->height = initial.tb.h - dy; - initial.tb.sib.ptr->height = initial.tb.sib.h + dy; + if (initial.h + dy > min_sane_h && initial.vert.h - dy > min_sane_h) { + initial.vert.ptr->height = initial.vert.h - dy; + initial.vert.parent.ptr->height = initial.vert.parent.h + dy; } - } else { //lock.bottom - if (initial.h - dy > min_sane_h && initial.tb.h + dy > min_sane_h) { - initial.tb.ptr->height = initial.tb.h + dy; - initial.tb.sib.ptr->height = initial.tb.sib.h - dy; + } else { // lock.bottom + if (initial.h - dy > min_sane_h && initial.vert.h + dy > min_sane_h) { + initial.vert.ptr->height = initial.vert.h + dy; + initial.vert.parent.ptr->height = initial.vert.parent.h - dy; } } - arrange_windows(initial.tb.ptr->parent, -1, -1); + arrange_windows(initial.vert.ptr->parent, -1, -1); } default: return; @@ -300,15 +307,17 @@ void pointer_mode_update(void) { void pointer_mode_reset(void) { switch (pointer_state.mode) { - case M_FLOATING | M_DRAGGING: case M_FLOATING | M_RESIZING: + case M_FLOATING | M_DRAGGING: reset_initial_view(); break; - case M_TILING | M_DRAGGING: case M_TILING | M_RESIZING: + (void) reset_initial_sibling; + break; + + case M_TILING | M_DRAGGING: default: - return; + break; } } -