Display *display;           // verbinding met de server
Window root_window;         // wortelvenster (onzichtbaar), toegewezen door server
int screen;                 // beeldscherm

const int typenumber = 11;

long masktabel[typenumber][2] = {
  { MotionNotify,    ButtonMotionMask | PointerMotionMask },  // Bewogen 
  { ButtonPress,     ButtonPressMask     },  // muistoets omlaag
  { ButtonRelease,   ButtonReleaseMask   },  // muistoets omhoog
  { EnterNotify,     EnterWindowMask     },  // venster in gegaan
  { LeaveNotify,     LeaveWindowMask     },  // venster uit gegaan
  { Expose,          ExposureMask        },  // hertekenen vensterinhoud verzocht
  { FocusIn,         FocusChangeMask     },  // venster krijgt de focus
  { FocusOut,        FocusChangeMask     },  // venster verliest de focus
  { KeyPress,        KeyPressMask        },  // er wordt een toets ingedrukt
  { KeyRelease,      KeyReleaseMask      },  // er wordt een toets losgelaten
  { ResizeRequest,   ResizeRedirectMask  }   // venster verandert van grootte
};

#define checksymbol_width 16
#define checksymbol_height 16
static char checksymbol_bits[] = {
   0x00, 0x70, 0x00, 0x70, 0x00, 0x38, 0x00, 0x3c, 0x00, 0x1c, 0x06, 0x1e,
   0x0e, 0x0e, 0x1e, 0x0f, 0xb8, 0x0f, 0xf0, 0x07, 0xe0, 0x07, 0xc0, 0x07,
   0xc0, 0x03, 0x80, 0x03, 0x80, 0x03, 0x00, 0x00 };
   
#define XK_Left			0xFF51	/* Move left, left arrow */
#define XK_Right		0xFF53	/* Move right, right arrow */
#define XK_Shift_L		0xFFE1	/* Left shift */
#define XK_Shift_R		0xFFE2	/* Right shift */
#define XK_BackSpace		0xFF08	/* back space, back char */
#define XK_Delete		0xFFFF	/* Delete, rubout */
#define XK_Home			0xFF50
#define XK_End			0xFF57	/* EOL */

struct TWindowEventListItem {
  int event;
  int ID;
  TWindowEventListItem *next;
};

class TWindowEventWidget:public TWidget {
  public:
    TWindowEventWidget () {
      root = NULL;
      listmask = 0;
    }
    int Check ( XEvent *ev );
    void AddEvent ( int type, int ID );
    void RemoveEvent ( int type );
    void Init ( TWindow *parent ) {
      window = parent->GetWindow ();
    }
    long ExtractMask () { return listmask; }
  private:
    TWindowEventListItem *root;
    long listmask;
};


// intern
class TWidgetListElement {
  public:
    TWidget *widget;
    TWidgetListElement *next;
};

// intern
class TWidgetList {
  public:
    TWindowEventWidget *begin;
    
    TWidgetList ();
    ~TWidgetList ();
    void AddWidget ( TWidget *element );
    void RemoveWidget ( TWidget *element );
    int ExtractID ( XEvent *ev );
  private:
    TWidgetListElement *root;
};


class TMenuItemListElement {
  public:
    TMenuItemListElement ( char *_text, int _ID );
    ~TMenuItemListElement () {
      delete text;
      if ( next ) delete next;
    }
    TMenuItemListElement *next;
    char *text;
    int ID;
};

class TMenuListElement {
  public:
    TMenuListElement ( char *_text );
    ~TMenuListElement () {
      delete text;
      if ( next ) delete next;
      delete menu;
    }
    TMenuListElement *next;
    TMenuItemListElement *menu;
    char *text;
    int x1, x2, width, n;
};

class TWindowListElement {
  public:
    TWindowListElement ( TWindow *_window, TWindowListElement *_next ) {
      window = _window;
      next = _next;
    }
    TWindow *window;
    TWindowListElement *next;
};

