/* zvtterm.c simple zvt terminal Author : Stellios Keskinidis */ #include #include #include #include #include #include #include #include #define FONT "-elot-fixed-medium-r-normal-*-*-130-*-*-c-*-iso8859-7" void setup_zvtterm(ZvtTerm **Zterm); #define HEIGHT 200 #define WIDTH 700 typedef enum{false,true}bool; static bool NOLOG=false; void usage() { printf("USAGE: zvtterm [--nolog|-n] [--help|-h]\n" "OPTIONS\n" "\t-n\tdon't log session in utmp(clears trace of session)\n" "\t-h\tdisplay this screen\n"); } int main(int argc, char *argv[]) { GtkWidget *Window; GtkWidget *Box; ZvtTerm *Zterm; int c,option_index=0; struct option long_options[]= { {"nolog",0,0,'n'}, {"help",0,0,'h'}, {0,0,0,0} }; while(1) { c=getopt_long(argc,argv,"nh:0",long_options,&option_index); if(c==-1)break; switch(c) { case 'n': NOLOG=true; break; case 'h': case '?': case '0': default: usage(); return 1; break; } } gtk_init(&argc,&argv); Window = gtk_window_new(GTK_WINDOW_TOPLEVEL); gtk_signal_connect(GTK_OBJECT(Window),"delete_event",GTK_SIGNAL_FUNC(gtk_main_quit),NULL); gtk_window_set_default_size(GTK_WINDOW(Window),WIDTH,HEIGHT); gtk_container_set_border_width(GTK_CONTAINER(Window),5); gtk_window_set_title(GTK_WINDOW(Window),"Zvtterm"); Box = gtk_vbox_new(FALSE,0); gtk_container_add(GTK_CONTAINER(Window),Box); /* create the ZvtTerm widget and add it to the Box */ setup_zvtterm(&Zterm); gtk_container_add(GTK_CONTAINER(Box),GTK_WIDGET(Zterm)); gtk_widget_show(Box); gtk_widget_show_all(Window); gtk_main(); return 0; } void setup_zvtterm(ZvtTerm **Zterm) { extern char **environ; static char **env; static char **env_copy; static int winid_pos; int scrollbacklines = 10000; int i, cmdindex, login_shell,forkpty; char **p; struct passwd *pw; login_shell = 0; cmdindex = 0; /* set up terminal environment */ env=environ; for(p=env;*p;p++); i=p-env; env_copy=(char **)g_malloc(sizeof(char *)*(i+3)); for(i=0,p=env;*p;p++) { if(strncmp(*p,"TERM=",5)==0) env_copy[i++]="TERM=xterm"; else if(!(strncmp(*p,"COLUMNS=",8))||(!strncmp(*p,"LINES=",6))) continue; else env_copy[i++]=*p; } env_copy[i++]="COLORTERM=xterm"; winid_pos=i++; env_copy[winid_pos]="TEST"; env_copy[i]=NULL; *Zterm=(ZvtTerm *)zvt_term_new_with_size(72,32); zvt_term_set_font_name(ZVT_TERM(*Zterm),FONT); zvt_term_set_blink(ZVT_TERM(*Zterm),TRUE); zvt_term_hide_pointer(*Zterm); zvt_term_set_bell(ZVT_TERM(*Zterm),TRUE); zvt_term_set_scrollback(ZVT_TERM(*Zterm),scrollbacklines); zvt_term_set_scroll_on_keystroke(ZVT_TERM(*Zterm),TRUE); zvt_term_set_scroll_on_output (ZVT_TERM (*Zterm),TRUE); zvt_term_set_wordclass (ZVT_TERM(*Zterm),"-A-Za-z0-9/_:.,?+%="); forkpty=(NOLOG)? zvt_term_forkpty(ZVT_TERM(*Zterm),0|ZVT_BACKGROUND_SHADED): zvt_term_forkpty(ZVT_TERM(*Zterm),ZVT_TERM_DO_UTMP_LOG|ZVT_TERM_DO_WTMP_LOG); switch(forkpty) { case -1: perror("ERROR: unable to fork:"); exit(1); break; case 0: { GString *shell,*name; /* get shell from passwd */ pw=getpwuid(getuid()); if(pw) { shell=g_string_new(pw->pw_shell); if(login_shell) name=g_string_new("-"); else name=g_string_new(""); g_string_append(name, strrchr(pw->pw_shell, '/')); } else { shell=g_string_new("/bin/sh"); if(login_shell)name=g_string_new("-sh"); else name=g_string_new("sh"); } execle (shell->str,name->str,NULL,env_copy); perror ("Could not exec\n"); exit(1); perror("ERROR: Cannot exec command:"); exit(1); break; } default: break; } }