diff --git a/lisp/fg42/editor.el b/lisp/fg42/editor.el index 01ef21e..9903352 100644 --- a/lisp/fg42/editor.el +++ b/lisp/fg42/editor.el @@ -21,7 +21,6 @@ ;; ;;; Commentary: ;;; Code: - (eval-when-compile (require 'fpkg) ;; Language support @@ -29,7 +28,8 @@ (require 'fg42/langs/cpp) (require 'fg42/langs/verilog) (require 'fg42/langs/python) - (require 'fg42/langs/elisp)) + (require 'fg42/langs/elisp) + (require 'fg42/wm)) (require 'server) @@ -313,7 +313,13 @@ shipped with Emacs." (when (not (server-running-p)) (when-wm (setq server-name "fg42-wm")) - (server-start))) + (server-start)) + + (when-wm + ;; Activating the WM mode + (exwm-enable) + (exwm-systemtray-enable) + (exwm-randr-enable))) (provide 'fg42/editor) diff --git a/lisp/fg42/wm.el b/lisp/fg42/wm.el new file mode 100644 index 0000000..e5f2233 --- /dev/null +++ b/lisp/fg42/wm.el @@ -0,0 +1,164 @@ +;;; FG42 --- The mighty editor for the emacsians -*- lexical-binding: t; -*- +;; +;; Copyright (c) 2010-2024 Sameer Rahmani & Contributors +;; +;; Author: Sameer Rahmani +;; URL: https://devheroes.codes/FG42/FG42 +;; Version: 3.0.0 +;; +;; This program is free software; you can redistribute it and/or modify +;; it under the terms of the GNU General Public License as published by +;; the Free Software Foundation, either version 3 of the License, or +;; (at your option) any later version. +;; +;; This program is distributed in the hope that it will be useful, +;; but WITHOUT ANY WARRANTY; without even the implied warranty of +;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +;; GNU General Public License for more details. +;; +;; You should have received a copy of the GNU General Public License +;; along with this program. If not, see . +;; +;;; Commentary: +;;; Code: +(eval-when-compile + (require 'fpkg)) + + +(defvar workspace-configuration + '(0 "HDMI-1" + 1 "HDMI-1" + 2 "HDMI-1" + 3 "HDMI-1" + 4 "HDMI-1" + 5 "HDMI-1" + 6 "HDMI-1" + 7 "HDMI-1" + 8 "HDMI-1" + 9 "HDMI-1") + "Workspace configuration for EXWM. (default 10 screens on HDMI-1).") + +;; TODO: Document this +;; (add-hook 'exwm-randr-screen-change-hook +;; (lambda () +;; (start-process-shell-command +;; "xrandr" nil "xrandr --output HDMI-1 --above eDP-1 --mode 1920x1080"))) + + +(when-wm + (use! exwm-randr + "EXWM plugin to interact with xrandr." + :commands exwm-randr-enable + :config + (setq exwm-randr-workspace-output-plist workspace-configuration)) + + + (use! exwm-systemtray + "Enables systemtray on EXWM" + :commands exwm-systemtray-enable) + + (use! exwm-config + :commands) + + (use! exwm + "Emacs X Widnow manager." + :commands exwm-enable + :config + (require 'exwm-config) + (exwm-config-ido) + + ;; Set the initial number of workspaces (they can also be created later). + (setq exwm-workspace-number 10) + ;; All buffers created in EXWM mode are named "*EXWM*". You may want to + ;; change it in `exwm-update-class-hook' and `exwm-update-title-hook', which + ;; are run when a new X window class name or title is available. Here's + ;; some advice on this topic: + ;; + Always use `exwm-workspace-rename-buffer` to avoid naming conflict. + ;; + For applications with multiple windows (e.g. GIMP), the class names of + ;; all windows are probably the same. Using window titles for them makes + ;; more sense. + ;; In the following example, we use class names for all windows except for + ;; Java applications and GIMP. + (add-hook 'exwm-update-class-hook + (lambda () + (unless (or (string-prefix-p "sun-awt-X11-" exwm-instance-name) + (string= "gimp" exwm-instance-name)) + (exwm-workspace-rename-buffer exwm-class-name)))) + + (add-hook 'exwm-update-title-hook + (lambda () + (when (or (not exwm-instance-name) + (string-prefix-p "sun-awt-X11-" exwm-instance-name) + (string= "gimp" exwm-instance-name)) + (exwm-workspace-rename-buffer exwm-title)))) + + ;; Global keybindings can be defined with `exwm-input-global-keys'. + ;; Here are a few examples: + (setq exwm-input-global-keys + `( + ;; Bind "s-r" to exit char-mode and fullscreen mode. + ([?\s-r] . exwm-reset) + ([?\s-g] . keyboard-quit) + ([8388640] . other-window) + ;; Bind "s-w" to switch workspace interactively. + ([?\s-w] . exwm-workspace-switch) + ;; Bind "s-0" to "s-9" to switch to a workspace by its index. + ,@(mapcar (lambda (i) + `(,(kbd (format "s-%d" i)) . + (lambda () + (interactive) + (exwm-workspace-switch-create ,i)))) + (number-sequence 0 9)) + ;; Bind "s-&" to launch applications ('M-&' also works if the output + ;; buffer does not bother you). + ([?\s-d] . (lambda (command) + (interactive (list (read-shell-command "$ "))) + (start-process-shell-command command nil command))) + ;; Bind "s-" to "slock", a simple X display locker. + ([s-f2] . (lambda () + (interactive) + (start-process "" nil "slock"))))) + + ;; To add a key binding only available in line-mode, simply define it in + ;; `exwm-mode-map'. The following example shortens 'C-c q' to 'C-q'. + (define-key exwm-mode-map [?\C-q] #'exwm-input-send-next-key) + + (push ?\C-c exwm-input-prefix-keys) + + ;; The following example demonstrates how to use simulation keys to mimic + ;; the behavior of Emacs. The value of `exwm-input-simulation-keys` is a + ;; list of cons cells (SRC . DEST), where SRC is the key sequence you press + ;; and DEST is what EXWM actually sends to application. Note that both SRC + ;; and DEST should be key sequences (vector or string). + (setq exwm-input-simulation-keys + `( + ;; movement + (,(kbd "C-b") . left) + (,(kbd "M-b") . ,(kbd "C-")) + (,(kbd "C-f") . right) + (,(kbd "M-f") . ,(kbd "C-")) + (,(kbd "C-p") . up) + (,(kbd "C-n") . down) + (,(kbd "C-a") . home) + (,(kbd "C-e") . end) + (,(kbd "M-v") . prior) + (,(kbd "C-v") . next) + (,(kbd "C-d") . delete) + ;;(,(kbs "C-k") . [S-end delete]) + ;; navigation + (,(kbd "C-c b") . ,(kbd "M-")) + (,(kbd "C-c f") . ,(kbd "M-")) + (,(kbd "C-c w") . ,(kbd "C-w")) + (,(kbd "C-w") . ,(kbd "C-x")) + (,(kbd "M-w") . ,(kbd "C-c")) + (,(kbd "C-y") . ,(kbd "C-v")) + ;; search + (,(kbd "C-s") . ,(kbd "C-f")))) + ;; You can hide the minibuffer and echo area when they're not used, by + ;; uncommenting the following line. + ;;(setq exwm-workspace-minibuffer-position 'bottom) + )) + + +(provide 'fg42/wm) +;;; wm.el ends here diff --git a/nix/fg42.nix b/nix/fg42.nix index c7bbac6..dd38352 100644 --- a/nix/fg42.nix +++ b/nix/fg42.nix @@ -48,6 +48,7 @@ supportWM ? true, xorg, + slock, supportPython ? true,