* Changing the transparency of specific windows
  #+begin_src emacs-lisp
    ;; Stack Trace
    ;; - https://www.google.com/search?client=firefox-b-1-d&q=change+window+transparency+compton
    ;; - https://github.com/chjj/compton/issues/219
    ;; - _NET_WM_WINDOW_OPACITY
    ;; - https://github.com/i3/i3/issues/2840
    ;; - Failure

    ;; - https://www.google.com/search?client=firefox-b-1-d&ei=Qn4OXarOFNG4tQX1yKrwAg&q=dynamically+set+window+transparency+compton&oq=dynamically+set+window+transparency+compton&gs_l=psy-ab.3...1302.1926..2080...0.0..0.121.655.6j1......0....1..gws-wiz.......0i71j33i22i29i30j35i304i39j33i160.w6gx35dRUJc
    ;; - https://www.reddit.com/r/unixporn/comments/3osw03/toggling_transparency_on_windows_in_compton_and/
    ;; - https://github.com/freedesktop/transset
    ;; - XChangeProperty
    ;; - https://gitlab.peach-bun.com/pinion/SFML/commit/135c1716e877464db720265f37316cbb54ef13f2?expanded=1&view=parallel
    ;; - xcb_change_property
    ;; - https://www.x.org/releases/current/doc/man/man3/xcb_change_property.3.xhtml

    ;; Also found this: https://xcb.freedesktop.org/XmlXcb/
    ;; C-h f xcb change property
    ;; Found xcb:ChangeProperty
    ;; Let the hacking begin

    ;; Found xcb:ewmh:-atoms
    ;; added opacity to list
    ;; called init function xcb:ewmh:init
    ;; found opacity is cardinal atom through xprop

    ;; example c call: https://github.com/ehntoo/unagi/blob/master/plugins/opacity.c#L71
    ;; True example: https://github.com/polybar/polybar/blob/ca4426a9620f4db05a0117282fbed3a32a14ec92/src/x11/ewmh.cpp#L168

    ;; reading from transset
    ;; So in C with Xlib, NWWO (my new abbreviation) is essentially an unsigned int.
    ;; max value is completely opaque, min is the opposite.
    ;; However, it's converted to a char array when passed to xlib xchangeproperty

    ;; xcb_change_property(conn->connection, XCB_PROP_MODE_REPLACE, win, _NET_WM_WINDOW_OPACITY, XCB_ATOM_CARDINAL, 32, 1, &values);

    (require 'dash)
    (require 'hydra)

    (defconst my/unsigned-int-max 4294967295)

    (defun my/int-to-char-array (int)
      (cl-labels ((thunk (int depth)
                         (if (= depth 4)
                             nil
                           (cons (% int 256)
                                 (thunk (/ int 256)
                                        (1+ depth))))))
        (thunk int 0)))

    (defun my/char-array-to-int (arr)
      (let ((iter (1- (length arr)))
            (sum 0))
        (while (>= iter 0)
          (setf sum (+ (* 256 sum) (aref arr iter)))
          (decf iter))
        sum))

    (defun my/map-to-unsigned-int (percent)
      (round (* my/unsigned-int-max percent)))

    (defun my/map-to-percent (val)
      (/ val (float my/unsigned-int-max)))

    (defun my/set-transparency (window-id value)
      "`value` should be an float between 0 and and 1,"
      (->> value
           (my/map-to-unsigned-int)
           (my/int-to-char-array)
           (make-instance xcb:ChangeProperty
                          :mode xcb:PropMode:Replace :window window-id
                          :property xcb:Atom:_NET_WM_WINDOW_OPACITY :type xcb:Atom:CARDINAL
                          :format 32 :data-len 1 :data)
           (xcb:+request exwm--connection))
      (xcb:flush exwm--connection))

    (defun my/get-transparency (window-id)
      (let ((reply (->> window-id
                        (make-instance xcb:GetProperty :delete 0
                                       :property xcb:Atom:_NET_WM_WINDOW_OPACITY :type xcb:Atom:CARDINAL
                                       :long-offset 0 :long-length 1
                                       :window)
                        (xcb:+request-unchecked+reply exwm--connection))))
        (let ((char-arr (slot-value reply 'value)))
          (if (zerop (length char-arr))
              1.0
            (-> char-arr
                (my/char-array-to-int)
                (my/map-to-percent))))))

    (defun my/increase-window-transparency ()
      (interactive)
      (when-let (id (exwm--buffer->id (current-buffer)))
        (let* ((curr-trans (my/get-transparency id))
               (new-trans (+ curr-trans 0.1)))
          (my/set-transparency
           id (if (< 1 new-trans) 1 new-trans)))))

    (defun my/decrease-window-transparency ()
      (interactive)
      (when-let (id (exwm--buffer->id (current-buffer)))
        (let* ((curr-trans (my/get-transparency id))
               (new-trans (- curr-trans 0.1)))
          (my/set-transparency
           id (if (< new-trans 0) 0 new-trans)))))

    (defun my/reset-window-transparency ()
      (interactive)
      (when-let (id (exwm--buffer->id (current-buffer)))
        (my/set-transparency id 1.0)))

    (defhydra window-transparency-hydra (*window-map* "t")
      "Manage window splits"
      ("j" my/decrease-window-transparency)
      ("k" my/increase-window-transparency)
      ("r" my/reset-window-transparency)
      ("q" nil))

    (eval-and-compile
      (defconst xcb:ewmh:-atoms
        '( ;; Root Window Properties (and Related Messages)
          _NET_SUPPORTED
          _NET_CLIENT_LIST
          _NET_CLIENT_LIST_STACKING
          _NET_NUMBER_OF_DESKTOPS
          _NET_DESKTOP_GEOMETRY
          _NET_DESKTOP_VIEWPORT
          _NET_CURRENT_DESKTOP
          _NET_DESKTOP_NAMES
          _NET_ACTIVE_WINDOW
          _NET_WORKAREA
          _NET_SUPPORTING_WM_CHECK
          _NET_VIRTUAL_ROOTS
          _NET_DESKTOP_LAYOUT
          _NET_SHOWING_DESKTOP
          ;; Other Root Window Messages
          _NET_CLOSE_WINDOW
          _NET_MOVERESIZE_WINDOW
          _NET_WM_MOVERESIZE
          _NET_RESTACK_WINDOW
          _NET_REQUEST_FRAME_EXTENTS
          ;; Application Window Properties
          _NET_WM_NAME
          _NET_WM_VISIBLE_NAME
          _NET_WM_ICON_NAME
          _NET_WM_VISIBLE_ICON_NAME
          _NET_WM_DESKTOP
          _NET_WM_WINDOW_TYPE
          _NET_WM_STATE
          _NET_WM_ALLOWED_ACTIONS
          _NET_WM_STRUT
          _NET_WM_STRUT_PARTIAL
          _NET_WM_ICON_GEOMETRY
          _NET_WM_ICON
          _NET_WM_PID
          _NET_WM_HANDLED_ICONS
          _NET_WM_USER_TIME
          _NET_WM_USER_TIME_WINDOW
          _NET_FRAME_EXTENTS
          _NET_WM_OPAQUE_REGION
          _NET_WM_BYPASS_COMPOSITOR
          ;; Window Manager Protocols
          _NET_WM_PING
          _NET_WM_SYNC_REQUEST
          _NET_WM_SYNC_REQUEST_COUNTER
          _NET_WM_FULLSCREEN_MONITORS
          ;; Other Properties
          _NET_WM_FULL_PLACEMENT
          _NET_WM_CM_S0  ;_NET_WM_CM_Sn (n = 1, 2, ...) are left out here.
          ;; _NET_WM_WINDOW_TYPE hint
          _NET_WM_WINDOW_TYPE_DESKTOP
          _NET_WM_WINDOW_TYPE_DOCK
          _NET_WM_WINDOW_TYPE_TOOLBAR
          _NET_WM_WINDOW_TYPE_MENU
          _NET_WM_WINDOW_TYPE_UTILITY
          _NET_WM_WINDOW_TYPE_SPLASH
          _NET_WM_WINDOW_TYPE_DIALOG
          _NET_WM_WINDOW_TYPE_DROPDOWN_MENU
          _NET_WM_WINDOW_TYPE_POPUP_MENU
          _NET_WM_WINDOW_TYPE_TOOLTIP
          _NET_WM_WINDOW_TYPE_NOTIFICATION
          _NET_WM_WINDOW_TYPE_COMBO
          _NET_WM_WINDOW_TYPE_DND
          _NET_WM_WINDOW_TYPE_NORMAL
          ;; _NET_WM_STATE hint
          _NET_WM_STATE_MODAL
          _NET_WM_STATE_STICKY
          _NET_WM_STATE_MAXIMIZED_VERT
          _NET_WM_STATE_MAXIMIZED_HORZ
          _NET_WM_STATE_SHADED
          _NET_WM_STATE_SKIP_TASKBAR
          _NET_WM_STATE_SKIP_PAGER
          _NET_WM_STATE_HIDDEN
          _NET_WM_STATE_FULLSCREEN
          _NET_WM_STATE_ABOVE
          _NET_WM_STATE_BELOW
          _NET_WM_STATE_DEMANDS_ATTENTION
          _NET_WM_STATE_FOCUSED
          ;; _NET_WM_ACTION hint
          _NET_WM_ACTION_MOVE
          _NET_WM_ACTION_RESIZE
          _NET_WM_ACTION_MINIMIZE
          _NET_WM_ACTION_SHADE
          _NET_WM_ACTION_STICK
          _NET_WM_ACTION_MAXIMIZE_HORZ
          _NET_WM_ACTION_MAXIMIZE_VERT
          _NET_WM_ACTION_FULLSCREEN
          _NET_WM_ACTION_CHANGE_DESKTOP
          _NET_WM_ACTION_CLOSE
          _NET_WM_ACTION_ABOVE
          _NET_WM_ACTION_BELOW
          _NET_WM_WINDOW_OPACITY)
        "EWMH atoms.")

      (dolist (atom xcb:ewmh:-atoms)
        (eval `(defvar ,(intern (concat "xcb:Atom:" (symbol-name atom))) nil))))

    (xcb:ewmh:init exwm--connection t)
  #+end_src
