summaryrefslogtreecommitdiffstats
path: root/tk8.6/win/tkWinCursor.c
diff options
context:
space:
mode:
authorWilliam Joye <wjoye@cfa.harvard.edu>2019-07-31 17:58:33 (GMT)
committerWilliam Joye <wjoye@cfa.harvard.edu>2019-07-31 17:58:33 (GMT)
commit31ea2092cd64f21068bdca467639237ca3cab2bd (patch)
tree8330b605eef4885855552ad7d301fb1c447796cd /tk8.6/win/tkWinCursor.c
parentde0c57b4383a4d7ced5058c2c50580a0f4ba5477 (diff)
downloadblt-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.c272
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:
+ */