org-clock-waybar/org-clock-waybar.el

97 lines
3.5 KiB
EmacsLisp
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

;;; org-clock-waybar --- Summary
;; Copyright (C) 2021 Gergely Polonkai
;; Author: Gergely Polonkai <gergely@polonkai.eu>
;; 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 <http://www.gnu.org/licenses/>.
;;; 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 tasks 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