Browse Source

ENH: add a simple x11 program

Bill Hoffman 17 years ago
parent
commit
ee867fb1b2
1 changed files with 145 additions and 0 deletions
  1. 145 0
      Tests/X11/HelloWorldX11.cxx

+ 145 - 0
Tests/X11/HelloWorldX11.cxx

@@ -0,0 +1,145 @@
+
+/*** 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(TRUE) {     
+  // 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);
+};