[comp.windows.open-look] using TTY subwindows in XView

nicolas@bmsr9.usc.edu (Nicolas Rouquette) (06/30/91)

I'm trying to use the termsw/tty packages to run programs in
subwindows. Using the xv_termsw.c example from the xview distrib I
managed to fork a process and run it in a tty subwindow.  In the code
below, pressing "start" creates a tty subwindow with a forked process.
The question is: how can a second process be forked?  

Ideally, the termsw or tty subwindow would be created with TTY_ARGV
set to TTY_ARGV_DO_NOT_FORK. Then, to create a process, the program
would do the forking, set the TTY_PID, and redirect the child process
stdin/stdout to the pseudo terminal.

Is there any kind sould who'd care to comment on this or propose a solution?

/*
 * xv_termsw.c
 * Demonstrate incorporation of a Term subwindow in an application;
 * keyboard input to the termsw can come either directly to the
 * termsw or from an adjoining panel text item.
 */
#include <stdio.h>
#include <sys/wait.h>
#include <xview/xview.h>
#include <xview/panel.h>
#include <xview/tty.h>
#include <xview/termsw.h>
#include <xview/notify.h>

Frame           frame;
Termsw          term;
Panel_item      text_item;
char *my_argv[] = { "man", "cat",  NULL };

main(argc,argv)
int     argc;
char    *argv[];
{
    Panel       panel;
    int         notify_proc(), 
		term_notify_proc(),
		quit_notify_proc();

    xv_init(XV_INIT_ARGS, argc, argv, NULL);

    frame = (Frame)xv_create(NULL, FRAME, NULL);
    panel = (Panel)xv_create(frame, PANEL, NULL);
    text_item = (Panel_item)xv_create(panel, PANEL_TEXT,
        PANEL_LABEL_STRING,         "Command:",
        PANEL_NOTIFY_PROC,          notify_proc,
        PANEL_VALUE_DISPLAY_LENGTH, 20,
        PANEL_INACTIVE, TRUE,				     
        NULL);
    (void) xv_create(panel, PANEL_BUTTON,
        PANEL_LABEL_STRING,     "Start",
        PANEL_NOTIFY_PROC,      term_notify_proc,
        NULL);
    (void) xv_create(panel, PANEL_BUTTON,
        PANEL_LABEL_STRING,     "Quit",
        PANEL_NOTIFY_PROC,      quit_notify_proc,
        NULL);
    window_fit_height(panel);

    window_fit(frame);
    xv_main_loop(frame);
}

/*
 * This procedure is called when the user this return on the
 * panel text item.
 * Use ttysw_input() to feed the string to the termal window.
 */
int
notify_proc(item,event)
Panel_item      item;
Event   *event;
{
    char        str[81];
    
    sprintf(str, "%.81s\n", (char *)xv_get(text_item, PANEL_VALUE));
    ttysw_input(term, str, strlen(str));
    xv_set(text_item, PANEL_VALUE, "", NULL);
    return XV_OK;
}

/*
 * destroy everything. 
 */     
int
quit_notify_proc(item,event)
Panel_item      item;
Event   *event;
{
  xv_destroy_safe(frame);  
  exit(0);  
}

Notify_client me = (Notify_client)101010;

int
term_notify_proc(item,event)
Panel_item      item;
Event   *event;
{
    int		 pid;
    Notify_value my_wait3();

    xv_set(item, PANEL_INACTIVE, TRUE, NULL);
    xv_set(text_item, PANEL_INACTIVE, FALSE, NULL);
    
    
    term = (Termsw)xv_create(frame, TERMSW, 
			     XV_X, 10,
			     XV_Y, 50,
			     WIN_ROWS,       24,
			     WIN_COLUMNS,    80,
			     TTY_ARGV,       my_argv,
			     TTY_QUIT_ON_CHILD_DEATH, FALSE,
			     NULL);
    window_fit_height(frame);
    pid = (int)xv_get(term, TTY_PID);
    notify_set_wait3_func(me, my_wait3, pid);
    return XV_OK;
}

Notify_value my_wait3(tty, pid, status, rusage)
     Notify_client tty;     
     int pid;
     union wait *status;
     struct rusage *rusage;
{
  if (WIFEXITED(*status))
   {
      ttysw_input(term, "\n-- end --\n", 11);      
   }
  return NOTIFY_DONE;
}

--
Nicolas Rouquette		email: nrouquet@pollux.usc.edu
Computer Science Department
Los Angeles, CA 90089-0782
-- 
Nicolas Rouquette		email: nrouquet@pollux.usc.edu
Computer Science Department
Los Angeles, CA 90089-0782