summaryrefslogtreecommitdiffstats
path: root/macosx/tkMacOSXCursor.c
diff options
context:
space:
mode:
Diffstat (limited to 'macosx/tkMacOSXCursor.c')
-rw-r--r--macosx/tkMacOSXCursor.c104
1 files changed, 76 insertions, 28 deletions
diff --git a/macosx/tkMacOSXCursor.c b/macosx/tkMacOSXCursor.c
index 681e895..8e72897 100644
--- a/macosx/tkMacOSXCursor.c
+++ b/macosx/tkMacOSXCursor.c
@@ -9,7 +9,7 @@
* See the file "license.terms" for information on usage and redistribution
* of this file, and for a DISCLAIMER OF ALL WARRANTIES.
*
- * RCS: @(#) $Id: tkMacOSXCursor.c,v 1.3 2003/02/10 22:03:23 wolfsuit Exp $
+ * RCS: @(#) $Id: tkMacOSXCursor.c,v 1.4 2003/02/11 07:26:18 wolfsuit Exp $
*/
#include "tkPort.h"
@@ -23,9 +23,11 @@
* The default theme cursors (listed in cursorNames below),
* color resource cursors, & normal cursors.
*/
-
-#define COLOR 1 /* Cursors of type crsr. */
-#define NORMAL 2 /* Cursors of type CURS. */
+
+#define THEME 0 /* Theme cursors */
+#define ANIMATED 1 /* Animated theme cursors */
+#define COLOR 2 /* Cursors of type crsr. */
+#define NORMAL 3 /* Cursors of type CURS. */
/*
* The following data structure contains the system specific data
@@ -39,6 +41,8 @@ typedef struct {
int type; /* Type of Mac cursor: for theme cursors
* this is the theme cursor constant,
* otherwise one of crsr or CURS */
+ unsigned int count; /* For animating cursors, the count for the
+ cursor. */
} TkMacOSXCursor;
/*
@@ -46,10 +50,12 @@ typedef struct {
* to its resource identifier.
*/
-static struct CursorName {
+struct CursorName {
char *name;
int id;
-} cursorNames[] = {
+};
+
+static struct CursorName themeCursorNames[] = {
{"ibeam", kThemeIBeamCursor},
{"text", kThemeIBeamCursor},
{"xterm", kThemeIBeamCursor},
@@ -57,11 +63,15 @@ static struct CursorName {
{"crosshair", kThemeCrossCursor},
{"cross-hair", kThemeCrossCursor},
{"plus", kThemePlusCursor},
- {"watch", kThemeWatchCursor},
{"arrow", kThemeArrowCursor},
{"closedhand", kThemeClosedHandCursor},
{"openhand", kThemeOpenHandCursor},
{"pointinghand", kThemePointingHandCursor},
+ {NULL, 0}
+};
+
+static struct CursorName animatedThemeCursorNames[] = {
+ {"watch", kThemeWatchCursor},
{"countinguphand", kThemeCountingUpHandCursor},
{"countingdownhand", kThemeCountingDownHandCursor},
{"countingupanddownhand", kThemeCountingUpAndDownHandCursor},
@@ -175,14 +185,15 @@ FindCursorByName(
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. */
+ 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;
TkMacOSXCursor *macCursorPtr;
-
+ int count = -1;
+
macCursorPtr = (TkMacOSXCursor *) ckalloc(sizeof(TkMacOSXCursor));
macCursorPtr->info.cursor = (Tk_Cursor) macCursorPtr;
@@ -192,17 +203,41 @@ TkGetCursorByName(
* attempt to load the cursor as a named Mac resource.
*/
- for (namePtr = cursorNames; namePtr->name != NULL; namePtr++) {
+ for (namePtr = themeCursorNames; namePtr->name != NULL; namePtr++) {
if (strcmp(namePtr->name, string) == 0) {
+ macCursorPtr->count = -1;
+ macCursorPtr->macCursor = (Handle) namePtr;
+ macCursorPtr->type = THEME;
break;
}
}
+ if (namePtr->name == NULL) {
+ for (namePtr = animatedThemeCursorNames;
+ namePtr->name != NULL; namePtr++) {
+ int namelen = strlen (namePtr->name);
+ if (strncmp(namePtr->name, string, namelen) == 0) {
+ const char *numPtr = string + namelen;
+ if (*numPtr == '\0') {
+ count = -1;
+ } else {
+ int result;
+ result = Tcl_GetInt(NULL, numPtr, &count);
+ if (result != TCL_OK) {
+ continue;
+ }
+ }
+ macCursorPtr->macCursor = (Handle) namePtr;
+ macCursorPtr->type = ANIMATED;
+ macCursorPtr->count = count;
+ break;
+ }
+ }
+ }
+
- if (namePtr->name != NULL) {
- macCursorPtr->macCursor = (Handle) -1;
- macCursorPtr->type = namePtr->id;
- } else {
+
+ if (namePtr->name == NULL) {
FindCursorByName(macCursorPtr, string);
if (macCursorPtr->macCursor == NULL) {
@@ -301,7 +336,6 @@ TkpFreeCursor(
gCurrentCursor = NULL;
}
}
-
/*
*----------------------------------------------------------------------
*
@@ -342,17 +376,22 @@ TkMacOSXInstallCursor(
}
} else if (macCursorPtr == NULL) {
SetThemeCursor(kThemeArrowCursor);
- } else if (macCursorPtr->macCursor == (void *) -1) {
- OSErr err = noErr;
-
- if (macCursorPtr->type >= kThemeWatchCursor) {
- err = SetAnimatedThemeCursor(macCursorPtr->type, cursorStep++);
- }
- if (err != noErr) {
- SetThemeCursor(macCursorPtr->type);
- }
} else {
+ struct CursorName *namePtr;
switch (macCursorPtr->type) {
+ case THEME:
+ namePtr = (struct CursorName *) macCursorPtr->macCursor;
+ SetThemeCursor(
+ namePtr->id);
+ break;
+ case ANIMATED:
+ namePtr = (struct CursorName *) macCursorPtr->macCursor;
+ if (macCursorPtr->count == -1) {
+ SetAnimatedThemeCursor(namePtr->id, cursorStep++);
+ } else {
+ SetAnimatedThemeCursor(namePtr->id, macCursorPtr->count);
+ }
+ break;
case COLOR:
ccursor = (CCrsrHandle) macCursorPtr->macCursor;
SetCCursor(ccursor);
@@ -385,16 +424,25 @@ void
TkpSetCursor(
TkpCursor cursor)
{
+ int cursorChanged = 1;
+
if (!gTkOwnsCursor) {
return;
}
+
if (cursor == None) {
+ if (gCurrentCursor == NULL) {
+ cursorChanged = 0;
+ }
gCurrentCursor = NULL;
} else {
+ if (gCurrentCursor == (TkMacOSXCursor *) cursor) {
+ cursorChanged = 0;
+ }
gCurrentCursor = (TkMacOSXCursor *) cursor;
}
- if (Tk_MacOSXIsAppInFront()) {
+ if (Tk_MacOSXIsAppInFront() && cursorChanged) {
TkMacOSXInstallCursor(gResizeOverride);
}
}