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