1 |
/* $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 */
|