@ -221,7 +221,7 @@ static void toggleview(const Arg *arg);
static void unfocus ( Client * c ) ;
static void unmanage ( Client * c , Bool destroyed ) ;
static void unmapnotify ( XEvent * e ) ;
static void updategeom ( void ) ;
static Bool updategeom ( void ) ;
static void updatebarpos ( Monitor * m ) ;
static void updatebars ( void ) ;
static void updatenumlockmask ( void ) ;
@ -535,14 +535,15 @@ configurenotify(XEvent *e) {
if ( ev - > window = = root ) {
sw = ev - > width ;
sh = ev - > height ;
updategeom ( ) ;
if ( dc . drawable ! = 0 )
XFreePixmap ( dpy , dc . drawable ) ;
dc . drawable = XCreatePixmap ( dpy , root , sw , bh , DefaultDepth ( dpy , screen ) ) ;
updatebars ( ) ;
for ( m = mons ; m ; m = m - > next )
XMoveResizeWindow ( dpy , m - > barwin , m - > wx , m - > by , m - > ww , bh ) ;
arrange ( ) ;
if ( updategeom ( ) ) {
if ( dc . drawable ! = 0 )
XFreePixmap ( dpy , dc . drawable ) ;
dc . drawable = XCreatePixmap ( dpy , root , sw , bh , DefaultDepth ( dpy , screen ) ) ;
updatebars ( ) ;
for ( m = mons ; m ; m = m - > next )
XMoveResizeWindow ( dpy , m - > barwin , m - > wx , m - > by , m - > ww , bh ) ;
arrange ( ) ;
}
}
}
@ -1692,26 +1693,73 @@ updatebarpos(Monitor *m) {
m - > by = - bh ;
}
void
Bool
updategeom ( void ) {
int i , n = 1 ;
int i , j , nn = 1 , n = 1 ;
Client * c ;
Monitor * newmons = NULL , * m = NULL , * tm ;
# ifdef XINERAMA
int nn ;
XineramaScreenInfo * info = NULL ;
Bool * flags = NULL ;
if ( XineramaIsActive ( dpy ) )
info = XineramaQueryScreens ( dpy , & n ) ;
for ( i = 1 , nn = n ; i < n ; i + + )
if ( info [ i - 1 ] . x_org = = info [ i ] . x_org & & info [ i - 1 ] . y_org = = info [ i ] . y_org
& & info [ i - 1 ] . width = = info [ i ] . width & & info [ i - 1 ] . height = = info [ i ] . height )
- - nn ;
n = nn ; /* we only consider unique geometries as separate screens */
flags = ( Bool * ) malloc ( sizeof ( Bool ) * n ) ;
for ( i = 0 ; i < n ; i + + )
flags [ i ] = False ;
/* next double-loop seeks any combination of retrieved Xinerama info
* with existing monitors , this is used to avoid unnecessary
* re - allocations of monitor structs */
for ( i = 0 , nn = n ; i < n ; i + + )
for ( j = 0 , m = mons ; m ; m = m - > next , j + + )
if ( ! flags [ j ] ) {
if ( ( flags [ j ] = (
info [ i ] . x_org = = m - > mx
& & info [ i ] . y_org = = m - > my
& & info [ i ] . width = = m - > mw
& & info [ i ] . height = = m - > mh )
) )
- - nn ;
}
if ( nn = = 0 ) { /* no need to re-allocate monitors */
j = 0 ;
for ( i = 0 , m = mons ; m ; m = m - > next , i + + ) {
m - > num = info [ i ] . screen_number ;
if ( info [ i ] . x_org ! = m - > mx
| | info [ i ] . y_org ! = m - > my
| | info [ i ] . width ! = m - > mw
| | info [ i ] . height ! = m - > mh )
{
m - > mx = m - > wx = info [ i ] . x_org ;
m - > my = m - > wy = info [ i ] . y_org ;
m - > mw = m - > ww = info [ i ] . width ;
m - > mh = m - > wh = info [ i ] . height ;
updatebarpos ( m ) ;
j + + ;
}
}
XFree ( info ) ;
free ( flags ) ;
return j > 0 ;
}
/* next algorithm only considers unique geometries as separate screens */
for ( i = 0 ; i < n ; i + + )
flags [ i ] = False ; /* used for ignoring certain monitors */
for ( i = 0 , nn = n ; i < n ; i + + )
for ( j = 0 ; j < n ; j + + )
if ( i ! = j & & ! flags [ i ] ) {
if ( ( flags [ i ] = (
info [ i ] . x_org = = info [ j ] . x_org
& & info [ i ] . y_org = = info [ j ] . y_org
& & info [ i ] . width = = info [ j ] . width
& & info [ i ] . height = = info [ j ] . height )
) )
- - nn ;
}
# endif /* XINERAMA */
/* allocate monitor(s) for the new geometry setup */
for ( i = 0 ; i < n ; i + + ) {
for ( i = 0 ; i < nn ; i + + ) {
if ( ! ( m = ( Monitor * ) malloc ( sizeof ( Monitor ) ) ) )
die ( " fatal: could not malloc() %u bytes \n " , sizeof ( Monitor ) ) ;
m - > next = newmons ;
@ -1720,14 +1768,18 @@ updategeom(void) {
/* initialise monitor(s) */
# ifdef XINERAMA
if ( XineramaIsActive ( dpy ) ) {
for ( i = 0 , m = newmons ; m ; m = m - > next , i + + ) {
m - > num = info [ i ] . screen_number ;
m - > mx = m - > wx = info [ i ] . x_org ;
m - > my = m - > wy = info [ i ] . y_org ;
m - > mw = m - > ww = info [ i ] . width ;
m - > mh = m - > wh = info [ i ] . height ;
for ( i = 0 , m = newmons ; m & & i < n ; i + + ) {
if ( ! flags [ i ] ) { /* only use screens that aren't dublettes */
m - > num = info [ i ] . screen_number ;
m - > mx = m - > wx = info [ i ] . x_org ;
m - > my = m - > wy = info [ i ] . y_org ;
m - > mw = m - > ww = info [ i ] . width ;
m - > mh = m - > wh = info [ i ] . height ;
m = m - > next ;
}
}
XFree ( info ) ;
free ( flags ) ;
}
else
# endif /* XINERAMA */
@ -1767,6 +1819,7 @@ updategeom(void) {
cleanupmons ( ) ;
selmon = mons = newmons ;
selmon = wintomon ( root ) ;
return True ;
}
void