From 4a3c4b549e2fad8cd1fadf342056c53298a9eea4 Mon Sep 17 00:00:00 2001 From: Gergely Polonkai Date: Thu, 11 Mar 2021 16:07:56 +0100 Subject: [PATCH] Make sure we clear the current task when clocking out or when killing Emacs --- org-clock-waybar.el | 32 +++++++++++++++++++++----------- 1 file changed, 21 insertions(+), 11 deletions(-) diff --git a/org-clock-waybar.el b/org-clock-waybar.el index 0df8469..8cc97a5 100644 --- a/org-clock-waybar.el +++ b/org-clock-waybar.el @@ -64,17 +64,20 @@ 'emacs-mule) "Coding system of the file `org-clock-waybar-filename'.") -(defun org-clock-waybar--get-clocked-task-json () +(defun org-clock-waybar--get-clocked-task-json (&optional clocking-out) "Get the currently clocked-in task’s data as a stringified JSON object. 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 (when org-clock-current-task - (get-text-property 0 'org-category org-clock-current-task))) - (title (when org-clock-current-task - (substring-no-properties org-clock-current-task))) - (output (json-new-object))) +value of `org-clock-waybar-not-clocked-in-text'. + +If CLOCKING-OUT is non-nil, `org-clock-current-task' will be treated as if it +were nil; this is required because `org-clock-out' calls the hook functions +before setting `org-clock-current-task' to nil." + (let* ((task (if clocking-out nil org-clock-current-task)) + (category (when task (get-text-property 0 'org-category task))) + (title (when task (substring-no-properties task))) + (output (json-new-object))) (setq output (json-add-to-object output "text" @@ -87,14 +90,20 @@ value of `org-clock-waybar-not-clocked-in-text'." (setq output (json-add-to-object output "percentage" "")) (json-encode output))) -(defun org-clock-waybar-save-task () - "Save the current clocked in task to `org-clock-waybar-filename'." +(defun org-clock-waybar-save-task (&optional clocking-out) + "Save the current clocked in task to `org-clock-waybar-filename'. + +If CLOCKING-OUT is non-nil, treat the current task as if it were nil." (with-temp-buffer (erase-buffer) (set-buffer-file-coding-system org-clock-waybar-filename-coding-system) - (insert (org-clock-waybar--get-clocked-task-json)) + (insert (org-clock-waybar--get-clocked-task-json clocking-out)) (write-file org-clock-waybar-filename))) +(defun org-clock-waybar-clear-task () + "Clear the current task from `org-clock-waybar-filename'." + (org-clock-waybar-save-task t)) + (defun org-clock-waybar-ouptut-task () "Output the current task in JSON format Waybar can understand. @@ -109,7 +118,8 @@ emacsclient --eval '(org-clock-waybar-output-task)'" It adds `org-clock-waybar-save-task' to both `org-clock-in-hook' and `org-clock-out-hook'." (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-task) + (add-hook 'kill-emacs-hook #'org-clock-waybar-clear-task)) (provide 'org-clock-waybar) ;;; org-clock-waybar.el ends here