JAL Computing

C++COMProgramming .NET Mac Palm CPP/CLI Hobbies

 

Home
Up

Hello World

A simple low level X11 Xt program. An object version of Brian Hammond's "Howdy" program. Although interesting, it is unlikely that you will need such low level access to X11.

/*** START MAIN.H ***/

/*
 *  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
#include "main.h"
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);
};
/*** END MAIN.CPP ***/

 

Send mail to [email protected] with questions or comments about this web site. Copyright © 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009 © 
Last modified: 08/04/09
Hosted by www.Geocities.ws

1