From 0f7f16313ecfbe5f0e9f387cc8255a96a11369d7 Mon Sep 17 00:00:00 2001 From: Roland Thomas Date: Thu, 2 Mar 2023 22:05:15 -0500 Subject: [PATCH] Update --- .config/qtile/config.py | 227 ++++++++++--------- .config/qtile/config.py.old | 440 ------------------------------------ .config/qtile/dhk | 250 +++++++++++--------- 3 files changed, 256 insertions(+), 661 deletions(-) delete mode 100644 .config/qtile/config.py.old diff --git a/.config/qtile/config.py b/.config/qtile/config.py index 2272581..72ba46a 100644 --- a/.config/qtile/config.py +++ b/.config/qtile/config.py @@ -63,6 +63,63 @@ nord = { 'nord15':'#B48EAD', } + +def parse_task_text(text): + """ + Removes unwanted text from a given task string. + + Args: + text (str): The text to be cleaned. + + Returns: + str: The cleaned text. + """ + text = text.replace(" \u2014 Mozilla Firefox", "") + text = text.replace(" - qutebrowser", "") + text = text.replace(" - Discord", "") + return text + + +def get_wallpaper(screen_number): + """ + Returns the wallpaper path based on the size of the screen. + + Args: + screen_number (int): Index of the screen to get the wallpaper for. + + Returns: + str: The wallpaper path for the specified screen size. + + Raises: + IndexError: If the specified screen number is out of bounds. + """ + screens = run( + ["xrandr | grep '*' | awk '{ print $1 }'"], + shell=True, + capture_output=True, + encoding="utf-8", + ) + try: + size = screens.stdout.split()[screen_number] + except IndexError: + size = screens.stdout.split()[0] + + match size: + case "3440x1440": + wallpaper = f"{qtile_dir}gunter_wallpaper3440x1440_fill.png" + case "1920x1080": + wallpaper = f"{qtile_dir}gunter_throne.png" + case "3840x1080": + wallpaper = f"{qtile_dir}gunter_throne.png" + case "5760x1080": + wallpaper = f"{qtile_dir}gunter_throne.png" + case "1760x1262": + wallpaper = f"{qtile_dir}gunter_throne_1760x1262.png" + case _: + wallpaper = f"{qtile_dir}not_supported.png" + + return wallpaper + # Keys keys = [ # A list of available commands that can be bound to keys can be found @@ -171,11 +228,11 @@ discord_match = Match(wm_class="discord") obsidian_match = Match(wm_class="obsidian") xrdp_match = Match(wm_class="xfreerdp") vm_match = Match(wm_class="VirtualBox Machine") -groups.extend([Group("7", label='\ue007')]) -groups.extend([Group("8", matches=[obsidian_match], label='\ue13a')]) -groups.extend([Group("9", matches=[discord_match], label='\uf392')]) -groups.extend([Group("0", matches=[xrdp_match], label='\uf512', init=False, persist=False)]) -groups.extend([Group("o", matches=[vm_match], label='\uf511', init=False, persist=False)]) +groups.extend([Group("7", label='\ue007'), + Group("8", matches=[obsidian_match], label='\ue13a'), + Group("9", matches=[discord_match], label='\uf392'), + Group("0", matches=[xrdp_match], label='\uf512', init=False, persist=False), + Group("o", matches=[vm_match], label='\uf511', init=False, persist=False)]) for i in groups: keys.extend( @@ -189,6 +246,7 @@ for i in groups: desc=f"Switch to group {i.name}", ), # mod1 + shift + letter of group = move focused window to group + # switch_group=False stays with current group Key( [mod, "shift"], i.name, @@ -198,51 +256,6 @@ for i in groups: ] ) - -def get_hot_keys(): - mod_keys = { - 'mod4':'Super', - 'shift':'Shift', - 'control':'Control', - 'space':'Space', - } - - hot_keys = [] - key_chords = [] - - for key in keys: - if isinstance(key, Key): - if key.desc == "Launch terminal": - hot_keys.append("0000\n") - if key.desc == "Switch to group 1": - hot_keys.append("0000\n") - key_modifiers = ' + '.join([mod_keys[modifier] for modifier in key.modifiers]) - if len(key.key) == 1: - hot_keys.append(f"{key_modifiers} + {key.key}: {key.desc}\n") - elif len(key.key) > 1: - hot_keys.append(f"{key_modifiers} + {key.key.title()}: {key.desc}\n") - for key in keys: - if isinstance(key, KeyChord): - key_modifiers = ' + '.join([mod_keys[modifier] for modifier in key.modifiers]) - key_chords.append(f"{key_modifiers} + {key.key}: {key.name.upper()}\n") - for sub in key.submappings: - if isinstance(sub, Key): - key_chords.append(f" {sub.key}: {sub.desc}\n") - elif isinstance(key, KeyChord): - key_chords.append(f" {sub.key}: {sub.name.upper()}\n") - for map in sub.submappings: - key_chords.append(f" {map.key}: {map.desc}\n") - key_chords.append("0000\n") - - return ''.join(hot_keys), ''.join(key_chords) - -hot_key_text, key_chord_text = get_hot_keys() - -with open('/home/roland/.config/qtile/hotkeys.txt', 'w') as file: - file.write(hot_key_text) -with open('/home/roland/.config/qtile/keychords.txt', 'w') as file: - file.write(key_chord_text) - groups.extend( [ScratchPad("scratchpad", [ DropDown( @@ -368,40 +381,6 @@ clock = widget.Clock( padding=4, format="%Y-%m-%d %a %H:%M") - -def parse_task_text(text): - text = text.replace(' \u2014 Mozilla Firefox','') - text = text.replace(' - qutebrowser','') - text = text.replace(' - Discord','') - return text - - -def get_wallpaper(screen_number): - screens = run(["xrandr | grep '*' | awk '{ print $1 }'"], - shell=True, - capture_output=True, - encoding='utf-8') - try: - size = screens.stdout.split()[screen_number] - except IndexError: - size = screens.stdout.split()[0] - - match size: - case '3440x1440': - wallpaper = f'{qtile_dir}gunter_wallpaper3440x1440_fill.png' - case '1920x1080': - wallpaper = f'{qtile_dir}gunter_throne.png' - case '3840x1080': - wallpaper = f'{qtile_dir}gunter_throne.png' - case '5760x1080': - wallpaper = f'{qtile_dir}gunter_throne.png' - case '1760x1262': - wallpaper = f'{qtile_dir}gunter_throne_1760x1262.png' - case _: - wallpaper = f'{qtile_dir}not_supported.png' - - return wallpaper - screens = [ Screen( #Screen1 bottom=bar.Bar( @@ -957,32 +936,54 @@ wl_input_rules = None # wmname = "LG3D" wmname = f"qtile {VERSION}" -#mod_keys = { - #'mod4':'Super', - #'shift':'Shift', - #'control':'Control', - #'space':'Space', - #} -# -#hot_keys = [] -# -#for key in keys: - #if isinstance(key, Key): - #key_modifiers = ' + '.join([mod_keys[modifier] for modifier in key.modifiers]) - #if len(key.key) == 1: - #hot_keys.append(f"{key_modifiers} + {key.key}: {key.desc}\n") - #elif len(key.key) > 1: - #hot_keys.append(f"{key_modifiers} + {key.key.title()}: {key.desc}\n") -#for key in keys: - #if isinstance(key, KeyChord): - #key_modifiers = ' + '.join([mod_keys[modifier] for modifier in key.modifiers]) - #hot_keys.append(f"{key_modifiers} + {key.key}: {key.name.upper()}\n") - #for sub in key.submappings: - #if isinstance(sub, Key): - #hot_keys.append(f" {sub.key}: {sub.desc}\n") - #elif isinstance(key, KeyChord): - #hot_keys.append(f" {sub.key}: {sub.name.upper()}\n") - #for map in sub.submappings: - #hot_keys.append(f" {map.key}: {map.desc}\n") -# -#print(''.join(hot_keys)) + +def write_hot_keys(): + """ + Generates two text files containing the list of hot keys and key chords. + + Writes the list of hot keys and key chords to two separate text files + named "hotkeys.txt" and "keychords.txt", respectively. The text files are + saved in the directory specified by the qtile_dir variable. + """ + mod_keys = { + "mod4": "Super", + "shift": "Shift", + "control": "Control", + "space": "Space", + } + + hot_keys = [] + key_chords = [] + + for key in keys: + if isinstance(key, Key): + if key.desc == "Launch terminal": + hot_keys.append("0000\n") + if key.desc == "Switch to group 1": + hot_keys.append("0000\n") + key_modifiers = " + ".join([mod_keys[modifier] for modifier in key.modifiers]) + if len(key.key) == 1: + hot_keys.append(f"{key_modifiers} + {key.key}: {key.desc}\n") + elif len(key.key) > 1: + hot_keys.append(f"{key_modifiers} + {key.key.title()}: {key.desc}\n") + + for key in keys: + if isinstance(key, KeyChord): + key_modifiers = " + ".join([mod_keys[modifier] for modifier in key.modifiers]) + key_chords.append(f"{key_modifiers} + {key.key}: {key.name.upper()}\n") + for sub in key.submappings: + if isinstance(sub, Key): + key_chords.append(f" {sub.key}: {sub.desc}\n") + elif isinstance(key, KeyChord): + key_chords.append(f" {sub.key}: {sub.name.upper()}\n") + for map in sub.submappings: + key_chords.append(f" {map.key}: {map.desc}\n") + key_chords.append("0000\n") + + with open(f"{qtile_dir}hotkeys.txt", "w") as file: + file.write("".join(hot_keys)) + with open(f"{qtile_dir}keychords.txt", "w") as file: + file.write("".join(key_chords)) + + +write_hot_keys() diff --git a/.config/qtile/config.py.old b/.config/qtile/config.py.old deleted file mode 100644 index 1de1824..0000000 --- a/.config/qtile/config.py.old +++ /dev/null @@ -1,440 +0,0 @@ -# Copyright (c) 2010 Aldo Cortesi -# Copyright (c) 2010, 2014 dequis -# Copyright (c) 2012 Randall Mmeasure_mem='G'# 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. - -from libqtile import bar, layout, widget, extension -from libqtile.config import Click, Drag, Group, Key, Match, Screen, ScratchPad, DropDown -from libqtile.lazy import lazy -from libqtile.utils import guess_terminal -from unicodes import left_arrow, right_arrow, right_half_circle, lower_left_triangle - -mod = "mod4" -terminal = guess_terminal() -rofi= 'rofi -combi-modi window,drun,ssh -theme nord -font "hack 10" -show drun -icon-theme "Papirus" -show-icons' - -colors = { - 'purple':'#52497e', - 'teal':'#559d92', - 'dark_orange':'#9d6e55', - 'orange':'#e7510b', - 'dark_red':'#9d5560', - 'dark_blue':'#2e3440', - 'light_blue':'#8fbcbb', - 'blue':'#5e81ac', - 'red':'#bf616a', - 'dark_text':'#d8dee9', - } - -nord = { - 'nord0':'#2E3440', - 'nord1':'#3B4252', - 'nord2':'#434C5E', - 'nord3':'#4C566A', - 'nord4':'#D8DEE9', - 'nord5':'#E5E9F0', - 'nord6':'#ECEFF4', - 'nord7':'#8FBCBB', - 'nord8':'#88C0D0', - 'nord9':'#81A1C1', - 'nord10':'#5E81AC', - 'nord11':'#BF616A', - 'nord12':'#D08770', - 'nord13':'#EBCB8B', - 'nord14':'#A3BE8C', - 'nord15':'#B48EAD', - } - -keys = [ - # A list of available commands that can be bound to keys can be found - # at https://docs.qtile.org/en/latest/manual/config/lazy.html - # Switch between windows - Key([mod], "h", lazy.layout.left(), desc="Move focus to left"), - Key([mod], "l", lazy.layout.right(), desc="Move focus to right"), - Key([mod], "j", lazy.layout.down(), desc="Move focus down"), - Key([mod], "k", lazy.layout.up(), desc="Move focus up"), - Key([mod], "space", lazy.layout.next(), desc="Move window focus to other window"), - # 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"), - # 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"), - # Toggle between different layouts as defined below - Key([mod], "Tab", lazy.next_layout(), desc="Toggle between layouts"), - Key([mod], "w", lazy.window.kill(), desc="Kill focused window"), - Key([mod, "control"], "r", lazy.reload_config(), desc="Reload the config"), - Key([mod, "control"], "q", lazy.shutdown(), desc="Shutdown Qtile"), - Key([mod, "control"], "s", lazy.hide_show_bar()), - # Key([mod], "r", lazy.spawncmd(), desc="Spawn a command using a prompt widget"), - Key([mod], "r", lazy.run_extension(extension.DmenuRun(dmenu_prompt = ">"))), - Key([mod], "q", lazy.spawn(rofi), desc="Launch rofi"), - Key([mod], "z", lazy.run_extension(extension.WindowList())), -] - -groups = [Group(i) for i in "123456789"] - -for i in groups: - keys.extend( - [ - # mod1 + letter of group = switch to group - Key( - [mod], - i.name, - lazy.group[i.name].toscreen(), - desc="Switch to group {}".format(i.name), - ), - # mod1 + shift + letter of group = switch to & move focused window to group - #Key( - #[mod, "shift"], - #i.name, - #lazy.window.togroup(i.name, switch_group=True), - #desc="Switch to & move focused window to group {}".format(i.name), - #), - # 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.name, - lazy.window.togroup(i.name), - desc="move focused window to group {}".format(i.name) - ), - ] - ) - -layouts = [ - #layout.Columns(border_focus_stack=["#d75f5f", "#8f3d3d"], border_width=4), - # Try more layouts by unleashing below layouts. - #layout.Stack(num_stacks=2), - #layout.Bsp(), - #layout.Matrix(), - #layout.MonadThreeCol( - #main_centered=True, - #new_client_position='after_current', - #border_focus=colors['red'], - #border_normal=colors['blue'], - #border_width=2, - #margin=4 - #), - layout.MonadTall( - border_focus=colors['red'], - border_normal=colors['blue'], - border_width=2, - margin=8 - ), - #layout.Spiral(), - layout.Max(), - #layout.MonadWide(), - #layout.RatioTile(), - #layout.Tile(), - #layout.TreeTab(), - #layout.VerticalTile(), - #layout.Zoomy(), -] - -widget_defaults = dict( - #font="sans", - font="Hack Nerd Font Mono", - fontsize=14, - padding=4, -) -extension_defaults = widget_defaults.copy() - -screens = [ - Screen( - bottom=bar.Bar( - [ - widget.GroupBox( - background=colors['blue'], - block_highlight_text_color=colors['red'], - disable_drag=True, - this_screen_border=nord['nord11'], - this_current_screen_border=nord['nord13'], - #active=nord['nord6'], - ), - #lower_left_triangle(colors['blue'], colors['dark_blue']), - #right_arrow(colors['dark_blue'], colors['blue']), - # widget.Prompt(), - widget.CurrentLayoutIcon( - background=colors['blue'], - foreground=colors['dark_text'], - ), - widget.WindowCount( - background=colors['dark_blue'], - foreground=colors['dark_text'], - ), - widget.TaskList( - background=colors['dark_blue'], - foreground=colors['dark_text'], - ), - #widget.WindowName( - #background=colors['dark_blue'], - #foreground=colors['dark_text'], - #), - widget.Chord( - chords_colors={ - "launch": ("#ff0000", "#ffffff"), - }, - name_transform=lambda name: name.upper(), - ), - # widget.TextBox("default config", name="default"), - # widget.TextBox("Press <M-r> to spawn", foreground="#d75f5f"), - # NB Systray is incompatible with Wayland, consider using StatusNotifier instead - # widget.StatusNotifier(), - widget.Systray( - background=colors['dark_blue'], - ), - widget.OpenWeather( - background=nord['nord15'], - foreground=colors['dark_blue'], - cityid='4198514', - app_key='*****', - metric=False, - ), - #widget.TextBox( - #padding=1, - #background=colors['dark_blue'], - #), - #lower_left_triangle(colors['dark_blue'], colors['blue']), - #left_arrow(colors['dark_blue'], colors['blue']), - widget.Net( - background=nord['nord10'], - #background=colors['blue'], - foreground=colors['dark_blue'], - interface='net0', - ), - #widget.TextBox( - #padding=1, - #background=colors['blue'], - #), - #lower_left_triangle(colors['blue'], colors['dark_blue']), - #left_arrow(colors['blue'], colors['dark_blue']), - widget.Memory( - background=nord['nord14'], - #background=colors['dark_blue'], - foreground=colors['dark_blue'], - ), - #widget.TextBox( - #padding=1, - #background=colors['dark_blue'], - #), - #lower_left_triangle(colors['dark_blue'], colors['blue']), - #left_arrow(colors['dark_blue'], colors['blue']), - widget.CPU( - background=nord['nord13'], - foreground=colors['dark_blue'], - ), - widget.ThermalSensor( - tag_sensor='Package id 0', - format='{temp:.0f}{unit}', - background=nord['nord13'], - #background=colors['blue'], - foreground=colors['dark_blue'], - ), - widget.DF( - background=nord['nord12'], - foreground=colors['dark_blue'], - warn_sapce=40, - visible_on_warn=True, - ), - widget.DF( - background=nord['nord12'], - foreground=colors['dark_blue'], - partition='/home', - warn_sapce=40, - visible_on_warn=True, - ), - widget.ThermalSensor( - tag_sensor='Composite', - format='NVME:{temp:.0f}{unit}', - background=nord['nord12'], - #background=colors['blue'], - foreground=colors['dark_blue'], - ), - #widget.TextBox( - #padding=1, - #background=colors['blue'], - #), - #lower_left_triangle(colors['blue'], colors['dark_blue']), - #left_arrow(colors['blue'], colors['dark_blue']), - widget.Clock( - background=nord['nord11'], - foreground=colors['dark_blue'], - format="%Y-%m-%d %a %H:%M" - ), - # widget.QuickExit(), - ], - size=26, - border_width=[2, 2, 2, 2], # Draw top and bottom borders - border_color=[colors['blue'], colors['blue'], colors['blue'], colors['blue']], - margin=4, - ), - wallpaper='~/.config/qtile/background.jpg', - wallpaper_mode='fill', - ), - Screen( - bottom=bar.Bar([ - widget.GroupBox( - background=colors['blue'], - block_highlight_text_color=colors['red'], - disable_drag=True, - this_screen_border=nord['nord11'], - this_current_screen_border=nord['nord13'], - #active=nord['nord15'], - ), - widget.CurrentLayoutIcon( - background=colors['blue'], - foreground=colors['dark_blue'], - ), - widget.WindowCount( - background=colors['dark_blue'], - foreground=colors['dark_text'], - ), - widget.TaskList( - background=colors['dark_blue'], - foreground=colors['dark_text'], - ), - #widget.WindowName( - #background=colors['dark_blue'], - #foreground=colors['dark_text'], - #), - widget.Clock( - background=nord['nord11'], - foreground=colors['dark_blue'], - format="%Y-%m-%d %a %H:%M" - ), - ], - size=26, - border_width=[2, 2, 2, 2], # Draw top and bottom borders - border_color=[colors['blue'], colors['blue'], colors['blue'], colors['blue']], - margin=4, - ), - wallpaper='~/.config/qtile/background.jpg', - wallpaper_mode='fill', - ), - Screen( - bottom=bar.Bar([ - widget.GroupBox( - background=colors['blue'], - block_highlight_text_color=colors['red'], - disable_drag=True, - this_screen_border=nord['nord11'], - this_current_screen_border=nord['nord13'], - #active=nord['nord15'], - ), - widget.CurrentLayoutIcon( - background=colors['blue'], - foreground=colors['dark_text'], - ), - widget.WindowCount( - background=colors['dark_blue'], - foreground=colors['dark_text'], - ), - widget.TaskList( - background=colors['dark_blue'], - foreground=colors['dark_text'], - ), - #widget.WindowName( - #background=colors['dark_blue'], - #foreground=colors['dark_text'], - #), - widget.Clock( - background=nord['nord11'], - foreground=colors['dark_blue'], - format="%Y-%m-%d %a %H:%M" - ), - ], - size=26, - border_width=[2, 2, 2, 2], # Draw top and bottom borders - border_color=[colors['blue'], colors['blue'], colors['blue'], colors['blue']], - margin=4, - ), - wallpaper='~/.config/qtile/background.jpg', - wallpaper_mode='fill', - ), -] - -# 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(wm_class="confirmreset"), # gitk - Match(wm_class="makebranch"), # gitk - Match(wm_class="maketag"), # gitk - Match(wm_class="ssh-askpass"), # ssh-askpass - #Match(wm_class="VirtualBox Machine"), # virt box - Match(title="branchdialog"), # gitk - Match(title="pinentry"), # GPG key password entry - ] -) -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 = True - -# When using the Wayland backend, this can be used to configure input devices. -wl_input_rules = None - -# 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 maximize irony: it is a 3D non-reparenting WM written in -# java that happens to be on java's whitelist. -# wmname = "LG3D" -wmname = "qtile" diff --git a/.config/qtile/dhk b/.config/qtile/dhk index c94bab6..dc6a094 100755 --- a/.config/qtile/dhk +++ b/.config/qtile/dhk @@ -1,132 +1,166 @@ #!/usr/bin/env python3 +""" +This module creates a tabbed window that displays hotkeys and key chords. + +The hotkeys are read from two text files, "hotkeys.txt" and "keychords.txt". +The hotkeys are displayed in two tabs, "Hot Keys" and "Key Chords". + +The user can switch between the tabs using the "Alt+1" and "Alt+2" hotkeys, +and toggle between the tabs using the "Alt+n" hotkey. + +The window is created using PyQt5, which must be installed for this class to work. +""" import sys -from PyQt5.QtWidgets import QApplication, QMainWindow, QTabWidget, QWidget, QGridLayout, QLabel, QShortcut +from PyQt5.QtWidgets import ( + QApplication, + QMainWindow, + QTabWidget, + QWidget, + QGridLayout, + QLabel, + QShortcut, +) from PyQt5.QtGui import QKeySequence + class TabbedWindow(QMainWindow): - def __init__(self): - super().__init__() + """ + This class creates a tabbed window that displays hotkeys and key chords. - # Set the main window title and size - self.setWindowTitle("Display Hotkeys") - self.resize(300, 300) + The hotkeys are read from two text files, "hotkeys.txt" and "keychords.txt". + The hotkeys are displayed in two tabs, "Hot Keys" and "Key Chords". - # Create a tab widget - self.tab_widget = QTabWidget() - self.setCentralWidget(self.tab_widget) + The user can switch between the tabs using the "Alt+1" and "Alt+2" hotkeys, + and toggle between the tabs using the "Alt+n" hotkey. - # Create the first tab - self.tab1 = QWidget() - self.tab_widget.addTab(self.tab1, "Hot Keys") + The window is created using PyQt5, which must be installed for this module to work. + """ - # Create a vertical layout for the first tab - layout1 = QGridLayout() - layout1.setHorizontalSpacing(30) - layout1.setVerticalSpacing(10) + def __init__(self): + super().__init__() - with open('/home/roland/.config/qtile/hotkeys.txt', 'r') as file: - lines = file.readlines() - length = len(lines) + # Set the main window title and size + self.setWindowTitle("Display Hotkeys") + self.resize(300, 300) - # Add the numbers 1-100 to the layout - column = 0 + # Create a tab widget + self.tab_widget = QTabWidget() + self.setCentralWidget(self.tab_widget) + + # Create the first tab + self.tab1 = QWidget() + self.tab_widget.addTab(self.tab1, "Hot Keys") + + # Create a vertical layout for the first tab + layout1 = QGridLayout() + layout1.setHorizontalSpacing(30) + layout1.setVerticalSpacing(10) + + with open( + "/home/roland/.config/qtile/hotkeys.txt", encoding="UTF-8" + ) as file: + lines = file.readlines() + length = len(lines) + + # Add the numbers 1-100 to the layout + column = 0 + row = 0 + switch = False + even_odd = 0 + for i in range(length): + if lines[i] == "0000\n": + column += 1 row = 0 - switch = False - even_odd = 0 - for i in range(length): - #print(lines[i]) - if lines[i] == "0000\n": - column += 1 - row = 0 - continue - if lines[i] == "Super + 1: Switch to group 1\n": - switch = True - even_odd = i % 2 - if switch and even_odd == 0: - if i % 2 == 0: - label = QLabel(lines[i].strip()) - layout1.addWidget(label, row, column) - column += 1 - # layout1.addWidget(QLabel(' '), row, column) - # column += 1 - continue - else: - label = QLabel(lines[i].strip()) - layout1.addWidget(label, row, column) - row += 1 - column -= 1 - continue - elif switch and even_odd == 1: - if i % 2 == 1: - label = QLabel(lines[i].strip()) - layout1.addWidget(label, row, column) - column += 1 - # layout1.addWidget(QLabel(' '), row, column) - # column += 1 - continue - else: - label = QLabel(lines[i].strip()) - layout1.addWidget(label, row, column) - row += 1 - column -= 1 - continue - else: - label = QLabel(lines[i].strip()) - layout1.addWidget(label, row, column) - row += 1 + continue + if lines[i] == "Super + 1: Switch to group 1\n": + switch = True + even_odd = i % 2 + if switch and even_odd == 0: + if i % 2 == 0: + label = QLabel(lines[i].strip()) + layout1.addWidget(label, row, column) + column += 1 + continue + else: + label = QLabel(lines[i].strip()) + layout1.addWidget(label, row, column) + row += 1 + column -= 1 + continue + elif switch and even_odd == 1: + if i % 2 == 1: + label = QLabel(lines[i].strip()) + layout1.addWidget(label, row, column) + column += 1 + continue + else: + label = QLabel(lines[i].strip()) + layout1.addWidget(label, row, column) + row += 1 + column -= 1 + continue + else: + label = QLabel(lines[i].strip()) + layout1.addWidget(label, row, column) + row += 1 - # Set the layout for the first tab - self.tab1.setLayout(layout1) + # Set the layout for the first tab + self.tab1.setLayout(layout1) - # Create the second tab - self.tab2 = QWidget() - self.tab_widget.addTab(self.tab2, "Key Chords") + # Create the second tab + self.tab2 = QWidget() + self.tab_widget.addTab(self.tab2, "Key Chords") - # Create a vertical layout for the second tab - layout2 = QGridLayout() - layout2.setHorizontalSpacing(10) - layout2.setVerticalSpacing(10) - - with open('/home/roland/.config/qtile/keychords.txt', 'r') as file: - lines = file.readlines() - length = len(lines) + # Create a vertical layout for the second tab + layout2 = QGridLayout() + layout2.setHorizontalSpacing(10) + layout2.setVerticalSpacing(10) - # Add the numbers 101-200 to the layout - column = 0 + with open( + "/home/roland/.config/qtile/keychords.txt", encoding="UTF-8" + ) as file: + lines = file.readlines() + length = len(lines) + + # Add the numbers 101-200 to the layout + column = 0 + row = 0 + for i in range(length): + if lines[i] == "0000\n": + column += 1 row = 0 - for i in range(length): - #print(lines[i]) - if lines[i] == "0000\n": - column += 1 - row = 0 - continue - row += 1 - label = QLabel(lines[i].rstrip()) - layout2.addWidget(label, row, column) + continue + row += 1 + label = QLabel(lines[i].rstrip()) + layout2.addWidget(label, row, column) - # Set the layout for the second tab - self.tab2.setLayout(layout2) + # Set the layout for the second tab + self.tab2.setLayout(layout2) - # Assign hotkeys to open each tab - self.hotkey1 = QShortcut(QKeySequence("Alt+1"), self) - self.hotkey1.activated.connect(lambda: self.tab_widget.setCurrentWidget(self.tab1)) + # Assign hotkeys to open each tab + self.hotkey1 = QShortcut(QKeySequence("Alt+1"), self) + self.hotkey1.activated.connect( + lambda: self.tab_widget.setCurrentWidget(self.tab1) + ) - self.hotkey2 = QShortcut(QKeySequence("Alt+2"), self) - self.hotkey2.activated.connect(lambda: self.tab_widget.setCurrentWidget(self.tab2)) + self.hotkey2 = QShortcut(QKeySequence("Alt+2"), self) + self.hotkey2.activated.connect( + lambda: self.tab_widget.setCurrentWidget(self.tab2) + ) - # Assign a hotkey to toggle between the tabs - self.toggle_key = QShortcut(QKeySequence("Alt+n"), self) - self.toggle_key.activated.connect(self.toggle_tabs) + # Assign a hotkey to toggle between the tabs + self.toggle_key = QShortcut(QKeySequence("Alt+n"), self) + self.toggle_key.activated.connect(self.toggle_tabs) - def toggle_tabs(self): - current_index = self.tab_widget.currentIndex() - num_tabs = self.tab_widget.count() - next_index = (current_index + 1) % num_tabs - self.tab_widget.setCurrentIndex(next_index) + def toggle_tabs(self): + current_index = self.tab_widget.currentIndex() + num_tabs = self.tab_widget.count() + next_index = (current_index + 1) % num_tabs + self.tab_widget.setCurrentIndex(next_index) -if __name__ == '__main__': - app = QApplication(sys.argv) - window = TabbedWindow() - window.show() - sys.exit(app.exec_()) +if __name__ == "__main__": + app = QApplication(sys.argv) + window = TabbedWindow() + window.show() + sys.exit(app.exec_())