From d74e115ab478b9147d0f6b22964daac863fb6fcc Mon Sep 17 00:00:00 2001
From: Rutherther <rutherther@proton.me>
Date: Wed, 14 Aug 2024 17:33:41 +0200
Subject: [PATCH] feat: dwl xwayland, waybar config

---
 home/dwl/dwl-ipc-waybar.patch |  47 ++++++
 home/dwl/wm.scm               |  66 +++++---
 home/waybar-config.jsonc      | 282 ++++++++++++++++++++++++++++++++++
 home/waybar-style.css         | 213 +++++++++++++++++++++++++
 4 files changed, 590 insertions(+), 18 deletions(-)
 create mode 100644 home/dwl/dwl-ipc-waybar.patch
 create mode 100644 home/waybar-config.jsonc
 create mode 100644 home/waybar-style.css

diff --git a/home/dwl/dwl-ipc-waybar.patch b/home/dwl/dwl-ipc-waybar.patch
new file mode 100644
index 0000000..32fc152
--- /dev/null
+++ b/home/dwl/dwl-ipc-waybar.patch
@@ -0,0 +1,47 @@
+From 98b08880409cfd1277dc491b2f89de39a5107e50 Mon Sep 17 00:00:00 2001
+From: Rutherther <rutherther@proton.me>
+Date: Thu, 2 May 2024 22:39:00 +0200
+Subject: [PATCH] feat: add DWL active_other for singletagset
+
+---
+ protocol/dwl-ipc-unstable-v2.xml | 1 +
+ src/modules/dwl/tags.cpp         | 7 +++++++
+ 2 files changed, 8 insertions(+)
+
+diff --git a/protocol/dwl-ipc-unstable-v2.xml b/protocol/dwl-ipc-unstable-v2.xml
+index 74a212f07..be5bda9d5 100644
+--- a/protocol/dwl-ipc-unstable-v2.xml
++++ b/protocol/dwl-ipc-unstable-v2.xml
+@@ -75,6 +75,7 @@ I would probably just submit raphi's patchset but I don't think that would be po
+       <entry name="none" value="0" summary="no state"/>
+       <entry name="active" value="1" summary="tag is active"/>
+       <entry name="urgent" value="2" summary="tag has at least one urgent client"/>
++      <entry name="active_other" value="4" summary="tag is active on another monitor"/>
+     </enum>
+ 
+     <request name="release" type="destructor">
+diff --git a/src/modules/dwl/tags.cpp b/src/modules/dwl/tags.cpp
+index 085b82246..462ae91b9 100644
+--- a/src/modules/dwl/tags.cpp
++++ b/src/modules/dwl/tags.cpp
+@@ -13,6 +13,7 @@
+ #define TAG_INACTIVE 0
+ #define TAG_ACTIVE 1
+ #define TAG_URGENT 2
++#define TAG_ACTIVE_OTHER 4
+ 
+ namespace waybar::modules::dwl {
+ 
+@@ -198,6 +199,12 @@ void Tags::handle_view_tags(uint32_t tag, uint32_t state, uint32_t clients, uint
+   } else {
+     button.get_style_context()->remove_class("urgent");
+   }
++
++  if (state & TAG_ACTIVE_OTHER) {
++    button.get_style_context()->add_class("focused-other");
++  } else {
++    button.get_style_context()->remove_class("focused-other");
++  }
+ }
+ 
+ } /* namespace waybar::modules::dwl */
diff --git a/home/dwl/wm.scm b/home/dwl/wm.scm
index f8ae593..8783101 100644
--- a/home/dwl/wm.scm
+++ b/home/dwl/wm.scm
@@ -1,26 +1,56 @@
 (define-module (home dwl wm)
+  #:use-module (gnu packages wm)
+  #:use-module (gnu packages xorg)
+
+  #:use-module (ruther packages wayland)
+
   #:use-module (guix packages)
   #:use-module (guix gexp)
   #:use-module (guix utils)
-  #:use-module (ruther packages wayland)
   #:use-module (guix download)
   #:use-module (guix git-download))
 
-(define-public dwl-mine
+(define-public waybar-mine
   (package
-    (inherit dwl-0.7)
-    (name "dwl-mine")
-    (source
-     (origin
-       (method git-fetch)
-       (uri (git-reference
-        (url "https://github.com/Rutherther/dwl")
-        (commit "a8e46f319f574876ce697a7097eb47a2080b1a87")))
-       (sha256
-        (base32 "1jkyqwnc6x48bcjcyn1ha69vwql18ib1w47jx6bxz7wg7bvidm01"))))
-    (arguments (substitute-keyword-arguments (package-arguments dwl-0.7)
-                 ((#:phases original-phases)
-                  #~(modify-phases #$original-phases
-                      (add-after 'unpack 'add-config
-                        (lambda _
-                          (copy-file #$(local-file "config.h") "config.h")))))))))
+   (inherit waybar)
+   (name "waybar-mine")
+   (source
+    (origin
+     (inherit (package-source waybar))
+     (sha256
+      (base32 "0liiyz6212pmyhpsrb6773qf5b9b4kb76nggizygr9abfidbg5gw"))
+     (patches
+      (list (local-file "dwl-ipc-waybar.patch")))))))
+
+(define-public (make-dwl-xwayland dwl)
+  (package/inherit dwl
+    (inputs
+     (modify-inputs (package-inputs dwl)
+       (append xcb-util-wm libx11 xorg-server-xwayland)))
+    (arguments (substitute-keyword-arguments (package-arguments dwl)
+                 ((#:make-flags original-flags)
+                  #~(append '("XWAYLAND = -DXWAYLAND"
+                              "XLIBS = xcb xcb-icccm")
+                            #$original-flags))))))
+
+(define-public dwl-mine
+  (let ((base (make-dwl-xwayland dwl-0.7)))
+    (package
+      (inherit base)
+      (name "dwl-mine")
+      (source
+       (origin
+         (method git-fetch)
+         (uri (git-reference
+               (url "https://github.com/Rutherther/dwl")
+               (commit "a8e46f319f574876ce697a7097eb47a2080b1a87")))
+         (sha256
+          (base32 "1jkyqwnc6x48bcjcyn1ha69vwql18ib1w47jx6bxz7wg7bvidm01"))))
+      (arguments (substitute-keyword-arguments (package-arguments base)
+                   ((#:phases original-phases)
+                    #~(modify-phases #$original-phases
+                        (add-after 'unpack 'add-config
+                          (lambda _
+                            (copy-file #$(local-file "config.h") "config.h"))))))))))
+
+;; TODO wrapping with needed deps
diff --git a/home/waybar-config.jsonc b/home/waybar-config.jsonc
new file mode 100644
index 0000000..dc311b3
--- /dev/null
+++ b/home/waybar-config.jsonc
@@ -0,0 +1,282 @@
+// -*- mode: jsonc -*-
+[
+{
+    "ipc": true,
+    "output": "!eDP-1",
+    // "layer": "top", // Waybar at top layer
+    // "position": "bottom", // Waybar position (top|bottom|left|right)
+    "height": 20, // Waybar height (to be removed for auto height)
+    // "width": 1280, // Waybar width
+    "spacing": 4, // Gaps between modules (4px)
+    // Choose the order of the modules
+    "modules-left": [
+        "dwl/tags",
+        "dwl/window"
+    ],
+    "modules-center": [
+    ],
+    "modules-right": [
+        "idle_inhibitor",
+        "pulseaudio",
+        "network",
+        "power-profiles-daemon",
+        "cpu",
+        "memory",
+        "temperature",
+        "sway/language",
+        "battery",
+        "clock",
+        "tray"
+    ],
+    "dwl/tags": {
+        "num-tags": 9
+    },
+    "dwl/window": {
+        "format": "{title}",
+        "max-length": 50,
+        "rewrite": {
+	     "(.*) - Mozilla Firefox": "🌎 $1",
+	     "(.*) — Mozilla Firefox": "🌎 $1"
+        }
+    },
+    "sway/mode": {
+        "format": "<span style=\"italic\">{}</span>"
+    },
+    "sway/scratchpad": {
+        "format": "{icon} {count}",
+        "show-empty": false,
+        "format-icons": ["", ""],
+        "tooltip": true,
+        "tooltip-format": "{app}: {title}"
+    },
+    "idle_inhibitor": {
+        "format": "{icon}",
+        "format-icons": {
+            "activated": "",
+            "deactivated": ""
+        }
+    },
+    "tray": {
+        // "icon-size": 21,
+        "spacing": 10
+    },
+    "clock": {
+        "interval": 1,
+        "tooltip-format": "<big>{:%Y %B}</big>\n<tt><small>{calendar}</small></tt>",
+        "format-alt": "{:%Y-%m-%d}",
+        "format": "{:%Y-%m-%d %H:%M:%S}"
+    },
+    "cpu": {
+        "format": "{usage}% ",
+        "tooltip": false
+    },
+    "memory": {
+        "format": "{}% "
+    },
+    "temperature": {
+        // "thermal-zone": 2,
+        // "hwmon-path": "/sys/class/hwmon/hwmon2/temp1_input",
+        "critical-threshold": 80,
+        // "format-critical": "{temperatureC}°C {icon}",
+        "format": "{temperatureC}°C {icon}",
+        "format-icons": ["", "", ""]
+    },
+    "battery": {
+        "states": {
+            // "good": 95,
+            "warning": 30,
+            "critical": 15
+        },
+        "format": "{capacity}% {icon}",
+        "format-full": "{capacity}% {icon}",
+        "format-charging": "{capacity}% ",
+        "format-plugged": "{capacity}% ",
+        "format-alt": "{time} {icon}",
+        // "format-good": "", // An empty format will hide the module
+        // "format-full": "",
+        "format-icons": ["", "", "", "", ""]
+    },
+    "power-profiles-daemon": {
+      "format": "{icon}",
+      "tooltip-format": "Power profile: {profile}\nDriver: {driver}",
+      "tooltip": true,
+      "format-icons": {
+        "default": "",
+        "performance": "",
+        "balanced": "",
+        "power-saver": ""
+      }
+    },
+    "network": {
+        // "interface": "wlp2*", // (Optional) To force the use of this interface
+        "format-wifi": "{essid} ({signalStrength}%) ",
+        "format-ethernet": "",
+        "tooltip-format": "{ifname} via {gwaddr} ",
+        "format-linked": "{ifname} (No IP) ",
+        "format-disconnected": "Disconnected ⚠",
+        "format-alt": "{ifname}: {ipaddr}/{cidr}"
+    },
+    "pulseaudio": {
+        // "scroll-step": 1, // %, can be a float
+        "format": "{volume}% {icon} {format_source}",
+        "format-bluetooth": "{volume}% {icon} {format_source}",
+        "format-bluetooth-muted": " {icon} {format_source}",
+        "format-muted": " {format_source}",
+        "format-source": "",
+        "format-source-muted": "",
+        "format-icons": {
+            "headphone": "",
+            "hands-free": "",
+            "headset": "",
+            "phone": "",
+            "portable": "",
+            "car": "",
+            "default": ["", "", ""]
+        },
+        "on-click": "pavucontrol"
+    },
+},
+
+{
+    "ipc": true,
+    "output": "eDP-1",
+    // "layer": "top", // Waybar at top layer
+    // "position": "bottom", // Waybar position (top|bottom|left|right)
+    "height": 20, // Waybar height (to be removed for auto height)
+    // "width": 1280, // Waybar width
+    "spacing": 4, // Gaps between modules (4px)
+    // Choose the order of the modules
+    "modules-left": [
+        "dwl/tags",
+        "dwl/window"
+    ],
+    "modules-center": [
+    ],
+    "modules-right": [
+        "idle_inhibitor",
+        "pulseaudio",
+        "network",
+        "power-profiles-daemon",
+        "cpu",
+        "memory",
+        "temperature",
+        "backlight",
+        "sway/language",
+        "battery",
+        "clock",
+        "tray"
+    ],
+    "dwl/tags": {
+        "num-tags": 9
+    },
+    "dwl/window": {
+        "format": "{title}",
+        "max-length": 50,
+        "rewrite": {
+	     "(.*) - Mozilla Firefox": "🌎 $1",
+	     "(.*) — Mozilla Firefox": "🌎 $1"
+        }
+    },
+    "sway/mode": {
+        "format": "<span style=\"italic\">{}</span>"
+    },
+    "sway/scratchpad": {
+        "format": "{icon} {count}",
+        "show-empty": false,
+        "format-icons": ["", ""],
+        "tooltip": true,
+        "tooltip-format": "{app}: {title}"
+    },
+    "idle_inhibitor": {
+        "format": "{icon}",
+        "format-icons": {
+            "activated": "",
+            "deactivated": ""
+        }
+    },
+    "tray": {
+        // "icon-size": 21,
+        "spacing": 10
+    },
+    "clock": {
+        "interval": 1,
+        "tooltip-format": "<big>{:%Y %B}</big>\n<tt><small>{calendar}</small></tt>",
+        "format-alt": "{:%Y-%m-%d}",
+        "format": "{:%Y-%m-%d %H:%M:%S}"
+    },
+    "cpu": {
+        "format": "{usage}% ",
+        "tooltip": false
+    },
+    "memory": {
+        "format": "{}% "
+    },
+    "temperature": {
+        // "thermal-zone": 2,
+        // "hwmon-path": "/sys/class/hwmon/hwmon2/temp1_input",
+        "critical-threshold": 80,
+        // "format-critical": "{temperatureC}°C {icon}",
+        "format": "{temperatureC}°C {icon}",
+        "format-icons": ["", "", ""]
+    },
+    "backlight": {
+        // "device": "acpi_video1",
+        "format": "{percent}% {icon}",
+        "format-icons": ["", "", "", "", "", "", "", "", ""]
+    },
+    "battery": {
+        "states": {
+            // "good": 95,
+            "warning": 30,
+            "critical": 15
+        },
+        "format": "{capacity}% {icon}",
+        "format-full": "{capacity}% {icon}",
+        "format-charging": "{capacity}% ",
+        "format-plugged": "{capacity}% ",
+        "format-alt": "{time} {icon}",
+        // "format-good": "", // An empty format will hide the module
+        // "format-full": "",
+        "format-icons": ["", "", "", "", ""]
+    },
+    "power-profiles-daemon": {
+      "format": "{icon}",
+      "tooltip-format": "Power profile: {profile}\nDriver: {driver}",
+      "tooltip": true,
+      "format-icons": {
+        "default": "",
+        "performance": "",
+        "balanced": "",
+        "power-saver": ""
+      }
+    },
+    "network": {
+        // "interface": "wlp2*", // (Optional) To force the use of this interface
+        "format-wifi": "{essid} ({signalStrength}%) ",
+        "format-ethernet": "",
+        "tooltip-format": "{ifname} via {gwaddr} ",
+        "format-linked": "{ifname} (No IP) ",
+        "format-disconnected": "Disconnected ⚠",
+        "format-alt": "{ifname}: {ipaddr}/{cidr}"
+    },
+    "pulseaudio": {
+        // "scroll-step": 1, // %, can be a float
+        "format": "{volume}% {icon} {format_source}",
+        "format-bluetooth": "{volume}% {icon} {format_source}",
+        "format-bluetooth-muted": " {icon} {format_source}",
+        "format-muted": " {format_source}",
+        "format-source": "",
+        "format-source-muted": "",
+        "format-icons": {
+            "headphone": "",
+            "hands-free": "",
+            "headset": "",
+            "phone": "",
+            "portable": "",
+            "car": "",
+            "default": ["", "", ""]
+        },
+        "on-click": "pavucontrol"
+    },
+}
+]
\ No newline at end of file
diff --git a/home/waybar-style.css b/home/waybar-style.css
new file mode 100644
index 0000000..0623796
--- /dev/null
+++ b/home/waybar-style.css
@@ -0,0 +1,213 @@
+* {
+    /* `otf-font-awesome` is required to be installed for icons */
+    font-family: FontAwesome, Ubuntu;
+    font-size: 13px;
+}
+
+window#waybar {
+    background-color: rgba(43, 48, 59, 0.5);
+    color: #ffffff;
+    transition-property: background-color;
+    transition-duration: .5s;
+}
+
+window#waybar.hidden {
+    opacity: 0.2;
+}
+
+/*
+window#waybar.empty {
+    background-color: transparent;
+}
+window#waybar.solo {
+    background-color: #FFFFFF;
+}
+*/
+
+window#waybar.termite {
+    background-color: #3F3F3F;
+}
+
+window#waybar.chromium {
+    background-color: #000000;
+    border: none;
+}
+
+button {
+    /* Use box-shadow instead of border so the text isn't offset */
+    box-shadow: inset 0 -3px transparent;
+    /* Avoid rounded borders under each button name */
+    border: none;
+    border-radius: 0;
+}
+
+/* https://github.com/Alexays/Waybar/wiki/FAQ#the-workspace-buttons-have-a-strange-hover-effect */
+button:hover {
+    background: inherit;
+    box-shadow: inset 0 -3px #ffffff;
+}
+
+#workspaces button {
+    padding: 0 5px;
+    background-color: transparent;
+    color: #ffffff;
+}
+
+#workspaces button:hover {
+    background: rgba(0, 0, 0, 0.2);
+}
+
+#workspaces button.focused {
+    background-color: #64727D;
+    box-shadow: inset 0 -3px #ffffff;
+}
+
+#workspaces button.urgent {
+    background-color: #eb4d4b;
+}
+
+#mode {
+    background-color: #64727D;
+    box-shadow: inset 0 -3px #ffffff;
+}
+
+#clock,
+#battery,
+#cpu,
+#memory,
+#disk,
+#temperature,
+#backlight,
+#network,
+#pulseaudio,
+#wireplumber,
+#custom-media,
+#tray,
+#mode,
+#idle_inhibitor,
+#scratchpad,
+#power-profiles-daemon,
+#mpd {
+    padding: 0 10px;
+    color: #ffffff;
+    box-shadow: inset 0 -3px #4a4b4f;
+}
+
+#window,
+#workspaces {
+    margin: 0 4px;
+}
+
+/* If workspaces is the leftmost module, omit left margin */
+.modules-left > widget:first-child > #workspaces {
+    margin-left: 0;
+}
+
+/* If workspaces is the rightmost module, omit right margin */
+.modules-right > widget:last-child > #workspaces {
+    margin-right: 0;
+}
+
+#clock {
+    box-shadow: inset 0 -3px #2980b9;
+}
+
+@keyframes blink {
+    to {
+        background-color: #ffffff;
+        color: #000000;
+    }
+}
+
+/* Using steps() instead of linear as a timing function to limit cpu usage */
+#battery.critical:not(.charging) {
+    background-color: #f53c3c;
+    color: #ffffff;
+    box-shadow: none;
+    animation-name: blink;
+    animation-duration: 0.5s;
+    animation-timing-function: steps(12);
+    animation-iteration-count: infinite;
+    animation-direction: alternate;
+}
+
+#power-profiles-daemon {
+    padding-right: 15px;
+}
+
+label:focus {
+    background-color: #000000;
+}
+
+#cpu {
+    /* box-shadow: inset 0 -3px #2ecc71; */
+}
+
+#network.disconnected {
+    box-shadow: inset 0 -3px #f53c3c;
+}
+
+#temperature {
+    /* box-shadow: inset 0 -3px #f0932b; */
+}
+
+#temperature.critical {
+    background-color: #eb4d4b;
+}
+
+#tray {
+    /* box-shadow: inset 0 -3px #2980b9; */
+}
+
+#tray > .passive {
+    -gtk-icon-effect: dim;
+}
+
+#tray > .needs-attention {
+    -gtk-icon-effect: highlight;
+    background-color: #eb4d4b;
+}
+
+#tags {
+    min-width: 0;
+}
+
+#tags button {
+    min-width: 20px;
+    padding: 3px;
+    margin: 0;
+    color: #e4e4e4;
+}
+
+#tags button.occupied {
+    box-shadow: inset 0 -3px #4a4b4f;
+}
+
+#tags button.occupied:hover, #tags button:hover {
+    box-shadow: inset 0 -3px #6c6d71;
+}
+
+#tags button.focused-other {
+    box-shadow: inset 0 -3px #57a277;
+}
+
+#tags button.focused-other:hover {
+    box-shadow: inset 0 -3px #79c499;
+}
+
+#tags button.focused {
+    /* box-shadow: inset 0 -3px #1bd6e0; */
+    box-shadow: inset 0 -3px #1be0d0;
+}
+
+#tags button.focused:hover {
+    box-shadow: inset 0 -3px #60fcf5;
+}
+
+#tags button.urgent {
+    box-shadow: inset 0 -3px #eb4d4b;
+}
+
+#tags button.urgent:hover {
+    box-shadow: inset 0 -3px #f0932b;
+}
-- 
2.48.1