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