diff --git a/org-clock-waybar.el b/org-clock-waybar.el index 766b130..0ca2802 100644 --- a/org-clock-waybar.el +++ b/org-clock-waybar.el @@ -58,30 +58,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) (save-window-excursion @@ -94,18 +145,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 ()