Compare commits

..

5 Commits

Author SHA1 Message Date
c327eb18c6
Make the xdg dependency optional
We now default to using `~/.cache/waybar-current-task.json` if the `xdg` package is not present.
2023-01-31 08:47:36 +01:00
754fd9d2fa Merge pull request '[Bugfix] Make sure we remove all text properties before outputting JSON data' (#8) from remove-text-properties into main
Reviewed-on: #8
2021-10-16 10:24:06 +00:00
a144ee13c0
[Bugfix] Make sure we remove all text properties before outputting JSON data 2021-10-16 06:25:34 +02:00
612c0d1e31
Do not use org-clock-goto to get tags 2021-03-29 10:20:01 +01:00
lh@hrdl.eu
3e71766f85
Add-hook org-clock-cancel-hook 2021-03-13 16:01:43 +01:00

View File

@ -38,7 +38,7 @@
;;; Code: ;;; Code:
(require 'xdg) (require 'xdg nil t)
(require 'json) (require 'json)
(require 'org-clock) (require 'org-clock)
@ -47,7 +47,9 @@
:group 'emacs) :group 'emacs)
(defcustom org-clock-waybar-filename (defcustom org-clock-waybar-filename
(expand-file-name "waybar-current-task.json" (xdg-cache-home)) (if (fboundp 'xdg-cache-home)
(expand-file-name "waybar-current-task.json" (xdg-cache-home))
(expand-file-name "~/.cache/waybar-current-task.json"))
"Name of the file to save task data to." "Name of the file to save task data to."
:type 'string :type 'string
:group 'org-clock-waybar) :group 'org-clock-waybar)
@ -58,86 +60,35 @@
:type 'string :type 'string
:group 'org-clock-waybar) :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 (defconst org-clock-waybar-filename-coding-system
(if (coding-system-p 'utf-8-emacs) (if (coding-system-p 'utf-8-emacs)
'utf-8-emacs 'utf-8-emacs
'emacs-mule) 'emacs-mule)
"Coding system of the file `org-clock-waybar-filename'.") "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." "Get the title of TASK."
(if (org-clocking-p) (when (org-clocking-p) (substring-no-properties org-clock-current-task)))
(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." "Get the category of TASK."
(when (org-clocking-p) (get-text-property 0 'org-category org-clock-current-task))) (when (org-clocking-p) (get-text-property 0 'org-category org-clock-current-task)))
(defun org-clock-waybar--list-of-strings-p (object) (defun org-clock-waybar--get-tooltip ()
"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." "The default tooltip to send to waybar."
(when (org-clocking-p) (when (org-clocking-p)
(let ((clocked-time (org-clock-get-clocked-time))) (let ((clocked-time (org-clock-get-clocked-time)))
(format "%s: %s (%s)" (format "%s: %s (%s)"
(org-clock-waybar-get-task-category) (org-clock-waybar--get-task-category)
(org-clock-waybar-get-task-title) (org-clock-waybar--get-task-title)
(org-duration-from-minutes clocked-time))))) (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." "Get the tags of the currently clocked-in task."
(when (org-clocking-p) (when (org-clocking-p)
(save-window-excursion (or (org-with-point-at org-clock-marker (org-get-tags))
(org-clock-goto) "")
(org-get-tags)))) ))
(defun org-clock-waybar--get-clocked-task-json () (defun org-clock-waybar--get-clocked-task-json ()
"Get the currently clocked-in tasks data as a stringified JSON object. "Get the currently clocked-in tasks data as a stringified JSON object.
@ -145,42 +96,18 @@ When nil, the percentage text will be an empty string."
The output is in JSON format constructed in a way so Waybar can process it. 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 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'." value of `org-clock-waybar-not-clocked-in-text'."
(let* ((text-func (or 'org-clock-waybar-text-function (let* ((category (org-clock-waybar--get-task-category))
'org-clock-waybar-get-task-title)) (title (org-clock-waybar--get-task-title))
(text (funcall text-func)) (tooltip (org-clock-waybar--get-tooltip))
(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))) (output (json-new-object)))
(or (null title) (setq output (json-add-to-object
(stringp title) output
(error "Title must be a string (org-clock-waybar)!")) "text"
(or (null alt) (or title org-clock-waybar-not-clocked-in-text)))
(stringp alt) (setq output (json-add-to-object output "alt" (or category "")))
(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 "tooltip" (or tooltip "")))
(setq output (json-add-to-object output "class" (or class ""))) (setq output (json-add-to-object output "class" (or (org-clock-waybar--get-tags) "")))
(setq output (json-add-to-object output "percentage" (or percentage ""))) (setq output (json-add-to-object output "percentage" ""))
(json-encode output))) (json-encode output)))
(defun org-clock-waybar-save-task () (defun org-clock-waybar-save-task ()
@ -197,13 +124,18 @@ value of `org-clock-waybar-not-clocked-in-text'."
This function is ought to be used via Emacsclient: This function is ought to be used via Emacsclient:
emacsclient --eval '(org-clock-waybar-output-task)'" emacsclient --eval '(org-clock-waybar-output-task)'"
(org-clock-waybar--get-clocked-task-json)) (let* ((output (org-clock-waybar--get-clocked-task-json))
(start 0)
(end (length output)))
(set-text-properties start end nil output)
output))
(defun org-clock-waybar-setup () (defun org-clock-waybar-setup ()
"Setup org-clock-waybar. "Setup org-clock-waybar.
It adds `org-clock-waybar-save-task' to both `org-clock-in-hook' and It adds `org-clock-waybar-save-task' to both `org-clock-in-hook' and
`org-clock-out-hook'." `org-clock-out-hook'."
(add-hook 'org-clock-cancel-hook #'org-clock-waybar-save-task)
(add-hook 'org-clock-in-hook #'org-clock-waybar-save-task) (add-hook 'org-clock-in-hook #'org-clock-waybar-save-task)
(add-hook 'org-clock-out-hook #'org-clock-waybar-save-task) (add-hook 'org-clock-out-hook #'org-clock-waybar-save-task)
(add-hook 'kill-emacs-hook #'org-clock-waybar-save-task)) (add-hook 'kill-emacs-hook #'org-clock-waybar-save-task))