summaryrefslogtreecommitdiffstats
path: root/mac/tkMacInit.c
diff options
context:
space:
mode:
Diffstat (limited to 'mac/tkMacInit.c')
-rw-r--r--mac/tkMacInit.c240
1 files changed, 240 insertions, 0 deletions
diff --git a/mac/tkMacInit.c b/mac/tkMacInit.c
new file mode 100644
index 0000000..bb1f8b3
--- /dev/null
+++ b/mac/tkMacInit.c
@@ -0,0 +1,240 @@
+/*
+ * tkMacInit.c --
+ *
+ * This file contains Mac-specific interpreter initialization
+ * functions.
+ *
+ * Copyright (c) 1995-1996 Sun Microsystems, Inc.
+ *
+ * See the file "license.terms" for information on usage and redistribution
+ * of this file, and for a DISCLAIMER OF ALL WARRANTIES.
+ *
+ * SCCS: @(#) tkMacInit.c 1.30 96/12/17 15:20:16
+ */
+
+#include <Resources.h>
+#include <Files.h>
+#include <TextUtils.h>
+#include <Strings.h>
+#include "tkInt.h"
+#include "tkMacInt.h"
+#include "tclMacInt.h"
+
+/*
+ * The following global is used by various parts of Tk to access
+ * information in the global qd variable. It is provided as a pointer
+ * in the AppInit because we don't assume that Tk is running as an
+ * application. For example, Tk could be a plugin and may not have
+ * access to the qd variable. This mechanism provides a way for the
+ * container application to give a pointer to the qd variable.
+ */
+
+QDGlobalsPtr tcl_macQdPtr = NULL;
+
+/*
+ *----------------------------------------------------------------------
+ *
+ * TkpInit --
+ *
+ * Performs Mac-specific interpreter initialization related to the
+ * tk_library variable.
+ *
+ * Results:
+ * A standard Tcl completion code (TCL_OK or TCL_ERROR). Also
+ * leaves information in interp->result.
+ *
+ * Side effects:
+ * Sets "tk_library" Tcl variable, runs initialization scripts
+ * for Tk.
+ *
+ *----------------------------------------------------------------------
+ */
+
+int
+TkpInit(
+ Tcl_Interp *interp) /* Interp to initialize. */
+{
+ char *libDir, *tempPath;
+ Tcl_DString path;
+ int result;
+
+ /*
+ * The following does not work with
+ * safe interps because file exists is restricted.
+ * to be fixed using [interp issafe] like in Unix & Windows.
+ */
+ static char initCmd[] =
+ "if [file exists $tk_library:tk.tcl] {\n\
+ source $tk_library:tk.tcl\n\
+ source $tk_library:button.tcl\n\
+ source $tk_library:entry.tcl\n\
+ source $tk_library:listbox.tcl\n\
+ source $tk_library:menu.tcl\n\
+ source $tk_library:scale.tcl\n\
+ source $tk_library:scrlbar.tcl\n\
+ source $tk_library:text.tcl\n\
+ source $tk_library:comdlg.tcl\n\
+ source $tk_library:msgbox.tcl\n\
+ } else {\n\
+ set msg \"can't find tk resource or $tk_library:tk.tcl;\"\n\
+ append msg \" perhaps you need to\\ninstall Tk or set your \"\n\
+ append msg \"TK_LIBRARY environment variable?\"\n\
+ error $msg\n\
+ }";
+
+ Tcl_DStringInit(&path);
+
+ /*
+ * The tk_library path can be found in several places. Here is the order
+ * in which the are searched.
+ * 1) the variable may already exist
+ * 2) env array
+ * 3) System Folder:Extensions:Tool Command Language:
+ */
+
+ libDir = Tcl_GetVar(interp, "tk_library", TCL_GLOBAL_ONLY);
+ if (libDir == NULL) {
+ libDir = Tcl_GetVar2(interp, "env", "TK_LIBRARY", TCL_GLOBAL_ONLY);
+ }
+ if (libDir == NULL) {
+ tempPath = Tcl_GetVar2(interp, "env", "EXT_FOLDER", TCL_GLOBAL_ONLY);
+ if (tempPath != NULL) {
+ Tcl_DString libPath;
+
+ Tcl_JoinPath(1, &tempPath, &path);
+
+ Tcl_DStringInit(&libPath);
+ Tcl_DStringAppend(&libPath, ":Tool Command Language:tk", -1);
+ Tcl_DStringAppend(&libPath, TK_VERSION, -1);
+ Tcl_JoinPath(1, &libPath.string, &path);
+ Tcl_DStringFree(&libPath);
+ libDir = path.string;
+ }
+ }
+ if (libDir == NULL) {
+ libDir = "no library";
+ }
+
+ /*
+ * Assign path to the global Tcl variable tcl_library.
+ */
+ Tcl_SetVar(interp, "tk_library", libDir, TCL_GLOBAL_ONLY);
+ Tcl_DStringFree(&path);
+
+ /*
+ * Source the needed Tk libraries from the resource
+ * fork of the application.
+ */
+ result = Tcl_MacEvalResource(interp, "tk", 0, NULL);
+ result |= Tcl_MacEvalResource(interp, "button", 0, NULL);
+ result |= Tcl_MacEvalResource(interp, "entry", 0, NULL);
+ result |= Tcl_MacEvalResource(interp, "listbox", 0, NULL);
+ result |= Tcl_MacEvalResource(interp, "menu", 0, NULL);
+ result |= Tcl_MacEvalResource(interp, "scale", 0, NULL);
+ result |= Tcl_MacEvalResource(interp, "scrollbar", 0, NULL);
+ result |= Tcl_MacEvalResource(interp, "text", 0, NULL);
+ result |= Tcl_MacEvalResource(interp, "dialog", 0, NULL);
+ result |= Tcl_MacEvalResource(interp, "focus", 0, NULL);
+ result |= Tcl_MacEvalResource(interp, "optionMenu", 0, NULL);
+ result |= Tcl_MacEvalResource(interp, "palette", 0, NULL);
+ result |= Tcl_MacEvalResource(interp, "tearoff", 0, NULL);
+ result |= Tcl_MacEvalResource(interp, "tkerror", 0, NULL);
+ result |= Tcl_MacEvalResource(interp, "comdlg", 0, NULL);
+ result |= Tcl_MacEvalResource(interp, "msgbox", 0, NULL);
+
+ if (result != TCL_OK) {
+ result = Tcl_Eval(interp, initCmd);
+ }
+ return result;
+}
+
+/*
+ *----------------------------------------------------------------------
+ *
+ * TkpGetAppName --
+ *
+ * Retrieves the name of the current application from a platform
+ * specific location. On the Macintosh we look to see if the
+ * App Name is specified in a resource. If not, the application
+ * name is the root of the tail of the path contained in the tcl
+ * variable argv0.
+ *
+ * Results:
+ * Returns the application name in the given Tcl_DString.
+ *
+ * Side effects:
+ * None.
+ *
+ *----------------------------------------------------------------------
+ */
+
+void
+TkpGetAppName(
+ Tcl_Interp *interp, /* The main interpreter. */
+ Tcl_DString *namePtr) /* A previously initialized Tcl_DString. */
+{
+ int argc;
+ char **argv = NULL, *name, *p;
+ Handle h = NULL;
+
+ h = GetNamedResource('STR ', "\pTk App Name");
+ if (h != NULL) {
+ HLock(h);
+ Tcl_DStringAppend(namePtr, (*h)+1, **h);
+ HUnlock(h);
+ ReleaseResource(h);
+ return;
+ }
+
+ name = Tcl_GetVar(interp, "argv0", TCL_GLOBAL_ONLY);
+ if (name != NULL) {
+ Tcl_SplitPath(name, &argc, &argv);
+ if (argc > 0) {
+ name = argv[argc-1];
+ p = strrchr(name, '.');
+ if (p != NULL) {
+ *p = '\0';
+ }
+ } else {
+ name = NULL;
+ }
+ }
+ if ((name == NULL) || (*name == 0)) {
+ name = "tk";
+ }
+ Tcl_DStringAppend(namePtr, name, -1);
+ if (argv != NULL) {
+ ckfree((char *)argv);
+ }
+}
+
+/*
+ *----------------------------------------------------------------------
+ *
+ * TkpDisplayWarning --
+ *
+ * This routines is called from Tk_Main to display warning
+ * messages that occur during startup.
+ *
+ * Results:
+ * None.
+ *
+ * Side effects:
+ * Displays a message box.
+ *
+ *----------------------------------------------------------------------
+ */
+
+void
+TkpDisplayWarning(
+ char *msg, /* Message to be displayed. */
+ char *title) /* Title of warning. */
+{
+ Tcl_DString ds;
+ Tcl_DStringInit(&ds);
+ Tcl_DStringAppend(&ds, title, -1);
+ Tcl_DStringAppend(&ds, ": ", -1);
+ Tcl_DStringAppend(&ds, msg, -1);
+ panic(Tcl_DStringValue(&ds));
+ Tcl_DStringFree(&ds);
+}