From 625f5aed51d76c9113aefbaef5ed92b611e27dc6 Mon Sep 17 00:00:00 2001 From: nixo Date: Tue, 12 May 2020 15:19:36 +0200 Subject: [PATCH] organize code in modules --- etc/config.scm | 172 ++++++++----------------- meson.build | 4 +- share/guile/site/3.0/gri3/bindings.scm | 100 ++++++++++++++ share/guile/site/3.0/gri3/hooks.scm | 16 +++ share/guile/site/3.0/gri3/wm.scm | 2 + src/main.c | 22 +++- 6 files changed, 193 insertions(+), 123 deletions(-) create mode 100644 share/guile/site/3.0/gri3/bindings.scm create mode 100644 share/guile/site/3.0/gri3/hooks.scm create mode 100644 share/guile/site/3.0/gri3/wm.scm diff --git a/etc/config.scm b/etc/config.scm index 6bf98479..177008c1 100644 --- a/etc/config.scm +++ b/etc/config.scm @@ -1,4 +1,13 @@ -(include "hooks.scm") +(use-modules (ice-9 match)) +(use-modules (ice-9 popen)) +(use-modules (ice-9 rdelim)) +(use-modules (gri3 wm)) +(use-modules (gri3 bindings)) +(use-modules (gri3 hooks)) + +(define mode "default") + +(define devel #t) (display "-- GUILE CONFIGURATION START LOADING --\n") @@ -7,10 +16,10 @@ (list c " &")))) ;; (include "i3.scm") -(define font "pango:Fira Mono 12") +(define font "pango:Hack 8") ;; (run-shell-command "./i3bar -b 0") -;; (set-font ) +;; xkb_keysym_from_name(symbol, XKB_KEYSYM_NO_FLAGS) (define (reload) (display "Reloading (with refresh)!\n") @@ -18,43 +27,9 @@ (refresh)) (define (urxvt) - (display "Starting urxvt\n") - (run-shell-command "urxvt")) - -;; (define (config-bars) -;; (bar-start) -;; (set-bar-position "top") -;; (bar-finish) -;; ;; 2 bars -;; (bar-start) -;; (set-bar-position "bottom") -;; (bar-finish) -;; (i3bar)) - -;; ;; (i3bar) -;; ;; (i3-exec "" "" urxvt) - -;; (define (cw) -;; (change-workspace "3")) - -(define (cw1) - (change-workspace "1")) - -(define (cw2) - (let ((resp (change-workspace "2"))) - (if (not (boolean? resp)) - (format #f "~A ~A" (car resp) (cadr resp))))) - -(define (cwz) - (let ((resp (change-workspace "z"))) - (if (not (boolean? resp)) - (format #f "~A ~A" (car resp) (cadr resp))))) - -;; (define (default) -;; (change-workspace "default")) - -(use-modules (ice-9 popen)) -(use-modules (ice-9 rdelim)) + (if devel + (run-shell-command "urxvt") + (run-shell-command "urxvtc"))) (define (run-and-read command) (let* ((port (open-input-pipe command)) @@ -62,91 +37,50 @@ (close-pipe port) str)) -(define (eval-expr) - (run-shell-command (format #f "./i3-msg ~S" (run-and-read "echo '' | dmenu")))) +;; (define (urxvt) (display "URXVT")) -(set-binding "bindsym" "Mod1" "Return" "" "" "" "" - (lambda () (urxvt))) +(define (eval-expr) (run-shell-command (format #f "./i3-msg ~S" (run-and-read "echo '' | dmenu")))) -(set-binding "bindsym" "Mod1" "space" "" "" "" "" - (lambda () (eval-expr))) +(define (run-program) (run-shell-command "dmenu_run")) -(set-binding "bindsym" "Mod1" "r" "" "" "" "" - (lambda () (reload))) +(define-mode-map "M-SPC" 'program-launcher) -(set-binding "bindsym" "Mod1" "1" "" "" "" "" - (lambda () (cw1))) -(set-binding "bindsym" "Mod1" "2" "" "" "" "" - (lambda () (cw2))) -(set-binding "bindsym" "Mod1" "z" "" "" "" "" - (lambda () (cwz))) +(add-key-binding (kbd "M-m") urxvt) +(add-key-binding (kbd "M-RET") urxvt) +(add-key-binding (kbd "M-SPC") run-program) +(add-key-binding (kbd "M-q") kill-window) +(add-key-binding (kbd "M-r") reload) -(set-binding "bindsym" "Mod1" "v" "" "" "" "" - (lambda () (split "vertical"))) -(set-binding "bindsym" "Mod1" "h" "" "" "" "" - (lambda () (split "horizontal"))) +(add-key-binding (kbd "M-r") reload) -(set-binding "bindsym" "Mod1" "q" "" "" "" "" - (lambda () (kill))) +;; Change layout +(add-key-binding (kbd "M-w") (lambda () (layout "tabbed"))) +(add-key-binding (kbd "M-s") (lambda () (layout "stacked"))) +(add-key-binding (kbd "M-e") (lambda () (toggle-layout "split"))) +;; Split +(add-key-binding (kbd "M-v") (lambda () (split "vertical"))) +(add-key-binding (kbd "M-h") (lambda () (split "horizontal"))) +;; Add workspaces +(for-each + (lambda (num) + (add-key-binding + (kbd (format #f "M-~s" num)) + (lambda () (change-workspace (number->string num)))) + (add-key-binding + (kbd (format #f "M-S-~s" num)) + (lambda () (move-to-workspace (number->string num))))) + '(0 1 2 3 4 5 6 7 8 9)) +;; Move windows +(add-key-binding (kbd "M-f") (lambda () (focus-direction "right"))) +(add-key-binding (kbd "M-b") (lambda () (focus-direction "left"))) +(add-key-binding (kbd "M-p") (lambda () (focus-direction "up"))) +(add-key-binding (kbd "M-n") (lambda () (focus-direction "down"))) -(set-binding "bindsym" "Mod1" "Right" "" "" "" "" - (lambda () (focus-direction "right"))) +(when (and (not (defined? 'loaded)) (not devel)) + (run-shell-command "setxkbmap && xmodmap ~/.Xmodmap") + (run-shell-command "emacs --daemon") + (run-shell-command "mcron") + (run-shell-command "urxvtd")) -(set-binding "bindsym" "Mod1" "Left" "" "" "" "" - (lambda () (focus-direction "left"))) - -(set-binding "bindsym" "Mod1" "Up" "" "" "" "" - (lambda () (focus-direction "up"))) - -(set-binding "bindsym" "Mod1" "Down" "" "" "" "" - (lambda () (focus-direction "down"))) - -(set-binding "bindsym" "Mod1" "w" "" "" "" "" - (lambda () (layout "tabbed"))) -(set-binding "bindsym" "Mod1" "s" "" "" "" "" - (lambda () (layout "stacked"))) -(set-binding "bindsym" "Mod1" "e" "" "" "" "" - (lambda () (toggle-layout "split"))) - -;; (set-binding "bindsym" "Mod1" "o" "" "" "" "" -;; (lambda () (move-to-workspace "2"))) - -(display "Loaded\n") -;; (set-binding "bindsym" "Mod2" "Return" "" "" "" "" urxvt) - -;; (set-binding "bindsym" "Mod1" "q" "" "" "" "" kill-window) -;; (set-binding "bindsym" "Mod1" "w" "" "" "" "" kill-client) -;; (set-binding "bindsym" "Mod1" "1" "" "" "" "" default) -;; (set-binding "bindsym" "Mod1" "2" "" "" "" "" cw2) -;; (set-binding "bindsym" "Mod1" "3" "" "" "" "" cw) - -;; ;; Con *ws = con_get_workspace(nc) -;; ;; Con *fs = con_get_fullscreen_covering_ws(ws) -;; ;; con_move_to_output(nc, output, false); -;; ;; con_toggle_fullscreen(nc, CF_OUTPUT); -;; ;; con_move_to_output_name(nc, assignment->dest.output, true); - -;; (define (move-to-workspace window workspace) -;; (display "Moving window ") -;; (display (window-name window)) -;; (display " to workspace ") -;; (display workspace)) - -;; (define assignments -;; ;; #((matcher) assign-function) -;; `(("urxvt" ,(lambda () (move-to-workspace "O" "3"))))) - -;; ;; ((lambda () (+ 2 1))) - -;; ;; (define (t i) (display ("ICAO"))) - -;; ;; ((eval '+) 1 2) - -;; ;; (call-with-values (cdr `("urxvt" ,t)) 0) - -;; (display "-- GUILE CONFIGURATION LOADED --\n") (define loaded #t) - -(run-shell-command "feh --bg-fill ~/freeze/bluescreen_0.png") - -;; (split "vertical") +(run-shell-command "feh --randomize --bg-fill ~/memories/incipit/laptop/wallpapers/") diff --git a/meson.build b/meson.build index 89383df4..3380a028 100644 --- a/meson.build +++ b/meson.build @@ -206,4 +206,6 @@ install_data(sources : [ 'etc/config.scm', 'etc/hooks.scm' ], install_dir : 'etc install_data(sources : [ 'etc/config.scm', 'etc/hooks.scm' ], install_dir : 'etc/gri3/') install_headers('include/ipc.h', subdir : 'gri3') install_subdir('share/applications', install_dir : 'share') -install_subdir('share/xsessions', install_dir : 'share') \ No newline at end of file +install_subdir('share/xsessions', install_dir : 'share') +# Guile library +install_subdir('share/guile', install_dir : 'share') diff --git a/share/guile/site/3.0/gri3/bindings.scm b/share/guile/site/3.0/gri3/bindings.scm new file mode 100644 index 00000000..090f3f85 --- /dev/null +++ b/share/guile/site/3.0/gri3/bindings.scm @@ -0,0 +1,100 @@ +(define-module (gri3 bindings) + #:use-module (gri3 wm) + #:use-module (gri3 hooks) + #:use-module (srfi srfi-1) + #:use-module (ice-9 match) + #:export + (define-mode-map add-key-binding kbd key-press-hook clear-bindings)) + +(define *bindings* '()) +(define *mode-map* '()) +(define *mode* "default") + +(define (sym->name sym) + (or (assoc-ref + '(("\r" . "Return") + (" " . "space")) + sym) + sym)) + +(define (key-press-hook param) + (let ((param (list (list-ref param 0) (list-ref param 1) (sym->name (list-ref param 2))))) + (apply format #t "~A ~A ~s\n" param) + ;; (display *bindings*) + ;; (newline) + (let ((binding (assoc-ref + *bindings* (list *mode* param)))) + ;; (display binding) + ;; (newline) + (if binding + (begin (binding) + #t) + #f)))) + +(define (clear-bindings) (set! *bindings* '())) + +(define (add-key-binding key func) + (match-let (((mode (press mod keysym)) key)) + ;; (format #t "Binding key ~A\n" keysym) + ;; get notified for key with all mods + (for-each + (lambda (mod) + (bind-key keysym mod)) + (list #x8 #x10 #x26 #x40)) + ;; Store the key+func couple in the list of hooks + (set! *bindings* + (assoc-set! *bindings* `("default" (,press ,mod ,keysym)) func)))) + +(define (special->keysym name) + (or (assoc-ref '( ;; ("NUL") + ;; ("REM") + ("RET" . "Return") + ("TAB" . "Tab") + ("LFD" . "Linefeed") + ("ESC" . "Escape") + ("SPC" . "space") + ("DEL" . "Delete")) + name) + name)) + + +(define (define-mode-map map mode) + (set! *mode-map* (append *mode-map* `((,map . ,mode))))) + +;; modifiers +;; ("A" "C" "M" "H" "s" "S") +(define *modifiers* + ;; Where's H? + '(("S" . #b00000001) + ("L" . #b00000010) + ("C" . #b00000100) + ("M" . #b00001000) + ("mod2" . #b00010000) + ("mod3" . #b00100000) + ("s" . #b01000000) + ("mod5" . #b10000000))) + +(define (mod->int mod) + (assoc-ref *modifiers* mod)) + +(define *key-press* 2) + +;; TODO: Support multiple modifiers! Sum their int value +(define (kbd keys) + "Convert keys in our own representation. KEYS should be a string compatible +with the emacs format such as `C-h k'." + (match (let ((keys (string-split keys #\space))) + (map (lambda (key) (string-split key #\-)) keys)) + (((M1 mode) (M2 key)) `((,M1 ,mode) (,*key-press* ,(mod->int M2) ,(special->keysym key)))) + (((M mode) (key)) `((,M ,mode) (,*key-press* 0 ,(special->keysym key)))) + (((M1 M2 key)) `(("") (,*key-press* ,(+ (mod->int M1) (mod->int M2)) ,(special->keysym key)))) + (((M key)) `(("") (,*key-press* ,(mod->int M) ,(special->keysym key)))) + (((key)) `(("") (,*key-press* 0 ,(special->keysym key)))) + (else (display "Cannot parse kdb")))) + +;; (kbd "C-RET C-k") +;; (kbd "C-RET C-k") +;; (kbd "C-RET k") +;; (kbd "C-S-1") +;; (kbd "C-h") +;; (kbd "C") diff --git a/share/guile/site/3.0/gri3/hooks.scm b/share/guile/site/3.0/gri3/hooks.scm new file mode 100644 index 00000000..3e308c70 --- /dev/null +++ b/share/guile/site/3.0/gri3/hooks.scm @@ -0,0 +1,16 @@ +(define-module (gri3 hooks) + #:use-module (gri3 wm) + #:export (enter-notify-hook click-hook)) + +(define (enter-notify-hook params) + "Function called each time the mouse focus changes window. +Param is a list with: the name of the window. +Return #f to prevent changing focus." + (not (string=? (car params) "no-focus"))) + +(define (click-hook params) + ;; (format #t "Clicked ~A" (car params)) + ;; (let ((root-x root-y event-x event-y state same-screen))) + + ;; (not (string=? (car params) "no-focus")) + #t) diff --git a/share/guile/site/3.0/gri3/wm.scm b/share/guile/site/3.0/gri3/wm.scm new file mode 100644 index 00000000..bc5c92a1 --- /dev/null +++ b/share/guile/site/3.0/gri3/wm.scm @@ -0,0 +1,2 @@ +;; empty module extended by the c interface +(define-module (gri3 wm)) diff --git a/src/main.c b/src/main.c index db61f5e9..82b401c3 100644 --- a/src/main.c +++ b/src/main.c @@ -311,12 +311,11 @@ SCM guile_refresh() { } static void* -register_functions (void* data) { - set_defaults(); +register_functions_wm(void * data) { scm_c_define_gsubr ("bind-key", 2, 0, 0, &guile_register_keyboard_key); scm_c_define_gsubr ("change-workspace", 1, 0, 0, &guile_change_workspace); scm_c_define_gsubr ("refresh", 0, 0, 0, &guile_refresh); - scm_c_define_gsubr ("kill", 0, 0, 0, &guile_kill); + scm_c_define_gsubr ("kill-window", 0, 0, 0, &guile_kill); scm_c_define_gsubr ("split", 1, 0, 0, &guile_split); scm_c_define_gsubr ("focus-direction", 1, 0, 0, &guile_focus_direction); scm_c_define_gsubr ("layout", 1, 0, 0, &guile_layout); @@ -326,6 +325,23 @@ register_functions (void* data) { scm_c_define_gsubr ("rename-workspace", 2, 0, 0, &guile_rename_workspace); + scm_c_export("bind-key", + "bind-key", + "change-workspace", + "refresh", + "kill-window", + "split", + "focus-direction", + "layout", + "move-to-workspace", + "toggle-layout", NULL); +} + +static void* +register_functions (void* data) { + set_defaults(); + scm_c_define_module ("gri3 wm", register_functions_wm, data); + return NULL; }