#include "nawm.h" #include "bindings.h" static int im_x = 0; static int im_y = 0; static int icon_height; GC icon_gc; XFontStruct *fixed_font; struct icon { int x; int y; char *name; Window w; Window iconw; }; struct icon *icon_list; unsigned icon_cnt; init_icon() { icon_list = (struct icon *)malloc(0); icon_cnt = 0; icon_height = 15; icon_gc = XCreateGC(dpy, root, 0,0); fixed_font = XLoadQueryFont(dpy, "fixed"); XSetFont(dpy, icon_gc, fixed_font->fid); XSetForeground(dpy, icon_gc, BlackPixel(dpy, 0)); } struct icon * realloc_icon() { struct icon *tmp; tmp = (struct icon *)realloc((char *) icon_list, ++icon_cnt * sizeof(struct icon)); if(!tmp) { die("Out of memory"); } icon_list = tmp; return &icon_list[icon_cnt-1]; } make_icon(win) Window win; { struct icon *icn; int w; Atom type; int format; unsigned long items; unsigned char *prop; unsigned long left; XWindowAttributes attr; if(win == root) return; XGetWindowAttributes(dpy, win, &attr); XGetWindowProperty(dpy, win, XA_WM_NAME, 0, 1000, False, AnyPropertyType, &type, &format, &items, &left, &prop); icn = realloc_icon(); icn->w = win; icn->x = attr.x; icn->y = attr.y; icn->name = (char*)(prop ? prop : (unsigned char*)""); w = XTextWidth(fixed_font, icn->name, strlen(icn->name)); w += 20; icn->iconw = XCreateSimpleWindow(dpy, root, im_x, im_y + icon_cnt * (icon_height + 10), w, icon_height, 5, BlackPixel(dpy, 0), WhitePixel(dpy, 0)); XSelectInput(dpy, icn->iconw, ExposureMask| ButtonReleaseMask|SubstructureNotifyMask|KeyPressMask); XMapWindow(dpy, icn->iconw); } icon_dispatch(ev) XEvent *ev; { unsigned int i; struct icon *icn; for(icn = icon_list, i = 0; i < icon_cnt; i++, icn++) { if(icn->iconw == ev->xany.window) { icon_handle(ev, icn); } } } deiconify_icon(win) Window win; { unsigned int i; struct icon *icn; for(icn = icon_list, i = 0; i < icon_cnt; i++, icn++) { if(icn->iconw == win) { _deiconify(icn); } } } deiconify_window(win) Window win; { unsigned int i; struct icon *icn; for(icn = icon_list, i = 0; i < icon_cnt; i++, icn++) { if(icn->w == win) { _deiconify(icn); } } } icon_handle(ev, icn) XEvent *ev; struct icon *icn; { switch(ev->type) { case KeyPress: break; case ButtonRelease: _deiconify(icn); break; case Expose: XDrawString(dpy, icn->iconw, icon_gc, 10, 10, icn->name, strlen(icn->name)); break; case DestroyNotify: nuke_icon(icn); break; } } _deiconify(icn) struct icon *icn; { XMapWindow(dpy, icn->w); nuke_icon(icn); } nuke_icon(icn) struct icon *icn; { unsigned int i; XDestroyWindow(dpy, icn->iconw); for( icon_cnt--, i = 0; i < icon_cnt; i++ ) { if(&icon_list[i] == icn) break; } free(icon_list[i].name); for( ; i < icon_cnt; i++ ) { icon_list[i+1].x = icon_list[i].x; icon_list[i+1].y = icon_list[i].y; icon_list[i] = icon_list[i+1]; XMoveWindow(dpy,icon_list[i].iconw, im_x, im_y + (i+1) * (icon_height + 10)); } }