| |
| /*** 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); |
| }; |