diff -Naur fvwm-2.5.8/fvwm/fvwm.h fvwm/fvwm/fvwm.h --- fvwm-2.5.8/fvwm/fvwm.h 2003-09-24 11:15:20.000000000 +0200 +++ fvwm/fvwm/fvwm.h 2003-11-25 00:53:26.000000000 +0100 @@ -467,8 +467,9 @@ #define PLACE_TILECASCADE 0x5 #define PLACE_CASCADE_B 0x6 #define PLACE_MINOVERLAP 0x7 -#define PLACE_MASK 0x7 - unsigned placement_mode : 3; +#define PLACE_UNDERMOUSE 0x8 +#define PLACE_MASK 0x8 + unsigned placement_mode : 4; unsigned ewmh_placement_mode : 2; /* see ewmh.h */ #define WS_CR_MOTION_METHOD_AUTO CR_MOTION_METHOD_AUTO #define WS_CR_MOTION_METHOD_USE_GRAV CR_MOTION_METHOD_USE_GRAV diff -Naur fvwm-2.5.8/fvwm/placement.c fvwm/fvwm/placement.c --- fvwm-2.5.8/fvwm/placement.c 2003-07-08 00:22:20.000000000 +0200 +++ fvwm/fvwm/placement.c 2003-11-25 00:53:26.000000000 +0100 @@ -1156,7 +1156,35 @@ fw, sflags, &screen_g, &xl, &yt, pdeltax, pdeltay, 0); flags.is_smartly_placed = True; - break; + + case PLACE_UNDERMOUSE: + { + int mx; + int my; + FQueryPointer(dpy, Scr.Root, &JunkRoot, &JunkChild, + &mx, &my, &JunkX, &JunkY, &JunkMask); + xl = mx - (fw->frame_g.width / 2); + yt = my - (fw->frame_g.height / 2); + if (xl + fw->frame_g.width > screen_g.x + screen_g.width) + { + xl = screen_g.x + screen_g.width - fw->frame_g.width; + } + if (yt + fw->frame_g.height > screen_g.y + screen_g.height) + { + yt = screen_g.y + screen_g.height - fw->frame_g.height; + } + if (xl < screen_g.x) + { + xl = screen_g.x; + } + if (yt < screen_g.y) + { + yt = screen_g.y; + } + attr_g->x = xl; + attr_g->y = yt; + } + break; default: /* can't happen */ break; diff -Naur fvwm-2.5.8/fvwm/style.c fvwm/fvwm/style.c --- fvwm-2.5.8/fvwm/style.c 2003-08-23 06:27:43.000000000 +0200 +++ fvwm/fvwm/style.c 2003-11-25 00:53:26.000000000 +0100 @@ -3738,7 +3738,13 @@ break; case 'u': - if (StrEquals(token, "UsePPosition")) + if (StrEquals(token, "UnderMousePlacement")) + { + ps->flags.placement_mode = PLACE_UNDERMOUSE; + ps->flag_mask.placement_mode = PLACE_MASK; + ps->change_mask.placement_mode = PLACE_MASK; + } + else if (StrEquals(token, "UsePPosition")) { ps->flags.use_no_pposition = !on; ps->flag_mask.use_no_pposition = 1;