ENH: add a simple x11 program
This commit is contained in:
parent
8d6a600409
commit
ee867fb1b2
|
@ -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);
|
||||
};
|
Loading…
Reference in New Issue