I forgot the implementation:

```
(define-button-type 'org-clock-in-button
  'follow-link t
  'face 'custom-button
  'mouse-face 'custom-button-mouse
  'action (lambda (b) (org-clock-in)))

(define-button-type 'org-clock-out-button
  'follow-link t
  'face 'custom-button
  'mouse-face 'custom-button-mouse
  'action (lambda (b) (org-clock-out)))

(defun has-clock-in-button ()
  (s-contains? "Clock In" (nth 4 (org-heading-components))))

 (defun has-clock-out-button ()
  (s-contains? "Clock Out" (nth 4 (org-heading-components))))

(defun pod/add-clock-in-button-to-right-of-heading ()
  (unless (has-clock-in-button)
  (save-excursion
    (org-end-of-line)
    (let ((end-of-line-before-insert (point)))
      (insert "    Clock In")
      (let* ((button-start (+ 4 end-of-line-before-insert))
    (button-end (+ 8 button-start)))
(make-button button-start button-end :type 'org-clock-in-button))))))

;; (defun remove-clock-in-button ()
;; )

(defun pod/add-clock-out-button-to-right-of-heading ()
  (unless (has-clock-out-button)
  (outline-up-heading)
  ;; (remove-clock-in-button)
  (save-excursion
    (org-end-of-line)
    (let ((end-of-line-before-insert (point)))
      (insert "    Clock Out")
      (let* ((button-start (+ 4 end-of-line-before-insert))
    (button-end (+ 9 button-start)))
(make-button button-start button-end :type 'org-clock-out-button))))))

(add-hook 'org-after-todo-state-change-hook #'pod/add-clock-in-button-to-right-of-heading)

(add-hook 'org-clock-in-hook #'pod/add-clock-out-button-to-right-of-heading)

(add-hook 'org-clock-out-hook #'pod/add-clock-in-button-to-right-of-heading)
```

On Feb 18, 2023 at 10:00 AM, pareto optimal <pareto.optimal@mailfence.com> wrote:
Hi all!

I've recently been playing with emacs on Android and wanted an easier way to clock in.

My idea was to put buttons beside org headings that are TODO items. I do this by:

- removing clocking buttons on heading if present, then adding a clock in button on 'org-after-todo-state-change-hook`

- removing clocking buttons on heading if present, then adding a clock out button on 'org-clock-in-hook

- removing clocking buttons on heading if present, then adding a clock in button on 'org-clock-out-hook

Well, the removing part isn't quite implemented yet but that's the idea. Otherwise what I'll paste below is a working implementation.

I'm new to using buttons and emacs and I found the only way to place the button where I wanted was to insert some blank space after the heading. Is that expected and best practice or is there some other way to do it?

Would this be something useful in core org-mode? I know at least a few friends who've asked me "why isn't there some button I can click by headings to clock in" when I showed them how I use org-mode.

I also welcome any other ideas or comments.

Thank you for your time.


ParetoOptimalDev
https://www.paretooptimal.dev/