This uses pixmaps, some graphics routines, and events.
#include <X11/cursorfont.h>
#include <stdio.h>
#include <X11/Xlib.h>
Display *display;
Window win1;
XSetWindowAttributes attributes;
XFontStruct *fontinfo;
GC gr_context1;
XArc arcs[10];
Pixmap pixmap;
Visual *visual;
int screen;
int depth;
int i;
main (argc, argv)
char *argv[];
int argc;
{
XGCValues gr_values;
XEvent event;
setbuf (stdout, NULL);
setbuf (stderr, NULL);
display = XOpenDisplay(NULL);
screen = DefaultScreen(display);
visual = DefaultVisual(display,screen);
depth = DefaultDepth(display,screen);
attributes.background_pixel = XWhitePixel(display,screen);
attributes.border_pixel = XBlackPixel(display,screen);
attributes.override_redirect = 0;
for(i=0;i<10;i++){
arcs[i].x = 100;arcs[i].y = 50;
arcs[i].width = 100;arcs[i].height = 50;
}
for(i=0;i<5;i++){
arcs[i].angle1 = 72*64*i;
arcs[i].angle2 = 35*64;
}
for(i=5;i<10;i++){
arcs[i].angle1 = 72*64*i + 36*64;
arcs[i].angle2 = 35*64;
}
win1= XCreateWindow(display, XRootWindow(display,screen),
200,200, 300,200,5, depth, InputOutput, visual,
CWBackPixel | CWBorderPixel | CWOverrideRedirect,&attributes);
XSelectInput(display,win1,ExposureMask | ButtonPressMask | KeyPressMask);
pixmap = XCreatePixmap(display,win1,200,100,depth);
fontinfo = XLoadQueryFont(display,"6x10");
gr_values.font = fontinfo->fid;
gr_values.function = GXcopy;
gr_values.plane_mask = AllPlanes;
gr_values.foreground = BlackPixel(display,screen);
gr_values.background = WhitePixel(display,screen);
gr_context1=XCreateGC(display,win1,
GCFont | GCFunction | GCPlaneMask | GCForeground | GCBackground,
&gr_values);
XDefineCursor(display,win1,XCreateFontCursor(display,XC_heart));
XMapWindow(display,win1);
do{
XNextEvent(display,&event);
if (event.type == Expose){
draw_ellipse();
XCopyArea(display,win1,pixmap,gr_context1,50,25,200,100,0,0);
XSetFunction(display,gr_context1,GXinvert);
XDrawImageString(display,pixmap,gr_context1,80,45,"pixmap",6);
XDrawImageString(display,pixmap,gr_context1,90,60,"copy",4);
XSetFunction(display,gr_context1,GXcopy);
XDrawString(display,win1,gr_context1,10,20,
"Press a key in this window",26);
}
}while (event.type !=KeyPress);
XCopyArea(display,pixmap,win1,gr_context1,0,0,200,100,100,125);
XDrawString(display,win1,gr_context1,10,32,
"Now press a key to exit",23);
XFlush(display);
do{
XNextEvent(display,&event);
}while (event.type !=KeyPress);
printf("closing display\n");
XCloseDisplay(display);
}
draw_ellipse()
{
XSetArcMode(display,gr_context1,ArcPieSlice);
XFillArcs(display,win1,gr_context1,arcs,5);
XSetArcMode(display,gr_context1,ArcChord);
XFillArcs(display,win1,gr_context1,arcs+5,5);
}
This example deals with keyboard input.
#include <X11/cursorfont.h>
#include <stdio.h>
#include <X11/Xlib.h>
#include<X11/keysym.h>
char workstation[] = {""};
char str[80];
Display *display;
Window win1;
XSetWindowAttributes attributes;
XFontStruct *fontinfo;
GC gr_context1;
Visual *visual;
int screen;
int depth;
main (argc, argv)
char *argv[];
int argc;
{
XGCValues gr_values;
XEvent event;
setbuf (stdout, NULL);
setbuf (stderr, NULL);
display = XOpenDisplay(workstation);
screen = DefaultScreen(display);
visual = DefaultVisual(display,screen);
depth = DefaultDepth(display,screen);
attributes.background_pixel = XWhitePixel(display,screen);
attributes.border_pixel = XBlackPixel(display,screen);
attributes.override_redirect = 0;
win1= XCreateWindow(display, XRootWindow(display,screen),
200,200, 300,200,5, depth, InputOutput, visual,
CWBackPixel | CWBorderPixel | CWOverrideRedirect,&attributes);
XSelectInput(display,win1,ExposureMask | ButtonPressMask | KeyPressMask);
fontinfo = XLoadQueryFont(display,"6x10");
gr_values.font = fontinfo->fid;
gr_values.function = GXcopy;
gr_values.plane_mask = AllPlanes;
gr_values.foreground = BlackPixel(display,screen);
gr_values.background = WhitePixel(display,screen);
gr_context1=XCreateGC(display,win1,
GCFont | GCFunction | GCPlaneMask | GCForeground | GCBackground,
&gr_values);
XDefineCursor(display,win1,XCreateFontCursor(display,XC_heart));
XMapWindow(display,win1);
XFlush(display);
do{
XNextEvent(display,&event);
switch(event.type){
case ButtonPress:
sprintf(str, "x=%d, y=%d", event.xbutton.x, event.xbutton.y);
XDrawImageString(display,win1,gr_context1,event.xbutton.x,
event.xbutton.y, str, strlen(str));
break;
case KeyPress:
deal_with_keys(&event);
break;
case Expose:
XClearWindow(display,win1);
XDrawImageString(display,win1,gr_context1,0,20,
"Press a key or Button. Use Break to exit", 40);
}
}while (1);
}
deal_with_keys(event)
XKeyEvent *event;
{
int count;
int buffer_size = 80;
char buffer[80];
KeySym keysym;
/* XComposeStatus compose; is not used, though it's in some books */
count = XLookupString(event,buffer,buffer_size, &keysym);
if ((keysym >= XK_space) && (keysym <= XK_asciitilde)){
printf ("Ascii key:- ");
if (event->state & ShiftMask)
printf("(Shift) %s\n", buffer);
else if (event->state & LockMask)
printf("(Caps Lock) %s\n", buffer);
else if (event->state & ControlMask)
printf("(Control) %c\n", 'a'+ buffer[0]-1) ;
else printf("%s\n", buffer) ;
}
else if ((keysym >= XK_Shift_L) && (keysym <= XK_Hyper_R)){
printf ("modifier key:- ");
switch (keysym){
case XK_Shift_L: printf("Left Shift\n"); break;
case XK_Shift_R: printf("Right Shift\n");break;
case XK_Control_L: printf("Left Control\n");break;
case XK_Control_R: printf("Right Control\n"); break;
case XK_Caps_Lock: printf("Caps Lock\n"); break;
case XK_Shift_Lock: printf("Shift Lock\n");break;
case XK_Meta_L: printf("Left Meta\n"); break;
case XK_Meta_R: printf("Right Meta\n"); break;
}
}
else if ((keysym >= XK_Left) && (keysym <= XK_Down)){
printf("Arrow Key:-");
switch(keysym){
case XK_Left: printf("Left\n");break;
case XK_Up: printf("Up\n");break;
case XK_Right: printf("Right\n");break;
case XK_Down: printf("Down\n");break;
}
}
else if ((keysym >= XK_F1) && (keysym <= XK_F35)){
printf ("function key %d pressed\n", keysym - XK_F1);
if (buffer == NULL)
printf("No matching string\n");
else
printf("matches <%s>\n",buffer);
}
else if ((keysym == XK_BackSpace) || (keysym == XK_Delete)){
printf("Delete\n");
}
else if ((keysym >= XK_KP_0) && (keysym <= XK_KP_9)){
printf("Number pad key %d\n", keysym - XK_KP_0);
}
else if (keysym == XK_Break) {
printf("closing display\n");
XCloseDisplay(display);
exit (0);
}else{
printf("Not handled\n");
}
}
/*
if one wants to find out if another client has changed the key mappings,
select MappingNotify and do
XRefreshKeyboardMapping(Event *event);
*/