Skip to content

Releases: agent-kilo/jwno

v0.9.16

22 Dec 02:38

Choose a tag to compare

Change Log

  • BREAKING CHANGE: Default virtual desktop names returned by Jwno are now tuples like [:default 1], [:default 2] etc., instead of plain strings. (See this commit for an example of updating existing code.)
  • BREAKING CHANGE: :virtual-desktop-changed hook now passes a desktop GUID, instead of a desktop-info struct, to user functions.
  • BREAKING CHANGE: :get-current-frame-on-desktop and :get-layout-on-desktop methods from the virtual-desktop-container object (i.e. the root of frame tree) now accepts a desktop GUID, instead of a desktop-info struct.
  • BREAKING CHANGE: The format of layout-history backing files is changed. If you have layout-history enabled, old backing files need to be removed before starting Jwno.
  • Better handling for explorer.exe restarts. (Thanks @steshaw !)
  • New virtual-desktop-manager interface (See the source in vd.janet).
  • Added a simple single-instance check. Jwno will refuse to start if there's another Jwno process already running.
  • The util/with-activation-hooks macro now checks its recursion level, and will not invoke redundant calls to activation hooks.
  • Fixed sync-focus mode. You can now properly trigger the focus events "synchronously", by setting the :sync-focus dyn variable to true.
  • Update Janet to v1.40.1.
  • Update spork to v1.1.1.
  • Some other tweaks.

About the Breaking Changes

They are mostly caused by refactoring of the virtual-desktop-related code. Previously Jwno used a hacky method to "infer" the names of virtual desktops. After the refactoring, it queries the OS registry to fetch the exact VD names instead. As a result, Jwno can now properly identify and exclude windows that are shown on all virtual desktops.

This change led to an issue though: Windows (the OS) does not save the default desktop names to the registry, if the user has never changed them. Instead, it generates the default names with localized strings. So a desktop may be Desktop 1 in an English locale, but デスクトプ 1 in a Japanese locale. To avoid hard-coding all the translations, Jwno turns the default names to tuples like [:default 1], [:default 2] etc. User-set desktop names are still plain strings.

TL;DR: If you wrote any code in your config/modules that's related to virtual desktops, you may need to update it accordingly. Otherwise, you should be fine.

Until next time. And happy holidays! 😊

v0.9.15

17 Sep 02:48

Choose a tag to compare

Change Log

  • New command line flag --eval to evaluate Janet code through an REPL connection.
  • New command line flag --execute to call a Jwno command through an REPL connection.
  • The --repl command line flag is now optional; Jwno connects to 127.0.0.1:9999 by default, when the flag is omitted.
  • Unconstrained frames.
  • New :toggle-parent-viewport and :scroll-parent commands.
  • Add support for VK_OEM_MINUS mappings (by @dladukedev).
  • Update spork to 4aa1d495183c6663b30363ebe9f94aeddac9af11.
  • Update Janet to v1.39.1.

About the New Command Line Flags

All of them depend on a working REPL server, so you must start one before they can work properly. A server can be started either by using the Launch REPL system tray icon menu item, or adding this line to your config file:

(:start-server (in jwno/context :repl-manager) HOST PORT)

Please see the docs for more details.

About Unconstrained Frames

Simply put, they are frames that can grow beyond their bounding :viewports, and they work like this:

jwno-unconstrained-frame-demo

There are two new built-in commands, :toggle-parent-viewport and :scroll-parent, made specifically for unconstrained frames. My own workflow usually look like this:

  1. Split a frame using the :split-frame command, so that the child frames line up in the desired direction.
  2. Call the :toggle-parent-viewport command to make the parent frame unconstrained.
  3. Manipulate child frames as usual (resize, insert, close, etc.). :scroll-parent can be used to scroll around. When a child frame outside parent's viewport is activated, it gets pulled into the viewport automatically.
  4. When there's only one child frame left, the parent gets flattened, and becomes constrained again. Or one can call :toggle-parent-viewport again, to manually make the parent frame constrained.

It's certainly possible to use unconstrained frames in other more creative ways, and I'm open to suggestions 😊.

See also the docs for :toggle-parent-frame and :scroll-parent.

v0.9.14

23 Jun 02:20

Choose a tag to compare

Change Log

  • BREAKING CHANGE: Rename :jwno-process-elevated? method for window manager to :own-process-elevated?.
  • BREAKING CHANGE: Move :get-pid-path method for window manager to util/git-pid-path.
  • Fix a memory leak in the :focus-changed event handling code.
  • Fix bug: The ui-hint labels may block mouse click events.
  • Fix bug: Space characters (ASCII 0x20) in jwno.exe's path may prevent the REPL from launching.
  • Fix issue: Sometimes uia-hinter can't show labels for certain UI elements in File Explorer windows in Windows 11.
  • Fix issue: Sometimes the first Windows Terminal window won't get managed properly.
  • New :resize-window command.
  • :move-window command is now overloaded, to also handle "floating" windows.
  • New method for window objects: :get-rect.
  • New methods for window manager object: :get-hwnd-rect, :get-focused-hwnd, :set-focus-to-hwnd, :set-focus-to-desktop, :find-hwnd, and :has-uiaccess?.
  • :add-hwnd method for window manager is now overloaded, to allow adding a managed window by hwnd only.
  • New method for uia-manager: :walk-tree.
  • New options for ui-hint/frame-hinter: :show-highlights and :line-width.
  • Update spork to f5295bfc0d41f947dc1bfd4d7c6a0400279dad5d.
  • Draw ui-hint highlight boxes more accurately.
  • Properly block default modifier key actions, when a sole modifier key other than Win is used.
  • Support for uiAccess permission.
  • Support debug build type. (Pass --build-type=debug when running JPM, to make a debug build.)
  • example-config.janet now has a mod-key setting, and contains even more comments.
  • tutorial.janet now prompts for a primary modifier key, so that the user can use Alt instead of Win.
  • Other tweaks.

v0.9.13

07 May 02:59

Choose a tag to compare

Change Log

  • BREAKING CHANGE: Refactor :ui-hint command to make it more generic. Please see the documentation for the new interface.
  • New hinter implementations to be used with :ui-hint command: frame-hinter, gradual-uia-hinter, and uia-hinter.
  • New jwno/layout-history module.
  • New :toggle-window-management command to pause window management.
  • New :shutting-down and :layout-changed hook.
  • New rows automatic layout.
  • New :load, :dump and :clear-children methods for tree node objects.
  • Update Janet to 1.38.0.
  • Update Spork to 415f2ee9e6bb5ffd95f1d9f7ec682aa0af959661
  • Update Win SDK to 10.0.26100.0.
  • Update the example config to include latest features.
  • :split and :insert-sub-frame methods for frame objects now support absolute sizes.
  • Function closures in keymaps can now access global mutable states.
  • Fix a regression in :close-frame command, which may result in unresponsive frames.
  • More content in the documentation.
  • Other minor tweaks.

About the New Features

Layout History

The new jwno/layout-history module stores your layout history for each virtual desktop, either in memory or in a backing file, and restores them when needed. Documentation

Hinters

The :ui-hint command now uses hinters to gather the info it needs for showing on-screen hints. Users can extend :ui-hint command by implementing their own hinters.

Jwno provides these built-in hinters:

  • ui-hint/frame-hinter: Handles visible frames;
  • ui-hint/gradual-uia-hinter: Handles UI elements, by gradually walking the UI tree;
  • ui-hint/uia-hinter: Handles UI elements.

Please see the full documentation for more details.

Next Release

Now that Jwno has become a little window manager with quite a few features packed in, I will dedicate the next release cycle to improving existing code and paying my tech debts 😅.

It may be time to push Jwno towards a 1.0 release, but there's still the scrolling mode (a.k.a. "Niri mode") in the backlog, and Jwno's API may still have breaking changes. Let's see how it goes 😊.

v0.9.12

17 Mar 08:29

Choose a tag to compare

Change Log

  • Fix crashes caused by simultaneous :ui-hint commands (#5);
  • More ergonomic ways to access the config file environment in the REPL: Use the global variable jwno/user-config, or do (import jwno/user-config);
  • Built-in jwno/scratch-pad module;
  • New :rotate-sibling-frames, :reverse-sibling-frames and :toggle-parent-direction commands (#6);
  • Broken down documentation pages, for easier navigation;
  • Startup time optimization;
  • Updated example config, to better showcase new UI Hint and Scratch Pad features;
  • Other minor tweaks.

About the Scratch Pad

It's like a hidden "cache" for windows. You can send your selected windows there, and show them on top of other windows later. It's the same concept you see in Sway or maybe other window managers. Check out previous updates here.

v0.9.11

20 Feb 11:55

Choose a tag to compare

Change Log

  • Better handling for programs that deny PROCESS_QUERY_INFORMATION or PROCESS_VM_READ (e.g. password managers);
  • :ui-hint command;
  • jw32/_wingdi module;
  • Handle WM_SETTINGCHANGE, and react to work area changes properly ( #3 );
  • Allow customizing the color of the empty frame indicator;
  • Other minor tweaks and stability improvements.

About the UI-Hint Feature

It’s a powerful way to interact with GUIs using your keyboard. Please see example/ui-hint-keymap.janet in the source for some example usage.

v0.9.10

25 Dec 11:26

Choose a tag to compare

Change Log

  • Fix :frame tag handling in window objects;
  • Fix incorrect window placement when moving windows across monitors with different DPIs;
  • Fix the case where Jwno ignores the focus change event when a MenuItem gets the focus first;
  • Update Spork to 18938c57212c8d4dc0a37b6ea10b8b859aad7518;
  • Update Janet to 1.37.1;
  • Some ways to show Jwno's current version;
  • Oneshot hooks;
  • Experimental :raw key mode and :describe-key command.

And finally, happy holidays! 🎄🎉

v0.9.9

06 Nov 04:42

Choose a tag to compare

Change Log

  • Minor refactoring to window object interface;
  • Reduce excessive retiling;
  • Make handing of minimized windows more consistent;
  • Minor refactoring to activation hooks;
  • Fix a bug where some newly opened windows won't get focused correctly;
  • Fix a bug where the main loop get killed silently;
  • Do less array allocations when traversing the frame tree;
  • Documentation(WIP).

v0.9.8

29 Sep 02:42

Choose a tag to compare

Change Log

  • Built-in jwno/indicator module;
  • Built-in jwno/auto-layout module;
  • :nop command;
  • In the example config, use indicator/current-frame-area instead of tooltips to mark the current frame by default;
  • Custom window messages in UI thread;
  • :frame-resized and :virtual-desktop-changed hooks;
  • :insert-frame command;
  • Correct meta data in jwno.exe;
  • Other minor fixes and improvements.

v0.9.7

12 Sep 04:12

Choose a tag to compare

Change Log

  • Updated Janet to v1.36.0;
  • Updated Spork to 253a67e89dca695632283ef60f77851311c404c9;
  • Added an interactive tutorial as a config file; Check out tutorial.janet in the source tree;
  • Keymap prototype support;
  • Fixed "sticky" modifier keys;
  • Improved default window filter rules;
  • New commands: :manage-window, :ignore-window and :summon
  • :filter-forced-window hook
  • :and/:or filter hook modes;
  • Documentation for commands and key bindings;