diff --git a/org-clock-waybar.el b/org-clock-waybar.el index 93d7f12..0ca2802 100644 --- a/org-clock-waybar.el +++ b/org-clock-waybar.el @@ -58,6 +58,50 @@ :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 @@ -74,6 +118,11 @@ "Get the category of TASK." (when (org-clocking-p) (get-text-property 0 'org-category org-clock-current-task))) +(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) @@ -96,16 +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* ((title (org-clock-waybar-get-task-title)) - (category (org-clock-waybar-get-task-category)) - (tooltip (org-clock-waybar-get-tooltip)) - (class (org-clock-waybar-get-tags)) + (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 ""))) - (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 class ""))) - (setq output (json-add-to-object output "percentage" "")) + (setq output (json-add-to-object output "percentage" (or percentage ""))) (json-encode output))) (defun org-clock-waybar-save-task ()