tkMacCursor.c
上传用户:rrhhcc
上传日期:2015-12-11
资源大小:54129k
文件大小:10k
源码类别:

通讯编程

开发平台:

Visual C++

  1. /* 
  2.  * tkMacCursor.c --
  3.  *
  4.  * This file contains Macintosh specific cursor related routines.
  5.  *
  6.  * Copyright (c) 1995-1997 Sun Microsystems, Inc.
  7.  *
  8.  * See the file "license.terms" for information on usage and redistribution
  9.  * of this file, and for a DISCLAIMER OF ALL WARRANTIES.
  10.  *
  11.  * RCS: @(#) $Id: tkMacCursor.c,v 1.7 2002/08/05 04:30:40 dgp Exp $
  12.  */
  13. #include "tkPort.h"
  14. #include "tkInt.h"
  15. #include "tkMacInt.h"
  16. #include <Resources.h>
  17. #include <ToolUtils.h>
  18. #include <Strings.h>
  19. /*
  20.  * There are three different ways to set the cursor on the Mac.
  21.  */
  22. #define ARROW 0 /* The arrow cursor. */
  23. #define COLOR 1 /* Cursors of type crsr. */
  24. #define NORMAL 2 /* Cursors of type CURS. */
  25. /*
  26.  * The following data structure contains the system specific data
  27.  * necessary to control Windows cursors.
  28.  */
  29. typedef struct {
  30.     TkCursor info; /* Generic cursor info used by tkCursor.c */
  31.     Handle macCursor; /* Resource containing Macintosh cursor. */
  32.     int type; /* Type of Mac cursor: arrow, crsr, CURS */
  33. } TkMacCursor;
  34. /*
  35.  * The table below is used to map from the name of a predefined cursor
  36.  * to its resource identifier.
  37.  */
  38. static struct CursorName {
  39.     char *name;
  40.     int id;
  41. } cursorNames[] = {
  42.     {"ibeam", 1},
  43.     {"text", 1},
  44.     {"xterm", 1},
  45.     {"cross", 2},
  46.     {"crosshair", 2},
  47.     {"cross-hair", 2},
  48.     {"plus", 3},
  49.     {"watch", 4},
  50.     {"arrow", 5},
  51.     {NULL, 0}
  52. };
  53. /*
  54.  * Declarations of static variables used in this file.
  55.  */
  56. static TkMacCursor * gCurrentCursor = NULL;  /* A pointer to the current
  57.       * cursor. */
  58. static int gResizeOverride = false;      /* A boolean indicating whether
  59.       * we should use the resize
  60.       * cursor during installations. */
  61. static int gTkOwnsCursor = true;             /* A boolean indicating whether
  62.                                                 Tk owns the cursor.  If not (for
  63.                                                 instance, in the case where a Tk 
  64.                                                 window is embedded in another app's
  65.                                                 window, and the cursor is out of
  66.                                                 the tk window, we will not attempt
  67.                                                 to adjust the cursor */
  68. /*
  69.  * Declarations of procedures local to this file
  70.  */
  71. static  void FindCursorByName _ANSI_ARGS_ ((TkMacCursor *macCursorPtr,
  72.              CONST char *string));
  73. /*
  74.  *----------------------------------------------------------------------
  75.  *
  76.  * FindCursorByName --
  77.  *
  78.  * Retrieve a system cursor by name, and fill the macCursorPtr
  79.  * structure.  If the cursor cannot be found, the macCursor field
  80.  * will be NULL.  The function first attempts to load a color
  81.  * cursor.  If that fails it will attempt to load a black & white
  82.  * cursor.
  83.  *
  84.  * Results:
  85.  * Fills the macCursorPtr record.  
  86.  *
  87.  * Side effects:
  88.  * None
  89.  *
  90.  *----------------------------------------------------------------------
  91.  */
  92.  
  93. void 
  94. FindCursorByName(
  95.     TkMacCursor *macCursorPtr,
  96.     CONST char *string)
  97. {
  98.     Handle resource;
  99.     Str255 curName;
  100.     int destWrote, inCurLen;
  101.     
  102.     inCurLen = strlen(string);
  103.     if (inCurLen > 255) {
  104.         return;
  105.     }
  106.     /*
  107.      * macRoman is the encoding that the resource fork uses.
  108.      */
  109.     Tcl_UtfToExternal(NULL, Tcl_GetEncoding(NULL, "macRoman"), string,
  110.     inCurLen, 0, NULL, 
  111.     (char *) &curName[1],
  112.     255, NULL, &destWrote, NULL); /* Internalize native */
  113.     curName[0] = destWrote;
  114.     resource = GetNamedResource('crsr', curName);
  115.     if (resource != NULL) {
  116. short id;
  117. Str255 theName;
  118. ResType theType;
  119. HLock(resource);
  120. GetResInfo(resource, &id, &theType, theName);
  121. HUnlock(resource);
  122. macCursorPtr->macCursor = (Handle) GetCCursor(id);
  123. macCursorPtr->type = COLOR;
  124.     }
  125.     if (resource == NULL) {
  126. macCursorPtr->macCursor = GetNamedResource('CURS', curName);
  127. macCursorPtr->type = NORMAL;
  128.     }
  129. }
  130. /*
  131.  *----------------------------------------------------------------------
  132.  *
  133.  * TkGetCursorByName --
  134.  *
  135.  * Retrieve a system cursor by name.  
  136.  *
  137.  * Results:
  138.  * Returns a new cursor, or NULL on errors.  
  139.  *
  140.  * Side effects:
  141.  * Allocates a new cursor.
  142.  *
  143.  *----------------------------------------------------------------------
  144.  */
  145. TkCursor *
  146. TkGetCursorByName(
  147.     Tcl_Interp *interp, /* Interpreter to use for error reporting. */
  148.     Tk_Window tkwin, /* Window in which cursor will be used. */
  149.     Tk_Uid string) /* Description of cursor.  See manual entry
  150.  * for details on legal syntax. */
  151. {
  152.     struct CursorName *namePtr;
  153.     TkMacCursor *macCursorPtr;
  154.     macCursorPtr = (TkMacCursor *) ckalloc(sizeof(TkMacCursor));
  155.     macCursorPtr->info.cursor = (Tk_Cursor) macCursorPtr;
  156.     /*
  157.      * To find a cursor we must first determine if it is one of the
  158.      * builtin cursors or the standard arrow cursor. Otherwise, we
  159.      * attempt to load the cursor as a named Mac resource.
  160.      */
  161.     for (namePtr = cursorNames; namePtr->name != NULL; namePtr++) {
  162. if (strcmp(namePtr->name, string) == 0) {
  163.     break;
  164. }
  165.     }
  166.     if (namePtr->name != NULL) {
  167.      if (namePtr->id == 5) {
  168.     macCursorPtr->macCursor = (Handle) -1;
  169.     macCursorPtr->type = ARROW;
  170.      } else {
  171.     macCursorPtr->macCursor = (Handle) GetCursor(namePtr->id);
  172.     macCursorPtr->type = NORMAL;
  173. }
  174.     } else {
  175.         FindCursorByName(macCursorPtr, string);
  176. if (macCursorPtr->macCursor == NULL) {
  177.     CONST char **argv;
  178.     int argc, err;
  179.     
  180.     /*
  181.      * The user may be trying to specify an XCursor with fore
  182.      * & back colors. We don't want this to be an error, so pick 
  183.      * off the first word, and try again. 
  184.      */
  185.      
  186.             err = Tcl_SplitList(interp, string, &argc, &argv);
  187.     if (err == TCL_OK ) {
  188.         if (argc > 1) {
  189.             FindCursorByName(macCursorPtr, argv[0]);
  190.         }
  191.         ckfree((char *) argv);
  192.     }
  193. }
  194.     }
  195.     if (macCursorPtr->macCursor == NULL) {
  196. ckfree((char *)macCursorPtr);
  197. Tcl_AppendResult(interp, "bad cursor spec "", string, """,
  198. (char *) NULL);
  199. return NULL;
  200.     } else {
  201. return (TkCursor *) macCursorPtr;
  202.     }
  203. }
  204. /*
  205.  *----------------------------------------------------------------------
  206.  *
  207.  * TkCreateCursorFromData --
  208.  *
  209.  * Creates a cursor from the source and mask bits.
  210.  *
  211.  * Results:
  212.  * Returns a new cursor, or NULL on errors.
  213.  *
  214.  * Side effects:
  215.  * Allocates a new cursor.
  216.  *
  217.  *----------------------------------------------------------------------
  218.  */
  219. TkCursor *
  220. TkCreateCursorFromData(
  221.     Tk_Window tkwin, /* Window in which cursor will be used. */
  222.     CONST char *source, /* Bitmap data for cursor shape. */
  223.     CONST char *mask, /* Bitmap data for cursor mask. */
  224.     int width, int height, /* Dimensions of cursor. */
  225.     int xHot, int yHot, /* Location of hot-spot in cursor. */
  226.     XColor fgColor, /* Foreground color for cursor. */
  227.     XColor bgColor) /* Background color for cursor. */
  228. {
  229.     return NULL;
  230. }
  231. /*
  232.  *----------------------------------------------------------------------
  233.  *
  234.  * TkpFreeCursor --
  235.  *
  236.  * This procedure is called to release a cursor allocated by
  237.  * TkGetCursorByName.
  238.  *
  239.  * Results:
  240.  * None.
  241.  *
  242.  * Side effects:
  243.  * The cursor data structure is deallocated.
  244.  *
  245.  *----------------------------------------------------------------------
  246.  */
  247. void
  248. TkpFreeCursor(
  249.     TkCursor *cursorPtr)
  250. {
  251.     TkMacCursor *macCursorPtr = (TkMacCursor *) cursorPtr;
  252.     switch (macCursorPtr->type) {
  253. case COLOR:
  254.     DisposeCCursor((CCrsrHandle) macCursorPtr->macCursor);
  255.     break;
  256. case NORMAL:
  257.     ReleaseResource(macCursorPtr->macCursor);
  258.     break;
  259.     }
  260.     if (macCursorPtr == gCurrentCursor) {
  261. gCurrentCursor = NULL;
  262.     }
  263. }
  264. /*
  265.  *----------------------------------------------------------------------
  266.  *
  267.  * TkMacInstallCursor --
  268.  *
  269.  * Installs either the current cursor as defined by TkpSetCursor
  270.  * or a resize cursor as the cursor the Macintosh should currently
  271.  * display.
  272.  *
  273.  * Results:
  274.  * None.
  275.  *
  276.  * Side effects:
  277.  * Changes the Macintosh mouse cursor.
  278.  *
  279.  *----------------------------------------------------------------------
  280.  */
  281. void
  282. TkMacInstallCursor(
  283.     int resizeOverride)
  284. {
  285.     TkMacCursor *macCursorPtr = gCurrentCursor;
  286.     CCrsrHandle ccursor;
  287.     CursHandle cursor;
  288.     gResizeOverride = resizeOverride;
  289.     
  290.     if (resizeOverride) {
  291. cursor = (CursHandle) GetNamedResource('CURS', "presize");
  292. SetCursor(*cursor);
  293.     } else if (macCursorPtr == NULL || macCursorPtr->type == ARROW) {
  294. SetCursor(&tcl_macQdPtr->arrow);
  295.     } else {
  296. switch (macCursorPtr->type) {
  297.     case COLOR:
  298. ccursor = (CCrsrHandle) macCursorPtr->macCursor;
  299. SetCCursor(ccursor);
  300. break;
  301.     case NORMAL:
  302. cursor = (CursHandle) macCursorPtr->macCursor;
  303. SetCursor(*cursor);
  304. break;
  305. }
  306.     }
  307. }
  308. /*
  309.  *----------------------------------------------------------------------
  310.  *
  311.  * TkpSetCursor --
  312.  *
  313.  * Set the current cursor and install it.
  314.  *
  315.  * Results:
  316.  * None.
  317.  *
  318.  * Side effects:
  319.  * Changes the current cursor.
  320.  *
  321.  *----------------------------------------------------------------------
  322.  */
  323. void
  324. TkpSetCursor(
  325.     TkpCursor cursor)
  326. {
  327.     if (!gTkOwnsCursor) {
  328.         return;
  329.     }
  330.     if (cursor == None) {
  331. gCurrentCursor = NULL;
  332.     } else {
  333. gCurrentCursor = (TkMacCursor *) cursor;
  334.     }
  335.     if (tkMacAppInFront) {
  336. TkMacInstallCursor(gResizeOverride);
  337.     }
  338. }
  339. /*
  340.  *----------------------------------------------------------------------
  341.  *
  342.  * Tk_MacTkOwnsCursor --
  343.  *
  344.  * Sets whether Tk has the right to adjust the cursor.
  345.  *
  346.  * Results:
  347.  * None.
  348.  *
  349.  * Side effects:
  350.  * May keep Tk from changing the cursor.
  351.  *
  352.  *----------------------------------------------------------------------
  353.  */
  354. void
  355. Tk_MacTkOwnsCursor(
  356.     int tkOwnsIt)
  357. {
  358.     gTkOwnsCursor = tkOwnsIt;
  359. }