diff options
author | William Joye <wjoye@cfa.harvard.edu> | 2019-07-31 17:58:33 (GMT) |
---|---|---|
committer | William Joye <wjoye@cfa.harvard.edu> | 2019-07-31 17:58:33 (GMT) |
commit | 31ea2092cd64f21068bdca467639237ca3cab2bd (patch) | |
tree | 8330b605eef4885855552ad7d301fb1c447796cd /tk8.6/win/tkWinCursor.c | |
parent | de0c57b4383a4d7ced5058c2c50580a0f4ba5477 (diff) | |
download | blt-31ea2092cd64f21068bdca467639237ca3cab2bd.zip blt-31ea2092cd64f21068bdca467639237ca3cab2bd.tar.gz blt-31ea2092cd64f21068bdca467639237ca3cab2bd.tar.bz2 |
upgrade tcl/tk 8.6.10
Diffstat (limited to 'tk8.6/win/tkWinCursor.c')
-rw-r--r-- | tk8.6/win/tkWinCursor.c | 272 |
1 files changed, 272 insertions, 0 deletions
diff --git a/tk8.6/win/tkWinCursor.c b/tk8.6/win/tkWinCursor.c new file mode 100644 index 0000000..622ba4d --- /dev/null +++ b/tk8.6/win/tkWinCursor.c @@ -0,0 +1,272 @@ +/* + * tkWinCursor.c -- + * + * This file contains Win32 specific cursor related routines. + * + * Copyright (c) 1995 Sun Microsystems, Inc. + * + * See the file "license.terms" for information on usage and redistribution of + * this file, and for a DISCLAIMER OF ALL WARRANTIES. + */ + +#include "tkWinInt.h" + +/* + * The following data structure contains the system specific data necessary to + * control Windows cursors. + */ + +typedef struct { + TkCursor info; /* Generic cursor info used by tkCursor.c */ + HCURSOR winCursor; /* Win32 cursor handle. */ + int system; /* 1 if cursor is a system cursor, else 0. */ +} TkWinCursor; + +/* + * The HAND cursor is only present when WINVER >= 0x0500. If this is not + * available at runtime, it will default to the unix-style cursor. + */ + +#ifndef IDC_HAND +#define IDC_HAND MAKEINTRESOURCE(32649) +#endif +#ifndef IDC_HELP +#define IDC_HELP MAKEINTRESOURCE(32651) +#endif + +/* + * The table below is used to map from the name of a predefined cursor to its + * resource identifier. + */ + +static struct CursorName { + const char *name; + LPCTSTR id; +} cursorNames[] = { + {"starting", IDC_APPSTARTING}, + {"arrow", IDC_ARROW}, + {"ibeam", IDC_IBEAM}, + {"icon", IDC_ICON}, + {"no", IDC_NO}, + {"size", IDC_SIZEALL}, + {"size_ne_sw", IDC_SIZENESW}, + {"size_ns", IDC_SIZENS}, + {"size_nw_se", IDC_SIZENWSE}, + {"size_we", IDC_SIZEWE}, + {"uparrow", IDC_UPARROW}, + {"wait", IDC_WAIT}, + {"crosshair", IDC_CROSS}, + {"fleur", IDC_SIZEALL}, + {"sb_v_double_arrow", IDC_SIZENS}, + {"sb_h_double_arrow", IDC_SIZEWE}, + {"center_ptr", IDC_UPARROW}, + {"watch", IDC_WAIT}, + {"xterm", IDC_IBEAM}, + {"hand2", IDC_HAND}, + {"question_arrow", IDC_HELP}, + {NULL, 0} +}; + +/* + * The default cursor is used whenever no other cursor has been specified. + */ + +#define TK_DEFAULT_CURSOR IDC_ARROW + +/* + *---------------------------------------------------------------------- + * + * TkGetCursorByName -- + * + * Retrieve a system cursor by name. + * + * Results: + * Returns a new cursor, or NULL on errors. + * + * Side effects: + * Allocates a new cursor. + * + *---------------------------------------------------------------------- + */ + +TkCursor * +TkGetCursorByName( + Tcl_Interp *interp, /* Interpreter to use for error reporting. */ + Tk_Window tkwin, /* Window in which cursor will be used. */ + Tk_Uid string) /* Description of cursor. See manual entry for + * details on legal syntax. */ +{ + struct CursorName *namePtr; + TkWinCursor *cursorPtr; + int argc; + const char **argv = NULL; + + /* + * All cursor names are valid lists of one element (for + * Unix-compatability), even unadorned system cursor names. + */ + + if (Tcl_SplitList(interp, string, &argc, &argv) != TCL_OK) { + return NULL; + } + if (argc == 0) { + goto badCursorSpec; + } + + cursorPtr = ckalloc(sizeof(TkWinCursor)); + cursorPtr->info.cursor = (Tk_Cursor) cursorPtr; + cursorPtr->winCursor = NULL; + cursorPtr->system = 0; + + if (argv[0][0] == '@') { + /* + * Check for system cursor of type @<filename>, where only 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 (Tcl_IsSafe(interp)) { + Tcl_SetObjResult(interp, Tcl_NewStringObj( + "can't get cursor from a file in a safe interpreter",-1)); + Tcl_SetErrorCode(interp, "TK", "SAFE", "CURSOR_FILE", NULL); + ckfree(argv); + ckfree(cursorPtr); + return NULL; + } + cursorPtr->winCursor = LoadCursorFromFileA(&(argv[0][1])); + } 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 = LoadCursorA(Tk_GetHINSTANCE(), argv[0]); + } else { + cursorPtr->system = 1; + } + } + + if (cursorPtr->winCursor == NULL) { + ckfree(cursorPtr); + badCursorSpec: + ckfree(argv); + Tcl_SetObjResult(interp, Tcl_ObjPrintf( + "bad cursor spec \"%s\"", string)); + Tcl_SetErrorCode(interp, "TK", "VALUE", "CURSOR", NULL); + return NULL; + } + ckfree(argv); + return (TkCursor *) cursorPtr; +} + +/* + *---------------------------------------------------------------------- + * + * TkCreateCursorFromData -- + * + * Creates a cursor from the source and mask bits. + * + * Results: + * Returns a new cursor, or NULL on errors. + * + * Side effects: + * Allocates a new cursor. + * + *---------------------------------------------------------------------- + */ + +TkCursor * +TkCreateCursorFromData( + Tk_Window tkwin, /* Window in which cursor will be used. */ + const char *source, /* Bitmap data for cursor shape. */ + const char *mask, /* Bitmap data for cursor mask. */ + int width, int height, /* Dimensions of cursor. */ + int xHot, int yHot, /* Location of hot-spot in cursor. */ + XColor fgColor, /* Foreground color for cursor. */ + XColor bgColor) /* Background color for cursor. */ +{ + return NULL; +} + +/* + *---------------------------------------------------------------------- + * + * TkpFreeCursor -- + * + * This procedure is called to release a cursor allocated by + * TkGetCursorByName. + * + * Results: + * None. + * + * Side effects: + * The cursor data structure is deallocated. + * + *---------------------------------------------------------------------- + */ + +void +TkpFreeCursor( + TkCursor *cursorPtr) +{ + /* TkWinCursor *winCursorPtr = (TkWinCursor *) cursorPtr; */ +} + +/* + *---------------------------------------------------------------------- + * + * TkpSetCursor -- + * + * Set the global cursor. If the cursor is None, then use the default Tk + * cursor. + * + * Results: + * None. + * + * Side effects: + * Changes the mouse cursor. + * + *---------------------------------------------------------------------- + */ + +void +TkpSetCursor( + TkpCursor cursor) +{ + HCURSOR hcursor; + TkWinCursor *winCursor = (TkWinCursor *) cursor; + + if (winCursor == NULL || winCursor->winCursor == NULL) { + hcursor = LoadCursor(NULL, TK_DEFAULT_CURSOR); + } else { + hcursor = winCursor->winCursor; + } + + if (hcursor != NULL) { + SetCursor(hcursor); + } +} + +/* + * Local Variables: + * mode: c + * c-basic-offset: 4 + * fill-column: 78 + * End: + */ |