Example #1
0
gint vwmterm_ON_DESTROY(WINDOW *window,gpointer anything)
{
	vterm_t	   *vterm;

   vterm=(vterm_t*)anything;
   vterm_destroy(vterm);

	return 0;
}
Example #2
0
File: vterm.c Project: rkd77/tvterm
vterm_t* vterm_create(guint width,guint height,guint flags)
{
   vterm_t        *vterm;
   struct passwd  *user_profile;
   const char     *user_shell=NULL;
   pid_t          child_pid;
   int            master_fd;
   struct winsize ws={0};//.ws_xpixel=0,.ws_ypixel=0};
   // int            cell_count;
   guint          i;

   if(height <= 0 || width <= 0) return NULL;

   vterm=(vterm_t*)g_malloc0(sizeof(vterm_t));

   /* record dimensions */
   vterm->rows=height;
   vterm->cols=width;

   // cell_count=width*height;

   /* create the cell matrix */
   vterm->cells=(vterm_cell_t**)g_malloc0(sizeof(vterm_cell_t*)*height);

   for(i=0;i < height;i++)
   {
      vterm->cells[i]=(vterm_cell_t*)g_malloc0(sizeof(vterm_cell_t)*width);
   }

   // initialize all cells with defaults
   vterm_erase(vterm);

   // initialization of other public fields
   vterm->crow=0;
   vterm->ccol=0;

   // default active colors
   vterm->curattr = A_NORMAL;//COLOR_PAIR_TV(vterm->colors);

//fprintf(stderr, "vterm->curattr = %d\n", vterm->curattr);

   // initial scrolling area is the whole window
   vterm->scroll_min=0;
   vterm->scroll_max=height-1;

   vterm->flags=flags;

   memset(&ws,0,sizeof(ws));
   ws.ws_row=height;
   ws.ws_col=width;

   child_pid=forkpty(&master_fd,NULL,NULL,&ws);
   vterm->pty_fd=master_fd;

   if(child_pid < 0)
   {
      vterm_destroy(vterm);
      return NULL;
   }

   if(child_pid==0)
   {
      signal(SIGINT,SIG_DFL);

      // default is rxvt emulation
      setenv("TERM","rxvt",1);

      if(flags & VTERM_FLAG_VT100)
      {
         setenv("TERM","vt100",1);
      }

      user_profile=getpwuid(getuid());
      if(user_profile==NULL) user_shell="/bin/sh";
      else if(user_profile->pw_shell==NULL) user_shell="/bin/sh";
      else user_shell=user_profile->pw_shell;

      if(user_shell==NULL) user_shell="/bin/sh";

//fprintf(stderr, "execl\n");
      // start the shell
      if(execl(user_shell,user_shell,"-l",NULL)==-1)
      {
         //fprintf(stderr, "FAIL\n");
         exit(EXIT_FAILURE);
      }
	//fprintf(stderr, "OK\n");
      exit(EXIT_SUCCESS);
   }

   vterm->child_pid=child_pid;

   if(ttyname_r(master_fd,vterm->ttyname,sizeof(vterm->ttyname)-1) !=0)
   {
      snprintf(vterm->ttyname,sizeof(vterm->ttyname)-1,"vterm");
   }

   if(flags & VTERM_FLAG_VT100) vterm->write=vterm_write_vt100;
   else vterm->write=vterm_write_rxvt;

   return vterm;
}