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

通讯编程

开发平台:

Visual C++

  1. /* 
  2.  * tkMacAppInit.c --
  3.  *
  4.  * Provides a version of the Tcl_AppInit procedure for the example shell.
  5.  *
  6.  * Copyright (c) 1993-1994 Lockheed Missle & Space Company, AI Center
  7.  * Copyright (c) 1995-1997 Sun Microsystems, Inc.
  8.  *
  9.  * See the file "license.terms" for information on usage and redistribution
  10.  * of this file, and for a DISCLAIMER OF ALL WARRANTIES.
  11.  *
  12.  * RCS: @(#) $Id: tkMacAppInit.c,v 1.15 2002/10/18 03:01:33 das Exp $
  13.  */
  14. #include <Gestalt.h>
  15. #include <ToolUtils.h>
  16. #include <Fonts.h>
  17. #include <Dialogs.h>
  18. #include <SegLoad.h>
  19. #include <Traps.h>
  20. #include <Appearance.h>
  21. #include "tk.h"
  22. #include "tkInt.h"
  23. #include "tkMacInt.h"
  24. #include "tclInt.h"
  25. #include "tclMac.h"
  26. #include "tclMacInt.h"
  27. #ifdef TK_TEST
  28. extern int Tktest_Init _ANSI_ARGS_((Tcl_Interp *interp));
  29. #endif /* TK_TEST */
  30. Tcl_Interp *gStdoutInterp = NULL;
  31. int  TkMacConvertEvent _ANSI_ARGS_((EventRecord *eventPtr));
  32. /*
  33.  * Prototypes for functions the ANSI library needs to link against.
  34.  */
  35. short InstallConsole _ANSI_ARGS_((short fd));
  36. void RemoveConsole _ANSI_ARGS_((void));
  37. long WriteCharsToConsole _ANSI_ARGS_((char *buff, long n));
  38. long ReadCharsFromConsole _ANSI_ARGS_((char *buff, long n));
  39. extern char * __ttyname _ANSI_ARGS_((long fildes));
  40. int kbhit _ANSI_ARGS_((void));
  41. int getch _ANSI_ARGS_((void));
  42. void clrscr _ANSI_ARGS_((void));
  43. short SIOUXHandleOneEvent _ANSI_ARGS_((EventRecord *event));
  44. /*
  45.  * Forward declarations for procedures defined later in this file:
  46.  */
  47. static int MacintoshInit _ANSI_ARGS_((void));
  48. static int SetupMainInterp _ANSI_ARGS_((Tcl_Interp *interp));
  49. static void SetupSIOUX _ANSI_ARGS_((void));
  50. static int inMacExit = 0;
  51. static pascal void NoMoreOutput() { inMacExit = 1; }
  52. /*
  53.  *----------------------------------------------------------------------
  54.  *
  55.  * main --
  56.  *
  57.  * Main program for Wish.
  58.  *
  59.  * Results:
  60.  * None. This procedure never returns (it exits the process when
  61.  * it's done
  62.  *
  63.  * Side effects:
  64.  * This procedure initializes the wish world and then 
  65.  * calls Tk_Main.
  66.  *
  67.  *----------------------------------------------------------------------
  68.  */
  69. void
  70. main(
  71.     int argc, /* Number of arguments. */
  72.     char **argv) /* Array of argument strings. */
  73. {
  74.     char *newArgv[2];
  75.     if (MacintoshInit()  != TCL_OK) {
  76. Tcl_Exit(1);
  77.     }
  78.     argc = 1;
  79.     newArgv[0] = "Wish";
  80.     newArgv[1] = NULL;
  81.     
  82.     /* Tk_Main is actually #defined to 
  83.      *     Tk_MainEx(argc, argv, Tcl_AppInit, Tcl_CreateInterp())
  84.      * Unfortunately, you also HAVE to call Tcl_FindExecutable
  85.      * BEFORE creating the first interp, or the tcl_library will not
  86.      * get set properly.  So we call it by hand here...
  87.      */
  88.     
  89.     Tcl_FindExecutable(newArgv[0]);
  90.     Tk_Main(argc, newArgv, Tcl_AppInit);
  91. }
  92. /*
  93.  *----------------------------------------------------------------------
  94.  *
  95.  * Tcl_AppInit --
  96.  *
  97.  * This procedure performs application-specific initialization.
  98.  * Most applications, especially those that incorporate additional
  99.  * packages, will have their own version of this procedure.
  100.  *
  101.  * Results:
  102.  * Returns a standard Tcl completion code, and leaves an error
  103.  * message in the interp's result if an error occurs.
  104.  *
  105.  * Side effects:
  106.  * Depends on the startup script.
  107.  *
  108.  *----------------------------------------------------------------------
  109.  */
  110. int
  111. Tcl_AppInit(
  112.     Tcl_Interp *interp) /* Interpreter for application. */
  113. {
  114.     if (Tcl_Init(interp) == TCL_ERROR) {
  115. return TCL_ERROR;
  116.     }
  117.     if (Tk_Init(interp) == TCL_ERROR) {
  118. return TCL_ERROR;
  119.     }
  120.     Tcl_StaticPackage(interp, "Tk", Tk_Init, Tk_SafeInit);
  121.     /*
  122.      * Call the init procedures for included packages.  Each call should
  123.      * look like this:
  124.      *
  125.      * if (Mod_Init(interp) == TCL_ERROR) {
  126.      *     return TCL_ERROR;
  127.      * }
  128.      *
  129.      * where "Mod" is the name of the module.
  130.      */
  131. #ifdef TK_TEST
  132.     if (Tktest_Init(interp) == TCL_ERROR) {
  133. return TCL_ERROR;
  134.     }
  135.     Tcl_StaticPackage(interp, "Tktest", Tktest_Init,
  136.             (Tcl_PackageInitProc *) NULL);
  137. #endif /* TK_TEST */
  138.     /*
  139.      * Call Tcl_CreateCommand for application-specific commands, if
  140.      * they weren't already created by the init procedures called above.
  141.      * Each call would look like this:
  142.      *
  143.      * Tcl_CreateCommand(interp, "tclName", CFuncCmd, NULL, NULL);
  144.      */
  145.     SetupMainInterp(interp);
  146.     /*
  147.      * Specify a user-specific startup script to invoke if the application
  148.      * is run interactively.  On the Mac we can specifiy either a TEXT resource
  149.      * which contains the script or the more UNIX like file location
  150.      * may also used.  (I highly recommend using the resource method.)
  151.      */
  152.     Tcl_SetVar(interp, "tcl_rcRsrcName", "tclshrc", TCL_GLOBAL_ONLY);
  153.     /* Tcl_SetVar(interp, "tcl_rcFileName", "~/.tclshrc", TCL_GLOBAL_ONLY); */
  154.     return TCL_OK;
  155. }
  156. /*
  157.  *----------------------------------------------------------------------
  158.  *
  159.  * MacintoshInit --
  160.  *
  161.  * This procedure calls Mac specific initilization calls.  Most of
  162.  * these calls must be made as soon as possible in the startup
  163.  * process.
  164.  *
  165.  * Results:
  166.  * Returns TCL_OK if everything went fine.  If it didn't the 
  167.  * application should probably fail.
  168.  *
  169.  * Side effects:
  170.  * Inits the application.
  171.  *
  172.  *----------------------------------------------------------------------
  173.  */
  174. static int
  175. MacintoshInit()
  176. {
  177.     int i;
  178.     long result, mask = 0x0700;  /* mask = system 7.x */
  179. #if GENERATING68K && !GENERATINGCFM
  180.     SetApplLimit(GetApplLimit() - (TK_MAC_68K_STACK_GROWTH));
  181. #endif
  182.     MaxApplZone();
  183.     for (i = 0; i < 4; i++) {
  184. (void) MoreMasters();
  185.     }
  186.     /*
  187.      * Tk needs us to set the qd pointer it uses.  This is needed
  188.      * so Tk doesn't have to assume the availablity of the qd global
  189.      * variable.  Which in turn allows Tk to be used in code resources.
  190.      */
  191.     tcl_macQdPtr = &qd;
  192.     /*
  193.      * If appearance is present, then register Tk as an Appearance client
  194.      * This means that the mapping from non-Appearance to Appearance cdefs
  195.      * will be done for Tk regardless of the setting in the Appearance
  196.      * control panel.  
  197.      */
  198.      
  199.      if (TkMacHaveAppearance()) {
  200.          RegisterAppearanceClient();
  201.      }
  202.     InitGraf(&tcl_macQdPtr->thePort);
  203.     InitFonts();
  204.     if (TkMacHaveAppearance() >= 0x110) {
  205.         InitFloatingWindows();
  206.     } else {
  207.     InitWindows();
  208.     }
  209.     InitMenus();
  210.     InitDialogs((long) NULL);
  211.     InitCursor();
  212.     /*
  213.      * Make sure we are running on system 7 or higher
  214.      */
  215.      
  216.     if ((NGetTrapAddress(_Gestalt, ToolTrap) == 
  217.          NGetTrapAddress(_Unimplemented, ToolTrap))
  218.          || (((Gestalt(gestaltSystemVersion, &result) != noErr)
  219.     || (result < mask)))) {
  220. panic("Tcl/Tk requires System 7 or higher.");
  221.     }
  222.     /*
  223.      * Make sure we have color quick draw 
  224.      * (this means we can't run on 68000 macs)
  225.      */
  226.      
  227.     if (((Gestalt(gestaltQuickdrawVersion, &result) != noErr)
  228.     || (result < gestalt32BitQD13))) {
  229. panic("Tk requires Color QuickDraw.");
  230.     }
  231.     
  232.     FlushEvents(everyEvent, 0);
  233.     SetEventMask(everyEvent);
  234.     Tcl_MacSetEventProc(TkMacConvertEvent);
  235.     return TCL_OK;
  236. }
  237. /*
  238.  *----------------------------------------------------------------------
  239.  *
  240.  * SetupMainInterp --
  241.  *
  242.  * This procedure calls initalization routines require a Tcl 
  243.  * interp as an argument.  This call effectively makes the passed
  244.  * iterpreter the "main" interpreter for the application.
  245.  *
  246.  * Results:
  247.  * Returns TCL_OK if everything went fine.  If it didn't the 
  248.  * application should probably fail.
  249.  *
  250.  * Side effects:
  251.  * More initilization.
  252.  *
  253.  *----------------------------------------------------------------------
  254.  */
  255. static int
  256. SetupMainInterp(
  257.     Tcl_Interp *interp)
  258. {
  259.     /*
  260.      * Initialize the console only if we are running as an interactive
  261.      * application.
  262.      */
  263.     TkMacInitAppleEvents(interp);
  264.     TkMacInitMenus(interp);
  265.     if (strcmp(Tcl_GetVar(interp, "tcl_interactive", TCL_GLOBAL_ONLY), "1")
  266.     == 0) {
  267. if (Tk_CreateConsoleWindow(interp) == TCL_ERROR) {
  268.     goto error;
  269. }
  270. SetupSIOUX();
  271. TclMacInstallExitToShellPatch(NoMoreOutput);
  272.     }
  273.     /*
  274.      * Attach the global interpreter to tk's expected global console
  275.      */
  276.     gStdoutInterp = interp;
  277.     return TCL_OK;
  278. error:
  279.     panic(Tcl_GetStringResult(interp));
  280.     return TCL_ERROR;
  281. }
  282. /*
  283.  *----------------------------------------------------------------------
  284.  *
  285.  * InstallConsole, RemoveConsole, etc. --
  286.  *
  287.  * The following functions provide the UI for the console package.
  288.  * Users wishing to replace SIOUX with their own console package 
  289.  * need only provide the four functions below in a library.
  290.  *
  291.  * Results:
  292.  * See SIOUX documentation for details.
  293.  *
  294.  * Side effects:
  295.  * See SIOUX documentation for details.
  296.  *
  297.  *----------------------------------------------------------------------
  298.  */
  299. short 
  300. InstallConsole(short fd)
  301. {
  302. #pragma unused (fd)
  303. return 0;
  304. }
  305. void 
  306. RemoveConsole(void)
  307. {
  308. }
  309. long 
  310. WriteCharsToConsole(char *buffer, long n)
  311. {
  312.     if (!inMacExit) {
  313.      Tcl_DString ds;
  314.      Tcl_ExternalToUtfDString(NULL, buffer, n, &ds);
  315.     TkConsolePrint(gStdoutInterp, TCL_STDOUT, Tcl_DStringValue(&ds), Tcl_DStringLength(&ds));
  316.     Tcl_DStringFree(&ds);
  317.     return n;
  318.     } else {
  319.      return 0;
  320.     }
  321. }
  322. long 
  323. ReadCharsFromConsole(char *buffer, long n)
  324. {
  325.     return 0;
  326. }
  327. extern char *
  328. __ttyname(long fildes)
  329. {
  330.     static char *__devicename = "null device";
  331.     if (fildes >= 0 && fildes <= 2) {
  332. return (__devicename);
  333.     }
  334.     
  335.     return (0L);
  336. }
  337. int kbhit(void)
  338. {
  339.     return 0; 
  340. }
  341. int getch(void)
  342. {
  343.     return 0; 
  344. }
  345. void clrscr(void)
  346. {
  347.     return;
  348. }
  349. short
  350. SIOUXHandleOneEvent(EventRecord *event)
  351. {
  352.     return 0;
  353. }
  354. static void SetupSIOUX(void) {
  355. #ifndef STATIC_BUILD
  356. extern DLLIMPORT void SetupConsolePlugins(void*, void*, void*, void*,
  357. void*, void*, void*, void*);
  358. SetupConsolePlugins( &InstallConsole,
  359. &RemoveConsole,
  360. &WriteCharsToConsole,
  361. &ReadCharsFromConsole,
  362. &__ttyname,
  363. &kbhit,
  364. &getch,
  365. &clrscr);
  366. #endif
  367. }