summaryrefslogtreecommitdiff
path: root/qtile
diff options
context:
space:
mode:
authorzachir <zachir@librem.one>2022-10-05 22:00:32 -0500
committerzachir <zachir@librem.one>2022-10-05 22:00:32 -0500
commitf39d735e2ba625a31a7dbf6fb8bdd62501379ad1 (patch)
treed17c96714c930e0b8bc75616cc9c81b961ed5aa0 /qtile
Initial Commit
Diffstat (limited to 'qtile')
-rw-r--r--qtile/config.py539
1 files changed, 539 insertions, 0 deletions
diff --git a/qtile/config.py b/qtile/config.py
new file mode 100644
index 0000000..4b13459
--- /dev/null
+++ b/qtile/config.py
@@ -0,0 +1,539 @@
+# Copyright (c) 2010 Aldo Cortesi
+# Copyright (c) 2010, 2014 dequis
+# Copyright (c) 2012 Randall Ma
+# Copyright (c) 2012-2014 Tycho Andersen
+# Copyright (c) 2012 Craig Barnes
+# Copyright (c) 2013 horsik
+# Copyright (c) 2013 Tao Sauvage
+#
+# Permission is hereby granted, free of charge, to any person obtaining a copy
+# of this software and associated documentation files (the "Software"), to deal
+# in the Software without restriction, including without limitation the rights
+# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+# copies of the Software, and to permit persons to whom the Software is
+# furnished to do so, subject to the following conditions:
+#
+# The above copyright notice and this permission notice shall be included in
+# all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+# SOFTWARE.
+
+import os
+import subprocess
+import psutil
+
+from typing import List # noqa: F401
+
+from libqtile import bar, hook, layout, qtile, widget
+from libqtile.config import Click, Drag, DropDown, Group, Key, Match, ScratchPad, Screen
+from libqtile.lazy import lazy
+
+mod = "mod1"
+if qtile.core.name == "x11":
+ terminal = 'st'
+ terminal_session = 'tabbed -c st -w'
+ # terminal_session = 'st -e '
+elif qtile.core.name == "wayland":
+ terminal = 'alacritty'
+ terminal_session = 'tabbed -c alacritty --embed'
+ # terminal_session = 'alacritty -e'
+
+computerrc = open('/home/zachir/.config/computerrc', 'r')
+Lines = computerrc.readlines()
+count = 0
+for line in Lines:
+ if ('inet' in Lines[count][:5]):
+ break
+ count += 1
+inet = Lines[count][5:-1]
+
+barcolor_cyan = "39c1ed"
+barcolor_black = "000000"
+barcolor_gray1 = "111111"
+barcolor_gray2 = "222222"
+barcolor_gray6 = "666666"
+barcolor_gray8 = "888888"
+barcolor_graya = "aaaaaa"
+barcolor_white = "ffffff"
+barcolor_red = "ff0000"
+barcolor_magenta = "ff00ff"
+
+def resize(qtile, direction):
+ layout = qtile.current_layout
+ child = layout.current
+ parent = child.parent
+
+ while parent:
+ if child in parent.children:
+ layout_all = False
+
+ if (direction == "left" and parent.split_horizontal) or (
+ direction == "up" and not parent.split_horizontal
+ ):
+ parent.split_ratio = max(5, parent.split_ratio - layout.grow_amount)
+ layout_all = True
+ elif (direction == "right" and parent.split_horizontal) or (
+ direction == "down" and not parent.split_horizontal
+ ):
+ parent.split_ratio = min(95, parent.split_ratio + layout.grow_amount)
+ layout_all = True
+
+ if layout_all:
+ layout.group.layout_all()
+ break
+
+ child = parent
+ parent = child.parent
+
+@lazy.function
+def resize_left(qtile):
+ resize(qtile, "left")
+
+@lazy.function
+def resize_right(qtile):
+ resize(qtile, "right")
+
+@lazy.function
+def resize_up(qtile):
+ resize(qtile, "up")
+
+@lazy.function
+def resize_down(qtile):
+ resize(qtile, "down")
+
+keys = [
+ # Switch between windows
+ Key([mod], "h", lazy.layout.left(), desc="Move focus down"),
+ Key([mod], "l", lazy.layout.right(), desc="Move focus up"),
+ Key([mod], "j", lazy.layout.down(), desc="Move focus down"),
+ Key([mod], "k", lazy.layout.up(), desc="Move focus up"),
+ Key([mod, "shift"], "space", lazy.layout.next(),
+ desc="Move window focus to other window"),
+
+ # swap columns
+ Key([mod, "shift", "control"], "h", lazy.layout.swap_column_left()),
+ Key([mod, "shift", "control"], "l", lazy.layout.swap_column_right()),
+
+ # Move windows between left/right columns or move up/down in current stack.
+ # Moving out of range in Columns layout will create new column.
+ Key([mod, "shift"], "h", lazy.layout.shuffle_left(),
+ desc="Move window to the left"),
+ Key([mod, "shift"], "l", lazy.layout.shuffle_right(),
+ desc="Move window to the right"),
+ Key([mod, "shift"], "j", lazy.layout.shuffle_down(),
+ desc="Move window down"),
+ Key([mod, "shift"], "k", lazy.layout.shuffle_up(), desc="Move window up"),
+
+ # Grow windows. If current window is on the edge of screen and direction
+ # will be to screen edge - window would shrink.
+ Key([mod, "control"], "h", lazy.layout.grow_left(),
+ desc="Grow window to the left"),
+ Key([mod, "control"], "l", lazy.layout.grow_right(),
+ desc="Grow window to the right"),
+ Key([mod, "control"], "j", lazy.layout.grow_down(),
+ desc="Grow window down"),
+ Key([mod, "control"], "k", lazy.layout.grow_up(), desc="Grow window up"),
+ Key([mod], "n", lazy.layout.normalize(), desc="Reset all window sizes"),
+
+ # Grow windows. If current window is on the edge of screen and direction
+ # will be to screen edge - window would shrink.
+ Key([mod, "mod4"], "h", resize_left,
+ desc="Grow window to the left"),
+ Key([mod, "mod4"], "l", resize_right,
+ desc="Grow window to the right"),
+ Key([mod, "mod4"], "j", resize_down,
+ desc="Grow window down"),
+ Key([mod, "mod4"], "k", resize_up, desc="Grow window up"),
+ Key([mod], "n", lazy.layout.normalize(), desc="Reset all window sizes"),
+
+ # 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([mod, "shift"], "Return", lazy.layout.toggle_split(),
+ desc="Toggle between split and unsplit sides of stack"),
+ Key([mod], "Return", lazy.spawn(terminal), desc="Launch terminal"),
+ Key([mod], "f", lazy.window.toggle_fullscreen(), desc="Toggle fullscreen"),
+ Key([mod, "shift"], "n", lazy.spawn('Qminimize -u'), desc="Unminimize window"),
+ Key([mod], "n", lazy.spawn('Qminimize -m'), desc="Minimize window"),
+ Key([mod], "space", lazy.window.toggle_floating(),
+ desc="Toggle floating"),
+
+ # Toggle between different layouts as defined below
+ Key([mod], "Tab", lazy.next_layout(), desc="Toggle between layouts"),
+ Key([mod, "shift"], "Tab", lazy.prev_layout(), desc="Toggle between layouts"),
+ Key([mod, "shift"], "q", lazy.window.kill(), desc="Kill focused window"),
+
+ Key([mod, "shift"], "r", lazy.restart(), desc="Restart Qtile"),
+ Key([mod, "shift"], "e", lazy.shutdown(), desc="Shutdown Qtile"),
+ #Key([mod], "r", lazy.spawncmd(),
+ #desc="Spawn a command using a prompt widget"),
+]
+
+groups = [Group(i) for i in "123456789"]
+
+groups += [
+ ScratchPad("scratchpad", [
+ DropDown("htop", terminal + " htop",
+ x=0.25, y=0.2, width=0.5, height=0.6,
+ on_focus_lost_hide=True, warp_pointer=True),
+ DropDown("term", terminal,
+ x=0.25, y=0.2, width=0.5, height=0.6,
+ on_focus_lost_hide=True, warp_pointer=True),
+ DropDown("alsa", terminal + " pulsemixer",
+ x=0.25, y=0.2, width=0.5, height=0.6,
+ on_focus_lost_hide=True, warp_pointer=True),
+ DropDown("blue", terminal + " bluetoothctl",
+ x=0.25, y=0.2, width=0.5, height=0.6,
+ on_focus_lost_hide=True, warp_pointer=True),
+ DropDown("ncmp", terminal + " ncmpcpp",
+ x=0.25, y=0.2, width=0.5, height=0.6,
+ on_focus_lost_hide=True, warp_pointer=True),
+ DropDown("mutt", terminal + " neomutt",
+ x=0.25, y=0.2, width=0.5, height=0.6,
+ on_focus_lost_hide=True, warp_pointer=True),
+ DropDown("prof", terminal + " /usr/bin/profanity",
+ x=0.25, y=0.2, width=0.5, height=0.6,
+ on_focus_lost_hide=True, warp_pointer=True),
+ DropDown("ircc", terminal + " /usr/bin/irssi",
+ x=0.25, y=0.2, width=0.5, height=0.6,
+ on_focus_lost_hide=True, warp_pointer=True),
+ DropDown("todo", terminal + " /usr/bin/todo",
+ x=0.25, y=0.2, width=0.5, height=0.6,
+ on_focus_lost_hide=True, warp_pointer=True),
+ DropDown("trem", terminal + " /usr/bin/tremc",
+ x=0.25, y=0.2, width=0.5, height=0.6,
+ on_focus_lost_hide=True, warp_pointer=True),
+ ])
+ ]
+
+@hook.subscribe.startup
+def autostart():
+ home = os.path.expanduser('~/.config/autostart.sh')
+ subprocess.call([home])
+
+keys.extend([
+ Key([mod, "control"], 'z', lazy.group['scratchpad'].dropdown_toggle('htop'),
+ desc="Toggle htop scratchpad"),
+ Key([mod, "control"], 'x', lazy.group['scratchpad'].dropdown_toggle('term'),
+ desc="Toggle terminal scratchpad"),
+ Key([mod, "control"], 'c', lazy.group['scratchpad'].dropdown_toggle('alsa'),
+ desc="Toggle alsamixer scratchpad"),
+ Key([mod, "control"], 'v', lazy.group['scratchpad'].dropdown_toggle('blue'),
+ desc="Toggle alsamixer scratchpad"),
+ Key([mod, "control"], 'b', lazy.group['scratchpad'].dropdown_toggle('ncmp'),
+ desc="Toggle ncmpcpp scratchpad"),
+ Key([mod, "control"], 'a', lazy.group['scratchpad'].dropdown_toggle('mutt'),
+ desc="Toggle neomutt scratchpad"),
+ Key([mod, "control"], 's', lazy.group['scratchpad'].dropdown_toggle('prof'),
+ desc="Toggle profanity scratchpad"),
+ Key([mod, "control"], 'd', lazy.group['scratchpad'].dropdown_toggle('ircc'),
+ desc="Toggle irssi scratchpad"),
+ Key([mod, "control"], 'f', lazy.group['scratchpad'].dropdown_toggle('todo'),
+ desc="Toggle todo.txt scratchpad"),
+ Key([mod, "control"], 'g', lazy.group['scratchpad'].dropdown_toggle('trem'),
+ desc="Toggle tremc scratchpad"),
+ ])
+
+for i in "123456789":
+ keys.extend([
+ # mod1 + letter of group = switch to group
+ Key([mod], i, lazy.group[i].toscreen(),
+ desc="Switch to group {}".format(i)),
+
+ # mod1 + shift + letter of group = switch to & move focused window to group
+ Key([mod, "shift"], i, lazy.window.togroup(i, switch_group=False),
+ desc="Switch to & move focused window to group {}".format(i)),
+ # Or, use below if you prefer not to switch to that group.
+ # # mod1 + shift + letter of group = move focused window to group
+ # Key([mod, "shift"], i, lazy.window.togroup(i),
+ # desc="move focused window to group {}".format(i)),
+ ])
+
+layouts = [
+ layout.Columns(
+ border_focus=barcolor_gray8,
+ border_focus_stack=barcolor_gray8,
+ border_normal=barcolor_black,
+ border_normal_stack=barcolor_black,
+ insert_position=1,
+ margin=5
+ ),
+ layout.Bsp(
+ border_focus=barcolor_gray8,
+ border_normal=barcolor_black,
+ fair=False,
+ margin=5
+ ),
+ # layout.Max(),
+ # Try more layouts by unleashing below layouts.
+ # layout.Stack(num_stacks=2),
+ # layout.Matrix(),
+ # layout.MonadTall(),
+ # layout.MonadWide(),
+ # layout.RatioTile(),
+ # layout.Tile(),
+ # layout.TreeTab(),
+ # layout.VerticalTile(),
+ # layout.Zoomy(),
+]
+
+widget_defaults = dict(
+ font='mononoki Nerd Font Mono',
+ fontsize=12,
+ padding=3,
+)
+extension_defaults = widget_defaults.copy()
+
+bar_array_1 = [
+ widget.WindowName(
+ background=barcolor_cyan,
+ foreground=barcolor_black,
+ format='{state}{name}'
+ ),
+ widget.Chord(
+ chords_colors={
+ 'launch': (barcolor_red, barcolor_white),
+ },
+ name_transform=lambda name: name.upper(),
+ ),
+ widget.TextBox("ZachIR", name="default",
+ background=barcolor_black,
+ foreground=barcolor_white
+ ),
+ widget.CPU(
+ background=barcolor_cyan,
+ foreground=barcolor_black,
+ format='CPU {load_percent}%',
+ update_interval=1.0
+ ),
+ widget.CPUGraph(
+ background=barcolor_cyan,
+ border_color=barcolor_black,
+ core='all',
+ fill_color=barcolor_graya,
+ graph_color=barcolor_white
+ ),
+ widget.Memory(
+ background=barcolor_black,
+ foreground=barcolor_white,
+ format='RAM {MemUsed: .0f}{mm}',
+ measure_mem='M',
+ measure_swap='M',
+ update_interval=1.0
+ ),
+ widget.MemoryGraph(
+ background=barcolor_black,
+ border_color=barcolor_cyan,
+ fill_color=barcolor_graya,
+ frequency=1,
+ graph_color=barcolor_white
+ ),
+ widget.Mpd2(
+ background=barcolor_cyan,
+ foreground=barcolor_black,
+ status_format='{play_status} {artist} - {title} \
+[{repeat}{random}{single}{consume}{updating_db}]',
+ idle_format='{idle_message}',
+ idle_message='MPD',
+ host=os.path.expanduser('~/.config/mpd/socket'),
+ prepare_status={
+ 'consume': 'c',
+ 'random': 'z',
+ 'repeat': 'r',
+ 'single': 'y',
+ 'updating_db': 'u' }
+ ),
+ widget.Net(
+ background=barcolor_black,
+ interface=inet
+ )
+ ]
+
+bar_array_2 = [
+ widget.Clock(
+ background=barcolor_black,
+ format='%Y-%m-%d %a %I:%M %p',
+ update_interval=1.0
+ ),
+ widget.QuickExit(
+ background=barcolor_cyan,
+ foreground=barcolor_black,
+ countdown_format='[ {}sec ]',
+ countdown_start=5,
+ default_text='[ exit ]',
+ timer_interval=1
+ )
+ ]
+
+bar_systray = [
+ widget.Systray(
+ background=barcolor_black
+ )
+ ]
+
+bar_battery = [
+ widget.Battery(
+ background=barcolor_cyan,
+ foreground=barcolor_black,
+ battery=0,
+ charge_char='+',
+ discharge_char='-',
+ empty_char='X',
+ format='{char}{percent:2.0%} {hour:d}:{min:02d}',
+ full_char='|',
+ low_foreground=barcolor_red,
+ low_percentage=0.15,
+ notify_below=0.15,
+ unknown_char='?',
+ update_interval=60
+ )
+ ]
+
+bar_no_battery = [
+ widget.TextBox("None", name="default",
+ background=barcolor_cyan,
+ foreground=barcolor_black
+ )
+ ]
+
+bar_1 = bar_array_1
+if (psutil.sensors_battery() != None):
+ bar_1 = bar_1 + bar_battery
+else:
+ bar_1 = bar_1 + bar_no_battery
+if qtile.core.name == "x11":
+ bar_1 = bar_1 + bar_systray
+bar_1 = bar_1 + bar_array_2
+
+bar_2 = bar_array_1
+if (psutil.sensors_battery() != None):
+ bar_2 = bar_2 + bar_battery
+else:
+ bar_2 = bar_2 + bar_no_battery
+bar_2 = bar_2 + bar_array_2
+
+screens = [
+ Screen(
+ top=bar.Bar(
+ [
+ widget.CurrentLayoutIcon(
+ background=barcolor_cyan,
+ foreground=barcolor_black,
+ scale=0.8
+ ),
+ widget.GroupBox(
+ active=barcolor_white,
+ background=barcolor_black,
+ center_aligned=True,
+ highlight_color=barcolor_gray1,
+ highlight_method='line',
+ inactive=barcolor_gray6,
+ margin_x=2,
+ margin_y=5,
+ other_current_screen_border=barcolor_gray2,
+ other_screen_border=barcolor_gray2,
+ padding_y=5,
+ padding_x=3,
+ this_current_screen_border=barcolor_white,
+ this_screen_border=barcolor_white,
+ urgent_alert_method='block',
+ urgent_border=barcolor_magenta,
+ urgent_text=barcolor_magenta
+ )
+ ] + bar_1,
+ 24,
+ ),
+ ),
+ Screen(
+ top=bar.Bar(
+ [
+ widget.CurrentLayoutIcon(
+ background=barcolor_cyan,
+ foreground=barcolor_black,
+ scale=0.8
+ ),
+ widget.GroupBox(
+ active=barcolor_white,
+ background=barcolor_black,
+ center_aligned=True,
+ highlight_color=barcolor_gray1,
+ highlight_method='line',
+ inactive=barcolor_gray6,
+ margin_x=2,
+ margin_y=5,
+ other_current_screen_border=barcolor_gray2,
+ other_screen_border=barcolor_gray2,
+ padding_y=5,
+ padding_x=3,
+ this_current_screen_border=barcolor_white,
+ this_screen_border=barcolor_white,
+ urgent_alert_method='block',
+ urgent_border=barcolor_magenta,
+ urgent_text=barcolor_magenta
+ )
+ ] + bar_2,
+ 24,
+ ),
+ ),
+]
+
+# Drag floating layouts.
+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())
+]
+
+dgroups_key_binder = None
+dgroups_app_rules = [] # type: List
+follow_mouse_focus = True
+bring_front_click = False
+cursor_warp = False
+floating_layout = layout.Floating(float_rules=[
+ # Run the utility of `xprop` to see the wm class and name of an X client.
+ # *layout.Floating.default_float_rules,
+ Match(title='FX: Track 1'), # REAPER
+ Match(title='Add FX to: Track 1'), # REAPER
+ Match(title='REAPER (loading)'), # REAPER
+ Match(title='REAPER Query'), # REAPER
+ Match(title='REAPER (initializing)'), # REAPER
+ Match(title='Browse FX'), # REAPER
+ Match(title='Ardour - Preferences'), # ardour
+ Match(wm_instance_class='import'), # ardour
+ Match(wm_class='ardour-6.9.0'), # ardour
+ #Match(wm_class="lin-vst-servertrack.exe.so"), #linvst
+ Match(title='Edit Text on the Schematic:'), # LTspiceXVII
+ Match(wm_class='confirmreset'), # gitk
+ Match(wm_class='makebranch'), # gitk
+ Match(wm_class='maketag'), # gitk
+ Match(title='branchdialog'), # gitk
+ Match(wm_class='ssh-askpass'), # ssh-askpass
+ Match(title='Create Snapshot'), # timeshift-gtk
+ Match(title='pinentry'), # GPG key password entry
+], border_focus=barcolor_gray8, border_normal=barcolor_black)
+auto_fullscreen = False
+focus_on_window_activation = "smart"
+reconfigure_screens = True
+
+# If things like steam games want to auto-minimize themselves when losing
+# focus, should we respect this or not?
+auto_minimize = False
+
+# XXX: Gasp! We're lying here. In fact, nobody really uses or cares about this
+# string besides java UI toolkits; you can see several discussions on the
+# mailing lists, GitHub issues, and other WM documentation that suggest setting
+# this string if your java app doesn't work correctly. We may as well just lie
+# and say that we're a working one by default.
+#
+# We choose LG3D to ], border_focus='', border_normal=''aximize irony: it is a 3D non-reparenting WM written in
+# java that happens to be on java's whitelist.
+# wmname = "LG3D"