added visiLibId
[dyninst.git] / visiClients / tableVisi / src / main.C
1 // main.C
2 // Ariel Tamches
3
4 /*
5  * $Log: main.C,v $
6  * Revision 1.7  1995/12/22 22:37:25  tamches
7  * highlight background color is new
8  *
9  * Revision 1.6  1995/12/20 18:37:16  newhall
10  * matherr.h does not need to be included by visis
11  *
12  * Revision 1.5  1995/11/29 00:43:33  tamches
13  * paradyn logo is now hard-coded
14  *
15  * Revision 1.4  1995/11/18 08:34:45  tamches
16  * initial # of sig figs is now 3
17  *
18  * Revision 1.3  1995/11/08 21:53:57  tamches
19  * changed focus color from tomato to maroon3
20  * cleaner initialization since dg2.C now strictly handles just the "Dg" tcl cmd
21  *
22  * Revision 1.2  1995/11/08 21:17:07  naim
23  * Adding matherr exception handler function to avoid error message when
24  * computing the "not a number" (NaN) value - naim
25  *
26  * Revision 1.1  1995/11/04  00:44:36  tamches
27  * First version of new table visi
28  *
29  */
30
31 #include <assert.h>
32 #include <stdlib.h>
33 #include <iostream.h>
34 #include "tclclean.h"
35 #include "tkclean.h"
36 #include "tkTools.h"
37
38 #include "pdLogo.h"
39 #include "paradyn/xbm/logo.xbm"
40
41 #include "visi/h/visualization.h"
42 #include "dg2.h"
43
44 #include "tableVisi.h"
45 #include "tableVisiTcl.h"
46
47 Tcl_Interp *mainInterp;
48 Tk_Window   mainTkWindow;
49
50 void panic(const char *msg) {
51    cerr << msg << endl;
52    exit(5);
53 }
54
55 tableVisi *theTableVisi; // our main data structure
56 bool xsynch_flag=false;
57
58 void visiFdReadableHandler(ClientData, int) {
59    // Installed as a file-handler routine for whenever data arrives over
60    // the socket returned from VisiInit()
61    if (visi_callback() == -1)
62       exit(0);
63 }
64
65 int main(int argc, char **argv) {
66    if (argc==2 && 0==strcmp(argv[1], "--debug")) {
67       xsynch_flag = true;
68       cout << "tableVisi at sigpause...pid=" << getpid() << endl;
69       sigpause(0);
70       argc = 1;
71    }
72
73    // tableVisi requires no arguments, thanks to tcl2c.
74    if (argc == 3)
75       cout << "tableVisi notice: argc should no longer be 3 (ignoring args)" << endl;
76
77    if (argc == 2 || argc>3)
78       panic("tableVisi: incorrect #args (should be none)");
79
80    mainInterp = Tcl_CreateInterp();
81    assert(mainInterp);
82
83    mainTkWindow = Tk_CreateMainWindow(mainInterp, NULL,
84                                       "tableVisi",
85                                       "TableVisi");
86    if (mainTkWindow == NULL)
87       tclpanic(mainInterp, "Could not Tk_CreateMainWindow()");
88
89    if (xsynch_flag) {
90       cout << "xsynching..." << endl;
91       XSynchronize(Tk_Display(mainTkWindow), 1);
92    }
93
94    if (TCL_OK != Tcl_Init(mainInterp))
95       tclpanic(mainInterp, "Could not Tcl_Init");
96
97    if (TCL_OK != Tk_Init(mainInterp))
98       tclpanic(mainInterp, "Could not Tk_Init");
99
100    if (TCL_OK != Dg2_Init(mainInterp))
101       tclpanic(mainInterp, "Could not Dg2_Init");
102
103    int fd = VisiInit();
104    if (fd < 0)
105       panic("failed to initialize w/ visi lib");
106
107    Tcl_SetVar(mainInterp, "tcl_interactive", "0", TCL_GLOBAL_ONLY);
108
109    // Install our new tcl commands here:
110    installTableVisiCommands(mainInterp);
111
112    if (RegistrationCallback(ADDMETRICSRESOURCES, Dg2AddMetricsCallback) != 0)
113       panic("Dg2_Init() -- couldn't install ADDMETRICSRESOURCES callback");
114
115    if (RegistrationCallback(DATAVALUES, Dg2NewDataCallback) != 0)
116       panic("Dg2_Init() -- couldn't install DATAVALUES callback");
117
118    Tk_CreateFileHandler(fd, TK_READABLE, visiFdReadableHandler, 0);
119
120    // Krishna's tcl2c stuff:
121    extern int initialize_tcl_sources(Tcl_Interp *);
122    if (TCL_OK != initialize_tcl_sources(mainInterp))
123       tclpanic(mainInterp, "tableVisi: could not initialize_tcl_sources");
124
125 //if (Tcl_EvalFile(mainInterp, "/p/paradyn/development/tamches/core/visiClients/tableVisi/tcl/tableVisi.tcl") != TCL_OK)
126 //   tclpanic(mainInterp, "could not open tableVisi.tcl");
127
128    pdLogo::install_fixed_logo("paradynLogo", logo_bits, logo_width, logo_height);
129    tcl_cmd_installer createPdLogo(mainInterp, "makeLogo", pdLogo::makeLogoCommand,
130                                   (ClientData)mainTkWindow);
131
132    myTclEval(mainInterp, "initializeTableVisi");
133
134    // Create our main data structure:
135    theTableVisi = new tableVisi(mainInterp,
136                                 Tk_NameToWindow(mainInterp, ".body", mainTkWindow),
137                                 "*-Helvetica-*-r-*-14-*", // metric font
138                                 "*-Helvetica-*-r-*-12-*", // metric units font
139                                 "*-Helvetica-*-r-*-14-*", // focus font
140                                 "*-Helvetica-*-r-*-12-*", // cell font
141                                 "lightBlue", // line color
142                                 "blue", // metric color
143                                 "black", // metric units color
144                                 "maroon3", // focus color
145                                 "black", // cell color
146                                 "gray", // background color
147                                 "lightGray", // highlight background color
148                                 3 // initial # sig figs
149                                 );
150    assert(theTableVisi);
151
152    Tk_MainLoop(); // returns when all tk windows are closed
153
154    delete theTableVisi;
155 }