├── background.png ├── screenshot.png ├── fonts ├── Cookie-Regular.ttf ├── SourceCodePro-Regular.otf └── IosevkaNerdFontComplete-mod.ttf ├── polybar ├── scripts │ ├── ping.wav │ ├── prompted-action.sh │ ├── timer.sh │ └── task.sh ├── launch.sh ├── pink.scheme.ini └── config ├── others ├── dmenu.sh ├── picom.conf ├── termite ├── bspwmrc └── sxhkdrc ├── README.md └── LICENSE /background.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/quandangv/hello-kitty/HEAD/background.png -------------------------------------------------------------------------------- /screenshot.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/quandangv/hello-kitty/HEAD/screenshot.png -------------------------------------------------------------------------------- /fonts/Cookie-Regular.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/quandangv/hello-kitty/HEAD/fonts/Cookie-Regular.ttf -------------------------------------------------------------------------------- /polybar/scripts/ping.wav: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/quandangv/hello-kitty/HEAD/polybar/scripts/ping.wav -------------------------------------------------------------------------------- /fonts/SourceCodePro-Regular.otf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/quandangv/hello-kitty/HEAD/fonts/SourceCodePro-Regular.otf -------------------------------------------------------------------------------- /fonts/IosevkaNerdFontComplete-mod.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/quandangv/hello-kitty/HEAD/fonts/IosevkaNerdFontComplete-mod.ttf -------------------------------------------------------------------------------- /others/dmenu.sh: -------------------------------------------------------------------------------- 1 | dmenu_run -fn "Cookie-30" -o 0.7 -dim 0.2 -p "Hello Kitty" -q -i -sb '#FF447C' -nb '#F4E8EC' -nf "#FF0058" -sf "#ffffff" 2 | -------------------------------------------------------------------------------- /polybar/launch.sh: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env sh 2 | 3 | killall -q polybar 4 | 5 | while pgrep -u $UID -x polybar >/dev/null; do sleep 1; done 6 | 7 | polybar main & 8 | -------------------------------------------------------------------------------- /others/picom.conf: -------------------------------------------------------------------------------- 1 | shadow-radius = 30 2 | shadow-opacity = 0.6 3 | shadow-red = 0.30 4 | shadow-green = 0.15 5 | shadow-blue = 0.25 6 | blur: { 7 | method = "gaussian"; 8 | size = 15; 9 | deviation = 15; 10 | } 11 | -------------------------------------------------------------------------------- /polybar/scripts/prompted-action.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | idle_text=$1 4 | prompt=$2 5 | cmd=$3 6 | prompt_wait=$4 7 | 8 | if [ -z $prompt_wait ]; then 9 | prompt_wait=2 10 | fi 11 | 12 | ready=0 13 | 14 | hit() { 15 | if [ $ready -eq 0 ]; then 16 | ready=1 17 | echo "$prompt" 18 | sleep $prompt_wait & 19 | wait 20 | else 21 | eval "$cmd" 22 | fi 23 | ready=0 24 | echo "$idle_text" 25 | } 26 | 27 | trap "hit" USR1 28 | 29 | echo "$idle_text" 30 | while true; do 31 | sleep 1 & 32 | wait 33 | done 34 | -------------------------------------------------------------------------------- /others/termite: -------------------------------------------------------------------------------- 1 | [options] 2 | clickable_url = true 3 | search_wrap = true 4 | font = Source Code Pro Semibold 5 | 6 | [colors] 7 | foreground = #ffffff 8 | foreground_bold = #00ffff 9 | cursor = #dddddd 10 | cursor_foreground = #ffffff 11 | background = rgba(60,20,50,0.65) 12 | color0 = #322B24 13 | color8 = #654 14 | color7 = #A6717C 15 | color15 = #FFEBEF 16 | color1 = #00F27A 17 | color9 = #63FEB1 18 | color2 = #379BFF 19 | color10 = #6FB7FF 20 | color3 = #C553FF 21 | color11 = #D581FF 22 | color4 = #FFE500 23 | color12 = #FFEF5E 24 | color5 = #00EEEE 25 | color13 = #70FFFF 26 | color6 = #FF4D82 27 | color14 = #FF6E9A 28 | # Extra colors 29 | color16 = #aaaaaa 30 | color17 = #444444 31 | color18 = #121212 32 | color19 = #222222 33 | color20 = #999999 34 | color21 = #999999 35 | -------------------------------------------------------------------------------- /others/bspwmrc: -------------------------------------------------------------------------------- 1 | #! /bin/sh 2 | 3 | pgrep -x sxhkd > /dev/null || sxhkd & 4 | ~/.config/polybar/launch.sh & 5 | 6 | bspc monitor -d I II III IV V VI VII VIII IX X 7 | 8 | bspc config border_width 0 9 | bspc config border_radius 10 10 | bspc config window_gap 30 11 | bspc config pointer_modifier super 12 | bspc config pointer_action1 move 13 | bspc config pointer_action3 resize_side 14 | bspc config split_ratio 0.5 15 | bspc config top_padding -10 16 | bspc config bottom_padding 0 17 | bspc config left_padding 0 18 | bspc config right_padding 40 19 | bspc config normal_border_color '#0088ff' 20 | bspc config active_border_color '#0088ff' 21 | bspc config focused_border_color '#00ffff' 22 | bspc config borderless_monocle false 23 | bspc config gapless_monocle false 24 | bspc config focus_follows_pointer true 25 | bspc rule -a '*:ferdi' state=floating sticky=on 26 | -------------------------------------------------------------------------------- /polybar/pink.scheme.ini: -------------------------------------------------------------------------------- 1 | [module/workspaces] 2 | label-empty =  3 | label-occupied =  4 | label-focused =  5 | label-urgent =  6 | 7 | [color] 8 | 9 | font = "Cookie:size=16;3" 10 | 11 | bg = #ffffff 12 | fg = #fff 13 | fg-alt = #fff 14 | 15 | alpha = #00000000 16 | emergency-shade = #C90000 17 | 18 | power-fg = ${color.date-fg} 19 | power-bg = ${color.date-bg} 20 | date-fg = ${color.launcher-fg} 21 | date-bg = ${color.launcher-bg} 22 | volume-fg = ${color.date-fg} 23 | volume-bg = ${color.date-bg} 24 | fs-fg = ${color.date-fg} 25 | fs-bg = ${color.date-bg} 26 | battery-fg = ${color.date-fg} 27 | battery-bg = ${color.date-bg} 28 | temp-fg = ${color.date-fg} 29 | temp-bg = ${color.date-bg} 30 | network-fg = ${color.date-fg} 31 | network-bg = ${color.date-bg} 32 | ram-fg = ${color.date-fg} 33 | ram-bg = ${color.date-bg} 34 | cpu-fg = ${color.date-fg} 35 | cpu-bg = ${color.date-bg} 36 | workspace-fg = ${color.launcher-fg} 37 | workspace-bg = ${color.launcher-bg} 38 | launcher-fg = #FF2E6D 39 | launcher-bg = #FF699F 40 | task-fg = ${color.launcher-fg} 41 | task-bg = ${color.launcher-bg} 42 | 43 | -------------------------------------------------------------------------------- /polybar/scripts/timer.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | time_save_path=/tmp/timer.time 4 | if [ -f $time_save_path ]; then 5 | seconds_left=$(($(cat $time_save_path) - $(date +%s))) 6 | else 7 | seconds_left=-1 8 | fi 9 | blink_state=1 10 | increment=$1 11 | 12 | if [ -z $increment ]; then 13 | increment=300 14 | fi 15 | 16 | if [ -L $0 ] ; then 17 | DIR=$(dirname $(readlink -f $0)) ; 18 | else 19 | DIR=$(dirname $0) ; 20 | fi ; 21 | ping_path="$DIR/ping.wav" 22 | 23 | update_time () { 24 | echo $(($(date +%s) + seconds_left)) > $time_save_path 25 | } 26 | 27 | trap "((seconds_left+=increment)) && update_time" USR1 28 | trap "((seconds_left-=increment)) && update_time" USR2 29 | 30 | echo $$ 31 | while true; do 32 | if [ $seconds_left -gt 0 ]; then 33 | tmp=$seconds_left 34 | s=$((tmp%60)) 35 | tmp=$((tmp/60)) 36 | if [ $tmp -gt 0 ]; then 37 | m=$((tmp%60)) 38 | tmp=$((tmp/60)) 39 | if [ $tmp -gt 0 ]; then 40 | printf "%d:%02d:%02d\n" $tmp $m $s 41 | else 42 | printf "%d:%02d\n" $m $s 43 | fi 44 | else 45 | echo "$s" 46 | fi 47 | ((seconds_left--)) 48 | elif [ $seconds_left -eq 0 ]; then 49 | if [ $blink_state -eq 1 ]; then 50 | echo "%{R}Time up!%{R}" 51 | else 52 | echo "Time up!" 53 | fi 54 | aplay $ping_path -q & 55 | ((blink_state=-blink_state)) 56 | else 57 | echo "" 58 | seconds_left=-1 59 | fi 60 | sleep 1 & 61 | wait 62 | done 63 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # hello-kitty 2 | A cute theme for Arch Linux 3 | 4 | ![screenshot](screenshot.png) 5 | 6 | ## Dependencies 7 | This theme is created in a system with these packages installed: 8 | * Window manager: bspwm-rounded-corners 9 | * Terminal: termite 10 | * Compositor: picom 11 | * Keyboard shortcuts: sxhkd 12 | * App launcher: dmenu 13 | * Audio: alsa 14 | * Status bar: [my fork of polybar](https://github.com/DRKblade/polybar) 15 | * Task list: task (taskwarrior) 16 | 17 | ## Installation guide 18 | Here are the resource files and the directories to put them 19 | * fonts/ -> ~/.local/share/fonts/ 20 | * polybar -> ~/.config/polybar/ 21 | * others/bspwmrc -> ~/.config/bspwm/bspwmrc 22 | * others/dmenu.sh -> ~/.config/dmenu.sh 23 | * others/picom.conf -> ~/.config/picom.conf 24 | * others/sxhkdrc -> ~/.config/sxhkd/sxhkdrc 25 | * others/termite -> ~/.config/termite/config 26 | * background.png -> set as desktop background 27 | 28 | ## Instruction on custom scripts 29 | ### Timer 30 | The timer script module is displayed as the watch icon on the left of polybar. I used it as a pomodoro timer. 31 | * Left click to add 5 minutes 32 | * Right click to subtract 5 minutes 33 | * When the timer runs out, a ping sound will be played every second. Right click the timer to stop this. 34 | 35 | ### Task view 36 | The task view script module is to the right of the timer module, next to the reload icon. It will display tasks from taskwarrior. 37 | * Left click will move to the next task 38 | * Right click will mark the current task as done 39 | -------------------------------------------------------------------------------- /polybar/scripts/task.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | # index of the displayed task 4 | index=1 5 | # countdown to the next forced update 6 | dirty_countdown=0 7 | # period of the forced update (in seconds) 8 | reload_rate=20 9 | # is the module in the period of confirmation for marking a task as done 10 | # if so, clicking will cancel marking 11 | marking=0 12 | 13 | while getopts ":r:f:" opt; do 14 | case $opt in 15 | r) reload_rate="$OPTARG" 16 | ;; 17 | f) filter="$OPTARG" 18 | ;; 19 | \?) echo "Invalid option -$OPTARG" >&2 20 | ;; 21 | esac 22 | done 23 | 24 | # echo the task with the specified id 25 | echo_task () { 26 | ids=`task $filter rc.verbose: rc.report.next.columns:id rc.report.next.labels:1 next` 27 | count=`echo "${ids}" | wc -l` 28 | if [ $count -gt 0 ]; then 29 | index=$(((index-1) % count + 1)) 30 | else 31 | index=-1 32 | fi 33 | current_id=`echo "${ids}" | sed -n $((index))p` 34 | current_desc=`task $current_id rc.verbose: rc.report.next.columns:description rc.report.next.labels:1 next` 35 | current_proj=`task $current_id rc.verbose: rc.report.next.columns:project rc.report.next.labels:1 next` 36 | echo "$current_id" > /tmp/tw_polybar_id 37 | if [ -z "$current_proj" ] 38 | then 39 | echo " $current_desc" 40 | else 41 | echo " $current_desc @ $current_proj" 42 | fi 43 | } 44 | # mark task as done 45 | mark_done() { 46 | marking=1 47 | echo Marking as done... 48 | sleep 2 & 49 | wait 50 | if [ $marking -ne 1 ]; then return; fi 51 | task "$((`cat /tmp/tw_polybar_id`))" done > /dev/null 52 | echo_task 53 | marking=0 54 | } 55 | cancel_marking() { 56 | marking=0 57 | echo Canceled! 58 | sleep 1 & 59 | wait 60 | echo_task 61 | } 62 | click1() { 63 | if [ $marking -eq 0 ]; then 64 | # increment $index and display next task 65 | ((index++)) 66 | echo_task 67 | 68 | else 69 | cancel_marking 70 | fi 71 | } 72 | click2() { 73 | if [ $marking -eq 0 ]; then 74 | mark_done 75 | else 76 | cancel_marking 77 | fi 78 | } 79 | 80 | trap "click1" USR1 81 | trap "click2" USR2 82 | 83 | # echo our pid for debugging 84 | echo $$ 85 | echo_task 86 | while true; do 87 | # do a forced update every $dirty_countdown_max 88 | if [ $marking -eq 0 ]; then 89 | dirty_countdown=$(((dirty_countdown + 1) % $reload_rate)) 90 | if [ $dirty_countdown -eq 0 ] 91 | then 92 | ((index++)) 93 | echo_task 94 | fi 95 | fi 96 | # # echo the displayed task when dirty 97 | # if [ $dirty -ne 0 ] 98 | # then 99 | # if [ $index -eq "-1" ]; then 100 | # echo no task 101 | # else 102 | # echo_task $index 103 | # fi 104 | # dirty=0 105 | # dirty_countdown=0 106 | # fi 107 | sleep 1 & 108 | wait 109 | done 110 | -------------------------------------------------------------------------------- /others/sxhkdrc: -------------------------------------------------------------------------------- 1 | # 2 | # wm independent hotkeys 3 | # 4 | 5 | # screenshot 6 | # super + {_,shift + }p 7 | # import {-window root,_} ~/screenshot.png 8 | 9 | # pick a color 10 | # super + c 11 | # xcolor >> ~/picked-colors 12 | 13 | # toggle polybar 14 | super + b 15 | polybar-msg cmd toggle 16 | 17 | # change to random wallpaper 18 | # super + r 19 | # ~/wallpapers/random-setter 20 | 21 | # move node to desktop number 10 and back 22 | super + {_,shift + }h 23 | bspc node pointed -d {^10,last --follow} 24 | 25 | # Change Transparency 26 | # super + {KP_Add,KP_Subtract} 27 | # picom-trans -c {+,-}5 28 | 29 | # brightness control 30 | {XF86MonBrightnessUp,XF86MonBrightnessDown} 31 | light -{A,U} 2 32 | 33 | # volume control 34 | {XF86AudioRaiseVolume,XF86AudioLowerVolume,XF86AudioMute} 35 | amixer sset Master {5%+,5%-,toggle} 36 | 37 | # terminal emulator 38 | super + Return 39 | termite 40 | 41 | # program launcher 42 | super + @space 43 | ~/.config/dmenu.sh 44 | 45 | # make sxhkd reload its configuration files: 46 | super + Escape 47 | pkill -USR1 -x sxhkd 48 | 49 | # 50 | # bspwm hotkeys 51 | # 52 | 53 | # quit/restart bspwm 54 | super + alt + {q,r} 55 | bspc {quit,wm -r} 56 | 57 | # close and kill 58 | super + {_,shift + }w 59 | bspc node -{c,k} 60 | 61 | # alternate between the tiled and monocle layout 62 | super + m 63 | bspc desktop -l next 64 | 65 | # send the newest marked node to the newest preselected node 66 | super + y 67 | bspc node newest.marked.local -n newest.!automatic.local 68 | 69 | # swap the current node and the biggest window 70 | super + g 71 | bspc node -s biggest.window 72 | 73 | # 74 | # state/flags 75 | # 76 | 77 | # set the window state 78 | super + {t,shift + t,s,f} 79 | bspc node -t {tiled,pseudo_tiled,floating,fullscreen} 80 | 81 | # set the node flags 82 | super + ctrl + {m,x,y,z} 83 | bspc node -g {marked,locked,sticky,private} 84 | 85 | # 86 | # focus/swap 87 | # 88 | 89 | # focus the next/previous desktop in the current monitor 90 | super + bracket{left,right} 91 | bspc desktop -f {prev,next}.local 92 | 93 | # focus the last node/desktop 94 | super + {grave,Tab} 95 | bspc {node,desktop} -f last 96 | 97 | # focus or send to the given desktop 98 | super + {_,shift + }{1-9,0} 99 | bspc {desktop -f,node -d} '^{1-9,10}' 100 | 101 | # 102 | # preselect 103 | # 104 | 105 | # preselect the direction 106 | super + ctrl + {h,j,k,l} 107 | bspc node -p {west,south,north,east} 108 | 109 | # preselect the ratio 110 | super + ctrl + {1-9} 111 | bspc node -o 0.{1-9} 112 | 113 | # cancel the preselection for the focused node 114 | super + ctrl + space 115 | bspc node -p cancel 116 | 117 | # cancel the preselection for the focused desktop 118 | super + ctrl + shift + space 119 | bspc query -N -d | xargs -I id -n 1 bspc node id -p cancel 120 | 121 | -------------------------------------------------------------------------------- /polybar/config: -------------------------------------------------------------------------------- 1 | ;; _-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_ 2 | ;; 3 | ;; ____ __ __ 4 | ;; / __ \____ / /_ __/ /_ ____ ______ 5 | ;; / /_/ / __ \/ / / / / __ \/ __ `/ ___/ 6 | ;; / ____/ /_/ / / /_/ / /_/ / /_/ / / 7 | ;; /_/ \____/_/\__, /_.___/\__,_/_/ 8 | ;; /____/ 9 | ;; 10 | ;; 11 | ;; _-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_ 12 | 13 | include-file = ~/.config/polybar/pink.scheme.ini 14 | 15 | ;; Global WM Settings 16 | 17 | [global/wm] 18 | margin-bottom = 0 19 | 20 | margin-top = 0 21 | 22 | ;; _-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_ 23 | 24 | ;; Bar Settings 25 | 26 | [bar/main] 27 | monitor = 28 | 29 | monitor-fallback = 30 | 31 | monitor-strict = false 32 | 33 | override-redirect = false 34 | 35 | bottom = false 36 | 37 | fixed-center = true 38 | 39 | width = 100% 40 | height = 40 41 | 42 | offset-x = 0% 43 | offset-y = 0% 44 | 45 | background = ${color.alpha} 46 | 47 | radius-top = 0.0 48 | radius-bottom = 0.0 49 | 50 | border-top-size = 10 51 | border-bottom-size = 10 52 | border-color = #00000000 53 | 54 | padding = 0 55 | 56 | module-margin-left = 0 57 | module-margin-right = 0 58 | 59 | font-0 = Iosevka Nerd Font:style=Medium:size=14;4 60 | font-1 = ${color.font} 61 | font-2 = Iosevka Nerd Font:style=Medium:size=30;7 62 | ; font-2 = Iosevka Nerd Font:style=Medium:size=50;-10 63 | 64 | separator = 65 | 66 | space-unit = " " 67 | 68 | dim-value = 1.0 69 | 70 | wm-name = 71 | 72 | locale = 73 | 74 | tray-position = none 75 | 76 | tray-detached = false 77 | 78 | tray-maxsize = 0 79 | 80 | tray-background = ${root.background} 81 | 82 | tray-offset-x = 0 83 | tray-offset-y = 0 84 | 85 | tray-padding = 0 86 | 87 | tray-scale = 1.0 88 | 89 | enable-ipc = true 90 | 91 | click-left = 92 | click-middle = 93 | click-right = 94 | scroll-up = 95 | scroll-down = 96 | double-click-left = 97 | double-click-middle = 98 | double-click-right = 99 | 100 | cursor-click = 101 | cursor-scroll = 102 | 103 | modules-left = launcher timer reload launcherright taskwarrior network alsa rightedge 104 | modules-center = leftedge workspaces rightedge 105 | modules-right = leftedge cpu memory temp0 battery filesystem date powerleft suspend hibernate 106 | 107 | ;; _-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_ 108 | 109 | ;; Application Settings 110 | 111 | [settings] 112 | throttle-output = 5 113 | throttle-output-for = 10 114 | 115 | screenchange-reload = false 116 | 117 | format-foreground = 118 | format-background = 119 | format-underline = 120 | format-overline = 121 | format-spacing = 122 | format-padding = 123 | format-margin = 124 | format-offset = 125 | 126 | ; Enables pseudo-transparency for the bar 127 | ; If set to true the bar can be transparent without a compositor. 128 | pseudo-transparency = false 129 | 130 | ;; _-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_ 131 | ;; 132 | ;; __ ___ __ __ 133 | ;; / |/ /___ ____/ /_ __/ /__ _____ 134 | ;; / /|_/ / __ \/ __ / / / / / _ \/ ___/ 135 | ;; / / / / /_/ / /_/ / /_/ / / __(__ ) 136 | ;; /_/ /_/\____/\__,_/\__,_/_/\___/____/ 137 | ;; 138 | ;; 139 | ;; _-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_ 140 | 141 | [module/powerleft] 142 | type = custom/text 143 | content = "" 144 | content-font = 3 145 | content-foreground = ${color.power-bg} 146 | content-background = ${color.bg} 147 | 148 | [module/launcherright] 149 | type = custom/text 150 | content = "" 151 | content-font = 3 152 | content-foreground = ${color.launcher-bg} 153 | content-background = ${color.bg} 154 | 155 | [module/rightedge] 156 | type = custom/text 157 | content = " " 158 | content-font = 3 159 | content-foreground = ${color.bg} 160 | 161 | [module/leftedge] 162 | type = custom/text 163 | content = " " 164 | content-font = 3 165 | content-foreground = ${color.bg} 166 | 167 | [module/reload] 168 | type = custom/text 169 | content = "" 170 | content-background = ${color.launcher-bg} 171 | content-foreground = ${color.fg-alt} 172 | content-padding = 1 173 | click-left = ~/apps/polybar.sh & 174 | 175 | [module/suspend] 176 | type = custom/script 177 | exec = ~/.config/polybar/scripts/prompted-action.sh "" " Click to suspend" "systemctl suspend" 178 | tail = true 179 | format =