#ifndef lint
static char sccsid[] = "@(#) tkAppInit.c 1.19 95/12/23 17:09:24";
#endif
#include <ctype.h>
#include "tk.h"
#include "expect_tcl.h"
#include "Dbg.h"
extern int matherr();
int *tclDummyMathPtr = (int *) matherr;
#ifdef TK_TEST
EXTERN int Tktest_Init _ANSI_ARGS_((Tcl_Interp *interp));
#endif
int
main(argc, argv)
int argc;
char **argv;
{
Tk_Main(argc, argv, Tcl_AppInit);
return 0;
}
int
Tcl_AppInit(interp)
Tcl_Interp *interp;
{
if (Tcl_Init(interp) == TCL_ERROR) {
return TCL_ERROR;
}
if (Expect_Init(interp) == TCL_ERROR) {
return TCL_ERROR;
}
Tcl_StaticPackage(interp, "Expect", Expect_Init, (Tcl_PackageInitProc *)NULL);
if (Tk_Init2(interp) == TCL_ERROR) {
return TCL_ERROR;
}
Tcl_StaticPackage(interp, "Tk", Tk_Init, (Tcl_PackageInitProc *) NULL);
Tcl_SetVar(interp, "tcl_rcFileName", "~/.wishrc", TCL_GLOBAL_ONLY);
return TCL_OK;
}
static int numMainWindows;
static int synchronize;
static char *name;
static char *display;
static char *geometry;
static char *colormap;
static char *visual;
static int rest = 0;
int my_rc = 1;
int sys_rc = 1;
int optcmd_eval();
#ifdef TCL_DEBUGGER
int optcmd_debug();
#endif
int print_version = 0;
static Tk_ArgvInfo argTable[] = {
{"-colormap", TK_ARGV_STRING, (char *) NULL, (char *) &colormap,
"Colormap for main window"},
{"-display", TK_ARGV_STRING, (char *) NULL, (char *) &display,
"Display to use"},
{"-geometry", TK_ARGV_STRING, (char *) NULL, (char *) &geometry,
"Initial geometry for window"},
{"-name", TK_ARGV_STRING, (char *) NULL, (char *) &name,
"Name to use for application"},
{"-sync", TK_ARGV_CONSTANT, (char *) 1, (char *) &synchronize,
"Use synchronous mode for display server"},
{"-visual", TK_ARGV_STRING, (char *) NULL, (char *) &visual,
"Visual for main window"},
{"--", TK_ARGV_REST, (char *) 1, (char *) &rest,
"Pass all remaining arguments through to script"},
{"-command", TK_ARGV_GENFUNC, (char *) optcmd_eval, (char *)0,
"Command(s) to execute immediately"},
{"-diag", TK_ARGV_CONSTANT, (char *) 1, (char *) &exp_is_debugging,
"Enable diagnostics"},
{"-norc", TK_ARGV_CONSTANT, (char *) 0, (char *) &my_rc,
"Don't read ~/.expect.rc"},
{"-NORC", TK_ARGV_CONSTANT, (char *) 0, (char *) &sys_rc,
"Don't read system-wide expect.rc"},
{"-version", TK_ARGV_CONSTANT, (char *) 1, (char *) &print_version,
"Print version and exit"},
#if TCL_DEBUGGER
{"-Debug", TK_ARGV_GENFUNC, (char *) optcmd_debug, (char *)0,
"Enable debugger"},
#endif
{(char *) NULL, TK_ARGV_END, (char *) NULL, (char *) NULL,
(char *) NULL}
};
int
Tk_Init2(interp)
Tcl_Interp *interp;
{
char *p;
int argc, code;
char **argv, *args[20];
Tcl_DString class;
char buffer[30];
synchronize = 0;
name = display = geometry = colormap = visual = NULL;
p = Tcl_GetVar2(interp, "argv", (char *) NULL, TCL_GLOBAL_ONLY);
argv = NULL;
if (p != NULL) {
if (Tcl_SplitList(interp, p, &argc, &argv) != TCL_OK) {
argError:
Tcl_AddErrorInfo(interp,
"\n (processing arguments in argv variable)");
return TCL_ERROR;
}
if (Tk_ParseArgv(interp, (Tk_Window) NULL, &argc, argv,
argTable, TK_ARGV_DONT_SKIP_FIRST_ARG|TK_ARGV_NO_DEFAULTS)
!= TCL_OK) {
ckfree((char *) argv);
goto argError;
}
if (print_version) {
extern char exp_version[];
printf ("expectk version %s\n", exp_version);
exp_exit (interp, 0);
}
p = Tcl_Merge(argc, argv);
Tcl_SetVar2(interp, "argv", (char *) NULL, p, TCL_GLOBAL_ONLY);
sprintf(buffer, "%d", argc);
Tcl_SetVar2(interp, "argc", (char *) NULL, buffer, TCL_GLOBAL_ONLY);
ckfree(p);
}
if (name == NULL) {
name = Tcl_GetVar(interp, "argv0", TCL_GLOBAL_ONLY);
if ((name == NULL) || (*name == 0)) {
name = "tk";
} else {
p = (char *)strrchr(name, '/');
if (p != NULL) {
name = p+1;
}
}
}
Tcl_DStringInit(&class);
Tcl_DStringAppend(&class, name, -1);
p = Tcl_DStringValue(&class);
if (islower(*p)) {
*p = toupper((unsigned char) *p);
}
args[0] = "toplevel";
args[1] = ".";
args[2] = "-class";
args[3] = Tcl_DStringValue(&class);
argc = 4;
if (display != NULL) {
args[argc] = "-screen";
args[argc+1] = display;
argc += 2;
if (numMainWindows == 0) {
Tcl_SetVar2(interp, "env", "DISPLAY", display, TCL_GLOBAL_ONLY);
}
}
if (colormap != NULL) {
args[argc] = "-colormap";
args[argc+1] = colormap;
argc += 2;
}
if (visual != NULL) {
args[argc] = "-visual";
args[argc+1] = visual;
argc += 2;
}
args[argc] = NULL;
code = TkCreateFrame((ClientData) NULL, interp, argc, args, 1, name);
Tcl_DStringFree(&class);
if (code != TCL_OK) {
goto done;
}
Tcl_ResetResult(interp);
if (synchronize) {
XSynchronize(Tk_Display(Tk_MainWindow(interp)), True);
}
if (geometry != NULL) {
Tcl_SetVar(interp, "geometry", geometry, TCL_GLOBAL_ONLY);
code = Tcl_VarEval(interp, "wm geometry . ", geometry, (char *) NULL);
if (code != TCL_OK) {
goto done;
}
}
if (Tcl_PkgRequire(interp, "Tcl", TCL_VERSION, 1) == NULL) {
code = TCL_ERROR;
goto done;
}
code = Tcl_PkgProvide(interp, "Tk", TK_VERSION);
if (code != TCL_OK) {
goto done;
}
#if TCL_MAJOR_VERSION < 8
code = TkPlatformInit(interp);
#else
code = TkpInit(interp, 0);
#endif
done:
if (argv != NULL) {
ckfree((char *) argv);
}
return code;
}
int
optcmd_eval(dst,interp,key,argc,argv)
char *dst;
Tcl_Interp *interp;
char *key;
int argc;
char **argv;
{
int i;
int rc;
exp_cmdlinecmds = 1;
rc = Tcl_Eval(interp,argv[0]);
if (rc == TCL_ERROR) return -1;
argc--;
for (i=0;i<argc;i++) {
argv[i] = argv[i+1];
}
return argc;
}
#ifdef TCL_DEBUGGER
int
optcmd_debug(dst,interp,key,argc,argv)
char *dst;
Tcl_Interp *interp;
char *key;
int argc;
char **argv;
{
int i;
if (argc == 0) {
strcpy(interp->result,"-Debug flag needs 1 or 0 argument");
return -1;
}
if (Tcl_GetInt(interp,argv[0],&i) != TCL_OK) {
return -1;
}
if (i) {
Dbg_On(interp,0);
}
argc--;
for (i=0;i<argc;i++) {
argv[i] = argv[i+1];
}
return argc;
}
#endif