# CTWM Change History ## 4.1.0 (2023-03-26) ### Backward-Incompatible Changes And Removed Features 1. Support for `VirtualScreens` has been removed. This was an early attempt to allow some manual configuration of multiple monitors, but carried with it a lot of caveats and strange behaviors. The current automatic RANDR and manual `MonitorLayout` features are a replacement for anywhere this ever really worked. 1. `ctwm`'s captive mode support has been removed. This includes the `--window` and `--name` command line arguments, and the `f.adoptwindow` and `f.hypermove` functions. Be sure to remove any references to those functions from your config file. 1. Support for `WindowBox` has been removed, along with the `f.fittocontent` function related to it. 1. The minimum cmake version has been bumped to 3.6. This is available in standard packages back to CentOS 6, and we appear to have actually been using syntax requiring 3.5 for a while unknowingly anyway. ### New Features 1. Support for understanding multi-monitor layouts as something other than a single giant rectangle added. The RANDR X extension is used for determining how your monitors are laid out. The various `f.\*zoom` functions now zoom on the monitor the window is currently on, and new `f.x\*zoom` functions are added to zoom across your entire display. Various internal geometries can be specified RANDR-output-relative; see doc of _e.g._ `IconManagers`. Contributed by Maxime Soulé <>. 1. Added `MonitorLayout {}` config var for overriding the layout of multiple monitors. In normal cases with multiple monitors and a modern X server, this is unnecessary. It's useful if the X server doesn't support RANDR (_e.g._, older servers), or if the info it provides is wrong (_e.g._, multi-display simulation with Xephyr), or if you just prefer to specify things differently than they would otherwise be (_e.g._, treat an ultra-wide display as 2 separate monitors). 1. The EWMH `_NET_FRAME_EXTENTS` property is now set on windows when we take control of them. This should fix clients mispositioning other windows on top of themselves; visible with Firefox's form autofilling and context menus. Contributed by Maxime Soulé <>. ### Bugfixes 1. When restarting ctwm, the icon managers for the current workspace will now initially show up, rather than those for first WS. 1. When restarting ctwm, the stacking order of windows is now preserved. 1. Running `--cfgchk` without an available X server will now work. Some errors may only be discovered when it can talk to X (things relating to colors are a likely suspect). Checking configs for multi-Screen setups will now properly check all of them as well. 1. Fix display of combined modifiers in TwmKeys menu. Contributed by Maxime Soulé <>. 1. Fix window icon name spilling out into the border of icon manager entries. Contributed by Carl Svensson <>. 1. Fix minor mis-sizing and postitioning of squeezed titlebar when window is squeezed away. Contributed by Maxime Soulé <>. 1. Fix window placement when `DontMoveOff` is enabled without 3D borders. Contributed by Maxime Soulé <>. 1. When window titles overflow the available space, always treat them as left-justified, to avoid bad behavior of other justifications and provide the best available behavior. Found by Carl Svensson <>. ## 4.0.3 (2019-07-21) ### Bugfixes 1. Perform various manipulations and overrides of `WM_HINTS` property when it gets reset during runtime, like we do when initially adopting the window. The most visible effect of this was in windows that don't give a focus hint (which we override to give focus), but then reset `WM_HINTS` later and still don't give us a hint, where we wound up not re-overriding previously. Reported for `xvile` by Wayne Cuddy. 1. The font height estimation changes in 4.0.0 were not applied correctly when UseThreeDMenus was set, leading to some odd vertical misalignment of the text with some fonts. Reported by Wayne Cuddy. 1. A failure in OTP consistency checks caused by the handling of transients of fullscreen windows has been fixed. This manifested as failures in OtpCheckConsistencyVS() assertions. ## 4.0.2 (2018-08-25) ### Backward-Incompatible Changes And Removed Features 1. The `UseThreeDIconBorders` config var has been removed. It came in silently and undocumented in 3.4 and has never done anything. 1. The attempts to use DNS lookups for setting the `HOSTNAME` `m4` variable have been removed; it is now just a duplicate of `CLIENTHOST`. ### New Features 1. The EWMH `_NET_WM_NAME` property is now supported, and used for the window name in place of the ICCCM `WM_NAME` when set. By default, we also accept `UTF8_STRING` encoded `WM_NAME` as a result of this change; see below for var to restore historical strictness. 1. The EWMH `_NET_WM_ICON_NAME` property is now supported, and used for the icon name in place of the ICCCM `WM_ICON_NAME` when set. Similar comments as above apply to the encodings. 1. Support has been added for `CTWM_WM_NAME` and `CTWM_WM_ICON_NAME` properties, which will override any window/icon names otherwise specified. This may be useful for applications that set unhelpful names themselves, or for manually adjusting labelling. These properties can be set from the command line via `xprop`; as an example, `xprop -f CTWM_WM_NAME 8u -set CTWM_WM_NAME "awesome windowsauce"`. See `xprop(1)` manual for details; the `s`, `t`, and `u` field type specifiers will all work. 1. When no icon name is set for a window, we've always used the window name for the icon name as well. But that only happened the first time the window name is set; after that, the icon name is stuck at the first name. It now updates along with the window name, if no icon name is set. 1. All icon manager windows will now have the `TwmIconManager` class set on them, so they can be addressed en mass by other config like `NoTitle` by that class name. ### New Config Options 1. Added `DontNameDecorations` config option to disable setting names on the X windows we create for window decoration (added in 4.0.0). These have been reported to confuse `xwit`, and might do the same for other tools that don't expect to find them on non-end-app windows. Reported by Frank Steiner. 1. Added `StrictWinNameEncoding` config option to enable historical behavior, where we're reject invalid property encoding for window naming properties (like a `UTF8_STRING` encoded `WM_NAME`). ### Bugfixes 1. Fix up broken parsing of `IconifyStyle "sweep"`. Bug was introduced in 4.0.0. 1. When multiple X Screens are used, building the temporary file for m4 definitions could fail with an error from `mkstemp()`. Reported by Manfred Knick. 1. When multiple X Screens are used, the OTP code didn't recognize the difference, and kept everything in one list. This caused the internal consistency checks to trip when it didn't find all the windows it expected. Reported by Terran Melconian. 1. When `ReverseCurrentWorkspace` is set, mapping windows not on the current workspace (e.g., via restarting ctwm, or creating new windows with the desktop set via EWMH properties) could segfault. Reported by Sean McAllister. 1. Fix some edge cases where we'd fight other apps' focus handling. When an application moved focus itself to an unrelated (in X terms) window, our processing would often race and re-move the focus to the root ourselves. This was visible with e.g. sub-windows in Firefox for context menu and urlbar dropdown, which would flash on and then disappear. 1. When creating a new transient window of an existing full-screen window, the OTP stacking may cause it to be stuck below the main window due to the special handling of full-screen focused windows in EWMH. It should now be forced to the top. 1. Building ctwm since 4.0.0 in certain locales could misorder functions in the lookup table, leading to troubles parsing the config file. You'd get some loud "INTERNAL ERROR" lines from ctwm when running it if this were the case. Now fixed. Reported by Richard Levitte. ## 4.0.1 (2017-06-05) ### User Visible Changes 1. Fix a bug where fullscreen windows could sometimes wind up incorrectly stacked due to a focus-handling issue. This would lead to ctwm aborting with an assertion failure in the OTP code, like `Assertion failed: (PRI(owl) >= priority), function OtpCheckConsistencyVS`. 1. Fix an edge case (probably only triggerable via manual work with EWMH messages) where a window could wind up resized down to nothing. ### Internals 1. Systems with the ctfconvert/ctfmerge tools available will now use them to include CTF info in the compiled binary. This allows more detailed inspection of the running process via DTrace (e.g., the layout of the structs). 1. The initial rumblings of a Developer's Manual are now in `doc/devman/`. This isn't tied into the main build, and there's no real reason it ever will be. Things of interest to _users_ should wind up in the main manual; this should only have things of interest to people _developing_ ctwm. ## 4.0.0 (2017-05-24) ### Build System Change The old `imake` build system has been replaced by a new structure using `cmake`. This makes [cmake](https://cmake.org/) a requirement to build ctwm. See the `README.md` file for how to run it. A fallback minimal build system is available in the `minibuild/` directory for environments that can't use the main one. This is likely to need some manual adjustment on many systems, and the main build is strongly preferred. But it should suffice to get a runnable binary if all else fails. ### Platform Support Support for many non-current platforms has been dropped. In particular, remnants of special-case VMS support have been removed. Many old and now dead Unix variants have been similarly desupported. Generally, platforms without support for C99 and mid-2000's POSIX are increasingly less likely to work. ### Backward-Incompatible Changes And Removed Features 1. Argument parsing has been rewritten to use `getopt_long()`. All `-long` options are now `--long` instead. `-version`, `-info`, `-cfgchk`, and `-display` are still accepted if they're the first option given, to make it easier for scripts to simultaneously support before/after versions; this shim will be removed in a later version. 1. Support for the SDSC imconv library, and the IMCONV options related to it, has been removed. The last release is almost 20 years old, and doesn't support any remotely recent platforms. 1. The USE_SIGNALS code to use signal-driven animations has been removed. It's been non-default since 3.2 (more than 20 years ago), and not documented anywhere but in the code and a comment in this file. 1. The USE_GNOME option and code for GNOME1 support has been removed. 1. The old-style title button action specifications (without an `=` in them) deprecated since 3.8 are no longer supported. Just replacing the "`:`" with "`= :`" should suffice to make it work right in 3.8+. If you need to share configs with older versions, you'll have to conditionalize the syntax with m4 or some other preprocessing. 1. The `f.cut` (and `^` alias for it), `f.cutfile`, and `f.file` functions have been removed. These functions for messing with the clipboard were never visibly documented, and came into the manpage in 3.0 already commented-out and saying they were obsolete. 1. The `f.source` function has been removed. It's never done anything (except beep) as far back as 1.1 and has never been documented. 1. The `f.movemenu` function has been removed. It was added silently in 2.1, has never done anything, and has never been documented. 1. The `NoVersion` config parameter has been removed. It's been undocumented, obsoleted, and done absolutely nothing since 1.1. 1. Support for non-flex versions of lex(1) is deprecated, and will take some manual work to build. Note that release tarballs include prebuild lexers, so this probably only matters to people building from a development tree. (And if you are, and really need AT&T or some other lex to work, talk to us!) 1. Support for building with internal regex implementation has been disabled; we now require regex support from libc. It is still possible to enable by manually editing files, but this will be removed in the future. If you have to mess with this, please bring it up on the mailing list so we can figure out a long-term solution. 1. Parsing of the `ctwm.workspaces` X resource (i.e., setting `-xrm "ctwm.workspaces: something"` on program command-lines) since 3.0 has collapsed doubled backslashes (`\\`) into a single (`\`). However, there were no other escapes, so this didn't gain anything. Using a single will work with both variants, unless you need multiple backslashes in a row in your workspace names. 1. The `IconRegion` and `WindowRegion` config params both take a `vgrav hgrav` pair of parameters to control layout. Previous versions would accept a `hgrav vgrav` ordering in the parsing, and would mostly work by odd quirks of the code. The parsing has been made stricter, so only the documented `vgrav hgrav` ordering is accepted now. ### User Visible Changes 1. The default install locations have been changed. See the README for details about where things are installed and how to change them. 1. Several default settings have been changed. ctwm now defaults to acting as though `RestartPreviousState`, `NoGrabServer`, `DecorateTransients`, `NoBackingStore`, `RandomPlacement`, `OpaqueMove`, `OpaqueResize`, `SortIconManager`, and `StartInMapState` have been set. Those settings that didn't previously have an inverse (to get the behavior previously seen when they weren't specified) have such added; see below. 1. Added various config parameters as inverses of existing params. New params (with existing param they invert in parens): * `BackingStore` (`NoBackingStore`) * `GrabServer` (`NoGrabServer`) * `StartInButtonState` (`StartInMapState`) * `NoSortIconManager` (`SortIconManager`) * `NoRestartPreviousState` (`RestartPreviousState`) * `NoDecorateTransients` (`DecorateTransients`) 1. Added `DontShowWelcomeWindow` config option to not show welcome splashscreen image. 1. Selected a number of cleanups from Stefan Monnier <>, including rate-limiting of animations using a new `_XA_WM_END_OF_ANIMATION` message. Font height is estimated based on used characters only. Added some similar changes, improved the prevention of placing windows off-screen, the `f.rescuewindows` function for emergencies, a hack-fix for `f.adoptwindow`. More virtual screen tweaks/fixes. 1. Added the remaining OnTopPriority changes from Stefan Monnier <>: `AutoPopup`, `AutoPriority`, `OnTopPriority`, `PrioritySwitching`, `f.changepriority`, `f.priorityswitching`, `f.setpriority`, `f.switchpriority`, `f.tinylower`, `f.tinyraise`. Currently consistency checking code is enabled, which will terminate with an assertion failure if something unexpected happens. Smoothed out various inconsistencies that this check discovered when virtual screens are used. 1. Basic support for EWMH (Extended Window Manager Hints) added and enabled by default. `EWMHIgnore {}` config option allows selectively disabling bits. [Olaf "Rhialto" Seibert, Matthew Fuller] 1. Icon manager windows are no longer included in the window ring (that had confusing effects on the focus sequence). 1. Added `--dumpcfg` command-line option to print out the compiled-in fallback config file. 1. The `Occupy {}` specification now accepts "ws:" as a prefix for workspaces. This may break things if you have workspaces with names that differ only by that prefix (e.g., you have workspaces "abc" and "ws:abc", and your `Occupy {}` declarations affects both. 1. If ctwm is built with rplay support, sounds may now be configured with the RplaySounds {} parameter in the config file in place of the `~/.ctwm-sounds` file. If so, ctwm will give a warning if `.ctwm-sounds` exists; support for the external file will be removed in a future version. Also the `SoundHost` config parameter is replaced by `RplaySoundHost`; the old name is still accepted, but will be removed in a future version. 1. Added `MWMIgnore {}` config option to allow selectively disabling honoring of some Motif WM hints. 1. Warping to a window now explicitly sets focus on that window. This would generally (but not always, in the presence of odd X server behavior) have already happened for users with focus following mouse, but now occurs for `ClickToFocus` users as well. [Alexander Klein] 1. Several bugs relating to the Occupy window were fixed. Iconifying the Occupy window no longer loses it and leaves you unable to pull it up again. Minor undersizing in some cases fixed. 1. Windows which fail to use the `WM_HINTS` property to tell us things like whether they want us to give them focus are now explicitly given focus anyway. This should fix focus problems with some apps (Chromium is a common example). 1. Added `ForceFocus {}` config option to forcibly give focus to all (or specified) windows, whether they request it or not. Previously the code did this unconditionally (except when no `WM_HINTS` were provided; x-ref previous), but this causes problems with at least some programs that tell us they don't want focus, and mean it (some Java GUI apps are common examples). 1. `OpaqueMoveThreshold` values >= 200 (the default) are now treated as infinite, and so will always cause opaque moving. ### Internals 1. A new code style has been chosen and the entire codebase reformatted into it. Configs for [Artistic Style](http://astyle.sourceforge.net/) to generate the proper output are in the source tree. 1. The `full_name` element of the TwmWindow structure has been removed. Consumers should just use the `name` element instead. ## 3.8.2 (2014-05-18) 1. Various code cleanups. * Cleanup re: raising and warping to windows (previous location of pointer in windows), SaveWorkspaceFocus. A few extra NULL pointer checks. * Logical hasfocusvisible cleanup. * Rename TwmWindow.list to iconmanagerlist, and various smaller cleanups. * Eliminated TwmWindow TwmRoot from struct ScreenInfo. Mostly a mechanical change. I found some cases where the dummy TwmWindow was apparently mistakenly included in a loop. Replaced `.next` with `TwmWindow *FirstWindow` and `.cmaps` with `Colormaps RootColormaps`. Other members were not used. 1. Fix a bug where insufficient validation of the size hints resulted in a division by zero when considering aspect ratio. 1. Lots of minor compiler warnings and build fixes, a few of which were real current or latent bugs. Leave warnings enabled by default. A few of the build system adjustments may break very old systems (e.g., those with original AT&T `yacc`). 1. Fix incorrect inclusion of `$DESTDIR` in some paths. 1. Update for new website and mailing list at . 1. Look at `_MOTIF_WM_HINTS` for titlebar-less or border-less windows. ## 3.8.1 (2012-01-05) 1. Fix bug causing [de]iconified status of windows to not be maintained across workspaces. [Matthew Fuller] 1. Quiet a bunch of compiler warnings. [Matthew Fuller] 1. Make sure we fully initialize our WorkSpaceWindow structure so we don't try to dereference uninitialized pointers later on. [Matthew Fuller] 1. Increased the number of supported mouse buttons again, having just heard of a mouse with 9 possible buttons... [Richard Levitte] 1. Fix a bug in the warping "next" function, where if there is a single window and the cursor is not on it, invoking `f.warpring "next"` does nothing. [Martin Blais] 1. Introduce a new feature called "SaveWorkspaceFocus", which when enabled, makes ctwm remember which window has the focus within each virtual workspace. As you switch workspaces, the cursor is automatically warped to the window previous in focus in the workspace. This significantly reduces the amount of mouse use. [Martin Blais] 1. f.fill patch from Matthias Kretschmer <>. Without the patch, you might get windows which are increased by two times the border width more than it should be. Additionally if you place a window with no/not much size contrainst like firefox in the upper left corner and perform `f.fill "top"` or `f.fill "left"` the size of the window will increase by two times the border width in width and height without changing the top-left coordinate without the patch. Of course in such a situation the size should not change at all... [via Olaf Seibert] ## 3.8 (2007-02-16) 1. Global cleanup. There were some variables shadowing others, things not being safely initialized, that sort of thing. [Richard Levitte] 1. Fixed several memory leaks found by "Nadav Har'El" <>. [Olaf "Rhialto" Seibert] 1. Merged in the `f.movetitlebar` command. By default this is bound to alt-left-click in the titlebar. [Olaf "Rhialto" Seibert] 1. Fixed the following issue: * Poking at the code, it looks like InitVirtualScreens() is called before the configuration file is parsed which would explain what I see since there's no attempt to create them after the config file read. Moving the call after the config parsing causes things to work. * I've run into a few other issues that I fixed with the attached patch: * shadow menus on the right screen open the shadow on the left screen * shadow menus on the left screen open on top of the window * windows on the right screen disappear after startup [Todd Kover] 1. Adjustments to ctwm.man. I noticed a couple of small errors. [Ross Combs] * One is that the window list arguments for the opaque keywords are now optional, are listed with square brackets in the man page. * The other is that the two Threshold keywords are shown in the man page as requiring curly-brackets, but they are not required or accepted in configuration files. 1. Improve algoritm to deal with mismatched geometry of virtual screens * allow windows to be dragged from one virtual screen to another and have them switch workspaces appropriately * handle restarts properly with virtual screens, including preserving where windows were placed within workspaces regardless of which virtual screen a window was on; preserve across restarts [Todd Kover] 1. `WMapCreateCurrentBackGround()` and `WMapCreateDefaultBackGround()` would skip remaining virtual screens if not all parameters are present. Small type errors. [Olaf "Rhialto" Seibert] 1. There were some directives in the config file that wanted to set some setting for all virtual screens. However since that list is (now) only set up after parsing the config file, they failed to work. Moreover, these settings were basically meant to be global to all virtual screens, so a better place for them is somewhere in `*Scr`. They all related to the Workspace Manager, so I moved them from `struct WorkSpaceWindow` to `struct WorkSpaceMgr`. The affected directives are StartInMapState, WMgrVertButtonIndent, WMgrHorizButtonIndent, MapWindowCurrentWorkSpace, MapWindowDefaultWorkSpace. The window and icon_name, even though not user-settable, were also moved. This is basically the previous change above done right. [Olaf "Rhialto" Seibert] 1. Re-introduced `TwmWindow.oldvs`, used to avoid calling `XReparentWindow()` when possibe (it messed up the stacking order of windows). However, maybe the use of `.vs` should be rethought a bit: in `Vanish()` it is now set to `NULL` with the old value kept in `.oldvs`. However the window is still a child of the same vs. Maybe it is better not to set it to `NULL` and then, when *really* changing the virtual screen, `.vs` can be used instead of `.oldvs`. This whole "virtual screen" thing is unexplained in the manual, which even uses it as a synonym for "workspace" already in the introduction paragraph. (There also does not seem to be a way now to test virtual screens in captive windows) I suspect that all this causes lots of confusion, and when cleared up, can simplify the code a lot. I also fixed up the horrible indentation in the functions where I changed something. [Olaf "Rhialto" Seibert] 1. Fixed interaction between "inner" and "outer" workspace selection with "captive" windows. This was because the Gnome `_WIN_WORKSPACE` property is used in 2 conflicting ways: for client windows it indicates which workspace they are in, for root windows it indicates which workspace they show. Captive windows are both. Also, the initially selected inner workspace is now the first, not the same as the outer workspace (this had a different cause). [Olaf "Rhialto" Seibert] 1. Introduce `Scr->XineramaRoot` to store the root window that encompasses all virtual screen rootwindows. This further reduces any need to use RealRoot and/or CaptiveRoot. Add a schematic drawing that clarifies the relation between the various root-type windows. [Olaf "Rhialto" Seibert] 1. Get rid of all non-locale code and make I18N the silent default (doesn't have to be mentioned any more). **THIS WILL BREAK CTWM ON OLDER (PRE-LOCALE) ENVIRONMENTS**. I strongly recommend an upgrade to "post-locale" standards. [Richard Levitte] 1. Enhance RandomPlacement with a displacement argument, so the pseudo-radomness can be of displacements other than +30+30. Here's an example for a pretty funky displacement: RandomPlacement "on" "-30-100" [Richard Levitte] 1. Extend the Info window with the geometry seen from the lower right corner as well. [Richard Levitte] 1. Extend the pointer button specification for title buttons to take modifiers. As part of this change, the following title pointer button specification is deprecated: Button {j} : {function} in favor of the following, for consistency: Button {j} = {function} The old way still works, but is considered bad form and will be removed in a future version ("ctwm 4.0"). [Richard Levitte] 1. Fix position of buttons in Occupy window, to make them centered. (and spread the remaining space evenly in 4). [Olaf "Rhialto" Seibert] 1. `TwmWindow.group` was once apparently set to 0 when a window had no group leader but this was changed to pointing to its own window. This resulted however in many places checking for both conditions, and several checking only for 0 which could not occur anymore. Changed it back to 0 (so we can now distinguish again windows that really indicate themselves as group leader, if we wish) and this gave rise to some simplifications. Also, there were various loops through all TwmWindows looking for a group leader (or a `transientfor`), I replaced them with `GetTwmWindow()` which uses the Xlib function `XFindContext()` which uses a hash table lookup. This should be more efficient. When you change the occupation of a group member window, it is now applied to the group leader (which in turn affects all members). I tried this with ExMH, the only program that uses a real group leader that I could find. Iconifying the leader unmaps the members. What should "squeezing" do? ExMH also has an icon window (see ICCCM 4.1.9, 3rd option) which behaves weirdly; this may be a bug in ExMH (see exmh-2.7.2/exmh.BUGS) even though fvwm somehow handles it better. [Olaf "Rhialto" Seibert] 1. When Squeezing a window group leader, unmap the member windows, just like happens with iconification. [Olaf "Rhialto" Seibert] 1. Simplifications c.q. de-duplications of code regarding the WorkSpaceManager and Occupation windows. This includes coding the layout of these windows only once instead of twice (at initialisation and when resizing). If it's wrong now at least it should be consistent. When changing occupation via functions like f.movetonextworkspace, also move complete window groups (just like when you do it via the Occupation window). Also fixed changing the occupation of the Occupation window. Documented (so far) undocumented possibility to edit the labels of workspaces on the fly (what use this is, I'm not sure). Removed some unused variables. [Olaf "Rhialto" Seibert] 1. Get rid of the `USE_SESSION` and `X11R6` macros and make them the silent default. Also cleaned out a few references to the macro `X11R4`, which hasn't been used for ages. **THIS WILL BREAK CTWM ON OLDER (PRE-X11R6) ENVIRONMENTS**. I strongly recommend an upgrade to a newer X11 release. [Richard Levitte] 1. Modified the random placement so a negative X displacement has the first "random" window start near the right edge instead of the right and a negative Y displacement has the first "random" window start near the bottom edge instead of the top. [Richard Levitte] ## 3.7 (2005-07-19) 1. Workspace context (bkctwmws.patch) Makes it possible to bind keys specific to the workspace manager (by Björn Knutsson). Use the event context "workspace" for this. 1. New keyword : AlwaysSqueezeToGravity If it is enabled, window squeezing always follows window gravity (instead of northward when the window has a title). (by Rudolph T. Maceyko). 1. TwmKeys and TwmVisible menus (dlctwmmenu.patch) Adds TwmKeys (rootmenu listing all keybindings) and TWM Visible (rootmenu showing only deiconified windows) (by Dan Lilliehorn). 1. Preliminary GNOME compliance (see README.gnome and TODO.gnome) (by Nathan Dushman). 1. IconifyStyle : "normal" "mosaic" "zoomin" "zoomout" "sweep" A few "fancy" graphical effects when you iconify windows, just for fun. 1. JPEG images support : You can now use jpeg image files wherever you can use images. Use the `jpeg:imagename` syntax. 1. `f.showbackground` Since we can now use fancy jpeg image for root backgrounds, this function unmaps all windows in the current workspace. This is a toggle function, if all windows are unmapped, they are all remapped. Better bind this function in the root context. 1. Preliminary support for Xinerama extention. You can define "virtual" screens (it's better if they correspond to you actual screens). The thing is that you can see several workspaces at the sams time, one per virtual screen. Of course, you cannot view the same workspace (or the same window) in 2 vscreens at the same time. The syntax is: VirtualScreens { "1280x1024+0+0" "1600x1200+1280+0" } for 2 screens, the first one (on the left) is 1280x1024, the second one (on the right) is 1600x1200. This is preliminary, because this has not been extensively tested. I did this because I have now 2 screens, but I was unable to get them working properly, so I use only one. 1. **[ At this point, Claude has stopped working on CTWM, and the project is now in the hands of Richard Levitte <>. ]** 1. Changed Imakefile to support a distribution target. 1. Changed `:xpm:cross` to become a bit larger and have a slightly more 3D appearance, and is visible even in very dark configurations. 1. Make AlwaysSqueezeToGravity to work for all windows (if no window list is given). 1. New keyword: `NoImagesInWorkSpaceManager` If it's enabled, background images aren't displayed in the workspace map. This was contributed by Thomas Linden. 1. New command line option: `-cfgchk` If used, CTWM will only parse the configuration file and indicate if it found errors or not. This was contributed by Matthew D. Fuller. 1. `DontMoveOff` patch (by Björn Knutsson) Change the behavior of `DontMoveOff` / `MoveOffResistance` so that when you attempt to move a window off screen, it will not move at all until it's been moved `MoveOffResistance` pixels (as before), but at this time it will no longer "snap", but instead it will start moving off screen. This means that you still have the old behavior of DontMoveOff, but now with the ability to move a window off screen less that `MoveOffResistance` pixels. 1. Random placement and DontMoveOff patch (by Björn Knutsson, changed) When random placement was used, DontMoveOff wasn't honored. This behavior has now changed so a window will be kept within the screen when at all possible. When the window is too large, it's top or left edge (or both) will be placed in coordinate 0. This change differs a little bit from Björns contribution by not using rand() at all. 1. `f.warpring` patch (by Björn Knutsson) If `IconManagerFocus` is set, there's no reason why the icon manager should get enter and leave events. This fixes some disturbing in the warpring that would otherwise happen. 1. `f.movetoprevworkspace`, `f.movetonextworkspace`, `f.movetoprevworkspaceandfollow`, `f.movetonextworkspaceandfollow` patch (by Daniel Holmström) Makes it possible to move a window to the previous or next workspace and, if you like, go to that workspace and focus the moved window. 1. `f.fill` "vertical" patch (by Daniel Holmström) Expands the window vertically without overlapping any other window, much like `{ f.fill "top" f.fill "bottom" }` but with the exception that it doesn't expand over window borders. It also sets the windows "zoomed" to `F_FULLZOOM`, so one can toggle between this size, original and maximized. 1. `RESIZEKEEPSFOCUS` bugfix patch (by Daniel Holmström) If a window is maximized with `togglemaximize` and then restored it might loose focus if the cursor is outside the restored window. This hack puts the cursor at the left-top corner of the window. 1. `f.zoom` bugfix patch (by Daniel Holmström) `f.zoom` now doesn't move the window up (as it sometimes did before) 1. `IgnoreTransient` patch (by Peter Berg Larsen) New keyword with list of windows for which to ignore transients. 1. Workspace switch peformance optimization (by MC) Stops ctwm from redrawing windows that occupy all workspaces when switching from one workspace to another. 1. GTK "group leader" bugfix (by Olaf 'Rhialto' Seibert) Makes ctwm aware of the mysterious GTK group leader windows. 1. Resize cursor with non-3D-borders bugfix (by Olaf 'Rhialto' Seibert) BorderResizeCursors now works also for top and left borders when non-3D-borders are used. 1. Memory leak bugfix (by Simon Burge) `GetWMPropertyString` in `util.c` no longer leaks memory. 1. Warpring bugfix (by Takahashi Youichirou) Solves these two problems when warping the pointer to the next/previous mapped window: * Sometimes the pointer moved right too much and ended up outside the title bar. * When the active window was closed and the pointer ended up on the root window, the pointer wouldn't warp until moved with the mouse. 1. NoWarpToMenuTitle patch (by Julian Coleman) Fixes the sometimes annoying feature that the cursor is warped to the menu title if the menu won't fit on the screen below the current pointer position. This patch introduces a new keyword `NoWarpToMenuTitle` keyword to turn this off. 1. `Scr->workSpaceMgr.windowFont` font init bugfix (by Martin Stjernholm) `The Scr->workSpaceMgr.windowFont` in workmgr.c is now initialized. 1. Full GNU regex patch (by Claude Lecommandeur) It is now possible to use full GNU regex for window or class names by defining `USE_GNU_REGEX` in Imakefile. It is disabled in the default Imakefile. 1. DontToggleWorkSpaceManagerState patch (by Dan 'dl' Lilliehorn) New keyword to turn off the feature toggling the workspace manager state to/from map/button state when you press ctrl and the workspace manager window is in focus. 1. TWMAllIcons patch (by Dan 'dl' Lilliehorn) Adds the TWMAllIcons menu, listing all iconified windows on all workspaces. 1. `f.changesize` patch (by Dan 'dl' Lilliehorn) Adds the function `f.changesize` which allows you to change the size of the focused window via menus and keybindings. Examples: "Down" = c|s: all : f.changesize "bottom +10" "F1" = c|s: all : f.changesize "640x480" 1. When crashing, ctwm now refers to ctwm-bugs@free.lp.se instead of Claude.Lecommandeur@epfl.ch. **NOTE: This is historical information: neither of these addresses are the current contact.** 1. Changed all the code to use ANSI C prototypes instead of the old K&R style. [Richard Levitte] 1. Only use the DefaultFunction if no function was found. [Richard Levitte] 1. Correct DontMoveOff The DontMoveOff checks when calculating random placement wasn't satisfactory. It ended up placing all windows that were small enough to fit in a random place at +50+50 with no exception. The behavior has now been changed to only apply to very large windows (almost as large as or larger than the screen). At the same time, the RandomPlacement algorithm and the DonMoveOff checks have been tweaked to keep the title height in mind, so centering and coordinates correspond to the realities of the rest of CTWM. [Richard Levitte] 1. Correct resizing from menu Choosing resize from the menu when not having 3D borders moved the target window down and right by a border width. This was an error in window position calculations. [Richard Levitte] 1. Enhanced info window Added the outer geometry. Added the 3D border width. [Richard Levitte] 1. Restart on subsequent SIGHUPs Reworked the code that catches a SIGHUP and has ctwm restart as a result. The restarting code has moved from Restart() to the new DoRestart(). Restart() now only sets a flag, and CtwmNextEvent() has been changed to react to that flag and call DoRestart(). From now on, CtwmNextEvent() is always used to get the next event, even when no animations are going on. [Richard Levitte] 1. A number of VMS-related changes DEC/HP PC is a bit picky, the X11 environment is a little bit different, and there were some sign/unsigned conflicts and one too large symbol (the VMS linker truncates anything beyond the 31 first characters of any symbol name), so some tweaks were needed to get CTWM to build cleanly on VMS. [Richard Levitte] 1. Allow gcc users to build with paranoia To make it easier to find possible problems, the Imakefile macro GCC_PEDANTIC can be defined in Imakefile.local. [Richard Levitte] 1. Allow spaces in sound files. The .ctwm-sounds file parser would clip sound files at the first spaces. That won't do for sound libraries where file names may have spaces in them. The parser now accepts spaces in file names, and will trim spaces from the beginning and the end of both file names and event tokens, allowing for a slightly more flexible format. [Richard Levitte] 1. ctwm.spec Added a specification file for RPM building. [Richard Levitte] 1. More info for m4 The m4 subprocess now gets the variable PIXMAP_DIRECTORY, which is defined to the directory where the pixmaps are installed, and the new flags IMCONV, GNOME, SOUNDS, SESSION and I18N. [Richard Levitte] 1. Document sounds The sounds system is now documented in the man page. [Richard Levitte] 1. Build RPMs Added the target "rpm" to build an RPM directly from a distribution tarball. [Richard Levitte] 1. Make life easier for package builders Added the possibility to configure where some libraries can be found through the use of `USER_*` make variables in Imakefile.local. Added a lot more commentary in Imakefile.local-template. [Richard Levitte] 1. Make it easier to configure on VMS Moved all the configuration definitions to descrip.local-template, and instruct the users to copy that file to descrip.local and make all needed changes there. [Richard Levitte] 1. Changed all relevant occurences of levitte@lp.se to richard@levitte.org. [Richard Levitte] ## 3.6 (2002-08-08 or earlier) 1. Fix line numbers for errors when using m4 preprocessor. Send thanks to Josh Wilmes <>. 1. Fix the way menu entries are selected with the keyboard. Now when you type a letter, the pointer moves to the next entry whose first letter is this letter, but does not activate it. The new keyword IgnoreCaseInMenuSelection, can be used to ignore case for this delection. 1. New keyword: DontSave. Takes a window list as argument. All listed windows won't have their characteristics saved for the session manager. Patch from Matthias Baake <> 1. Also from Matthias Baake <>: With the new keywords BorderLeft, BorderRight, BorderBottom and BorderTop (each of them is optional with a default value of 0 and takes a nonnegative integer as argument) you can declare a border "off limits" for f.move etc.. These borders act the same way as the real borders of the screen when moving windows; you can use f.forcemove to override them. 1. Sloppy Focus added with keyword "SloppyFocus" in configuration file (DINH V. Hoa <>). 1. The keyword "ClickToFocus" has been correctly implemented (DINH V. Hoa <>). 1. The keyword "IgnoreModifier" has been added, to use this feature, you have to add a line `IgnoreModifier { lock m2 }` in the configuration file. All bindings (buttons and keys) will ignore the modifiers you specified. It is useful when you use caps locks or num locks. You don't need IgnoreLockModifier any more with this option. (DINH V. Hoa <>). 1. New keyword: WindowBox. Creates a new window called a box, where all the client windows that match the windows list are opened in, instead of the roor window. This is useful to group small windows in the same box (xload for instance) : WindowBox "xloadbox" "320x100+0-0" { "xload" } 1. New function: f.fittocontent. Can be used only with window boxes. The result is to have the box have the minimal size that contains all its children windows. 1. New keyword: WindowGeometries. Used to give a default geometry to some clients: WindowGeometries { "Mozilla*" "1000x800+10+10" "jpilot*" "800x600-0-0" } 1. New keyword: IconMenuDontShow. Don't show the name of these windows in the TwmIcons menu. 1. And, as usual, a few bug fixes here and there. ## 3.5.2 (1999-09-10 or earlier) 1. `f.moveresize`: Takes one string argument which is a geometry with the standard X geometry syntax (e.g. `200x300+150-0`). Sets the current window to the specified geometry. The width and height are to be given in pixel, no base size or resize increment are used. 1. AutoLower et `f.autolower`: from Kai Großjohann (Kai.Grossjohann@CS.Uni-Dortmund.DE). Same as autoraise but with lower. 1. `WindowRingExclude`: Takes a window list as argument. All listed windows will be excluded from the WarpRing. 1. A new menu: "TwmIcons" same as "TwmWindows", but shows only iconified windows. I did this when I got bored of having icons. Now I have no icons and no icon managers. I use this menu to deiconify windows. When I was young, I liked to have brightly colored icons, but now that I am getting old(er), I prefer a bare desktop. ## 3.5.1 (1999-05-02 or earlier) 1. `f.initsize`: resets a window to its initial size given by the `WM_NORMAL_HINTS` hints. 1. `f.ring`: Selects a window and adds it to the WarpRing, or removes it if it was already in the ring. This command makes f.warpring much more useful, by making its configuration dynamic (thanks to Philip Kizer <>). 1. f.jumpleft, f.jumpright, f.jumpup, f.jumpdown : takes one integer argument (the step). These function are designed to be bound to keys, they move the current window (step * {X,Y}MoveGrid) pixels in the corresponding direction. stopping when the window encounters another window (ala f.pack). ## 3.5 (1997-11-27 or earlier) 1. `f.pack [direction]`. Where direction is one of: "right", "left", "top" or "bottom". The current window is moved in the specified direction until it reaches an obstacle (either another window, or the screen border). The pointer follows the window. Examples: "Right" = m : window : f.pack "right" "Left" = m : window : f.pack "left" "Up" = m : window : f.pack "top" "Down" = m : window : f.pack "bottom" 1. `f.fill [direction]`. Where direction is either : "right", "left", "top" or "bottom". The current window is resized in the specified direction until it reaches an obstacle (either another window, or the screen border). "Right" = s|m : window : f.fill "right" "Left" = s|m : window : f.fill "left" "Up" = s|m : window : f.fill "top" "Down" = s|m : window : f.fill "bottom" 1. `f.savegeometry`. The geometry of the current window is saved. The next call to `f.restoregeometry` will restore this window to this geometry. 1. `f.restoregeometry` Restore the current window geometry to what was saved in the last call to `f.savegeometry`. 1. ShortAllWindowsMenus Don't show WorkSpaceManager and IconManagers in the TwmWindows and TwmAllWindows menus. 1. f.toggleworkspacemgr Toggle the presence of the WorkSpaceManager. If it is mapped, it will be unmapped and vice verça. 1. OpenWindowTimeout number number is an integer representing a number of second. When a window tries to open on an unattended display, it will be automatically mapped after this number of seconds. 1. `DontSetInactive { win-list }` These windows won't be set to InactiveState when they become invisible due to a change workspace. This has been added because some ill-behaved clients (Frame5) don't like this. 1. `UnmapByMovingFarAway { win-list }` These windows will be moved out of the screen instead of being unmapped when they become invisible due to a change workspace. This has been added because some ill-behaved clients (Frame5) don't like to be unmapped. Use this if the previous doesn't work. 1. `AutoSqueeze { win-list }` These windows will be auto-squeezed. i.e. automatically unsqueezed when they get focus, and squeezed when they loose it. Useful for the workspace manager. (Note, it is not possible to AutoSqueeze icon managers). 1. `StartSqueezed { win-list }` These windows will first show up squeezed. 1. RaiseWhenAutoUnSqueeze Windows are raised when auto-unsqueezed. 1. Now if the string "$currentworkspace" is present inside the string argument of f.exec, it will be substituated with the current workspace name. So it is possible to do something like : f.exec "someclient -xrm ctwm.workspace:$currentworkspace &" and the client will popus up in the workspace where the command was started even if you go elsewhere before it actually shows up. 1. Fixes for the VMS version. From Richard Levitte - VMS Whacker <>. 1. Better I18N. From Toshiya Yasukawa <>. (Define I18N in Imakefile to activate it). 1. Better Session Management interface. Patches from Matthew McNeill <>. 1. new flag : `-name`, useful only for captive Ctwm. Sets the name of the captive root window. Useful too for next point. If no name is specified ctwm-n is used, where n is a number automatically generated. 1. Two new client resources are now handled by Ctwm : * `ctwm.redirect: ` The new client window is open in the captive Ctwm with name ``. * `ctwm.rootWindow: ` The new client window is reparented into `` (whaa!!!). It is up to you to find any usefullness to this. 1. If the string "$redirect" is present inside the string argument of f.exec, it will be substituated with a redirection to the current captive Ctwm if any (or nothing if in a main Ctwm). So it is possible to do something like : f.exec "someclient $redirect &" and the client will popus up in the right captive Ctwm. 1. New function f.hypermove. With it, you can drag and drop a window between 2 captives Ctwm (or between a captive and the root Ctwm). 1. 2 new m4 variables defined in your startup file: * TWM_CAPTIVE : value "Yes" if Ctwm is captive, "No" else. * TWM_CAPTIVE_NAME : The name of the captive Ctwm, if captive. 1. `RaiseOnClick`: if present a window will be raised on top of others when clicked on, and the ButtonPress event will be correctly forwarded to the client that owns this window (if it asked to). RaiseOnClickButton :