diff --git a/core/cubes/editor.el b/core/cubes/editor.el index 6eabc24..deb7f71 100644 --- a/core/cubes/editor.el +++ b/core/cubes/editor.el @@ -245,11 +245,11 @@ ;; their flag is active otherwise they will be skipped (let ((mline (or (plist-get fg42/editor-cube-params :modeline) - fg42/default-modeline))) - + #'fg42/default-modeline))) + (fg42/statusbar-cube) ;; (fg42/modeline-cube) - ;; (fg42/setup-modeline-format mline) - (fg42/statusbar-cube)) + (fg42/setup-modeline-format mline) + ) (fg42/font-cube) (fg42/pinentry-cube) diff --git a/core/cubes/icons.el b/core/cubes/icons.el new file mode 100644 index 0000000..2876e9b --- /dev/null +++ b/core/cubes/icons.el @@ -0,0 +1,41 @@ +;;; IconsCubes --- The modeline related cubes for FG42 -*- lexical-binding: t; -*- +;; +;; Copyright (c) 2010-2021 Sameer Rahmani & Contributors +;; +;; Author: Sameer Rahmani +;; URL: https://gitlab.com/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: +(require 'fpkg) +(require 'fg42/cube) + + +;; TODO: Break this into two cubes +(defcube fg42/all-the-icons-cube + "Install the [[https://github.com/domtronn/all-the-icons.el][all-the-icons.el]] +package." + (:title "All the icons cube" + :flag all-the-icons + :flag-default t) + + (fpkg/use all-the-icons + :if (display-graphic-p))) + + +(provide 'cubes/icons) +;;; icons.el ends here diff --git a/core/cubes/modeline.el b/core/cubes/modeline.el index bdc81f5..a2eccd6 100644 --- a/core/cubes/modeline.el +++ b/core/cubes/modeline.el @@ -23,6 +23,11 @@ ;;; Code: (require 'fpkg) (require 'fg42/cube) +(require 'cubes/icons) + +(autoload-cube 'fg42/statusbar-default + "modeline/statusbar-default.el" + "The default StatusBar modeline.") ;; TODO: Break this into two cubes @@ -34,8 +39,10 @@ :flag-default t) (defun fg42/mini-modeline-setter (def) - (setq-default mini-modeline-l-format (plist-get def :long)) - (setq-default mini-modeline-r-format (plist-get def :brief))) + (let ((def-list (func def))) + (setq-default mini-modeline-l-format (plist-get def-list :long)) + (setq-default mini-modeline-r-format (plist-get def-list :brief)))) + (fpkg/use smart-mode-line :straight (smart-mode-line :source melpa) @@ -59,6 +66,7 @@ :config (add-hook 'fg42-after-init-hook #'mini-modeline-mode))) + (defcube fg42/statusbar-cube "Status bar replaces the default mode line aned merges with the mini buffer to provide a minimal interface for displaying @@ -68,8 +76,15 @@ valuable information." :group modeline :flag-default t) + + (fg42/all-the-icons-cube) + (defun fg42/statusbar-setter (def) - (setq-default fg42/statusbar-components (plist-get def :brief))) + (unless (null def) + (setq-default fg42/statusbar-components + (plist-get (funcall def) :brief)) + (setq-default fg42/statusbar-components + (plist-get (funcall #'fg42/statusbar-default) :brief)))) (setq fg42/modeline-setter #'fg42/statusbar-setter) diff --git a/core/cubes/modeline/setup.el b/core/cubes/modeline/setup.el deleted file mode 100644 index 590d23d..0000000 --- a/core/cubes/modeline/setup.el +++ /dev/null @@ -1,56 +0,0 @@ -;;; ModelineCubes --- The modeline related cubes for FG42 -*- lexical-binding: t; -*- -;; -;; Copyright (c) 2010-2021 Sameer Rahmani & Contributors -;; -;; Author: Sameer Rahmani -;; URL: https://gitlab.com/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: -(require 'doom-modeline) -(require 'mini-modeline) - - -(defun fg42/setup-mini-modeline () - "Setup the doom modeline to work with mini modeline." - ;; (add-hook 'minibuffer-inactive-mode-hook - ;; (lambda () - ;; (make-local-variable 'face-remapping-alist) - ;; (add-to-list 'face-remapping-alist '(default (:background "#21252b"))))) - - (doom-modeline-def-modeline 'minibuffer-line - '(modals - workspace-name - window-number - matches - buffer-info - remote-host - buffer-position - word-count - selection-info) - '(misc-info major-mode process vcs lsp checker " \n")) - - (setq mini-modeline-r-format '(:eval (doom-modeline-format--minibuffer-line))) - (setq mini-modeline-right-padding 1 - mini-modeline-enhance-visual nil) - (set-face-attribute 'mode-line nil :box nil) - (set-face-attribute 'mini-modeline-mode-line nil :background (face-background 'modus-theme-intense-blue) :height 0.2) - (set-face-attribute 'mini-modeline-mode-line-inactive nil :background (face-background 'fringe) :height 0.2)) - - -(provide 'cubes/modeline/setup) -;;; setup.el ends here diff --git a/core/cubes/modeline/statusbar-default.el b/core/cubes/modeline/statusbar-default.el new file mode 100644 index 0000000..11c7494 --- /dev/null +++ b/core/cubes/modeline/statusbar-default.el @@ -0,0 +1,53 @@ +;;; FG42 --- The mighty editor for the emacsians -*- lexical-binding: t; -*- +;; +;; Copyright (c) 2010-2022 Sameer Rahmani +;; +;; Author: Sameer Rahmani +;; URL: https://gitlab.com/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: +(require 'fg42/modeline) +(require 'fg42/statusbar) + + +(defbar-unit battery 30 "B-" + (format "B%s" (with-temp-buffer + (insert-file-contents "/sys/class/power_supply/BAT0/capacity") + (buffer-string)))) + +;; The default modeline for FG42 that is compatible with +;; the FG42's status bar only +(defmode-line fg42/statusbar-default + (if (display-graphic-p) + (progn + ;; We are in the graphical world + (require 'all-the-icons) + + (list + :brief (list + 'battery + "|" '(buffer-name) "|" '(format-mode-line "%l:%c") "|" '(format-time-string "%m-%d %H:%M")) + :long " ")) + ;; No GUI + (list + :brief (list) + :long ""))) + + +(provide 'fg42/modeline/statusbar-default) +;;; statusbar-default.el ends here diff --git a/core/fg42/core.el b/core/fg42/core.el index 7efbfa1..7185c41 100644 --- a/core/fg42/core.el +++ b/core/fg42/core.el @@ -28,6 +28,9 @@ (defvar fg42-after-init-hook nil "The hook tha runs when FG42 finished running the user configuration") +(defvar fg42/debug-p nil + "The hook tha runs when FG42 finished running the user configuration") + (defvar fg42-home (getenv "FG42_HOME") "The pass to fg42-home.") diff --git a/core/fg42/cube.el b/core/fg42/cube.el index 5464cb6..26cd3fd 100644 --- a/core/fg42/cube.el +++ b/core/fg42/cube.el @@ -128,13 +128,13 @@ ;; Run the pre init hook (run-hooks (quote ,pre-init-hook)) - (message "Initializing '%s' cube." (quote ,cube-name)) + (fg42/info "Initializing '%s' cube." (quote ,cube-name)) ;; Run the body (let ((result (progn ,@body))) ;; Run the post init hook (run-hooks (quote ,post-init-hook)) result)) - (message "[SKIP] The '%s' cube is already active." ',cube-name))) + (fg42/info "The '%s' cube is already active." ',cube-name))) (defun ,cube-name (&rest params) (interactive) @@ -144,7 +144,7 @@ ;; Otherwise check for the flag to be active (if-flag ,flag-var (,cube-name-internal params) - (message "The flag for '%s' cube is disabled. Skiping." ,(symbol-name cube-name))))) + (fg42/info "The flag for '%s' cube is disabled. Skiping." ,(symbol-name cube-name))))) ;; Set the symbol-plist of the cube-name to its props (setplist ',cube-name ',complete-props)))) diff --git a/core/fg42/modeline.el b/core/fg42/modeline.el index 7e0274a..73cbe1a 100644 --- a/core/fg42/modeline.el +++ b/core/fg42/modeline.el @@ -23,16 +23,23 @@ ;;; Code: (defvar fg42/modeline-setter #'fg42/default-mode-line-setter) -(defvar fg42/default-modeline - (list - :brief '("hnt |" (buffer-name)) - - :long " ")) -(defun fg42/default-mode-line-setter (_) +(defmacro defmode-line (name &rest body) + `(defun ,name () ,@body)) + + +;; The default modeline has to be nil to let the +;; modeline setters know that they can use their +;; default modeline +(defmode-line fg42/default-modeline) + + +(defun fg42/default-mode-line-setter (def) "Set the modeline definition in X to the `fg42-modeline'." - (setq mode-line-format (plist-get fg42/default-modeline :brief))) + (unless (null def) + (setq mode-line-format (plist-get def :brief)) + (setq mode-line-format (plist-get (fg42/default-modeline) :brief)))) (defun fg42/setup-modeline-format (definition) @@ -40,8 +47,6 @@ (funcall fg42/modeline-setter definition)) -(defmacro defmode-line (name body) - `(defvar ,name ,@body)) (provide 'fg42/modeline) diff --git a/core/fg42/statusbar.el b/core/fg42/statusbar.el index 3c48b99..f131169 100644 --- a/core/fg42/statusbar.el +++ b/core/fg42/statusbar.el @@ -22,9 +22,12 @@ ;;; Commentary: ;;; Code: +;; Some of the functions in this module are borrowed from `mini-modeline' +;; at https://github.com/kiennq/emacs-mini-modeline (GPL). I modified to +;; fit my needs. + ;;; Require (require 'minibuffer) -(require 'dash) (require 'frame) (require 'timer) (require 'face-remap) @@ -34,7 +37,7 @@ ;; ============================================================================ (defgroup fg42/statusbar nil - "Modular tray bar." + "Status bar group." :group 'fg42/statusbar) @@ -57,7 +60,7 @@ :group 'fg42/statusbar) (defcustom fg42/statusbar-refresh-idle-delay 0.1 - "Update idle delay of awesome tray, in seconds." + "Update idle delay of bar in seconds." :type 'double :group 'fg42/statusbar) @@ -93,6 +96,7 @@ Nil means current selected frame." "Modeline face for active window." :group 'fg42/statusbar) + (defface fg42/statusbar-mode-line-inactive '((((background light)) :background "#dddddd" :height 0.1 :box nil) @@ -101,6 +105,7 @@ Nil means current selected frame." "Modeline face for inactive window." :group 'fg42/statusbar) + ;; ============================================================================ ;; Vars ;; ============================================================================ @@ -132,8 +137,19 @@ Nil means current selected frame." (defvar fg42/statusbar-command-state 'begin "The state of current executed command begin -> [exec exec-read] -> end.") +(defvar fg42/statusbar-enable-hook nil) +(defvar fg42/statusbar-disable-hook nil) + (defvar-local fg42/statusbar--orig-mode-line mode-line-format) +(defvar-local fg42/statusbar--face-cookie nil) + +(defvar fg42/statusbar--orig-mode-line-remap + (or (alist-get 'mode-line face-remapping-alist) 'mode-line)) + +(defvar fg42/statusbar--orig-mode-line-inactive-remap + (or (alist-get 'mode-line-inactive face-remapping-alist) 'mode-line-inactive)) + ;; ============================================================================ ;; Definitions ;; ============================================================================ @@ -147,6 +163,26 @@ BODY will be supplied with orig-func and args." '((name . ,name))))) +(defmacro defbar-unit (name interval default &rest body) + "Create a status bar unit with a dedicated timer. + +It will create a unit with the given NAME and DEFAULT value and a timer +that runs the given BODY at the given INTERVAL." + (declare (indent defun)) + (let ((timer-name (intern (format "$%s-timer" name)))) + `(progn + (defvar ,name ,default) + (defvar ,timer-name) + (add-hook 'fg42/statusbar-enable-hook + (lambda () + (setq ,timer-name + (run-with-timer 0 ,interval (lambda () ,@body))))) + (add-hook 'fg42/statusbar-disable-hook + (lambda () + (when (timerp ,timer-name) + (cancel-timer ,timer-name))))))) + + (defsubst fg42/statusbar-pre-cmd () "Pre command hook of fg42/statusbar." (setq fg42/statusbar-command-state 'begin)) @@ -226,8 +262,7 @@ BODY will be supplied with orig-func and args." ;; Add update timer. (setq fg42/statusbar-timer - ;; (run-with-timer 0 fg42/statusbar-refresh-idle-delay 'fg42/statusbar-show-info) - (run-with-timer 0 fg42/statusbar-refresh-idle-delay 'fg42/statusbar-display)) + (run-with-timer 0 fg42/statusbar-refresh-idle-delay #'fg42/statusbar-display)) (add-hook 'minibuffer-setup-hook #'fg42/statusbar-enter-minibuffer) (add-hook 'minibuffer-exit-hook #'fg42/statusbar-exit-minibuffer) @@ -250,13 +285,9 @@ BODY will be supplied with orig-func and args." (setq fg42/statusbar-command-state 'exec-read) (apply orig-func args))) + (run-hooks 'fg42/statusbar-enable-hook) (setq fg42/statusbar-active-p t)) -(defvar-local fg42/statusbar--face-cookie nil) -(defvar fg42/statusbar--orig-mode-line-remap - (or (alist-get 'mode-line face-remapping-alist) 'mode-line)) -(defvar fg42/statusbar--orig-mode-line-inactive-remap - (or (alist-get 'mode-line-inactive face-remapping-alist) 'mode-line-inactive)) (defun fg42/statusbar-disable () "Disable the status bar." @@ -311,6 +342,7 @@ BODY will be supplied with orig-func and args." (with-current-buffer " *Minibuf-0*" (erase-buffer)) + (run-hooks 'fg42/statusbar-disable-hook) (setq fg42/statusbar-active-p nil)) @@ -322,7 +354,6 @@ BODY will be supplied with orig-func and args." (when (not (stringp result)) (error "The result of %s is not string" result)) (when (> (length result) 0) - (fg42/statusbar--log "fg42/statusbar: ---%s\n" result) result))) fg42/statusbar-components " ")) @@ -343,7 +374,7 @@ as `snails'." (string-width (or message-string "")) fg42/statusbar-info-padding-right))) (cond - ;; Fill message's end with whitespace to keep tray info at right of minibuffer. + ;; Fill message's end with whitespace to keep the info at right of minibuffer. ((> blank-length 0) (progn (let* ((inhibit-message t)) diff --git a/core/fg42/utils.el b/core/fg42/utils.el index 55a672c..c997ec2 100644 --- a/core/fg42/utils.el +++ b/core/fg42/utils.el @@ -178,5 +178,18 @@ is non-nil value it means that the function can be called interactively." nil)) +(defmacro fg42/log (tag args) + "If the debug is enabled log the give ARGS." + (if fg42/debug-p + `(message "[%s]: %s" ,tag (apply #'format ,args)) + nil)) + + +(defmacro fg42/info (&rest args) + "If the debug is enabled log the give ARGS." + (fg42/log "INFO" args)) + + + (provide 'fg42/utils) ;;; utils.el ends here