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

通讯编程

开发平台:

Visual C++

  1. /* 
  2.  * tkMacInit.c --
  3.  *
  4.  * This file contains Mac-specific interpreter initialization
  5.  * functions.
  6.  *
  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: tkMacInit.c,v 1.10 2002/05/20 12:30:16 das Exp $
  13.  */
  14. #include <Resources.h>
  15. #include <Files.h>
  16. #include <TextUtils.h>
  17. #include <Strings.h>
  18. #include "tkInt.h"
  19. #include "tkMacInt.h"
  20. #include "tclMacInt.h"
  21. /*
  22.  * The following global is used by various parts of Tk to access
  23.  * information in the global qd variable.  It is provided as a pointer
  24.  * in the AppInit because we don't assume that Tk is running as an
  25.  * application.  For example, Tk could be a plugin and may not have
  26.  * access to the qd variable.  This mechanism provides a way for the
  27.  * container application to give a pointer to the qd variable.
  28.  */
  29. QDGlobalsPtr tcl_macQdPtr = NULL;
  30. /*
  31.  *----------------------------------------------------------------------
  32.  *
  33.  * TkpInit --
  34.  *
  35.  * Performs Mac-specific interpreter initialization related to the
  36.  *      tk_library variable.
  37.  *
  38.  * Results:
  39.  * A standard Tcl completion code (TCL_OK or TCL_ERROR).  Also
  40.  * leaves information in the interp's result.
  41.  *
  42.  * Side effects:
  43.  * Sets "tk_library" Tcl variable, runs initialization scripts
  44.  * for Tk.
  45.  *
  46.  *----------------------------------------------------------------------
  47.  */
  48. int
  49. TkpInit(
  50.     Tcl_Interp *interp) /* Interp to initialize. */
  51. {
  52.     CONST char *libDir, *tempPath;
  53.     Tcl_DString path, ds;
  54.     int result;
  55.     static char initCmd[] = "if {[info proc tkInit]==""} {n
  56. proc tkInit {} {n
  57. proc sourcePath {file} {n
  58.   global tk_libraryn
  59.   if {[catch {uplevel #0 [list source [file join $tk_library $file.tcl]]}] == 0} {n
  60.     returnn
  61.   }n
  62.   if {[catch {uplevel #0 [list source -rsrc $file]}] == 0} {n
  63.     returnn
  64.   }n
  65.   rename sourcePath {}n
  66.   set msg "Can't find $file resource or a usable $file.tcl file"n
  67.   append msg " perhaps you need to install Tk or set your"n
  68.   append msg " TK_LIBRARY environment variable?"n
  69.   error $msgn
  70. }n
  71. sourcePath tkn
  72. sourcePath dialogn
  73. sourcePath focusn
  74. sourcePath optMenun
  75. sourcePath paletten
  76. sourcePath tearoffn
  77. if {[catch {package require msgcat}]} {sourcePath msgcat}n
  78. sourcePath bgerrorn
  79. sourcePath msgboxn
  80. sourcePath comdlgn
  81. rename sourcePath {}n
  82. rename tkInit {}n
  83. } }n
  84. tkInit";
  85.     Tcl_DStringInit(&path);
  86.     Tcl_DStringInit(&ds);
  87.     /*
  88.      * The tk_library path can be found in several places.  Here is the order
  89.      * in which the are searched.
  90.      * 1) the variable may already exist
  91.      * 2) env array
  92.      * 3) System Folder:Extensions:Tool Command Language:
  93.      */
  94.      
  95.     libDir = Tcl_GetVar(interp, "tk_library", TCL_GLOBAL_ONLY);
  96.     if (libDir == NULL) {
  97.     libDir = TclGetEnv("TK_LIBRARY", &ds);
  98.     }
  99.     if ((libDir == NULL) || (libDir[0] == '')) {
  100.     tempPath = TclGetEnv("EXT_FOLDER", &ds);
  101.     if ((tempPath != NULL) && (tempPath[0] != '')) {
  102.     Tcl_DString libPath;
  103.     CONST char *argv[3];
  104.     
  105.     argv[0] = tempPath;
  106.     argv[1] = "Tool Command Language";     
  107.     Tcl_DStringInit(&libPath);
  108.     Tcl_DStringAppend(&libPath, "tk", -1);
  109.     argv[2] = Tcl_DStringAppend(&libPath, TK_VERSION, -1);
  110.     libDir = Tcl_JoinPath(3, argv, &path);
  111.     Tcl_DStringFree(&libPath);
  112. }
  113.     }
  114.     if (libDir == NULL) {
  115. libDir = "no library";
  116.     }
  117.     /*
  118.      * Assign path to the global Tcl variable tcl_library.
  119.      */
  120.     Tcl_SetVar(interp, "tk_library", libDir, TCL_GLOBAL_ONLY);
  121.     Tcl_DStringFree(&path);
  122.     Tcl_DStringFree(&ds);
  123. result = Tcl_Eval(interp, initCmd);
  124.     return result;
  125. }
  126. /*
  127.  *----------------------------------------------------------------------
  128.  *
  129.  * TkpGetAppName --
  130.  *
  131.  * Retrieves the name of the current application from a platform
  132.  * specific location.  On the Macintosh we look to see if the
  133.  * App Name is specified in a resource.  If not, the application 
  134.  * name is the root of the tail of the path contained in the tcl
  135.  * variable argv0.
  136.  *
  137.  * Results:
  138.  * Returns the application name in the given Tcl_DString.
  139.  *
  140.  * Side effects:
  141.  * None.
  142.  *
  143.  *----------------------------------------------------------------------
  144.  */
  145. void
  146. TkpGetAppName(
  147.     Tcl_Interp *interp, /* The main interpreter. */
  148.     Tcl_DString *namePtr) /* A previously initialized Tcl_DString. */
  149. {
  150.     int argc;
  151.     CONST char **argv = NULL, *name, *p;
  152.     int nameLength = -1;
  153.     Handle h = NULL;
  154.     h = GetNamedResource('STR ', "pTk App Name");
  155.     if (h != NULL) {
  156. HLock(h);
  157. Tcl_DStringAppend(namePtr, (*h)+1, **h);
  158. HUnlock(h);
  159. ReleaseResource(h);
  160. return;
  161.     }
  162.     
  163.     name = Tcl_GetVar(interp, "argv0", TCL_GLOBAL_ONLY);
  164.     if (name != NULL) {
  165. Tcl_SplitPath(name, &argc, &argv);
  166. if (argc > 0) {
  167.     name = argv[argc-1];
  168.     p = strrchr(name, '.');
  169.     if (p != NULL) {
  170. nameLength = p - name;
  171.     }
  172. } else {
  173.     name = NULL;
  174. }
  175.     }
  176.     if ((name == NULL) || (*name == 0) || (nameLength == 0)) {
  177. name = "tk";
  178. nameLength = -1;
  179.     }
  180.     Tcl_DStringAppend(namePtr, name, nameLength);
  181.     if (argv != NULL) {
  182. ckfree((char *)argv);
  183.     }
  184. }
  185. /*
  186.  *----------------------------------------------------------------------
  187.  *
  188.  * TkpDisplayWarning --
  189.  *
  190.  * This routines is called from Tk_Main to display warning
  191.  * messages that occur during startup.
  192.  *
  193.  * Results:
  194.  * None.
  195.  *
  196.  * Side effects:
  197.  * Displays a message box.
  198.  *
  199.  *----------------------------------------------------------------------
  200.  */
  201. void
  202. TkpDisplayWarning(
  203.     CONST char *msg, /* Message to be displayed. */
  204.     CONST char *title) /* Title of warning. */
  205. {
  206.     Tcl_DString ds;
  207.     Tcl_DStringInit(&ds);
  208.     Tcl_DStringAppend(&ds, title, -1);
  209.     Tcl_DStringAppend(&ds, ": ", -1);
  210.     Tcl_DStringAppend(&ds, msg, -1);
  211.     panic(Tcl_DStringValue(&ds));
  212.     Tcl_DStringFree(&ds);
  213. }