Revision history for korgwm.

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.
