Skip to main content

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.

Project description

JigsawWM

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.

What Can I Do?

Service: jmk

Software-defined keyboard/mouse automation which mimics the QMK as an alternative to AutoHotkey

  1. My pinky is hurting - the dual-role key You should try using F as the Control key, the following code would turn it into a dual-role key: it acts as the LControl 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)

  1. 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, ...). With layer 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

  1. I would like to press Win+Q to close the active Window. hotkey at your service, furthermore, you may press Win+N to minimize or Win+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),
]
  1. For browsing smoothingly with the Mouse, try the following setup
  • Mouse Forward + Left Button: send Ctrl + w (close tab in Chrome and other apps)
  • Mouse Forward + Wheel Up: send Ctrl + PageUp (previous tab in Chrome and other apps)
  • Mouse Forward + Wheel Down: send Ctrl + PageDown (next tab in Chrome and other apps)
  1. Check out the examples/jmk.pyw to find out more

Service: tiling window manager

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.

Demo

https://user-images.githubusercontent.com/61080/210168366-e70dd649-f6ef-41bb-a8e5-941e392d770a.mp4

Default keybindings

  • Win + j: activate next window and move the cursor to its center
  • Win + k: activate the previous window and move the cursor to its center
  • Win + 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 already
  • Win + Space: next theme, Theme consists of Layout, Background, gap, etc. to determine how windows should be placed
  • Win + i: activate the first window of the next monitor if any or move cursor only
  • Win + u: activate the first window of the previous monitor if any or move cursor only
  • Win + Shift + i: move the active window to the next monitor
  • Win + Shift + u: move the active window to the previous monitor

Service: run console program in the background

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)

Task: automate your workflows with tasks

  1. 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)
  1. 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)

Installation

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

Quick Start

Step 1: Create a .pyw file as your "Configuration"

Choose services you like from the examples folder, you may use any of the following directly.

Step 2: Launch your .pyw file and manage your services

Double-click the .pyw file and a tray icon should appear, right-click the icon to manage your services. image

Step 3: Launch at startup

  1. Open your Startup folder by pressing Win + r to activate the Run dialog and type in shell:startup, a FileExplorer should pop up.
  2. Create a shortcut to your .pyw file. Done!

Document

Read the Docs

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

jigsawwm-2.2.0.tar.gz (59.0 kB view details)

Uploaded Source

Built Distribution

jigsawwm-2.2.0-py3-none-any.whl (64.3 kB view details)

Uploaded Python 3

File details

Details for the file jigsawwm-2.2.0.tar.gz.

File metadata

  • Download URL: jigsawwm-2.2.0.tar.gz
  • Upload date:
  • Size: 59.0 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/5.0.0 CPython/3.12.2

File hashes

Hashes for jigsawwm-2.2.0.tar.gz
Algorithm Hash digest
SHA256 9e00bef910872e060476ac89a8d96275db27915200118c59bf8a0fc08d55667b
MD5 f1cb95ea5c5b1cf5b1d6b965299c46c5
BLAKE2b-256 88841f955671eb08a998148aeb710eddf5ae3d00132857f5532f7ae80e01617e

See more details on using hashes here.

File details

Details for the file jigsawwm-2.2.0-py3-none-any.whl.

File metadata

  • Download URL: jigsawwm-2.2.0-py3-none-any.whl
  • Upload date:
  • Size: 64.3 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/5.0.0 CPython/3.12.2

File hashes

Hashes for jigsawwm-2.2.0-py3-none-any.whl
Algorithm Hash digest
SHA256 b25567b97a18d9d555ac5c53957288602375ac91cf377832f3fbf7a6fb55283e
MD5 cd952dbe00925dc0c75cbf8d964f75bf
BLAKE2b-256 bbdd4de8b819ceb1da2e128effe117a4ed84b750585b6c8dd9f698d2ad570c71

See more details on using hashes here.

Supported by

AWS AWS Cloud computing and Security Sponsor Datadog Datadog Monitoring Fastly Fastly CDN Google Google Download Analytics Microsoft Microsoft PSF Sponsor Pingdom Pingdom Monitoring Sentry Sentry Error logging StatusPage StatusPage Status page