Update
This commit is contained in:
		| @@ -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() | ||||
|   | ||||
| @@ -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" | ||||
| @@ -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_()) | ||||
|   | ||||
		Reference in New Issue
	
	Block a user