If you appreciate SloppyFocus or MouseFocus but can’t get used to the mouse pointer jumping to the upper left corner of the window as you switch windows with Alt+Tab or similar, you could try something like this:
AddToFunc reposition_pointer
+ I PipeRead 'echo $[pointer.x] $[pointer.y] $[w.width] $[w.height] $[w.x] \
$[w.y] | $[fvwm_scrpt]/reposition_pointer'
DestroyFunc WindowListFunc
AddToFunc WindowListFunc
+ I Iconify off
+ I FlipFocus
+ I Raise
+ I reposition_pointer
This requires that you put a little program named “reposition_pointer” in your Fvwm script catalogue. The source looks like this:
#include <stdio.h>
int main ()
{
int pointer_x, pointer_y, width, height, left, top, right, bottom;
scanf("%i %i %i %i %i %i", &pointer_x, &pointer_y, &width, &height, &left, &top);
right = left + width;
bottom = top + height;
if (pointer_x > right)
pointer_x = right - 5;
else if (pointer_x < left)
pointer_x = left + 5;
if (pointer_y > bottom)
pointer_y = bottom - 5;
else if (pointer_y < top)
pointer_y = top + 5;
printf("WindowId root WarpToWindow %ip %ip\n", pointer_x, pointer_y);
return 0;
}
(Compile it with gcc reposition_pointer.c -o reposition_pointer)
So what does it do? Well, while switching between windows Alt-Tab style it never moves the mouse pointer more than necessary; if the pointer is already inside the newly raised window, it doesn’t move at all, and if it’s outside it moves to the nearest border.