With most window managers, I usually set them up as a
MacOS/NextStep/WindowMaker style "click the titlebar to raise, drag to
move, double-click to squeeze/shade it". So when I started to
experiment with ctwm, it was one of the first things I tried to replicate.
"f.raiseorsqueeze" comes close by itself, but obviously lacks the "drag"
functionality, and I couldn't seem to get the right behaviour with a
function using, say, "f.move f.deltastop f.raiseorsqueeze"-- seemed like
it was eating the double click somehow.
I cobbled together some of the existing parts to make a handler for a
new operation "f.raisemoveorsqueeze". It seems to work pretty well for
a trifling amount of hacking on an unfamiliar code base. :)
It consists of adding this to functions_win_moveresize.c
DFHANDLER(raisemoveorsqueeze)
{
/* Raise the window with the "tinyraise" logic */
if(tmp_win->icon && (w == tmp_win->icon->w) && Context != C_ROOT) {
OtpTinyRaise(tmp_win, IconWin);
}
else {
OtpTinyRaise(tmp_win, WinWin);
WMapRaise(tmp_win);
}
/* FIXME using the same double-click ConstrainedMoveTime here */
if((eventp->xbutton.time - last_time) < ConstrainedMoveTime) {
Squeeze(tmp_win);
return;
}
func = F_MOVEPACK;
movewindow(EF_ARGS);
}
and then the corresponding details need to be added to
functions_defs.list and functions_internal.h to expose it as a new
function. Obviously, my preferences are visible (defaulting to movepack
behaviour instead of move)
Semi-related question: Is there a general way to bind a double-click?
In fvwm, I set the "delete" commands to only run on a double-click as
protection against accidentally pressing the button. I could see adding
another action that basically falls back to a no-op if a single click is
recorded to achieve this in ctwm, but if there's a "standard" way to do
it with configuration, better that than writing one off customizations.
There's probably a way to do what this does in ctwmrc too, just haven't
figured it out and went straight to the power tools. :)