summaryrefslogtreecommitdiff
path: root/emacs/site-lisp/single-header.el
blob: 06faff59b4c35b4fe51047b9fec5033ec870a67c (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
(provide 'single-header)

(defvar single-header--current-header-buffer nil "Read the name")

(defvar single-header-format '(make-header-info-string) "evaluated to fill the header")

(defface single-header '((default . (:background "#000000" :family "Source Code Pro"))) "Face for top line")

(require 'battery)
(defun with-face (str &rest face-plist)
  (add-face-text-property 0 (length str) face-plist t str)
  str)

(defun make-header-info-string ()
  "generates the mode line string that contains all the info to the right"
  (let ((str (concat
              (with-face (battery-format "[%b%p%%]  " (and battery-status-function (funcall battery-status-function)))
                         :weight 'bold)
              (with-face (let* ((mi (memory-info))
                                (tm (float (car mi)))
                                (fm (float (cadr mi)))
                                (ts (float (caddr mi)))
                                (fs (float (cadddr mi))))
                           (format "{%.2f %.2f}  " (- 1 (/ fm tm)) (- 1 (/ fs ts))))
                         :foreground "#00ced1")
              (with-face (format "<%03.2f>  " (car (load-average 1)))
                         :foreground "#da70d6")
              (format-time-string "%a, %b %+4Y-%0m-%0d  ")
              (with-face (format-time-string "%R")
                         :weight 'bold)
              )))
    (setq str (concat (make-string
                       (- (window-max-chars-per-line (minibuffer-window) 'single-header)
                          (length str))
                       ? )
                      str))
    (with-face str 'single-header)))

(defun single-header-init-buffer (buf)
  (with-current-buffer buf
    (insert "header test")
    (jit-lock-mode nil)
    (font-lock-mode -1)
    (buffer-disable-undo)
    (setq-local mode-line-format nil)
    (setq-local header-line-format nil)
    (setq-local cursor-type nil)
    (setq-local cursor-in-non-selected-windows nil)
    (setq-local overflow-newline-into-fringe nil)
    (setq-local word-wrap nil)
    (setq-local show-trailing-whitespace nil)))

(defun single-header-init-window (win)
  (with-selected-window win
    (set-window-dedicated-p win t)
    (set-window-parameter win 'no-other-window t)
    (set-window-parameter win 'no-delete-other-windows t)
    (set-window-margins win 0 0)
    (set-window-fringes win 0 0)
    (set-window-scroll-bars win 0 nil 0 nil)
    (setq-local window-min-height 1)
    (setq-local window-safe-min-height 1)
    (let
        (window-size-fixed)
      (fit-window-to-buffer win 1))
    (setq-local window-size-fixed t)
    (when
        (fboundp 'window-preserve-size)
      (window-preserve-size win nil t))))

(defun single-header-show (buf)
  "show / make a header"
  (if (buffer-live-p buf)
      (let ((win (display-buffer-in-side-window buf '((side . top)
                                                  (slot . -100)))))
        (single-header-init-window win))
    (single-header-make)))

(defun single-header-make ()
  "create the fake header line"
  (interactive)
  (unless (buffer-live-p single-header--current-header-buffer)
    (let ((buf (generate-new-buffer "*header*")))
      (single-header-init-buffer buf)
      (setq single-header--current-header-buffer buf)
      (single-header-show buf))))

(defun single-header-delete ()
  "remove an existing header buffer"
  (interactive)
  (when (buffer-live-p single-header--current-header-buffer)
    (kill-buffer single-header--current-header-buffer)))

(defun single-header-update ()
  "update the contents of the header line according to `single-header-format'"
  (when (buffer-live-p single-header--current-header-buffer)
    (with-current-buffer single-header--current-header-buffer
      (erase-buffer)
      (insert (eval single-header-format)))

    ;; (when exwm-state
    ;;   (exwm-input--set-active-window
    ;;    (or (frame-parameter exwm-workspace--current 'exwm-outer-id)
    ;;        xcb:Window:None)))
    ))

(add-hook 'after-make-frame-functions (lambda (frame)
                                        (with-selected-frame frame
                                       (single-header-show single-header--current-header-buffer))))

;; (use-package lv
  ;; :custom ((lv-use-separator . nil)))

;; do init frame seperately
(single-header-show single-header--current-header-buffer)
(setq single-header--timer nil)
(unless single-header--timer
  (setq single-header--timer (run-with-timer 0 3 'single-header-update)))