import psutil import subprocess from libqtile import bar, extension, hook, layout, widget from libqtile.config import Click, Drag, DropDown, Group, Key, Match, ScratchPad, Screen from libqtile.dgroups import simple_key_binder from libqtile.lazy import lazy groups = [ Group("1", label="\uf292"), Group("2", label="\uf738", matches=[Match(wm_class=["firefox"])]), Group("3", label="\uf70d", matches=[Match(wm_class=["Ferdium"])]), Group("4", label="\uf7aa", matches=[Match(wm_class=["mutt"])]), Group("5", label="\uf120"), Group("6", label="\uf120"), Group("7", label="\ufc58"), Group("8", label="\uf9b0", matches=[Match(wm_class=["Slack"])]), Group("9", label="\uf296"), Group("0", label="\uf2bb", matches=[Match(wm_class=["workfx"])]), ScratchPad("scratchpad", [ DropDown( "spterm", "sh -c 'BROWSER=firefox st'", on_focus_lost_hide=False, width=0.40, height=0.20, x=0.30, y=0.25, ), DropDown( "spwork", "sh -c 'BROWSER=workfx st -n work'", on_focus_lost_hide=False, width=0.40, height=0.20, x=0.30, y=0.25, ), ]), ] mod = "mod4" keys = [ # switch between windows Key([mod], "h", lazy.layout.left()), Key([mod], "l", lazy.layout.right()), Key([mod], "j", lazy.layout.down()), Key([mod], "k", lazy.layout.up()), # move windows Key([mod, "control"], "h", lazy.layout.shuffle_left()), Key([mod, "control"], "l", lazy.layout.shuffle_right()), Key([mod, "control"], "j", lazy.layout.shuffle_down()), Key([mod, "control"], "k", lazy.layout.shuffle_up()), # resize windows Key([mod, "shift"], "h", lazy.layout.grow_left()), Key([mod, "shift"], "l", lazy.layout.grow_right()), Key([mod, "shift"], "j", lazy.layout.grow_down()), Key([mod, "shift"], "k", lazy.layout.grow_up()), Key([mod, "shift"], "0", lazy.layout.normalize()), # app binds Key([mod], "Return", lazy.spawn("sh -c 'BROWSER=firefox st'")), Key([mod], "space", lazy.spawncmd()), Key([mod], "e", lazy.group["scratchpad"].dropdown_toggle('spterm')), Key([mod], "i", lazy.spawn("scrot -f -s 'scrot_%Y-%m-%d_%H-%M-%S_%s.png'")), Key([mod], "m", lazy.spawn("sh -c 'pgrep -x neomutt > /dev/null || BROWSER=firefox st -n mutt -e neomutt'")), Key([mod, "shift"], "e", lazy.group["scratchpad"].dropdown_toggle('spwork')), Key([mod, "shift"], "i", lazy.spawn("scrot -f 'scrot_%Y-%m-%d_%H-%M-%S_%s.png'")), Key([mod, "shift"], "Return", lazy.spawn("sh -c 'BROWSER=workfx st -n work'")), Key([mod, "control"], "a", lazy.spawn("dmenu-audio")), Key([mod, "control"], "b", lazy.spawn("dmenu-bluetooth")), Key([mod, "control"], "e", lazy.spawn("dmenu-emoji")), Key([mod, "control"], "d", lazy.spawn("dmenu-display")), # WM control Key([mod], "q", lazy.window.kill()), Key([mod, "control", "shift"], "l", lazy.spwan("slock")), Key([mod, "control", "shift"], "q", lazy.shutdown()), Key([mod, "control", "shift"], "r", lazy.reload_config()), # media keys Key([], "XF86AudioMute", lazy.spawn("pactl set-sink-mute @DEFAULT_SINK@ toggle")), Key([], "XF86AudioMicMute", lazy.spawn("key-micmute")), Key([], "XF86AudioRaiseVolume", lazy.spawn("pactl set-sink-volume @DEFAULT_SINK@ +5%")), Key([], "XF86AudioLowerVolume", lazy.spawn("pactl set-sink-volume @DEFAULT_SINK@ -5%")), Key([], "XF86MonBrightnessUp", lazy.spawn("xbacklight -inc 10")), Key([], "XF86MonBrightnessDown", lazy.spawn("xbacklight -dec 10")), ] dgroups_key_binder = simple_key_binder(mod) dgroups_app_rules = [] # type: list layouts = [ layout.Columns( border_focus='#ffffff', border_normal="#272822", border_width=2, insert_position=1, margin=[5, 5, 5, 5] ), ] widget_defaults = dict( foreground="#f8f8f2", background="#272822", font="RobotoMono Nerd Font", fontsize=13, ) extension_defaults = widget_defaults.copy() screens = [ Screen( top=bar.Bar( [ widget.GroupBox( disable_drag=True, highlight_method='block', rounded=False, this_current_screen_border='#005577', this_screen_border='#f8f8f2', urgent_border='#770000', urgent_text='#ffffff', ), widget.Prompt( prompt='open: ', record_history=False, ), widget.Spacer(), widget.GenPollText( update_interval=0.2, func=lambda: subprocess.check_output("sb-emerge").decode(), ), widget.GenPollText( update_interval=0.2, func=lambda: subprocess.check_output("sb-mail").decode(), ), widget.GenPollText( update_interval=0.2, func=lambda: subprocess.check_output("sb-volume").decode(), ), widget.GenPollText( update_interval=0.2, func=lambda: subprocess.check_output("sb-network").decode(), ), widget.Battery( format='\uf241 {char} {percent:2.0%}', charge_char="\uf077", discharge_char="\uf078", full_char="\uf102", unknown_char="\uf444", ), widget.Clock( format='\uf073 [%d] %I:%M:%S %p' ), widget.Sep(padding=15, size_percent=60), widget.Systray(), ], 24, margin=[5, 5, 5, 5] ), ), ] mouse = [ Drag([mod], "Button1", lazy.window.set_position_floating(), start=lazy.window.get_position()), Drag([mod], "Button3", lazy.window.set_size_floating(), start=lazy.window.get_size()), Click([mod], "Button2", lazy.window.bring_to_front()), ] floating_layout = layout.Floating( float_rules=[ *layout.Floating.default_float_rules, ], border_focus='#ffffff', border_normal="#272822", border_width=2, ) # @hook.subscribe.client_new # def _swallow(window): # pid = window.window.get_net_wm_pid() # ppid = psutil.Process(pid).ppid() # cpids = {c.window.get_net_wm_pid(): wid for wid, c in window.qtile.windows_map.items()} # for i in range(5): # if not ppid: # return # if ppid in cpids: # parent = window.qtile.windows_map.get(cpids[ppid]) # parent.minimized = True # window.parent = parent # return # ppid = psutil.Process(ppid).ppid() # @hook.subscribe.client_killed # def _unswallow(window): # if hasattr(window, 'parent'): # window.parent.minimized = False auto_fullscreen = True auto_minimize = True bring_front_click = False cursor_warp = False focus_on_window_activation = "smart" follow_mouse_focus = True reconfigure_screens = True wmname = "LG3D"