diff options
Diffstat (limited to 'mixgtk')
| -rw-r--r-- | mixgtk/mixgtk_cmd_dispatcher.c | 57 | 
1 files changed, 35 insertions, 22 deletions
| diff --git a/mixgtk/mixgtk_cmd_dispatcher.c b/mixgtk/mixgtk_cmd_dispatcher.c index 180c480..d53e991 100644 --- a/mixgtk/mixgtk_cmd_dispatcher.c +++ b/mixgtk/mixgtk_cmd_dispatcher.c @@ -1,7 +1,7 @@  /* -*-c-*- -------------- mixgtk_cmd_dispatcher.c :   * Implementation of the functions declared in mixgtk_cmd_dispatcher.h   * ------------------------------------------------------------------ - *  Last change: Time-stamp: "01/04/01 15:22:09 jose" + *  Last change: Time-stamp: "2001-04-08 01:34:09 jao"   * ------------------------------------------------------------------   * Copyright (C) 2001 Free Software Foundation, Inc.   *   @@ -21,11 +21,12 @@   *     */ -#define _GNU_SOURCE 1 -  #include <stdlib.h>  #include <stdio.h>  #include <string.h> +#include <unistd.h> +#include <fcntl.h> +#include <errno.h>  #include <mixlib/mix_vm_command.h>  #include "mixgtk_cmd_dispatcher.h" @@ -36,15 +37,14 @@  /* a mix vm command dispatcher */  struct mixgtk_dispatch_  { -  mix_vm_cmd_dispatcher_t *dispatcher; -  FILE *out; -  char *out_buffer; -  size_t out_buffer_size; -  GtkWidget *prompt; -  GtkWidget *log; -  GtkWidget *status; -  guint context; -  GCompletion *completions; +  mix_vm_cmd_dispatcher_t *dispatcher; /* the underlying cmd dispatcher */ +  FILE *out;			/* the dispatcher's output file */ +  int fildes[2];		/* pipe for communication with the dispatcher */ +  GtkWidget *prompt;		/* the command prompt widget */ +  GtkWidget *log;		/* the dispatcher's messages echo area */ +  GtkWidget *status;		/* the status bar widget */ +  guint context;		/* context of the status bar messages */ +  GCompletion *completions;	/* mixvm command completions */  };  static struct mixgtk_dispatch_ dis_data_ = {NULL}; @@ -91,13 +91,19 @@ static void  global_post_hook_ (mix_vm_cmd_dispatcher_t *dis,  		   mix_vm_command_t cmd, const gchar *arg, gpointer data)  { +  enum {BLKSIZE = 100}; +  static gchar BUFFER[BLKSIZE]; +   +  ssize_t k;    fflush (dis_data_.out); -  if (cmd < MIX_CMD_INVALID) +  while ((k = read (dis_data_.fildes[0], BUFFER, BLKSIZE)) != 0)      { -      gtk_text_insert (GTK_TEXT (dis_data_.log), NULL, NULL, NULL, -		       dis_data_.out_buffer, dis_data_.out_buffer_size); +      if (k == -1 && errno != EINTR) break; +      if (cmd < MIX_CMD_INVALID) +	gtk_text_insert (GTK_TEXT (dis_data_.log), NULL, NULL, NULL, +			 BUFFER, k);      } -  rewind (dis_data_.out); +    mixgtk_mixvm_update_vm_widgets ();  } @@ -112,7 +118,8 @@ load_post_hook_ (mix_vm_cmd_dispatcher_t *dis, const gchar *arg,        gchar *file = g_strdup (arg);        mixgtk_mixal_load_file ();        mixgtk_mixal_update (); - +      mixgtk_mixal_update_bp_all (); +              if (id != -1)  	gtk_statusbar_remove (GTK_STATUSBAR (dis_data_.status),  			      dis_data_.context, (guint)id); @@ -206,11 +213,17 @@ mixgtk_cmd_dispatcher_init (void)    if (!dis_data_.dispatcher)      { -      FILE *out = open_memstream (&(dis_data_.out_buffer), -				  &(dis_data_.out_buffer_size)); -      g_return_val_if_fail (out != NULL, FALSE); -      dis_data_.out = out; -      dis_data_.dispatcher = mix_vm_cmd_dispatcher_new (out, out); +      int r = pipe (dis_data_.fildes); +      g_return_val_if_fail (r == 0, FALSE); +      dis_data_.out = fdopen (dis_data_.fildes[1], "w"); +      g_return_val_if_fail (dis_data_.out != NULL, FALSE); +      r = fcntl (dis_data_.fildes[0], F_GETFL, 0); +      g_return_val_if_fail (r != -1, FALSE); +      r |= O_NONBLOCK; +      r = fcntl(dis_data_.fildes[0], F_SETFL, r); +      g_return_val_if_fail (r != -1, FALSE); +      dis_data_.dispatcher = +	mix_vm_cmd_dispatcher_new (dis_data_.out, dis_data_.out);        mix_vm_cmd_dispatcher_print_time (dis_data_.dispatcher, FALSE);        install_hooks_ ();      } | 
