From 2df1347241ac091c3384d4052f76cfdbcbc8c92d Mon Sep 17 00:00:00 2001 From: Kevin Alberts Date: Wed, 7 Jun 2017 12:07:30 +0200 Subject: [PATCH] Mostly done now, except for some popups and tweaking. We have a top bar with dmenu launcher, 9 workspaces, window buttons, thermal monitor, graphs, battery monitor, wifi monitor, sound monitors, system tray, layout indicator, datetime, update counter and screen indicator. On the bottom is a debug bar (only shown when debug=true in config) which is pretty useless at the moment. --- config.py | 31 +- kuro/base.py | 99 ++++- kuro/config.py | 78 +++- kuro/resources/arch.png | Bin 0 -> 61146 bytes .../bluetooth_volume/audio-volume-high.png | Bin 0 -> 3888 bytes .../bluetooth_volume/audio-volume-low.png | Bin 0 -> 2456 bytes .../bluetooth_volume/audio-volume-medium.png | Bin 0 -> 3050 bytes .../audio-volume-muted-blocked.png | Bin 0 -> 1928 bytes .../bluetooth_volume/audio-volume-muted.png | Bin 0 -> 1366 bytes .../bluetooth_volume/audio-volume-off.png | Bin 0 -> 1967 bytes kuro/resources/volume/audio-volume-high.png | Bin 0 -> 3888 bytes kuro/resources/volume/audio-volume-low.png | Bin 0 -> 2456 bytes kuro/resources/volume/audio-volume-medium.png | Bin 0 -> 3050 bytes .../volume/audio-volume-muted-blocked.png | Bin 0 -> 1928 bytes kuro/resources/volume/audio-volume-muted.png | Bin 0 -> 1366 bytes kuro/resources/volume/audio-volume-off.png | Bin 0 -> 1967 bytes kuro/resources/wifi/wireless-disconnected.png | Bin 0 -> 1499 bytes kuro/resources/wifi/wireless-full.png | Bin 0 -> 2055 bytes kuro/resources/wifi/wireless-high.png | Bin 0 -> 1669 bytes kuro/resources/wifi/wireless-low.png | Bin 0 -> 1053 bytes kuro/resources/wifi/wireless-medium.png | Bin 0 -> 1360 bytes kuro/resources/wifi/wireless-none.png | Bin 0 -> 573 bytes kuro/theme.py | 199 ++++++++-- kuro/utils.py | 365 ++++++++++++++++++ 24 files changed, 721 insertions(+), 51 deletions(-) create mode 100644 kuro/resources/arch.png create mode 100644 kuro/resources/bluetooth_volume/audio-volume-high.png create mode 100644 kuro/resources/bluetooth_volume/audio-volume-low.png create mode 100644 kuro/resources/bluetooth_volume/audio-volume-medium.png create mode 100644 kuro/resources/bluetooth_volume/audio-volume-muted-blocked.png create mode 100644 kuro/resources/bluetooth_volume/audio-volume-muted.png create mode 100644 kuro/resources/bluetooth_volume/audio-volume-off.png create mode 100644 kuro/resources/volume/audio-volume-high.png create mode 100644 kuro/resources/volume/audio-volume-low.png create mode 100644 kuro/resources/volume/audio-volume-medium.png create mode 100644 kuro/resources/volume/audio-volume-muted-blocked.png create mode 100644 kuro/resources/volume/audio-volume-muted.png create mode 100644 kuro/resources/volume/audio-volume-off.png create mode 100644 kuro/resources/wifi/wireless-disconnected.png create mode 100644 kuro/resources/wifi/wireless-full.png create mode 100644 kuro/resources/wifi/wireless-high.png create mode 100644 kuro/resources/wifi/wireless-low.png create mode 100644 kuro/resources/wifi/wireless-medium.png create mode 100644 kuro/resources/wifi/wireless-none.png diff --git a/config.py b/config.py index 45cd90a..3638a27 100644 --- a/config.py +++ b/config.py @@ -26,24 +26,30 @@ # Import Theme from libqtile import hook +from libqtile.log_utils import logger try: from kuro.theme import Kuro Theme = Kuro() -except ImportError: - from kuro.base import BaseTheme - Kuro = None - Theme = BaseTheme() +except ImportError as e: + logger.error("Could not load Kuro Theme. Trying to load BaseTheme. Error: {}".format(e)) + try: + from kuro.base import BaseTheme as Kuro + Theme = Kuro() + except ImportError as e: + Kuro = None + raise ImportError("Could not load theme Config or BaseTheme! Error: {}".format(e)) # Import theme configuration try: from kuro.config import Config -except ImportError: +except ImportError as e: + logger.error("Could not load Kuro Config. Trying to load BaseConfig. Error: {}".format(e)) try: from kuro.baseconfig import BaseConfig as Config - except ImportError: + except ImportError as e: Config = None - raise ImportError("Could not load theme Config or BaseConfig!") + raise ImportError("Could not load theme Config or BaseConfig! Error: {}".format(e)) # Initialize the Theme Theme.initialize() @@ -92,3 +98,14 @@ floating_layout = Theme.floating_layout auto_fullscreen = Theme.auto_fullscreen focus_on_window_activation = Theme.focus_on_window_activation extentions = Theme.extensions + + +def main(qtile): + # set logging level + if Config.get('debug', False): + if Config.get('verbose', False): + qtile.cmd_debug() + else: + qtile.cmd_info() + else: + qtile.cmd_warning() diff --git a/kuro/base.py b/kuro/base.py index cf8b7bf..5886634 100644 --- a/kuro/base.py +++ b/kuro/base.py @@ -1,4 +1,6 @@ -from libqtile import layout as libqtile_layout +from libqtile import layout as libqtile_layout, layout, bar, widget +from libqtile.command import lazy +from libqtile.config import Key, Group, Screen, Drag, Click class BaseConfig: @@ -25,7 +27,22 @@ class BaseTheme: follow_mouse_focus = True bring_front_click = False cursor_warp = False - floating_layout = libqtile_layout.Floating() + floating_layout = libqtile_layout.Floating(float_rules=[ + {'wmclass': 'confirm'}, + {'wmclass': 'dialog'}, + {'wmclass': 'download'}, + {'wmclass': 'error'}, + {'wmclass': 'file_progress'}, + {'wmclass': 'notification'}, + {'wmclass': 'splash'}, + {'wmclass': 'toolbar'}, + {'wmclass': 'confirmreset'}, # gitk + {'wmclass': 'makebranch'}, # gitk + {'wmclass': 'maketag'}, # gitk + {'wname': 'branchdialog'}, # gitk + {'wname': 'pinentry'}, # GPG key password entry + {'wmclass': 'ssh-askpass'}, # ssh-askpass + ]) auto_fullscreen = True focus_on_window_activation = "smart" extensions = [] @@ -48,22 +65,88 @@ class BaseTheme: self.screens = self.init_screens() def init_keys(self): - return [] + return [ + # Switch between windows in current stack pane + Key(["mod4"], "k", lazy.layout.down()), + Key(["mod4"], "j", lazy.layout.up()), + + # Move windows up or down in current stack + Key(["mod4", "control"], "k", lazy.layout.shuffle_down()), + Key(["mod4", "control"], "j", lazy.layout.shuffle_up()), + + # Switch window focus to other pane(s) of stack + Key(["mod4"], "space", lazy.layout.next()), + + # Swap panes of split stack + Key(["mod4", "shift"], "space", lazy.layout.rotate()), + + # Toggle between split and unsplit sides of stack. + # Split = all windows displayed + # Unsplit = 1 window displayed, like Max layout, but still with + # multiple stack panes + Key(["mod4", "shift"], "Return", lazy.layout.toggle_split()), + Key(["mod4"], "Return", lazy.spawn("xterm")), + + # Toggle between different layouts as defined below + Key(["mod4"], "Tab", lazy.next_layout()), + Key(["mod4"], "w", lazy.window.kill()), + + Key(["mod4", "control"], "r", lazy.restart()), + Key(["mod4", "control"], "q", lazy.shutdown()), + Key(["mod4"], "r", lazy.spawncmd()), + ] def init_groups(self): - return [] + groups = [Group(i) for i in "asdfuiop"] + for i in groups: + self.keys.extend([ + # mod1 + letter of group = switch to group + Key(["mod4"], i.name, lazy.group[i.name].toscreen()), + + # mod1 + shift + letter of group = switch to & move focused window to group + Key(["mod4", "shift"], i.name, lazy.window.togroup(i.name)), + ]) + return groups def init_layouts(self): - return [] + return [ + layout.Max(), + layout.Stack(num_stacks=2) + ] def init_widget_defaults(self): - return {} + return dict( + font='sans', + fontsize=12, + padding=3, + ) def init_screens(self): - return [] + # noinspection PyUnresolvedReferences + return [ + Screen( + bottom=bar.Bar( + [ + widget.GroupBox(), + widget.Prompt(), + widget.WindowName(), + widget.TextBox("Kuro BaseConfig", foreground="#ff0000", name="default"), + widget.Systray(), + widget.Clock(format='%Y-%m-%d %a %I:%M %p'), + ], + 24, + ), + ), + ] def init_mouse(self): - return [] + return [ + Drag(["mod4"], "Button1", lazy.window.set_position_floating(), + start=lazy.window.get_position()), + Drag(["mod4"], "Button3", lazy.window.set_size_floating(), + start=lazy.window.get_size()), + Click(["mod4"], "Button2", lazy.window.bring_to_front()) + ] # Callbacks def callback_startup_once(self, *args, **kwargs): diff --git a/kuro/config.py b/kuro/config.py index 3c36627..9ec79b0 100644 --- a/kuro/config.py +++ b/kuro/config.py @@ -3,56 +3,110 @@ from kuro.base import BaseConfig # Config variables used in the main configuration class Config(BaseConfig): - # Show debug messages + # Show debug bar and messages debug = True + verbose = False # Default Applications app_terminal = "terminator" + app_launcher = "dmenu_run -i -p '»' -nb '#000000' -fn 'Noto Sans-11' -nf '#777777' -sb '#1793d0' -sf '#ffffff'" # Images desktop_bg = "/home/kevin/Pictures/wallpapers/desktop.png" + applauncher_image = "/home/kevin/.config/qtile/kuro/resources/arch.png" # Fonts font_default = "Noto Sans" font_topbar = "Noto Sans" font_clock = "Noto Sans" font_titlebar = "Noto Sans" - font_groupbox = "FontAwesome" # Font sizes fontsize_default = 11 fontsize_topbar = 11 fontsize_clock = 11 fontsize_titlebar = 11 - fontsize_groupbox = 15 # Sizes width_border = 1 margin_layout = 4 - width_groupbox_border = 1 - height_groupbox = 24 - margin_groupbox = 0 width_spacer = 1 padding_spacer = 4 - - # Variables - bool_groupbox_disable_drag = True - bool_groupbox_rounded_borders = True + grow_amount = 5 + width_zoomy_column = 300 # Colours colour_border_normal = "#333333" colour_border_focus = "#ffffff" + colour_border_urgent = "#774400" + colour_spacer_background = "#777777" + + # Groupbox variables + font_groupbox = "FontAwesome" + fontsize_groupbox = 15 + width_groupbox_border = 1 + height_groupbox = 24 + margin_groupbox = 0 + bool_groupbox_disable_drag = True + bool_groupbox_rounded_borders = True colour_groupbox_border_normal = "#333333" colour_groupbox_border_focus = "#aaaaaa" colour_groupbox_icon_active = "#ffffff" colour_groupbox_icon_inactive = "#777777" - colour_spacer_background = "#777777" + + # Tasklist variables + tasklist_border = "#ffffff" + tasklist_urgent_border = "#774400" + tasklist_font = "Noto Sans" + tasklist_fontsize = 11 + + # Thermal indicator variables + thermal_threshold = 75 + thermal_sensor = "Package id 0" + thermal_chip = "coretemp-isa-0000" + + # CPU graph variables + cpu_graph_colour = '#ff0000' + + # Memory graph variables + mem_graph_colour = '#ff00ff' + + # HDD graph variables + hdd_graph_colour = '#ffff00' # Battery variables battery_theme_path = "/home/kevin/.config/qtile/kuro/resources/battery" - battery_update_delay = 2 + battery_update_delay = 5 + + # Wifi variables + wifi_interface = "wlp4s0" + wifi_theme_path = "/home/kevin/.config/qtile/kuro/resources/wifi" + wifi_update_interval = 5 + + # Normal volume icon variables + volume_font = "Noto Sans" + volume_fontsize = 11 + volume_theme_path = "/home/kevin/.config/qtile/kuro/resources/volume" + volume_get_command = "pamixer --sink 0 --get-volume".split() + volume_mute_command = "pamixer --sink 0 -t".split() + volume_up_command = "pamixer --sink 0 -i 2".split() + volume_down_command = "pamixer --sink 0 -d 2".split() + volume_is_bluetooth_icon = False + volume_update_interval = 0.2 + + # Bluetooth volume icon variables + bluevol_font = "Noto Sans" + bluevol_fontsize = 11 + bluevol_theme_path = "/home/kevin/.config/qtile/kuro/resources/bluetooth_volume" + bluevol_get_command = "pamixer --sink {bsink} --get-volume".split() + bluevol_mute_command = "pamixer --sink {bsink} -t".split() + bluevol_up_command = "pamixer --sink {bsink} -i 2".split() + bluevol_down_command = "pamixer --sink {bsink} -d 2".split() + bluevol_is_bluetooth_icon = True + bluevol_update_interval = 0.2 # CheckUpdates variables updates_display_format = "{updates}" updates_execute_command = "terminator -e 'echo Updating\ via\ yaourt\ -Sayu...; yaourt -Sayu'" updates_colour_available = '#f4d742' + diff --git a/kuro/resources/arch.png b/kuro/resources/arch.png new file mode 100644 index 0000000000000000000000000000000000000000..362be656a644b4e63eb7fa28d1d92ee85c15c599 GIT binary patch literal 61146 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 VrM>EJd($|72-ij2EWBYK@gIg=ifRA= literal 0 HcmV?d00001 diff --git a/kuro/resources/bluetooth_volume/audio-volume-high.png b/kuro/resources/bluetooth_volume/audio-volume-high.png new file mode 100644 index 0000000000000000000000000000000000000000..a71479497efcbbf8bc06b76baa73d37bf1eb3cd6 GIT binary patch literal 3888 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 literal 0 HcmV?d00001 diff --git a/kuro/resources/bluetooth_volume/audio-volume-low.png b/kuro/resources/bluetooth_volume/audio-volume-low.png new file mode 100644 index 0000000000000000000000000000000000000000..3810a3a23e6d599022a585b5b58c11cb3bab59c1 GIT binary patch literal 2456 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 literal 0 HcmV?d00001 diff --git a/kuro/resources/bluetooth_volume/audio-volume-muted-blocked.png b/kuro/resources/bluetooth_volume/audio-volume-muted-blocked.png new file mode 100644 index 0000000000000000000000000000000000000000..5d049ce3281d1d2d1641241170ed40841e2182ba GIT binary patch literal 1928 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 Y7tkm7?aL!LoB#j-07*qoM6N<$f<8`kn*aa+ literal 0 HcmV?d00001 diff --git a/kuro/resources/bluetooth_volume/audio-volume-off.png b/kuro/resources/bluetooth_volume/audio-volume-off.png new file mode 100644 index 0000000000000000000000000000000000000000..8a6d8c5693e5340be4759844e76194f31da40654 GIT binary patch literal 1967 zcmV;g2T=HlP)4T8CFOw&Af;HKrKJ3YgdatSMHB*>2r-+@CY#-94?P33 zz1_Q$-BdQKe5FIvc{q5K9b-y<&N-6%&h*i4-)y5+Ns@;KV;}HSX?m)HiUmze} zN#j~4U>DE_NVx)PnShCpW)U`siIYLS3#z%!QeUBHH=3ado| z);h{#z#gD+DZ*-zfDvHI@vI(reksCgfdBy#p?d}V0HhrCHv(-@g|Bu31b7a3m3-A+ z1cv>;HtZmxYh29)1cToK)B!J&zv-C;esQ#2M?|l%Yy^l%orpXxBJCowUPRVZB94cH z5AZnJ(uZ*uxaW|uod~(ah0d2#>!yoqc_P(c-5+K*#-~alhOP8(yQ)=li*-GJT2bc%G1iVn$ z9`ugTLwrx?*8!Wy#>PHtX=&;42`NA(lOdT*+8zPmd7kr`51XrNLa*=9P}w!? z1T^}64LXrUZ;@?vJBUJn@4KHkcI?=@&CSid$z+mDCR1u4Rzx6RCw5oY4g3b={QG~< zv)f{++r~ozK<^7|1hnIDm!<~9fwjAL@7_N>Z6z!+B6z-8M|nM(n46)pKd}?g3fwU2 z+0ca6xPnfZ>Ky|b?%%&34;!>{uM+s3{Miem1GKmC@9#S5Z2;;*_2&J{grE&_0Zano zKrEF?Eqb0urB?|k;7XB!g}1S3>@HD&Mx~T8NU)*7R%kPVqLhjQbb}(DGyD+dW(z(w4Df0F#%CkxG0v;eg=Ezn$X5CfNNl;YDcXHI0#rl4FGKi zY?j+3CF;Ny9Q9VU2G|gFW}^}noq&i&tSFYyK5A0KRnJtlB_&B#!xFF=Hh4IbfgtM) zQmFE-dREOa2~dDq;U(ZApxl8~L;$dAG{D>`TCF(CtO3A^8o^E21135ASYIfb^n^o3 zR1L6thiV$Z7&?4y!xZ@;uLOEuQ1BWG^8=M@z|73d%nB@lZro`sGrHr7>P!JS5fNWg z8nJ7X!l41Svwrr>nKS2B;4qYMl&68)MwyEM^N{4KH;W@MY7(#r%$_`Xa`?i93*Rp+ zEM&?(2u09H+eWfKni7&gA{>V67U5xsy1{D>x@#s5D%`>nVKbpSx$FMl@O2}X%UvEA82IS?`SV}fmOv(xaV0KI1SDJ_-}kQpdK_(L zfm=q|CP!VT`hz1Zu9WhWQgceFNu|_XrPM_D@`c_8t{ypZWbpLq)2Ga^_{7A-EwoLE zvLo`)niobNZbNA%LYlFkD4~e@L$stt0hCfX5&0Y4ac^*N@Z(e}HMf8N{&z$~78VxL zCr+IB8tr<@@u%By=lG{79Mn!n-3;#JDNrT>ptVFq?xAPGJAVB5C*$MeQ+xOB-F5ct z+3!b3M=zq!`mXbNF}P-40hf)kHr(m2F-mCQawJCuow{!KJM$zu)O82At&~caBNlBK z&8*H<@}s~4>_g`VOr(LYD4~HB6YxNg$a=pcYtU=|o>IycoQNcnd=l=UKaB~aSQhyw z3O7`RFImnXO!!%(IFR!LnH7sflaK(u;bF=QwBdUN`$rJd!1+iosDWRM1Tp=vHZ=gR z;Xe3$O9|r_U^Rau6hM(b_&D$q?!g!PY^DIUK!AzeXrpUG8vR{CWYih~G2B7VEc(;A zCAr;NBOur|o7-Cj{ER!q?nJE-0Cp0tQDV>ULM?a!7XlZVL(hJBLTZ=*&?E@uoi~6A z&H}3hifE@zCu-3KEGr%nQ0)#>8;=O6b_c4Be*rSWZrU$<3&8*Y002ovPDHLkV1i|9 BoOb{K literal 0 HcmV?d00001 diff --git a/kuro/resources/volume/audio-volume-high.png b/kuro/resources/volume/audio-volume-high.png new file mode 100644 index 0000000000000000000000000000000000000000..a71479497efcbbf8bc06b76baa73d37bf1eb3cd6 GIT binary patch literal 3888 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 literal 0 HcmV?d00001 diff --git a/kuro/resources/volume/audio-volume-low.png b/kuro/resources/volume/audio-volume-low.png new file mode 100644 index 0000000000000000000000000000000000000000..3810a3a23e6d599022a585b5b58c11cb3bab59c1 GIT binary patch literal 2456 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 literal 0 HcmV?d00001 diff --git a/kuro/resources/volume/audio-volume-muted-blocked.png b/kuro/resources/volume/audio-volume-muted-blocked.png new file mode 100644 index 0000000000000000000000000000000000000000..5d049ce3281d1d2d1641241170ed40841e2182ba GIT binary patch literal 1928 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 Y7tkm7?aL!LoB#j-07*qoM6N<$f<8`kn*aa+ literal 0 HcmV?d00001 diff --git a/kuro/resources/volume/audio-volume-off.png b/kuro/resources/volume/audio-volume-off.png new file mode 100644 index 0000000000000000000000000000000000000000..8a6d8c5693e5340be4759844e76194f31da40654 GIT binary patch literal 1967 zcmV;g2T=HlP)4T8CFOw&Af;HKrKJ3YgdatSMHB*>2r-+@CY#-94?P33 zz1_Q$-BdQKe5FIvc{q5K9b-y<&N-6%&h*i4-)y5+Ns@;KV;}HSX?m)HiUmze} zN#j~4U>DE_NVx)PnShCpW)U`siIYLS3#z%!QeUBHH=3ado| z);h{#z#gD+DZ*-zfDvHI@vI(reksCgfdBy#p?d}V0HhrCHv(-@g|Bu31b7a3m3-A+ z1cv>;HtZmxYh29)1cToK)B!J&zv-C;esQ#2M?|l%Yy^l%orpXxBJCowUPRVZB94cH z5AZnJ(uZ*uxaW|uod~(ah0d2#>!yoqc_P(c-5+K*#-~alhOP8(yQ)=li*-GJT2bc%G1iVn$ z9`ugTLwrx?*8!Wy#>PHtX=&;42`NA(lOdT*+8zPmd7kr`51XrNLa*=9P}w!? z1T^}64LXrUZ;@?vJBUJn@4KHkcI?=@&CSid$z+mDCR1u4Rzx6RCw5oY4g3b={QG~< zv)f{++r~ozK<^7|1hnIDm!<~9fwjAL@7_N>Z6z!+B6z-8M|nM(n46)pKd}?g3fwU2 z+0ca6xPnfZ>Ky|b?%%&34;!>{uM+s3{Miem1GKmC@9#S5Z2;;*_2&J{grE&_0Zano zKrEF?Eqb0urB?|k;7XB!g}1S3>@HD&Mx~T8NU)*7R%kPVqLhjQbb}(DGyD+dW(z(w4Df0F#%CkxG0v;eg=Ezn$X5CfNNl;YDcXHI0#rl4FGKi zY?j+3CF;Ny9Q9VU2G|gFW}^}noq&i&tSFYyK5A0KRnJtlB_&B#!xFF=Hh4IbfgtM) zQmFE-dREOa2~dDq;U(ZApxl8~L;$dAG{D>`TCF(CtO3A^8o^E21135ASYIfb^n^o3 zR1L6thiV$Z7&?4y!xZ@;uLOEuQ1BWG^8=M@z|73d%nB@lZro`sGrHr7>P!JS5fNWg z8nJ7X!l41Svwrr>nKS2B;4qYMl&68)MwyEM^N{4KH;W@MY7(#r%$_`Xa`?i93*Rp+ zEM&?(2u09H+eWfKni7&gA{>V67U5xsy1{D>x@#s5D%`>nVKbpSx$FMl@O2}X%UvEA82IS?`SV}fmOv(xaV0KI1SDJ_-}kQpdK_(L zfm=q|CP!VT`hz1Zu9WhWQgceFNu|_XrPM_D@`c_8t{ypZWbpLq)2Ga^_{7A-EwoLE zvLo`)niobNZbNA%LYlFkD4~e@L$stt0hCfX5&0Y4ac^*N@Z(e}HMf8N{&z$~78VxL zCr+IB8tr<@@u%By=lG{79Mn!n-3;#JDNrT>ptVFq?xAPGJAVB5C*$MeQ+xOB-F5ct z+3!b3M=zq!`mXbNF}P-40hf)kHr(m2F-mCQawJCuow{!KJM$zu)O82At&~caBNlBK z&8*H<@}s~4>_g`VOr(LYD4~HB6YxNg$a=pcYtU=|o>IycoQNcnd=l=UKaB~aSQhyw z3O7`RFImnXO!!%(IFR!LnH7sflaK(u;bF=QwBdUN`$rJd!1+iosDWRM1Tp=vHZ=gR z;Xe3$O9|r_U^Rau6hM(b_&D$q?!g!PY^DIUK!AzeXrpUG8vR{CWYih~G2B7VEc(;A zCAr;NBOur|o7-Cj{ER!q?nJE-0Cp0tQDV>ULM?a!7XlZVL(hJBLTZ=*&?E@uoi~6A z&H}3hifE@zCu-3KEGr%nQ0)#>8;=O6b_c4Be*rSWZrU$<3&8*Y002ovPDHLkV1i|9 BoOb{K literal 0 HcmV?d00001 diff --git a/kuro/resources/wifi/wireless-disconnected.png b/kuro/resources/wifi/wireless-disconnected.png new file mode 100644 index 0000000000000000000000000000000000000000..8a2bc2451915134a9cea7115ae30ddf8ddb243a8 GIT binary patch literal 1499 zcmV<11tj{3P)152kPjnMN%(|`NJxy4X^fZ|+=#{r3>?V&MA*8Q;25xVxY4!r z-rXKQv?E*XZaZncy;=XsO>Xm?bII{SD-VHeVh2ySO!h=ZD+9<&L|H2X zNQlw^%yz(Rr2&}jfZ0j|FxvsMl}bzD0>DM|IeP@?18xF(A{$K=0J%W9fjt8#4&Pr- zWW%X41e|e}D@t_3sRAG~&TYDN|!88D~9k?I0w6xfpo13E!KTXp_b8~ZEYinzc(KAvdH8yEgS6An6^4)q* zv1KTYUT*2|x(pIP=D!MxAcSz7 zcx7X4d8YD`+T8_6N{dUYsogw=%Gw`u)B+rlCq~{eVvjagL%%ozLnaI>mVhd zBD*`46(zH_Hg4Q7B81pI7J_8}^z`&(HZ?UBRSpd=R0sO+1wSgitCQlAS?gs`NA2wi z2OpNIA-X!02Xm*r0MrQ~I;4~uSO|c_;m}wbpoSr*%fitxeauL@8=N5W~#^Iu{oX2o513) zmo4~Ur9Hbco`%l)1LroKyRuz{i@;w}N_Es`sdYeMVWAH60Il!)sBvk-_Yx zcl}EvZGN{q*pQv)4!3igaE98b2LuRhcg4~m*fK9g*n#D;()qLg8XVE_~pl%_9<`$=#yiDw%nhlgb+4hCa`dq5L;{t$`)OI1Y8Ds z34Lj$HdwmXCbnLc!d)8-?j;obEg2E8d>ObdrPRarOrR840t_)h@L*8@ za1Vl$5P-hX;K$fA!*&huL<=4)3?Nam)H)y;`Um0~Vopjf6Z`-G002ovPDHLkV1nAN BxPSlv literal 0 HcmV?d00001 diff --git a/kuro/resources/wifi/wireless-full.png b/kuro/resources/wifi/wireless-full.png new file mode 100644 index 0000000000000000000000000000000000000000..29d40a6530affbaeb91a8c59945a27a88a370c6b GIT binary patch literal 2055 zcmV+i2>ADjP)+tiIQhF0pulpYr0R$@el~4Qn`i2~*VO;>EQYl`%cu^V{7}+qj^o6pfUDCP5g>%9=3 z&-76er?V>n5JKz&`lz+EK|VQvC4~4IFrjrE(Dpt+2$2O2-M@eTch8?cFB*oiSU<|; z^1|Zc;vX(vy!bO92mjA)oe>36TLExGK7aM<)%Od9!lg_mldo2*)DOpT_6!aVzH{Zu zmEQt+*d75IW7l%P9-#O1>C+z=hJkI{p^Bzya^%R7R~jlMIxW1K^(5d2HRV|Hkd=lv3u_KU_wS6Tgm5ljGM5la>M? zgy;qiWV6}6$;ruI=JWafdY$R%>FLXtFHZ|0o>2osYa!5(0!o(yUP&2rySlfoU%&pV zbLYDya*s+h!pFjUqp-?!ty1H8O{A`v4TNMGVY=z$d`cIxb`4N!a*w~<4 zE;o$L%}siGdJbQ^cJ0?duir_X;S=pvm{-IBdx2~|pZ}p@7@^M&3rp6N~<<@7Ng?M`Yd3I$V zpj*@ZollZ7h)bM0(Z;Ln1Clf~No{sz1nAUeU|U{#`K)topUv(BAYlq5iGY`T9?-<| z_f2>BCyaCowv%AOy?}NEL`fh3{^##EZru3r=+UF^3L&;Ve^*Lb^YincUAlDXjz}$NKs@y}i9dewOQELbS zKmaMzG}D%4Z6m8NF-_BZ{+=kDy$EQ=MhKzZ3JW2cuL4p^rPJ1?QYoaA{&3bJ!6Xsj z*O5|cb3oKh3^nr$7@Vxb<1*PC~=6xK=0V>4tq56#@}? zfO=#}NL=7n=v$L~bcy>>oJXzH_*m(T-@sc-LsZ?6hIoMcR zTU){1*v!q%ed&>4)NmY!xw*M73E2<@0bm1iYHDhJX=!OO4uGYlrNybKsd;J#qw>Ln z2lwI@U#(Wn$;rt-x;C4)Zr%D*wOTdf?53xu?*S6nEEbEOmrA9@H~>ne(qge#{M@x` z$mhV{3<)9L0)CXqWPW<)%$bwNj~^fI>gr1Sb)=N`!-o$S?%cU^&$6t40AEpiiE;SE zi4$X|PM!LBHk*C3{@SHd>EE|+-~P+fr%(S5{L}sSkNf-kN6wx-`_9nN(7}3}a=E;5 z_wL=l6^q5c0t>)1;IQXkp->3)@6n@2e*gZZlv>jTAOrjW7;qPLfW~NXs2zkp1D1iO zzn@5~Se1dVl~U3@Q0<`x#GU}BaBVhS8^fJzuRGU1!e5p)-G#3!rIh}bOwo30l&p_?J@yQ0oY2Zz}gxymkM1#?HNW`H4B|< l%f1z*q?4uXugkYv{s;RFFI#W1MSuVR002ovPDHLkV1fY<-cJAk literal 0 HcmV?d00001 diff --git a/kuro/resources/wifi/wireless-high.png b/kuro/resources/wifi/wireless-high.png new file mode 100644 index 0000000000000000000000000000000000000000..b3622ec28f3c62e2058ea6487f9eb189bdeccd3c GIT binary patch literal 1669 zcmV;027394P)96lIk{1ycFUg5fVdeOtq@dvUV4U3lwc1Evt-KcEmK z5m9h~6wrS6?%i(|78XVg!;O=%a=lEocNuz#br#&1R34N~M*pt+q)iF${yQuC9-P zG&tK}1Bp|%k+pzo==y4P z=CfnAL1-?i*-?p*Qc8C+t1KY$F5m{bYGpjNY0?FvX94d2ZhL{L3_70^EE)+tJbS#`WvhzdC;W_$NY$WVMV^${Zgb|M~p+^WV+R&dyivTb8A@ z3sk#+a^Tx%D_tNB92prI`JuJ7^{sjn>h0})cVuMb)AsiE&v5^A+-^Z|O(y8Ber9lR zus4&*bQTH)mX?-0TcJ=OlgV@r4i5I>xJn~w?aFdmmZicY}?j~ z0TtQGwQdls{@qAgfN7dqE>MxJTsIH|*PI6Zu%$7;G)*lRsK{2Xn+bwZI}HNPq)gNF z9n`k%rUyMW}^mp`;MvFmNoHOul#K z%$dIK?(VKcBC)E5S4wH!zkmP1ty{P5n5OwB@Ce8PT|GTLAD%jO>Vs4&wdPBWnVFf# zH*enjb$)*S4`9;0{Z3n3+xutFp8cq^v$MUnPqA2BynXxj@1vumzX1<$3MGqd)<;u9 zh!)^5@TNPdgLMX20R90U1ApVZ?rsMTx&4!@MZxVi2h6(nI)EeYIBAbQru+NP+_Lf`QcUXQ@4cOC88bymQu>IEYyAXu%+el+x@%24I?V0vZ3LBI}hV;nkZIv P00000NkvXXu0mjfp-C7+ literal 0 HcmV?d00001 diff --git a/kuro/resources/wifi/wireless-low.png b/kuro/resources/wifi/wireless-low.png new file mode 100644 index 0000000000000000000000000000000000000000..1d06946204ce4742ec362eb700e05619fba1540a GIT binary patch literal 1053 zcmV+&1mgRNP)!L4=k&v;u)xQHe#m>>mI&w$i5EV4~ENMV5r1gS+_3T+iNgm^A2Y>NW6GZl8mPW?+(9L<@W-@oT_a%M&t zV>r$5ToZ7ON&wdcT;tRWPKOumNz&!uHObr|Whd|;;FG@ZO+$Rtq4Tr#XQem09 zz*#0gJfY3mq{1=_a6Sv$G7FFiDgj&*aE(d;*92Un62LV9*C&374n@a81B9Dgj&*aE-)3NC+Vaf|@ykdHwIv-4H}{KY*br z=`wSy073{4xU#ggbYo*<AQqBO7B7oM~M9n-6p68*po;?ASQbtNSu?q+xP)g0708&cp7BG`t zKq;kd1yD+rE&z&9wSc4oDW&xoFp~nD`dJ`q0h0un*%n|s2F$DgT5GE@AhOMr)fAB^ zfbaWOT_Cc}l+_fGDu7KFh-@=uHASQf;QKyWr^h&2>rxAll)y0EZg)HC0%@0&l5V%V z&F_WIBTL^$3HMpoNwtj=KmxMU>Gb;j{+mex^!xocold70)dRj*5K_S2vG04>ZGb%f z+dm0bnJ3|pl;!xOoZvO!Zllq7xVEGy+`SCYZ@;Edlgg8U6%zX>EOpt(#bMPJbMzDMHvoU6z z7RTm<5H*r#3u%nWbo27GQTB6#|Bce+@w3J+ XQI`3c7mjO900000NkvXXu0mjf`gz$? literal 0 HcmV?d00001 diff --git a/kuro/resources/wifi/wireless-medium.png b/kuro/resources/wifi/wireless-medium.png new file mode 100644 index 0000000000000000000000000000000000000000..6bd0ec53ec0d206a0014c94ef85aace7b18caf8e GIT binary patch literal 1360 zcmV-W1+V&vP)jtzD@!0(=2D3s(nvUn1ZbNCWPaG5*_|GCjrifk zV`pL4z*ic1M=z{SW@W}1I@^j*_xWEHLxexrF zI4lIj4dr~d*su@~7;Xs&T7jT(OF+;H1P$M#st_WA^8_Y_^UUrnY(Q$QtA5Yj4tym* z2yq8UB@&5LE|>czolf_km04L?S(%xcSrJ0K1$MR8zGilsssAz(+vJaH>`JvzLpr$CFqG-ZUEUGX``6{o~`~ zKLCk?g9G;W_s_MXqa%8HdY;V9&3zA~gb!%DZI5aTXuwPUQP8VB0p9)jX~#rTm_{ zEnEr#%`5;whvY~qFak_ut^&RjptUw7ptCH%4RpuwGU03E0`7vlfjc;@JW59u*3OpHr#S6R!njv)NAyg~C?@0|Q^ig5xy<3= zVZ&A~mq{j*k7s9RvpBBOF#Gdpp|yY*5YJ>X*-E7%nwfK@QW2R3qi0IJueLxS%7UyfMr?7D{jFBuBQbk zrLIR1R7x4gfOcFU)c*yb{awH`2zG=En3!|B77+Sv&@={|CE(g@gSKrO#elkOy>A)> zLmvaAltwO4m#z0(2!i3Z04b%B3)E%n{c95hrIcDq*>o|sZMQ{0STaGcQyE<>7N6H$ z;G(9KqF5}}-^kG0+uK_v4@B12*Gu(lfCEE)4?Oy`^CM+0{+9S0P>#`{VLAuFwL;%$~Hv9<8dKGA21Y; z$3LB%oE#q=9UYFvV$qW_N-1k~b@i{MrKP7*%0Gb@KpGex8yow4Vq)U6L?Usn>T_db z*F*;8c1@_befaLxk7K zuL5eoTdnnBgYhdx(+UwGL=^AcLTatgg?yKYINmivDl8{Mo&Mh7JLATe$^8$($(|7v S?xWQJ00002=n zD-dSmmtT}V`<;yx0|VnOPZ!6K ziaBp*pY>~YkZ|RXx*U?c=6~VK^S|vU=J{UHOL6pByj4$OW3K^E>M`q<_iJt$9FFnh z_Sx5%vp3E-?b{W`D>E2M8B7<88w9ey@MN3AQ2g)TjQa9V|6+@O!gH^+< zi`*TSf>z7^eG6ka-SN0gsjb2J0iU~U-==_{EsLXm#~-m^T~{b?Go{sQep6aW5{Jdt z9P@sIvh*a56D`T*YMlaJAY-J27w|1e`@(c9t!eM|`@ze757@qwyltub`u)nsR;*2H z_Al@Ac9`(>`xVK*t`}HVFt0F#IRLEl7^=|phDC?#y4ucbekt5m${7(fZTGDcH{;&b zeSNW+Nlf~__zzo#ojc#he$Ku4?c9ZRt`{YrZm#z|&wfSrL*3Qo>vnyK{Q8q)%KLJ5 p=K9Q4=4FB*>;cJ4z)=6g;BD!4YMa65dSFyDc)I$ztaD0e0swAR^0EK` literal 0 HcmV?d00001 diff --git a/kuro/theme.py b/kuro/theme.py index 671f208..57e458d 100644 --- a/kuro/theme.py +++ b/kuro/theme.py @@ -1,6 +1,3 @@ -import logging -import os - from libqtile.config import Key, Screen, Group, Drag, Click from libqtile.command import lazy from libqtile import layout, bar, widget @@ -21,7 +18,7 @@ except ImportError: raise ImportError("Could not load theme Config or BaseConfig!") # Initialize logging -log = logging.getLogger(__name__) +from libqtile.log_utils import logger as log class Kuro(BaseTheme): @@ -36,7 +33,7 @@ class Kuro(BaseTheme): super(Kuro, self).initialize() - # Update keys with keys for groups + # Update keys with keys for groups and layouts self.update_keys() def init_keys(self): @@ -57,20 +54,31 @@ class Kuro(BaseTheme): # Swap panes of split stack Key([self.mod, "shift"], "space", lazy.layout.rotate()), + # Fullscreen toggle + Key([self.mod], 'f', lazy.window.toggle_fullscreen()), + # Toggle between split and unsplit sides of stack. # Split = all windows displayed # Unsplit = 1 window displayed, like Max layout, but still with # multiple stack panes Key([self.mod, "shift"], "Return", lazy.layout.toggle_split()), + + # Super-Enter to start terminal Key([self.mod], "Return", lazy.spawn(Config.get('app_terminal', "xterm"))), + # Super-R to start dmenu_run + Key([self.mod], "r", lazy.spawn(Config.get('app_launcher', "dmenu_run"))), + + # Super-Shift-R to start spawncmd + Key([self.mod, "shift"], "r", lazy.spawncmd()), + + # Toggle between different layouts as defined below Key([self.mod], "Tab", lazy.next_layout()), Key([self.mod], "w", lazy.window.kill()), Key([self.mod, "control"], "r", lazy.restart()), Key([self.mod, "control"], "q", lazy.shutdown()), - Key([self.mod], "r", lazy.spawncmd()), # Key([self.mod, "shift"], "e", self.evaluate()), ] @@ -84,22 +92,28 @@ class Kuro(BaseTheme): log.debug("Initializing layouts") return [ - layout.Matrix(columns=2, - border_focus=Config.get('colour_border_focus', "#ffffff"), - border_normal=Config.get('colour_border_normal', "#777777"), - border_width=Config.get('width_border', "1"), - margin=Config.get('margin_layout', "0"), - ), + layout.Wmii( + border_focus=Config.get('colour_border_focus', "#ffffff"), + border_focus_stack=Config.get('colour_border_normal', "#777777"), + border_normal=Config.get('colour_border_normal', "#777777"), + border_normal_stack=Config.get('colour_border_normal', "#777777"), + border_width=Config.get('width_border', "1"), + grow_amount=Config.get('grow_amount', "5"), + margin=Config.get('margin_layout', "0"), + ), layout.Max(), - layout.Stack(num_stacks=2) + layout.Zoomy( + columnwidth=Config.get('width_zoomy_column', 150), + margin=Config.get('margin_layout', "0"), + ) ] def init_widget_defaults(self): log.debug("Initializing widget_defaults") return { - "font": Config.get('font_default', "Sans"), - "fontsize": Config.get('fontsize_default', 16), + "font": Config.get('font_topbar', "Sans"), + "fontsize": Config.get('fontsize_topbar', 16), "padding": 3, } @@ -107,11 +121,16 @@ class Kuro(BaseTheme): log.debug("Initializing screens") num_screens = utils.get_screen_count() + if num_screens == 0: + num_screens = 1 screens = [] for x in range(num_screens): widgets = [] widgets.extend([ + utils.AppLauncherIcon( + filename=Config.get('applauncher_image', 'apps.png') + ), utils.bar_separator(Config), widget.GroupBox( active=Config.get('colour_groupbox_icon_active', '#ffffff'), @@ -129,22 +148,114 @@ class Kuro(BaseTheme): utils.bar_separator(Config), widget.Prompt(**self.widget_defaults), - widget.WindowName(**self.widget_defaults), + widget.TaskList( + border=Config.get('tasklist_border', '#ffffff'), + borderwidth=Config.get('tasklist_borderwidth', 1), + font=Config.get('tasklist_font', 'Arial'), + fontsize=Config.get('tasklist_fontsize', 15), + highlight_method=Config.get('tasklist_highlight_method', 'border'), + max_title_width=Config.get('tasklist_max_title_width', 200), + rounded=Config.get('tasklist_rounded', True), + urgent_alert_method=Config.get('tasklist_urgent_alert_method', 'border'), + urgent_border=Config.get('tasklist_urgent_border', '#ff0000'), + margin=Config.get('margin_groupbox', 0) + ), + + utils.ThermalSensorWidget( + font=Config.get('font_topbar', 'Arial'), + fontsize=Config.get('fontsize_topbar', 16), + foreground=Config.get('thermal_colour', '#ffffff'), + foreground_alert=Config.get('thermal_colour_alert', '#ff0000'), + tag_sensor=Config.get('thermal_sensor', 'temp1'), + chip=Config.get('thermal_chip', None), + threshold=Config.get('thermal_threshold', 70) + ), widget.CPUGraph( - width=25, - border_color="#000000", - border_width=0, - line_width=1, - samples=10, + width=Config.get('cpu_width', 25), + border_color=Config.get('cpu_border_colour', "#000000"), + graph_color=Config.get('cpu_graph_colour', "#00ffff"), + border_width=Config.get('cpu_graph_width', 0), + line_width=Config.get('cpu_line_width', 1), + samples=Config.get('cpu_samples', 10), ), + + widget.MemoryGraph( + width=Config.get('mem_width', 25), + border_color=Config.get('mem_border_colour', "#000000"), + graph_color=Config.get('mem_graph_colour', "#00ffff"), + border_width=Config.get('mem_graph_width', 0), + line_width=Config.get('mem_line_width', 1), + samples=Config.get('mem_samples', 10), + ), + + widget.HDDBusyGraph( + width=Config.get('hdd_width', 25), + border_color=Config.get('hdd_border_colour', "#000000"), + graph_color=Config.get('hdd_graph_colour', "#00ffff"), + border_width=Config.get('hdd_border_width', 0), + line_width=Config.get('hdd_line_width', 1), + samples=Config.get('hdd_samples', 10), + ), + + widget.NetGraph( + width=Config.get('net_width', 25), + border_color=Config.get('net_border_colour', "#000000"), + graph_color=Config.get('net_graph_colour', "#00ffff"), + border_width=Config.get('net_border_width', 0), + line_width=Config.get('net_line_width', 1), + samples=Config.get('net_samples', 10), + ), + widget.BatteryIcon( battery_name=Config.get('battery_name', 'BAT0'), energy_full_file=Config.get('battery_energy_full_file', 'charge_full'), energy_now_file=Config.get('battery_energy_now_file', 'charge_now'), - theme_path=Config.get('battery_theme_path', '/home/docs/checkouts/readthedocs.org/user_builds/qtile/checkouts/latest/libqtile/resources/battery-icons'), + theme_path=Config.get('battery_theme_path', '/home/docs/checkouts/readthedocs.org/user_builds/qtile' + '/checkouts/latest/libqtile/resources/battery-icons'), update_delay=Config.get('battery_update_delay', 30) ), + + utils.WifiIconWidget( + interface=Config.get('wifi_interface', 'wlp4s0'), + theme_path=Config.get('wifi_theme_path', '/home/docs/checkouts/readthedocs.org/user_builds/qtile' + '/checkouts/latest/libqtile/resources/battery-icons'), + update_interval=Config.get('wifi_update_interval', 30) + ), + + utils.PulseVolumeWidget( + cardid=Config.get('volume_cardid', None), + channel=Config.get('volume_channel', 'Master'), + device=Config.get('volume_device', None), + font=Config.get('volume_font', 'Arial'), + fontsize=Config.get('volume_fontsize', 15), + foreground=Config.get('volume_foreground', '#ffffff'), + get_volume_command=Config.get('volume_get_command', None), + mute_command=Config.get('volume_mute_command', None), + theme_path=Config.get('volume_theme_path', '/home/docs/checkouts/readthedocs.org/user_builds/qtile' + '/checkouts/latest/libqtile/resources/volume-icons'), + volume_down_command=Config.get('volume_down_command', None), + volume_up_command=Config.get('volume_up_command', None), + is_bluetooth_icon=Config.get('volume_is_bluetooth_icon', False), + update_interval=Config.get('volume_update_interval', 0.2) + ), + + utils.PulseVolumeWidget( + cardid=Config.get('bluevol_cardid', None), + channel=Config.get('bluevol_channel', 'Master'), + device=Config.get('bluevol_device', None), + font=Config.get('bluevol_font', 'Arial'), + fontsize=Config.get('bluevol_fontsize', 15), + foreground=Config.get('bluevol_foreground', '#ffffff'), + get_volume_command=Config.get('bluevol_get_command', None), + mute_command=Config.get('bluevol_mute_command', None), + theme_path=Config.get('bluevol_theme_path', '/home/docs/checkouts/readthedocs.org/user_builds/qtile' + '/checkouts/latest/libqtile/resources/volume-icons'), + volume_down_command=Config.get('bluevol_down_command', None), + volume_up_command=Config.get('bluevol_up_command', None), + is_bluetooth_icon=Config.get('bluevol_is_bluetooth_icon', False), + update_interval=Config.get('bluevol_update_interval', 0.2) + ) ]) # Systray only on first screen @@ -152,7 +263,7 @@ class Kuro(BaseTheme): widgets.append(widget.Systray(**self.widget_defaults)) widgets.extend([ - utils.bar_separator(Config), + widget.CurrentLayoutIcon(), widget.Clock(format="%a %d %b, %H:%M", **self.widget_defaults), utils.CheckUpdatesYaourt( colour_no_updates=Config.get('updates_colour_none', '#ffffff'), @@ -168,13 +279,27 @@ class Kuro(BaseTheme): size=Config.get('height_groupbox', 30) ))) + # Add debug bars on each window if debugging is enabled + if Config.get('debug', False): + for x in range(num_screens): + widgets = [] + widgets.extend([ + widget.TextBox(" Debugging bar ", name="default", **self.widget_defaults), + widget.Notify(), + widget.DebugInfo() + ]) + screens[x].bottom = bar.Bar( + widgets=widgets, + size=Config.get('height_debugbar', 30) + ) + return screens def init_mouse(self): log.debug("Initializing mouse") # Drag floating layouts. - return [ + mouse = [ Drag([self.mod], "Button1", lazy.window.set_position_floating(), start=lazy.window.get_position()), Drag([self.mod], "Button3", lazy.window.set_size_floating(), @@ -182,6 +307,8 @@ class Kuro(BaseTheme): Click([self.mod], "Button2", lazy.window.bring_to_front()) ] + return mouse + def update_keys(self): log.debug("Updating keys") @@ -196,6 +323,30 @@ class Kuro(BaseTheme): Key([self.mod, "shift"], str(i + 1), lazy.window.togroup(g.name)) ) + # Keys for the Wmii layout + self.keys.extend([ + Key( + [self.mod, "shift", "control"], "l", + lazy.layout.grow_right() + ), + Key( + [self.mod, "shift"], "l", + lazy.layout.shuffle_right() + ), + Key( + [self.mod, "shift", "control"], "h", + lazy.layout.grow_left() + ), + Key( + [self.mod, "shift"], "h", + lazy.layout.shuffle_left() + ), + Key( + [self.mod], "s", + lazy.layout.toggle_split() + ) + ]) + def callback_startup(self): utils.execute("sleep 3") utils.execute_once("nitrogen --restore") diff --git a/kuro/utils.py b/kuro/utils.py index ad58367..adfd838 100644 --- a/kuro/utils.py +++ b/kuro/utils.py @@ -1,7 +1,27 @@ +import os import re import subprocess + +import cairocffi +import notify2 from libqtile import widget, bar +from libqtile.utils import catch_exception_and_warn, UnixCommandNotFound +from libqtile.widget import base +from libqtile.widget.battery import default_icon_path from libqtile.widget.check_updates import CheckUpdates +from libqtile.widget.image import Image +from libqtile.widget.sensors import ThermalSensor +from libqtile.widget.volume import Volume +from libqtile.widget.wlan import get_status +from libqtile.log_utils import logger +from notify2 import Notification, URGENCY_NORMAL +notify2.init("QTileWM") + +BUTTON_LEFT = 1 +BUTTON_MIDDLE = 2 +BUTTON_RIGHT = 3 +BUTTON_SCROLL_UP = 4 +BUTTON_SCROLL_DOWN = 5 def is_running(process): @@ -41,10 +61,355 @@ def bar_separator(config): ) +def notify(title, content, urgency=URGENCY_NORMAL, timeout=5000, image=None): + if image is not None: + notification = Notification( + summary=title, message=content, + icon=image + ) + else: + notification = Notification( + summary=title, message=content + ) + notification.set_timeout(timeout) + notification.set_urgency(urgency) + + return notification.show() + + +def bluetooth_audio_sink(): + try: + output = subprocess.check_output("pamixer --list-sinks".split()).decode("utf-8") + output = [x for x in output.split('\n') if "blue" in x.lower()] + except subprocess.CalledProcessError: + return -1 + + sink = -1 + try: + sink = int(output[0].split()[0]) + except IndexError: + pass + except AttributeError: + pass + except ValueError: + pass + + return sink + + +def bluetooth_audio_connected(): + return bluetooth_audio_sink() != -1 + + +class AppLauncherIcon(Image): + def button_press(self, x, y, button): + if button == BUTTON_LEFT: + execute("dmenu_run -i -p '»' -nb '#000000' -fn 'Noto Sans-11' -nf '#777777' -sb '#1793d0' -sf '#ffffff'") + + class CheckUpdatesYaourt(CheckUpdates): def __init__(self, **config): super(CheckUpdatesYaourt, self).__init__(**config) # Override command and output with yaourt command self.cmd = "yaourt -Qua".split() + self.status_cmd = "yaourt -Qua".split() + self.update_cmd = "yaourt -Sy" self.subtr = 0 + def _check_updates(self): + subprocess.check_output(self.update_cmd) + super(CheckUpdatesYaourt, self)._check_updates() + + def button_press(self, x, y, button): + if button == BUTTON_LEFT: + output = subprocess.check_output(self.status_cmd).decode('utf-8').split('\n') + + num_updates = len(output)-1 + msg = "{} updates available.".format(num_updates) + + if num_updates > 0: + msg += "\n\n" + for x in range(min(num_updates, 9)): + msg += output[x] + "\n" + if num_updates > 9: + msg += "and {} more...".format(num_updates-9) + + notify( + "System updates", + msg + ) + + elif button == BUTTON_MIDDLE and self.execute is not None: + subprocess.Popen(self.execute, shell=True) + + +class PulseVolumeWidget(Volume): + + defaults = [ + ("cardid", None, "Card Id"), + ("device", "default", "Device Name"), + ("channel", "Master", "Channel"), + ("padding", 3, "Padding left and right. Calculated if None."), + ("theme_path", None, "Path of the icons"), + ("update_interval", 0.2, "Update time in seconds."), + ("emoji", False, "Use emoji to display volume states, only if ``theme_path`` is not set." + "The specified font needs to contain the correct unicode characters."), + ("mute_command", None, "Mute command"), + ("volume_up_command", None, "Volume up command"), + ("volume_down_command", None, "Volume down command"), + ("get_volume_command", None, "Command to get the current volume"), + ("is_bluetooth_icon", False, "Is this icon for a Bluetooth Audio device?"), + ] + + _old_length = 0 + + def __init__(self, **config): + super(PulseVolumeWidget, self).__init__(**config) + self._old_length = self._length + + # Augment commands with bluetooth sink ID if this is a bluetooth icon + if self.is_bluetooth_icon and bluetooth_audio_connected(): + bsink = bluetooth_audio_sink() + self.mute_command = " ".join(self._user_config['mute_command']).format(bsink=bsink).split() + self.volume_up_command = " ".join(self._user_config['volume_up_command']).format(bsink=bsink).split() + self.volume_down_command = " ".join(self._user_config['volume_down_command']).format(bsink=bsink).split() + self.get_volume_command = " ".join(self._user_config['get_volume_command']).format(bsink=bsink).split() + logger.info("Updated bluetooth commands with bluetooth sink {}".format(bsink)) + self._length = self._old_length + self.commands_need_reset = False + elif self.is_bluetooth_icon: + self.commands_need_reset = True + else: + self.commands_need_reset = False + + self._old_length = self._length + + def reset_bluetooth_commands(self): + if self.is_bluetooth_icon and bluetooth_audio_connected(): + bsink = 0 if bluetooth_audio_sink() == -1 else bluetooth_audio_sink() + self.mute_command = " ".join(self._user_config['mute_command']).format(bsink=bsink).split() + self.volume_up_command = " ".join(self._user_config['volume_up_command']).format(bsink=bsink).split() + self.volume_down_command = " ".join(self._user_config['volume_down_command']).format(bsink=bsink).split() + self.get_volume_command = " ".join(self._user_config['get_volume_command']).format(bsink=bsink).split() + logger.info("Updated bluetooth commands with bluetooth sink {}".format(bsink)) + self._length = self._old_length + self.commands_need_reset = False + + def get_volume(self): + try: + get_volume_cmd = "echo 0".split() + + if self.get_volume_command: + if self.is_bluetooth_icon and bluetooth_audio_sink() == -1: + pass + else: + get_volume_cmd = self.get_volume_command + + mixer_out = self.call_process(get_volume_cmd) + except subprocess.CalledProcessError: + return -1 + + try: + return int(mixer_out.strip()) + except ValueError: + return -1 + + def _update_drawer(self): + super(PulseVolumeWidget, self)._update_drawer() + self.text = "" + if self.is_bluetooth_icon and not bluetooth_audio_connected(): + self._length = 0 + + def draw(self): + if self.is_bluetooth_icon and not bluetooth_audio_connected(): + if not self.commands_need_reset: + logger.info("Bluetooth device disconnected. Hiding bluetooth audio mixer") + self.commands_need_reset = True + base._TextBox.draw(self) + else: + if self.commands_need_reset: + self.reset_bluetooth_commands() + if self.theme_path: + self.drawer.draw(offsetx=self.offset, width=self.length) + else: + base._TextBox.draw(self) + + def button_press(self, x, y, button): + if button == BUTTON_LEFT: + volume = self.get_volume() + + width = 15 + + if volume >= 0: + volume_amount = round((volume/100)*width) + else: + volume_amount = 0 + + msg = "[{}{}]".format( + "".join(["#" for x in range(volume_amount)]), + "".join(["-" for x in range(width-volume_amount)]) + ) + + notify( + "{}Volume : {}%".format("Bluetooth " if self.is_bluetooth_icon else "", volume), + msg + ) + else: + super(PulseVolumeWidget, self).button_press(x, y, button) + + +class WifiIconWidget(base._TextBox): + """WiFi connection strength indicator widget.""" + + orientations = base.ORIENTATION_HORIZONTAL + defaults = [ + ('interface', 'wlan0', 'The interface to monitor'), + ('update_interval', 1, 'The update interval.'), + ('theme_path', default_icon_path(), 'Path of the icons'), + ('custom_icons', {}, 'dict containing key->filename icon map'), + ] + + def __init__(self, **config): + super(WifiIconWidget, self).__init__("WLAN", bar.CALCULATED, **config) + self.add_defaults(WifiIconWidget.defaults) + + if self.theme_path: + self.length_type = bar.STATIC + self.length = 0 + self.surfaces = {} + self.current_icon = 'wireless-disconnected' + self.icons = dict([(x, '{0}.png'.format(x)) for x in ( + 'wireless-disconnected', + 'wireless-none', + 'wireless-low', + 'wireless-medium', + 'wireless-high', + 'wireless-full', + )]) + self.icons.update(self.custom_icons) + + def _get_info(self): + try: + essid, quality = get_status(self.interface) + disconnected = essid is None + if disconnected: + return self.disconnected_message + + return { + 'error': False, + 'essid': essid, + 'quality': quality, + 'percent': (quality / 70) + } + except EnvironmentError: + logger.error( + '%s: Probably your wlan device is switched off or ' + ' otherwise not present in your system.', + self.__class__.__name__) + + return {'error': True} + + def timer_setup(self): + self.update() + self.timeout_add(self.update_interval, self.timer_setup) + + def _configure(self, qtile, bar): + super(WifiIconWidget, self)._configure(qtile, bar) + self.setup_images() + + def _get_icon_key(self): + key = 'wireless' + info = self._get_info() + if info is False or info.get('error'): + key += '-none' + elif info.get('essid') is None: + key += '-disconnected' + else: + percent = info['percent'] + if percent < 0.2: + key += '-low' + elif percent < 0.4: + key += '-medium' + elif percent < 0.8: + key += '-high' + else: + key += '-full' + + return key + + def update(self): + icon = self._get_icon_key() + if icon != self.current_icon: + self.current_icon = icon + self.draw() + + def draw(self): + if self.theme_path: + self.drawer.clear(self.background or self.bar.background) + self.drawer.ctx.set_source(self.surfaces[self.current_icon]) + self.drawer.ctx.paint() + self.drawer.draw(offsetx=self.offset, width=self.length) + else: + self.text = self.current_icon[8:] + base._TextBox.draw(self) + + def setup_images(self): + for key, name in self.icons.items(): + try: + path = os.path.join(self.theme_path, name) + img = cairocffi.ImageSurface.create_from_png(path) + except cairocffi.Error: + self.theme_path = None + logger.warning('Wireless Icon switching to text mode') + return + input_width = img.get_width() + input_height = img.get_height() + + sp = input_height / (self.bar.height - 1) + + width = input_width / sp + if width > self.length: + # cast to `int` only after handling all potentially-float values + self.length = int(width + self.actual_padding * 2) + + imgpat = cairocffi.SurfacePattern(img) + + scaler = cairocffi.Matrix() + + scaler.scale(sp, sp) + scaler.translate(self.actual_padding * -1, 0) + imgpat.set_matrix(scaler) + + imgpat.set_filter(cairocffi.FILTER_BEST) + self.surfaces[key] = imgpat + + +class ThermalSensorWidget(ThermalSensor): + defaults = [ + ('metric', True, 'True to use metric/C, False to use imperial/F'), + ('show_tag', False, 'Show tag sensor'), + ('update_interval', 2, 'Update interval in seconds'), + ('tag_sensor', None, + 'Tag of the temperature sensor. For example: "temp1" or "Core 0"'), + ('chip', None, 'Chip argument for sensors command'), + ( + 'threshold', + 70, + 'If the current temperature value is above, ' + 'then change to foreground_alert colour' + ), + ('foreground_alert', 'ff0000', 'Foreground colour alert'), + ] + + @catch_exception_and_warn(warning=UnixCommandNotFound, excepts=OSError) + def get_temp_sensors(self): + """calls the unix `sensors` command with `-f` flag if user has specified that + the output should be read in Fahrenheit. + """ + command = ["sensors", ] + if self.chip: + command.append(self.chip) + if not self.metric: + command.append("-f") + sensors_out = self.call_process(command) + return self._format_sensors_output(sensors_out)