From 814910a379e36e02b6c29745518f935fc08c5227 Mon Sep 17 00:00:00 2001 From: Sameer Rahmani Date: Thu, 2 Apr 2020 22:39:43 +0100 Subject: [PATCH] Add the untracked files Signed-off-by: Sameer Rahmani --- lib/fg42/wm.el | 149 +++++++++++++++++++++++++++++++++++ scripts/fg42-wm | 20 +++++ share/xsessions/fg42.desktop | 15 ++++ 3 files changed, 184 insertions(+) create mode 100644 lib/fg42/wm.el create mode 100644 scripts/fg42-wm create mode 100644 share/xsessions/fg42.desktop diff --git a/lib/fg42/wm.el b/lib/fg42/wm.el new file mode 100644 index 0000000..07ad344 --- /dev/null +++ b/lib/fg42/wm.el @@ -0,0 +1,149 @@ +;;; WM --- Enables FG42 as a window manager using EXWM +;;; Commentary: +;;; Code: +(require 'fpkg) + + +(defmacro when-wm (&rest body) + "Run the BODY only if in wm mode." + (if (string= (getenv "FG42_WM") "true") + `(progn ,@body) + nil)) + + +(defmacro when-not-wm (&rest body) + "Run the BODY only if in wm mode." + (if (string= (getenv "FG42_WM") "true") + nil + `(progn ,@body))) + + +(defun disable-nlinum () + "Disables nlinum and fringe-mode." + (fringe-mode 1) + (nlinum-mode -1)) + + +(defun run-program (path) + "Execute the program at the given PATH." + (start-process-shell-command path nil path)) + + +(defun run-program-in-xterm (path &optional name) + "Execute the program at the given PATH via xterm with the given NAME." + (run-program (concat "xterm -e " path))) + + +(defun rename-x-window (&optional name) + "Rename the current buffer to NAME." + (interactive) + (let ((new-name (or name (read-string "New name: ")))) + (exwm-workspace-rename-buffer new-name))) + + +(defability wm () + "Window manager ability for FG42." + (depends-on 'exwm) + + (defun initialize-wm () + (when-wm + (require 'exwm) + (require 'exwm-config) + (require 'exwm-systemtray) + (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) + ;; 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 "/usr/bin/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) + + ;; 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 + ([?\C-b] . [left]) + ([?\M-b] . [C-left]) + ([?\C-f] . [right]) + ([?\M-f] . [C-right]) + ([?\C-p] . [up]) + ([?\C-n] . [down]) + ([?\C-a] . [home]) + ([?\C-e] . [end]) + ([?\M-v] . [prior]) + ([?\C-v] . [next]) + ([?\C-d] . [delete]) + ([?\C-k] . [S-end delete]) + ;; cut/paste. + ([?\C-w] . [?\C-x]) + ([?\M-w] . [?\C-c]) + ([?\C-y] . [?\C-v]) + ;; search + ([?\C-s] . [?\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) + + ;; Do not forget to enable EXWM. It will start by itself when things are + ;; ready. You can put it _anywhere_ in your configuration. + (exwm-enable) + (exwm-systemtray-enable) + + (with-ability nlinum + (add-hook 'exwm-mode-hook 'disable-nlinum))))) + + +(provide 'fg42/wm) +;;; wm.el ends here diff --git a/scripts/fg42-wm b/scripts/fg42-wm new file mode 100644 index 0000000..96e8e58 --- /dev/null +++ b/scripts/fg42-wm @@ -0,0 +1,20 @@ +#! /bin/sh + +# Disable access control for the current user. +xhost +SI:localuser:$USER + +# Make Java applications aware this is a non-reparenting window manager. +export _JAVA_AWT_WM_NONREPARENTING=1 + +# Set default cursor. +xsetroot -cursor_name left_ptr + +# Set keyboard repeat rate. +xset r rate 200 60 + +~/.xinitrc +# Uncomment the following block to use the exwm-xim module. +#export XMODIFIERS=@im=exwm-xim +#export GTK_IM_MODULE=xim +#export QT_IM_MODULE=xim +#export CLUTTER_IM_MODULE=xim diff --git a/share/xsessions/fg42.desktop b/share/xsessions/fg42.desktop new file mode 100644 index 0000000..df91afe --- /dev/null +++ b/share/xsessions/fg42.desktop @@ -0,0 +1,15 @@ +[Desktop Entry] +Encoding=UTF-8 +Name=FG42 +GenericName=FG42 +Comment=An Emacs base editor and WM for emacsians +MimeType=text/x-makefile;text/x-c++hdr;text/x-c++src;text/x-java;application/x-shellscript;text/x-c;text/x-c++;text/x-ruby;text/x-python;text/x-clojure;text/css;text/html;text/x-javascript; +Type=Application +Terminal=false +Categories=Development;TextEditor; +StartupWMClass=FG42 +Exec=/usr/local/bin/fg42-wm +Icon=fg42 +Version=2.67 +X-LightDM-DesktopName=FG42 +DesktopNames=FG42