From cd3a1b7749ecfacd0dc47eb32bcae4b23cb439f9 Mon Sep 17 00:00:00 2001 From: Samuel Fadel Date: Fri, 9 Dec 2022 12:39:18 +0100 Subject: Implemented focus prev/next; cleanup on Scheme side. * schewm.c: Implemented focus prev/next and minor helper func * main.scm and wm.scm: Added focus prev/next calls to C --- main.scm | 23 +++-------------------- schewm.c | 34 ++++++++++++++++++++++++++++++++++ wm.scm | 52 ++++++++++++++++++++++++++++++++++++++-------------- 3 files changed, 75 insertions(+), 34 deletions(-) diff --git a/main.scm b/main.scm index a591764..f77acf2 100644 --- a/main.scm +++ b/main.scm @@ -30,30 +30,13 @@ 0 ; offset-height )) -(define (make-key key) - (list #f (key-from-str key))) - -(define (make-shift-key key) - (list #t (key-from-str key))) - (define wm-keybindings `((,(make-shift-key "q") . ,wm-quit) - (,(make-key "Tab") . ,wm-focus-next))) - -(define (grab-keys keybindings) - (unless (null? keybindings) - (let* ((keybinding (car keybindings)) - (chord (car keybinding)) - (func (cdr keybinding)) - (with-shift (car chord)) - (key (car (cdr chord)))) - (if with-shift - (wm-grab-key-with-mod-shift key) - (wm-grab-key-with-mod key)) - (grab-keys (cdr keybindings))))) + (,(make-key "Tab") . ,wm-focus-prev) + (,(make-shift-key "Tab") . ,wm-focus-next))) (when (wm-init) - (grab-keys wm-keybindings) + (wm-grab-keys wm-keybindings) (wm-set-key-press-handler! (lambda (mod keysym) (display (list mod keysym)) diff --git a/schewm.c b/schewm.c index 4a3811a..0129888 100644 --- a/schewm.c +++ b/schewm.c @@ -1934,6 +1934,40 @@ wm_destroy() { dpy_destroy(); } +void +wm_raise_and_center_cursor(struct Client *client) { + dpy_raise_window(client->id); + dpy_center_cursor_client(client); +} + +void +wm_focus_other(bool is_next) { + struct Client *focused = wm.focus; + if (focused == NULL) { + // No current focus, pick first client from the ring + focused = wm.workspaces[wm.cur_workspace].ring; + } else { + // We have focus, pick next/prev + focused = is_next ? focused->next : focused->prev; + } + if (focused == NULL) { + return; + } + + wm_raise_and_center_cursor(focused); + wm_set_focus(focused); +} + +void +wm_focus_prev() { + wm_focus_other(false); +} + +void +wm_focus_next() { + wm_focus_other(true); +} + static uint8_t ev_type(const xcb_generic_event_t *ev) { return ev->response_type & ~0x80; diff --git a/wm.scm b/wm.scm index 4609ea9..744c408 100644 --- a/wm.scm +++ b/wm.scm @@ -1,17 +1,20 @@ (define-module (wm) #:use-module (system foreign) #:export (wm-init - key-from-str + make-key + make-shift-key + wm-grab-keys wm-grab-key-with-mod wm-grab-key-with-mod-shift wm-set-key-press-handler! + wm-focus-prev wm-focus-next wm-run wm-quit)) (define libschewm (dynamic-link "libschewm")) -(define (int-as-bool i) +(define (uint8-as-bool i) (not (eq? 0 i))) (define (schewm-func return-type name args) @@ -20,19 +23,11 @@ (dynamic-func name libschewm) args)) -(define c/key-from-str - (schewm-func uint32 - "keysym_from_str" - (list '*))) - -(define (key-from-str s) - (c/key-from-str (string->pointer s))) - (define c/wm-init - (schewm-func int "wm_init" '())) + (schewm-func uint8 "wm_init" '())) (define (wm-init) - (int-as-bool (c/wm-init))) + (uint8-as-bool (c/wm-init))) (define wm-quit (schewm-func void "wm_quit" '())) @@ -40,6 +35,20 @@ (define wm-run (schewm-func void "wm_run" '())) +(define c/key-from-str + (schewm-func uint32 + "keysym_from_str" + (list '*))) + +(define (key-from-str s) + (c/key-from-str (string->pointer s))) + +(define (make-key key) + (list #f (key-from-str key))) + +(define (make-shift-key key) + (list #t (key-from-str key))) + (define wm-grab-key-with-mod (schewm-func void "wm_grab_key_with_mod" (list uint32))) @@ -48,8 +57,23 @@ (schewm-func void "wm_grab_key_with_mod_shift" (list uint32))) -(define (wm-focus-next) - '()) +(define (wm-grab-keys keybindings) + (unless (null? keybindings) + (let* ((keybinding (car keybindings)) + (chord (car keybinding)) + (func (cdr keybinding)) + (with-shift (car chord)) + (key (car (cdr chord)))) + (if with-shift + (wm-grab-key-with-mod-shift key) + (wm-grab-key-with-mod key)) + (wm-grab-keys (cdr keybindings))))) + +(define wm-focus-prev + (schewm-func void "wm_focus_prev" '())) + +(define wm-focus-next + (schewm-func void "wm_focus_next" '())) (define c/wm-set-key-press-handler (schewm-func void -- cgit v1.2.3