Annotation of OpenXM_contrib/gnuplot/beos/GPApp.cpp, Revision 1.1.1.1
1.1 ohara 1: /*[
2: * Copyright 1986 - 1993, 1998 Thomas Williams, Colin Kelley
3: *
4: * Permission to use, copy, and distribute this software and its
5: * documentation for any purpose with or without fee is hereby granted,
6: * provided that the above copyright notice appear in all copies and
7: * that both that copyright notice and this permission notice appear
8: * in supporting documentation.
9: *
10: * Permission to modify the software is granted, but not the right to
11: * distribute the complete modified source code. Modifications are to
12: * be distributed as patches to the released version. Permission to
13: * distribute binaries produced by compiling modified sources is granted,
14: * provided you
15: * 1. distribute the corresponding source modifications from the
16: * released version in the form of a patch file along with the binaries,
17: * 2. add special version identification to distinguish your version
18: * in addition to the base release version number,
19: * 3. provide your name and address as the primary contact for the
20: * support of your modified version, and
21: * 4. retain our contact information in regard to use of the base
22: * software.
23: * Permission to distribute the released version of the source code along
24: * with corresponding source modifications in the form of a patch file is
25: * granted with same provisions 2 through 4 for binary distributions.
26: *
27: * This software is provided "as is" without express or implied warranty
28: * to the extent permitted by applicable law.
29: ]*/
30:
31: #include <Application.h>
32: #include <Messenger.h>
33: #include <Message.h>
34: #include <Roster.h>
35: #include <Window.h>
36: #include <View.h>
37: #include <MenuBar.h>
38: #include <Menu.h>
39: #include <MenuItem.h>
40: #include <FilePanel.h>
41: #include <Path.h>
42: #include <Entry.h>
43: #include <TextView.h>
44: #include <ScrollView.h>
45: #include <string.h>
46: #include <stdio.h>
47: #include <stdlib.h>
48:
49: #include "constants.h"
50: #include "GPBitmap.h"
51: #include "GPView.h"
52: #include "GPApp.h"
53: #include "GPWindow.h"
54:
55: // Application's signature
56:
57: const char *APP_SIGNATURE = "application/x-vnd.Xingo-gnuplotViewer";
58:
59: BRect windowRect(50,50,600,400);
60:
61: //
62: // main
63: //
64: // The main() function's only real job in a basic BeOS
65: // application is to create the BApplication object
66: // and run it.
67: //
68: int main(void) {
69: GPApp theApp; // The application object
70: theApp.Run();
71: return 0;
72: }
73:
74: //
75: // GPApp::GPApp
76: //
77: // The constructor for the WEApp class. This
78: // will create our window.
79: //
80: GPApp::GPApp()
81: : BApplication(APP_SIGNATURE) {
82:
83: window_count = 0; // No windows yet
84: next_untitled_number = 1; // Next window is "Untitled 1"
85:
86: // Create the Open file panel
87: // openPanel = new BFilePanel;
88: }
89:
90:
91: //
92: // GPApp::MessageReceived
93: //
94: // Handle incoming messages. In particular, handle the
95: // WINDOW_REGISTRY_ADD and WINDOW_REGISTRY_SUB messages.
96: //
97: void GPApp::MessageReceived(BMessage *message) {
98: switch(message->what) {
99: case WINDOW_REGISTRY_ADD:
100: {
101: bool need_id = false;
102: BMessage reply(WINDOW_REGISTRY_ADDED);
103:
104: if (message->FindBool("need_id", &need_id) == B_OK) {
105: if (need_id) {
106: reply.AddInt32("new_window_number", next_untitled_number);
107: next_untitled_number++;
108: }
109: window_count++;
110: }
111: reply.AddRect("rect", windowRect);
112: windowRect.OffsetBy(20,20);
113: message->SendReply(&reply);
114: break;
115: }
116: case WINDOW_REGISTRY_SUB:
117: window_count--;
118: if (!window_count) {
119: Quit();
120: }
121: break;
122: case MENU_FILE_OPEN:
123: // openPanel->Show(); // Show the file panel
124: break;
125: default:
126: BApplication::MessageReceived(message);
127: break;
128: }
129: }
130:
131: //
132: // GPApp::RefsReceived
133: //
134: // Handle a refs received message.
135: //
136: void GPApp::RefsReceived(BMessage *message) {
137: entry_ref ref; // The entry_ref to open
138: status_t err; // The error code
139: int32 ref_num; // The index into the ref list
140:
141: // Loop through the ref list and open each one
142: #if 0
143: ref_num = 0;
144: do {
145: if ((err = message->FindRef("refs", ref_num, &ref)) != B_OK) {
146: return;
147: }
148: new GPWindow(windowRect, &ref);
149: ref_num++;
150: } while (1);
151: #endif
152: }
153:
154: void GPApp::ReadyToRun(void)
155: {
156: io_thread = spawn_thread(&io_loop, "gnuplot io_loop", B_LOW_PRIORITY, NULL);
157: resume_thread(io_thread);
158: }
159:
160: int32 GPApp::io_loop(void* data)
161: {
162: static plot_struct plot_array[MAX_WINDOWS];
163: int32 res = 1;
164: while(res)
165: res = io_task(plot_array);
166: return res;
167: }
168:
169: int32 GPApp::io_task(plot_struct *plot_array)
170: {
171: char buf[256];
172: struct plot_struct *plot = plot_array;
173: FILE *fp = stdin;
174: BMessage msg(bmsgNewCmd);
175: int cnt = 0;
176:
177: while (fgets(buf, 256, fp)) {
178: // printf("Got : %s", buf);
179: switch (*buf) {
180: case 'G': /* enter graphics mode */
181: {
182: //printf("entering gfx mode\n");
183: int plot_number = atoi(buf + 1); /* 0 if none specified */
184:
185: if (plot_number < 0 || plot_number >= MAX_WINDOWS)
186: plot_number = 0;
187:
188: //printf("plot for window number %d\n", plot_number);
189: plot = plot_array + plot_number;
190: prepare_plot(plot, plot_number);
191: continue;
192: }
193: case 'E': /* leave graphics mode / suspend */
194: {
195: // BMessage msg(bmsgBitmapDirty);
196: msg.AddInt32("numcmds",cnt);
197: msg.AddPointer("cmds", plot->commands);
198: if(plot->window)
199: plot->window->PostMessage(&msg);
200: // printf("displaying %d cmds, %X at %X\n",cnt,plot->commands[0],&plot->commands[0]);
201: // display(plot);
202: cnt = 0;
203: return 1;
204: }
205: case 'R': /* leave x11 mode */
206: {
207: //printf("leaving gfx mode\n");
208: return 0;
209: }
210: default:
211: {
212: // msg.AddString("cmd",buf);
213: // plot->window->PostMessage(&msg);
214: store_command(buf, plot);
215: cnt++;
216: continue;
217: }
218: }
219: }
220: /* get here if fgets fails */
221: return (feof(fp) || ferror(fp)) ? 0 : 1;
222: }
223:
224: void GPApp::prepare_plot(plot_struct *plot, int term_number)
225: {
226: int i;
227:
228: for (i = 0; i < plot->ncommands; ++i)
229: free(plot->commands[i]);
230: plot->ncommands = 0;
231:
232: if (!plot->posn_flags) {
233: /* first time this window has been used - use default or -geometry
234: * settings
235: */
236: plot->posn_flags = 1;
237: plot->x = 50;
238: plot->y = 20;
239: plot->width = 400;
240: plot->height = 400;
241: }
242:
243: if (!plot->window) {
244: windowRect.Set(plot->x,plot->y,plot->width,plot->height);
245: plot->window = new GPWindow(windowRect);
246: } else {
247: BMessage msg(bmsgClrCmd);
248: plot->window->PostMessage(&msg);
249: }
250: }
251:
252: void GPApp::display(plot_struct *plot)
253: {
254: BMessage msg(bmsgBitmapDirty);
255: if(plot->window)
256: plot->window->PostMessage(&msg);
257: }
258:
259: /* store a command in a plot structure */
260:
261: void GPApp::store_command(char *buffer, plot_struct *plot)
262: {
263: char *p;
264: // BMessage msg(bmsgNewCmd);
265:
266: // FPRINTF((stderr, "Store in %d : %s", plot - plot_array, buffer));
267:
268: if (plot->ncommands >= plot->max_commands) {
269: plot->max_commands = plot->max_commands * 2 + 1;
270: plot->commands = (plot->commands)
271: ? (char **) realloc(plot->commands, plot->max_commands * sizeof(char *))
272: : (char **) malloc(sizeof(char *));
273: }
274: p = (char *) malloc((unsigned) strlen(buffer) + 1);
275: if (!plot->commands || !p) {
276: fputs("gnuplot: can't get memory. aborted.\n", stderr);
277: exit(1);
278: }
279: plot->commands[plot->ncommands++] = strcpy(p, buffer);
280:
281: // msg.AddString("cmd",buffer);
282: // plot->window->PostMessage(&msg);
283: }
284:
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>