Releases: agent-kilo/jwno
v0.9.16
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-changedhook now passes a desktop GUID, instead of adesktop-infostruct, to user functions. - BREAKING CHANGE:
:get-current-frame-on-desktopand:get-layout-on-desktopmethods from thevirtual-desktop-containerobject (i.e. the root of frame tree) now accepts a desktop GUID, instead of adesktop-infostruct. - BREAKING CHANGE: The format of
layout-historybacking files is changed. If you havelayout-historyenabled, old backing files need to be removed before starting Jwno. - Better handling for
explorer.exerestarts. (Thanks @steshaw !) - New
virtual-desktop-managerinterface (See the source invd.janet). - Added a simple single-instance check. Jwno will refuse to start if there's another Jwno process already running.
- The
util/with-activation-hooksmacro now checks its recursion level, and will not invoke redundant calls to activation hooks. - Fixed
sync-focusmode. You can now properly trigger the focus events "synchronously", by setting the:sync-focusdyn variable totrue. - 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
Change Log
- New command line flag
--evalto evaluate Janet code through an REPL connection. - New command line flag
--executeto call a Jwno command through an REPL connection. - The
--replcommand line flag is now optional; Jwno connects to127.0.0.1:9999by default, when the flag is omitted. - Unconstrained frames.
- New
:toggle-parent-viewportand:scroll-parentcommands. - Add support for
VK_OEM_MINUSmappings (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:
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:
- Split a frame using the
:split-framecommand, so that the child frames line up in the desired direction. - Call the
:toggle-parent-viewportcommand to make the parent frame unconstrained. - Manipulate child frames as usual (resize, insert, close, etc.).
:scroll-parentcan be used to scroll around. When a child frame outside parent's viewport is activated, it gets pulled into the viewport automatically. - When there's only one child frame left, the parent gets flattened, and becomes constrained again. Or one can call
:toggle-parent-viewportagain, 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
Change Log
- BREAKING CHANGE: Rename
:jwno-process-elevated?method for window manager to:own-process-elevated?. - BREAKING CHANGE: Move
:get-pid-pathmethod for window manager toutil/git-pid-path. - Fix a memory leak in the
:focus-changedevent handling code. - Fix bug: The
ui-hintlabels 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-hintercan'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-windowcommand. :move-windowcommand 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-hwndmethod 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-highlightsand:line-width. - Update spork to
f5295bfc0d41f947dc1bfd4d7c6a0400279dad5d. - Draw
ui-hinthighlight boxes more accurately. - Properly block default modifier key actions, when a sole modifier key other than
Winis used. - Support for
uiAccesspermission. - Support
debugbuild type. (Pass--build-type=debugwhen running JPM, to make a debug build.) example-config.janetnow has amod-keysetting, and contains even more comments.tutorial.janetnow prompts for a primary modifier key, so that the user can useAltinstead ofWin.- Other tweaks.
v0.9.13
Change Log
- BREAKING CHANGE: Refactor
:ui-hintcommand to make it more generic. Please see the documentation for the new interface. - New hinter implementations to be used with
:ui-hintcommand:frame-hinter,gradual-uia-hinter, anduia-hinter. - New
jwno/layout-historymodule. - New
:toggle-window-managementcommand to pause window management. - New
:shutting-downand:layout-changedhook. - New
rowsautomatic layout. - New
:load,:dumpand:clear-childrenmethods 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.
:splitand:insert-sub-framemethods for frame objects now support absolute sizes.- Function closures in keymaps can now access global mutable states.
- Fix a regression in
:close-framecommand, 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
Change Log
- Fix crashes caused by simultaneous
:ui-hintcommands (#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-padmodule; - New
:rotate-sibling-frames,:reverse-sibling-framesand:toggle-parent-directioncommands (#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
Change Log
- Better handling for programs that deny PROCESS_QUERY_INFORMATION or PROCESS_VM_READ (e.g. password managers);
:ui-hintcommand;jw32/_wingdimodule;- 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
Change Log
- Fix
:frametag 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
:rawkey mode and:describe-keycommand.
And finally, happy holidays! 🎄🎉
v0.9.9
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
Change Log
- Built-in
jwno/indicatormodule; - Built-in
jwno/auto-layoutmodule; :nopcommand;- In the example config, use
indicator/current-frame-areainstead of tooltips to mark the current frame by default; - Custom window messages in UI thread;
:frame-resizedand:virtual-desktop-changedhooks;:insert-framecommand;- Correct meta data in
jwno.exe; - Other minor fixes and improvements.
v0.9.7
Change Log
- Updated Janet to v1.36.0;
- Updated Spork to 253a67e89dca695632283ef60f77851311c404c9;
- Added an interactive tutorial as a config file; Check out
tutorial.janetin the source tree; - Keymap prototype support;
- Fixed "sticky" modifier keys;
- Improved default window filter rules;
- New commands:
:manage-window,:ignore-windowand:summon :filter-forced-windowhook:and/:orfilter hook modes;- Documentation for commands and key bindings;

