1 /*
2 * Author: William Chia-Wei Cheng (bill.cheng@acm.org)
3 *
4 * Copyright (C) 2001-2009, William Chia-Wei Cheng.
5 *
6 * This file may be distributed under the terms of the Q Public License
7 * as defined by Trolltech AS of Norway and appearing in the file
8 * LICENSE.QPL included in the packaging of this file.
9 *
10 * THIS FILE IS PROVIDED AS IS WITH NO WARRANTY OF ANY KIND, INCLUDING
11 * THE WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR
12 * PURPOSE. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL,
13 * INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING
14 * FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT,
15 * NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION
16 * WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
17 *
18 * @(#)$Header: /mm2/home/cvs/bc-src/tgif/cursor.c,v 1.7 2011/05/16 16:21:57 william Exp $
19 */
20
21 #define _INCLUDE_FROM_CURSOR_C_
22
23 #include "tgifdefs.h"
24
25 #include "choice.e"
26 #include "color.e"
27 #include "cursor.e"
28 #include "file.e"
29 #include "setup.e"
30 #include "strtbl.e"
31 #include "xbitmap.e"
32
33 #include "xbm/null.xbm"
34 #include "xbm/nullmask.xbm"
35 #include "xbm/text_cur.xbm"
36 #include "xbm/helphand.xbm"
37 #include "xbm/hhand_mk.xbm"
38 #include "xbm/mag.xbm"
39 #include "xbm/mag_mask.xbm"
40 #include "xbm/flood.xbm"
41 #include "xbm/flood_mk.xbm"
42 #include "xbm/drip.xbm"
43 #include "xbm/drip_msk.xbm"
44
45 Cursor nullCursor=(Cursor)0;
46 Cursor cornerCursor=(Cursor)0;
47 Cursor handCursor=(Cursor)0;
48 Cursor defaultCursor=(Cursor)0;
49 Cursor watchCursor=(Cursor)0;
50 Cursor drawCursor=(Cursor)0;
51 Cursor freehandCursor=(Cursor)0;
52 Cursor vertexCursor=(Cursor)0;
53 Cursor rotateCursor=(Cursor)0;
54 Cursor rotatingCursor=(Cursor)0;
55 Cursor horiShearCursor=(Cursor)0;
56 Cursor vertShearCursor=(Cursor)0;
57 Cursor moveCursor=(Cursor)0;
58 Cursor textCursor=(Cursor)0;
59 Cursor hyperSpaceCursor=(Cursor)0;
60 Cursor magCursor=(Cursor)0;
61 Cursor floodCursor=(Cursor)0;
62 Cursor dripCursor=(Cursor)0;
63
64 int watchCursorOnMainWindow=FALSE;
65
66 static GC textCursorGC=NULL;
67 static Pixmap textPixmap=None;
68 static Pixmap nullPixmap=None;
69 static Pixmap nullMaskPixmap=None;
70 static Pixmap hyperSpacePixmap=None;
71 static Pixmap hyperSpaceMaskPixmap=None;
72 static Pixmap magPixmap=None;
73 static Pixmap magMaskPixmap=None;
74 static Pixmap floodPixmap=None;
75 static Pixmap floodMaskPixmap=None;
76 static Pixmap dripPixmap=None;
77 static Pixmap dripMaskPixmap=None;
78
79 static char *cursorName[] = {
80 /* do not translate -- program constants */
81 "X_cursor",
82 "arrow",
83 "based_arrow_down",
84 "based_arrow_up",
85 "boat",
86 "bogosity",
87 "bottom_left_corner",
88 "bottom_right_corner",
89 "bottom_side",
90 "bottom_tee",
91 "box_spiral",
92 "center_ptr",
93 "circle",
94 "clock",
95 "coffee_mug",
96 "cross",
97 "cross_reverse",
98 "crosshair",
99 "diamond_cross",
100 "dot",
101 "dotbox",
102 "double_arrow",
103 "draft_large",
104 "draft_small",
105 "draped_box",
106 "exchange",
107 "fleur",
108 "gobbler",
109 "gumby",
110 "hand1",
111 "hand2",
112 "heart",
113 "icon",
114 "iron_cross",
115 "left_ptr",
116 "left_side",
117 "left_tee",
118 "leftbutton",
119 "ll_angle",
120 "lr_angle",
121 "man",
122 "middlebutton",
123 "mouse",
124 "pencil",
125 "pirate",
126 "plus",
127 "question_arrow",
128 "right_ptr",
129 "right_side",
130 "right_tee",
131 "rightbutton",
132 "rtl_logo",
133 "sailboat",
134 "sb_down_arrow",
135 "sb_h_double_arrow",
136 "sb_left_arrow",
137 "sb_right_arrow",
138 "sb_up_arrow",
139 "sb_v_double_arrow",
140 "shuttle",
141 "sizing",
142 "spider",
143 "spraycan",
144 "star",
145 "target",
146 "tcross",
147 "top_left_arrow",
148 "top_left_corner",
149 "top_right_corner",
150 "top_side",
151 "top_tee",
152 "trek",
153 "ul_angle",
154 "umbrella",
155 "ur_angle",
156 "watch",
157 "xterm",
158 ""
159 };
160
161 static unsigned int cursorID[] = {
162 XC_X_cursor,
163 XC_arrow,
164 XC_based_arrow_down,
165 XC_based_arrow_up,
166 XC_boat,
167 XC_bogosity,
168 XC_bottom_left_corner,
169 XC_bottom_right_corner,
170 XC_bottom_side,
171 XC_bottom_tee,
172 XC_box_spiral,
173 XC_center_ptr,
174 XC_circle,
175 XC_clock,
176 XC_coffee_mug,
177 XC_cross,
178 XC_cross_reverse,
179 XC_crosshair,
180 XC_diamond_cross,
181 XC_dot,
182 XC_dotbox,
183 XC_double_arrow,
184 XC_draft_large,
185 XC_draft_small,
186 XC_draped_box,
187 XC_exchange,
188 XC_fleur,
189 XC_gobbler,
190 XC_gumby,
191 XC_hand1,
192 XC_hand2,
193 XC_heart,
194 XC_icon,
195 XC_iron_cross,
196 XC_left_ptr,
197 XC_left_side,
198 XC_left_tee,
199 XC_leftbutton,
200 XC_ll_angle,
201 XC_lr_angle,
202 XC_man,
203 XC_middlebutton,
204 XC_mouse,
205 XC_pencil,
206 XC_pirate,
207 XC_plus,
208 XC_question_arrow,
209 XC_right_ptr,
210 XC_right_side,
211 XC_right_tee,
212 XC_rightbutton,
213 XC_rtl_logo,
214 XC_sailboat,
215 XC_sb_down_arrow,
216 XC_sb_h_double_arrow,
217 XC_sb_left_arrow,
218 XC_sb_right_arrow,
219 XC_sb_up_arrow,
220 XC_sb_v_double_arrow,
221 XC_shuttle,
222 XC_sizing,
223 XC_spider,
224 XC_spraycan,
225 XC_star,
226 XC_target,
227 XC_tcross,
228 XC_top_left_arrow,
229 XC_top_left_corner,
230 XC_top_right_corner,
231 XC_top_side,
232 XC_top_tee,
233 XC_trek,
234 XC_ul_angle,
235 XC_umbrella,
236 XC_ur_angle,
237 XC_watch,
238 XC_xterm
239 };
240
SetTextCursor(window)241 void SetTextCursor(window)
242 Window window;
243 {
244 XDefineCursor(mainDisplay, window, textCursor);
245 }
246
SetNullCursor(window)247 void SetNullCursor(window)
248 Window window;
249 {
250 XDefineCursor(mainDisplay, window, nullCursor);
251 }
252
SetWatchCursor(window)253 void SetWatchCursor(window)
254 Window window;
255 {
256 if (!PRTGIF || cmdLineOpenDisplay) {
257 XDefineCursor(mainDisplay, window, watchCursor);
258 if (window == mainWindow) watchCursorOnMainWindow = TRUE;
259 XSync(mainDisplay, False);
260 }
261 }
262
SetDrawCursor(window)263 void SetDrawCursor(window)
264 Window window;
265 {
266 XDefineCursor(mainDisplay, window, drawCursor);
267 }
268
SetFreeHandCursor(window)269 void SetFreeHandCursor(window)
270 Window window;
271 {
272 XDefineCursor(mainDisplay, window, freehandCursor);
273 }
274
SetVertexCursor(window)275 void SetVertexCursor(window)
276 Window window;
277 {
278 XDefineCursor(mainDisplay, window, vertexCursor);
279 }
280
SetRotateCursor(window)281 void SetRotateCursor(window)
282 Window window;
283 {
284 XDefineCursor(mainDisplay, window, rotateCursor);
285 }
286
SetRotatingCursor(window)287 void SetRotatingCursor(window)
288 Window window;
289 {
290 XDefineCursor(mainDisplay, window, rotatingCursor);
291 }
292
SetHoriShearCursor(window)293 void SetHoriShearCursor(window)
294 Window window;
295 {
296 XDefineCursor(mainDisplay, window, horiShearCursor);
297 }
298
SetVertShearCursor(window)299 void SetVertShearCursor(window)
300 Window window;
301 {
302 XDefineCursor(mainDisplay, window, vertShearCursor);
303 }
304
SetMoveCursor(window)305 void SetMoveCursor(window)
306 Window window;
307 {
308 XDefineCursor(mainDisplay, window, moveCursor);
309 }
310
SetHyperSpaceCursor(window)311 void SetHyperSpaceCursor(window)
312 Window window;
313 {
314 XDefineCursor(mainDisplay, window, hyperSpaceCursor);
315 }
316
SetFloodFillCursor(window)317 void SetFloodFillCursor(window)
318 Window window;
319 {
320 XDefineCursor(mainDisplay, window, floodCursor);
321 }
322
SetDripCursor(window)323 void SetDripCursor(window)
324 Window window;
325 {
326 XDefineCursor(mainDisplay, window, dripCursor);
327 }
328
SetHandCursor(window)329 void SetHandCursor(window)
330 Window window;
331 {
332 XDefineCursor(mainDisplay, window, handCursor);
333 }
334
SetDefaultCursor(window)335 void SetDefaultCursor(window)
336 Window window;
337 {
338 if (!PRTGIF || cmdLineOpenDisplay) {
339 XDefineCursor(mainDisplay, window, defaultCursor);
340 if (window == mainWindow && watchCursorOnMainWindow) {
341 watchCursorOnMainWindow = FALSE;
342 }
343 }
344 }
345
ShowCursor()346 void ShowCursor()
347 {
348 if (curChoice == DRAWTEXT) {
349 SetTextCursor(drawWindow);
350 } else if (curChoice == NOTHING) {
351 SetDefaultCursor(drawWindow);
352 } else if (curChoice == FREEHAND) {
353 SetFreeHandCursor(drawWindow);
354 } else if (curChoice == VERTEXMODE) {
355 SetVertexCursor(drawWindow);
356 } else if (curChoice == ROTATEMODE) {
357 SetRotateCursor(drawWindow);
358 } else {
359 SetDrawCursor(drawWindow);
360 }
361 }
362
CreateCursor()363 void CreateCursor()
364 {
365 int i;
366 XGCValues values;
367 XColor color, fg_color, bg_color;
368 char *c_ptr;
369 int default_cursor_id=XC_arrow, rotate_shear_cursor_id;
370 int draw_cursor_id, drag_cursor_id, freehand_cursor_id, vertex_cursor_id;
371
372 textPixmap = XCreateBitmapFromData(mainDisplay, mainWindow,
373 (char *)text_cur_bits, text_cur_width, text_cur_height);
374
375 values.foreground = myFgPixel;
376 values.background = (threeDLook ? myLtGryPixel : myBgPixel);
377 values.fill_style = FillOpaqueStippled;
378 values.stipple = textPixmap;
379 textCursorGC = XCreateGC(mainDisplay, mainWindow,
380 GCForeground | GCBackground | GCFillStyle | GCStipple, &values);
381
382 XParseColor(mainDisplay, mainColormap, myFgColorStr, &fg_color);
383 XAllocColor(mainDisplay, mainColormap, &fg_color);
384 XParseColor(mainDisplay, mainColormap, myBgColorStr, &bg_color);
385 XAllocColor(mainDisplay, mainColormap, &bg_color);
386
387 textCursor = XCreateFontCursor(mainDisplay, XC_xterm);
388 cornerCursor = XCreateFontCursor(mainDisplay, XC_ul_angle);
389 watchCursor = XCreateFontCursor(mainDisplay, XC_watch);
390
391 if ((c_ptr=XGetDefault(mainDisplay,TOOL_NAME,"DefaultCursor")) != NULL) {
392 for (i = 0; *cursorName[i] != '\0'; i++) {
393 if (strcmp(c_ptr, cursorName[i]) == 0) {
394 default_cursor_id = cursorID[i];
395 break;
396 }
397 }
398 if (*cursorName[i] == '\0') {
399 fprintf(stderr, TgLoadString(STID_INVALID_XDEF_USE_ALT_STR), TOOL_NAME,
400 "DefaultCursor", c_ptr, cursorName[default_cursor_id>>1]);
401 fprintf(stderr, "\n");
402 }
403 }
404 defaultCursor = XCreateFontCursor(mainDisplay, default_cursor_id);
405
406 draw_cursor_id = default_cursor_id;
407 if ((c_ptr=XGetDefault(mainDisplay,TOOL_NAME,"DrawCursor")) != NULL) {
408 for (i = 0; *cursorName[i] != '\0'; i++) {
409 if (strcmp(c_ptr, cursorName[i]) == 0) {
410 draw_cursor_id = cursorID[i];
411 break;
412 }
413 }
414 if (*cursorName[i] == '\0') {
415 fprintf(stderr, TgLoadString(STID_INVALID_XDEF_USE_ALT_STR), TOOL_NAME,
416 "DrawCursor", c_ptr, cursorName[draw_cursor_id>>1]);
417 fprintf(stderr, "\n");
418 }
419 }
420 drawCursor = XCreateFontCursor(mainDisplay, draw_cursor_id);
421
422 drag_cursor_id = XC_hand2;
423 if ((c_ptr=XGetDefault(mainDisplay, TOOL_NAME, "DragCursor")) != NULL) {
424 for (i = 0; *cursorName[i] != '\0'; i++) {
425 if (strcmp(c_ptr, cursorName[i]) == 0) {
426 drag_cursor_id = cursorID[i];
427 break;
428 }
429 }
430 if (*cursorName[i] == '\0') {
431 fprintf(stderr, TgLoadString(STID_INVALID_XDEF_USE_ALT_STR), TOOL_NAME,
432 "DragCursor", c_ptr, cursorName[drag_cursor_id>>1]);
433 fprintf(stderr, "\n");
434 }
435 }
436 handCursor = XCreateFontCursor(mainDisplay, drag_cursor_id);
437
438 freehand_cursor_id = XC_pencil;
439 if ((c_ptr=XGetDefault(mainDisplay,TOOL_NAME,"FreeHandCursor")) != NULL) {
440 for (i = 0; *cursorName[i] != '\0'; i++) {
441 if (strcmp(c_ptr, cursorName[i]) == 0) {
442 freehand_cursor_id = cursorID[i];
443 break;
444 }
445 }
446 if (*cursorName[i] == '\0') {
447 fprintf(stderr, TgLoadString(STID_INVALID_XDEF_USE_ALT_STR), TOOL_NAME,
448 "FreeHandCursor", c_ptr, cursorName[freehand_cursor_id>>1]);
449 fprintf(stderr, "\n");
450 }
451 }
452 freehandCursor = XCreateFontCursor(mainDisplay, freehand_cursor_id);
453
454 vertex_cursor_id = XC_plus;
455 if ((c_ptr=XGetDefault(mainDisplay,TOOL_NAME,"VertexCursor")) != NULL) {
456 for (i = 0; *cursorName[i] != '\0'; i++) {
457 if (strcmp(c_ptr, cursorName[i]) == 0) {
458 vertex_cursor_id = cursorID[i];
459 break;
460 }
461 }
462 if (*cursorName[i] == '\0') {
463 fprintf(stderr, TgLoadString(STID_INVALID_XDEF_USE_ALT_STR), TOOL_NAME,
464 "VertexCursor", c_ptr, cursorName[vertex_cursor_id>>1]);
465 fprintf(stderr, "\n");
466 }
467 }
468 vertexCursor = XCreateFontCursor(mainDisplay, vertex_cursor_id);
469
470 rotate_shear_cursor_id = XC_crosshair;
471 if ((c_ptr=XGetDefault(mainDisplay,TOOL_NAME,"RotateCursor")) != NULL) {
472 for (i = 0; *cursorName[i] != '\0'; i++) {
473 if (strcmp(c_ptr, cursorName[i]) == 0) {
474 rotate_shear_cursor_id = cursorID[i];
475 break;
476 }
477 }
478 if (*cursorName[i] == '\0') {
479 fprintf(stderr, TgLoadString(STID_INVALID_XDEF_USE_ALT_STR), TOOL_NAME,
480 "RotateCursor", c_ptr, cursorName[rotate_shear_cursor_id>>1]);
481 fprintf(stderr, "\n");
482 }
483 }
484 rotateCursor = XCreateFontCursor(mainDisplay, rotate_shear_cursor_id);
485
486 rotatingCursor = XCreateFontCursor(mainDisplay, XC_exchange);
487 horiShearCursor = XCreateFontCursor(mainDisplay, XC_sb_h_double_arrow);
488 vertShearCursor = XCreateFontCursor(mainDisplay, XC_sb_v_double_arrow);
489 moveCursor = XCreateFontCursor(mainDisplay, XC_fleur);
490
491 XRecolorCursor(mainDisplay, textCursor, &fg_color, &bg_color);
492 XRecolorCursor(mainDisplay, cornerCursor, &fg_color, &bg_color);
493 XRecolorCursor(mainDisplay, handCursor, &fg_color, &bg_color);
494 XRecolorCursor(mainDisplay, watchCursor, &fg_color, &bg_color);
495 XRecolorCursor(mainDisplay, defaultCursor, &fg_color, &bg_color);
496 XRecolorCursor(mainDisplay, drawCursor, &fg_color, &bg_color);
497 XRecolorCursor(mainDisplay, freehandCursor, &fg_color, &bg_color);
498 XRecolorCursor(mainDisplay, vertexCursor, &fg_color, &bg_color);
499 XRecolorCursor(mainDisplay, rotateCursor, &fg_color, &bg_color);
500 XRecolorCursor(mainDisplay, rotatingCursor, &fg_color, &bg_color);
501 XRecolorCursor(mainDisplay, horiShearCursor, &fg_color, &bg_color);
502 XRecolorCursor(mainDisplay, vertShearCursor, &fg_color, &bg_color);
503 XRecolorCursor(mainDisplay, moveCursor, &fg_color, &bg_color);
504
505 nullPixmap = XCreateBitmapFromData(mainDisplay, mainWindow,
506 (char *)null_bits, null_width, null_height);
507
508 nullMaskPixmap = XCreateBitmapFromData(mainDisplay, mainWindow,
509 (char *)nullmask_bits, nullmask_width, nullmask_height);
510
511 nullCursor = XCreatePixmapCursor(mainDisplay, nullPixmap, nullMaskPixmap,
512 &color, &color, 7, 0);
513
514 hyperSpacePixmap = XCreateBitmapFromData(mainDisplay, mainWindow,
515 (char *)helphand_bits, helphand_width, helphand_height);
516
517 hyperSpaceMaskPixmap = XCreateBitmapFromData(mainDisplay, mainWindow,
518 (char *)hhand_mk_bits, hhand_mk_width, hhand_mk_height);
519
520 hyperSpaceCursor = XCreatePixmapCursor(mainDisplay, hyperSpacePixmap,
521 hyperSpaceMaskPixmap, &fg_color, &bg_color, 5, 1);
522
523 XRecolorCursor(mainDisplay, hyperSpaceCursor, &fg_color, &bg_color);
524
525 magPixmap = XCreateBitmapFromData(mainDisplay, mainWindow,
526 (char *)mag_bits, mag_width, mag_height);
527
528 magMaskPixmap = XCreateBitmapFromData(mainDisplay, mainWindow,
529 (char *)mag_mask_bits, mag_mask_width, mag_mask_height);
530
531 magCursor = XCreatePixmapCursor(mainDisplay, magPixmap,
532 magMaskPixmap, &fg_color, &bg_color, 8, 8);
533
534 floodPixmap = XCreateBitmapFromData(mainDisplay, mainWindow,
535 (char *)flood_bits, flood_width, flood_height);
536
537 floodMaskPixmap = XCreateBitmapFromData(mainDisplay, mainWindow,
538 (char *)flood_mk_bits, flood_mk_width, flood_mk_height);
539
540 floodCursor = XCreatePixmapCursor(mainDisplay, floodPixmap,
541 floodMaskPixmap, &fg_color, &bg_color, 9, 18);
542
543 dripPixmap = XCreateBitmapFromData(mainDisplay, mainWindow,
544 (char *)drip_bits, drip_width, drip_height);
545
546 dripMaskPixmap = XCreateBitmapFromData(mainDisplay, mainWindow,
547 (char *)drip_msk_bits, drip_msk_width, drip_msk_height);
548
549 dripCursor = XCreatePixmapCursor(mainDisplay, dripPixmap,
550 dripMaskPixmap, &fg_color, &bg_color, 10, 18);
551
552 XRecolorCursor(mainDisplay, hyperSpaceCursor, &fg_color, &bg_color);
553 }
554
PutCursor(window,x,y,foreground)555 void PutCursor(window, x, y, foreground)
556 Window window;
557 int x, y, foreground;
558 {
559 XGCValues values;
560
561 values.foreground = foreground;
562 values.ts_x_origin = x;
563 values.ts_y_origin = y;
564 XChangeGC(mainDisplay, textCursorGC,
565 GCForeground | GCTileStipXOrigin | GCTileStipYOrigin, &values);
566 XFillRectangle(mainDisplay, window, textCursorGC, x, y,
567 text_cur_width, text_cur_height);
568 }
569
CleanUpCursors()570 void CleanUpCursors()
571 {
572 XFreePixmap(mainDisplay, textPixmap);
573 XFreeGC(mainDisplay, textCursorGC);
574
575 XFreeCursor(mainDisplay, textCursor);
576 XFreeCursor(mainDisplay, cornerCursor);
577 XFreeCursor(mainDisplay, handCursor);
578 XFreeCursor(mainDisplay, defaultCursor);
579 XFreeCursor(mainDisplay, watchCursor);
580 XFreeCursor(mainDisplay, drawCursor);
581 XFreeCursor(mainDisplay, freehandCursor);
582 XFreeCursor(mainDisplay, vertexCursor);
583 XFreeCursor(mainDisplay, rotateCursor);
584 XFreeCursor(mainDisplay, rotatingCursor);
585 XFreeCursor(mainDisplay, horiShearCursor);
586 XFreeCursor(mainDisplay, vertShearCursor);
587 XFreeCursor(mainDisplay, moveCursor);
588 XFreeCursor(mainDisplay, hyperSpaceCursor);
589 XFreeCursor(mainDisplay, magCursor);
590 XFreeCursor(mainDisplay, floodCursor);
591 XFreeCursor(mainDisplay, dripCursor);
592
593 XFreePixmap(mainDisplay, nullPixmap);
594 XFreePixmap(mainDisplay, nullMaskPixmap);
595 XFreeCursor(mainDisplay, nullCursor);
596 XFreePixmap(mainDisplay, hyperSpacePixmap);
597 XFreePixmap(mainDisplay, hyperSpaceMaskPixmap);
598 XFreePixmap(mainDisplay, magPixmap);
599 XFreePixmap(mainDisplay, magMaskPixmap);
600 XFreePixmap(mainDisplay, floodPixmap);
601 XFreePixmap(mainDisplay, floodMaskPixmap);
602 XFreePixmap(mainDisplay, dripPixmap);
603 XFreePixmap(mainDisplay, dripMaskPixmap);
604 }
605
NewFontCursor(cursor_name)606 Cursor NewFontCursor(cursor_name)
607 char *cursor_name;
608 {
609 register int i;
610
611 for (i = 0; *cursorName[i] != '\0'; i++) {
612 if (strcmp(cursor_name, cursorName[i]) == 0) {
613 return XCreateFontCursor(mainDisplay, cursorID[i]);
614 }
615 }
616 return (Cursor)0;
617 }
618
SetWindowCursor(window,cursor)619 void SetWindowCursor(window, cursor)
620 Window window;
621 Cursor cursor;
622 {
623 XDefineCursor(mainDisplay, window, cursor);
624 }
625
DeleteFontCursor(cursor)626 void DeleteFontCursor(cursor)
627 Cursor cursor;
628 {
629 if (handCursor != (Cursor)0) XFreeCursor(mainDisplay, cursor);
630 }
631
632