diff options
Diffstat (limited to 'sway/handlers.c')
-rw-r--r-- | sway/handlers.c | 135 |
1 files changed, 121 insertions, 14 deletions
diff --git a/sway/handlers.c b/sway/handlers.c index d18be253..2a5113cc 100644 --- a/sway/handlers.c +++ b/sway/handlers.c | |||
@@ -14,8 +14,13 @@ | |||
14 | #include "container.h" | 14 | #include "container.h" |
15 | #include "focus.h" | 15 | #include "focus.h" |
16 | 16 | ||
17 | uint32_t keys_pressed[32]; | ||
18 | |||
17 | static struct wlc_origin mouse_origin; | 19 | static struct wlc_origin mouse_origin; |
18 | 20 | ||
21 | static bool m1_held = false; | ||
22 | static bool m2_held = false; | ||
23 | |||
19 | static bool pointer_test(swayc_t *view, void *_origin) { | 24 | static bool pointer_test(swayc_t *view, void *_origin) { |
20 | const struct wlc_origin *origin = _origin; | 25 | const struct wlc_origin *origin = _origin; |
21 | //Determine the output that the view is under | 26 | //Determine the output that the view is under |
@@ -144,10 +149,10 @@ static bool handle_view_created(wlc_handle handle) { | |||
144 | locked_container_focus = true; | 149 | locked_container_focus = true; |
145 | break; | 150 | break; |
146 | //set modals as floating containers | 151 | //set modals as floating containers |
147 | case WLC_BIT_POPUP: | ||
148 | case WLC_BIT_MODAL: | 152 | case WLC_BIT_MODAL: |
149 | wlc_view_bring_to_front(handle); | 153 | wlc_view_bring_to_front(handle); |
150 | newview = new_floating_view(handle); | 154 | newview = new_floating_view(handle); |
155 | case WLC_BIT_POPUP: | ||
151 | break; | 156 | break; |
152 | } | 157 | } |
153 | if (newview) { | 158 | if (newview) { |
@@ -166,9 +171,9 @@ static void handle_view_destroyed(wlc_handle handle) { | |||
166 | //regular view created regularly | 171 | //regular view created regularly |
167 | case 0: | 172 | case 0: |
168 | case WLC_BIT_MODAL: | 173 | case WLC_BIT_MODAL: |
169 | case WLC_BIT_POPUP: | ||
170 | if (view) { | 174 | if (view) { |
171 | arrange_windows(destroy_view(view), -1, -1); | 175 | swayc_t *parent = destroy_view(view); |
176 | arrange_windows(parent, -1, -1); | ||
172 | if (!focused || focused == view) { | 177 | if (!focused || focused == view) { |
173 | set_focused_container(container_under_pointer()); | 178 | set_focused_container(container_under_pointer()); |
174 | } | 179 | } |
@@ -181,6 +186,7 @@ static void handle_view_destroyed(wlc_handle handle) { | |||
181 | //Takes container focus | 186 | //Takes container focus |
182 | case WLC_BIT_OVERRIDE_REDIRECT|WLC_BIT_UNMANAGED: | 187 | case WLC_BIT_OVERRIDE_REDIRECT|WLC_BIT_UNMANAGED: |
183 | locked_container_focus = false; | 188 | locked_container_focus = false; |
189 | case WLC_BIT_POPUP: | ||
184 | break; | 190 | break; |
185 | } | 191 | } |
186 | set_focused_container(get_focused_view(&root_container)); | 192 | set_focused_container(get_focused_view(&root_container)); |
@@ -250,7 +256,6 @@ static bool handle_key(wlc_handle view, uint32_t time, const struct wlc_modifier | |||
250 | return false; | 256 | return false; |
251 | } | 257 | } |
252 | static uint8_t head = 0; | 258 | static uint8_t head = 0; |
253 | static uint32_t array[QSIZE]; | ||
254 | bool cmd_success = false; | 259 | bool cmd_success = false; |
255 | 260 | ||
256 | struct sway_mode *mode = config->current_mode; | 261 | struct sway_mode *mode = config->current_mode; |
@@ -259,13 +264,13 @@ static bool handle_key(wlc_handle view, uint32_t time, const struct wlc_modifier | |||
259 | 264 | ||
260 | //Find key, if it has been pressed | 265 | //Find key, if it has been pressed |
261 | int mid = 0; | 266 | int mid = 0; |
262 | while (mid < head && array[mid] != sym) { | 267 | while (mid < head && keys_pressed[mid] != sym) { |
263 | ++mid; | 268 | ++mid; |
264 | } | 269 | } |
265 | if (state == WLC_KEY_STATE_PRESSED && mid == head && head + 1 < QSIZE) { | 270 | if (state == WLC_KEY_STATE_PRESSED && mid == head && head + 1 < QSIZE) { |
266 | array[head++] = sym; | 271 | keys_pressed[head++] = sym; |
267 | } else if (state == WLC_KEY_STATE_RELEASED && mid < head) { | 272 | } else if (state == WLC_KEY_STATE_RELEASED && mid < head) { |
268 | memmove(array + mid, array + mid + 1, sizeof*array * (--head - mid)); | 273 | memmove(keys_pressed + mid, keys_pressed + mid + 1, sizeof*keys_pressed * (--head - mid)); |
269 | } | 274 | } |
270 | // TODO: reminder to check conflicts with mod+q+a versus mod+q | 275 | // TODO: reminder to check conflicts with mod+q+a versus mod+q |
271 | int i; | 276 | int i; |
@@ -280,7 +285,7 @@ static bool handle_key(wlc_handle view, uint32_t time, const struct wlc_modifier | |||
280 | xkb_keysym_t *key = binding->keys->items[j]; | 285 | xkb_keysym_t *key = binding->keys->items[j]; |
281 | uint8_t k; | 286 | uint8_t k; |
282 | for (k = 0; k < head; ++k) { | 287 | for (k = 0; k < head; ++k) { |
283 | if (array[k] == *key) { | 288 | if (keys_pressed[k] == *key) { |
284 | match = true; | 289 | match = true; |
285 | break; | 290 | break; |
286 | } | 291 | } |
@@ -291,12 +296,12 @@ static bool handle_key(wlc_handle view, uint32_t time, const struct wlc_modifier | |||
291 | } | 296 | } |
292 | 297 | ||
293 | if (match) { | 298 | if (match) { |
294 | //Remove matched keys from array | 299 | //Remove matched keys from keys_pressed |
295 | int j; | 300 | int j; |
296 | for (j = 0; j < binding->keys->length; ++j) { | 301 | for (j = 0; j < binding->keys->length; ++j) { |
297 | uint8_t k; | 302 | uint8_t k; |
298 | for (k = 0; k < head; ++k) { | 303 | for (k = 0; k < head; ++k) { |
299 | memmove(array + k, array + k + 1, sizeof*array * (--head - k)); | 304 | memmove(keys_pressed + k, keys_pressed + k + 1, sizeof*keys_pressed * (--head - k)); |
300 | break; | 305 | break; |
301 | } | 306 | } |
302 | } | 307 | } |
@@ -311,13 +316,100 @@ static bool handle_key(wlc_handle view, uint32_t time, const struct wlc_modifier | |||
311 | return cmd_success; | 316 | return cmd_success; |
312 | } | 317 | } |
313 | 318 | ||
314 | static bool handle_pointer_motion(wlc_handle view, uint32_t time, const struct wlc_origin *origin) { | 319 | static bool handle_pointer_motion(wlc_handle handle, uint32_t time, const struct wlc_origin *origin) { |
315 | static wlc_handle prev_view = 0; | 320 | static struct wlc_origin prev_pos; |
321 | static wlc_handle prev_handle = 0; | ||
316 | mouse_origin = *origin; | 322 | mouse_origin = *origin; |
317 | if (config->focus_follows_mouse && prev_view != view) { | 323 | bool changed_floating = false; |
324 | int i = 0; | ||
325 | // Do checks to determine if proper keys are being held | ||
326 | swayc_t *view = active_workspace->focused; | ||
327 | if (m1_held) { | ||
328 | if (view->is_floating) { | ||
329 | while (keys_pressed[i++]) { | ||
330 | if (keys_pressed[i] == config->floating_mod) { | ||
331 | int dx = mouse_origin.x - prev_pos.x; | ||
332 | int dy = mouse_origin.y - prev_pos.y; | ||
333 | sway_log(L_DEBUG, "Moving from px: %d to cx: %d and from py: %d to cy: %d", prev_pos.x, mouse_origin.x, prev_pos.y, mouse_origin.y); | ||
334 | sway_log(L_DEBUG, "Moving: dx: %d, dy: %d", dx, dy); | ||
335 | |||
336 | view->x += dx; | ||
337 | view->y += dy; | ||
338 | changed_floating = true; | ||
339 | break; | ||
340 | } | ||
341 | } | ||
342 | } | ||
343 | } else if (m2_held) { | ||
344 | if (view->is_floating) { | ||
345 | while (keys_pressed[i++]) { | ||
346 | if (keys_pressed[i] == config->floating_mod) { | ||
347 | int dx = mouse_origin.x - prev_pos.x; | ||
348 | int dy = mouse_origin.y - prev_pos.y; | ||
349 | sway_log(L_DEBUG, "Moving from px: %d to cx: %d and from py: %d to cy: %d", prev_pos.x, mouse_origin.x, prev_pos.y, mouse_origin.y); | ||
350 | sway_log(L_INFO, "Moving: dx: %d, dy: %d", dx, dy); | ||
351 | |||
352 | // Move and resize the view based on the dx/dy and mouse position | ||
353 | int midway_x = view->x + view->width/2; | ||
354 | int midway_y = view->y + view->height/2; | ||
355 | |||
356 | if (dx < 0) { | ||
357 | changed_floating = true; | ||
358 | if (mouse_origin.x > midway_x) { | ||
359 | sway_log(L_INFO, "Downsizing view to the left"); | ||
360 | view->width += dx; | ||
361 | } else { | ||
362 | sway_log(L_INFO, "Upsizing view to the left"); | ||
363 | view->x += dx; | ||
364 | view->width -= dx; | ||
365 | } | ||
366 | } else if (dx > 0){ | ||
367 | changed_floating = true; | ||
368 | if (mouse_origin.x > midway_x) { | ||
369 | sway_log(L_INFO, "Upsizing to the right"); | ||
370 | view->width += dx; | ||
371 | } else { | ||
372 | sway_log(L_INFO, "Downsizing to the right"); | ||
373 | view->x += dx; | ||
374 | view->width -= dx; | ||
375 | } | ||
376 | } | ||
377 | |||
378 | if (dy < 0) { | ||
379 | changed_floating = true; | ||
380 | if (mouse_origin.y > midway_y) { | ||
381 | sway_log(L_INFO, "Downsizing view to the top"); | ||
382 | view->height += dy; | ||
383 | } else { | ||
384 | sway_log(L_INFO, "Upsizing the view to the top"); | ||
385 | view->y += dy; | ||
386 | view->height -= dy; | ||
387 | } | ||
388 | } else if (dy > 0) { | ||
389 | changed_floating = true; | ||
390 | if (mouse_origin.y > midway_y) { | ||
391 | sway_log(L_INFO, "Upsizing to the bottom"); | ||
392 | view->height += dy; | ||
393 | } else { | ||
394 | sway_log(L_INFO, "Downsizing to the bottom"); | ||
395 | view->y += dy; | ||
396 | view->height -= dy; | ||
397 | } | ||
398 | } | ||
399 | break; | ||
400 | } | ||
401 | } | ||
402 | } | ||
403 | } | ||
404 | if (config->focus_follows_mouse && prev_handle != handle) { | ||
318 | set_focused_container(container_under_pointer()); | 405 | set_focused_container(container_under_pointer()); |
319 | } | 406 | } |
320 | prev_view = view; | 407 | prev_handle = handle; |
408 | prev_pos = mouse_origin; | ||
409 | if (changed_floating) { | ||
410 | arrange_windows(view, -1, -1); | ||
411 | return true; | ||
412 | } | ||
321 | return false; | 413 | return false; |
322 | } | 414 | } |
323 | 415 | ||
@@ -325,9 +417,24 @@ static bool handle_pointer_button(wlc_handle view, uint32_t time, const struct w | |||
325 | uint32_t button, enum wlc_button_state state) { | 417 | uint32_t button, enum wlc_button_state state) { |
326 | swayc_t *focused = get_focused_container(&root_container); | 418 | swayc_t *focused = get_focused_container(&root_container); |
327 | if (state == WLC_BUTTON_STATE_PRESSED) { | 419 | if (state == WLC_BUTTON_STATE_PRESSED) { |
420 | sway_log(L_DEBUG, "Mouse button %u pressed", button); | ||
421 | if (button == 272) { | ||
422 | m1_held = true; | ||
423 | } | ||
424 | if (button == 273) { | ||
425 | m2_held = true; | ||
426 | } | ||
328 | swayc_t *pointer = container_under_pointer(); | 427 | swayc_t *pointer = container_under_pointer(); |
329 | set_focused_container(pointer); | 428 | set_focused_container(pointer); |
330 | return (pointer && pointer != focused); | 429 | return (pointer && pointer != focused); |
430 | } else { | ||
431 | sway_log(L_DEBUG, "Mouse button %u released", button); | ||
432 | if (button == 272) { | ||
433 | m1_held = false; | ||
434 | } | ||
435 | if (button == 273) { | ||
436 | m2_held = false; | ||
437 | } | ||
331 | } | 438 | } |
332 | return false; | 439 | return false; |
333 | } | 440 | } |