Hi,

giving it another try to get this patch applied :)
It adds a new placement mode 'UnderMousePlacement' to fvwm, placing new
windows centered under the current cursor position. I've been using this
for over a year now without problems.

-- 
Arwed v. Merkatz                              Source Mage GNU/Linux developer
                                                    http://www.sourcemage.org
? patchy
Index: fvwm/fvwm.1.in
===================================================================
RCS file: /home/cvs/fvwm/fvwm/fvwm/fvwm.1.in,v
retrieving revision 1.186
diff -u -r1.186 fvwm.1.in
--- fvwm/fvwm.1.in      9 Feb 2006 12:05:53 -0000       1.186
+++ fvwm/fvwm.1.in      10 Feb 2006 09:05:03 -0000
@@ -6579,7 +6579,7 @@
 .IR StickyAcrossDesksIcon " / " !StickyAcrossDesksIcon ,
 .IR ManualPlacement " / " CascadePlacement " / " MinOverlapPlacement " / "
 .IR MinOverlapPercentPlacement " / " TileManualPlacement " / "
-.IR TileCascadePlacement , " / " CenterPlacement ,
+.IR TileCascadePlacement , " / " CenterPlacement , " / " UnderMousePlacement,
 .IR MinOverlapPlacementPenalties ,
 .IR MinOverlapPercentPlacementPenalties ,
 .IR DecorateTransient " / " NakedTransient ,
@@ -7611,7 +7611,7 @@
 Applications can place windows at a particular spot on the screen
 either by window manager hints or a geometry specification.  When
 they do neither, then the window manager steps in to find a place
-for the window.  Fvwm knows six ways to deal with this
+for the window.  Fvwm knows seven ways to deal with this
 situation. The default is
 .IR TileCascadePlacement .
 
@@ -7635,6 +7635,9 @@
 .IR ManualPlacement
 as the fall-back method.
 
+.I UnderMousePlacement
+automatically places new windows centered under the current cursor position.
+
 .I MinOverlapPlacement
 automatically places new windows in a location in which the
 overlapping area in pixels of other windows is minimized.
Index: fvwm/fvwm.h
===================================================================
RCS file: /home/cvs/fvwm/fvwm/fvwm/fvwm.h,v
retrieving revision 1.240
diff -u -r1.240 fvwm.h
--- fvwm/fvwm.h 11 Nov 2005 19:16:22 -0000      1.240
+++ fvwm/fvwm.h 10 Feb 2006 09:05:05 -0000
@@ -488,7 +488,8 @@
 #define PLACE_TILECASCADE       0x5
 #define PLACE_CASCADE_B         0x6
 #define PLACE_MINOVERLAP        0x7
-#define PLACE_CENTER           0x8
+#define PLACE_CENTER            0x8
+#define PLACE_UNDERMOUSE        0x9
 #define PLACE_MASK              0xF
        unsigned placement_mode : 4;
        unsigned ewmh_placement_mode : 2; /* see ewmh.h */
Index: fvwm/placement.c
===================================================================
RCS file: /home/cvs/fvwm/fvwm/fvwm/placement.c,v
retrieving revision 1.139
diff -u -r1.139 placement.c
--- fvwm/placement.c    5 Jul 2005 08:12:22 -0000       1.139
+++ fvwm/placement.c    10 Feb 2006 09:05:08 -0000
@@ -1068,6 +1068,34 @@
                        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;
@@ -1827,6 +1855,9 @@
                case PLACE_MINOVERLAP:
                        a = "MinOverlap";
                        break;
+               case PLACE_UNDERMOUSE:
+                       a = "UnderMouse";
+                       break;
                default:
                        a = "bug";
                        break;
Index: fvwm/style.c
===================================================================
RCS file: /home/cvs/fvwm/fvwm/fvwm/style.c,v
retrieving revision 1.233
diff -u -r1.233 style.c
--- fvwm/style.c        1 Jan 2006 14:22:04 -0000       1.233
+++ fvwm/style.c        10 Feb 2006 09:05:16 -0000
@@ -3760,7 +3760,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;

Reply via email to