diff options
Diffstat (limited to 'Tests/X11/HelloWorldX11.cxx')
-rw-r--r-- | Tests/X11/HelloWorldX11.cxx | 143 |
1 files changed, 143 insertions, 0 deletions
diff --git a/Tests/X11/HelloWorldX11.cxx b/Tests/X11/HelloWorldX11.cxx new file mode 100644 index 0000000..f18f8c8 --- /dev/null +++ b/Tests/X11/HelloWorldX11.cxx @@ -0,0 +1,143 @@ + +/*** 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 <stdlib.h> + +/* include the X library headers */ +# include <X11/Xlib.h> +# include <X11/Xos.h> +# include <X11/Xutil.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); +}; |