Revision history for korgwm.
6.1 2026-03-08
- Add setxkb_evdev parameter to explicitly set evdev Xkb
- Improve kwalitee, add linter to release checklist
6.0 2026-03-07
- Update to X11::XCB 0.24 to ensure compatibility with Perl 5.42.0
- Implement new tiling layouts:
- Add 'columns' layout for vertical window arrangement
- Add 'narrow' layout optimized for wide screens
- Refactor Layout module to simplify addition of new layout functions
- Add option to specify tiled windows order: reverse or forward
- Implement pinned windows feature:
- Windows can be pinned to stay visible across all tags
- Pinned windows work with both managed and unmanaged windows
- Pinned windows are not affected by tag switching
- Enhance screen management and topology:
- Support screens with y != 0 coordinates
- Change Screen->id format from x,y,w,h to w,h,x,y for consistency
- Implement soft_placement rule for handle_screens() as fallback
- Select proper tags on completely new screens
- Use external korgwm_xrandr script in randr_cmd for flexible monitor handling
- Add doc/Screen_Management.md describing multi-monitor management
- Implement @handle_screens_post_hooks to make proper updates on RandR events
- Improve focus handling and window management:
- Refactor focus logic in Tag->show() for better consistency
- Focus previous window per Tag on close() with per-tag focus_prev tracking
- Fix stale input focus on hidden windows
- Fix stale focus on hidden windows during tag switching
- Support Window->focus() on BUTTON_PRESS for tiled windows
- Make mod+click focus the window unconditionally
- Fix improper $old_screen selection in win_move_* functions
- Enhance pointer warping and mouse interaction:
- Introduce bypass_single_window_warp to prevent unnecessary warping
- Introduce warp_ignore_korgwm and fix bug with bypass_single_window_warp
- Improve warp_pointer() during screen_select()
- Warp pointer on de-maximizing window
- Prevent EnterNotify for any MapRequest, not only floating windows
- Add multimedia and attention support:
- Add support for XF86Audio multimedia buttons (Play, Stop, Prev, Next)
- Add support for _NET_WM_STATE_DEMANDS_ATTENTION
- Honour _NET_WM_FULLSCREEN state on MapRequest
- Enhance Panel and calendar functionality:
- Implement toggle_calendar() API function
- Open calendar when clicking on clock
- Make calendar separate for each screen
- Add padding for calendar children
- Improve Panel::add_element() with %params for flexible configuration
- Switch colors to CSS format and remove Pango markup hack
- Improve battery configuration with BAT* support for Panel/Battery
- Avoid Grapheme_Extend characters in Panel title for better rendering
- Enhance configuration and debugging:
- Implement KORGWM_DEBUG_CONFIG environment variable to override config search paths
- Add support for multiple keycodes in keymap
- Support new syntax for placement and soft_placement rules
- Add mouse_nowarp and tag_rotate options for perl-conf
- Fix issue with leading zeros in colours config
- Add croak to Hotkeys initialization for better error handling
- Other improvements and fixes:
- Fix issue processing WM_PROTOCOLS on window close
- Fix issue with newline in title and fix backspace handling in auth_korgwm
- Fix stale Panel->ws urgency
- Fix critical mistype in Tag.pm
- Try processing Gtk3 events on X11 idle for better responsiveness
- Make Xkb::lang_update() callable from external places
- Update doc with tag-specific layout fields
- Update resources/.XCompose with some emojis
- Add usage comment to korgwm_xrandr
- Update doc/Development.md with release procedure enhancements
5.0 2025-01-22
- Introduce vimish marks for windows:
- Add API calls to remember focused window and quicky select it when needed
- Improve multiple screens handling:
- Windows are moved to their preferred screens upon their reconnection
- Screen affinity is configurable in config file via the "placement" rule
- WM keeps track of the selected tag for particular screen configuration
- Implement D-Bus notifications server:
- Mark notifying windows as urgent when the server is in use
- Support API call to raise urgency by WM_CLASS
- Rework debug subsystem:
- Switch to debug levels: 1-9
- Introduce DEBUGx constant function for each debug level
- Introduce slow S_DEBUG function to use it within return statements
- Replace die/warn with croak/carp in applicable places
- Remove stale Devel::SimpleTrace dependency
- Set Carp::Verbose for debug level 3 or above
- Implement toggle_maximize() for invisible windows
- Replace implicit toggle with explicit set via parameter
- Support toggling for invisible windows
- Other minor improvements and fixes:
- Prevent windows from being mapped over any maximized one
- Implement _NET_SUPPORTED EWMH
- Fix Java AWT rendering issue without reparenting
- Add atom() caching function that creates them on demand
- Replace croak with carp for unknown ButtonPress events
- Fix buffer size to properly handle UTF-8 in Window->title()
- Implement Window->select() to simplify switching to window from anywhere
- Improve Expose grab keyboard timings
- Other small code refactoring
4.0 2024-10-07
- Significantly improved multi-screen experience:
- Windows are now returning back to their preferred screen after connecting it back
- Destination tag now corresponds to the original one during screen destroy phase
- Fix issue with screen_select() after changing screen topology
- Improved Expose module a lot:
- Use XComposite extension to properly make hidden windows screenshots
- Use get_image_data_rgba() to properly handle BGRA colorspace
- Expose module edge-cases optimization with zero and one visible windows
- Other small cosmetic changes
- Made numerous improvements related to mouse pointer events and position:
- Rework Window->focus() to show transients of maximized window
- Prevent EnterNotify on focus_cycle() to visit every window
- Prevent EnterNotify unmaximizing a window
- Fix race condition with EnterNotify mapping floating windows
- Fix race condition with focus during maximized windows startup
- Improve focus logic for multiple screens (see comment in f364d604e)
- Fix rapid EnterNotify preventor to avoid race condition on tag switching
- Prevent rapid FocusIn events firing on EnterNotify and tag_select()
- Avoid warp_pointer if the window already owns it
- Implement tag->{focus} to select focus window on tag switching
- Fix leaked reference of always_on window in Tag->focus
- Reworked focus_prev functionality keeping a list of previously focused windows:
- Make focus_prev keep five instead of two last windows
- Fix issue calling focus_prev() to some window below maximized one
- Fix focus_prev behaviour inside FocusIn handler
- Fix focus_prev focus stealing and tag switching
- Made mouse-based window movement and resize smoothier giving those actions more CPU time.
- Implemented feature to respect WM_SIZE_HINTS for newly created windows making dialogs look prettier.
- Updated X11::XCB to 0.23 to use brand new shiny features.
- Started several markdown documents, especially Development.md describing korgwm history.
- Slightly updated default config:
- Rebind Fn keys to Mod+Alt because of a ThinkPad bug
- Make pointer follow the window during win_move_tag()
- Change Mattermost screen affinity
- Support KORGWM_DEBUG_PORT environment variable to avoid EADDRINUSE starting second korgwm instance
- Rename workspace names using only numbers
- Other minor improvements and fixes:
- exec() now tries to open STDIN, STDOUT, STDERR to /dev/null after closing them
- Add some fairness to X events poller
- Add doc/release_checklist.md describing the release procedure
- Implement KORGWM_DEBUG_API to enable debug API calls regardless debug config
- Implement dump_screens() debug API call
- Update .xinitrc to avoid several freezes and other issues
- Ignore "Window errors" caught when closing multiple windows at a time
- Replace redundant splice with grep
- Fix issue with pointer not warped on a maximized window
- Fix shameful memory leak inside Window DESTROY routine
- Fix typo in focus->{window}
- Add Gtk3::disable_setlocale() to avoid 0.5 value interpreted as 0
3.1 2023-12-19
- WM_STATE atom is now created manually unless it already exists to prevent crashes on unconfigured X server.
- Fixed race condition on transient children removal.
3.0 2023-12-07
- Moved to X11::XCB 0.22
- Significantly improved logic around floating windows on multiple screens
- Implemented FocusIn support for background windows: now browser windows steals focus on URL opens.
- Implemented whitelist of windows with unset WM_CLASS: previously we just ignored them.
- Implemented autostart commands in API format (see configuration example).
- Other minor improvements:
- Add support for PrintScr button
- Make cosmetic changes to Readme
- Update outdated configuration samples
- Fix file permissions
- Erase window structure on Unmap
- Prevent ConfigureRequest moving windows out of their screens
- Fix issue with hiding the last visible workspace
- Fix stale panel title issues when moving floating windows between screens
- Fix stale urgency on window destroy
- Circumvent show() race condition in MapRequest
- Implement focus_prev() for hidden windows
2.0 2023-10-26
- Implemented tag_append() -- it's possible to append windows from other tags to the active one.
- xcb_unmap_window() was removed. From now on the windows are being moved out of visible area instead of unmap.
- Made initial_pointer_position multiple screen-aware: mouse pointer can now warp to the central screen.
- Other minor improvements:
- Update POD documentation
- Process cross-screen ConfigureRequests
- Handle margins while scaling Expose thumbnails
- Hide border size from ConfigureNotify
- Replace PREREQ_FATAL in Makefile with Test::More::BAIL_OUT
- Ignore windows with no WM_CLASS earlier
- Improve always_on handling
- Ignore EnterNotify on tag switching
1.0 2023-10-18
- First version, released on an unsuspecting world.