Initial commit
This commit is contained in:
		
							
								
								
									
										2
									
								
								.gitignore
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										2
									
								
								.gitignore
									
									
									
									
										vendored
									
									
										Normal file
									
								
							| @ -0,0 +1,2 @@ | ||||
| __pycache__ | ||||
| config.py.default | ||||
							
								
								
									
										6
									
								
								autostart.sh
									
									
									
									
									
										Executable file
									
								
							
							
						
						
									
										6
									
								
								autostart.sh
									
									
									
									
									
										Executable file
									
								
							| @ -0,0 +1,6 @@ | ||||
| #!/bin/bash | ||||
| nitrogen --restore | ||||
| mailspring --background & | ||||
| dunst & | ||||
| picom & | ||||
| setxkbmap -model pc105 -layout us,ru -option grp:caps_toggle | ||||
							
								
								
									
										304
									
								
								config.py
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										304
									
								
								config.py
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,304 @@ | ||||
| # 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. | ||||
|  | ||||
| from libqtile import bar, layout, widget, hook | ||||
| from libqtile.config import Click, Drag, Group, ScratchPad, DropDown, Key, Match, Screen | ||||
| from libqtile.lazy import lazy | ||||
| from libqtile.utils import guess_terminal | ||||
| from libqtile.widget import base | ||||
| from abc import ABCMeta, abstractmethod | ||||
| import re | ||||
| import os | ||||
| import subprocess | ||||
|  | ||||
| mod = "mod4" | ||||
| terminal = guess_terminal() | ||||
|  | ||||
|  | ||||
| @hook.subscribe.startup_once | ||||
| def autostart(): | ||||
|     home = os.path.expanduser('~/.config/qtile/autostart.sh') | ||||
|     subprocess.run([home]) | ||||
|  | ||||
|  | ||||
| @hook.subscribe.screen_change | ||||
| def restart_on_randr(_): | ||||
|     lazy.reload_config() | ||||
|  | ||||
|  | ||||
| class _BaseLayoutBackend(metaclass=ABCMeta): | ||||
|     def __init__(self, qtile): | ||||
|         pass | ||||
|  | ||||
|     @abstractmethod | ||||
|     def get_keyboard(self) -> str: | ||||
|         pass | ||||
|  | ||||
|  | ||||
| class _X11LayoutBackend(_BaseLayoutBackend): | ||||
|     def get_keyboard(self) -> str: | ||||
|         try: | ||||
|             command = "xkb-switch" | ||||
|             xkb_switch_out = subprocess.check_output(command).decode() | ||||
|         except subprocess.CalledProcessError: | ||||
|             return "unknown error" | ||||
|         except OSError: | ||||
|             return "xkb-switch is not installed" | ||||
|  | ||||
|         return xkb_switch_out | ||||
|  | ||||
|  | ||||
| class MyKeyboardLayout(base.InLoopPollText): | ||||
|     defaults = [ | ||||
|         ("update_interval", 1, "Update time in seconds.") | ||||
|     ] | ||||
|  | ||||
|     def __init__(self, **config): | ||||
|         base.InLoopPollText.__init__(self, **config) | ||||
|         self.add_defaults(MyKeyboardLayout.defaults) | ||||
|  | ||||
|     def _configure(self, qtile, bar): | ||||
|         base.InLoopPollText._configure(self, qtile, bar) | ||||
|         self.backend = _X11LayoutBackend(qtile) | ||||
|  | ||||
|     def poll(self): | ||||
|         keyboard = self.backend.get_keyboard() | ||||
|         return "\n"+keyboard.upper() | ||||
|  | ||||
|  | ||||
| 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], "r", 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, "shift"], "Tab", lazy.window.toggle_floating(), desc="Toggle floating of current window"), | ||||
|     Key([mod], "q", 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], "d", lazy.spawn("rofi -show drun"), desc="Launch application using rofi"), | ||||
|     Key([mod], "c", lazy.spawn("rofi -show run"), desc="Spawn a command using rofi"), | ||||
|     Key([mod], "w", lazy.spawn("rofi -show window"), desc="Spawn window selection using rofi"), | ||||
|     Key([mod], "p", lazy.spawn("/home/nefrace/.local/bin/shotgun-rect-clip"), desc="Open Spectacle to screenshot"), | ||||
|     Key([mod], "e", lazy.spawn("thunar"), desc="Open Nautilus"), | ||||
| #    Key([mod], "space", lazy.widget['keyboardlayout'].next_keyboard(), desc="toggle layouts"), | ||||
|     Key([mod, "shift"], "x", lazy.spawn("betterlockscreen -l"), desc="Lock screen"), | ||||
|     Key([mod, "shift"], "a", lazy.spawn("amixer sset Master 2%-"), desc="Decrease volume"), | ||||
|     Key([mod, "shift"], "d", lazy.spawn("amixer sset Master 2%+"), desc="Increase volume"), | ||||
|     Key([], "XF86AudioRaiseVolume", lazy.spawn("amixer sset Master 2%+")), | ||||
|     Key([], "XF86AudioLowerVolume", lazy.spawn("amixer sset Master 2%-")), | ||||
|     Key([], "XF86MonBrightnessUp", lazy.spawn("light -A 10")), | ||||
|     Key([], "XF86MonBrightnessDown", lazy.spawn("light -U 10")), | ||||
|     Key([mod, "shift"], "e", lazy.spawn("light -A 10")), | ||||
|     Key([mod, "shift"], "q", lazy.spawn("light -U 10")) | ||||
| ] | ||||
|  | ||||
| groups = [ | ||||
|     Group("main"), | ||||
|     Group("code", matches=[Match(wm_class=["code"])]), | ||||
|     Group("web", matches=[Match(wm_class=["firefox", "firefoxdeveloperedition"])]), | ||||
|     Group("chats", matches=[Match(wm_class=["TelegramDesktop", "KotatogramDesktop", "vk", "VK"])]), | ||||
|     Group("media", matches=[Match(wm_class=["Sonixd", "vlc"])]), | ||||
|     Group("games") | ||||
| ] | ||||
|  | ||||
| for i, g in enumerate(groups): | ||||
|     keys.extend( | ||||
|         [ | ||||
|             # mod1 + letter of group = switch to group | ||||
|             Key( | ||||
|                 [mod], | ||||
|                 str(i+1), | ||||
|                 lazy.group[g.name].toscreen(), | ||||
|                 desc="Switch to group {}".format(g.name), | ||||
|             ), | ||||
|             # mod1 + shift + letter of group = switch to & move focused window to group | ||||
|             Key( | ||||
|                 [mod, "shift"], | ||||
|                 str(i+1), | ||||
|                 lazy.window.togroup(g.name, switch_group=True), | ||||
|                 desc="Switch to & move focused window to group {}".format(g.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)), | ||||
|         ] | ||||
|     ) | ||||
| groups.append( | ||||
|     ScratchPad("scratchpad", [ | ||||
|         DropDown("term", "alacritty", opacity=0.8)])) | ||||
|  | ||||
| keys.append(Key([mod], 'Escape', lazy.group['scratchpad'].dropdown_toggle('term'))) | ||||
|  | ||||
| layouts = [ | ||||
|     layout.Columns(border_focus_stack=["#d75f5f", "#8f3d3d"], border_width=4, margin=10), | ||||
|     layout.Max(), | ||||
|     # Try more layouts by unleashing below layouts. | ||||
|     # layout.Stack(num_stacks=2), | ||||
|     # layout.Bsp(), | ||||
|     # layout.Matrix(), | ||||
|     # layout.MonadTall(), | ||||
|     # layout.MonadWide(), | ||||
|     # layout.RatioTile(), | ||||
|     # layout.Tile(), | ||||
|     # layout.TreeTab(), | ||||
|     # layout.VerticalTile(), | ||||
|     # layout.Zoomy(), | ||||
| ] | ||||
|  | ||||
| widget_defaults = dict( | ||||
|     font="iosevka aile", | ||||
|     fontsize=16, | ||||
|     padding=5, | ||||
| ) | ||||
| extension_defaults = widget_defaults.copy() | ||||
|  | ||||
| sep = widget.Sep( | ||||
|     foreground="#3f3f55", | ||||
|     padding=10, linewidth=5 | ||||
| ) | ||||
| backlight_file = os.listdir("/sys/class/backlight")[0] | ||||
| print(backlight_file) | ||||
| screens = [ | ||||
|     Screen( | ||||
|         top=bar.Bar( | ||||
|             [ | ||||
|                 # widget.CurrentLayout(), | ||||
|                 widget.GroupBox( | ||||
|                     highlight_method="line", | ||||
|                     highlight_color="#2f2f35" | ||||
|                 ), | ||||
|                 sep, | ||||
|                 widget.WindowName(), | ||||
|                 widget.Systray(), | ||||
|                 sep, | ||||
|                 widget.Volume(fmt="vol {}"), | ||||
|                 sep, | ||||
| #                widget.KeyboardLayout(configured_keyboards=['us', 'ru']), | ||||
|                 MyKeyboardLayout(), | ||||
|                 sep, | ||||
|                 widget.Clock(format="%a %H:%M"), | ||||
|                 sep, | ||||
|                 widget.Battery(format='bat {percent:2.0%}'), | ||||
|                 widget.Backlight( | ||||
|                     backlight_name=backlight_file, | ||||
|                     change_command="light -S {0}", | ||||
|                     fmt="bl {}" | ||||
|                 ), | ||||
|                 # widget.Memory(), | ||||
|                 widget.NvidiaSensors(fmt="NV {}"), | ||||
|                 widget.ThermalSensor(fmt="TS {}"), | ||||
|                 widget.ThermalZone(fmt="TZ {}"), | ||||
|             ], | ||||
|             30, | ||||
|             background="#1f1f25" | ||||
|             # border_width=[2, 0, 2, 0],  # Draw top and bottom borders | ||||
|             # border_color=["ff00ff", "000000", "ff00ff", "000000"]  # Borders are magenta | ||||
|         ), | ||||
|     ), | ||||
|     Screen( | ||||
|         top=bar.Bar([ | ||||
|             widget.GroupBox( | ||||
|                 highlight_method="line" | ||||
|             ) | ||||
|         ], 30, background="#1f1f25") | ||||
|     ) | ||||
| ] | ||||
|  | ||||
| # 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(title="branchdialog"),  # gitk | ||||
|         Match(title="pinentry"),  # GPG key password entry | ||||
|     ] | ||||
| ) | ||||
| auto_fullscreen = True | ||||
| 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" | ||||
		Reference in New Issue
	
	Block a user