first commit

This commit is contained in:
Tim Gröger 2023-03-15 14:14:10 +01:00
commit cba62f7fe2
31 changed files with 5572 additions and 0 deletions

BIN
i3/.config.swp Normal file

Binary file not shown.

209
i3/config Normal file
View File

@ -0,0 +1,209 @@
# class border bground text indicator child_border
#client.focused #0D47A1 #1565C0 #FFFFFF #0D47A1 #285577
#client.focused_inactive #0D47A1 #90CAF9 #1F1F1F #0D47A1 #5F676A
#client.unfocused #0D47A1 #1F1F1F #90CAF9 #0D47A1 #222222
#client.urgent #0D47A1 #900000 #FFFFFF #900000 #900000
#client.placeholder #0D47A1 #1F1F1F #FFFFFF #0D47A1 #0C0C0C
#client.background #1f1f1f
# This file has been auto-generated by i3-config-wizard(1).
# It will not be overwritten, so edit it as you like.
#
# Should you change your keyboard layout some time, delete
# this file and re-run i3-config-wizard(1).
#
# i3 config file (v4)
#
# Please see https://i3wm.org/docs/userguide.html for a complete reference!
set $mod Mod4
# Font for window titles. Will also be used by the bar unless a different font
# is used in the bar {} block below.
#font pango:monospace 8
#font pango:Hack Nerd Font mono:style=Regular 12
font pango:JetBrainsMono Nerd Font:style=Regular 12
exec_always --no-startup-id $HOME/.config/polybar/my_theme/launch.sh
# This font is widely installed, provides lots of unicode glyphs, right-to-left
# text rendering and scalability on retina/hidpi displays (thanks to pango).
#font pango:DejaVu Sans Mono 8
# Start XDG autostart .desktop files using dex. See also
# https://wiki.archlinux.org/index.php/XDG_Autostart
exec --no-startup-id dex-autostart --autostart --environment i3
# The combination of xss-lock, nm-applet and pactl is a popular choice, so
# they are included here as an example. Modify as you see fit.
# xss-lock grabs a logind suspend inhibit lock and will use i3lock to lock the
# screen before suspend. Use loginctl lock-session to lock your screen.
exec --no-startup-id xss-lock --transfer-sleep-lock -- i3lock --nofork
# NetworkManager is the most popular way to manage wireless networks on Linux,
# and nm-applet is a desktop environment-independent system tray GUI for it.
exec --no-startup-id nm-applet
# Use pactl to adjust volume in PulseAudio.
set $refresh_i3status killall -SIGUSR1 i3status
bindsym XF86AudioRaiseVolume exec --no-startup-id pactl set-sink-volume @DEFAULT_SINK@ +10% && $refresh_i3status
bindsym XF86AudioLowerVolume exec --no-startup-id pactl set-sink-volume @DEFAULT_SINK@ -10% && $refresh_i3status
bindsym XF86AudioMute exec --no-startup-id pactl set-sink-mute @DEFAULT_SINK@ toggle && $refresh_i3status
bindsym XF86AudioMicMute exec --no-startup-id pactl set-source-mute @DEFAULT_SOURCE@ toggle && $refresh_i3status
# Use Mouse+$mod to drag floating windows to their wanted position
floating_modifier $mod
# move tiling windows via drag & drop by left-clicking into the title bar,
# or left-clicking anywhere into the window while holding the floating modifier.
tiling_drag modifier titlebar
# start a terminal
bindsym $mod+Return exec i3-sensible-terminal
# kill focused window
bindsym $mod+Shift+X kill
# start dmenu (a program launcher)
#bindsym $mod+a exec --no-startup-id dmenu_run
bindsym $mod+a exec --no-startup-id $HOME/.config/polybar/my_theme/scripts/launcher.sh
# A more modern dmenu replacement is rofi:
# bindcode $mod+40 exec "rofi -modi drun,run -show drun"
# There also is i3-dmenu-desktop which only displays applications shipping a
# .desktop file. It is a wrapper around dmenu, so you need that installed.
# bindcode $mod+40 exec --no-startup-id i3-dmenu-desktop
# change focus
bindsym $mod+n focus left
bindsym $mod+r focus down
bindsym $mod+t focus up
bindsym $mod+d focus right
# alternatively, you can use the cursor keys:
bindsym $mod+Left focus left
bindsym $mod+Down focus down
bindsym $mod+Up focus up
bindsym $mod+Right focus right
# move focused window
bindsym $mod+Shift+N move left
bindsym $mod+Shift+R move down
bindsym $mod+Shift+T move up
bindsym $mod+Shift+D move right
# alternatively, you can use the cursor keys:
bindsym $mod+Shift+Left move left
bindsym $mod+Shift+Down move down
bindsym $mod+Shift+Up move up
bindsym $mod+Shift+Right move right
# split in horizontal orientation
bindsym $mod+s split h
# split in vertical orientation
bindsym $mod+p split v
# enter fullscreen mode for the focused container
bindsym $mod+e fullscreen toggle
# change container layout (stacked, tabbed, toggle split)
bindsym $mod+i layout stacking
bindsym $mod+v layout tabbed
bindsym $mod+l layout toggle split
# toggle tiling / floating
bindsym $mod+Shift+space floating toggle
# change focus between tiling / floating windows
bindsym $mod+space focus mode_toggle
# focus the parent container
bindsym $mod+u focus parent
# focus the child container
#bindsym $mod+d focus child
# Define names for default workspaces for which we configure key bindings later on.
# We use variables to avoid repeating the names in multiple places.
set $ws1 "1"
set $ws2 "2"
set $ws3 "3"
set $ws4 "4"
set $ws5 "5"
set $ws6 "6"
set $ws7 "7"
set $ws8 "8"
set $ws9 "9"
set $ws10 "10"
# switch to workspace
bindsym $mod+1 workspace number $ws1
bindsym $mod+2 workspace number $ws2
bindsym $mod+3 workspace number $ws3
bindsym $mod+4 workspace number $ws4
bindsym $mod+5 workspace number $ws5
bindsym $mod+6 workspace number $ws6
bindsym $mod+7 workspace number $ws7
bindsym $mod+8 workspace number $ws8
bindsym $mod+9 workspace number $ws9
bindsym $mod+0 workspace number $ws10
# move focused container to workspace
bindsym $mod+Shift+1 move container to workspace number $ws1
bindsym $mod+Shift+2 move container to workspace number $ws2
bindsym $mod+Shift+3 move container to workspace number $ws3
bindsym $mod+Shift+4 move container to workspace number $ws4
bindsym $mod+Shift+5 move container to workspace number $ws5
bindsym $mod+Shift+6 move container to workspace number $ws6
bindsym $mod+Shift+7 move container to workspace number $ws7
bindsym $mod+Shift+8 move container to workspace number $ws8
bindsym $mod+Shift+9 move container to workspace number $ws9
bindsym $mod+Shift+0 move container to workspace number $ws10
# reload the configuration file
bindsym $mod+Shift+adiaeresis reload
# restart i3 inplace (preserves your layout/session, can be used to upgrade i3)
bindsym $mod+Shift+C restart
# exit i3 (logs you out of your X session)
bindsym $mod+Shift+L exec "i3-nagbar -t warning -m 'You pressed the exit shortcut. Do you really want to exit i3? This will end your X session.' -B 'Yes, exit i3' 'i3-msg exit'"
# resize window (you can also use the mouse for that)
mode "resize" {
# These bindings trigger as soon as you enter the resize mode
# Pressing left will shrink the windows width.
# Pressing right will grow the windows width.
# Pressing up will shrink the windows height.
# Pressing down will grow the windows height.
bindsym n resize shrink width 10 px or 10 ppt
bindsym r resize grow height 10 px or 10 ppt
bindsym t resize shrink height 10 px or 10 ppt
bindsym d resize grow width 10 px or 10 ppt
# same bindings, but for the arrow keys
bindsym Left resize shrink width 10 px or 10 ppt
bindsym Down resize grow height 10 px or 10 ppt
bindsym Up resize shrink height 10 px or 10 ppt
bindsym Right resize grow width 10 px or 10 ppt
# back to normal: Enter or Escape or $mod+r
bindsym Return mode "default"
bindsym Escape mode "default"
bindsym $mod+c mode "default"
}
bindsym $mod+c mode "resize"
# Start i3bar to display a workspace bar (plus the system information i3status
# finds out, if available)
#bar {
# status_command i3status
#}
#for_window [class=".*"] border pixel 0
gaps inner 10
gaps outer 5
for_window [class=".*"] border pixel 0
#for_window [class=".*"] border_radius 20

195
i3/config.bck Normal file
View File

@ -0,0 +1,195 @@
# This file has been auto-generated by i3-config-wizard(1).
# It will not be overwritten, so edit it as you like.
#
# Should you change your keyboard layout some time, delete
# this file and re-run i3-config-wizard(1).
#
# i3 config file (v4)
#
# Please see https://i3wm.org/docs/userguide.html for a complete reference!
set $mod Mod4
# Font for window titles. Will also be used by the bar unless a different font
# is used in the bar {} block below.
#font pango:monospace 8
#font pango:Hack Nerd Font mono:style=Regular 12
font pango:JetBrainsMono Nerd Font:style=Regular 12
exec_always --no-startup-id $HOME/.config/polybar/my_theme/launch.sh
# This font is widely installed, provides lots of unicode glyphs, right-to-left
# text rendering and scalability on retina/hidpi displays (thanks to pango).
#font pango:DejaVu Sans Mono 8
# Start XDG autostart .desktop files using dex. See also
# https://wiki.archlinux.org/index.php/XDG_Autostart
exec --no-startup-id dex-autostart --autostart --environment i3
# The combination of xss-lock, nm-applet and pactl is a popular choice, so
# they are included here as an example. Modify as you see fit.
# xss-lock grabs a logind suspend inhibit lock and will use i3lock to lock the
# screen before suspend. Use loginctl lock-session to lock your screen.
exec --no-startup-id xss-lock --transfer-sleep-lock -- i3lock --nofork
# NetworkManager is the most popular way to manage wireless networks on Linux,
# and nm-applet is a desktop environment-independent system tray GUI for it.
exec --no-startup-id nm-applet
# Use pactl to adjust volume in PulseAudio.
set $refresh_i3status killall -SIGUSR1 i3status
bindsym XF86AudioRaiseVolume exec --no-startup-id pactl set-sink-volume @DEFAULT_SINK@ +10% && $refresh_i3status
bindsym XF86AudioLowerVolume exec --no-startup-id pactl set-sink-volume @DEFAULT_SINK@ -10% && $refresh_i3status
bindsym XF86AudioMute exec --no-startup-id pactl set-sink-mute @DEFAULT_SINK@ toggle && $refresh_i3status
bindsym XF86AudioMicMute exec --no-startup-id pactl set-source-mute @DEFAULT_SOURCE@ toggle && $refresh_i3status
# Use Mouse+$mod to drag floating windows to their wanted position
floating_modifier $mod
# move tiling windows via drag & drop by left-clicking into the title bar,
# or left-clicking anywhere into the window while holding the floating modifier.
tiling_drag modifier titlebar
# start a terminal
bindsym $mod+Return exec i3-sensible-terminal
# kill focused window
bindsym $mod+Shift+X kill
# start dmenu (a program launcher)
#bindsym $mod+a exec --no-startup-id dmenu_run
bindsym $mod+a exec --no-startup-id $HOME/.config/polybar/my_theme/scripts/launcher.sh
# A more modern dmenu replacement is rofi:
# bindcode $mod+40 exec "rofi -modi drun,run -show drun"
# There also is i3-dmenu-desktop which only displays applications shipping a
# .desktop file. It is a wrapper around dmenu, so you need that installed.
# bindcode $mod+40 exec --no-startup-id i3-dmenu-desktop
# change focus
bindsym $mod+n focus left
bindsym $mod+r focus down
bindsym $mod+t focus up
bindsym $mod+d focus right
# alternatively, you can use the cursor keys:
bindsym $mod+Left focus left
bindsym $mod+Down focus down
bindsym $mod+Up focus up
bindsym $mod+Right focus right
# move focused window
bindsym $mod+Shift+N move left
bindsym $mod+Shift+R move down
bindsym $mod+Shift+T move up
bindsym $mod+Shift+D move right
# alternatively, you can use the cursor keys:
bindsym $mod+Shift+Left move left
bindsym $mod+Shift+Down move down
bindsym $mod+Shift+Up move up
bindsym $mod+Shift+Right move right
# split in horizontal orientation
bindsym $mod+s split h
# split in vertical orientation
bindsym $mod+p split v
# enter fullscreen mode for the focused container
bindsym $mod+e fullscreen toggle
# change container layout (stacked, tabbed, toggle split)
bindsym $mod+i layout stacking
bindsym $mod+v layout tabbed
bindsym $mod+l layout toggle split
# toggle tiling / floating
bindsym $mod+Shift+space floating toggle
# change focus between tiling / floating windows
bindsym $mod+space focus mode_toggle
# focus the parent container
bindsym $mod+u focus parent
# focus the child container
#bindsym $mod+d focus child
# Define names for default workspaces for which we configure key bindings later on.
# We use variables to avoid repeating the names in multiple places.
set $ws1 "1"
set $ws2 "2"
set $ws3 "3"
set $ws4 "4"
set $ws5 "5"
set $ws6 "6"
set $ws7 "7"
set $ws8 "8"
set $ws9 "9"
set $ws10 "10"
# switch to workspace
bindsym $mod+1 workspace number $ws1
bindsym $mod+2 workspace number $ws2
bindsym $mod+3 workspace number $ws3
bindsym $mod+4 workspace number $ws4
bindsym $mod+5 workspace number $ws5
bindsym $mod+6 workspace number $ws6
bindsym $mod+7 workspace number $ws7
bindsym $mod+8 workspace number $ws8
bindsym $mod+9 workspace number $ws9
bindsym $mod+0 workspace number $ws10
# move focused container to workspace
bindsym $mod+Shift+1 move container to workspace number $ws1
bindsym $mod+Shift+2 move container to workspace number $ws2
bindsym $mod+Shift+3 move container to workspace number $ws3
bindsym $mod+Shift+4 move container to workspace number $ws4
bindsym $mod+Shift+5 move container to workspace number $ws5
bindsym $mod+Shift+6 move container to workspace number $ws6
bindsym $mod+Shift+7 move container to workspace number $ws7
bindsym $mod+Shift+8 move container to workspace number $ws8
bindsym $mod+Shift+9 move container to workspace number $ws9
bindsym $mod+Shift+0 move container to workspace number $ws10
# reload the configuration file
bindsym $mod+Shift+adiaeresis reload
# restart i3 inplace (preserves your layout/session, can be used to upgrade i3)
bindsym $mod+Shift+C restart
# exit i3 (logs you out of your X session)
bindsym $mod+Shift+L exec "i3-nagbar -t warning -m 'You pressed the exit shortcut. Do you really want to exit i3? This will end your X session.' -B 'Yes, exit i3' 'i3-msg exit'"
# resize window (you can also use the mouse for that)
mode "resize" {
# These bindings trigger as soon as you enter the resize mode
# Pressing left will shrink the windows width.
# Pressing right will grow the windows width.
# Pressing up will shrink the windows height.
# Pressing down will grow the windows height.
bindsym n resize shrink width 10 px or 10 ppt
bindsym r resize grow height 10 px or 10 ppt
bindsym t resize shrink height 10 px or 10 ppt
bindsym d resize grow width 10 px or 10 ppt
# same bindings, but for the arrow keys
bindsym Left resize shrink width 10 px or 10 ppt
bindsym Down resize grow height 10 px or 10 ppt
bindsym Up resize shrink height 10 px or 10 ppt
bindsym Right resize grow width 10 px or 10 ppt
# back to normal: Enter or Escape or $mod+r
bindsym Return mode "default"
bindsym Escape mode "default"
bindsym $mod+c mode "default"
}
bindsym $mod+c mode "resize"
# Start i3bar to display a workspace bar (plus the system information i3status
# finds out, if available)
#bar {
# status_command i3status
#}

531
my_theme/bars.ini Normal file
View File

@ -0,0 +1,531 @@
;; ┌────────────────────────────────────────────────────┐
;; │░█▀█░█▀█░█░░░█░█░█▀▄░█▀█░█▀▄░░░░░░░░░█▀▄░█▀█░█▀▄░█▀▀│
;; │░█▀▀░█░█░█░░░░█░░█▀▄░█▀█░█▀▄░░░░▀░░░░█▀▄░█▀█░█▀▄░▀▀█│
;; │░▀░░░▀▀▀░▀▀▀░░▀░░▀▀░░▀░▀░▀░▀░░░░▀░░░░▀▀░░▀░▀░▀░▀░▀▀▀│
;; │░Created░By░Aditya░Shakya░@adi1090x░░░░░░░░░░░░░░░░░│
;; └────────────────────────────────────────────────────┘
;; _-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_
[bar]
fill =
;fill = a
empty =
;empty = b
indicator =
;indicator = c
;; _-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_
[module/volume]
type = internal/alsa
; Soundcard to be used
; Usually in the format hw:# where # is the card number
; You can find the different card numbers in `/proc/asound/cards`
master-soundcard = default
speaker-soundcard = default
headphone-soundcard = default
; Name of the master, speaker and headphone mixers
; Use the following command to list available mixer controls:
; $ amixer scontrols | sed -nr "s/.*'([[:alnum:]]+)'.*/\1/p"
; If master, speaker or headphone-soundcard isn't the default,
; use `amixer -c # scontrols` instead where # is the number
; of the master, speaker or headphone soundcard respectively
;
; Default: Master
master-mixer = Master
; Optionally define speaker and headphone mixers
; Default: none
;;speaker-mixer = Speaker
; Default: none
;;headphone-mixer = Headphone
; NOTE: This is required if headphone_mixer is defined
; Use the following command to list available device controls
; $ amixer controls | sed -r "/CARD/\!d; s/.*=([0-9]+).*name='([^']+)'.*/printf '%3.0f: %s\n' '\1' '\2'/e" | sort
; You may also need to use `amixer -c # controls` as above for the mixer names
; Default: none
;;headphone-id = 9
; Use volume mapping (similar to amixer -M and alsamixer), where the increase in volume is linear to the ear
; Default: false
;;mapped = true
; Interval for volume increase/decrease (in percent points)
; Default: 5
interval = 5
; Available tags:
; <label-volume> (default)
; <ramp-volume>
; <bar-volume>
format-volume = <ramp-volume> <bar-volume>
format-volume-background = ${color.shade1}
format-volume-padding = 2
; Available tags:
; <label-muted> (default)
; <ramp-volume>
; <bar-volume>
format-muted = <label-muted>
format-muted-prefix =
format-muted-background = ${color.shade1}
format-muted-padding = 2
; Available tokens:
; %percentage% (default)
label-volume = %percentage%%
; Available tokens:
; %percentage% (default
label-muted = " Muted"
label-muted-foreground = ${color.foreground}
; Only applies if <ramp-volume> is used
ramp-volume-0 =
ramp-volume-1 =
ramp-volume-2 =
ramp-volume-3 =
ramp-volume-4 =
; Only applies if <bar-volume> is used
bar-volume-width = 10
bar-volume-gradient = false
bar-volume-indicator = ${bar.indicator}
bar-volume-indicator-foreground = ${color.foreground}
bar-volume-fill = ${bar.fill}
bar-volume-foreground-0 = ${color.foreground}
bar-volume-foreground-1 = ${color.foreground}
bar-volume-foreground-2 = ${color.foreground}
bar-volume-empty = ${bar.empty}
bar-volume-empty-foreground = #101010
; If defined, it will replace <ramp-volume> when
; headphones are plugged in to `headphone_control_numid`
; If undefined, <ramp-volume> will be used for both
; Only applies if <ramp-volume> is used
ramp-headphones-0 =
;; _-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_
[module/brightness]
;type = internal/xbacklight
type = internal/backlight
; Use the following command to list available cards:
; $ ls -1 /sys/class/backlight/
card = intel_backlight
;card = amdgpu_bl0
; Available tags:
; <label> (default)
; <ramp>
; <bar>
;format = <ramp> <bar>
format = <ramp> <label>
format-background = ${color.shade1}
format-padding = 2
; Available tokens:
; %percentage% (default)
label = %{T-}%percentage%%
; Only applies if <ramp> is used
;ramp-0 = 
;ramp-1 = 
;ramp-2 = 
;ramp-3 = 
;ramp-4 = 
ramp-0 = %{T4}󰳲
; Only applies if <bar> is used
bar-width = 10
bar-gradient = false
bar-indicator = ${bar.indicator}
bar-indicator-foreground = ${color.foreground}
bar-fill = ${bar.fill}
bar-foreground-0 = ${color.foreground}
bar-foreground-1 = ${color.foreground}
bar-foreground-2 = ${color.foreground}
bar-empty = ${bar.empty}
bar-empty-foreground = #101010
;; _-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_
[module/battery_bar]
type = internal/battery
; This is useful in case the battery never reports 100% charge
full-at = 99
; Use the following command to list batteries and adapters:
; $ ls -1 /sys/class/power_supply/
battery = BAT1
adapter = ACAD
; If an inotify event haven't been reported in this many
; seconds, manually poll for new values.
;
; Needed as a fallback for systems that don't report events
; on sysfs/procfs.
;
; Disable polling by setting the interval to 0.
;
; Default: 5
poll-interval = 2
; see "man date" for details on how to format the time string
; NOTE: if you want to use syntax tags here you need to use %%{...}
; Default: %H:%M:%S
time-format = %H:%M
; Available tags:
; <label-charging> (default)
; <bar-capacity>
; <ramp-capacity>
; <animation-charging>
format-charging = <bar-capacity>
format-charging-prefix = " "
format-charging-background = ${color.shade3}
format-charging-padding = 2
; Available tags:
; <label-discharging> (default)
; <bar-capacity>
; <ramp-capacity>
; <animation-discharging>
format-discharging = <bar-capacity>
format-discharging-prefix = " "
format-discharging-background = ${color.shade3}
format-discharging-padding = 2
; Available tags:
; <label-full> (default)
; <bar-capacity>
; <ramp-capacity>
format-full = <label-full>
format-full-prefix = " "
format-full-background = ${color.shade3}
format-full-padding = 2
; Available tokens:
; %percentage% (default)
; %time%
; %consumption% (shows current charge rate in watts)
label-charging = %percentage%%
; Available tokens:
; %percentage% (default)
; %time%
; %consumption% (shows current discharge rate in watts)
label-discharging = %percentage%%
; Available tokens:
; %percentage% (default)
label-full = "Full"
; Only applies if <bar-capacity> is used
bar-capacity-width = 10
bar-capacity-gradient = false
bar-capacity-indicator = ${bar.indicator}
bar-capacity-indicator-foreground = ${color.foreground}
bar-capacity-fill = ${bar.fill}
bar-capacity-foreground-0 = ${color.foreground}
bar-capacity-foreground-1 = ${color.foreground}
bar-capacity-foreground-2 = ${color.foreground}
bar-capacity-empty = ${bar.empty}
bar-capacity-empty-foreground = #101010
;; _-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_
[module/cpu_bar]
type = internal/cpu
; Seconds to sleep between updates
; Default: 1
interval = 0.5
; Available tags:
; <label> (default)
; <bar-load>
; <ramp-load>
; <ramp-coreload>
;;format = <label> <ramp-coreload>
format = <bar-load> <label>
#format-prefix = " "
format-prefix = %{T4}󰻠 %{T-}
format-background = ${color.shade3}
format-padding = 2
; Available tokens:
; %percentage% (default) - total cpu load averaged over all cores
; %percentage-sum% - Cumulative load on all cores
; %percentage-cores% - load percentage for each core
; %percentage-core[1-9]% - load percentage for specific core
label = "%percentage%%"
; Only applies if <bar-load> is used
bar-load-width = 10
bar-load-gradient = false
bar-load-indicator = ${bar.indicator}
bar-load-indicator-foreground = ${color.foreground}
bar-load-fill = ${bar.fill}
bar-load-foreground-0 = ${color.foreground}
bar-load-foreground-1 = ${color.foreground}
bar-load-foreground-2 = ${color.foreground}
bar-load-empty = ${bar.empty}
bar-load-empty-foreground = #101010
;; _-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_
[module/filesystem_bar]
type = internal/fs
; Mountpoints to display
mount-0 = /
;;mount-1 = /home
;;mount-2 = /var
; Seconds to sleep between updates
; Default: 30
interval = 30
; Display fixed precision values
; Default: false
fixed-values = false
; Spacing between entries
; Default: 2
;;spacing = 4
; Available tags:
; <label-mounted> (default)
; <bar-free>
; <bar-used>
; <ramp-capacity>
format-mounted = <bar-used> <label-mounted>
;format-mounted-prefix = " "
format-mounted-prefix = %{T4}󰋊 %{T-}
format-mounted-background = ${color.shade1}
format-mounted-padding = 2
; Available tags:
; <label-unmounted> (default)
format-unmounted = <label-unmounted>
format-unmounted-prefix = " "
format-unmounted-background = ${color.shade5}
format-unmounted-padding = 2
; Available tokens:
; %mountpoint%
; %type%
; %fsname%
; %percentage_free%
; %percentage_used%
; %total%
; %free%
; %used%
; Default: %mountpoint% %percentage_free%%
label-mounted = %used%/%total%
; Available tokens:
; %mountpoint%
; Default: %mountpoint% is not mounted
label-unmounted = "%mountpoint%: not mounted"
; Only applies if <bar-used> is used
bar-used-width = 10
bar-used-gradient = false
bar-used-indicator = ${bar.indicator}
bar-used-indicator-foreground = ${color.foreground}
bar-used-fill = ${bar.fill}
bar-used-foreground-0 = ${color.foreground}
bar-used-foreground-1 = ${color.foreground}
bar-used-foreground-2 = ${color.foreground}
bar-used-empty = ${bar.empty}
bar-used-empty-foreground = #101010
;; _-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_
[module/memory_bar]
type = internal/memory
; Seconds to sleep between updates
; Default: 1
interval = 2
; Available tags:
; <label> (default)
; <bar-used>
; <bar-free>
; <ramp-used>
; <ramp-free>
; <bar-swap-used>
; <bar-swap-free>
; <ramp-swap-used>
; <ramp-swap-free>
format = <bar-used> <label>
;format-prefix = " "
format-prefix = %{T4} %{T-}
format-background = ${color.shade2}
format-padding = 2
; Available tokens:
; %percentage_used% (default)
; %percentage_free%
; %gb_used%
; %gb_free%
; %gb_total%
; %mb_used%
; %mb_free%
; %mb_total%
; %percentage_swap_used%
; %percentage_swap_free%
; %mb_swap_total%
; %mb_swap_free%
; %mb_swap_used%
; %gb_swap_total%
; %gb_swap_free%
; %gb_swap_used%
label = "%mb_used%"
; Only applies if <bar-used> is used
bar-used-width = 10
bar-used-gradient = false
bar-used-indicator = ${bar.indicator}
bar-used-indicator-foreground = ${color.foreground}
bar-used-fill = ${bar.fill}
bar-used-foreground-0 = ${color.foreground}
bar-used-foreground-1 = ${color.foreground}
bar-used-foreground-2 = ${color.foreground}
bar-used-empty = ${bar.empty}
bar-used-empty-foreground = #101010
;; _-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_
[module/mpd_bar]
type = internal/mpd
; Host where mpd is running (either ip or domain name)
; Can also be the full path to a unix socket where mpd is running.
;;host = 127.0.0.1
;;port = 6600
;;password = mysecretpassword
; Seconds to sleep between progressbar/song timer sync
; Default: 1
interval = 1
; Available tags:
; <label-song> (default)
; <label-time>
; <bar-progress>
; <toggle> - gets replaced with <icon-(pause|play)>
; <toggle-stop> - gets replaced with <icon-(stop|play)>
; <icon-random>
; <icon-repeat>
; <icon-repeatone> (deprecated)
; <icon-single> - Toggle playing only a single song. Replaces <icon-repeatone>
; <icon-consume>
; <icon-prev>
; <icon-stop>
; <icon-play>
; <icon-pause>
; <icon-next>
; <icon-seekb>
; <icon-seekf>
format-online = <label-song> <bar-progress> <label-time>
format-online-prefix =
format-online-background = ${color.shade4}
format-online-padding = 2
;format-playing = ${self.format-online}
;format-paused = ${self.format-online}
;format-stopped = ${self.format-online}
; Available tags:
; <label-offline>
format-offline = <label-offline>
format-offline-prefix =
format-offline-background = ${color.shade4}
format-offline-padding = 2
; Available tokens:
; %artist%
; %album-artist%
; %album%
; %date%
; %title%
; Default: %artist% - %title%
label-song = " %artist% - %title%"
label-song-maxlen = 25
label-song-ellipsis = true
; Available tokens:
; %elapsed%
; %total%
; Default: %elapsed% / %total%
label-time = %elapsed% / %total%
; Available tokens:
; None
label-offline = " Offline"
; Only applies if <icon-X> is used
icon-play =
icon-pause =
icon-stop =
icon-next =
icon-prev =
icon-seekf =
icon-seekb =
icon-random =
icon-repeat =
icon-repeatone =
icon-single =
icon-consume =
; Used to display the state of random/repeat/repeatone/single
; Only applies if <icon-[random|repeat|repeatone|single]> is used
toggle-on-foreground = ${color.foreground}
toggle-off-foreground = ${color.background}
; Only applies if <bar-progress> is used
bar-progress-width = 10
bar-progress-gradient = false
bar-progress-indicator = ${bar.indicator}
bar-progress-indicator-foreground = ${color.foreground}
bar-progress-fill = ${bar.fill}
bar-progress-foreground-0 = ${color.foreground}
bar-progress-foreground-1 = ${color.foreground}
bar-progress-foreground-2 = ${color.foreground}
bar-progress-empty = ${bar.empty}
bar-progress-empty-foreground = #101010
;; _-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_

29
my_theme/colors.ini Normal file
View File

@ -0,0 +1,29 @@
;; ┌────────────────────────────────────────────────────────────┐
;; │░█▀█░█▀█░█░░░█░█░█▀▄░█▀█░█▀▄░░░░░░░░░█▀▀░█▀█░█░░░█▀█░█▀▄░█▀▀│
;; │░█▀▀░█░█░█░░░░█░░█▀▄░█▀█░█▀▄░░░░▀░░░░█░░░█░█░█░░░█░█░█▀▄░▀▀█│
;; │░▀░░░▀▀▀░▀▀▀░░▀░░▀▀░░▀░▀░▀░▀░░░░▀░░░░▀▀▀░▀▀▀░▀▀▀░▀▀▀░▀░▀░▀▀▀│
;; │░Created░By░Aditya░Shakya░@adi1090x░░░░░░░░░░░░░░░░░░░░░░░░░│
;; └────────────────────────────────────────────────────────────┘
;; _-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_
[color]
;; Use pywal.sh in scripts directory to use colors from an image/wallpaper.
;; main colors
background = #1F1F1F
foreground = #FFFFFF
foreground-alt = #FFFFFF
;; shades
shade1 = #0D47A1
shade2 = #1565C0
shade3 = #1976D2
shade4 = #1E88E5
shade5 = #2196F3
shade6 = #42A5F5
shade7 = #64B5F6
shade8 = #90CAF9
;; _-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_

316
my_theme/config.ini Normal file
View File

@ -0,0 +1,316 @@
;; ┌────────────────────────────────────────────────────────────┐
;; │░█▀█░█▀█░█░░░█░█░█▀▄░█▀█░█▀▄░░░░░░░░░█▀▀░█▀█░█▀█░█▀▀░▀█▀░█▀▀│
;; │░█▀▀░█░█░█░░░░█░░█▀▄░█▀█░█▀▄░░░░▀░░░░█░░░█░█░█░█░█▀▀░░█░░█░█│
;; │░▀░░░▀▀▀░▀▀▀░░▀░░▀▀░░▀░▀░▀░▀░░░░▀░░░░▀▀▀░▀▀▀░▀░▀░▀░░░▀▀▀░▀▀▀│
;; │░Created░By░Aditya░Shakya░@adi1090x░░░░░░░░░░░░░░░░░░░░░░░░░│
;; └────────────────────────────────────────────────────────────┘
;; _-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_
;; Global WM Settings
[global/wm]
; Adjust the _NET_WM_STRUT_PARTIAL top value
; Used for top aligned bars
margin-bottom = 0
; Adjust the _NET_WM_STRUT_PARTIAL bottom value
; Used for bottom aligned bars
margin-top = 0
;; _-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_
;; File Inclusion
; include an external file, like module file, etc.
include-file = ~/.config/polybar/my_theme/bars.ini
include-file = ~/.config/polybar/my_theme/colors.ini
include-file = ~/.config/polybar/my_theme/glyphs.ini
include-file = ~/.config/polybar/my_theme/modules.ini
include-file = ~/.config/polybar/my_theme/user_modules.ini
;; _-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_
;; Bar Settings
[bar/main]
; Use either of the following command to list available outputs:
; If unspecified, the application will pick the first one it finds.
; $ polybar -m | cut -d ':' -f 1
; $ xrandr -q | grep " connected" | cut -d ' ' -f1
monitor =
; Use the specified monitor as a fallback if the main one is not found.
monitor-fallback =
; Require the monitor to be in connected state
; XRandR sometimes reports my monitor as being disconnected (when in use)
monitor-strict = false
; Tell the Window Manager not to configure the window.
; Use this to detach the bar if your WM is locking its size/position.
override-redirect = false
; Put the bar at the bottom of the screen
bottom = false
; Prefer fixed center position for the `modules-center` block
; When false, the center position will be based on the size of the other blocks.
fixed-center = true
; Dimension defined as pixel value (e.g. 35) or percentage (e.g. 50%),
; the percentage can optionally be extended with a pixel offset like so:
; 50%:-10, this will result in a width or height of 50% minus 10 pixels
width = 100%
height = 32
; Offset defined as pixel value (e.g. 35) or percentage (e.g. 50%)
; the percentage can optionally be extended with a pixel offset like so:
; 50%:-10, this will result in an offset in the x or y direction
; of 50% minus 10 pixels
offset-x = 0%
offset-y = 0%
; Background ARGB color (e.g. #f00, #ff992a, #ddff1023)
background = ${color.background}
; Foreground ARGB color (e.g. #f00, #ff992a, #ddff1023)
foreground = ${color.foreground}
; Background gradient (vertical steps)
; background-[0-9]+ = #aarrggbb
;;background-0 =
; Value used for drawing rounded corners
; Note: This shouldn't be used together with border-size because the border
; doesn't get rounded
; Individual top/bottom values can be defined using:
; radius-{top,bottom}
radius-top = 0.0
radius-bottom = 0.0
; Under-/overline pixel size and argb color
; Individual values can be defined using:
; {overline,underline}-size
; {overline,underline}-color
underline-size = 2
underline-color = ${color.foreground}
; Values applied to all borders
; Individual side values can be defined using:
; border-{left,top,right,bottom}-size
; border-{left,top,right,bottom}-color
; The top and bottom borders are added to the bar height, so the effective
; window height is:
; height + border-top-size + border-bottom-size
; Meanwhile the effective window width is defined entirely by the width key and
; the border is placed withing this area. So you effectively only have the
; following horizontal space on the bar:
; width - border-right-size - border-left-size
border-size = 0
border-color = ${color.background}
; Number of spaces to add at the beginning/end of the bar
; Individual side values can be defined using:
; padding-{left,right}
padding = 0
; Number of spaces to add before/after each module
; Individual side values can be defined using:
; module-margin-{left,right}
module-margin-left = 0
module-margin-right = 0
;; _-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_
; Fonts are defined using <font-name>;<vertical-offset>
; Font names are specified using a fontconfig pattern.
; font-0 = NotoSans-Regular:size=8;2
; font-1 = MaterialIcons:size=10
; font-2 = Termsynu:size=8;-1
; font-3 = FontAwesome:size=10
; See the Fonts wiki page for more details
#font-0 = "Terminus:size=10;3"
font-0 = "Iosevka Nerd Font=10;3"
font-1 = "waffle:size=10;3"
#font-2 = "Iosevka Nerd Font:style=Medium:size=22;5"
font-2 = "Iosevka Nerd Font:style=Medium:size=22;5"
font-3 = "Iosevka Nerd Font:style=Medium:size=16;3"
; Modules are added to one of the available blocks
; modules-left = cpu ram
; modules-center = xwindow xbacklight
; modules-right = ipc clock
;
;; _-_-_-_-_-_-_-_-_-
[bar/top]
inherit = bar/main
modules-left = launcher left1 title left2
;modules-center = workspaces sep mpd
modules-center = workspaces
;modules-right = right7 color-switch right6 updates right5 alsa right4 battery right3 network right2 date right1 sysmenu
modules-right = right5-finish alsa right4 battery right3 wireguard-home wired-network wireless-network right2 date right1 sysmenu
;; _-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_
; The separator will be inserted between the output of each module
separator =
; Opacity value between 0.0 and 1.0 used on fade in/out
dim-value = 1.0
; Value to be used to set the WM_NAME atom
; If the value is empty or undefined, the atom value
; will be created from the following template: polybar-[BAR]_[MONITOR]
; NOTE: The placeholders are not available for custom values
wm-name =
; Locale used to localize various module data (e.g. date)
; Expects a valid libc locale, for example: sv_SE.UTF-8
locale =
; Position of the system tray window
; If empty or undefined, tray support will be disabled
; NOTE: A center aligned tray will cover center aligned modules
;
; Available positions:
; left
; center
; right
; none
tray-position = none
; If true, the bar will not shift its
; contents when the tray changes
tray-detached = false
; Tray icon max size
tray-maxsize = 16
; Background color for the tray container
; ARGB color (e.g. #f00, #ff992a, #ddff1023)
; By default the tray container will use the bar
; background color.
tray-background = ${color.background}
; Tray offset defined as pixel value (e.g. 35) or percentage (e.g. 50%)
tray-offset-x = 0
tray-offset-y = 0
; Pad the sides of each tray icon
tray-padding = 0
; Scale factor for tray clients
tray-scale = 1.0
; Restack the bar window and put it above the
; selected window manager's root
;
; Fixes the issue where the bar is being drawn
; on top of fullscreen window's
;
; Currently supported WM's:
; bspwm
; i3 (requires: `override-redirect = true`)
;;wm-restack =
; Set a DPI values used when rendering text
; This only affects scalable fonts
; dpi =
; Enable support for inter-process messaging
; See the Messaging wiki page for more details.
enable-ipc = true
; Fallback click handlers that will be called if
; there's no matching module handler found.
click-left =
click-middle =
click-right =
scroll-up =
scroll-down =
double-click-left =
double-click-middle =
double-click-right =
; Requires polybar to be built with xcursor support (xcb-util-cursor)
; Possible values are:
; - default : The default pointer as before, can also be an empty string (default)
; - pointer : Typically in the form of a hand
; - ns-resize : Up and down arrows, can be used to indicate scrolling
cursor-click =
cursor-scroll =
;; WM Workspace Specific
; bspwm
;;scroll-up = bspwm-desknext
;;scroll-down = bspwm-deskprev
;;scroll-up = bspc desktop -f prev.local
;;scroll-down = bspc desktop -f next.local
;i3
;;scroll-up = i3wm-wsnext
;;scroll-down = i3wm-wsprev
;;scroll-up = i3-msg workspace next_on_output
;;scroll-down = i3-msg workspace prev_on_output
;; _-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_
;; Application Settings
[bar/bottom]
inherit = bar/main
bottom = true
modules-left = brightness left1-finish
modules-right = right3-finish cpu_bar right2 memory_bar right1 filesystem_bar
enable-ipc = true
tray-position = center
[settings]
; The throttle settings lets the eventloop swallow up til X events
; if they happen within Y millisecond after first event was received.
; This is done to prevent flood of update event.
;
; For example if 5 modules emit an update event at the same time, we really
; just care about the last one. But if we wait too long for events to swallow
; the bar would appear sluggish so we continue if timeout
; expires or limit is reached.
throttle-output = 5
throttle-output-for = 10
; Time in milliseconds that the input handler will wait between processing events
;throttle-input-for = 30
; Reload upon receiving XCB_RANDR_SCREEN_CHANGE_NOTIFY events
screenchange-reload = false
; Compositing operators
; @see: https://www.cairographics.org/manual/cairo-cairo-t.html#cairo-operator-t
compositing-background = source
compositing-foreground = over
compositing-overline = over
compositing-underline = over
compositing-border = over
; Define fallback values used by all module formats
;format-foreground =
;format-background =
;format-underline =
;format-overline =
;format-spacing =
;format-padding =
;format-margin =
;format-offset =
; Enables pseudo-transparency for the bar
; If set to true the bar can be transparent without a compositor.
pseudo-transparency = false
;; _-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_

100
my_theme/glyphs.ini Normal file
View File

@ -0,0 +1,100 @@
;; ┌────────────────────────────────────────────────────────────┐
;; │░█▀█░█▀█░█░░░█░█░█▀▄░█▀█░█▀▄░░░░░░░░░█▀▀░█░░░█░█░█▀█░█░█░█▀▀│
;; │░█▀▀░█░█░█░░░░█░░█▀▄░█▀█░█▀▄░░░░▀░░░░█░█░█░░░░█░░█▀▀░█▀█░▀▀█│
;; │░▀░░░▀▀▀░▀▀▀░░▀░░▀▀░░▀░▀░▀░▀░░░░▀░░░░▀▀▀░▀▀▀░░▀░░▀░░░▀░▀░▀▀▀│
;; │░Created░By░Aditya░Shakya░@adi1090x░░░░░░░░░░░░░░░░░░░░░░░░░│
;; └────────────────────────────────────────────────────────────┘
;; _-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_
[glyph]
gleft =
gright =
[module/left1]
type = custom/text
content-background = ${color.shade2}
content-foreground = ${color.shade1}
content = ${glyph.gleft}
content-font = 3
[module/left1-finish]
type = custom/text
content-background = ${color.background}
content-foreground = ${color.shade1}
content = ${glyph.gleft}
content-font = 3
[module/left2]
type = custom/text
content-background = ${color.background}
content-foreground = ${color.shade2}
content = ${glyph.gleft}
content-font = 3
# ==================================
[module/right1]
type = custom/text
content-background = ${color.shade2}
content-foreground = ${color.shade1}
content = ${glyph.gright}
content-font = 3
[module/right2]
type = custom/text
content-background = ${color.shade3}
content-foreground = ${color.shade2}
content = ${glyph.gright}
content-font = 3
[module/right3]
type = custom/text
content-background = ${color.shade4}
content-foreground = ${color.shade3}
content = ${glyph.gright}
content-font = 3
[module/right3-finish]
type = custom/text
content-background = ${color.background}
content-foreground = ${color.shade3}
content = ${glyph.gright}
content-font = 3
[module/right4]
type = custom/text
content-background = ${color.shade5}
content-foreground = ${color.shade4}
content = ${glyph.gright}
content-font = 3
[module/right5]
type = custom/text
content-background = ${color.shade6}
content-foreground = ${color.shade5}
content = ${glyph.gright}
content-font = 3
[module/right5-finish]
type = custom/text
content-background = ${color.background}
content-foreground = ${color.shade5}
content = ${glyph.gright}
content-font = 3
[module/right6]
type = custom/text
content-background = ${color.shade7}
content-foreground = ${color.shade6}
content = ${glyph.gright}
content-font = 3
[module/right7]
type = custom/text
content-background = ${color.background}
content-foreground = ${color.shade7}
content = ${glyph.gright}
content-font = 3
;; _-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_

15
my_theme/launch.sh Executable file
View File

@ -0,0 +1,15 @@
#!/usr/bin/env bash
# Add this script to your wm startup file.
DIR="$HOME/.config/polybar/my_theme"
# Terminate already running bar instances
killall -q polybar
# Wait until the processes have been shut down
while pgrep -u $UID -x polybar >/dev/null; do sleep 1; done
# Launch the bar
polybar -q top -c "$DIR"/config.ini &
polybar -q bottom -c "$DIR"/config.ini &

1324
my_theme/modules.ini Normal file

File diff suppressed because it is too large Load Diff

316
my_theme/preview.ini Normal file
View File

@ -0,0 +1,316 @@
;; ┌────────────────────────────────────────────────────────────────────┐
;; │░█▀█░█▀█░█░░░█░█░█▀▄░█▀█░█▀▄░░░░░░░░░█▀█░█▀▄░█▀▀░█░█░▀█▀░█▀▀░█░█░█▀▀│
;; │░█▀▀░█░█░█░░░░█░░█▀▄░█▀█░█▀▄░░░░▀░░░░█▀▀░█▀▄░█▀▀░▀▄▀░░█░░█▀▀░█▄█░▀▀█│
;; │░▀░░░▀▀▀░▀▀▀░░▀░░▀▀░░▀░▀░▀░▀░░░░▀░░░░▀░░░▀░▀░▀▀▀░░▀░░▀▀▀░▀▀▀░▀░▀░▀▀▀│
;; │░Created░By░Aditya░Shakya░@adi1090x░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░│
;; └────────────────────────────────────────────────────────────────────┘
;; _-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_
;; Global WM Settings
[global/wm]
; Adjust the _NET_WM_STRUT_PARTIAL top value
; Used for top aligned bars
margin-bottom = 0
; Adjust the _NET_WM_STRUT_PARTIAL bottom value
; Used for bottom aligned bars
margin-top = 0
;; _-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_
;; File Inclusion
; include an external file, like module file, etc.
include-file = ~/.config/polybar/my_theme/bars.ini
include-file = ~/.config/polybar/my_theme/colors.ini
include-file = ~/.config/polybar/my_theme/glyphs.ini
include-file = ~/.config/polybar/my_theme/modules.ini
include-file = ~/.config/polybar/my_theme/user_modules.ini
;; _-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_
;; Bar Settings
[bar/main]
; Use either of the following command to list available outputs:
; If unspecified, the application will pick the first one it finds.
; $ polybar -m | cut -d ':' -f 1
; $ xrandr -q | grep " connected" | cut -d ' ' -f1
monitor =
; Use the specified monitor as a fallback if the main one is not found.
monitor-fallback =
; Require the monitor to be in connected state
; XRandR sometimes reports my monitor as being disconnected (when in use)
monitor-strict = false
; Tell the Window Manager not to configure the window.
; Use this to detach the bar if your WM is locking its size/position.
override-redirect = false
; Put the bar at the bottom of the screen
bottom = false
; Prefer fixed center position for the `modules-center` block
; When false, the center position will be based on the size of the other blocks.
fixed-center = true
; Dimension defined as pixel value (e.g. 35) or percentage (e.g. 50%),
; the percentage can optionally be extended with a pixel offset like so:
; 50%:-10, this will result in a width or height of 50% minus 10 pixels
width = 100%
height = 32
; Offset defined as pixel value (e.g. 35) or percentage (e.g. 50%)
; the percentage can optionally be extended with a pixel offset like so:
; 50%:-10, this will result in an offset in the x or y direction
; of 50% minus 10 pixels
offset-x = 0%
offset-y = 0%
; Background ARGB color (e.g. #f00, #ff992a, #ddff1023)
background = ${color.background}
; Foreground ARGB color (e.g. #f00, #ff992a, #ddff1023)
foreground = ${color.foreground}
; Background gradient (vertical steps)
; background-[0-9]+ = #aarrggbb
;;background-0 =
; Value used for drawing rounded corners
; Note: This shouldn't be used together with border-size because the border
; doesn't get rounded
; Individual top/bottom values can be defined using:
; radius-{top,bottom}
radius-top = 0.0
radius-bottom = 0.0
; Under-/overline pixel size and argb color
; Individual values can be defined using:
; {overline,underline}-size
; {overline,underline}-color
underline-size = 2
underline-color = ${color.foreground}
; Values applied to all borders
; Individual side values can be defined using:
; border-{left,top,right,bottom}-size
; border-{left,top,right,bottom}-color
; The top and bottom borders are added to the bar height, so the effective
; window height is:
; height + border-top-size + border-bottom-size
; Meanwhile the effective window width is defined entirely by the width key and
; the border is placed withing this area. So you effectively only have the
; following horizontal space on the bar:
; width - border-right-size - border-left-size
border-size = 0
border-color = ${color.background}
; Number of spaces to add at the beginning/end of the bar
; Individual side values can be defined using:
; padding-{left,right}
padding = 0
; Number of spaces to add before/after each module
; Individual side values can be defined using:
; module-margin-{left,right}
module-margin-left = 0
module-margin-right = 0
;; _-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_
; Fonts are defined using <font-name>;<vertical-offset>
; Font names are specified using a fontconfig pattern.
; font-0 = NotoSans-Regular:size=8;2
; font-1 = MaterialIcons:size=10
; font-2 = Termsynu:size=8;-1
; font-3 = FontAwesome:size=10
; See the Fonts wiki page for more details
font-0 = "Terminus:size=10;3"
font-1 = "waffle:size=10;3"
font-2 = "Iosevka Nerd Font:style=Medium:size=22;5"
; Modules are added to one of the available blocks
; modules-left = cpu ram
; modules-center = xwindow xbacklight
; modules-right = ipc clock
;; _-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_
[bar/top]
inherit = bar/main
offset-y = 10
modules-left = launcher left1 title left2
modules-center = workspaces sep mpd
modules-right = right7 color-switch right6 updates right5 alsa right4 battery right3 network right2 date right1 sysmenu
enable-ipc = true
[bar/mid]
offset-y = 52
inherit = bar/main
modules-left = volume left1 brightness left2
modules-right = right7 cpu_bar right6 memory_bar right5 filesystem_bar right4 mpd_bar right3 battery_bar
enable-ipc = true
[bar/bottom]
inherit = bar/main
offset-y = 94
modules-left = menu left1 filesystem left2
modules-center = google github reddit gmail youtube
modules-right = right7 keyboard right6 cpu right5 memory right4 temperature right3 pulseaudio right2 backlight right1 powermenu
enable-ipc = true
;; _-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_
; The separator will be inserted between the output of each module
separator =
; Opacity value between 0.0 and 1.0 used on fade in/out
dim-value = 1.0
; Value to be used to set the WM_NAME atom
; If the value is empty or undefined, the atom value
; will be created from the following template: polybar-[BAR]_[MONITOR]
; NOTE: The placeholders are not available for custom values
wm-name =
; Locale used to localize various module data (e.g. date)
; Expects a valid libc locale, for example: sv_SE.UTF-8
locale =
; Position of the system tray window
; If empty or undefined, tray support will be disabled
; NOTE: A center aligned tray will cover center aligned modules
;
; Available positions:
; left
; center
; right
; none
tray-position = none
; If true, the bar will not shift its
; contents when the tray changes
tray-detached = false
; Tray icon max size
tray-maxsize = 16
; Background color for the tray container
; ARGB color (e.g. #f00, #ff992a, #ddff1023)
; By default the tray container will use the bar
; background color.
tray-background = ${color.background}
; Tray offset defined as pixel value (e.g. 35) or percentage (e.g. 50%)
tray-offset-x = 0
tray-offset-y = 0
; Pad the sides of each tray icon
tray-padding = 0
; Scale factor for tray clients
tray-scale = 1.0
; Restack the bar window and put it above the
; selected window manager's root
;
; Fixes the issue where the bar is being drawn
; on top of fullscreen window's
;
; Currently supported WM's:
; bspwm
; i3 (requires: `override-redirect = true`)
;;wm-restack =
; Set a DPI values used when rendering text
; This only affects scalable fonts
; dpi =
; Enable support for inter-process messaging
; See the Messaging wiki page for more details.
;enable-ipc = true
; Fallback click handlers that will be called if
; there's no matching module handler found.
click-left =
click-middle =
click-right =
scroll-up =
scroll-down =
double-click-left =
double-click-middle =
double-click-right =
; Requires polybar to be built with xcursor support (xcb-util-cursor)
; Possible values are:
; - default : The default pointer as before, can also be an empty string (default)
; - pointer : Typically in the form of a hand
; - ns-resize : Up and down arrows, can be used to indicate scrolling
cursor-click =
cursor-scroll =
;; WM Workspace Specific
; bspwm
;;scroll-up = bspwm-desknext
;;scroll-down = bspwm-deskprev
;;scroll-up = bspc desktop -f prev.local
;;scroll-down = bspc desktop -f next.local
;i3
;;scroll-up = i3wm-wsnext
;;scroll-down = i3wm-wsprev
;;scroll-up = i3-msg workspace next_on_output
;;scroll-down = i3-msg workspace prev_on_output
;; _-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_
;; Application Settings
[settings]
; The throttle settings lets the eventloop swallow up til X events
; if they happen within Y millisecond after first event was received.
; This is done to prevent flood of update event.
;
; For example if 5 modules emit an update event at the same time, we really
; just care about the last one. But if we wait too long for events to swallow
; the bar would appear sluggish so we continue if timeout
; expires or limit is reached.
throttle-output = 5
throttle-output-for = 10
; Time in milliseconds that the input handler will wait between processing events
;throttle-input-for = 30
; Reload upon receiving XCB_RANDR_SCREEN_CHANGE_NOTIFY events
screenchange-reload = false
; Compositing operators
; @see: https://www.cairographics.org/manual/cairo-cairo-t.html#cairo-operator-t
compositing-background = source
compositing-foreground = over
compositing-overline = over
compositing-underline = over
compositing-border = over
; Define fallback values used by all module formats
;format-foreground =
;format-background =
;format-underline =
;format-overline =
;format-spacing =
;format-padding =
;format-margin =
;format-offset =
; Enables pseudo-transparency for the bar
; If set to true the bar can be transparent without a compositor.
pseudo-transparency = false
;; _-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_

14
my_theme/preview.sh Executable file
View File

@ -0,0 +1,14 @@
#!/usr/bin/env bash
DIR="$HOME/.config/polybar/my_theme"
# Terminate already running bar instances
killall -q polybar
# Wait until the processes have been shut down
while pgrep -u $UID -x polybar >/dev/null; do sleep 1; done
# Launch the preview bar
polybar -q top -c "$DIR"/preview.ini &
polybar -q mid -c "$DIR"/preview.ini &
polybar -q bottom -c "$DIR"/preview.ini &

117
my_theme/scripts/checkupdates Executable file
View File

@ -0,0 +1,117 @@
#!/usr/bin/bash
#
# checkupdates: Safely print a list of pending updates.
#
# Copyright (c) 2013 Kyle Keen <keenerd@gmail.com>
#
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 2 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program. If not, see <http://www.gnu.org/licenses/>.
#
declare -r myname='checkupdates'
declare -r myver='1.0.0'
plain() {
(( QUIET )) && return
local mesg=$1; shift
printf "${BOLD} ${mesg}${ALL_OFF}\n" "$@" >&1
}
msg() {
(( QUIET )) && return
local mesg=$1; shift
printf "${GREEN}==>${ALL_OFF}${BOLD} ${mesg}${ALL_OFF}\n" "$@" >&1
}
msg2() {
(( QUIET )) && return
local mesg=$1; shift
printf "${BLUE} ->${ALL_OFF}${BOLD} ${mesg}${ALL_OFF}\n" "$@" >&1
}
ask() {
local mesg=$1; shift
printf "${BLUE}::${ALL_OFF}${BOLD} ${mesg}${ALL_OFF}" "$@" >&1
}
warning() {
local mesg=$1; shift
printf "${YELLOW}==> $(gettext "WARNING:")${ALL_OFF}${BOLD} ${mesg}${ALL_OFF}\n" "$@" >&2
}
error() {
local mesg=$1; shift
printf "${RED}==> $(gettext "ERROR:")${ALL_OFF}${BOLD} ${mesg}${ALL_OFF}\n" "$@" >&2
}
# check if messages are to be printed using color
unset ALL_OFF BOLD BLUE GREEN RED YELLOW
if [[ -t 2 && ! $USE_COLOR = "n" ]]; then
# prefer terminal safe colored and bold text when tput is supported
if tput setaf 0 &>/dev/null; then
ALL_OFF="$(tput sgr0)"
BOLD="$(tput bold)"
BLUE="${BOLD}$(tput setaf 4)"
GREEN="${BOLD}$(tput setaf 2)"
RED="${BOLD}$(tput setaf 1)"
YELLOW="${BOLD}$(tput setaf 3)"
else
ALL_OFF="\e[1;0m"
BOLD="\e[1;1m"
BLUE="${BOLD}\e[1;34m"
GREEN="${BOLD}\e[1;32m"
RED="${BOLD}\e[1;31m"
YELLOW="${BOLD}\e[1;33m"
fi
fi
readonly ALL_OFF BOLD BLUE GREEN RED YELLOW
if (( $# > 0 )); then
echo "${myname} v${myver}"
echo
echo "Safely print a list of pending updates"
echo
echo "Usage: ${myname}"
echo
echo 'Note: Export the "CHECKUPDATES_DB" variable to change the path of the temporary database.'
exit 0
fi
if ! type -P fakeroot >/dev/null; then
error 'Cannot find the fakeroot binary.'
exit 1
fi
if [[ -z $CHECKUPDATES_DB ]]; then
CHECKUPDATES_DB="${TMPDIR:-/tmp}/checkup-db-${USER}/"
fi
trap 'rm -f $CHECKUPDATES_DB/db.lck' INT TERM EXIT
DBPath="$(pacman-conf DBPath)"
if [[ -z "$DBPath" ]] || [[ ! -d "$DBPath" ]]; then
DBPath="/var/lib/pacman/"
fi
mkdir -p "$CHECKUPDATES_DB"
ln -s "${DBPath}/local" "$CHECKUPDATES_DB" &> /dev/null
if ! fakeroot -- pacman -Sy --dbpath "$CHECKUPDATES_DB" --logfile /dev/null &> /dev/null; then
error 'Cannot fetch updates'
exit 1
fi
pacman -Qu --dbpath "$CHECKUPDATES_DB" 2> /dev/null | grep -v '\[.*\]'
exit 0
# vim: set noet:

View File

@ -0,0 +1,55 @@
#!/usr/bin/env bash
SDIR="$HOME/.config/polybar/my_theme/scripts"
# Launch Rofi
MENU="$(rofi -no-config -no-lazy-grab -sep "|" -dmenu -i -p '' \
-theme $SDIR/rofi/styles.rasi \
<<< "♥ amber|♥ blue|♥ blue-gray|♥ brown|♥ cyan|♥ deep-orange|\
♥ deep-purple|♥ green|♥ gray|♥ indigo|♥ blue-light|♥ green-light|\
♥ lime|♥ orange|♥ pink|♥ purple|♥ red|♥ teal|♥ yellow|♥ amber-dark|\
♥ blue-dark|♥ blue-gray-dark|♥ brown-dark|♥ cyan-dark|♥ deep-orange-dark|\
♥ deep-purple-dark|♥ green-dark|♥ gray-dark|♥ indigo-dark|♥ blue-light-dark|\
♥ green-light-dark|♥ lime-dark|♥ orange-dark|♥ pink-dark|♥ purple-dark|♥ red-dark|♥ teal-dark|♥ yellow-dark|")"
case "$MENU" in
## Light Colors
*amber) "$SDIR"/colors-light.sh --amber ;;
*blue) "$SDIR"/colors-light.sh --blue ;;
*blue-gray) "$SDIR"/colors-light.sh --blue-gray ;;
*brown) "$SDIR"/colors-light.sh --brown ;;
*cyan) "$SDIR"/colors-light.sh --cyan ;;
*deep-orange) "$SDIR"/colors-light.sh --deep-orange ;;
*deep-purple) "$SDIR"/colors-light.sh --deep-purple ;;
*green) "$SDIR"/colors-light.sh --green ;;
*gray) "$SDIR"/colors-light.sh --gray ;;
*indigo) "$SDIR"/colors-light.sh --indigo ;;
*blue-light) "$SDIR"/colors-light.sh --light-blue ;;
*green-light) "$SDIR"/colors-light.sh --light-green ;;
*lime) "$SDIR"/colors-light.sh --lime ;;
*orange) "$SDIR"/colors-light.sh --orange ;;
*pink) "$SDIR"/colors-light.sh --pink ;;
*purple) "$SDIR"/colors-light.sh --purple ;;
*red) "$SDIR"/colors-light.sh --red ;;
*teal) "$SDIR"/colors-light.sh --teal ;;
*yellow) "$SDIR"/colors-light.sh --yellow ;;
## Dark Colors
*amber-dark) "$SDIR"/colors-dark.sh --amber ;;
*blue-dark) "$SDIR"/colors-dark.sh --blue ;;
*blue-gray-dark) "$SDIR"/colors-dark.sh --blue-gray ;;
*brown-dark) "$SDIR"/colors-dark.sh --brown ;;
*cyan-dark) "$SDIR"/colors-dark.sh --cyan ;;
*deep-orange-dark) "$SDIR"/colors-dark.sh --deep-orange ;;
*deep-purple-dark) "$SDIR"/colors-dark.sh --deep-purple ;;
*green-dark) "$SDIR"/colors-dark.sh --green ;;
*gray-dark) "$SDIR"/colors-dark.sh --gray ;;
*indigo-dark) "$SDIR"/colors-dark.sh --indigo ;;
*blue-light-dark) "$SDIR"/colors-dark.sh --light-blue ;;
*green-light-dark) "$SDIR"/colors-dark.sh --light-green ;;
*lime-dark) "$SDIR"/colors-dark.sh --lime ;;
*orange-dark) "$SDIR"/colors-dark.sh --orange ;;
*pink-dark) "$SDIR"/colors-dark.sh --pink ;;
*purple-dark) "$SDIR"/colors-dark.sh --purple ;;
*red-dark) "$SDIR"/colors-dark.sh --red ;;
*teal-dark) "$SDIR"/colors-dark.sh --teal ;;
*yellow-dark) "$SDIR"/colors-dark.sh --yellow
esac

124
my_theme/scripts/colors-dark.sh Executable file
View File

@ -0,0 +1,124 @@
#!/usr/bin/env bash
# Color files
PFILE="$HOME/.config/polybar/my_theme/colors.ini"
RFILE="$HOME/.config/polybar/my_theme/scripts/rofi/colors.rasi"
# Change colors
change_color() {
# polybar
sed -i -e 's/background = #.*/background = #1F1F1F/g' $PFILE
sed -i -e 's/foreground = #.*/foreground = #FFFFFF/g' $PFILE
sed -i -e 's/foreground-alt = #.*/foreground-alt = #FFFFFF/g' $PFILE
sed -i -e "s/shade1 = #.*/shade1 = $SH1/g" $PFILE
sed -i -e "s/shade2 = #.*/shade2 = $SH2/g" $PFILE
sed -i -e "s/shade3 = #.*/shade3 = $SH3/g" $PFILE
sed -i -e "s/shade4 = #.*/shade4 = $SH4/g" $PFILE
sed -i -e "s/shade5 = #.*/shade5 = $SH5/g" $PFILE
sed -i -e "s/shade6 = #.*/shade6 = $SH6/g" $PFILE
sed -i -e "s/shade7 = #.*/shade7 = $SH7/g" $PFILE
sed -i -e "s/shade8 = #.*/shade8 = $SH8/g" $PFILE
# rofi
cat > $RFILE <<- EOF
/* colors */
* {
al: #00000000;
bg: #1F1F1FFF;
bg1: ${SH2}FF;
bg2: ${SH3}FF;
bg3: ${SH4}FF;
fg: #FFFFFFFF;
}
EOF
polybar-msg cmd restart
}
if [[ $1 = "--amber" ]]; then
SH1="#FF6F00" SH2="#FF8F00" SH3="#FFA000" SH4="#FFB300"
SH5="#FFC107" SH6="#FFCA28" SH7="#FFD54F" SH8="#FFE082"
change_color
elif [[ $1 = "--blue" ]]; then
SH1="#0D47A1" SH2="#1565C0" SH3="#1976D2" SH4="#1E88E5"
SH5="#2196F3" SH6="#42A5F5" SH7="#64B5F6" SH8="#90CAF9"
change_color
elif [[ $1 = "--blue-gray" ]]; then
SH1="#263238" SH2="#37474F" SH3="#455A64" SH4="#546E7A"
SH5="#607D8B" SH6="#78909C" SH7="#90A4AE" SH8="#B0BEC5"
change_color
elif [[ $1 = "--brown" ]]; then
SH1="#3E2723" SH2="#4E342E" SH3="#5D4037" SH4="#6D4C41"
SH5="#795548" SH6="#8D6E63" SH7="#A1887F" SH8="#BCAAA4"
change_color
elif [[ $1 = "--cyan" ]]; then
SH1="#006064" SH2="#00838F" SH3="#0097A7" SH4="#00ACC1"
SH5="#00BCD4" SH6="#26C6DA" SH7="#4DD0E1" SH8="#80DEEA"
change_color
elif [[ $1 = "--deep-orange" ]]; then
SH1="#BF360C" SH2="#D84315" SH3="#E64A19" SH4="#F4511E"
SH5="#FF5722" SH6="#FF7043" SH7="#FF8A65" SH8="#FFAB91"
change_color
elif [[ $1 = "--deep-purple" ]]; then
SH1="#311B92" SH2="#4527A0" SH3="#512DA8" SH4="#5E35B1"
SH5="#673AB7" SH6="#7E57C2" SH7="#9575CD" SH8="#B39DDB"
change_color
elif [[ $1 = "--green" ]]; then
SH1="#1B5E20" SH2="#2E7D32" SH3="#388E3C" SH4="#43A047"
SH5="#4CAF50" SH6="#66BB6A" SH7="#81C784" SH8="#A5D6A7"
change_color
elif [[ $1 = "--gray" ]]; then
SH1="#212121" SH2="#424242" SH3="#616161" SH4="#757575"
SH5="#9E9E9E" SH6="#BDBDBD" SH7="#D4D4D4" SH8="#EEEEEE"
change_color
elif [[ $1 = "--indigo" ]]; then
SH1="#1A237E" SH2="#283593" SH3="#303F9F" SH4="#3949AB"
SH5="#3F51B5" SH6="#5C6BC0" SH7="#7986CB" SH8="#9FA8DA"
change_color
elif [[ $1 = "--light-blue" ]]; then
SH1="#01579B" SH2="#0277BD" SH3="#0288D1" SH4="#039BE5"
SH5="#03A9F4" SH6="#29B6F6" SH7="#4FC3F7" SH8="#81D4FA"
change_color
elif [[ $1 = "--light-green" ]]; then
SH1="#33691E" SH2="#558B2F" SH3="#689F38" SH4="#7CB342"
SH5="#8BC34A" SH6="#9CCC65" SH7="#AED581" SH8="#C5E1A5"
change_color
elif [[ $1 = "--lime" ]]; then
SH1="#827717" SH2="#9E9D24" SH3="#AFB42B" SH4="#C0CA33"
SH5="#CDDC39" SH6="#D4E157" SH7="#DCE775" SH8="#E6EE9C"
change_color
elif [[ $1 = "--orange" ]]; then
SH1="#E65100" SH2="#EF6C00" SH3="#F57C00" SH4="#FB8C00"
SH5="#FF9800" SH6="#FFA726" SH7="#FFB74D" SH8="#FFCC80"
change_color
elif [[ $1 = "--pink" ]]; then
SH1="#880E4F" SH2="#AD1457" SH3="#C2185B" SH4="#D81B60"
SH5="#E91E63" SH6="#EC407A" SH7="#F06292" SH8="#F48FB1"
change_color
elif [[ $1 = "--purple" ]]; then
SH1="#4A148C" SH2="#6A1B9A" SH3="#7B1FA2" SH4="#8E24AA"
SH5="#9C27B0" SH6="#AB47BC" SH7="#BA68C8" SH8="#CE93D8"
change_color
elif [[ $1 = "--red" ]]; then
SH1="#B71C1C" SH2="#C62828" SH3="#D32F2F" SH4="#E53935"
SH5="#EE413D" SH6="#EF5350" SH7="#E57373" SH8="#EF9A9A"
change_color
elif [[ $1 = "--teal" ]]; then
SH1="#004D40" SH2="#00695C" SH3="#00796B" SH4="#00897B"
SH5="#009688" SH6="#26A69A" SH7="#4DB6AC" SH8="#80CBC4"
change_color
elif [[ $1 = "--yellow" ]]; then
SH1="#F57F17" SH2="#F9A825" SH3="#FBC02D" SH4="#FDD835"
SH5="#FFEB3B" SH6="#FFEE58" SH7="#FFF176" SH8="#FFF59D"
change_color
else
cat <<- _EOF_
No option specified, Available options:
--amber --blue --blue-gray --brown
--cyan --deep-orange --deep-purple --green
--gray --indigo --light-blue --light-green
--lime --orange --pink --purple
--red --teal --yellow
_EOF_
fi

125
my_theme/scripts/colors-light.sh Executable file
View File

@ -0,0 +1,125 @@
#!/usr/bin/env bash
# Color files
PFILE="$HOME/.config/polybar/my_theme/colors.ini"
RFILE="$HOME/.config/polybar/my_theme/scripts/rofi/colors.rasi"
# Change colors
change_color() {
# polybar
sed -i -e 's/background = #.*/background = #FFFFFF/g' $PFILE
sed -i -e 's/foreground = #.*/foreground = #FFFFFF/g' $PFILE
sed -i -e 's/foreground-alt = #.*/foreground-alt = #1F1F1F/g' $PFILE
sed -i -e "s/shade1 = #.*/shade1 = $SH1/g" $PFILE
sed -i -e "s/shade2 = #.*/shade2 = $SH2/g" $PFILE
sed -i -e "s/shade3 = #.*/shade3 = $SH3/g" $PFILE
sed -i -e "s/shade4 = #.*/shade4 = $SH4/g" $PFILE
sed -i -e "s/shade5 = #.*/shade5 = $SH5/g" $PFILE
sed -i -e "s/shade6 = #.*/shade6 = $SH6/g" $PFILE
sed -i -e "s/shade7 = #.*/shade7 = $SH7/g" $PFILE
sed -i -e "s/shade8 = #.*/shade8 = $SH8/g" $PFILE
# rofi
cat > $RFILE <<- EOF
/* colors */
* {
al: #00000000;
bg: #FFFFFFFF;
bg1: ${SH2}FF;
bg2: ${SH3}FF;
bg3: ${SH4}FF;
bg4: ${SH5}FF;
fg: #2E2E2EFF;
}
EOF
polybar-msg cmd restart
}
if [[ $1 = "--amber" ]]; then
SH1="#FF6F00" SH2="#FF8F00" SH3="#FFA000" SH4="#FFB300"
SH5="#FFC107" SH6="#FFCA28" SH7="#FFD54F" SH8="#FFE082"
change_color
elif [[ $1 = "--blue" ]]; then
SH1="#0D47A1" SH2="#1565C0" SH3="#1976D2" SH4="#1E88E5"
SH5="#2196F3" SH6="#42A5F5" SH7="#64B5F6" SH8="#90CAF9"
change_color
elif [[ $1 = "--blue-gray" ]]; then
SH1="#263238" SH2="#37474F" SH3="#455A64" SH4="#546E7A"
SH5="#607D8B" SH6="#78909C" SH7="#90A4AE" SH8="#B0BEC5"
change_color
elif [[ $1 = "--brown" ]]; then
SH1="#3E2723" SH2="#4E342E" SH3="#5D4037" SH4="#6D4C41"
SH5="#795548" SH6="#8D6E63" SH7="#A1887F" SH8="#BCAAA4"
change_color
elif [[ $1 = "--cyan" ]]; then
SH1="#006064" SH2="#00838F" SH3="#0097A7" SH4="#00ACC1"
SH5="#00BCD4" SH6="#26C6DA" SH7="#4DD0E1" SH8="#80DEEA"
change_color
elif [[ $1 = "--deep-orange" ]]; then
SH1="#BF360C" SH2="#D84315" SH3="#E64A19" SH4="#F4511E"
SH5="#FF5722" SH6="#FF7043" SH7="#FF8A65" SH8="#FFAB91"
change_color
elif [[ $1 = "--deep-purple" ]]; then
SH1="#311B92" SH2="#4527A0" SH3="#512DA8" SH4="#5E35B1"
SH5="#673AB7" SH6="#7E57C2" SH7="#9575CD" SH8="#B39DDB"
change_color
elif [[ $1 = "--green" ]]; then
SH1="#1B5E20" SH2="#2E7D32" SH3="#388E3C" SH4="#43A047"
SH5="#4CAF50" SH6="#66BB6A" SH7="#81C784" SH8="#A5D6A7"
change_color
elif [[ $1 = "--gray" ]]; then
SH1="#212121" SH2="#424242" SH3="#616161" SH4="#757575"
SH5="#9E9E9E" SH6="#BDBDBD" SH7="#D4D4D4" SH8="#EEEEEE"
change_color
elif [[ $1 = "--indigo" ]]; then
SH1="#1A237E" SH2="#283593" SH3="#303F9F" SH4="#3949AB"
SH5="#3F51B5" SH6="#5C6BC0" SH7="#7986CB" SH8="#9FA8DA"
change_color
elif [[ $1 = "--light-blue" ]]; then
SH1="#01579B" SH2="#0277BD" SH3="#0288D1" SH4="#039BE5"
SH5="#03A9F4" SH6="#29B6F6" SH7="#4FC3F7" SH8="#81D4FA"
change_color
elif [[ $1 = "--light-green" ]]; then
SH1="#33691E" SH2="#558B2F" SH3="#689F38" SH4="#7CB342"
SH5="#8BC34A" SH6="#9CCC65" SH7="#AED581" SH8="#C5E1A5"
change_color
elif [[ $1 = "--lime" ]]; then
SH1="#827717" SH2="#9E9D24" SH3="#AFB42B" SH4="#C0CA33"
SH5="#CDDC39" SH6="#D4E157" SH7="#DCE775" SH8="#E6EE9C"
change_color
elif [[ $1 = "--orange" ]]; then
SH1="#E65100" SH2="#EF6C00" SH3="#F57C00" SH4="#FB8C00"
SH5="#FF9800" SH6="#FFA726" SH7="#FFB74D" SH8="#FFCC80"
change_color
elif [[ $1 = "--pink" ]]; then
SH1="#880E4F" SH2="#AD1457" SH3="#C2185B" SH4="#D81B60"
SH5="#E91E63" SH6="#EC407A" SH7="#F06292" SH8="#F48FB1"
change_color
elif [[ $1 = "--purple" ]]; then
SH1="#4A148C" SH2="#6A1B9A" SH3="#7B1FA2" SH4="#8E24AA"
SH5="#9C27B0" SH6="#AB47BC" SH7="#BA68C8" SH8="#CE93D8"
change_color
elif [[ $1 = "--red" ]]; then
SH1="#B71C1C" SH2="#C62828" SH3="#D32F2F" SH4="#E53935"
SH5="#EE413D" SH6="#EF5350" SH7="#E57373" SH8="#EF9A9A"
change_color
elif [[ $1 = "--teal" ]]; then
SH1="#004D40" SH2="#00695C" SH3="#00796B" SH4="#00897B"
SH5="#009688" SH6="#26A69A" SH7="#4DB6AC" SH8="#80CBC4"
change_color
elif [[ $1 = "--yellow" ]]; then
SH1="#F57F17" SH2="#F9A825" SH3="#FBC02D" SH4="#FDD835"
SH5="#FFEB3B" SH6="#FFEE58" SH7="#FFF176" SH8="#FFF59D"
change_color
else
cat <<- _EOF_
No option specified, Available options:
--amber --blue --blue-gray --brown
--cyan --deep-orange --deep-purple --green
--gray --indigo --light-blue --light-green
--lime --orange --pink --purple
--red --teal --yellow
_EOF_
fi

3
my_theme/scripts/launcher.sh Executable file
View File

@ -0,0 +1,3 @@
#!/usr/bin/env bash
rofi -no-config -no-lazy-grab -show drun -modi drun -theme ~/.config/polybar/my_theme/scripts/rofi/launcher.rasi

95
my_theme/scripts/powermenu.sh Executable file
View File

@ -0,0 +1,95 @@
#!/usr/bin/env bash
## Author : Aditya Shakya
## Mail : adi1090x@gmail.com
## Github : @adi1090x
## Twitter : @adi1090x
dir="~/.config/polybar/my_theme/scripts/rofi"
uptime=$(uptime -p | sed -e 's/up //g')
rofi_command="rofi -no-config -theme $dir/powermenu.rasi"
# Options
shutdown=" Shutdown"
reboot=" Restart"
lock=" Lock"
suspend=" Sleep"
logout=" Logout"
# Confirmation
confirm_exit() {
rofi -dmenu\
-no-config\
-i\
-no-fixed-num-lines\
-p "Are You Sure? : "\
-theme $dir/confirm.rasi
}
# Message
msg() {
rofi -no-config -theme "$dir/message.rasi" -e "Available Options - yes / y / no / n"
}
# Variable passed to rofi
options="$lock\n$suspend\n$logout\n$reboot\n$shutdown"
chosen="$(echo -e "$options" | $rofi_command -p "Uptime: $uptime" -dmenu -selected-row 0)"
case $chosen in
$shutdown)
ans=$(confirm_exit &)
if [[ $ans == "yes" || $ans == "YES" || $ans == "y" || $ans == "Y" ]]; then
systemctl poweroff
elif [[ $ans == "no" || $ans == "NO" || $ans == "n" || $ans == "N" ]]; then
exit 0
else
msg
fi
;;
$reboot)
ans=$(confirm_exit &)
if [[ $ans == "yes" || $ans == "YES" || $ans == "y" || $ans == "Y" ]]; then
systemctl reboot
elif [[ $ans == "no" || $ans == "NO" || $ans == "n" || $ans == "N" ]]; then
exit 0
else
msg
fi
;;
$lock)
if [[ -f /usr/bin/i3lock ]]; then
i3lock
elif [[ -f /usr/bin/betterlockscreen ]]; then
betterlockscreen -l
fi
;;
$suspend)
ans=$(confirm_exit &)
if [[ $ans == "yes" || $ans == "YES" || $ans == "y" || $ans == "Y" ]]; then
mpc -q pause
amixer set Master mute
systemctl suspend
elif [[ $ans == "no" || $ans == "NO" || $ans == "n" || $ans == "N" ]]; then
exit 0
else
msg
fi
;;
$logout)
ans=$(confirm_exit &)
if [[ $ans == "yes" || $ans == "YES" || $ans == "y" || $ans == "Y" ]]; then
if [[ "$DESKTOP_SESSION" == "Openbox" ]]; then
openbox --exit
elif [[ "$DESKTOP_SESSION" == "bspwm" ]]; then
bspc quit
elif [[ "$DESKTOP_SESSION" == "i3" ]]; then
i3-msg exit
fi
elif [[ $ans == "no" || $ans == "NO" || $ans == "n" || $ans == "N" ]]; then
exit 0
else
msg
fi
;;
esac

77
my_theme/scripts/pywal.sh Executable file
View File

@ -0,0 +1,77 @@
#!/usr/bin/env bash
# Color files
PFILE="$HOME/.config/polybar/my_theme/colors.ini"
RFILE="$HOME/.config/polybar/my_theme/scripts/rofi/colors.rasi"
WFILE="$HOME/.cache/wal/colors.sh"
# Get colors
pywal_get() {
wal -i "$1" -q -t
}
# Change colors
change_color() {
# polybar
sed -i -e "s/background = #.*/background = $BG/g" $PFILE
sed -i -e "s/foreground = #.*/foreground = $FG/g" $PFILE
sed -i -e "s/foreground-alt = #.*/foreground-alt = $FGA/g" $PFILE
sed -i -e "s/shade1 = #.*/shade1 = $SH1/g" $PFILE
sed -i -e "s/shade2 = #.*/shade2 = $SH2/g" $PFILE
sed -i -e "s/shade3 = #.*/shade3 = $SH3/g" $PFILE
sed -i -e "s/shade4 = #.*/shade4 = $SH4/g" $PFILE
sed -i -e "s/shade5 = #.*/shade5 = $SH5/g" $PFILE
sed -i -e "s/shade6 = #.*/shade6 = $SH6/g" $PFILE
sed -i -e "s/shade7 = #.*/shade7 = $SH7/g" $PFILE
sed -i -e "s/shade8 = #.*/shade8 = $SH8/g" $PFILE
# rofi
cat > $RFILE <<- EOF
/* colors */
* {
al: #00000000;
bg: ${BG}FF;
bg1: ${SH2}FF;
bg2: ${SH3}FF;
bg3: ${SH4}FF;
fg: ${FG}FF;
}
EOF
polybar-msg cmd restart
}
# Main
if [[ -x "`which wal`" ]]; then
if [[ "$1" ]]; then
pywal_get "$1"
# Source the pywal color file
if [[ -e "$WFILE" ]]; then
. "$WFILE"
else
echo 'Color file does not exist, exiting...'
exit 1
fi
BG=`printf "%s\n" "$background"`
FG=`printf "%s\n" "$foreground"`
FGA=`printf "%s\n" "$foreground"`
SH1=`printf "%s\n" "$color1"`
SH2=`printf "%s\n" "$color2"`
SH3=`printf "%s\n" "$color1"`
SH4=`printf "%s\n" "$color2"`
SH5=`printf "%s\n" "$color1"`
SH6=`printf "%s\n" "$color2"`
SH7=`printf "%s\n" "$color1"`
SH8=`printf "%s\n" "$color7"`
change_color
else
echo -e "[!] Please enter the path to wallpaper. \n"
echo "Usage : ./pywal.sh path/to/image"
fi
else
echo "[!] 'pywal' is not installed."
fi

84
my_theme/scripts/random.sh Executable file
View File

@ -0,0 +1,84 @@
#!/usr/bin/env bash
# Color files
PFILE="$HOME/.config/polybar/my_theme/colors.ini"
RFILE="$HOME/.config/polybar/my_theme/scripts/rofi/colors.rasi"
# Change colors
change_color() {
# polybar
sed -i -e "s/background = #.*/background = $BG/g" $PFILE
sed -i -e "s/foreground = #.*/foreground = $FG/g" $PFILE
sed -i -e "s/foreground-alt = #.*/foreground-alt = $FGA/g" $PFILE
sed -i -e "s/shade1 = #.*/shade1 = $SH1/g" $PFILE
sed -i -e "s/shade2 = #.*/shade2 = $SH2/g" $PFILE
sed -i -e "s/shade3 = #.*/shade3 = $SH3/g" $PFILE
sed -i -e "s/shade4 = #.*/shade4 = $SH4/g" $PFILE
sed -i -e "s/shade5 = #.*/shade5 = $SH5/g" $PFILE
sed -i -e "s/shade6 = #.*/shade6 = $SH6/g" $PFILE
sed -i -e "s/shade7 = #.*/shade7 = $SH7/g" $PFILE
sed -i -e "s/shade8 = #.*/shade8 = $SH8/g" $PFILE
# rofi
cat > $RFILE <<- EOF
/* colors */
* {
al: #00000000;
bg: ${BG}FF;
bg1: ${SH2}FF;
bg2: ${SH3}FF;
bg3: ${SH4}FF;
fg: ${FG}FF;
}
EOF
polybar-msg cmd restart
}
get_random_number() {
RNUM=$(( ($RANDOM % $1) + 1 ))
}
get_random_color() {
RCOLOR="#"
for i in 1 2 3 4 5 6
do
get_random_number "16"
case $RNUM in
"1") NEXTDIGIT="1";;
"2") NEXTDIGIT="2";;
"3") NEXTDIGIT="3";;
"4") NEXTDIGIT="4";;
"5") NEXTDIGIT="5";;
"6") NEXTDIGIT="6";;
"7") NEXTDIGIT="7";;
"8") NEXTDIGIT="8";;
"9") NEXTDIGIT="9";;
"10") NEXTDIGIT="A";;
"11") NEXTDIGIT="B";;
"12") NEXTDIGIT="C";;
"13") NEXTDIGIT="D";;
"14") NEXTDIGIT="E";;
"15") NEXTDIGIT="F";;
"16") NEXTDIGIT="0";;
esac
RCOLOR="$RCOLOR$NEXTDIGIT"
done
echo $RCOLOR
}
# Main
BG='#1f1f1f' # change to light bg
FG='#FFFFFF' # change to dark fg
FGA='#FFFFFF' # change to gray fg
SH1=`get_random_color`
SH2=`get_random_color`
SH3=`get_random_color`
SH4=`get_random_color`
SH5=`get_random_color`
SH6=`get_random_color`
SH7=`get_random_color`
SH8=`get_random_color`
change_color

View File

@ -0,0 +1,12 @@
/* colors */
* {
al: #00000000;
ac: #00000000;
bg: #1F1F1FFF;
bg1: #1565C0FF;
bg2: #1976D2FF;
bg3: #1E88E5FF;
bg4: #1E88E5FF;
fg: #FFFFFFFF;
}

View File

@ -0,0 +1,24 @@
/* Confirm Dialog */
@import "colors.rasi"
* {
background-color: @bg;
text-color: @fg;
font: "Iosevka Nerd Font 12";
}
window {
width: 225px;
padding: 25px;
border: 0px;
border-radius: 12px;
border-color: @bg1;
location: center;
y-offset: -2em;
}
entry {
expand: true;
text-color: @bg2;
}

View File

@ -0,0 +1,119 @@
/*
*
* Author : Aditya Shakya
* Mail : adi1090x@gmail.com
* Github : @adi1090x
* Twitter : @adi1090x
*
*/
configuration {
font: "Iosevka Nerd Font 12";
show-icons: true;
icon-theme: "Papirus";
display-drun: "";
drun-display-format: "{name}";
disable-history: false;
fullscreen: false;
hide-scrollbar: true;
sidebar-mode: false;
}
@import "colors.rasi"
window {
transparency: "real";
background-color: @bg;
text-color: @fg;
border: 0px;
border-color: @ac;
border-radius: 12px;
width: 350px;
location: center;
x-offset: 0;
y-offset: 0;
}
prompt {
enabled: true;
padding: 9px 15px 10px 15px;
background-color: @bg1;
text-color: #FFFFFF;
font: "Iosevka Nerd Font 12";
}
entry {
background-color: @bg2;
text-color: #FFFFFF;
placeholder-color: #FFFFFF;
expand: true;
horizontal-align: 0;
placeholder: "Search...";
padding: 10px;
border-radius: 0px 12px 12px 0px;
blink: true;
}
inputbar {
children: [ prompt, entry ];
background-color: @bg2;
text-color: #FFFFFF;
expand: false;
border: 0px;
border-radius: 12px;
border-color: @ac;
spacing: 0px;
}
listview {
background-color: @al;
padding: 10px 10px 10px 10px;
columns: 1;
lines: 10;
spacing: 5px;
cycle: true;
dynamic: true;
layout: vertical;
}
mainbox {
background-color: @al;
border: 0px;
border-radius: 0px;
border-color: @bg4;
children: [ inputbar, listview ];
spacing: 0px;
padding: 0px;
}
element {
background-color: @al;
text-color: @fg;
orientation: horizontal;
border-radius: 0px;
padding: 6px;
}
element-icon {
background-color: transparent;
text-color: inherit;
size: 24px;
border: 0px;
}
element-text {
background-color: transparent;
text-color: inherit;
expand: true;
horizontal-align: 0;
vertical-align: 0.5;
margin: 0px 2.5px 0px 2.5px;
}
element selected {
background-color: @bg3;
text-color: @bg;
border: 0px 0px 0px 0px;
border-radius: 12px;
border-color: @bg1;
}

View File

@ -0,0 +1,24 @@
/* Confirm Dialog */
@import "colors.rasi"
* {
background-color: @bg;
text-color: @fg;
font: "Iosevka Nerd Font 12";
}
window {
width: 320px;
padding: 25px;
border: 0px;
border-radius: 12px;
border-color: @bg1;
location: center;
y-offset: -2em;
}
entry {
expand: true;
text-color: @bg2;
}

View File

@ -0,0 +1,128 @@
/*
*
* Author : Aditya Shakya
* Mail : adi1090x@gmail.com
* Github : @adi1090x
* Twitter : @adi1090x
*
*/
configuration {
font: "Iosevka Nerd Font 12";
show-icons: true;
icon-theme: "Papirus";
display-drun: "";
drun-display-format: "{name}";
disable-history: false;
fullscreen: false;
hide-scrollbar: true;
sidebar-mode: false;
}
@import "colors.rasi"
window {
transparency: "real";
background-color: @bg;
text-color: @fg;
border: 0px;
border-color: @ac;
border-radius: 12px;
width: 400px;
location: center;
x-offset: 0;
y-offset: 0;
}
prompt {
enabled: true;
padding: 10px 15px 10px 15px;
background-color: @bg2;
text-color: #FFFFFF;
font: "Iosevka Nerd Font 12";
}
textbox-prompt-colon {
padding: 8px 15px 10px 15px;
font: "Iosevka Nerd Font 12";
background-color: @bg1;
text-color: #FFFFFF;
expand: false;
str: "󰤨";
}
entry {
background-color: @bg2;
text-color: #FFFFFF;
placeholder-color: #FFFFFF;
expand: true;
horizontal-align: 0;
placeholder: "Search...";
padding: 10px;
border-radius: 0px 12px 12px 0px;
blink: true;
}
inputbar {
children: [ textbox-prompt-colon, prompt ];
background-color: @bg2;
text-color: #FFFFFF;
expand: false;
border: 0px;
border-radius: 12px;
border-color: @ac;
spacing: 0px;
}
listview {
background-color: @al;
padding: 10px 10px 10px 10px;
columns: 1;
lines: 8;
spacing: 5px;
cycle: true;
dynamic: true;
layout: vertical;
}
mainbox {
background-color: @al;
border: 0px;
border-radius: 0px;
border-color: @bg4;
children: [ inputbar, listview ];
spacing: 0px;
padding: 0px;
}
element {
background-color: @al;
text-color: @fg;
orientation: horizontal;
border-radius: 0px;
padding: 6px 6px 6px -5px;
}
element-icon {
background-color: transparent;
text-color: inherit;
size: 24px;
border: 0px;
}
element-text {
background-color: transparent;
text-color: inherit;
expand: true;
horizontal-align: 0;
vertical-align: 0.5;
margin: 0px 2.5px 0px 2.5px;
}
element selected {
background-color: @bg3;
text-color: @bg;
border: 0px 0px 0px 0px;
border-radius: 12px;
border-color: @bg1;
}

View File

@ -0,0 +1,128 @@
/*
*
* Author : Aditya Shakya
* Mail : adi1090x@gmail.com
* Github : @adi1090x
* Twitter : @adi1090x
*
*/
configuration {
font: "Iosevka Nerd Font 12";
show-icons: true;
icon-theme: "Papirus";
display-drun: "";
drun-display-format: "{name}";
disable-history: false;
fullscreen: false;
hide-scrollbar: true;
sidebar-mode: false;
}
@import "colors.rasi"
window {
transparency: "real";
background-color: @bg;
text-color: @fg;
border: 0px;
border-color: @ac;
border-radius: 12px;
width: 300px;
location: center;
x-offset: 0;
y-offset: 0;
}
prompt {
enabled: true;
padding: 10px 15px 10px 15px;
background-color: @bg2;
text-color: #FFFFFF;
font: "Iosevka Nerd Font 12";
}
textbox-prompt-colon {
padding: 8px 15px 10px 15px;
font: "Iosevka Nerd Font 12";
background-color: @bg1;
text-color: #FFFFFF;
expand: false;
str: "󰥔";
}
entry {
background-color: @bg2;
text-color: #FFFFFF;
placeholder-color: #FFFFFF;
expand: true;
horizontal-align: 0;
placeholder: "Search...";
padding: 10px;
border-radius: 0px 12px 12px 0px;
blink: true;
}
inputbar {
children: [ textbox-prompt-colon, prompt ];
background-color: @bg2;
text-color: #FFFFFF;
expand: false;
border: 0px;
border-radius: 12px;
border-color: @ac;
spacing: 0px;
}
listview {
background-color: @al;
padding: 10px 10px 10px 10px;
columns: 1;
lines: 5;
spacing: 5px;
cycle: true;
dynamic: true;
layout: vertical;
}
mainbox {
background-color: @al;
border: 0px;
border-radius: 0px;
border-color: @bg4;
children: [ inputbar, listview ];
spacing: 0px;
padding: 0px;
}
element {
background-color: @al;
text-color: @fg;
orientation: horizontal;
border-radius: 0px;
padding: 6px 6px 6px -20px;
}
element-icon {
background-color: transparent;
text-color: inherit;
size: 24px;
border: 0px;
}
element-text {
background-color: transparent;
text-color: inherit;
expand: true;
horizontal-align: 0;
vertical-align: 0.5;
margin: 0px 2.5px 0px 2.5px;
}
element selected {
background-color: @bg3;
text-color: @bg;
border: 0px 0px 0px 0px;
border-radius: 12px;
border-color: @bg1;
}

View File

@ -0,0 +1,119 @@
/*
*
* Author : Aditya Shakya
* Mail : adi1090x@gmail.com
* Github : @adi1090x
* Twitter : @adi1090x
*
*/
configuration {
font: "Iosevka Nerd Font 12";
show-icons: true;
icon-theme: "Papirus";
display-drun: "";
drun-display-format: "{name}";
disable-history: false;
fullscreen: false;
hide-scrollbar: true;
sidebar-mode: false;
}
@import "colors.rasi"
window {
transparency: "real";
background-color: @bg;
text-color: @fg;
border: 0px;
border-color: @ac;
border-radius: 12px;
width: 300px;
location: center;
x-offset: 0;
y-offset: 0;
}
prompt {
enabled: true;
padding: 8px 15px 10px 15px;
background-color: @bg1;
text-color: #FFFFFF;
font: "Iosevka Nerd Font 12";
}
entry {
background-color: @bg2;
text-color: #FFFFFF;
placeholder-color: #FFFFFF;
expand: true;
horizontal-align: 0;
placeholder: "find...";
padding: 10px;
border-radius: 0px 12px 12px 0px;
blink: true;
}
inputbar {
children: [ prompt, entry ];
background-color: @bg2;
text-color: #FFFFFF;
expand: false;
border: 0px;
border-radius: 12px;
border-color: @ac;
spacing: 0px;
}
listview {
background-color: @al;
padding: 10px 10px 10px 10px;
columns: 1;
lines: 6;
spacing: 5px;
cycle: true;
dynamic: true;
layout: vertical;
}
mainbox {
background-color: @al;
border: 0px;
border-radius: 0px;
border-color: @bg4;
children: [ inputbar, listview ];
spacing: 0px;
padding: 0px;
}
element {
background-color: @al;
text-color: @fg;
orientation: horizontal;
border-radius: 0px;
padding: 6px 6px 6px -20px;
}
element-icon {
background-color: transparent;
text-color: inherit;
size: 24px;
border: 0px;
}
element-text {
background-color: transparent;
text-color: inherit;
expand: true;
horizontal-align: 0;
vertical-align: 0.5;
margin: 0px 2.5px 0px 2.5px;
}
element selected {
background-color: @bg3;
text-color: @bg;
border: 0px 0px 0px 0px;
border-radius: 12px;
border-color: @bg1;
}

View File

@ -0,0 +1,32 @@
#!/usr/bin/env bash
FILE="$HOME/.config/polybar/my_theme/glyphs.ini"
# Replace Glyphs
change_style() {
sed -i -e "s/gleft = .*/gleft = $1/g" $FILE
sed -i -e "s/gright = .*/gright = $2/g" $FILE
polybar-msg cmd restart
}
# Launch Rofi
MENU="$(rofi -no-config -no-lazy-grab -sep "|" -dmenu -i -p '' \
-theme $HOME/.config/polybar/my_theme/scripts/rofi/styles.rasi \
<<< "♥ Style-1|♥ Style-2|♥ Style-3|♥ Style-4|♥ Style-5|♥ Style-6|♥ Style-7|♥ Style-8|♥ Style-9|♥ Style-10|♥ Style-11|♥ Style-12|")"
case "$MENU" in
## Light Colors
*Style-1) change_style   ;;
*Style-2) change_style   ;;
*Style-3) change_style   ;;
*Style-4) change_style   ;;
*Style-5) change_style   ;;
*Style-6) change_style   ;;
*Style-7) change_style   ;;
*Style-8) change_style   ;;
*Style-9) change_style   ;;
*Style-10) change_style   ;;
*Style-11) change_style   ;;
*Style-12) change_style   ;;
esac

45
my_theme/scripts/updates.sh Executable file
View File

@ -0,0 +1,45 @@
#!/usr/bin/env bash
NOTIFY_ICON=/usr/share/icons/Papirus/32x32/apps/system-software-update.svg
get_total_updates() { UPDATES=$(~/.config/polybar/my_theme/scripts/checkupdates 2>/dev/null | wc -l); }
while true; do
get_total_updates
# notify user of updates
if hash notify-send &>/dev/null; then
if (( UPDATES > 50 )); then
notify-send -u critical -i $NOTIFY_ICON \
"You really need to update!!" "$UPDATES New packages"
elif (( UPDATES > 25 )); then
notify-send -u normal -i $NOTIFY_ICON \
"You should update soon" "$UPDATES New packages"
elif (( UPDATES > 2 )); then
notify-send -u low -i $NOTIFY_ICON \
"$UPDATES New packages"
fi
fi
# when there are updates available
# every 10 seconds another check for updates is done
while (( UPDATES > 0 )); do
if (( UPDATES == 1 )); then
echo " $UPDATES"
elif (( UPDATES > 1 )); then
echo " $UPDATES"
else
echo " None"
fi
sleep 10
get_total_updates
done
# when no updates are available, use a longer loop, this saves on CPU
# and network uptime, only checking once every 30 min for new updates
while (( UPDATES == 0 )); do
echo " None"
sleep 1800
get_total_updates
done
done

252
my_theme/user_modules.ini Normal file
View File

@ -0,0 +1,252 @@
;; ┌──────────────────────────────────────────────────────────────────────────────-----┐
;; │░█▀█░█▀█░█░░░█░█░█▀▄░█▀█░█▀▄░░░░░░░░░█░█░█▀▀░█▀▀░█▀▄░░░█▄█░█▀█░█▀▄░█░█░█░░░█▀▀░█▀▀ │
;; │░█▀▀░█░█░█░░░░█░░█▀▄░█▀█░█▀▄░░░░▀░░░░█░█░▀▀█░█▀▀░█▀▄░░░█░█░█░█░█░█░█░█░█░░░█▀▀░▀▀█ │
;; │░▀░░░▀▀▀░▀▀▀░░▀░░▀▀░░▀░▀░▀░▀░░░░▀░░░░▀▀▀░▀▀▀░▀▀▀░▀░▀░░░▀░▀░▀▀▀░▀▀░░▀▀▀░▀▀▀░▀▀▀░▀▀▀ │
;; │░Created░By░Aditya░Shakya░@adi1090x░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░│
;; └──────────────────────────────────────────────────────────────────────────────-----┘
;; _-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_
[module/updates]
type = custom/script
; Available tokens:
; %counter%
; Command to be executed (using "/usr/bin/env sh -c [command]")
exec = ~/.config/polybar/my_theme/scripts/updates.sh
; Conditional command that, if defined, needs to exit successfully
; before the main exec command is invoked.
; Default: ""
;;exec-if = ""
; Will the script output continous content?
; Default: false
tail = true
; Seconds to sleep between updates
; Default: 2 (0 if `tail = true`)
interval = 5
; Available tags:
; <output> - deprecated
; <label> (default)
format = <label>
format-prefix =
format-background = ${color.shade6}
format-padding = 1
; Available tokens:
; %output%
; Default: %output%
label = "%output% "
; Available tokens:
; %counter%
; %pid%
;
; "click-(left|middle|right)" will be executed using "/usr/bin/env sh -c [command]"
click-left = exo-open --launch TerminalEmulator &
click-right = exo-open --launch TerminalEmulator &
;;double-click-left = echo double left %counter%
;;double-click-middle = echo double middle %counter%
;;double-click-right = echo double right %counter%
; Available tokens:
; %counter%
; %pid%
;
; "scroll-(up|down)" will be executed using "/usr/bin/env sh -c [command]"
;;scroll-up = echo scroll up %counter%
;;scroll-down = echo scroll down %counter%
;; _-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_
[module/launcher]
#type = custom/text
type = custom/text
#content = " "
content = ""
content-font=4
; "content" has the same properties as "format-NAME"
content-background = ${color.shade1}
content-foreground = ${color.foreground}
content-padding = 1
; "click-(left|middle|right)" will be executed using "/usr/bin/env sh -c $COMMAND"
click-left = ~/.config/polybar/my_theme/scripts/launcher.sh &
;;click-middle = ~/.config/polybar/my_theme/scripts/launcher-full
click-right = ~/.config/polybar/my_theme/scripts/color-switch.sh &
; "scroll-(up|down)" will be executed using "/usr/bin/env sh -c $COMMAND"
;;scroll-up = ~/.config/polybar/my_theme/scripts/launcher.sh &
;;scroll-down = ~/.config/polybar/my_theme/scripts/color-switch.sh &
;; _-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_
[module/sysmenu]
type = custom/text
;;content = " "
content = " "
content-font=4
content-background = ${color.shade1}
content-foreground = ${color.foreground}
content-padding = 1
click-left = ~/.config/polybar/my_theme/scripts/powermenu.sh &
;; _-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_
[module/color-switch]
type = custom/text
content = " "
content-background = ${color.shade7}
content-foreground = ${color.foreground}
content-padding = 1
click-left = ~/.config/polybar/my_theme/scripts/color-switch.sh &
click-right = ~/.config/polybar/my_theme/scripts/style-switch.sh &
;; _-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_
[module/sep]
type = custom/text
content = " | "
content-background = ${color.background}
content-foreground = ${color.shade1}
content-padding = 0
;; _-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_
[module/links]
type = custom/text
content-foreground = ${color.foreground-alt}
content-padding = 2
[module/google]
inherit = module/links
content =
click-left = exo-open https://www.google.com/ &
[module/github]
inherit = module/links
content =
click-left = exo-open https://www.github.com/ &
[module/reddit]
inherit = module/links
content =
click-left = exo-open https://www.reddit.com/ &
[module/gmail]
inherit = module/links
content =
click-left = exo-open https://mail.google.com/ &
[module/youtube]
inherit = module/links
content =
click-left = exo-open https://www.youtube.com/ &
;; _-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_
[module/powermenu]
type = custom/menu
; If true, <label-toggle> will be to the left of the menu items (default).
; If false, it will be on the right of all the items.
expand-right = true
; "menu-LEVEL-N" has the same properties as "label-NAME" with
; the additional "exec" property
;
; Available exec commands:
; menu-open-LEVEL
; menu-close
; Other commands will be executed using "/usr/bin/env sh -c $COMMAND"
menu-0-0 = reboot
menu-0-0-exec = menu-open-1
menu-0-1 = shutdown
menu-0-1-exec = menu-open-2
menu-1-0 = back
menu-1-0-exec = menu-open-0
menu-1-1 = reboot
menu-1-1-exec = systemctl reboot
menu-2-0 = shutdown
menu-2-0-exec = systemctl poweroff
menu-2-1 = back
menu-2-1-exec = menu-open-0
; Available tags:
; <label-toggle> (default) - gets replaced with <label-(open|close)>
; <menu> (default)
; Note that if you use <label-toggle> you must also include
; the definition for <label-open>
format = <label-toggle> <menu>
format-background = ${color.shade1}
format-foreground = ${color.foreground}
format-padding = 1
label-open = " "
label-close =
; Optional item separator
; Default: none
label-separator = " | "
;;label-open-foreground = ${color.foreground}
;;label-close-foreground = ${color.background}
;;label-separator-foreground = ${color.background}
;; _-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_
[module/menu]
type = custom/menu
; If true, <label-toggle> will be to the left of the menu items (default).
; If false, it will be on the right of all the items.
expand-right = true
; "menu-LEVEL-N" has the same properties as "label-NAME" with
; the additional "exec" property
;
; Available exec commands:
; menu-open-LEVEL
; menu-close
; Other commands will be executed using "/usr/bin/env sh -c $COMMAND"
menu-0-0 = Menu
menu-0-0-exec = ~/.config/polybar/my_theme/scripts/launcher.sh &
menu-0-1 = Files
menu-0-1-exec = thunar &
menu-0-2 = Terminal
menu-0-2-exec = termite &
menu-0-3 = Browser
menu-0-3-exec = firefox &
; Available tags:
; <label-toggle> (default) - gets replaced with <label-(open|close)>
; <menu> (default)
; Note that if you use <label-toggle> you must also include
; the definition for <label-open>
format = <label-toggle> <menu>
format-background = ${color.shade1}
format-foreground = ${color.foreground}
format-padding = 1
label-open = " "
label-close = " "
; Optional item separator
; Default: none
label-separator = " | "
;; _-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_

View File

@ -0,0 +1,32 @@
[dmenu]
dmenu_command = /usr/bin/rofi -dmenu -i -theme /home/crimsen/.config/polybar/my_theme/scripts/rofi/networkmenu.rasi
#dmenu_command = /usr/bin/rofi -dmenu -i
# dmenu_command = /usr/bin/dmenu
# # Note that dmenu_command can contain arguments as well like:
# # `dmenu_command = rofi -dmenu -i -theme nmdm`
# # `dmenu_command = rofi -dmenu -width 30 -i`
# # `dmenu_command = dmenu -i -l 25 -b -nb #909090 -nf #303030`
# rofi_highlight = <True or False> # (Default: False) use rofi highlighting instead of '=='
rofi_highlight = True
# compact = <True or False> # (Default: False). Remove extra spacing from display
compact = True
# pinentry = <Pinentry command> # (Default: None) e.g. `pinentry-gtk`
pinentry = pinentry-gtk
# wifi_chars = <string of 4 unicode characters representing 1-4 bars strength>
#wifi_chars = ▂▄▆█
wifi_chars = 󰤟󰤢󰤥󰤨
# list_saved = <True or False> # (Default: False) list saved connections
[dmenu_passphrase]
# # Uses the -password flag for Rofi, -x for bemenu. For dmenu, sets -nb and
# # -nf to the same color or uses -P if the dmenu password patch is applied
# # https://tools.suckless.org/dmenu/patches/password/
# obscure = True
# obscure_color = #222222
[editor]
# terminal = <name of terminal program>
# gui_if_available = <True or False> (Default: True)
[nmdm]
# rescan_delay = <seconds> # (seconds to wait after a wifi rescan before redisplaying the results)

View File

@ -0,0 +1,928 @@
#!/usr/bin/env python3
# encoding:utf8
"""NetworkManager command line dmenu script.
To add new connections or enable/disable networking requires policykit
permissions setup per:
https://wiki.archlinux.org/index.php/NetworkManager#Set_up_PolicyKit_permissions
OR running the script as root
Add dmenu options and default terminal if desired to
~/.config/networkmanager-dmenu/config.ini
"""
import pathlib
import struct
import configparser
import locale
import os
from os.path import expanduser
import shlex
from shutil import which
import sys
from time import sleep
import uuid
import subprocess
# pylint: disable=import-error
import gi
gi.require_version('NM', '1.0')
from gi.repository import GLib, NM # noqa pylint: disable=wrong-import-position
# pylint: enable=import-error
ENV = os.environ.copy()
ENV['LC_ALL'] = 'C'
ENC = locale.getpreferredencoding()
CONF = configparser.ConfigParser()
CONF.read(expanduser("~/.config/networkmanager-dmenu/config.ini"))
def cli_args():
""" Don't override dmenu_cmd function arguments with CLI args. Removes -l
and -p if those are passed on the command line.
Exception: if -l is passed and dmenu_command is not defined, assume that the
user wants to switch dmenu to the vertical layout and include -l.
Returns: List of additional CLI arguments
"""
args = sys.argv[1:]
cmd = CONF.get('dmenu', 'dmenu_command', fallback=False)
if "-l" in args or "-p" in args:
for nope in ['-l', '-p'] if cmd is not False else ['-p']:
try:
nope_idx = args.index(nope)
del args[nope_idx]
del args[nope_idx]
except ValueError:
pass
return args
def dmenu_pass(command, color):
"""Check if dmenu passphrase patch is applied and return the correct command
line arg list
Args: command - string
color - obscure color string
Returns: list or None
"""
if command != 'dmenu':
return None
try:
# Check for dmenu password patch
dm_patch = b'P' in subprocess.run(["dmenu", "-h"],
capture_output=True,
check=False).stderr
except FileNotFoundError:
dm_patch = False
return ["-P"] if dm_patch else ["-nb", color, "-nf", color]
def dmenu_cmd(num_lines, prompt="Networks", active_lines=None):
"""Parse config.ini for menu options
Args: args - num_lines: number of lines to display
prompt: prompt to show
active_lines: list of line numbers to tag as active
Returns: command invocation (as a list of strings) for example
["dmenu", "-l", "<num_lines>", "-p", "<prompt>", "-i"]
"""
# Create command string
commands = {"dmenu": ["-p", str(prompt)],
"rofi": ["-dmenu", "-p", str(prompt), "-l", str(num_lines)],
"bemenu": ["-p", str(prompt)],
"wofi": ["-p", str(prompt)]}
command = shlex.split(CONF.get('dmenu', 'dmenu_command', fallback="dmenu"))
command.extend(cli_args())
command.extend(commands.get(command[0], []))
# Rofi Highlighting
rofi_highlight = CONF.getboolean('dmenu', 'rofi_highlight', fallback=False)
if rofi_highlight is True and command[0] == "rofi" and active_lines:
command.extend(["-a", ",".join([str(num) for num in active_lines])])
# Passphrase prompts
obscure = CONF.getboolean('dmenu_passphrase', 'obscure', fallback=False)
if prompt == "Passphrase" and obscure is True:
obscure_color = CONF.get('dmenu_passphrase', 'obscure_color', fallback='#222222')
pass_prompts = {"dmenu": dmenu_pass(command[0], obscure_color),
"rofi": ['-password'],
"bemenu": ['-x'],
"wofi": ['-P']}
command.extend(pass_prompts.get(command[0], []))
return command
def choose_adapter(client):
"""If there is more than one wifi adapter installed, ask which one to use
"""
devices = client.get_devices()
devices = [i for i in devices if i.get_device_type() == NM.DeviceType.WIFI]
if not devices:
return None
if len(devices) == 1:
return devices[0]
device_names = "\n".join([d.get_iface() for d in devices])
sel = subprocess.run(dmenu_cmd(len(devices), "CHOOSE ADAPTER:"),
capture_output=True,
check=False,
env=ENV,
input=device_names,
encoding=ENC).stdout
if not sel.strip():
sys.exit()
devices = [i for i in devices if i.get_iface() == sel.strip()]
assert len(devices) == 1
return devices[0]
def is_installed(cmd):
"""Check if a utility is installed"""
return which(cmd) is not None
def bluetooth_get_enabled():
"""Check if bluetooth is enabled via rfkill.
Returns None if no bluetooth device was found.
"""
# See https://www.kernel.org/doc/Documentation/ABI/stable/sysfs-class-rfkill
for path in pathlib.Path('/sys/class/rfkill/').glob('rfkill*'):
if (path / 'type').read_text().strip() == 'bluetooth':
return (path / 'soft').read_text().strip() == '0'
return None
def create_other_actions(client):
"""Return list of other actions that can be taken
"""
networking_enabled = client.networking_get_enabled()
networking_action = "Disable" if networking_enabled else "Enable"
wifi_enabled = client.wireless_get_enabled()
wifi_action = "Disable" if wifi_enabled else "Enable"
bluetooth_enabled = bluetooth_get_enabled()
bluetooth_action = "Disable" if bluetooth_enabled else "Enable"
actions = [Action(f"{wifi_action} Wifi", toggle_wifi,
not wifi_enabled),
Action(f"{networking_action} Networking",
toggle_networking, not networking_enabled)]
if bluetooth_enabled is not None:
actions.append(Action(f"{bluetooth_action} Bluetooth",
toggle_bluetooth, not bluetooth_enabled))
actions += [Action("Launch Connection Manager", launch_connection_editor),
Action("Delete a Connection", delete_connection)]
if wifi_enabled:
actions.append(Action("Rescan Wifi Networks", rescan_wifi))
return actions
def rescan_wifi():
"""
Rescan Wifi Access Points
"""
delay = CONF.getint('nmdm', 'rescan_delay', fallback=5)
for dev in CLIENT.get_devices():
if gi.repository.NM.DeviceWifi == type(dev):
try:
dev.request_scan_async(None, rescan_cb, None)
LOOP.run()
sleep(delay)
notify("Wifi scan complete")
main()
except gi.repository.GLib.Error as err:
# Too frequent rescan error
notify("Wifi rescan failed", urgency="critical")
if not err.code == 6: # pylint: disable=no-member
raise err
def rescan_cb(dev, res, data):
"""Callback for rescan_wifi. Just for notifications
"""
if dev.request_scan_finish(res) is True:
notify("Wifi scan running...")
else:
notify("Wifi scan failed", urgency="critical")
LOOP.quit()
def ssid_to_utf8(nm_ap):
""" Convert binary ssid to utf-8 """
ssid = nm_ap.get_ssid()
if not ssid:
return ""
ret = NM.utils_ssid_to_utf8(ssid.get_data())
return ret
def prompt_saved(saved_cons):
"""Prompt for a saved connection."""
actions = create_saved_actions(saved_cons)
sel = get_selection(actions)
sel()
def ap_security(nm_ap):
"""Parse the security flags to return a string with 'WPA2', etc. """
flags = nm_ap.get_flags()
wpa_flags = nm_ap.get_wpa_flags()
rsn_flags = nm_ap.get_rsn_flags()
sec_str = ""
if ((flags & getattr(NM, '80211ApFlags').PRIVACY) and
(wpa_flags == 0) and (rsn_flags == 0)):
sec_str = " WEP"
if wpa_flags:
sec_str = " WPA1"
if rsn_flags & getattr(NM, '80211ApSecurityFlags').KEY_MGMT_PSK:
sec_str += " WPA2"
if rsn_flags & getattr(NM, '80211ApSecurityFlags').KEY_MGMT_SAE:
sec_str += " WPA3"
if ((wpa_flags & getattr(NM, '80211ApSecurityFlags').KEY_MGMT_802_1X) or
(rsn_flags & getattr(NM, '80211ApSecurityFlags').KEY_MGMT_802_1X)):
sec_str += " 802.1X"
if ((wpa_flags & getattr(NM, '80211ApSecurityFlags').KEY_MGMT_OWE) or
(rsn_flags & getattr(NM, '80211ApSecurityFlags').KEY_MGMT_OWE)):
sec_str += " OWE"
# If there is no security use "--"
if sec_str == "":
sec_str = "--"
return sec_str.lstrip()
class Action(): # pylint: disable=too-few-public-methods
"""Helper class to execute functions from a string variable"""
def __init__(self,
name,
func,
args=None,
active=False):
self.name = name
self.func = func
self.is_active = active
if args is None:
self.args = None
elif isinstance(args, list):
self.args = args
else:
self.args = [args]
def __str__(self):
return self.name
def __call__(self):
if self.args is None:
self.func()
else:
self.func(*self.args)
def conn_matches_adapter(conn, adapter):
"""Return True if the connection is applicable for the given adapter.
There seem to be two ways for a connection specify what interface it belongs
to:
- By setting 'mac-address' in [wifi] to the adapter's MAC
- By setting 'interface-name` in [connection] to the adapter's name.
Depending on how the connection was added, it seems like either
'mac-address', 'interface-name' or neither of both is set.
"""
# [wifi] mac-address
setting_wireless = conn.get_setting_wireless()
mac = setting_wireless.get_mac_address()
if mac is not None:
return mac == adapter.get_permanent_hw_address()
# [connection] interface-name
setting_connection = conn.get_setting_connection()
interface = setting_connection.get_interface_name()
if interface is not None:
return interface == adapter.get_iface()
# Neither is set, let's assume this connection is for multiple/all adapters.
return True
def process_ap(nm_ap, is_active, adapter):
"""Activate/Deactivate a connection and get password if required"""
if is_active:
CLIENT.deactivate_connection_async(nm_ap, None, deactivate_cb, nm_ap)
LOOP.run()
else:
conns_cur = [i for i in CONNS if
i.get_setting_wireless() is not None and
conn_matches_adapter(i, adapter)]
con = nm_ap.filter_connections(conns_cur)
if len(con) > 1:
raise ValueError("There are multiple connections possible")
if len(con) == 1:
CLIENT.activate_connection_async(con[0], adapter, nm_ap.get_path(),
None, activate_cb, nm_ap)
LOOP.run()
else:
if ap_security(nm_ap) != "--":
password = get_passphrase()
else:
password = ""
set_new_connection(nm_ap, password, adapter)
def activate_cb(dev, res, data):
"""Notification if activate connection completed successfully
"""
try:
conn = dev.activate_connection_finish(res)
except GLib.Error:
conn = None
if conn is not None:
notify(f"Activated {conn.get_id()}")
else:
notify(f"Problem activating {data.get_id()}", urgency="critical")
LOOP.quit()
def deactivate_cb(dev, res, data):
"""Notification if deactivate connection completed successfully
"""
if dev.deactivate_connection_finish(res) is True:
notify(f"Deactivated {data.get_id()}")
else:
notify(f"Problem deactivating {data.get_id()}", urgency="critical")
LOOP.quit()
def process_vpngsm(con, activate):
"""Activate/deactive VPN or GSM connections"""
if activate:
CLIENT.activate_connection_async(con, None, None,
None, activate_cb, con)
else:
CLIENT.deactivate_connection_async(con, None, deactivate_cb, con)
LOOP.run()
def create_ap_actions(aps, active_ap, active_connection, adapter): # noqa pylint: disable=too-many-locals,line-too-long
"""For each AP in a list, create the string and its attached function
(activate/deactivate)
"""
active_ap_bssid = active_ap.get_bssid() if active_ap is not None else ""
names = [ssid_to_utf8(ap) for ap in aps]
max_len_name = max([len(name) for name in names]) if names else 0
secs = [ap_security(ap) for ap in aps]
max_len_sec = max([len(sec) for sec in secs]) if secs else 0
ap_actions = []
for nm_ap, name, sec in zip(aps, names, secs):
bars = NM.utils_wifi_strength_bars(nm_ap.get_strength())
wifi_chars = CONF.get("dmenu", "wifi_chars", fallback=False)
if wifi_chars:
length_ = [wifi_chars[i] for i, j in enumerate(bars) if j == '*']
#print(bars, length_, len(length_), wifi_chars[-1])
bars = "".join(length_[-1])
#wifi_strength_ = [wifi_chars[i] for i, j in enumerate(bars) if j == '*']
#bars = wifi_strength[-1]
is_active = nm_ap.get_bssid() == active_ap_bssid
compact = CONF.getboolean("dmenu", "compact", fallback=False)
if compact:
action_name = f"{name} {sec} {bars}"
else:
action_name = f"{name:<{max_len_name}s} {sec:<{max_len_sec}s} {bars:>4}"
if is_active:
ap_actions.append(Action(action_name, process_ap,
[active_connection, True, adapter],
active=True))
else:
ap_actions.append(Action(action_name, process_ap,
[nm_ap, False, adapter]))
return ap_actions
def create_vpn_actions(vpns, active):
"""Create the list of strings to display with associated function
(activate/deactivate) for VPN connections.
"""
active_vpns = [i for i in active if i.get_vpn()]
return _create_vpngsm_actions(vpns, active_vpns, "VPN")
def create_wireguard_actions(wgs, active):
"""Create the list of strings to display with associated function
(activate/deactivate) for Wireguard connections.
"""
active_wgs = [i for i in active if i.get_connection_type() == "wireguard"]
return _create_vpngsm_actions(wgs, active_wgs, "Wireguard")
def create_eth_actions(eths, active):
"""Create the list of strings to display with associated function
(activate/deactivate) for Ethernet connections.
"""
active_eths = [i for i in active if 'ethernet' in i.get_connection_type()]
return _create_vpngsm_actions(eths, active_eths, "Eth")
def create_gsm_actions(gsms, active):
"""Create the list of strings to display with associated function
(activate/deactivate) GSM connections."""
active_gsms = [i for i in active if
i.get_connection() is not None and
i.get_connection().is_type(NM.SETTING_GSM_SETTING_NAME)]
return _create_vpngsm_actions(gsms, active_gsms, "GSM")
def create_blue_actions(blues, active):
"""Create the list of strings to display with associated function
(activate/deactivate) Bluetooth connections."""
active_blues = [i for i in active if
i.get_connection() is not None and
i.get_connection().is_type(NM.SETTING_BLUETOOTH_SETTING_NAME)]
return _create_vpngsm_actions(blues, active_blues, "Bluetooth")
def create_saved_actions(saved):
"""Create the list of strings to display with associated function
(activate/deactivate) for VPN connections.
"""
return _create_vpngsm_actions(saved, [], "SAVED")
def _create_vpngsm_actions(cons, active_cons, label):
active_con_ids = [a.get_id() for a in active_cons]
actions = []
for con in cons:
is_active = con.get_id() in active_con_ids
action_name = f"{con.get_id()}:{label}"
if is_active:
active_connection = [a for a in active_cons
if a.get_id() == con.get_id()]
if len(active_connection) != 1:
raise ValueError(f"Multiple active connections match {con.get_id()}")
active_connection = active_connection[0]
actions.append(Action(action_name, process_vpngsm,
[active_connection, False], active=True))
else:
actions.append(Action(action_name, process_vpngsm,
[con, True]))
return actions
def create_wwan_actions(client):
"""Create WWWAN actions
"""
wwan_enabled = client.wwan_get_enabled()
wwan_action = "Disable" if wwan_enabled else "Enable"
return [Action(f"{wwan_action} WWAN", toggle_wwan, not wwan_enabled)]
def combine_actions(eths, aps, vpns, wgs, gsms, blues, wwan, others, saved):
# pylint: disable=too-many-arguments
"""Combine all given actions into a list of actions.
Args: args - eths: list of Actions
aps: list of Actions
vpns: list of Actions
gsms: list of Actions
blues: list of Actions
wwan: list of Actions
others: list of Actions
"""
compact = CONF.getboolean("dmenu", "compact", fallback=False)
empty_action = [Action('', None)] if not compact else []
all_actions = []
all_actions += eths + empty_action if eths else []
all_actions += aps + empty_action if aps else []
all_actions += vpns + empty_action if vpns else []
all_actions += wgs + empty_action if wgs else []
all_actions += gsms + empty_action if (gsms and wwan) else []
all_actions += blues + empty_action if blues else []
all_actions += wwan + empty_action if wwan else []
all_actions += others + empty_action if others else []
all_actions += saved + empty_action if saved else []
return all_actions
def get_selection(all_actions):
"""Spawn dmenu for selection and execute the associated action."""
rofi_highlight = CONF.getboolean('dmenu', 'rofi_highlight', fallback=False)
inp = []
if rofi_highlight is True:
inp = [str(action) for action in all_actions]
else:
inp = [('== ' if action.is_active else ' ') + str(action)
for action in all_actions]
active_lines = [index for index, action in enumerate(all_actions)
if action.is_active]
command = dmenu_cmd(len(inp), active_lines=active_lines)
sel = subprocess.run(command,
capture_output=True,
check=False,
input="\n".join(inp),
encoding=ENC,
env=ENV).stdout
if not sel.rstrip():
sys.exit()
if rofi_highlight is False:
action = [i for i in all_actions
if ((str(i).strip() == str(sel.strip())
and not i.is_active) or
('== ' + str(i) == str(sel.rstrip('\n'))
and i.is_active))]
else:
action = [i for i in all_actions if str(i).strip() == sel.strip()]
assert len(action) == 1, f"Selection was ambiguous: '{str(sel.strip())}'"
return action[0]
def toggle_networking(enable):
"""Enable/disable networking
Args: enable - boolean
"""
toggle = GLib.Variant.new_tuple(GLib.Variant.new_boolean(enable))
try:
CLIENT.dbus_call(NM.DBUS_PATH, NM.DBUS_INTERFACE, "Enable", toggle,
None, -1, None, None, None)
except AttributeError:
# Workaround for older versions of python-gobject
CLIENT.networking_set_enabled(enable)
notify(f"Networking {'enabled' if enable is True else 'disabled'}")
def toggle_wifi(enable):
"""Enable/disable Wifi
Args: enable - boolean
"""
toggle = GLib.Variant.new_boolean(enable)
try:
CLIENT.dbus_set_property(NM.DBUS_PATH, NM.DBUS_INTERFACE, "WirelessEnabled", toggle,
-1, None, None, None)
except AttributeError:
# Workaround for older versions of python-gobject
CLIENT.wireless_set_enabled(enable)
notify(f"Wifi {'enabled' if enable is True else 'disabled'}")
def toggle_wwan(enable):
"""Enable/disable WWAN
Args: enable - boolean
"""
toggle = GLib.Variant.new_boolean(enable)
try:
CLIENT.dbus_set_property(NM.DBUS_PATH, NM.DBUS_INTERFACE, "WwanEnabled", toggle,
-1, None, None, None)
except AttributeError:
# Workaround for older versions of python-gobject
CLIENT.wwan_set_enabled(enable)
notify(f"Wwan {'enabled' if enable is True else 'disabled'}")
def toggle_bluetooth(enable):
"""Enable/disable Bluetooth
Args: enable - boolean
References:
https://github.com/blueman-project/blueman/blob/master/blueman/plugins/mechanism/RfKill.py
https://www.kernel.org/doc/html/latest/driver-api/rfkill.html
https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git/tree/include/uapi/linux/rfkill.h?h=v5.8.9
"""
type_bluetooth = 2
op_change_all = 3
idx = 0
soft_state = 0 if enable else 1
hard_state = 0
data = struct.pack("IBBBB", idx, type_bluetooth, op_change_all,
soft_state, hard_state)
try:
with open('/dev/rfkill', 'r+b', buffering=0) as rff:
rff.write(data)
except PermissionError:
notify("Lacking permission to write to /dev/rfkill.",
"Check README for configuration options.",
urgency="critical")
else:
notify(f"Bluetooth {'enabled' if enable else 'disabled'}")
def launch_connection_editor():
"""Launch nmtui or the gui nm-connection-editor
"""
terminal = CONF.get("editor", "terminal", fallback="xterm")
gui_if_available = CONF.getboolean("editor", "gui_if_available", fallback=True)
guis = ["gnome-control-center", "nm-connection-editor"]
if gui_if_available is True:
for gui in guis:
if is_installed(gui):
subprocess.run(gui, check=False)
return
if is_installed("nmtui"):
subprocess.run([terminal, "-e", "nmtui"], check=False)
return
notify("No network connection editor installed", urgency="critical")
def get_passphrase():
"""Get a password
Returns: string
"""
pinentry = CONF.get("dmenu", "pinentry", fallback=None)
if pinentry:
pin = ""
out = subprocess.run(pinentry,
capture_output=True,
check=False,
encoding=ENC,
input='setdesc Get network password\ngetpin\n').stdout
if out:
res = out.split("\n")[2]
if res.startswith("D "):
pin = res.split("D ")[1]
return pin
return subprocess.run(dmenu_cmd(0, "Passphrase"),
stdin=subprocess.DEVNULL,
capture_output=True,
check=False,
encoding=ENC).stdout
def delete_connection():
"""Display list of NM connections and delete the selected one
"""
conn_acts = [Action(i.get_id(), i.delete_async, args=[None, delete_cb, None]) for i in CONNS]
conn_names = "\n".join([str(i) for i in conn_acts])
sel = subprocess.run(dmenu_cmd(len(conn_acts), "CHOOSE CONNECTION TO DELETE:"),
capture_output=True,
check=False,
input=conn_names,
encoding=ENC,
env=ENV).stdout
if not sel.strip():
sys.exit()
action = [i for i in conn_acts if str(i) == sel.rstrip("\n")]
assert len(action) == 1, f"Selection was ambiguous: {str(sel)}"
action[0]()
LOOP.run()
def delete_cb(dev, res, data):
"""Notification if delete completed successfully
"""
if dev.delete_finish(res) is True:
notify(f"Deleted {dev.get_id()}")
else:
notify(f"Problem deleting {dev.get_id()}", urgency="critical")
LOOP.quit()
def set_new_connection(nm_ap, nm_pw, adapter):
"""Setup a new NetworkManager connection
Args: ap - NM.AccessPoint
pw - string
"""
nm_pw = str(nm_pw).strip()
profile = create_wifi_profile(nm_ap, nm_pw, adapter)
CLIENT.add_and_activate_connection_async(profile, adapter, nm_ap.get_path(),
None, verify_conn, profile)
LOOP.run()
def create_wifi_profile(nm_ap, password, adapter):
# pylint: disable=line-too-long
# noqa From https://cgit.freedesktop.org/NetworkManager/NetworkManager/tree/examples/python/gi/add_connection.py
# noqa and https://cgit.freedesktop.org/NetworkManager/NetworkManager/tree/examples/python/dbus/add-wifi-psk-connection.py
# pylint: enable=line-too-long
"""Create the NM profile given the AP and passphrase"""
ap_sec = ap_security(nm_ap)
profile = NM.SimpleConnection.new()
s_con = NM.SettingConnection.new()
s_con.set_property(NM.SETTING_CONNECTION_ID, ssid_to_utf8(nm_ap))
s_con.set_property(NM.SETTING_CONNECTION_UUID, str(uuid.uuid4()))
s_con.set_property(NM.SETTING_CONNECTION_TYPE, "802-11-wireless")
profile.add_setting(s_con)
s_wifi = NM.SettingWireless.new()
s_wifi.set_property(NM.SETTING_WIRELESS_SSID, nm_ap.get_ssid())
s_wifi.set_property(NM.SETTING_WIRELESS_MODE, 'infrastructure')
s_wifi.set_property(NM.SETTING_WIRELESS_MAC_ADDRESS, adapter.get_permanent_hw_address())
profile.add_setting(s_wifi)
s_ip4 = NM.SettingIP4Config.new()
s_ip4.set_property(NM.SETTING_IP_CONFIG_METHOD, "auto")
profile.add_setting(s_ip4)
s_ip6 = NM.SettingIP6Config.new()
s_ip6.set_property(NM.SETTING_IP_CONFIG_METHOD, "auto")
profile.add_setting(s_ip6)
if ap_sec != "--":
s_wifi_sec = NM.SettingWirelessSecurity.new()
if "WPA" in ap_sec:
if "WPA3" in ap_sec:
s_wifi_sec.set_property(NM.SETTING_WIRELESS_SECURITY_KEY_MGMT,
"sae")
else:
s_wifi_sec.set_property(NM.SETTING_WIRELESS_SECURITY_KEY_MGMT,
"wpa-psk")
s_wifi_sec.set_property(NM.SETTING_WIRELESS_SECURITY_AUTH_ALG,
"open")
s_wifi_sec.set_property(NM.SETTING_WIRELESS_SECURITY_PSK, password)
elif "WEP" in ap_sec:
s_wifi_sec.set_property(NM.SETTING_WIRELESS_SECURITY_KEY_MGMT,
"None")
s_wifi_sec.set_property(NM.SETTING_WIRELESS_SECURITY_WEP_KEY_TYPE,
NM.WepKeyType.PASSPHRASE)
s_wifi_sec.set_wep_key(0, password)
profile.add_setting(s_wifi_sec)
return profile
def verify_conn(client, result, data):
"""Callback function for add_and_activate_connection_async
Check if connection completes successfully. Delete the connection if there
is an error.
"""
try:
act_conn = client.add_and_activate_connection_finish(result)
conn = act_conn.get_connection()
if not all([conn.verify(),
conn.verify_secrets(),
data.verify(),
data.verify_secrets()]):
raise GLib.Error
notify(f"Added {conn.get_id()}")
except GLib.Error:
try:
notify(f"Connection to {conn.get_id()} failed",
urgency="critical")
conn.delete_async(None, None, None)
except UnboundLocalError:
pass
finally:
LOOP.quit()
def create_ap_list(adapter, active_connections):
"""Generate list of access points. Remove duplicate APs , keeping strongest
ones and the active AP
Args: adapter
active_connections - list of all active connections
Returns: aps - list of access points
active_ap - active AP
active_ap_con - active Connection
adapter
"""
aps = []
ap_names = []
active_ap = adapter.get_active_access_point()
aps_all = sorted(adapter.get_access_points(),
key=lambda a: a.get_strength(), reverse=True)
conns_cur = [i for i in CONNS if
i.get_setting_wireless() is not None and
conn_matches_adapter(i, adapter)]
try:
ap_conns = active_ap.filter_connections(conns_cur)
active_ap_name = ssid_to_utf8(active_ap)
active_ap_con = [active_conn for active_conn in active_connections
if active_conn.get_connection() in ap_conns]
except AttributeError:
active_ap_name = None
active_ap_con = []
if len(active_ap_con) > 1:
raise ValueError("Multiple connection profiles match"
" the wireless AP")
active_ap_con = active_ap_con[0] if active_ap_con else None
for nm_ap in aps_all:
ap_name = ssid_to_utf8(nm_ap)
if nm_ap != active_ap and ap_name == active_ap_name:
# Skip adding AP if it's not active but same name as active AP
continue
if ap_name not in ap_names:
ap_names.append(ap_name)
aps.append(nm_ap)
return aps, active_ap, active_ap_con, adapter
def notify(message, details=None, urgency="low"):
"""Use notify-send if available for notifications
"""
delay = CONF.getint('nmdm', 'rescan_delay', fallback=5)
args = ["-u", urgency, "-a", "networkmanager-dmenu",
"-t", str(delay * 1000), message]
if details is not None:
args.append(details)
if is_installed("notify-send"):
subprocess.run(["notify-send"] + args, check=False)
def run(): # pylint: disable=too-many-locals
"""Main script entrypoint"""
active = CLIENT.get_active_connections()
adapter = choose_adapter(CLIENT)
if adapter:
ap_actions = create_ap_actions(*create_ap_list(adapter, active))
else:
ap_actions = []
vpns = [i for i in CONNS if i.is_type(NM.SETTING_VPN_SETTING_NAME)]
try:
wgs = [i for i in CONNS if i.is_type(NM.SETTING_WIREGUARD_SETTING_NAME)]
except AttributeError:
# Workaround for older versions of python-gobject with no wireguard support
wgs = []
eths = [i for i in CONNS if i.is_type(NM.SETTING_WIRED_SETTING_NAME)]
blues = [i for i in CONNS if i.is_type(NM.SETTING_BLUETOOTH_SETTING_NAME)]
vpn_actions = create_vpn_actions(vpns, active)
wg_actions = create_wireguard_actions(wgs, active)
eth_actions = create_eth_actions(eths, active)
blue_actions = create_blue_actions(blues, active)
other_actions = create_other_actions(CLIENT)
wwan_installed = is_installed("ModemManager")
if wwan_installed:
gsms = [i for i in CONNS if i.is_type(NM.SETTING_GSM_SETTING_NAME)]
gsm_actions = create_gsm_actions(gsms, active)
wwan_actions = create_wwan_actions(CLIENT)
else:
gsm_actions = []
wwan_actions = []
list_saved = CONF.getboolean('dmenu', 'list_saved', fallback=False)
saved_cons = [i for i in CONNS if i not in vpns + wgs + eths + blues]
if list_saved:
saved_actions = create_saved_actions(saved_cons)
else:
saved_actions = [Action("Saved connections", prompt_saved, [saved_cons])]
actions = combine_actions(eth_actions, ap_actions, vpn_actions, wg_actions,
gsm_actions, blue_actions, wwan_actions,
other_actions, saved_actions)
sel = get_selection(actions)
sel()
def main():
"""Main. Enables script to be re-run after a wifi rescan
"""
global CLIENT, CONNS, LOOP # noqa pylint: disable=global-variable-undefined
CLIENT = NM.Client.new(None)
LOOP = GLib.MainLoop()
CONNS = CLIENT.get_connections()
run()
if __name__ == '__main__':
main()
# vim: set et ts=4 sw=4 :