;;; org-clock-waybar --- Summary ;; Copyright (C) 2021 Gergely Polonkai ;; Author: Gergely Polonkai ;; Keywords: org, clocking, waybar ;; Version: 1.0 ;; Package-Requires: ((emacs "26.1")) ;; URL: https://gitea.polonkai.eu/gergely/org-clock-waybar ;; This program is free software; you can redistribute it and/or modify ;; it under the terms of the GNU General Public License as published by ;; the Free Software Foundation, either version 3 of the License, or ;; (at your option) any later version. ;; This program is distributed in the hope that it will be useful, ;; but WITHOUT ANY WARRANTY; without even the implied warranty of ;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ;; GNU General Public License for more details. ;; You should have received a copy of the GNU General Public License ;; along with this program. If not, see . ;;; Commentary: ;; Export the currently clocked-in task in JSON format that Waybar can process ;; ;; To use it, customize the `org-clock-waybar-filename' variable (defaults to ;; $XDG_CONFIG_HOME/waybar-current-task.json) and add the following snippet to ;; your Waybar config: ;; ;; "custom/org": { ;; "format": " {}", ;; "return-type": "json", ;; "restart-interval": 5, ;; "exec": "cat /home/yourusername/.cache/waybar-current-task.json" ;; } ;;; Code: (require 'xdg) (require 'json) (require 'org-clock) (defgroup org-clock-waybar nil "Send current clocked task to a JSON file for Waybar visualization" :group 'emacs) (defcustom org-clock-waybar-filename (expand-file-name "waybar-current-task.json" (xdg-cache-home)) "Name of the file to save task data to." :type 'string :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'.") (defun org-clock-waybar--get-clocked-task-json (buffer) "Save the current clocked-in task’s title and category to BUFFER. The output is in JSON format. If there is no clocked in task, both title and category will be a JSON null value." (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))) (with-current-buffer buffer (setq output (json-add-to-object output "text" (if title title "Not clocked in"))) (setq output (json-add-to-object output "alt" (if category category ""))) (setq output (json-add-to-object output "tooltip" "")) (setq output (json-add-to-object output "class" "")) (setq output (json-add-to-object output "percentage" "")) (insert (json-encode output))))) (defun org-clock-waybar-save-task () "Save the current clocked in task to `org-clock-waybar-filename'." (with-temp-buffer (erase-buffer) (set-buffer-file-coding-system org-clock-waybar-filename-coding-system) (org-clock-waybar--get-clocked-task-json (current-buffer)) (write-file org-clock-waybar-filename))) (defun org-clock-waybar-setup () "Setup org-clock-waybar. 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)) (provide 'org-clock-waybar) ;;; org-clock-waybar.el ends here