forked from mirrors/org-mode
102 lines
2.9 KiB
C
102 lines
2.9 KiB
C
#include <windows.h>
|
|
|
|
/* You MUST change the value of FULLPATH to the actual location of the
|
|
* gnuplot executable on your computer. */
|
|
#define FULLPATH "e:/prg/gp36/gp37hbb/wgnuplot.exe"
|
|
#define WINDOWNAME "gnuplot"
|
|
#define PARENTCLASS "wgnuplot_parent"
|
|
#define TEXTCLASS "wgnuplot_text"
|
|
#define GRAPHWINDOW "gnuplot graph"
|
|
#define GRAPHCLASS "wgnuplot_graph"
|
|
|
|
int main (int argc, char *argv[])
|
|
{
|
|
/* Customize this path if needed */
|
|
char *d, buf[80];
|
|
HWND hwnd_parent;
|
|
HWND hwnd_text;
|
|
BOOL startedWgnuplotMyself = FALSE;
|
|
|
|
/* First, try to find if there is an instance of gnuplot
|
|
* running, already. If so, use that. */
|
|
hwnd_parent = FindWindow(PARENTCLASS, WINDOWNAME);
|
|
|
|
if ( ! hwnd_parent) {
|
|
/* None there, so start one: load gnuplot (minimized in order to
|
|
* show only the graphic window). Pass all command line arguments
|
|
* on to wgnuplot, by concatting the wgnuplot full path name and
|
|
* the given arguments, building up a new, usable command line:
|
|
*/
|
|
char *cmdline = strdup (FULLPATH);
|
|
|
|
while (*(++argv)) {
|
|
/* Puzzle together a working from the given arguments. To account
|
|
* for possible spaces in arguments, we'll have to put double quotes
|
|
* around each of them:
|
|
*/
|
|
/* FIXME: doesn't check for out of memory */
|
|
cmdline = realloc(cmdline, strlen(cmdline)+3+strlen(argv[0]));
|
|
strcat(cmdline, " \"");
|
|
strcat(cmdline, *argv);
|
|
strcat(cmdline, "\"");
|
|
}
|
|
|
|
if (WinExec(cmdline, SW_SHOWMINNOACTIVE) < 32) {
|
|
printf("Can't load gnuplot\n");
|
|
exit(EXIT_FAILURE);
|
|
}
|
|
|
|
startedWgnuplotMyself = TRUE;
|
|
|
|
/* wait for the gnuplot window */
|
|
/* FIXME: is this necessary? As documented, WinExec shouldn't return
|
|
* until wgnuplot first calls GetMessage(). By then, the window should
|
|
* be there, shouldn't it?
|
|
*/
|
|
Sleep(1000);
|
|
hwnd_parent = FindWindow(PARENTCLASS, WINDOWNAME);
|
|
}
|
|
|
|
if ( ! hwnd_parent) {
|
|
/* Still no gnuplot window? Problem! */
|
|
printf("Can't find the gnuplot window");
|
|
exit(EXIT_FAILURE);
|
|
}
|
|
|
|
/* find the child text window */
|
|
hwnd_text = FindWindowEx(hwnd_parent, NULL, "wgnuplot_text", NULL );
|
|
|
|
if (isatty(fileno(stdin))) {
|
|
/* Do not try to read from stdin if it hasn't been redirected
|
|
* (i.e., it should read from a pipe or a file) */
|
|
exit(EXIT_SUCCESS);
|
|
}
|
|
|
|
/* wait for commands on stdin, and pass them on to the wgnuplot text
|
|
* window */
|
|
do {
|
|
d = fgets(buf, sizeof(buf), stdin);
|
|
|
|
if (NULL == d) {
|
|
if (startedWgnuplotMyself) {
|
|
/* close gnuplot cleanly: */
|
|
strcpy (buf, "exit");
|
|
d = buf;
|
|
startedWgnuplotMyself = FALSE;
|
|
} else {
|
|
break;
|
|
}
|
|
}
|
|
|
|
while(*d) {
|
|
PostMessage(hwnd_text, WM_CHAR, *d, 1L);
|
|
d++;
|
|
}
|
|
} while (NULL != d);
|
|
|
|
/* Just in case stdin didn't have a terminating newline, add one: */
|
|
PostMessage(hwnd_text, WM_CHAR, '\n', 1L);
|
|
|
|
return EXIT_SUCCESS;
|
|
}
|