Commit | Line | Data |
---|---|---|
6d8f8032 JA |
1 | #include <X11/Xlib.h> |
2 | #include <X11/X.h> | |
3 | #include <X11/Xutil.h> | |
4 | #include <X11/Xresource.h> | |
5 | #include "XTests.h" | |
6 | #include <stdio.h> | |
7 | ||
8 | static Display *dpy; | |
9 | ||
10 | static void | |
11 | quit (dpy) | |
12 | Display *dpy; | |
13 | { | |
14 | XCloseDisplay (dpy); | |
15 | exit (0); | |
16 | } | |
17 | ||
18 | static Colormap screen_colormap; | |
19 | ||
20 | static unsigned long | |
21 | obtain_color (color) | |
22 | char *color; | |
23 | { | |
24 | int exists; | |
25 | XColor color_def; | |
26 | ||
27 | if (!screen_colormap) | |
28 | screen_colormap = DefaultColormap (dpy, DefaultScreen (dpy)); | |
29 | ||
30 | exists = XParseColor (dpy, screen_colormap, color, &color_def) | |
31 | && XAllocColor (dpy, screen_colormap, &color_def); | |
32 | if (exists) | |
33 | return color_def.pixel; | |
34 | ||
35 | fprintf (stderr, "Can't get color; using black."); | |
36 | return BlackPixel (dpy, DefaultScreen (dpy)); | |
37 | } | |
38 | ||
39 | static char *visual_strings[] = | |
40 | { | |
41 | "StaticGray ", | |
42 | "GrayScale ", | |
43 | "StaticColor", | |
44 | "PseudoColor", | |
45 | "TrueColor ", | |
46 | "DirectColor" | |
47 | }; | |
48 | ||
49 | main (argc,argv) | |
50 | int argc; | |
51 | char *argv[]; | |
52 | { | |
53 | char *dpy_string; | |
54 | int n; | |
55 | long mask; | |
56 | Visual *my_visual; | |
57 | XVisualInfo *vinfo, visual_template; | |
58 | XEvent event; | |
59 | Window window; | |
60 | Screen *scr; | |
61 | XGCValues gc_values; | |
62 | GC fill_gc, pix_gc, line_xor_gc, line_xor_inv_gc; | |
63 | int i; | |
64 | int x, y, width, height, geometry, gravity; | |
65 | char *geo; | |
66 | char default_geo[] = "80x40+0+0"; | |
67 | int depth; | |
68 | Pixmap pix; | |
69 | char *string = "Kill the head and the body will die."; | |
d427b66a JB |
70 | char dash_list[] = {4, 4}; |
71 | int dashes = 2; | |
6d8f8032 JA |
72 | |
73 | if (argc < 2) | |
74 | dpy_string = "localhost:0.0"; | |
75 | else | |
76 | dpy_string = argv[1]; | |
77 | ||
78 | if (argc >= 3) | |
79 | { | |
80 | XSizeHints hints; | |
81 | ||
82 | printf ("Geometry: %s\t(default: %s)\n", argv[2], default_geo); | |
83 | geo = argv[2]; | |
84 | XWMGeometry (dpy, DefaultScreen (dpy), geo, default_geo, | |
85 | 3, &hints, &x, &y, &width, &height, &gravity); | |
86 | } | |
87 | ||
88 | dpy = XOpenDisplay (dpy_string); | |
89 | if (!dpy) | |
90 | { | |
91 | printf ("Can' open display %s\n", dpy_string); | |
92 | exit (1); | |
93 | } | |
94 | ||
95 | window = XCreateSimpleWindow (dpy, DefaultRootWindow (dpy), | |
96 | 300, 300, 300, 300, 1, | |
97 | BlackPixel (dpy, DefaultScreen (dpy)), | |
98 | WhitePixel (dpy, DefaultScreen (dpy))); | |
99 | XSelectInput (dpy, window, ButtonPressMask | KeyPressMask | |
100 | | EnterWindowMask | LeaveWindowMask); | |
101 | ||
102 | gc_values.foreground = obtain_color ("blue"); | |
103 | gc_values.background = WhitePixel (dpy, DefaultScreen (dpy)); | |
104 | fill_gc = XCreateGC (dpy, window, GCForeground | GCBackground, | |
105 | &gc_values); | |
106 | ||
107 | gc_values.foreground = obtain_color ("red"); | |
6d8f8032 JA |
108 | gc_values.line_width = 3; |
109 | gc_values.line_style = LineOnOffDash; | |
110 | gc_values.cap_style = CapRound; | |
111 | gc_values.join_style = JoinRound; | |
112 | line_xor_gc = XCreateGC (dpy, window, | |
113 | GCForeground | GCBackground | GCLineStyle | |
d427b66a | 114 | | GCJoinStyle | GCCapStyle | GCLineWidth, |
6d8f8032 JA |
115 | &gc_values); |
116 | XSetDashes (dpy, line_xor_gc, 0, dash_list, dashes); | |
117 | ||
6d8f8032 | 118 | line_xor_inv_gc = XCreateGC (dpy, window, |
d427b66a JB |
119 | GCForeground | GCBackground | GCLineWidth, |
120 | &gc_values); | |
6d8f8032 JA |
121 | |
122 | depth = DefaultDepthOfScreen (ScreenOfDisplay (dpy, DefaultScreen (dpy))); | |
123 | pix = XCreateBitmapFromData (dpy, window, page_glyf_bits, | |
124 | page_glyf_width, page_glyf_height); | |
125 | ||
126 | XMapWindow (dpy, window); | |
127 | XFlush (dpy); | |
128 | ||
129 | while (1) | |
130 | { | |
131 | XNextEvent (dpy, &event); | |
132 | switch (event.type) | |
133 | { | |
134 | case ButtonPress: | |
d427b66a JB |
135 | switch (event.xbutton.button) |
136 | { | |
137 | case Button1: | |
138 | XDrawLine (dpy, window, line_xor_gc, 25, 75, 300, 75); | |
139 | break; | |
140 | ||
141 | case Button2: | |
142 | XDrawLine (dpy, window, line_xor_inv_gc, 25, 25, 300, 25); | |
143 | break; | |
144 | ||
145 | case Button3: | |
146 | XDrawLine (dpy, window, line_xor_gc, 25, 25, 25, 125); | |
147 | break; | |
148 | } | |
6d8f8032 JA |
149 | break; |
150 | ||
151 | case KeyPress: | |
152 | { | |
153 | char buf[20]; | |
154 | int n; | |
155 | XComposeStatus status; | |
156 | KeySym keysym; | |
157 | ||
158 | n = XLookupString (&event, buf, 20, &keysym, | |
159 | (XComposeStatus *) &status); | |
160 | ||
161 | if (n == 1 && buf[0] == 'q') | |
162 | quit (dpy); | |
163 | } | |
164 | break; | |
165 | ||
166 | case EnterNotify: | |
167 | XCopyPlane (dpy, pix, window, fill_gc, 0, 0, | |
168 | page_glyf_width, page_glyf_height, 100, 100, 1L); | |
169 | XFillRectangle (dpy, window, fill_gc, 50, 50, 50, 50); | |
170 | break; | |
171 | ||
172 | case LeaveNotify: | |
173 | XClearWindow (dpy, window); | |
174 | break; | |
175 | } | |
176 | ||
177 | XFlush (dpy); | |
178 | } | |
179 | } |