1 |
dashley |
71 |
/* $Header$ */ |
2 |
|
|
|
3 |
|
|
/* |
4 |
|
|
* tkWinCursor.c -- |
5 |
|
|
* |
6 |
|
|
* This file contains Win32 specific cursor related routines. |
7 |
|
|
* |
8 |
|
|
* Copyright (c) 1995 Sun Microsystems, Inc. |
9 |
|
|
* |
10 |
|
|
* See the file "license.terms" for information on usage and redistribution |
11 |
|
|
* of this file, and for a DISCLAIMER OF ALL WARRANTIES. |
12 |
|
|
* |
13 |
|
|
* RCS: @(#) $Id: tkwincursor.c,v 1.1.1.1 2001/06/13 05:12:07 dtashley Exp $ |
14 |
|
|
*/ |
15 |
|
|
|
16 |
|
|
#include "tkWinInt.h" |
17 |
|
|
|
18 |
|
|
/* |
19 |
|
|
* The following data structure contains the system specific data |
20 |
|
|
* necessary to control Windows cursors. |
21 |
|
|
*/ |
22 |
|
|
|
23 |
|
|
typedef struct { |
24 |
|
|
TkCursor info; /* Generic cursor info used by tkCursor.c */ |
25 |
|
|
HCURSOR winCursor; /* Win32 cursor handle. */ |
26 |
|
|
int system; /* 1 if cursor is a system cursor, else 0. */ |
27 |
|
|
} TkWinCursor; |
28 |
|
|
|
29 |
|
|
/* |
30 |
|
|
* The table below is used to map from the name of a predefined cursor |
31 |
|
|
* to its resource identifier. |
32 |
|
|
*/ |
33 |
|
|
|
34 |
|
|
static struct CursorName { |
35 |
|
|
char *name; |
36 |
|
|
LPCTSTR id; |
37 |
|
|
} cursorNames[] = { |
38 |
|
|
{"starting", IDC_APPSTARTING}, |
39 |
|
|
{"arrow", IDC_ARROW}, |
40 |
|
|
{"ibeam", IDC_IBEAM}, |
41 |
|
|
{"icon", IDC_ICON}, |
42 |
|
|
{"no", IDC_NO}, |
43 |
|
|
{"size", IDC_SIZE}, |
44 |
|
|
{"size_ne_sw", IDC_SIZENESW}, |
45 |
|
|
{"size_ns", IDC_SIZENS}, |
46 |
|
|
{"size_nw_se", IDC_SIZENWSE}, |
47 |
|
|
{"size_we", IDC_SIZEWE}, |
48 |
|
|
{"uparrow", IDC_UPARROW}, |
49 |
|
|
{"wait", IDC_WAIT}, |
50 |
|
|
{"crosshair", IDC_CROSS}, |
51 |
|
|
{"fleur", IDC_SIZE}, |
52 |
|
|
{"sb_v_double_arrow", IDC_SIZENS}, |
53 |
|
|
{"sb_h_double_arrow", IDC_SIZEWE}, |
54 |
|
|
{"center_ptr", IDC_UPARROW}, |
55 |
|
|
{"watch", IDC_WAIT}, |
56 |
|
|
{"xterm", IDC_IBEAM}, |
57 |
|
|
{NULL, 0} |
58 |
|
|
}; |
59 |
|
|
|
60 |
|
|
/* |
61 |
|
|
* The default cursor is used whenever no other cursor has been specified. |
62 |
|
|
*/ |
63 |
|
|
|
64 |
|
|
#define TK_DEFAULT_CURSOR IDC_ARROW |
65 |
|
|
|
66 |
|
|
|
67 |
|
|
/* |
68 |
|
|
*---------------------------------------------------------------------- |
69 |
|
|
* |
70 |
|
|
* TkGetCursorByName -- |
71 |
|
|
* |
72 |
|
|
* Retrieve a system cursor by name. |
73 |
|
|
* |
74 |
|
|
* Results: |
75 |
|
|
* Returns a new cursor, or NULL on errors. |
76 |
|
|
* |
77 |
|
|
* Side effects: |
78 |
|
|
* Allocates a new cursor. |
79 |
|
|
* |
80 |
|
|
*---------------------------------------------------------------------- |
81 |
|
|
*/ |
82 |
|
|
|
83 |
|
|
TkCursor * |
84 |
|
|
TkGetCursorByName(interp, tkwin, string) |
85 |
|
|
Tcl_Interp *interp; /* Interpreter to use for error reporting. */ |
86 |
|
|
Tk_Window tkwin; /* Window in which cursor will be used. */ |
87 |
|
|
Tk_Uid string; /* Description of cursor. See manual entry |
88 |
|
|
* for details on legal syntax. */ |
89 |
|
|
{ |
90 |
|
|
struct CursorName *namePtr; |
91 |
|
|
TkWinCursor *cursorPtr; |
92 |
|
|
|
93 |
|
|
/* |
94 |
|
|
* Check for the cursor in the system cursor set. |
95 |
|
|
*/ |
96 |
|
|
|
97 |
|
|
for (namePtr = cursorNames; namePtr->name != NULL; namePtr++) { |
98 |
|
|
if (strcmp(namePtr->name, string) == 0) { |
99 |
|
|
break; |
100 |
|
|
} |
101 |
|
|
} |
102 |
|
|
|
103 |
|
|
cursorPtr = (TkWinCursor *) ckalloc(sizeof(TkWinCursor)); |
104 |
|
|
cursorPtr->info.cursor = (Tk_Cursor) cursorPtr; |
105 |
|
|
cursorPtr->winCursor = NULL; |
106 |
|
|
if (namePtr->name != NULL) { |
107 |
|
|
cursorPtr->winCursor = LoadCursor(NULL, namePtr->id); |
108 |
|
|
cursorPtr->system = 1; |
109 |
|
|
} |
110 |
|
|
if (cursorPtr->winCursor == NULL) { |
111 |
|
|
cursorPtr->winCursor = LoadCursor(Tk_GetHINSTANCE(), string); |
112 |
|
|
cursorPtr->system = 0; |
113 |
|
|
} |
114 |
|
|
if (string[0] == '@') { |
115 |
|
|
int argc; |
116 |
|
|
char **argv = NULL; |
117 |
|
|
if (Tcl_SplitList(interp, string, &argc, &argv) != TCL_OK) { |
118 |
|
|
return NULL; |
119 |
|
|
} |
120 |
|
|
/* |
121 |
|
|
* Check for system cursor of type @<filename>, where only |
122 |
|
|
* the name is allowed. This accepts either: |
123 |
|
|
* -cursor @/winnt/cursors/globe.ani |
124 |
|
|
* -cursor @C:/Winnt/cursors/E_arrow.cur |
125 |
|
|
* -cursor {@C:/Program\ Files/Cursors/bart.ani} |
126 |
|
|
*/ |
127 |
|
|
if ((argc != 1) || (argv[0][0] != '@')) { |
128 |
|
|
ckfree((char *) argv); |
129 |
|
|
goto badCursorSpec; |
130 |
|
|
} |
131 |
|
|
if (Tcl_IsSafe(interp)) { |
132 |
|
|
Tcl_AppendResult(interp, "can't get cursor from a file in", |
133 |
|
|
" a safe interpreter", (char *) NULL); |
134 |
|
|
ckfree((char *) argv); |
135 |
|
|
ckfree((char *)cursorPtr); |
136 |
|
|
return NULL; |
137 |
|
|
} |
138 |
|
|
cursorPtr->winCursor = LoadCursorFromFile(&(argv[0][1])); |
139 |
|
|
cursorPtr->system = 0; |
140 |
|
|
ckfree((char *) argv); |
141 |
|
|
} |
142 |
|
|
if (cursorPtr->winCursor == NULL) { |
143 |
|
|
badCursorSpec: |
144 |
|
|
ckfree((char *)cursorPtr); |
145 |
|
|
Tcl_AppendResult(interp, "bad cursor spec \"", string, "\"", |
146 |
|
|
(char *) NULL); |
147 |
|
|
return NULL; |
148 |
|
|
} else { |
149 |
|
|
return (TkCursor *) cursorPtr; |
150 |
|
|
} |
151 |
|
|
} |
152 |
|
|
|
153 |
|
|
/* |
154 |
|
|
*---------------------------------------------------------------------- |
155 |
|
|
* |
156 |
|
|
* TkCreateCursorFromData -- |
157 |
|
|
* |
158 |
|
|
* Creates a cursor from the source and mask bits. |
159 |
|
|
* |
160 |
|
|
* Results: |
161 |
|
|
* Returns a new cursor, or NULL on errors. |
162 |
|
|
* |
163 |
|
|
* Side effects: |
164 |
|
|
* Allocates a new cursor. |
165 |
|
|
* |
166 |
|
|
*---------------------------------------------------------------------- |
167 |
|
|
*/ |
168 |
|
|
|
169 |
|
|
TkCursor * |
170 |
|
|
TkCreateCursorFromData(tkwin, source, mask, width, height, xHot, yHot, |
171 |
|
|
fgColor, bgColor) |
172 |
|
|
Tk_Window tkwin; /* Window in which cursor will be used. */ |
173 |
|
|
char *source; /* Bitmap data for cursor shape. */ |
174 |
|
|
char *mask; /* Bitmap data for cursor mask. */ |
175 |
|
|
int width, height; /* Dimensions of cursor. */ |
176 |
|
|
int xHot, yHot; /* Location of hot-spot in cursor. */ |
177 |
|
|
XColor fgColor; /* Foreground color for cursor. */ |
178 |
|
|
XColor bgColor; /* Background color for cursor. */ |
179 |
|
|
{ |
180 |
|
|
return NULL; |
181 |
|
|
} |
182 |
|
|
|
183 |
|
|
/* |
184 |
|
|
*---------------------------------------------------------------------- |
185 |
|
|
* |
186 |
|
|
* TkpFreeCursor -- |
187 |
|
|
* |
188 |
|
|
* This procedure is called to release a cursor allocated by |
189 |
|
|
* TkGetCursorByName. |
190 |
|
|
* |
191 |
|
|
* Results: |
192 |
|
|
* None. |
193 |
|
|
* |
194 |
|
|
* Side effects: |
195 |
|
|
* The cursor data structure is deallocated. |
196 |
|
|
* |
197 |
|
|
*---------------------------------------------------------------------- |
198 |
|
|
*/ |
199 |
|
|
|
200 |
|
|
void |
201 |
|
|
TkpFreeCursor(cursorPtr) |
202 |
|
|
TkCursor *cursorPtr; |
203 |
|
|
{ |
204 |
|
|
TkWinCursor *winCursorPtr = (TkWinCursor *) cursorPtr; |
205 |
|
|
} |
206 |
|
|
|
207 |
|
|
/* |
208 |
|
|
*---------------------------------------------------------------------- |
209 |
|
|
* |
210 |
|
|
* TkpSetCursor -- |
211 |
|
|
* |
212 |
|
|
* Set the global cursor. If the cursor is None, then use the |
213 |
|
|
* default Tk cursor. |
214 |
|
|
* |
215 |
|
|
* Results: |
216 |
|
|
* None. |
217 |
|
|
* |
218 |
|
|
* Side effects: |
219 |
|
|
* Changes the mouse cursor. |
220 |
|
|
* |
221 |
|
|
*---------------------------------------------------------------------- |
222 |
|
|
*/ |
223 |
|
|
|
224 |
|
|
void |
225 |
|
|
TkpSetCursor(cursor) |
226 |
|
|
TkpCursor cursor; |
227 |
|
|
{ |
228 |
|
|
HCURSOR hcursor; |
229 |
|
|
TkWinCursor *winCursor = (TkWinCursor *) cursor; |
230 |
|
|
|
231 |
|
|
if (winCursor == NULL || winCursor->winCursor == NULL) { |
232 |
|
|
hcursor = LoadCursor(NULL, TK_DEFAULT_CURSOR); |
233 |
|
|
} else { |
234 |
|
|
hcursor = winCursor->winCursor; |
235 |
|
|
} |
236 |
|
|
|
237 |
|
|
if (hcursor != NULL) { |
238 |
|
|
SetCursor(hcursor); |
239 |
|
|
} |
240 |
|
|
} |
241 |
|
|
|
242 |
|
|
/* End of tkwincursor.c */ |