Revision history for korgwm. 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.