JigsawWM is a free and open-source project that aims to increase your productivity by offering a set of automation facilities, including the jmk module as an AHK alternative, a Tiling Window Manager to free you from managing windows manually and the Daemon to support any customization you may have in mind.
Software-defined keyboard/mouse automation which mimics the QMK as an alternative to AutoHotkey
- My pinky is hurting - the dual-role key
You should try using
F
as theControl
key, the following code would turn it into a dual-role key: it acts as theLControl
when held,F
when tapped:
Vk.F: JmkTapHold(tap=Vk.F, hold=Vk.LCONTROL),
What if I need to enter a bunch of F
?
Tap it and then hold it down within quick_tap_term
(default 120ms)
- I use F12 a lot, can I tap it without looking at the keyboard? - the layers
Sure, the problem with modern keyboards is they are enormous, 104 or even more. It is inconvenient when the keys you use frequently are far away from the Home Row (
a
,s
,d
,f
, ...). Withlayer
you may "move" the needed key into your reach:
layers = [
{ # layer 0
# activate layer 3 when held
Vk.T: JmkTapHold(tap=Vk.T, hold=3),
},
{ # layer 1
...
},
{ # layer 2
...
},
{ # layer 3
Vk.Z: JmkKey(Vk.F1),
}
Now, hold the key T
and press Z
, you get F1
- I would like to press
Win+Q
to close the active Window.hotkey
at your service, furthermore, you may pressWin+N
to minimize orWin+M
to maximize the active window
hotkeys = [
("Win+q", "LAlt+F4"),
# Win+n to minimize active window
([Vk.WIN, Vk.N], minimize_active_window),
# Win+m to maximize active window
([Vk.WIN, Vk.M], toggle_maximize_active_window),
]
- For browsing smoothingly with the Mouse, try the following setup
Mouse Forward + Left Button
: sendCtrl + w
(close tab in Chrome and other apps)Mouse Forward + Wheel Up
: sendCtrl + PageUp
(previous tab in Chrome and other apps)Mouse Forward + Wheel Down
: sendCtrl + PageDown
(next tab in Chrome and other apps)
- Check out the examples/jmk.pyw to find out more
The WindowManager follows the suckless philosophy and works just like the dwm. All windows are treated as an Ordered List
, they will be moved into places based on their Order
and specified Layout
automatically, save you from arranging them manually.
2023-01-01_18-56-36.mp4
Win + j
: activate next window and move the cursor to its centerWin + k
: activate the previous window and move the cursor to its centerWin + Shift + j
: move the active window down in the list (swap with the next one)Win + Shift + k
: move the active window up in the list (swap with the previous one)Win + /
: swap the active window with the first window in the list or the second window if it is the first window alreadyWin + Space
: next theme,Theme
consists ofLayout
,Background
,gap
, etc. to determine how windows should be placedWin + i
: activate the first window of the next monitor if any or move cursor onlyWin + u
: activate the first window of the previous monitor if any or move cursor onlyWin + Shift + i
: move the active window to the next monitorWin + Shift + u
: move the active window to the previous monitor
Sometimes, software that should be run as a system service may not offer an installer to do the job, worse, it may ship as a Console Program. Nobody wants a Console Window stays on their desktops, and yes, I'm talking about SyncThing. I love it but I would like it to run in the background quietly.
class SyncthingService(daemon.ProcessService):
name = "syncthing"
args = [
r"C:\Programs\syncthing-windows-amd64-v1.23.2\syncthing.exe",
"-no-browser",
"-no-restart",
"-no-upgrade",
]
log_path = r"C:\Programs\syncthing-windows-amd64-v1.23.2\syncthing.log"
daemon.register(SyncthingService)
- I would like to open a folder inside the Chromium Bookmark on the first boot-up every day.
class DailyRoutine(daemon.Task):
name = "daily routine"
def run(self):
chrome.open_fav_folder("bookmark_bar", "daily")
def condition(self):
# trigger only once on daily-basis
return smartstart.daily_once("daily websites")
daemon.register(DailyRoutine)
- I would like to launch my IM / Mail Client on workdays
class WorkdayRoutine(daemon.Task):
name = "workday routine"
def __init__(self) -> None:
super().__init__()
self.holiday_book = ChinaHolidayBook()
def run(self):
smartstart.start_if_not_running(
r"C:\Users\Klesh\AppData\Local\Feishu\Feishu.exe"
)
smartstart.start_if_not_running(
r"C:\Program Files\Mozilla Thunderbird\thunderbird.exe"
)
def condition(self):
return self.holiday_book.is_workhour(extend=timedelta(hours=2))
daemon.register(WorkdayRoutine)
Tested on Windows 11 Build 22000 and Python 3.11.1. Should work on Windows 10 and Python 3.8
Install from pypi
pip install jigsawwm
Install from Github repo
pip install git+https://github.com/klesh/JigsawWM.git
Choose services you like from the examples folder, you may use any of the following directly.
- examples/jmk.pyw if you are looking for a QMK/AutoHotkey alternative
- examples/services.pyw if you are trying to run some Console Program as Service in the background
- examples/tasks.pyw if you are looking for a solution to automate your workflow smartly on startup
- examples/wm.pyw if you are looking for a tiling window manager
- examples/jigsaw.pyw the whole package of the above
Double-click the .pyw
file and a tray icon should appear, right-click the icon to manage your services.
- Open your Startup folder by pressing
Win + r
to activate the Run dialog and type inshell:startup
, a FileExplorer should pop up. - Create a shortcut to your
.pyw
file. Done!