first commit
This commit is contained in:
commit
cba62f7fe2
Binary file not shown.
|
@ -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 window’s width.
|
||||
# Pressing right will grow the window’s width.
|
||||
# Pressing up will shrink the window’s height.
|
||||
# Pressing down will grow the window’s 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
|
|
@ -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 window’s width.
|
||||
# Pressing right will grow the window’s width.
|
||||
# Pressing up will shrink the window’s height.
|
||||
# Pressing down will grow the window’s 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
|
||||
#}
|
||||
|
|
@ -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
|
||||
|
||||
;; _-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_
|
|
@ -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
|
||||
|
||||
;; _-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_
|
|
@ -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
|
||||
|
||||
;; _-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_
|
|
@ -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
|
||||
|
||||
;; _-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_
|
|
@ -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 &
|
File diff suppressed because it is too large
Load Diff
|
@ -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
|
||||
|
||||
;; _-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_
|
|
@ -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 &
|
|
@ -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:
|
|
@ -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
|
|
@ -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
|
|
@ -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
|
|
@ -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
|
|
@ -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
|
|
@ -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
|
|
@ -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
|
|
@ -0,0 +1,12 @@
|
|||
/* colors */
|
||||
|
||||
* {
|
||||
al: #00000000;
|
||||
ac: #00000000;
|
||||
bg: #1F1F1FFF;
|
||||
bg1: #1565C0FF;
|
||||
bg2: #1976D2FF;
|
||||
bg3: #1E88E5FF;
|
||||
bg4: #1E88E5FF;
|
||||
fg: #FFFFFFFF;
|
||||
}
|
|
@ -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;
|
||||
}
|
|
@ -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;
|
||||
}
|
|
@ -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;
|
||||
}
|
|
@ -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;
|
||||
}
|
|
@ -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;
|
||||
}
|
|
@ -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;
|
||||
}
|
|
@ -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
|
|
@ -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
|
|
@ -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 = " | "
|
||||
|
||||
;; _-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_
|
|
@ -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)
|
|
@ -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 :
|
Loading…
Reference in New Issue