/* treewm - an X11 window manager.
 * Copyright (c) 2001-2003 Thomas Jäger <TheHunter2000 at web dot de>
 * This code is released under the terms of the GNU GPL.
 * See the included file LICENSE for details.
 *
 * changed<07.02.2003> by Rudolf Polzer: fallback to font "fixed"
 */

#include "global.h"
#include "sceme.h"
#include <X11/cursorfont.h>

// #define ICONPATH "~/.MyFavoriteIcon"

#define STDFONT "-*-lucida-medium-r-*-sans-10-*-*-*-*-*-*-*"
#define CMAP DefaultColormap(dpy, screen)

XFontSet LoadQueryFontSet(const char *fontset_name) {
  XFontSet fontset;
  int  missing_charset_count;
  char **missing_charset_list;
  char *def_string;

  fontset = XCreateFontSet(dpy, fontset_name,
                          &missing_charset_list, &missing_charset_count,
                          &def_string);
  if (missing_charset_count) {
    fprintf(stderr, "Missing charsets in FontSet(%s) creation.\n", fontset_name);
    XFreeStringList(missing_charset_list);

    fontset_name = "fixed";
    fontset = XCreateFontSet(dpy, fontset_name,
                            &missing_charset_list, &missing_charset_count,
                            &def_string);
    if (missing_charset_count) {
      fprintf(stderr, "Missing charsets in FontSet(%s) creation.\n", fontset_name);
      XFreeStringList(missing_charset_list);
      exit(1);
    }
  }
  return fontset;
}





Sceme::Sceme(Section *section) {
  s = section;
}

void Sceme::Init() {
  char *v; // value
  int i;

  XColor dummyc;
  v = s ? s->GetEntry("FGColor") : 0;
  XAllocNamedColor(dpy, CMAP, v ? v : "yellow", &colors[C_FG], &dummyc);
  v = s ? s->GetEntry("BGColor") : 0;
  XAllocNamedColor(dpy, CMAP, v ? v : "black", &colors[C_BG], &dummyc);
  v = s ? s->GetEntry("BDColor") : 0;
  XAllocNamedColor(dpy, CMAP, v ? v : "rgb:5/5/5", &colors[C_BD], &dummyc);
  v = s ? s->GetEntry("TitleBGColor") : 0;
  XAllocNamedColor(dpy, CMAP, v ? v : "rgb:0/0/5", &colors[C_TBG], &dummyc);
  v = s ? s->GetEntry("HTitleBGColor") : 0;
  XAllocNamedColor(dpy, CMAP, v ? v : "rgb:0/0/8", &colors[C_HTBG], &dummyc);
  v = s ? s->GetEntry("HHTitleBGColor") : 0;
  XAllocNamedColor(dpy, CMAP, v ? v : "rgb:0/0/B", &colors[C_HHTBG], &dummyc);
  v = s ? s->GetEntry("IconFGColor") : 0;
  XAllocNamedColor(dpy, CMAP, v ? v : "white", &colors[C_IFG], &dummyc);
  v = s ? s->GetEntry("IconBGColor") : 0;
  XAllocNamedColor(dpy, CMAP, v ? v : "grey15", &colors[C_IBG], &dummyc);
  v = s ? s->GetEntry("HIconBGColor") : 0;
  XAllocNamedColor(dpy, CMAP, v ? v : "grey45", &colors[C_HIBG], &dummyc);
  v = s ? s->GetEntry("IconBDColor") : 0;
  XAllocNamedColor(dpy, CMAP, v ? v : "grey", &colors[C_IBD], &dummyc);
  v = s ? s->GetEntry("MenuFGColor") : 0;
  XAllocNamedColor(dpy, CMAP, v ? v : "black", &colors[C_MFG], &dummyc);
  v = s ? s->GetEntry("MenuBGColor") : 0;
  XAllocNamedColor(dpy, CMAP, v ? v : "grey", &colors[C_MBG], &dummyc);
  v = s ? s->GetEntry("HMenuBGColor") : 0;
  XAllocNamedColor(dpy, CMAP, v ? v : "yellow", &colors[C_HMBG], &dummyc);
  v = s ? s->GetEntry("MenuBDColor") : 0;
  XAllocNamedColor(dpy, CMAP, v ? v : "black", &colors[C_MBD], &dummyc);
  v = s ? s->GetEntry("DialogFGColor") : 0;
  XAllocNamedColor(dpy, CMAP, v ? v : "yellow", &colors[C_DFG], &dummyc);
  v = s ? s->GetEntry("DialogBGColor") : 0;
  XAllocNamedColor(dpy, CMAP, v ? v : "black", &colors[C_DBG], &dummyc);
  v = s ? s->GetEntry("DialogBDColor") : 0;
  XAllocNamedColor(dpy, CMAP, v ? v : "rgb:5/5/5", &colors[C_DBD], &dummyc);
  v = s ? s->GetEntry("Font") : 0;
  fonts[FO_STD] = LoadQueryFontSet(v ? v : STDFONT);
  v = s ? s->GetEntry("IconFont") : 0;
  fonts[FO_ICON] = v ? LoadQueryFontSet(v)
                     : fonts[FO_STD]; // :-)
  v = s ? s->GetEntry("MenuFont") : 0;
  fonts[FO_MENU] = v ? LoadQueryFontSet(v)
                     : fonts[FO_STD]; // :-)
  v = s ? s->GetEntry("DialogFont") : 0;
  fonts[FO_DIALOG] = v ? LoadQueryFontSet(v)
                     : fonts[FO_STD]; // :-)
  for (int i=0;i!=FO_NUM;++i) {
    if (!fonts[i])
      fonts[i] = LoadQueryFontSet(STDFONT);
    if (!fonts[i]) {
      fprintf(stderr,"No font found\n");
      exit(1);
    }
  }
  cursors[CU_STD] = XCreateFontCursor(dpy, XC_left_ptr);
  cursors[CU_MOVE] = XCreateFontCursor(dpy, XC_fleur);
  cursors[CU_RESIZE] = XCreateFontCursor(dpy, XC_plus);
  cursors[CU_NEWTARGET] = XCreateFontCursor(dpy, XC_diamond_cross);

  { // stolen from xawtv
    XColor black, dummy;
    Pixmap bm_no;
    const char bm_no_data[] = { 0,0,0,0, 0,0,0,0 };
    bm_no = XCreateBitmapFromData(dpy, root, bm_no_data, 8,8);
    XAllocNamedColor(dpy,CMAP,"black",&black,&dummy);
    cursors[CU_NONE] = XCreatePixmapCursor(dpy, bm_no, bm_no, &black, &black, 0, 0);
		XFreePixmap(dpy,bm_no);
  }

  v = s ? s->GetEntry("defaulticon") : 0;
  if (v) {
    iconpm = rman->GetPixmap(v);
  } else {
#ifdef ICONPATH
    iconpm = rman->GetPixmap(ICONPATH);
#else
    iconpm = 0;
#endif
  }
  if (s && s->GetIntEntry("borderwidth",i)) {
    BW = i;
  } else BW = 1;

  v = s ? s->GetEntry("bgpixmap") : 0;
  if (v) {
    bgpm = rman->GetPixmap(v);
  } else bgpm = 0;


  v = s ? s->GetEntry("button10") : 0;
  button[BU_10] = rman->GetPixmap(v ? v : "none1.xpm");
  v = s ? s->GetEntry("button11") : 0;
  button[BU_11] = rman->GetPixmap(v ? v : "max2.xpm");
  v = s ? s->GetEntry("button12") : 0;
  button[BU_12] = rman->GetPixmap(v ? v : "max1.xpm");
  v = s ? s->GetEntry("button13") : 0;
  button[BU_13] = rman->GetPixmap(v ? v : "resize.xpm");
  v = s ? s->GetEntry("button20") : 0;
  button[BU_20] = rman->GetPixmap(v ? v : "none2.xpm");
  v = s ? s->GetEntry("button21") : 0;
  button[BU_21] = rman->GetPixmap(v ? v : "close.xpm");
  v = s ? s->GetEntry("button22") : 0;
  button[BU_22] = rman->GetPixmap(v ? v : "icon.xpm");
  v = s ? s->GetEntry("button23") : 0;
  button[BU_23] = rman->GetPixmap(v ? v : "move.xpm");
  for (int i=0;i!=BU_NUM;++i)
    if (button[i])
      button[i]->GetPixmap();


  if (!s || !s->GetIntEntry("ShowKeys",i) || i)
    ShowKeys = true; else
    ShowKeys = false;


  if (!s || !s->GetIntEntry("MinIconX",MinIX))
    MinIX = 100;
  if (!s || !s->GetIntEntry("MinIconY",MinIY))
    MinIY = 50;
  if (!s || !s->GetIntEntry("GridX",GridX))
    GridX = 80;
  if (!s || !s->GetIntEntry("GridY",GridY))
    GridY = 70;
  if (!s || !s->GetIntEntry("IconSpaceLeft",ISLeft))
    ISLeft = 35;
  if (!s || !s->GetIntEntry("IconSpaceRight",ISRight))
    ISRight = 35;
  if (!s || !s->GetIntEntry("IconSpaceTop",ISTop))
    ISTop = 40;
  if (!s || !s->GetIntEntry("IconSpaceBottom",ISBottom))
    ISBottom = 25;
  if (!s || !s->GetIntEntry("DoubleClickTime",i))
    i = 250;
  DCTime = i;

  XGCValues gv;
// delete some gcs!!
  gv.graphics_exposures = false;
  gv.function = GXcopy;

  gv.foreground = colors[C_IFG].pixel;
//  gv.font = fonts[FO_ICON]->fid;
  icon_gc = XCreateGC(dpy, root, GCFunction|GCForeground|GCGraphicsExposures, &gv);

  gv.foreground = colors[C_DFG].pixel;
//  gv.font = fonts[FO_DIALOG]->fid;
  dialogstring_gc = XCreateGC(dpy, root, GCFunction|GCForeground|GCGraphicsExposures, &gv);

  gv.foreground = colors[C_MFG].pixel;
//  gv.font = fonts[FO_MENU]->fid;
  menustring_gc = XCreateGC(dpy, root, GCFunction|GCForeground|GCGraphicsExposures, &gv);

  gv.foreground = colors[C_FG].pixel;
//  gv.font = fonts[FO_STD]->fid;
  string_gc = XCreateGC(dpy, root, GCFunction|GCForeground|GCGraphicsExposures, &gv);

  gv.foreground = colors[C_MBG].pixel;
  menu_gc = XCreateGC(dpy, root, GCFunction|GCForeground|GCGraphicsExposures, &gv);

  gv.foreground = colors[C_HMBG].pixel;
  hmenu_gc = XCreateGC(dpy, root, GCFunction|GCForeground|GCGraphicsExposures, &gv);

  gv.foreground = colors[C_MBD].pixel;
  menubd_gc = XCreateGC(dpy, root, GCFunction|GCForeground|GCGraphicsExposures, &gv);

  gv.foreground = colors[C_BD].pixel;
  gv.line_width = 1;
  border_gc = XCreateGC(dpy, root, GCFunction|GCForeground|GCGraphicsExposures|GCLineWidth, &gv);

  gv.foreground = colors[C_TBG].pixel;
  title_gc[0] = XCreateGC(dpy, root, GCFunction|GCForeground|GCGraphicsExposures, &gv);

  gv.foreground = colors[C_HTBG].pixel;
  title_gc[1] = XCreateGC(dpy, root, GCFunction|GCForeground|GCGraphicsExposures, &gv);

  gv.foreground = colors[C_HHTBG].pixel;
  title_gc[2] = XCreateGC(dpy, root, GCFunction|GCForeground|GCGraphicsExposures, &gv);

  gv.function = GXinvert;
  gv.subwindow_mode = IncludeInferiors;
  invert_gc = XCreateGC(dpy, root, GCFunction|GCSubwindowMode|GCGraphicsExposures|GCLineWidth, &gv);


  s = 0;

}


Sceme::~Sceme() {
  if (fonts[FO_STD] == fonts[FO_ICON])
    fonts[FO_ICON] = 0;
  if (fonts[FO_STD] == fonts[FO_MENU])
    fonts[FO_MENU] = 0;
  if (fonts[FO_STD] == fonts[FO_DIALOG])
    fonts[FO_DIALOG] = 0;
  for (int i=0;i!=FO_NUM;++i)
    if (fonts[i])
      XFreeFontSet(dpy, fonts[i]);
  for (int i=0;i!=CU_NUM;++i)
    if (cursors[i])
      XFreeCursor(dpy, cursors[i]);
  XFreeGC(dpy, invert_gc);
  XFreeGC(dpy, border_gc);
  XFreeGC(dpy, string_gc);
  XFreeGC(dpy, icon_gc);
  XFreeGC(dpy, title_gc[0]);
  XFreeGC(dpy, title_gc[2]);
  XFreeGC(dpy, title_gc[1]);
  XFreeGC(dpy, menu_gc);
  XFreeGC(dpy, menubd_gc);
  XFreeGC(dpy, menustring_gc);
  XFreeGC(dpy, hmenu_gc);
  XFreeGC(dpy, dialogstring_gc);
  for (int i=0;i!=BU_NUM;++i)
    if (button[i])
      button[i]->FreePixmap();

}


syntax highlighted by Code2HTML, v. 0.9.1