diff options
author | dkf <donal.k.fellows@manchester.ac.uk> | 2002-06-13 09:46:38 (GMT) |
---|---|---|
committer | dkf <donal.k.fellows@manchester.ac.uk> | 2002-06-13 09:46:38 (GMT) |
commit | 7acca7516ab66ecbea898bbe3ab63c7f3ec7a030 (patch) | |
tree | a29cdada817e259a4baafaff04423689c93c390f /win/tkWinCursor.c | |
parent | 8e366fbb8888c7c6e6ac0065b1392213b789ad0a (diff) | |
download | tk-7acca7516ab66ecbea898bbe3ab63c7f3ec7a030.zip tk-7acca7516ab66ecbea898bbe3ab63c7f3ec7a030.tar.gz tk-7acca7516ab66ecbea898bbe3ab63c7f3ec7a030.tar.bz2 |
Refixed cursor handling on Windows, and added tests to enforce it.
Diffstat (limited to 'win/tkWinCursor.c')
-rw-r--r-- | win/tkWinCursor.c | 73 |
1 files changed, 43 insertions, 30 deletions
diff --git a/win/tkWinCursor.c b/win/tkWinCursor.c index a5d60db..608dd5e 100644 --- a/win/tkWinCursor.c +++ b/win/tkWinCursor.c @@ -8,7 +8,7 @@ * See the file "license.terms" for information on usage and redistribution * of this file, and for a DISCLAIMER OF ALL WARRANTIES. * - * RCS: @(#) $Id: tkWinCursor.c,v 1.8 2002/06/12 23:39:14 hobbs Exp $ + * RCS: @(#) $Id: tkWinCursor.c,v 1.9 2002/06/13 09:46:39 dkf Exp $ */ #include "tkWinInt.h" @@ -87,63 +87,76 @@ TkGetCursorByName(interp, tkwin, string) { struct CursorName *namePtr; TkWinCursor *cursorPtr; + int argc; + CONST char **argv = NULL; /* - * Check for the cursor in the system cursor set. + * All cursor names are valid lists of one element (for + * Unix-compatability), even unadorned system cursor names. */ - for (namePtr = cursorNames; namePtr->name != NULL; namePtr++) { - if (strcmp(namePtr->name, string) == 0) { - break; - } + if (Tcl_SplitList(interp, string, &argc, &argv) != TCL_OK) { + return NULL; + } + if (argc != 1) { + goto badCursorSpec; } cursorPtr = (TkWinCursor *) ckalloc(sizeof(TkWinCursor)); cursorPtr->info.cursor = (Tk_Cursor) cursorPtr; cursorPtr->winCursor = NULL; - if (namePtr->name != NULL) { - cursorPtr->winCursor = LoadCursor(NULL, namePtr->id); - cursorPtr->system = 1; - } - if (cursorPtr->winCursor == NULL) { - cursorPtr->winCursor = LoadCursor(Tk_GetHINSTANCE(), string); - cursorPtr->system = 0; - } - if (string[0] == '@') { - int argc; - CONST char **argv = NULL; - if (Tcl_SplitList(interp, string, &argc, &argv) != TCL_OK) { - return NULL; - } + cursorPtr->system = 0; + + if (argv[0][0] == '@') { /* * Check for system cursor of type @<filename>, where only - * the name is allowed. This accepts either: + * the name is allowed. This accepts any of: * -cursor @/winnt/cursors/globe.ani * -cursor @C:/Winnt/cursors/E_arrow.cur * -cursor {@C:/Program\ Files/Cursors/bart.ani} + * -cursor {{@C:/Program Files/Cursors/bart.ani}} + * -cursor [list @[file join "C:/Program Files" Cursors bart.ani]] */ - if ((argc != 1) || (argv[0][0] != '@')) { - ckfree((char *) argv); - goto badCursorSpec; - } + if (Tcl_IsSafe(interp)) { Tcl_AppendResult(interp, "can't get cursor from a file in", " a safe interpreter", (char *) NULL); ckfree((char *) argv); - ckfree((char *)cursorPtr); + ckfree((char *) cursorPtr); return NULL; } cursorPtr->winCursor = LoadCursorFromFile(&(argv[0][1])); - cursorPtr->system = 0; - ckfree((char *) argv); + } else { + /* + * Check for the cursor in the system cursor set. + */ + for (namePtr = cursorNames; namePtr->name != NULL; namePtr++) { + if (strcmp(namePtr->name, argv[0]) == 0) { + cursorPtr->winCursor = LoadCursor(NULL, namePtr->id); + break; + } + } + + if (cursorPtr->winCursor == NULL) { + /* + * Hmm, it is not in the system cursor set. Check to see + * if it is one of our application resources. + */ + cursorPtr->winCursor = LoadCursor(Tk_GetHINSTANCE(), argv[0]); + } else { + cursorPtr->system = 1; + } } + if (cursorPtr->winCursor == NULL) { - badCursorSpec: - ckfree((char *)cursorPtr); + ckfree((char *) cursorPtr); + badCursorSpec: + ckfree((char *) argv); Tcl_AppendResult(interp, "bad cursor spec \"", string, "\"", (char *) NULL); return NULL; } else { + ckfree((char *) argv); return (TkCursor *) cursorPtr; } } |