diff -rud fvwm-1.24r/fvwm/placement.c fvwm-mine/fvwm/placement.c --- fvwm-1.24r/fvwm/placement.c Tue Nov 15 06:04:05 1994 +++ fvwm-mine/fvwm/placement.c Thu May 27 14:34:45 2004 @@ -14,6 +14,9 @@ #include #include #include +#include +#include +#include #include "fvwm.h" #include "menus.h" @@ -21,6 +24,35 @@ #include "parse.h" #include "screen.h" +int CheckXinerama(FvwmWindow *t, int height, int width, int *x, int *y) +{ + XineramaScreenInfo *xsi; + int num; + int i, ret = 0; + + xsi = XineramaQueryScreens(dpy, &num); + if( xsi == NULL ) + return 1; + + for( i = 0; i < num; i++ ) { + if( *x >= xsi[i].x_org && *y >= xsi[i].y_org ) { + XFree(xsi); + return 1; + } + } + + if( *x < xsi[0].x_org ) + *x = xsi[0].x_org; + if( *y < xsi[0].y_org ) + *y = xsi[0].y_org; + XFree(xsi); + return 0; +} + void SmartPlacement(FvwmWindow *t, int width, int height, int *x, int *y) { int temp_h,temp_w; @@ -38,6 +70,8 @@ { loc_ok = True; test_window = Scr.FvwmRoot.next; + if( !CheckXinerama(test_window, temp_h, temp_w, &test_x, &test_y) ) + loc_ok = False; while((test_window != (FvwmWindow *)0)&&(loc_ok == True)) { if(test_window->Desk == Scr.CurrentDesk)