
/*** START MAIN.H ***/
/* http://www.geocities.com/jeff_louie/x11/helloworld.htm* */
/*
 *  main.h
 *  TestX
 *
 *  Created by Jeff Louie on Tue Feb 03 2004.
 *  Copyright (c) 2004 __MyCompanyName__. All rights reserved.
 *
 */
 

#ifndef MAIN_H
#define MAIN_H 1

#include <iostream>

/* include the X library headers */
#include <X11/Xlib.h>
#include <X11/Xutil.h>
#include <X11/Xos.h>

class Main {

public:
  // constructor
  Main(int argc, char * const argv[]);
  //virtual ~Main();
        

private:
        

  /* here are our X variables */
  Display *dis;
  int screen;
  Window win;
  GC gc;

  /* here are our X routines declared! */
  void init_x();
  void close_x();
  void redraw();
  int delay(int i);

};

#endif

/*** END MAIN.H ***/

/*** START MAIN.CPP ***/

// modified from Brian Hammond's Howdy program at 
// http://www.insanityengine.com/doc/x11/xintro.html
// jeff louie 02.05.2004



int main (int argc, char * const argv[]) {
  Main m(argc, argv);
  return 0;
}

//Main::~Main() {;};
Main::Main (int argc, char * const argv[]) {
  XEvent event;           // XEvent declaration
  KeySym key;             // KeyPress Events
  char text[255];         // char buffer for KeyPress Events

  init_x();

  // event loop
  while(1) {     
  // get the next event and stuff it into our event variable.
  // Note:  only events we set the mask for are detected!
  XNextEvent(dis, &event);
                                

  switch (event.type) {
  int x;
  int y;
  case Expose:
    if (event.xexpose.count==0) {
    redraw();
    }
    break;
  case KeyPress:
    if (XLookupString(&event.xkey,text,255,&key,0)==1) {
    // use the XLookupString routine to convert the invent
    // KeyPress data into regular text.  Weird but necessary...
    if ((text[0]=='q') || (text[0]=='Q')) {
    close_x();
    }
    else {
    // echo key press
    printf("You pressed the %c key!\n",text[0]);
    }
    }
    break;
  case ButtonPress:
    // get cursor position
    x= event.xbutton.x;
    y= event.xbutton.y;
    strcpy(text,"X is FUN!");
    XSetForeground(dis,gc,rand()%event.xbutton.x%255);
    // draw text at cursor
    XDrawString(dis,win,gc,x,y, text, strlen(text));
    break;
  default:
    printf("Unhandled event.\n");
  }
  }
}

void Main::init_x() {  
  unsigned long black,white;

  dis=XOpenDisplay(NULL);
  screen=DefaultScreen(dis);
  black=BlackPixel(dis,screen),
    white=WhitePixel(dis, screen);
  win=XCreateSimpleWindow(dis,DefaultRootWindow(dis),0,0, 
                          300, 300, 5,black, white);
  XSetStandardProperties(dis,win,"Hello World","Hi",None,NULL,0,NULL);
  XSelectInput(dis, win, ExposureMask|ButtonPressMask|KeyPressMask);
  // get Graphics Context
  gc=XCreateGC(dis, win, 0,0);        
  XSetBackground(dis,gc,white);
  XSetForeground(dis,gc,black);
  XClearWindow(dis, win);
  XMapRaised(dis, win);
};

void Main::close_x() {
  XFreeGC(dis, gc);
  XDestroyWindow(dis,win);
  XCloseDisplay(dis);     
  exit(1);                                
};

void Main::redraw() {
  XClearWindow(dis, win);
};
