mirror of
https://github.com/ebeem/guile-swayer.git
synced 2024-12-25 21:59:00 +01:00
add auto-reload module
This commit is contained in:
parent
c1e67d46bf
commit
ae09bf465e
3 changed files with 108 additions and 5 deletions
|
@ -135,12 +135,12 @@ Clone this repository to your =~/.config/sway=
|
|||
| sjson | A patched version of =guile-json=; planned to be a separate dependency in the future (not embedded). |
|
||||
|------------------------------+-----------------------------------------------------------------------------------------------------------|
|
||||
| modules/ | Directory containing modules for extending Sway using =swayipc=. |
|
||||
| modules/auto-reload.scm | TODO: Watcher to automatically reload Sway when Guile files change. |
|
||||
| modules/auto-reload.scm | Watcher to automatically reload Sway when Guile files change. |
|
||||
| modules/general.scm | Inspired by Emacs =general= package; provides an easy interface for assigning keybindings. |
|
||||
| modules/kbd.scm | WIP: Translates Emacs-like keybindings to be compatible with =Sway=. |
|
||||
| modules/kbd.scm | Translates Emacs-like keybindings to be compatible with =Sway=. |
|
||||
| modules/which-key.scm | TODO: Inspired by Emacs =which-key= package; enhances keybinding discovery and management. |
|
||||
| modules/workspace-grid.scm | Configures workspaces in a grid and enables movement between them in specified directions (see workflow). |
|
||||
| modules/workspace-groups.scm | WIP: Spans/synchronizes workspaces across monitors (see workflow). |
|
||||
| modules/workspace-groups.scm | Spans/synchronizes workspaces across monitors (see workflow). |
|
||||
|------------------------------+-----------------------------------------------------------------------------------------------------------|
|
||||
| swayipc/ | Directory containing the core code for =swayipc=, facilitating communication with Sway. |
|
||||
| swayipc/connection | Establishes =IPC= connection for handling events and commands with Sway. |
|
||||
|
|
1
init.scm
1
init.scm
|
@ -16,6 +16,7 @@
|
|||
(swayipc dispatcher))
|
||||
|
||||
(load "behavior.scm")
|
||||
|
||||
;; init keybindings
|
||||
(load "keybindings.scm")
|
||||
(keybindings-init)
|
||||
|
|
|
@ -1,5 +1,107 @@
|
|||
;; TODO
|
||||
;; use example:
|
||||
;; NOTE: use full path for your home, don't use tilde (~)
|
||||
;; (auto-reload-configure #:directories '("/home/ebeem/.config/sway/"))
|
||||
;; (auto-reload-init)
|
||||
|
||||
(define-module (modules auto-reload)
|
||||
#:use-module (swayipc dispatcher)
|
||||
#:export ())
|
||||
#:use-module (system foreign)
|
||||
#:use-module (system foreign-library)
|
||||
#:use-module (srfi srfi-1)
|
||||
#:use-module (srfi srfi-18)
|
||||
#:use-module (rnrs bytevectors)
|
||||
#:use-module (ice-9 rdelim)
|
||||
#:export (auto-reload-configure
|
||||
auto-reload-init))
|
||||
|
||||
;; The list directories to watch for changes
|
||||
(define DIRECTORIES '())
|
||||
|
||||
;; Load the inotify library
|
||||
(define inotify (dynamic-link "libc.so.6"))
|
||||
|
||||
;; Import the necessary functions from the inotify library
|
||||
(define inotify-init
|
||||
(pointer->procedure int (dynamic-func "inotify_init" inotify) '()))
|
||||
|
||||
(define inotify-add-watch
|
||||
(pointer->procedure int (dynamic-func "inotify_add_watch" inotify)
|
||||
(list int '* uint32)))
|
||||
|
||||
(define inotify-rm-watch
|
||||
(pointer->procedure int (dynamic-func "inotify_rm_watch" inotify)
|
||||
(list int int)))
|
||||
|
||||
(define read
|
||||
(pointer->procedure int (dynamic-func "read" inotify)
|
||||
(list int '* size_t)))
|
||||
|
||||
;; Define constants for inotify events
|
||||
(define IN_ACCESS #x00000001)
|
||||
(define IN_MODIFY #x00000002)
|
||||
(define IN_ATTRIB #x00000004)
|
||||
(define IN_CLOSE_WRITE #x00000008)
|
||||
(define IN_CLOSE_NOWRITE #x00000010)
|
||||
(define IN_OPEN #x00000020)
|
||||
(define IN_MOVED_FROM #x00000040)
|
||||
(define IN_MOVED_TO #x00000080)
|
||||
(define IN_CREATE #x00000100)
|
||||
(define IN_DELETE #x00000200)
|
||||
(define IN_DELETE_SELF #x00000400)
|
||||
(define IN_MOVE_SELF #x00000800)
|
||||
(define IN_UNMOUNT #x00002000)
|
||||
(define IN_Q_OVERFLOW #x00004000)
|
||||
(define IN_IGNORED #x00008000)
|
||||
(define IN_ONLYDIR #x01000000)
|
||||
(define IN_DONT_FOLLOW #x02000000)
|
||||
(define IN_EXCL_UNLINK #x04000000)
|
||||
(define IN_MASK_ADD #x20000000)
|
||||
(define IN_ISDIR #x40000000)
|
||||
(define IN_ONESHOT #x80000000)
|
||||
|
||||
;; Create an inotify instance
|
||||
(define fd (inotify-init))
|
||||
|
||||
(define (watch-directory dir)
|
||||
"Watch the directory DIR for file changes."
|
||||
(inotify-add-watch fd dir (+ IN_CREATE IN_DELETE IN_MODIFY)))
|
||||
|
||||
(define (event-loop)
|
||||
"Event loop to process inotify events."
|
||||
(let* ((buffer (make-bytevector 1024))
|
||||
(event-size 4)
|
||||
(event (bytevector->pointer buffer)))
|
||||
(let loop ()
|
||||
(let ((length (read fd event 1024)))
|
||||
(if (> length 0)
|
||||
(let ((event-type (bytevector-s32-native-ref
|
||||
(pointer->bytevector event 4 0) 0)))
|
||||
|
||||
;; TODO: should check for event, currently it always returns 1 for some reason
|
||||
;; there might be something wrong with the way the point is converted
|
||||
|
||||
;; (cond
|
||||
;; ((logand event-type IN_CREATE)
|
||||
;; (format #t "File created: ~a\n" name))
|
||||
;; ((logand event-type IN_DELETE)
|
||||
;; (format #t "File deleted: ~a\n" name))
|
||||
;; ((logand event-type IN_MODIFY)
|
||||
;; (format #t "File modified: ~a\n" name)))
|
||||
(sway-reload))
|
||||
(loop))))))
|
||||
|
||||
(define* (auto-reload-configure #:key directories)
|
||||
"Configure auto reload parameters.
|
||||
Parameters:
|
||||
- directories: list of directories to watch for changes."
|
||||
(set! DIRECTORIES directories))
|
||||
|
||||
(define (auto-reload-init)
|
||||
"Start listening for change events on the configured directories"
|
||||
(for-each (lambda (dir)
|
||||
(format #t "watching directory ~a for auto reload\n" dir)
|
||||
(watch-directory (string->pointer dir)))
|
||||
DIRECTORIES)
|
||||
|
||||
;; Start the event loop
|
||||
(thread-start! (make-thread event-loop)))
|
||||
|
|
Loading…
Reference in a new issue