gint vwmterm_ON_DESTROY(WINDOW *window,gpointer anything) { vterm_t *vterm; vterm=(vterm_t*)anything; vterm_destroy(vterm); return 0; }
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; }