Make every part of the output configurable with user defined functions #5
| @@ -61,30 +61,81 @@ | ||||
|   :type 'string | ||||
|   :group 'org-clock-waybar) | ||||
|  | ||||
| (defcustom org-clock-waybar-text-function | ||||
|   nil | ||||
|   "Function to generate the title text. | ||||
|  | ||||
| The function must return a single string. | ||||
| When nil, `org-clock-waybar-get-task-title' is used." | ||||
|   :type 'function | ||||
|   :group 'org-clock-waybar) | ||||
|  | ||||
| (defcustom org-clock-waybar-alt-function | ||||
|   nil | ||||
|   "Function to generate the alternative text. | ||||
|  | ||||
| The function must return a single string. | ||||
| When nil, `org-clock-waybar-get-task-category' is used." | ||||
|   :type 'function | ||||
|   :group 'org-clock-waybar) | ||||
|  | ||||
| (defcustom org-clock-waybar-class-function | ||||
|   nil | ||||
|   "Function to generate the class. | ||||
|  | ||||
| The function must either return a string, or a list of strings. | ||||
| When nil, `org-clock-waybar-get-tags' is used." | ||||
|   :type 'function | ||||
|   :group 'org-clock-waybar) | ||||
|  | ||||
| (defcustom org-clock-waybar-tooltip-function | ||||
|   nil | ||||
|   "Function to generate the tooltip. | ||||
|  | ||||
| The function must return a string. | ||||
| When nil, `org-clock-waybar-get-tooltip' is used." | ||||
|   :type 'function | ||||
|   :group 'org-clock-waybar) | ||||
|  | ||||
| (defcustom org-clock-waybar-percentage-function | ||||
|   nil | ||||
|   "Function to generate the percentage text. | ||||
|  | ||||
| When nil, the percentage text will be an empty string." | ||||
|   :type 'function | ||||
|   :group 'org-clock-waybar) | ||||
|  | ||||
| (defconst org-clock-waybar-filename-coding-system | ||||
|   (if (coding-system-p 'utf-8-emacs) | ||||
|       'utf-8-emacs | ||||
|     'emacs-mule) | ||||
|   "Coding system of the file `org-clock-waybar-filename'.") | ||||
|  | ||||
| (defsubst org-clock-waybar--get-task-title () | ||||
| (defsubst org-clock-waybar-get-task-title () | ||||
|   "Get the title of TASK." | ||||
|   (when (org-clocking-p) (substring-no-properties org-clock-current-task))) | ||||
|   (if (org-clocking-p) | ||||
|       (substring-no-properties org-clock-current-task) | ||||
|     org-clock-waybar-not-clocked-in-text)) | ||||
|  | ||||
| (defsubst org-clock-waybar--get-task-category () | ||||
| (defsubst org-clock-waybar-get-task-category () | ||||
|   "Get the category of TASK." | ||||
|   (when (org-clocking-p) (get-text-property 0 'org-category org-clock-current-task))) | ||||
|  | ||||
| (defun org-clock-waybar--get-tooltip () | ||||
| (defun org-clock-waybar--list-of-strings-p (object) | ||||
|   "Return t if OBJECT is a list of strings." | ||||
|   (not (null (delq nil | ||||
|                    (mapcar (lambda (x) (and (stringp x) x)) object))))) | ||||
|  | ||||
| (defun org-clock-waybar-get-tooltip () | ||||
|   "The default tooltip to send to waybar." | ||||
|   (when (org-clocking-p) | ||||
|     (let ((clocked-time (org-clock-get-clocked-time))) | ||||
|       (format "%s: %s (%s)" | ||||
|               (org-clock-waybar--get-task-category) | ||||
|               (org-clock-waybar--get-task-title) | ||||
|               (org-clock-waybar-get-task-category) | ||||
|               (org-clock-waybar-get-task-title) | ||||
|               (org-duration-from-minutes clocked-time))))) | ||||
|  | ||||
| (defun org-clock-waybar--get-tags () | ||||
| (defun org-clock-waybar-get-tags () | ||||
|   "Get the tags of the currently clocked-in task." | ||||
|   (when (org-clocking-p) | ||||
|     (or (org-with-point-at org-clock-marker (org-get-tags)) | ||||
| @@ -97,18 +148,42 @@ | ||||
| The output is in JSON format constructed in a way so Waybar can process it. | ||||
| If there is no clocked in task, alt becomes empty and text will be set to the | ||||
| value of `org-clock-waybar-not-clocked-in-text'." | ||||
|   (let* ((category (org-clock-waybar--get-task-category)) | ||||
|          (title (org-clock-waybar--get-task-title)) | ||||
|          (tooltip (org-clock-waybar--get-tooltip)) | ||||
|   (let* ((text-func (or 'org-clock-waybar-text-function | ||||
|                          'org-clock-waybar-get-task-title)) | ||||
|          (text (funcall text-func)) | ||||
|          (alt-func (or 'org-clock-waybar-alt-function | ||||
|                        'org-clock-waybar-get-task-category)) | ||||
|          (alt (funcall alt-func)) | ||||
|          (tooltip-func (or 'org-clock-waybar-tooltip-function | ||||
|                            'org-clock-waybar-get-tooltip)) | ||||
|          (tooltip (funcall tooltip-func)) | ||||
|          (class-func (or 'org-clock-waybar-class-function | ||||
|                          'org-clock-waybar-get-tags)) | ||||
|          (class (funcall class-func)) | ||||
|          (percentage (when (fboundp 'org-clock-waybar-percentage-function) | ||||
|                        (funcall 'org-clock-waybar-percentage-function))) | ||||
|          (output (json-new-object))) | ||||
|     (setq output (json-add-to-object | ||||
|                   output | ||||
|                   "text" | ||||
|                   (or title org-clock-waybar-not-clocked-in-text))) | ||||
|     (setq output (json-add-to-object output "alt" (or category ""))) | ||||
|     (or (null title) | ||||
|         (stringp title) | ||||
|         (error "Title must be a string (org-clock-waybar)!")) | ||||
|     (or (null alt) | ||||
|         (stringp alt) | ||||
|         (error "Alt text must be a string (org-clock-waybar)!")) | ||||
|     (or (null tooltip) | ||||
|         (stringp tooltip) | ||||
|         (error "Tooltip must be a string (org-clock-waybar)!")) | ||||
|     (or (null class) | ||||
|         (stringp class) | ||||
|         (org-clock-waybar--list-of-strings-p class) | ||||
|         (error "Class must be a string or a list of strings (org-clock-waybar)!")) | ||||
|     (or (null percentage) | ||||
|         (stringp percentage) | ||||
|         (error "Percentage must be a string (org-clock-waybar)!")) | ||||
|     (setq output (json-add-to-object output "text" (or text ""))) | ||||
|     (setq output (json-add-to-object output "alt" (or alt ""))) | ||||
|     (setq output (json-add-to-object output "tooltip" (or tooltip ""))) | ||||
|     (setq output (json-add-to-object output "class" (or (org-clock-waybar--get-tags) ""))) | ||||
|     (setq output (json-add-to-object output "percentage" "")) | ||||
|     (setq output (json-add-to-object output "class" (or class ""))) | ||||
|     (setq output (json-add-to-object output "percentage" (or percentage ""))) | ||||
|     (json-encode output))) | ||||
|  | ||||
| (defun org-clock-waybar-save-task () | ||||
|   | ||||
		Reference in New Issue
	
	Block a user