summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSamuel Fadel <samuel@nihil.ws>2022-12-09 12:39:18 +0100
committerSamuel Fadel <samuel@nihil.ws>2022-12-09 12:39:18 +0100
commitcd3a1b7749ecfacd0dc47eb32bcae4b23cb439f9 (patch)
treec46e93cb901ad388bb95936d4a100a70f50f3844
parent6f54084c0ee63f4b341f8f92efbc8b82d3dfa224 (diff)
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
-rw-r--r--main.scm23
-rw-r--r--schewm.c34
-rw-r--r--wm.scm52
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