/****************************************************************************** AdjustWindow - Resize the window according to maxwidth by number of buttons ******************************************************************************/ void AdjustWindow() { int new_width=0,new_height=0,tw,i,total; char *temp; total = ItemCountD(&windows ); if (!total) { if (WindowIsUp==1) { XUnmapWindow(dpy,win); WindowIsUp=2; } return; } for(i=0;i<total;i++) { temp=ItemName(&windows,i); if(temp != NULL) { tw=10+XTextWidth(ButtonFont,temp,strlen(temp)); tw+=XTextWidth(ButtonFont,"()",2); tw+=14; /* for title icon */ /* Magic Number ? */ new_width=max(new_width,tw); } } new_width=max(new_width, MinWidth); new_width=min(new_width, MaxWidth); new_height=(total*(fontheight+6+1)-1); if (WindowIsUp && (new_height!=win_height || new_width!=win_width)) { if (Anchor) { if (win_grav==SouthEastGravity || win_grav==NorthEastGravity) win_x-=(new_width-win_width); if (win_grav==SouthEastGravity || win_grav==SouthWestGravity) win_y-=(new_height-win_height); if(RESIZE_BUG_HACK) { if (win_grav==SouthEastGravity || win_grav==NorthEastGravity) win_x+= win_border - 2; else win_x-=win_border; if (win_grav==SouthEastGravity || win_grav==SouthWestGravity) win_y+=win_border - 2; else win_y-=win_border; } XMoveResizeWindow(dpy,win,win_x+win_border,win_y+win_title+win_border, new_width,new_height); } else XResizeWindow(dpy, win, new_width,new_height); XSync(dpy,False); } UpdateArray(&buttons,-1,-1,new_width,-1); if (new_height>0) win_height = new_height; if (new_width>0) win_width = new_width; if (WindowIsUp==2) { XMapWindow(dpy,win); WindowIsUp=1; WaitForExpose(); } }
/****************************************************************************** MakeMeWindow - Create and setup the window we will need ******************************************************************************/ void MakeMeWindow(void) { XSizeHints hints; XGCValues gcval; unsigned long gcmask; unsigned int dummy1, dummy2; int x, y, ret, count; Window dummyroot, dummychild; int i; if ((count = ItemCountD(&windows))==0 && Transient) ShutMeDown(0); AdjustWindow(); hints.width=win_width; hints.height=win_height; hints.win_gravity=NorthWestGravity; hints.flags=PSize|PWinGravity|PResizeInc; hints.width_inc=0; hints.height_inc=0; if (geometry!= NULL) { ret=XParseGeometry(geometry,&x,&y,&dummy1,&dummy2); if (ret&XValue && ret &YValue) { hints.x=x; if (ret&XNegative) hints.x+=XDisplayWidth(dpy,screen)-win_width; hints.y=y; if (ret&YNegative) hints.y+=XDisplayHeight(dpy,screen)-win_height; hints.flags|=USPosition; } if (ret&XNegative) { if (ret&YNegative) hints.win_gravity=SouthEastGravity; else hints.win_gravity=NorthEastGravity; } else { if (ret&YNegative) hints.win_gravity=SouthWestGravity; else hints.win_gravity=NorthWestGravity; } } if (Transient) { XQueryPointer(dpy,Root,&dummyroot,&dummychild,&hints.x,&hints.y,&x,&y,&dummy1); hints.win_gravity=NorthWestGravity; hints.flags |= USPosition; } win_grav=hints.win_gravity; win_x=hints.x; win_y=hints.y; for (i = 0; i != MAX_COLOUR_SETS; i++) if(d_depth < 2) { back[i] = GetColor("white"); fore[i] = GetColor("black"); } else { back[i] = GetColor(BackColor[i] == NULL ? BackColor[0] : BackColor[i]); fore[i] = GetColor(ForeColor[i] == NULL ? ForeColor[0] : ForeColor[i]); } win=XCreateSimpleWindow(dpy,Root,hints.x,hints.y,hints.width,hints.height,1, fore[0],back[0]); wm_del_win=XInternAtom(dpy,"WM_DELETE_WINDOW",False); XSetWMProtocols(dpy,win,&wm_del_win,1); XSetWMNormalHints(dpy,win,&hints); if (!Transient) { XGrabButton(dpy,1,AnyModifier,win,True,GRAB_EVENTS,GrabModeAsync, GrabModeAsync,None,None); XGrabButton(dpy,2,AnyModifier,win,True,GRAB_EVENTS,GrabModeAsync, GrabModeAsync,None,None); XGrabButton(dpy,3,AnyModifier,win,True,GRAB_EVENTS,GrabModeAsync, GrabModeAsync,None,None); SetMwmHints(MWM_DECOR_ALL|MWM_DECOR_RESIZEH|MWM_DECOR_MAXIMIZE|MWM_DECOR_MINIMIZE, MWM_FUNC_ALL|MWM_FUNC_RESIZE|MWM_FUNC_MAXIMIZE|MWM_FUNC_MINIMIZE, MWM_INPUT_MODELESS); } else { SetMwmHints(0,MWM_FUNC_ALL,MWM_INPUT_MODELESS); } for (i = 0; i != MAX_COLOUR_SETS; i++) { gcval.foreground=fore[i]; gcval.background=back[i]; gcval.font=ButtonFont->fid; gcmask=GCForeground|GCBackground|GCFont; graph[i]=XCreateGC(dpy,Root,gcmask,&gcval); if(d_depth < 2) gcval.foreground=GetShadow(fore[i]); else gcval.foreground=GetShadow(back[i]); gcval.background=back[i]; gcmask=GCForeground|GCBackground; shadow[i]=XCreateGC(dpy,Root,gcmask,&gcval); gcval.foreground=GetHilite(back[i]); gcval.background=back[i]; gcmask=GCForeground|GCBackground; hilite[i]=XCreateGC(dpy,Root,gcmask,&gcval); gcval.foreground=back[i]; gcmask=GCForeground; background[i]=XCreateGC(dpy,Root,gcmask,&gcval); } XSelectInput(dpy,win,(ExposureMask | KeyPressMask)); ChangeWindowName(&Module[1]); if (ItemCountD(&windows) > 0) { XMapRaised(dpy,win); WaitForExpose(); WindowIsUp=1; } else WindowIsUp=2; if (Transient) { if ( XGrabPointer(dpy,win,True,GRAB_EVENTS,GrabModeAsync,GrabModeAsync, None,None,CurrentTime)!=GrabSuccess) ShutMeDown(1); XQueryPointer(dpy,Root,&dummyroot,&dummychild,&hints.x,&hints.y,&x,&y,&dummy1); if (!SomeButtonDown(dummy1)) ShutMeDown(0); } }
/****************************************************************************** AdjustWindow - Resize the window according to maxwidth by number of buttons ******************************************************************************/ void AdjustWindow(void) { int new_width=0,new_height=0,tw,i,total,off_x,off_y; char *temp; Window frame; XWindowAttributes win_attr, frame_attr; total = ItemCountD(&windows ); if (!total) { if (WindowIsUp==1) { XUnmapWindow(dpy,win); WindowIsUp=2; } return; } for(i=0; i<total; i++) { temp=ItemName(&windows,i); if(temp != NULL) { tw=10+XTextWidth(ButtonFont,temp,strlen(temp)); tw+=XTextWidth(ButtonFont,"()",2); #ifdef MINI_ICONS tw+=14; /* for title icon */ /* Magic Number ? */ #endif new_width=max(new_width,tw); } } new_width=max(new_width, MinWidth); new_width=min(new_width, MaxWidth); new_height=(total*(fontheight+6+1)); if (WindowIsUp && (new_height!=win_height || new_width!=win_width)) { if (Anchor) { off_x = off_y = 0; MyXGrabServer(dpy); frame = find_frame_window(win, &off_x, &off_y); XGetWindowAttributes(dpy, frame, &frame_attr); XGetWindowAttributes(dpy, win, &win_attr); win_x = frame_attr.x + frame_attr.border_width + off_x; win_y = frame_attr.y + frame_attr.border_width + off_y; if (win_grav == SouthEastGravity || win_grav == NorthEastGravity) win_x += win_attr.width - new_width; if (win_grav == SouthEastGravity || win_grav == SouthWestGravity) win_y += win_attr.height - new_height; XMoveResizeWindow(dpy, win, win_x, win_y, new_width, new_height); MyXUngrabServer(dpy); } else XResizeWindow(dpy, win, new_width, new_height); } UpdateArray(&buttons,-1,-1,new_width,-1); if (new_height>0) win_height = new_height; if (new_width>0) win_width = new_width; if (WindowIsUp==2) { XMapWindow(dpy,win); WindowIsUp=1; WaitForExpose(); } }