
#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));
  }
  
}

