From 378d8b0c655bc4476284988451d873e938ae0b7e Mon Sep 17 00:00:00 2001 From: SqrtMinusOne Date: Wed, 22 Dec 2021 20:00:38 +0300 Subject: [PATCH] docs: add --- README.org | 41 +++++++++++++++++++++++++++++++++++++++++ exwm-modeline.el | 21 ++++++++++++++++----- img/screenshot.png | Bin 0 -> 7120 bytes 3 files changed, 57 insertions(+), 5 deletions(-) create mode 100644 README.org create mode 100644 img/screenshot.png diff --git a/README.org b/README.org new file mode 100644 index 0000000..c4d96fd --- /dev/null +++ b/README.org @@ -0,0 +1,41 @@ +#+TITLE: exwm-modeline + +A modeline segment to display exwm workspaces. + +Here's how it looks near the list of [[https://github.com/nex3/perspective-el][perspectives]] (the segment of the current package is to the left): +[[./img/screenshot.png]] +- workspaces 0 and 5 do not have any X windows +- workspace 1 is the current workspace +- workspace 2 has at least one X window. + +Features: +- Supports =exwm-randr= to display only workspaces related to the current monitor. +- Numbers are clickable. + +* Installation +As the package isn't yet available anywhere but in this repository, you can clone the repository, add it to the =load-path=, and =require= the package: +#+begin_src emacs-lisp +(require 'exwm-modeline) +#+end_src + +My preferred way is to use =use-package= with =straight=: +#+begin_src emacs-lisp +(use-package exwm-modeline + :straight (:host github :repo "SqrtMinusOne/exwm-modelline") + :after (exwm)) +#+end_src + +Then put a call to =exwm-modeline-mode= somewhere after the moment when EXWM has been initialized, for instance: +#+begin_src emacs-lisp +(add-hook 'exwm-init-hook #'exwm-modeline-mode) +#+end_src + +* Customization +Set =exwm-modeline-randr= to nil to turn off filtering of workspaces by monitor. + +Set =exwm-modeline-short= to display only the current workspace in the modeline. + +* Credits +[[https://github.com/nex3/perspective-el][perspective.el]] by [[https://github.com/nex3][@nex3]] was extremely instructive on how to make a modeline segment individual to a particular frame and avoid recalculating it too often. + +[[https://github.com/elken/doom-modeline-exwm][doom-modeline-exwm]] by [[https://github.com/elken][@elken]] also was a source of inspiration. diff --git a/exwm-modeline.el b/exwm-modeline.el index 0c20d37..ee22b3f 100644 --- a/exwm-modeline.el +++ b/exwm-modeline.el @@ -27,14 +27,21 @@ ;;; Commentary: -;; TODO +;; A modeline segment to display exwm workspaces. +;; +;; Features: +;; - Supports `exwm-randr' to display only of workspaces related to +;; the the current monitor. +;; - The segment is clickable. +;; +;; Take a look at `exwm-modeline-mode' for more info. -;;; Code +;;; Code: (require 'exwm-workspace) (require 'exwm-manage) (defgroup exwm-modeline nil - "A modeline segment to show EXWM workspaces" + "A modeline segment to show EXWM workspaces." :group 'mode-line) (defcustom exwm-modeline-dividers '("[" "]" "|") @@ -108,7 +115,7 @@ workspaces." (defun exwm-modeline--format-list (workspace-list) "Format the modestring for the current frame. -WORKSPACE-LIST is the list of frames to display. " +WORKSPACE-LIST is the list of frames to display." (cl-loop for frame in workspace-list for i from 0 to (length workspace-list) for workspace-name = (funcall exwm-workspace-index-map @@ -177,7 +184,7 @@ WORKSPACE-LIST is the list of frames to display. " (frame-parameter nil 'exwm-modeline--string)) (defun exwm-modeline--unmanage-advice (&rest _) - "An advice that updates the modeline. + "An advice to update the modeline. This one is meant to be attached :after `exwm-manage--unmanage-window', because that's when a workspace @@ -189,6 +196,9 @@ i.e. the face in the segment has to change." (define-minor-mode exwm-modeline-mode "A mode for displaying EXWM workspaces in the modeline. +Make sure to call this after EXWM was initialized, for instance +in `exwm-init-hook'. + By default, the mode displays all the workspaces on the current monitor. To display only the current workspace, enable `exwm-modeline-short', and to disable the filtering by the @@ -208,6 +218,7 @@ cases when the workspace list changes." :global t (if exwm-modeline-mode (progn + (exwm-modeline-update) (add-to-list 'global-mode-string '(:eval (exwm-modeline-segment))) (add-hook 'exwm-workspace-list-change-hook #'exwm-modeline-update) (add-hook 'exwm-randr-refresh-hook #'exwm-modeline-update) diff --git a/img/screenshot.png b/img/screenshot.png new file mode 100644 index 0000000000000000000000000000000000000000..326d2f1a83748e9a3c46f8bebca52914440f23f0 GIT binary patch literal 7120 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