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