#include "button.bm"
#include "xstuff.h"
#include "end.h"
#include "assert.h"
#include "res.h"
#include <Xw/SText.h>
#include "registry.h"
#include "useful.h"
#include "menupack.h"
#include "rem.h"

Registry Fonts_FR;

/*--------------------*/
void AlUI_AttachCursor(w,CursorNumber)
Widget w;
int CursorNumber;
{
  Window Win;
  Display *Disp;
  Cursor Curs;

  if (w==NULL) {
    printf("AlUI_AttachCursor: invalid Widget passed in, not attaching\n");
    return;
  }
  if (CursorNumber % 2 !=0 ) {
    printf("AttachCursor: bad cursor number: must be a multiple of twp\n");
    return;
  }
  Disp=XtDisplay(w);
  Curs=XCreateFontCursor(Disp,(unsigned)CursorNumber);
  Win=XtWindow(w);
  XDefineCursor(Disp,Win,Curs);
}

/*---------------------------*/
void AlUI_DetachCursor(w)
Widget w;
{
  assert(w!=NULL);
  XUndefineCursor(XtDisplay(w),XtWindow(w));
}

#define KLUDGE_FONT_PATH "/usr/lib/X11/fonts/old/"

/*-----------------------*/
XFontStruct * AlUI_GetFont(FName)
char * FName;
{
  XFontStruct *FS;
  Display *Dis;
  char *fnames[20], **fps, **nf;
  int count, i;
  static Bool Add=Bool_TRUE;

  FS=(XFontStruct*)Registry_get(Fonts_FR,FName);
  if (FS==NULL) {
    Dis=XtDisplay(TestWidget_GR); 
    
    if (Add==Bool_TRUE) {
      fps=(char**)XGetFontPath(Dis,&count);
      RE_debug1("%d paths\n",count);
      for (i=0;i<count;i++)
	if (strcmp(KLUDGE_FONT_PATH,fps[i])==0)
	  Add=Bool_FALSE;
      
      if (Add==Bool_TRUE) {
	nf=(char**)Memory_allocate(sizeof(char*)*(count+1));
	for (i=0;i<count;i++) nf[i]=fps[i];
	XFreeFontPath(fps);
	nf[count]=KLUDGE_FONT_PATH;
	XSetFontPath(Dis,nf,count+1);
	RE_debug("added font path\n");
	Add=Bool_FALSE;
      }
    }

    FS=XLoadQueryFont(Dis,FName);
    if (FS==NULL)
      Al_fatal_error1("Could not load font %s. Aborting\n",FName);
    Registry_add(Fonts_FR,(VOIDP)FName,(VOIDP)FS);
  }
  return(FS);
}


/*---------------------------*/
Pixmap AlUI_GetTile(t)
int t;
{
  Pixmap Pix;
  Pix=XwCreateTile(Screen_GR,ForePix_GR,BackPix_GR,t);
  assert(Pix!=NULL);
  return(Pix);
}

static Arg CTWArgs[]={
  { XtNalignment, (XtArgVal) XwALIGN_LEFT },
  { XtNmappedWhenManaged, (XtArgVal) FALSE },
};

/*-----------------------------*/
void AlUI_Initialize(topWidget)
Widget topWidget;
{
  static Arg argsUse[2];
  TestWidget_GR=topWidget;
  XtSetArg(argsUse[0],XtNbackground,&BackPix_GR);
  XtSetArg(argsUse[1],XtNforeground,&ForePix_GR);
  XtGetValues(TestWidget_GR,argsUse,2);
  Screen_GR=XtScreen(TestWidget_GR);
  Fonts_FR=Registry_create(Registry_strcmp,Registry_strhash);
}

/*----------------------*/
void AlUI_ReverseVideo(w)
Widget w;
{
  static Pixel BackPix, ForePix;
  static Arg argsUse[]={
    { NULL, NULL },
    { NULL, NULL },
    { NULL, (XtArgVal) NULL },
  };
  static Arg argsSet[]={
    { NULL, NULL },
    { NULL, NULL },
    { NULL, NULL },
    { NULL, NULL },
    { NULL, (XtArgVal) NULL },
  };
  XtSetArg(argsUse[0],XtNbackground,&BackPix);
  XtSetArg(argsUse[1],XtNforeground,&ForePix);
  XtGetValues(w,argsUse,2);
  XtSetArg(argsSet[0],XtNbackground,ForePix);
  XtSetArg(argsSet[1],XtNforeground,BackPix);
  XtSetValues(w,argsSet,2);
}


/*--------------------------------------------------*/
NORET Alxt_SetArg(w,name,value)
Widget w;
String name;
XtArgVal value;
{
  ArgPack AP;

  AP=ArgPack_create();
  ArgPack_add_arg(AP,name,value);
  XtSetValues(w,ArgPack_the_args(AP),1);
  ArgPack_delete(AP);
}


/*--------------------------------------------------*/
Pixmap Alxt_get_menu_pixmap(w)
Widget w;
{
  static Pixmap MenuPM=NULL;
  Screen *screen;
  Display *display;
  int ScreenNumber;

  display=XtDisplay(w);
  screen=XtScreen(w);
  ScreenNumber=XDefaultScreen(display);
  MenuPM=XCreatePixmapFromBitmapData(display,
				     RootWindowOfScreen(screen),
				     button_bits,
				     button_width,
				     button_height,
				     XBlackPixel(display,ScreenNumber),
				     XWhitePixel(display,ScreenNumber),
				     DefaultDepthOfScreen(screen));
  return(MenuPM);
}

/*--------------------------------------------------*/
Pixel  Alxt_get_foreground()
{
  return((Pixel)Alxt_get_widget_feature(TestWidget_GR,XtNforeground));
}

/*--------------------------------------------------*/
Pixel  Alxt_get_background()
{
  return((Pixel)Alxt_get_widget_feature(TestWidget_GR,XtNbackground));
}

/*--------------------------------------------------*/
VOIDP Alxt_get_widget_feature(W,Feature)
Widget W;
char *Feature;
{
  ArgPack AP;
  long ReturnVal;
  AP=ArgPack_create();
  ArgPack_add_arg(AP,Feature,(XtArgVal)&ReturnVal);
  XtGetValues(W,ArgPack_the_args(AP),ArgPack_num_args(AP));
  return((VOIDP)ReturnVal);
}

/*--------------------------------------------------*/
Bool Alxt_set_menu_item_with_arg(mp,item_name,arg,value)
MenuPack mp;
char *item_name, *arg;
XtArgVal value;
{
  Widget SW;
				  
  if ((SW=MenuPack_get_widget(mp,item_name))!=NULL) {
    Alxt_SetArg(SW,arg,value);
    return(Bool_TRUE);
  }
  else
    return(Bool_FALSE);
}

