I didn't aooky this patch as is, but made a change along the same line.  The main 
difference is that I didn't want to use rand().  Instead, as long as 'available' is 
less than 100 for each coordinate, I set that coordinate to half of 'available', and 
if 'available' is larger than that, I set the corrdinate to 50.

This ticket is now resolved.

> More info about this patch: http://www.cis.upenn.edu/~bjornk/ctwm/
> 
> To apply this patch:
> 
> 1) cd to your CTWM source directory and
> 2) Run 'patch -l -p3 < path_to_this_file'
> 3) Run 'make install'
> 
> Random placement and DontMoveOff patch:
> ---------------------------------------
> I've often been annoyed that randomly placed windows will be placed
> off-screen. I've specified DontMoveOff, so I think I've made my
> preference clear on this point.
> 
> The below patch will keep the old behavior if you have not specified
> DontMoveOff, or if the currently active random placement would put the
> window entirely in the current screen. If, on the other hand, the
> current random placement would place the window (partially) outside of
> the current screen, and DontMoveOff is specified, the placement will
> be re-calculated to put the window inside the screen, or if it's too
> big, aligned with the top of the screen.
> 
> -------------------
> Bjorn Knutsson  http://www.cis.upenn.edu/~bjornk/
> 
> Patch against CTWM 3.6:
> 
> diff -rwc /tmp/ctwm-3.6-orig/add_window.c /tmp/ctwm-3.6/add_window.c
> *** /tmp/ctwm-3.6-orig/add_window.c   2001-12-11 10:38:52.000000000
> -0500
> --- /tmp/ctwm-3.6/add_window.c        2003-02-09 18:54:46.000000000 -0500
> ***************
> *** 610,619 ****
>             ((Scr->RandomPlacement == RP_UNMAPPED) &&
>          ((tmp_win->wmhints && (tmp_win->wmhints->initial_state ==
> IconicState)) ||
>           (! OCCUPY (tmp_win, Scr->workSpaceMgr.activeWSPC))))) { /* just
> stick it somewhere */
> !     if ((PlaceX + tmp_win->attr.width) > Scr->MyDisplayWidth)
> !         PlaceX = 50;
> !     if ((PlaceY + tmp_win->attr.height) > Scr->MyDisplayHeight)
> !         PlaceY = 50;
> 
>       tmp_win->attr.x = PlaceX;
>       tmp_win->attr.y = PlaceY;
> --- 610,637 ----
>             ((Scr->RandomPlacement == RP_UNMAPPED) &&
>          ((tmp_win->wmhints && (tmp_win->wmhints->initial_state ==
> IconicState)) ||
>           (! OCCUPY (tmp_win, Scr->workSpaceMgr.activeWSPC))))) { /* just
> stick it somewhere */
> !     if ((PlaceX + tmp_win->attr.width) > Scr->MyDisplayWidth) {
> !       if (!Scr->DontMoveOff) { /* Honor the user's wishes */
> !         PlaceX = 50;        /* Anything goes... */
> !       } else {
> !         int available = Scr->MyDisplayWidth - tmp_win->attr.width; /*
> Available room */
> !         if (available <= 0) /* Larger than the screen */
> !           PlaceX = 0;       /* Just stick it at the top */
> !         else
> !           PlaceX = rand() % available; /* Anywhere's good... */
> !       }
> !     }
> !     if ((PlaceY + tmp_win->attr.height) > Scr->MyDisplayHeight) {
> !       if (!Scr->DontMoveOff) { /* Honor the user's wishes */
> !         PlaceY = 50;        /* Anything goes... */
> !       } else {
> !         int available = Scr->MyDisplayHeight - tmp_win->attr.height; /*
> Available room */
> !         if (available <= 0) /* Larger than the screen */
> !           PlaceY = 0;       /* Just stick it at the top */
> !         else
> !           PlaceY = rand() % available; /* Anywhere's good... */
> !       }
> !     }
> 
>       tmp_win->attr.x = PlaceX;
>       tmp_win->attr.y = PlaceY;


Reply via email to