diff --git a/src/.config/awesome/rc.lua b/src/.config/awesome/rc.lua index 5f333e8..d8fa1b8 100644 --- a/src/.config/awesome/rc.lua +++ b/src/.config/awesome/rc.lua @@ -35,6 +35,25 @@ _G.client.connect_signal('manage', function(c) end end) +-- Move cursor to focused window +function move_mouse_onto_focused_client() + local c = client.focus + gears.timer( { timeout = 0.1, + autostart = true, + single_shot = true, + callback = function() + if mouse.object_under_pointer() ~= c then + local geometry = c:geometry() + local x = geometry.x + geometry.width/2 + local y = geometry.y + geometry.height/2 + mouse.coords({x = x, y = y}, true) + end + end } ) +end + +client.connect_signal("focus", move_mouse_onto_focused_client) +client.connect_signal("swapped", move_mouse_onto_focused_client) + -- Enable sloppy focus, so that focus follows mouse. _G.client.connect_signal('mouse::enter', function(c) c:emit_signal('request::activate', 'mouse_enter', {raise = true}) diff --git a/src/.config/qtile/__pycache__/config.cpython-38.pyc b/src/.config/qtile/__pycache__/config.cpython-38.pyc new file mode 100644 index 0000000..5986583 Binary files /dev/null and b/src/.config/qtile/__pycache__/config.cpython-38.pyc differ diff --git a/src/.config/qtile/autostart.sh b/src/.config/qtile/autostart.sh new file mode 100755 index 0000000..db6b643 --- /dev/null +++ b/src/.config/qtile/autostart.sh @@ -0,0 +1,5 @@ +#!/bin/bash +compton & +nitrogen --restore & +nm-applet & + diff --git a/src/.config/qtile/config.py b/src/.config/qtile/config.py new file mode 100644 index 0000000..37ffaa6 --- /dev/null +++ b/src/.config/qtile/config.py @@ -0,0 +1,289 @@ +import os +import subprocess + +from typing import List + +from libqtile import bar, layout, widget, hook +from libqtile.config import Click, Drag, Group, Key, Screen, ScratchPad, DropDown +from libqtile.lazy import lazy +from libqtile.utils import guess_terminal + +mod = "mod4" +terminal = "kitty" +rofi = """ +env /usr/bin/rofi -show drun -display-drun -run-command +"/bin/bash -c -i 'shopt -s expand_aliases; {cmd}'" +""" +config_directory = os.path.expanduser("~/.config/qtile") + +BLACK = "#212121" +LIGHT_GREY = "#3c3c3c" +GREY = "#333333" +DARK_GREY = "#1a1a1a" +YELLOW = "#e1be7f" +GREEN = "#92c96a" +BLUE = "#66aeea" +RED = "#f35a5a" +CYAN = "#4083bc" +MAGENTA = "#c57cda" +ORANGE = "#cd996a" +WHITE = "#d6d6d6" + +keys = [ + # Switch between windows in current stack pane + Key([mod], "k", lazy.layout.down(), desc="Move focus down in stack pane"), + Key([mod], "j", lazy.layout.up(), desc="Move focus up in stack pane"), + # Move windows up or down in current stack + Key( + [mod, "control"], + "k", + lazy.layout.shuffle_down(), + desc="Move window down in current stack ", + ), + Key( + [mod, "control"], + "j", + lazy.layout.shuffle_up(), + desc="Move window up in current stack ", + ), + Key(["mod1"], "Tab", lazy.layout.next(), desc="Move focus to next window in group"), + Key( + ["mod1", "shift"], + "Tab", + lazy.layout.previous(), + desc="Move focus to previous window in group", + ), + # 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"], "q", lazy.window.kill(), desc="Kill focused window"), + Key([mod, "shift"], "c", lazy.window.kill(), desc="Kill focused window"), + Key([mod, "control"], "r", lazy.restart(), desc="Restart qtile"), + Key([mod, "control"], "q", lazy.shutdown(), desc="Shutdown qtile"), + Key([mod], "r", lazy.spawn(rofi), desc="Launch Rofi"), + Key( + [mod], + "p", + lazy.spawn(f"{config_directory}/src/rofi-power.sh"), + desc="Launch rofi power options", + ), + # Volume Control + Key([], "XF86AudioRaiseVolume", lazy.spawn("amixer -c 0 -q set Master 2dB+")), + Key([], "XF86AudioLowerVolume", lazy.spawn("amixer -c 0 -q set Master 2dB-")), + Key([], "XF86AudioMute", lazy.spawn("amixer -D pulse set Master 1+ toggle")), + Key([mod], "equal", lazy.spawn("amixer -c 0 -q set Master 2dB+")), + Key([mod], "minus", lazy.spawn("amixer -c 0 -q set Master 2dB-")), + # Window management + Key([mod], "h", lazy.layout.shrink_main(), desc="Expand master (MonadTall)"), + Key([mod], "l", lazy.layout.grow_main(), desc="Shrink master (MonadTall)"), + Key( + [mod, "shift"], + "h", + lazy.layout.swap_left(), + desc="Move window to left (MonadTall)", + ), + Key( + [mod, "shift"], + "l", + lazy.layout.swap_right(), + desc="Moce window to right (MonadTall)", + ), + Key([mod], "k", lazy.group["scratchpad"].dropdown_toggle("dropdown_terminal")), + Key([mod], "Left", lazy.screen.prev_group(skip_managed=True)), + Key([mod], "Right", lazy.screen.next_group(skip_managed=True)), +] + +group_names = ( + ("web", {"layout": "max"}), + ("dev", {"layout": "monadtall"}), + ("term", {"layout": "monadtall"}), + ("file", {"layout": "monadtall"}), + ("chat", {"layout": "monadtall"}), + ("misc", {"layout": "monadtall"}), +) + +groups = [Group(name, **kwargs) for name, kwargs in group_names] + +# Create a dropdown terminal +groups.append( + ScratchPad( + "scratchpad", + [ + DropDown( + "dropdown_terminal", + f"{terminal} -T dropdown_terminal", + on_focus_lost_hide=False, + opacity=1, + width=0.999, + x=0.0005, + height=0.55, + ), + ], + ), +) + +for i, (name, kwargs) in enumerate(group_names, 1): + # Switch to another group + keys.append(Key([mod], str(i), lazy.group[name].toscreen(toggle=False))) + # Switch to last group + keys.append(Key([mod], "Escape", lazy.screen.toggle_group())) + # Send window to group + keys.append(Key([mod, "shift"], str(i), lazy.window.togroup(name))) + +layout_theme = { + "border_width": 2, + "margin": 0, + "single_border_width": 0, + "border_focus": GREEN, + "border_normal": BLACK, +} + +layouts = [ + layout.Max(**layout_theme), + # layout.Stack(**layout_theme, num_stacks=2), + # Try more layouts by unleashing below layouts. + # layout.Bsp(**layout_theme), + # layout.Columns(**layout_theme), + # layout.Matrix(**layout_theme), + layout.MonadTall(**layout_theme), + # layout.MonadWide(**layout_theme), + # layout.RatioTile(**layout_theme), + # layout.Tile(**layout_theme), + # layout.TreeTab(**layout_theme), + # layout.VerticalTile(**layout_theme), + # layout.Zoomy(**layout_theme), + layout.Floating( + **layout_theme, + float_rules=[ + # Run the utility of `xprop` to see the wm class and name of an X client. + {"wmclass": "confirm"}, + {"wmclass": "dialog"}, + {"wmclass": "download"}, + {"wmclass": "error"}, + {"wmclass": "file_progress"}, + {"wmclass": "notification"}, + {"wmclass": "splash"}, + {"wmclass": "toolbar"}, + {"wmclass": "confirmreset"}, # gitk + {"wmclass": "makebranch"}, # gitk + {"wmclass": "maketag"}, # gitk + {"wname": "branchdialog"}, # gitk + {"wname": "pinentry"}, # GPG key password entry + {"wmclass": "ssh-askpass"}, # ssh-askpass + ], + ), +] + +widget_defaults = dict( + font="Ubuntu", + fontsize=12, + padding=3, +) +extension_defaults = widget_defaults.copy() + +screens = [ + Screen( + top=bar.Bar( + [ + widget.GroupBox( + margin_y=3, + margin_x=0, + padding_y=5, + padding_x=3, + disable_drag=True, + active=BLUE, + inactive=WHITE, + rounded=False, + highlight_color=BLUE, + highlight_method="block", + this_current_screen_border=BLUE, + this_screen_border=GREEN, + block_highlight_text_color=BLACK, + other_current_screen_border=GREEN, + other_screen_border=BLACK, + urgent_alert_method="text", + urgent_text=RED, + ), + widget.Prompt(), + widget.Spacer(), + widget.Systray(), + widget.Clock(format="%m/%d %a %I:%M"), + widget.Sep(), + widget.CPU(format="﬙ {load_percent}%"), + widget.Sep(), + widget.Memory(), + widget.Volume(), + widget.Battery(format="{char} {percent:2.0%}", notify_below=20), + widget.CurrentLayoutIcon(scale=0.65), + ], + 20, + ), + bottom=bar.Bar( + [ + widget.TaskList( + borderwidth=0, + spacing=0, + highlight_method="block", + background=GREY, + border=BLACK, + markup_floating="{}", + markup_minimized="{}", + icon_size=0, + margin=0, + rounded=False, + title_width_method="uniform", + ), + ], + 18, + ), + ), +] + +# 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.toggle_floating()), +] + +dgroups_key_binder = None +dgroups_app_rules = [] # type: List +main = None # WARNING: this is deprecated and will be removed soon +follow_mouse_focus = True +bring_front_click = False +cursor_warp = False +auto_fullscreen = True +focus_on_window_activation = "smart" + + +@hook.subscribe.startup +def autostart(): + subprocess.call([f"{config_directory}/autostart.sh"]) + + +# 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" diff --git a/src/.config/qtile/requirements.txt b/src/.config/qtile/requirements.txt new file mode 100644 index 0000000..5c92057 --- /dev/null +++ b/src/.config/qtile/requirements.txt @@ -0,0 +1,3 @@ +qtile==0.16.2.dev209+gd5848931 +psutil==5.8.0 + diff --git a/src/.config/qtile/src/rofi-power.sh b/src/.config/qtile/src/rofi-power.sh new file mode 100755 index 0000000..b626d30 --- /dev/null +++ b/src/.config/qtile/src/rofi-power.sh @@ -0,0 +1,35 @@ +#!/usr/bin/env bash + +# rofi-power +# Use rofi to call systemctl for shutdown, reboot, etc + +# 2016 Oliver Kraitschy - http://okraits.de + +OPTIONS="Poweroff\nExit\nReboot\nSuspend\nHibernate" + +config_path=$(dirname "$0") + +LAUNCHER="rofi -dmenu -i" +USE_LOCKER="false" +LOCKER="i3lock-fancy" + +option=`echo -e $OPTIONS | $LAUNCHER | awk '{print $1}' | tr -d '\r\n'` +case $option in + Exit) + kill -9 -1 + ;; + Reboot) + systemctl reboot + ;; + Poweroff) + systemctl poweroff + ;; + Suspend) + $($USE_LOCKER) && "$LOCKER"; systemctl suspend + ;; + Hibernate) + $($USE_LOCKER) && "$LOCKER"; systemctl hibernate + ;; + *) + ;; +esac