diff --git a/dotfiles/.config/dunst/dunstrc b/dotfiles/.config/dunst/dunstrc
index 3501546..37f48c2 100644
--- a/dotfiles/.config/dunst/dunstrc
+++ b/dotfiles/.config/dunst/dunstrc
@@ -1,387 +1,87 @@
+# Generated by Sithego for Serpensortia
+# This file is included from your main dunstrc and sets colors, paddings and radii.
[global]
- ### Display ###
- monitor = 0
+monitor = 0
follow = keyboard
-
width = 500
height = (0,500)
-
origin = top-center
-
- offset = 0x25
-
- # Scale factor. It is auto-detected if value is 0.
+ offset = (0,25)
scale = 0
-
notification_limit = 20
progress_bar = true
-
- highlight = "#124326"
-
progress_bar_height = 15
-
progress_bar_frame_width = 1
-
progress_bar_min_width = 150
-
progress_bar_max_width = 500
-
- progress_bar_corner_radius = 4
-
- icon_corner_radius = 0
-
indicate_hidden = yes
-
separator_height = 2
-
- padding = 8
-
- horizontal_padding = 8
-
text_icon_padding = 0
-
frame_width = 5
-
- frame_color = "#124326"
-
gap_size = 0
-
separator_color = frame
-
sort = yes
-
idle_threshold = 120
-
font = "Fira Sans Semibold" 9
-
line_height = 1
-
- # Possible values are:
- # full: Allow a small subset of html markup in notifications:
- # bold
- # italic
- # strikethrough
- # underline
- #
- # For a complete reference see
- # .
- #
- # strip: This setting is provided for compatibility with some broken
- # clients that send markup even though it's not enabled on the
- # server. Dunst will try to strip the markup but the parsing is
- # simplistic so using this option outside of matching rules for
- # specific applications *IS GREATLY DISCOURAGED*.
- #
- # no: Disable markup parsing, incoming notifications will be treated as
- # plain text. Dunst will not advertise that it has the body-markup
- # capability if this is set as a global setting.
- #
- # It's important to note that markup inside the format option will be parsed
- # regardless of what this is set to.
markup = full
-
- # The format of the message. Possible variables are:
- # %a appname
- # %s summary
- # %b body
- # %i iconname (including its path)
- # %I iconname (without its path)
- # %p progress value if set ([ 0%] to [100%]) or nothing
- # %n progress value if set without any extra characters
- # %% Literal %
- # Markup is allowed
format = "%a\n%s %p\n%b"
-
- # Alignment of message text.
- # Possible values are "left", "center" and "right".
alignment = center
-
- # Vertical alignment of message text and icon.
- # Possible values are "top", "center" and "bottom".
vertical_alignment = center
-
- # Show age of message if message is older than show_age_threshold
- # seconds.
- # Set to -1 to disable.
show_age_threshold = 60
-
- # Specify where to make an ellipsis in long lines.
- # Possible values are "start", "middle" and "end".
ellipsize = middle
-
- # Ignore newlines '\n' in notifications.
ignore_newline = no
-
- # Stack together notifications with the same content
stack_duplicates = true
-
- # Hide the count of stacked notifications with the same content
hide_duplicate_count = false
-
- # Display indicators for URLs (U) and actions (A).
show_indicators = yes
-
- ### Icons ###
-
- # Recursive icon lookup. You can set a single theme, instead of having to
- # define all lookup paths.
enable_recursive_icon_lookup = true
-
- # Set icon theme (only used for recursive icon lookup)
icon_theme = "Silvery-Dark-Icons,Adwaita"
- # You can also set multiple icon themes, with the leftmost one being used first.
- # icon_theme = "Adwaita, breeze"
-
- # Align icons left/right/top/off
icon_position = left
-
- # Scale small icons up to this size, set to 0 to disable. Helpful
- # for e.g. small files or high-dpi screens. In case of conflict,
- # max_icon_size takes precedence over this.
min_icon_size = 32
-
- # Scale larger icons down to this size, set to 0 to disable
max_icon_size = 128
-
- # Paths to default icons (only neccesary when not using recursive icon lookup)
icon_path = /usr/share/icons/gnome/16x16/status/:/usr/share/icons/gnome/16x16/devices/
-
- ### History ###
-
- # Should a notification popped up from history be sticky or timeout
- # as if it would normally do.
sticky_history = yes
-ยง"
- # Maximum amount of notifications kept in history
history_length = 20
-
- ### Misc/Advanced ###
-
- # dmenu path.
- dmenu = /usr/bin/dmenu -p dunst:
-
- # Browser for opening urls in context menu.
browser = /usr/bin/xdg-open
-
- # Always run rule-defined scripts, even if the notification is suppressed
always_run_script = true
-
- # Define the title of the windows spawned by dunst
title = Dunst
-
- # Define the class of the windows spawned by dunst
class = Dunst
-
- # Define the corner radius of the notification window
- # in pixel size. If the radius is 0, you have no rounded
- # corners.
- # The radius will be automatically lowered if it exceeds half of the
- # notification height to avoid clipping text and/or icons.
corner_radius = 16
-
- # Ignore the dbus closeNotification message.
- # Useful to enforce the timeout set by dunst configuration. Without this
- # parameter, an application may close the notification sent before the
- # user defined timeout.
ignore_dbusclose = false
-
- ### Wayland ###
- # These settings are Wayland-specific. They have no effect when using X11
-
- # Uncomment this if you want to let notications appear under fullscreen
- # applications (default: overlay)
- # layer = top
-
- # Set this to true to use X11 output on Wayland.
force_xwayland = false
-
- ### Legacy
-
- # Use the Xinerama extension instead of RandR for multi-monitor support.
- # This setting is provided for compatibility with older nVidia drivers that
- # do not support RandR and using it on systems that support RandR is highly
- # discouraged.
- #
- # By enabling this setting dunst will not be able to detect when a monitor
- # is connected or disconnected which might break follow mode if the screen
- # layout changes.
force_xinerama = false
-
- ### mouse
-
- # Defines list of actions for each mouse event
- # Possible values are:
- # * none: Don't do anything.
- # * do_action: Invoke the action determined by the action_name rule. If there is no
- # such action, open the context menu.
- # * open_url: If the notification has exactly one url, open it. If there are multiple
- # ones, open the context menu.
- # * close_current: Close current notification.
- # * close_all: Close all notifications.
- # * context: Open context menu for the notification.
- # * context_all: Open context menu for all notifications.
- # These values can be strung together for each mouse event, and
- # will be executed in sequence.
mouse_left_click = close_current
mouse_middle_click = do_action, close_current
mouse_right_click = close_all
-# Experimental features that may or may not work correctly. Do not expect them
-# to have a consistent behaviour across releases.
-[experimental]
- # Calculate the dpi to use on a per-monitor basis.
- # If this setting is enabled the Xft.dpi value will be ignored and instead
- # dunst will attempt to calculate an appropriate dpi value for each monitor
- # using the resolution and physical size. This might be useful in setups
- # where there are multiple screens with very different dpi values.
- per_monitor_dpi = false
+# Global color accents
+frame_color = "#0b110b"
+highlight = "#1c7a44"
+# Spacing derived from theme spacing (Padding: vertical horizontal)
+padding = 2
+horizontal_padding = 4
+# Radii
+progress_bar_corner_radius = 4
+icon_corner_radius = 4
+
+# Urgency styles mapped from semantic palette
[urgency_low]
- # IMPORTANT: colors have to be defined in quotation marks.
- # Otherwise the "#" and following would be interpreted as a comment.
- background = "#131d13CC"
- foreground = "#c0c0c0"
- timeout = 6
- # Icon for notifications with low urgency, uncomment to enable
- #default_icon = /path/to/icon
+background = "#080c0869"
+foreground = "#c0c0c0"
+frame_color = "#1c7a44"
+timeout = 6
[urgency_normal]
- background = "#131d13CC"
- foreground = "#c0c0c0"
- timeout = 6
- # Icon for notifications with normal urgency, uncomment to enable
- #default_icon = /path/to/icon
+background = "#080c0869"
+foreground = "#c0c0c0"
+frame_color = "#1c7a44"
+timeout = 6
[urgency_critical]
- background = "#131d13CC"
- foreground = "#c0c0c0"
- frame_color = "#dc143c"
- timeout = 6
- # Icon for notifications with critical urgency, uncomment to enable
- #default_icon = /path/to/icon
-
-# Every section that isn't one of the above is interpreted as a rules to
-# override settings for certain messages.
-#
-# Messages can be matched by
-# appname (discouraged, see desktop_entry)
-# body
-# category
-# desktop_entry
-# icon
-# match_transient
-# msg_urgency
-# stack_tag
-# summary
-#
-# and you can override the
-# background
-# foreground
-# format
-# frame_color
-# fullscreen
-# new_icon
-# set_stack_tag
-# set_transient
-# set_category
-# timeout
-# urgency
-# icon_position
-# skip_display
-# history_ignore
-# action_name
-# word_wrap
-# ellipsize
-# alignment
-# hide_text
-#
-# Shell-like globbing will get expanded.
-#
-# Instead of the appname filter, it's recommended to use the desktop_entry filter.
-# GLib based applications export their desktop-entry name. In comparison to the appname,
-# the desktop-entry won't get localized.
-#
-# SCRIPTING
-# You can specify a script that gets run when the rule matches by
-# setting the "script" option.
-# The script will be called as follows:
-# script appname summary body icon urgency
-# where urgency can be "LOW", "NORMAL" or "CRITICAL".
-#
-# NOTE: It might be helpful to run dunst -print in a terminal in order
-# to find fitting options for rules.
-
-# Disable the transient hint so that idle_threshold cannot be bypassed from the
-# client
-#[transient_disable]
-# match_transient = yes
-# set_transient = no
-#
-# Make the handling of transient notifications more strict by making them not
-# be placed in history.
-#[transient_history_ignore]
-# match_transient = yes
-# history_ignore = yes
-
-# fullscreen values
-# show: show the notifications, regardless if there is a fullscreen window opened
-# delay: displays the new notification, if there is no fullscreen window active
-# If the notification is already drawn, it won't get undrawn.
-# pushback: same as delay, but when switching into fullscreen, the notification will get
-# withdrawn from screen again and will get delayed like a new notification
-#[fullscreen_delay_everything]
-# fullscreen = delay
-#[fullscreen_show_critical]
-# msg_urgency = critical
-# fullscreen = show
-
-#[espeak]
-# summary = "*"
-# script = dunst_espeak.sh
-
-#[script-test]
-# summary = "*script*"
-# script = dunst_test.sh
-
-#[ignore]
-# # This notification will not be displayed
-# summary = "foobar"
-# skip_display = true
-
-#[history-ignore]
-# # This notification will not be saved in history
-# summary = "foobar"
-# history_ignore = yes
-
-#[skip-display]
-# # This notification will not be displayed, but will be included in the history
-# summary = "foobar"
-# skip_display = yes
-
-#[signed_on]
-# appname = Pidgin
-# summary = "*signed on*"
-# urgency = low
-#
-#[signed_off]
-# appname = Pidgin
-# summary = *signed off*
-# urgency = low
-#
-#[says]
-# appname = Pidgin
-# summary = *says*
-# urgency = critical
-#
-#[twitter]
-# appname = Pidgin
-# summary = *twitter.com*
-# urgency = normal
-#
-#[stack-volumes]
-# appname = "some_volume_notifiers"
-# set_stack_tag = "volume"
-#
-# vim: ft=cfg
+background = "#dc143c69"
+foreground = "#131d13"
+frame_color = "#dc143c"
+timeout = 12
diff --git a/dotfiles/.themes/Serpensortia/intellij/Serpensortia.jar b/dotfiles/.themes/Serpensortia/intellij/Serpensortia.jar
index dab38fc..386e945 100644
Binary files a/dotfiles/.themes/Serpensortia/intellij/Serpensortia.jar and b/dotfiles/.themes/Serpensortia/intellij/Serpensortia.jar differ
diff --git a/sithego/main.go b/sithego/main.go
index 27b4169..01f3978 100644
--- a/sithego/main.go
+++ b/sithego/main.go
@@ -2,6 +2,7 @@ package main
import (
"Sithego/themer"
+ "Sithego/themer/adapters/dunst"
"Sithego/themer/adapters/gtk"
"Sithego/themer/adapters/intellij"
"Sithego/themer/adapters/qt"
@@ -30,4 +31,8 @@ func main() {
panic(err)
}
+ if err := dunst.New(dunst.WithOutputDir("../dotfiles/.config/dunst/")).Generate(theme); err != nil {
+ panic(err)
+ }
+
}
diff --git a/sithego/themer/adapters/dunst/dunst.go b/sithego/themer/adapters/dunst/dunst.go
new file mode 100644
index 0000000..8d5259c
--- /dev/null
+++ b/sithego/themer/adapters/dunst/dunst.go
@@ -0,0 +1,127 @@
+package dunst
+
+import (
+ "Sithego/themer"
+ "os"
+ "path/filepath"
+ "regexp"
+ "strconv"
+ "strings"
+ "text/template"
+)
+
+type Adapter struct {
+ OutputDir string
+}
+
+type Option func(*Adapter)
+
+func WithOutputDir(dir string) Option {
+ return func(a *Adapter) {
+ a.OutputDir = dir
+ }
+}
+
+func New(opt ...Option) *Adapter {
+ home, _ := os.UserHomeDir()
+ a := &Adapter{
+ OutputDir: filepath.Join(home, ".config", "dunst"),
+ }
+ for _, o := range opt {
+ o(a)
+ }
+ return a
+}
+
+func (a *Adapter) Name() string { return "Dunst" }
+
+type tmplData struct {
+ Theme themer.Theme
+ Padding struct {
+ V int
+ H int
+ }
+ Radius struct {
+ Small int
+ Base int
+ Large int
+ }
+}
+
+func (a *Adapter) Generate(t themer.Theme) error {
+ templatePath := filepath.Join("themer", "adapters", "dunst", "dunstrc")
+ templ, err := template.ParseFiles(templatePath)
+ if err != nil {
+ return err
+ }
+
+ if err := os.MkdirAll(a.OutputDir, 0o755); err != nil {
+ return err
+ }
+ outputPath := filepath.Join(a.OutputDir, "dunstrc")
+ f, err := os.Create(outputPath)
+ if err != nil {
+ return err
+ }
+ defer f.Close()
+
+ data := tmplData{Theme: t}
+
+ vp, hp := parsePaddingPair(t.Spacing.Padding)
+ data.Padding.V = vp
+ data.Padding.H = hp
+ data.Radius.Small = parsePx(t.Spacing.RadiusSmall)
+ if data.Radius.Small == 0 {
+ data.Radius.Small = 4
+ }
+ data.Radius.Base = parsePx(t.Spacing.Radius)
+ if data.Radius.Base == 0 {
+ data.Radius.Base = data.Radius.Small
+ }
+ data.Radius.Large = parsePx(t.Spacing.RadiusLarge)
+ if data.Radius.Large == 0 {
+ data.Radius.Base = data.Radius.Large
+ }
+
+ if err := templ.Execute(f, data); err != nil {
+ return err
+ }
+ return nil
+}
+
+var rePxPair = regexp.MustCompile(`(?i)\b(\d+)\s*px\b(?:\s+(\d+)\s*px\b)?`)
+var rePx = regexp.MustCompile(`(?i)\b(\d+)\s*px\b`)
+
+func parsePaddingPair(s string) (int, int) {
+ s = strings.TrimSpace(s)
+ if s == "" {
+ return 0, 0
+ }
+ m := rePxPair.FindStringSubmatch(s)
+ if len(m) == 3 {
+ v, _ := strconv.Atoi(m[1])
+ if m[2] != "" {
+ h, _ := strconv.Atoi(m[2])
+ return v, h
+ }
+ // single value provided -> use for both
+ return v, v
+ }
+ // fallback: try generic px
+ m2 := rePx.FindStringSubmatch(s)
+ if len(m2) == 2 {
+ v, _ := strconv.Atoi(m2[1])
+ return v, v
+ }
+ return 0, 0
+}
+
+func parsePx(s string) int {
+ s = strings.TrimSpace(s)
+ m := rePx.FindStringSubmatch(s)
+ if len(m) == 2 {
+ v, _ := strconv.Atoi(m[1])
+ return v
+ }
+ return 0
+}
diff --git a/sithego/themer/adapters/dunst/dunstrc b/sithego/themer/adapters/dunst/dunstrc
new file mode 100644
index 0000000..94c4930
--- /dev/null
+++ b/sithego/themer/adapters/dunst/dunstrc
@@ -0,0 +1,87 @@
+# Generated by Sithego for {{ .Theme.Meta.Name }}
+# This file is included from your main dunstrc and sets colors, paddings and radii.
+[global]
+
+monitor = 0
+ follow = keyboard
+ width = 500
+ height = (0,500)
+ origin = top-center
+ offset = (0,25)
+ scale = 0
+ notification_limit = 20
+ progress_bar = true
+ progress_bar_height = 15
+ progress_bar_frame_width = 1
+ progress_bar_min_width = 150
+ progress_bar_max_width = 500
+ indicate_hidden = yes
+ separator_height = 2
+ text_icon_padding = 0
+ frame_width = 5
+ gap_size = 0
+ separator_color = frame
+ sort = yes
+ idle_threshold = 120
+ font = "Fira Sans Semibold" 9
+ line_height = 1
+ markup = full
+ format = "%a\n%s %p\n%b"
+ alignment = center
+ vertical_alignment = center
+ show_age_threshold = 60
+ ellipsize = middle
+ ignore_newline = no
+ stack_duplicates = true
+ hide_duplicate_count = false
+ show_indicators = yes
+ enable_recursive_icon_lookup = true
+ icon_theme = "Silvery-Dark-Icons,Adwaita"
+ icon_position = left
+ min_icon_size = 32
+ max_icon_size = 128
+ icon_path = /usr/share/icons/gnome/16x16/status/:/usr/share/icons/gnome/16x16/devices/
+ sticky_history = yes
+ history_length = 20
+ browser = /usr/bin/xdg-open
+ always_run_script = true
+ title = Dunst
+ class = Dunst
+ corner_radius = {{ .Radius.Large }}
+ ignore_dbusclose = false
+ force_xwayland = false
+ force_xinerama = false
+ mouse_left_click = close_current
+ mouse_middle_click = do_action, close_current
+ mouse_right_click = close_all
+
+# Global color accents
+frame_color = "{{ .Theme.Colors.Semantic.Border.Value }}"
+highlight = "{{ .Theme.Colors.Semantic.Accent.Value }}"
+
+# Spacing derived from theme spacing (Padding: vertical horizontal)
+padding = {{ .Padding.V }}
+horizontal_padding = {{ .Padding.H }}
+
+# Radii
+progress_bar_corner_radius = {{ .Radius.Small }}
+icon_corner_radius = {{ .Radius.Small }}
+
+# Urgency styles mapped from semantic palette
+[urgency_low]
+background = "{{ .Theme.Colors.Semantic.Background.Value }}69"
+foreground = "{{ .Theme.Colors.Semantic.Text.Value }}"
+frame_color = "{{ .Theme.Colors.Semantic.Accent.Value }}"
+timeout = 6
+
+[urgency_normal]
+background = "{{ .Theme.Colors.Semantic.Background.Value }}69"
+foreground = "{{ .Theme.Colors.Semantic.Text.Value }}"
+frame_color = "{{ .Theme.Colors.Semantic.Accent.Value }}"
+timeout = 6
+
+[urgency_critical]
+background = "{{ .Theme.Colors.Semantic.Warn.Value }}69"
+foreground = "{{ .Theme.Colors.Semantic.Surface.Value }}"
+frame_color = "{{ .Theme.Colors.Semantic.Warn.Value }}"
+timeout = 12