diff --git a/src/syncterm/bbslist.c b/src/syncterm/bbslist.c index ebb7b72969488d8ee10322baa61f93d740bc0b20..9c49461a04900400023d1277772173244e7c06ad 100644 --- a/src/syncterm/bbslist.c +++ b/src/syncterm/bbslist.c @@ -251,7 +251,7 @@ void viewofflinescroll(void) textattr(uifc.hclr|(uifc.bclr<<4)|BLINK); gettextinfo(&sbtxtinfo); - for(i=0;!i;) { + for(i=0;!i && !quitting;) { if(top<1) top=1; if(top>(int)scrollback_lines) @@ -271,6 +271,11 @@ void viewofflinescroll(void) case 0xff: case 0: switch(key|getch()<<8) { + case CIO_KEY_QUIT: + check_exit(TRUE); + if (quitting) + i=1; + break; case CIO_KEY_MOUSE: getmouse(&mevent); switch(mevent.event) { @@ -505,7 +510,7 @@ void edit_sorting(struct bbslist **list, int *listcount, int *ocur, int *obar, c sopts[i]=sopt[i]; sopts[i]=NULL; - for(;;) { + for(;!quitting;) { /* Build ordered list of sort order */ for(i=0; i<sizeof(sort_order)/sizeof(struct sort_order_info); i++) { if(sort_order[abs(sortorder[i])].name) { @@ -524,8 +529,10 @@ void edit_sorting(struct bbslist **list, int *listcount, int *ocur, int *obar, c "To reverse a sort order, highlight it and press enter"; ret=uifc.list(WIN_XTR|WIN_DEL|WIN_INS|WIN_INSACT|WIN_ACT|WIN_SAV ,0,0,0,&curr,&bar,"Sort Order",opts); - if(ret==-1) - break; + if(ret==-1) { + if(check_exit(FALSE)) + break; + } if(ret & MSK_INS) { /* Insert sorting */ j=0; for(i=0; i<sizeof(sort_order)/sizeof(struct sort_order_info); i++) { @@ -537,6 +544,8 @@ void edit_sorting(struct bbslist **list, int *listcount, int *ocur, int *obar, c if(j==0) { uifc.helpbuf= "All sort orders are present in the list."; uifc.msg("No more sort orders."); + if(check_exit(FALSE)) + break; } else { sopt[j][0]=0; @@ -557,6 +566,10 @@ void edit_sorting(struct bbslist **list, int *listcount, int *ocur, int *obar, c } } } + else { + if(check_exit(FALSE)) + break; + } } } else if(ret & MSK_DEL) { /* Delete criteria */ @@ -732,8 +745,10 @@ int edit_list(struct bbslist **list, struct bbslist *item,char *listpath,int isd "This entry was loaded from the system directory. In order to edit it, it\n" "must be copied into your personal directory.\n"; i=0; - if(uifc.list(WIN_MID|WIN_SAV,0,0,0,&i,NULL,"Copy from system directory?",YesNo)!=0) + if(uifc.list(WIN_MID|WIN_SAV,0,0,0,&i,NULL,"Copy from system directory?",YesNo)!=0) { + check_exit(FALSE); return(0); + } item->type=USER_BBSLIST; add_bbs(listpath, item); } @@ -749,7 +764,7 @@ int edit_list(struct bbslist **list, struct bbslist *item,char *listpath,int isd itemname=NULL; else itemname=item->name; - for(;;) { + for(;!quitting;) { i=0; if(!isdefault) { sprintf(opt[i++], "Name %s",itemname); @@ -810,13 +825,17 @@ int edit_list(struct bbslist **list, struct bbslist *item,char *listpath,int isd i++; /* no port number */ switch(i) { case -1: + check_exit(FALSE); if((!isdefault) && (itemname!=NULL) && (itemname[0]==0)) { uifc.helpbuf= "`Cancel Save`\n\n" "This entry has no name and can therefore not be saved.\n" "Selecting `No` will return to editing mode.\n"; i=0; - if(uifc.list(WIN_MID|WIN_SAV,0,0,0,&i,NULL,"Cancel Save?",YesNo)!=0) + if(uifc.list(WIN_MID|WIN_SAV,0,0,0,&i,NULL,"Cancel Save?",YesNo)!=0) { + quitting=FALSE; + check_exit(FALSE); break; + } strListFree(&inifile); return(0); } @@ -834,22 +853,29 @@ int edit_list(struct bbslist **list, struct bbslist *item,char *listpath,int isd "Enter the name of the entry as it is to appear in the directory."; strcpy(tmp,itemname); uifc.input(WIN_MID|WIN_SAV,0,0,"Name",tmp,LIST_NAME_MAX,K_EDIT); + check_exit(FALSE); + if(quitting) + break; if(stricmp(tmp,itemname) && list_name_check(list, tmp, NULL, FALSE)) { uifc.helpbuf= "`Entry Name Already Exists`\n\n" "An entry with that name already exists in the directory.\n" "Please choose a unique name.\n"; uifc.msg("Entry Name Already Exists!"); + check_exit(FALSE); } else { - iniRenameSection(&inifile,itemname,tmp); - strcpy(itemname, tmp); - } - if(itemname[0]==0) { - uifc.helpbuf= "`Can Not Use and Empty Name`\n\n" - "Entry names can not be empty. Please enter an entry name.\n"; - uifc.msg("Can not use an empty name"); + if(tmp[0]==0) { + uifc.helpbuf= "`Can Not Use and Empty Name`\n\n" + "Entry names can not be empty. Please enter an entry name.\n"; + uifc.msg("Can not use an empty name"); + check_exit(FALSE); + } + else { + iniRenameSection(&inifile,itemname,tmp); + strcpy(itemname, tmp); + } } - } while(itemname[0]==0); + } while(tmp[0]==0 && !quitting); break; case 1: uifc.helpbuf=address_help; @@ -859,6 +885,7 @@ int edit_list(struct bbslist **list, struct bbslist *item,char *listpath,int isd :item->conn_type==CONN_TYPE_SHELL ? "Command" : "Address" ,item->addr,LIST_ADDR_MAX,K_EDIT); + check_exit(FALSE); iniSetString(&inifile,itemname,"Address",item->addr,&ini_style); break; case 3: @@ -869,6 +896,7 @@ int edit_list(struct bbslist **list, struct bbslist *item,char *listpath,int isd "Telnet is generally port 23, RLogin is generally 513 and SSH is\n" "generally 22\n"; uifc.input(WIN_MID|WIN_SAV,0,0,"TCP Port",str,5,K_EDIT|K_NUMBER); + check_exit(FALSE); j=atoi(str); if(j<1 || j>65535) j=conn_ports[item->conn_type]; @@ -884,6 +912,7 @@ int edit_list(struct bbslist **list, struct bbslist *item,char *listpath,int isd "Enter the username to attempt auto-login to the remote with.\n" "For SSH, this must be the SSH user name."; uifc.input(WIN_MID|WIN_SAV,0,0,"Username",item->user,MAX_USER_LEN,K_EDIT); + check_exit(FALSE); iniSetString(&inifile,itemname,"UserName",item->user,&ini_style); break; case 5: @@ -891,6 +920,7 @@ int edit_list(struct bbslist **list, struct bbslist *item,char *listpath,int isd "Enter your password for auto-login.\n" "For SSH, this must be the SSH password if it exists.\n"; uifc.input(WIN_MID|WIN_SAV,0,0,"Password",item->password,MAX_PASSWD_LEN,K_EDIT); + check_exit(FALSE); iniSetString(&inifile,itemname,"Password",item->password,&ini_style); break; case 6: @@ -900,6 +930,7 @@ int edit_list(struct bbslist **list, struct bbslist *item,char *listpath,int isd "Synchronet, or non-sysop accounts, this can be used for simple\n" "scripting."; uifc.input(WIN_MID|WIN_SAV,0,0,"System Password",item->syspass,MAX_SYSPASS_LEN,K_EDIT); + check_exit(FALSE); iniSetString(&inifile,itemname,"SystemPassword",item->syspass,&ini_style); break; case 2: @@ -908,6 +939,7 @@ int edit_list(struct bbslist **list, struct bbslist *item,char *listpath,int isd uifc.helpbuf=conn_type_help; switch(uifc.list(WIN_SAV,0,0,0,&(item->conn_type),NULL,"Connection Type",&(conn_types[1]))) { case -1: + check_exit(FALSE); item->conn_type=i; break; default: @@ -935,6 +967,7 @@ int edit_list(struct bbslist **list, struct bbslist *item,char *listpath,int isd "Select the screen size for this connection\n"; switch(uifc.list(WIN_SAV,0,0,0,&(item->screen_mode),NULL,"Screen Mode",screen_modes)) { case -1: + check_exit(FALSE); item->screen_mode=i; break; default: @@ -978,18 +1011,24 @@ int edit_list(struct bbslist **list, struct bbslist *item,char *listpath,int isd "Enter the path where downloads will be placed."; if(uifc.input(WIN_MID|WIN_SAV,0,0,"Download Path",item->dldir,MAX_PATH,K_EDIT)>=0) iniSetString(&inifile,itemname,"DownloadPath",item->dldir,&ini_style); + else + check_exit(FALSE); break; case 10: uifc.helpbuf= "`Upload Path`\n\n" "Enter the path where uploads will be browsed from."; if(uifc.input(WIN_MID|WIN_SAV,0,0,"Upload Path",item->uldir,MAX_PATH,K_EDIT)>=0) iniSetString(&inifile,itemname,"UploadPath",item->uldir,&ini_style); + else + check_exit(FALSE); break; case 11: uifc.helpbuf= "`Log Filename`\n\n" "Enter the path to the optional log file."; if(uifc.input(WIN_MID|WIN_SAV,0,0,"Log File",item->logfile,MAX_PATH,K_EDIT)>=0) iniSetString(&inifile,itemname,"LogFile",item->logfile,&ini_style); + else + check_exit(FALSE); break; case 12: item->xfer_loglevel--; @@ -1025,6 +1064,7 @@ int edit_list(struct bbslist **list, struct bbslist *item,char *listpath,int isd i=get_rate_num(item->bpsrate); switch(uifc.list(WIN_SAV,0,0,0,&i,NULL,"Comm Rate (BPS)",rate_names)) { case -1: + check_exit(FALSE); break; default: item->bpsrate=rates[i]; @@ -1059,6 +1099,8 @@ int edit_list(struct bbslist **list, struct bbslist *item,char *listpath,int isd iniSetInteger(&inifile,itemname,"ANSIMusic",item->music,&ini_style); changed=1; } + else + check_exit(FALSE); break; case 17: uifc.helpbuf=address_family_help; @@ -1068,6 +1110,8 @@ int edit_list(struct bbslist **list, struct bbslist *item,char *listpath,int isd iniSetEnum(&inifile, itemname, "AddressFamily", address_families, item->address_family, &ini_style); changed=1; } + else + check_exit(FALSE); break; case 18: uifc.helpbuf= "`Font`\n\n" @@ -1077,6 +1121,7 @@ int edit_list(struct bbslist **list, struct bbslist *item,char *listpath,int isd i=j=find_font_id(item->font); switch(uifc.list(WIN_SAV,0,0,0,&i,&j,"Font",font_names)) { case -1: + check_exit(FALSE); break; default: if(i!=find_font_id(item->font)) { @@ -1181,7 +1226,7 @@ void change_settings(void) opt[i]=opts[i]; opt[i]=NULL; - for(;;) { + for(;!quitting;) { uifc.helpbuf= "`Program Settings Menu`\n\n" "~ Confirm Program Exit ~\n" @@ -1221,6 +1266,7 @@ void change_settings(void) sprintf(opts[10],"TERM For Shell %s",settings.TERM); switch(uifc.list(WIN_MID|WIN_SAV|WIN_ACT,0,0,0,&cur,NULL,"Program Settings",opt)) { case -1: + check_exit(FALSE); goto write_ini; case 0: settings.confirm_close=!settings.confirm_close; @@ -1236,6 +1282,7 @@ void change_settings(void) "Select the screen mode/size for at startup\n"; switch(i=uifc.list(WIN_SAV,0,0,0,&j,NULL,"Startup Screen Mode",screen_modes)) { case -1: + check_exit(FALSE); continue; default: settings.startup_mode=j; @@ -1308,6 +1355,7 @@ void change_settings(void) ; switch(i=uifc.list(WIN_SAV,0,0,0,&j,NULL,"Video Output Mode",output_types)) { case -1: + check_exit(FALSE); continue; default: settings.output_mode=output_map[j]; @@ -1327,6 +1375,7 @@ void change_settings(void) if(j<1) { uifc.helpbuf= "There must be at least one line in the scrollback buffer."; uifc.msg("Cannot set lines to less than one."); + check_exit(FALSE); } else { tmpscroll=(unsigned char *)realloc(scrollback_buf,80*2*j); @@ -1334,6 +1383,7 @@ void change_settings(void) uifc.helpbuf="The selected scrollback size is too large.\n" "Please reduce the number of lines."; uifc.msg("Cannot allocate space for scrollback."); + check_exit(FALSE); } else { if(scrollback_lines > (unsigned)j) @@ -1344,6 +1394,8 @@ void change_settings(void) } } } + else + check_exit(FALSE); break; case 5: uifc.helpbuf= "`Modem/Comm Device`\n\n" @@ -1353,6 +1405,8 @@ void change_settings(void) "`\""; if(uifc.input(WIN_MID|WIN_SAV,0,0,"Modem/Comm Device",settings.mdm.device_name,INI_MAX_VALUE_LEN,K_EDIT)>=0) iniSetString(&inicontents,"SyncTERM","ModemDevice",settings.mdm.device_name,&ini_style); + else + check_exit(FALSE); break; case 6: uifc.helpbuf= "`Modem/Comm Rate`\n\n" @@ -1366,6 +1420,8 @@ void change_settings(void) settings.mdm.com_rate=strtol(str,NULL,10); iniSetLongInt(&inicontents,"SyncTERM","ModemComRate",settings.mdm.com_rate,&ini_style); } + else + check_exit(FALSE); break; case 7: @@ -1390,6 +1446,8 @@ void change_settings(void) "Disable Software Flow &I0\n"; if(uifc.input(WIN_MID|WIN_SAV,0,0,"Modem Init String",settings.mdm.init_string,INI_MAX_VALUE_LEN-1,K_EDIT)>=0) iniSetString(&inicontents,"SyncTERM","ModemInit",settings.mdm.init_string,&ini_style); + else + check_exit(FALSE); break; case 8: uifc.helpbuf= "`Modem Dial String`\n\n" @@ -1397,12 +1455,16 @@ void change_settings(void) "Example: \"`ATDT`\" will dial a Hayes-compatible modem in touch-tone mode."; if(uifc.input(WIN_MID|WIN_SAV,0,0,"Modem Dial String",settings.mdm.dial_string,INI_MAX_VALUE_LEN-1,K_EDIT)>=0) iniSetString(&inicontents,"SyncTERM","ModemDial",settings.mdm.dial_string,&ini_style); + else + check_exit(FALSE); break; case 9: uifc.helpbuf= "`List Path`\n\n" "The complete path to the BBS list goes here.\n"; if(uifc.input(WIN_MID|WIN_SAV,0,0,"List Path",settings.list_path,MAX_PATH,K_EDIT)>=0) iniSetString(&inicontents,"SyncTERM","ListPath",settings.list_path,&ini_style); + else + check_exit(FALSE); break; case 10: uifc.helpbuf= "`TERM For Shell`\n\n" @@ -1410,6 +1472,8 @@ void change_settings(void) "Example: \"`ansi`\" will select a dumb ANSI mode."; if(uifc.input(WIN_MID|WIN_SAV,0,0,"TERM",settings.TERM,LIST_NAME_MAX,K_EDIT)>=0) iniSetString(&inicontents,"SyncTERM","TERM",settings.TERM,&ini_style); + else + check_exit(FALSE); break; } } @@ -1493,8 +1557,12 @@ struct bbslist *show_bbslist(char *current, int connected) uifc.list(WIN_T2B|WIN_RHT|WIN_EXTKEYS|WIN_DYN|WIN_HLP|WIN_ACT|WIN_INACT ,0,0,0,&sopt,&sbar,"SyncTERM Settings",connected?connected_settings_menu:settings_menu); for(;;) { + if (quitting) + return NULL; if (!at_settings) { for(;!at_settings;) { + if (quitting) + return NULL; if(connected) uifc.helpbuf= "`SyncTERM Directory`\n\n" "Commands:\n\n" @@ -1592,12 +1660,8 @@ struct bbslist *show_bbslist(char *current, int connected) } break; case -1: /* ESC */ - if(!connected) { - if(settings.confirm_close && !confirm("Are you sure you want to exit?",NULL)) - continue; - } - // Fall-through - case -2-CIO_KEY_QUIT: + if (!check_exit(TRUE)) + continue; free_list(&list[0],listcount); return(NULL); } @@ -1612,6 +1676,7 @@ struct bbslist *show_bbslist(char *current, int connected) "The total combined size of loaded entries is currently the highest\n" "supported size. You must delete entries before adding more."; uifc.msg("Max List size reached!"); + check_exit(FALSE); break; } if(safe_mode) { @@ -1619,13 +1684,17 @@ struct bbslist *show_bbslist(char *current, int connected) "SyncTERM is currently running in safe mode. This means you cannot add to the\n" "directory."; uifc.msg("Cannot edit list in safe mode"); + check_exit(FALSE); break; } tmp[0]=0; uifc.changes=0; uifc.helpbuf= "`Name`\n\n" "Enter the name of the entry as it is to appear in the directory."; - uifc.input(WIN_MID|WIN_SAV,0,0,"Name",tmp,LIST_NAME_MAX,K_EDIT); + if(uifc.input(WIN_MID|WIN_SAV,0,0,"Name",tmp,LIST_NAME_MAX,K_EDIT)==-1) { + if (check_exit(FALSE)) + break; + } if(!uifc.changes) break; if(list_name_check(list, tmp, NULL, FALSE)) { @@ -1633,6 +1702,7 @@ struct bbslist *show_bbslist(char *current, int connected) "An entry with that name already exists in the directory.\n" "Please choose a unique name.\n"; uifc.msg("Entry Name Already Exists!"); + check_exit(FALSE); break; } listcount++; @@ -1659,6 +1729,10 @@ struct bbslist *show_bbslist(char *current, int connected) } uifc.changes=1; } + else { + if (check_exit(FALSE)) + break; + } if(uifc.changes) { uifc.changes=0; @@ -1669,8 +1743,9 @@ struct bbslist *show_bbslist(char *current, int connected) :list[listcount-1]->conn_type==CONN_TYPE_SHELL ? "Command" :"Address" ,list[listcount-1]->addr,LIST_ADDR_MAX,K_EDIT); + check_exit(FALSE); } - if(!uifc.changes) { + if(quitting || !uifc.changes) { FREE_AND_NULL(list[listcount-1]); list[listcount-1]=list[listcount]; listcount--; @@ -1696,6 +1771,7 @@ struct bbslist *show_bbslist(char *current, int connected) "Reach over to your fridge, grab a cold one...\n" "Watch the seagulls in their dance...\n"; uifc.msg("It's gone, calm down man!"); + check_exit(FALSE); break; } if(safe_mode) { @@ -1703,12 +1779,14 @@ struct bbslist *show_bbslist(char *current, int connected) "SyncTERM is currently running in safe mode. This means you cannot remove from the\n" "directory."; uifc.msg("Cannot edit list in safe mode"); + check_exit(FALSE); break; } if(list[opt]->type==SYSTEM_BBSLIST) { uifc.helpbuf= "`Cannot delete from system list`\n\n" "This entry was loaded from the system-wide list and cannot be deleted."; uifc.msg("Cannot delete system list entries"); + check_exit(FALSE); break; } sprintf(str,"Delete %s?",list[opt]->name); @@ -1725,6 +1803,7 @@ struct bbslist *show_bbslist(char *current, int connected) "SyncTERM is currently running in safe mode. This means you cannot edit the\n" "directory."; uifc.msg("Cannot edit list in safe mode"); + check_exit(FALSE); break; } if(edit_list(list, list[opt],settings.list_path,FALSE)) { @@ -1741,6 +1820,7 @@ struct bbslist *show_bbslist(char *current, int connected) "SyncTERM is currently running in safe mode. This means you cannot edit the\n" "directory."; uifc.msg("Cannot edit list in safe mode"); + check_exit(FALSE); } else if(edit_list(list, list[opt],settings.list_path,FALSE)) { load_bbslist(list, sizeof(list), &defaults, settings.list_path, sizeof(settings.list_path), shared_list, sizeof(shared_list), &listcount, &opt, &bar, list[opt]?strdup(list[opt]->name):NULL); @@ -1756,7 +1836,7 @@ struct bbslist *show_bbslist(char *current, int connected) } } else { - for(;at_settings;) { + for(;at_settings && !quitting;) { uifc.helpbuf= "`SyncTERM Settings Menu`\n\n" "~ Default Connection Settings ~\n" " Modify the settings that are used by default for new entries\n\n" @@ -1799,12 +1879,8 @@ struct bbslist *show_bbslist(char *current, int connected) at_settings=!at_settings; break; case -1: /* ESC */ - if(!connected) { - if(settings.confirm_close && !confirm("Are you sure you want to exit?",NULL)) - continue; - } - // Fall-through - case -2-CIO_KEY_QUIT: + if (!check_exit(TRUE)) + continue; free_list(&list[0],listcount); return(NULL); case 0: /* Edit default connection settings */ @@ -1815,6 +1891,7 @@ struct bbslist *show_bbslist(char *current, int connected) uifc.helpbuf= "Mouse actions are not yet user conifurable." "This item is here to remind me to implement it."; uifc.msg("This section not yet functional"); + check_exit(FALSE); break; #endif case 1: { /* Screen Mode */ @@ -1839,7 +1916,7 @@ struct bbslist *show_bbslist(char *current, int connected) |WIN_SEL|WIN_INACT ,0,0,0,&opt,&bar,"Directory",(char **)list); } - else if (i==-2-CIO_KEY_QUIT) { + else if (check_exit(FALSE)) { free_list(&list[0],listcount); return(NULL); } diff --git a/src/syncterm/fonts.c b/src/syncterm/fonts.c index 7debb4c0845b6373486f9f17b67490f305fa2483..4fa1ad621c81ddb972c25042e3ade6ec4d81c73b 100644 --- a/src/syncterm/fonts.c +++ b/src/syncterm/fonts.c @@ -78,6 +78,7 @@ void save_font_files(struct font_files *fonts) else { uifc.helpbuf="There was an error writing the INI file.\nCheck permissions and try again.\n"; uifc.msg("Cannot write to the .ini file!"); + check_exit(FALSE); } strListFree(&fontnames); @@ -238,7 +239,7 @@ void font_management(void) fonts=read_font_files(&count); opts[4][0]=0; - for(;;) { + for(;!quitting;) { uifc.helpbuf= "`Font Management`\n\n" "Allows you to add and remove font files to/from the default font set.\n\n" "`INS` Adds a new font.\n" @@ -256,11 +257,12 @@ void font_management(void) } i=uifc.list(WIN_SAV|WIN_INS|WIN_INSACT|WIN_DEL|WIN_XTR|WIN_ACT,0,0,0,&cur,&bar,"Font Management",opt); if(i==-1) { + check_exit(FALSE); save_font_files(fonts); free_font_files(fonts); return; } - for(;;) { + for(;!quitting;) { char *fontmask; int show_filepick=0; char **path; @@ -277,12 +279,15 @@ void font_management(void) if(i&MSK_INS) { str[0]=0; uifc.helpbuf="Enter the name of the font as you want it to appear\nin menus."; - if(uifc.input(WIN_SAV|WIN_MID,0,0,"Font Name",str,50,0)==-1) + if(uifc.input(WIN_SAV|WIN_MID,0,0,"Font Name",str,50,0)==-1) { + check_exit(FALSE); break; + } count++; tmp=(struct font_files *)realloc(fonts, sizeof(struct font_files)*(count+1)); if(tmp==NULL) { uifc.msg("realloc() failure, cannot add font."); + check_exit(FALSE); count--; break; } @@ -303,16 +308,21 @@ void font_management(void) sprintf(opts[3],"8x16 %.50s",fonts[cur].path8x16?fonts[cur].path8x16:"<undefined>"); opts[4][0]=0; i=uifc.list(WIN_SAV|WIN_ACT|WIN_INS|WIN_INSACT|WIN_DEL|WIN_RHT|WIN_BOT,0,0,0,&fcur,&fbar,"Font Details",opt); - if(i==-1) + if(i==-1) { + check_exit(FALSE); break; + } switch(i) { case 0: SAFECOPY(str,fonts[cur].name); FREE_AND_NULL(fonts[cur].name); uifc.helpbuf="Enter the name of the font as you want it to appear\nin menus."; - uifc.input(WIN_SAV|WIN_MID,0,0,"Font Name",str,50,K_EDIT); - fonts[cur].name=strdup(str); - show_filepick=0; + if (uifc.input(WIN_SAV|WIN_MID,0,0,"Font Name",str,50,K_EDIT)==-1) + check_exit(FALSE); + else { + fonts[cur].name=strdup(str); + show_filepick=0; + } break; case 1: sprintf(str,"8x8 %.50s",fonts[cur].name); @@ -344,6 +354,7 @@ void font_management(void) if(savbuf==NULL) { uifc.helpbuf="malloc() has failed. Available Memory is dangerously low."; uifc.msg("malloc() failure."); + check_exit(FALSE); continue; } gettext(1,2,ti.screenwidth,ti.screenheight-1,savbuf); @@ -352,6 +363,8 @@ void font_management(void) FREE_AND_NULL(*path); *(path)=strdup(fpick.selected[0]); } + else + check_exit(FALSE); filepick_free(&fpick); puttext(1,2,ti.screenwidth,ti.screenheight-1,savbuf); } diff --git a/src/syncterm/menu.c b/src/syncterm/menu.c index 423887fa397672bcf32cbfd19d979344f7b1653b..49731624ef272fdeeccadb21543277fd08e02978 100644 --- a/src/syncterm/menu.c +++ b/src/syncterm/menu.c @@ -40,7 +40,7 @@ void viewscroll(void) top=cterm->backpos; gotoxy(1,1); textattr(uifc.hclr|(uifc.bclr<<4)|BLINK); - for(i=0;!i;) { + for(i=0;(!i) && (!quitting);) { if(top<1) top=1; if(top>cterm->backpos) @@ -57,6 +57,9 @@ void viewscroll(void) case 0xff: case 0: switch(key|getch()<<8) { + case CIO_KEY_QUIT: + check_exit(TRUE); + break; case CIO_KEY_MOUSE: getmouse(&mevent); switch(mevent.event) { @@ -85,6 +88,7 @@ void viewscroll(void) "~ H ~ or ~ Page Up ~ Scrolls up one screen\n" "~ L ~ or ~ Page Down ~ Scrolls down one screen\n"; uifc.showhelp(); + check_exit(FALSE); uifcbail(); drawwin(); break; @@ -153,7 +157,7 @@ int syncmenu(struct bbslist *bbs, int *speed) opts[1]="Disconnect ("ALT_KEY_NAMEP"-H)"; } - for(ret=0;!ret;) { + for(ret=0;(!ret) && (!quitting);) { init_uifc(FALSE, !(bbs->nostatus)); uifc.helpbuf= "`Online Menu`\n\n" "`Scrollback` Allows to you to view the scrollback buffer\n" @@ -174,6 +178,7 @@ int syncmenu(struct bbslist *bbs, int *speed) i=uifc.list(WIN_MID|WIN_SAV,0,0,0,&opt,NULL,"SyncTERM Online Menu",opts); switch(i) { case -1: /* Cancel */ + check_exit(FALSE); ret=1; break; case 0: /* Scrollback */ @@ -198,9 +203,10 @@ int syncmenu(struct bbslist *bbs, int *speed) } break; case 5: /* Output rate */ - if(bbs->conn_type==CONN_TYPE_MODEM || bbs->conn_type==CONN_TYPE_SERIAL) + if(bbs->conn_type==CONN_TYPE_MODEM || bbs->conn_type==CONN_TYPE_SERIAL) { uifcmsg("Not supported for this connection type" ,"Cannot change the display rate for Modem/Serial connections."); + } else if(speed != NULL) { j=get_rate_num(*speed); uifc.helpbuf="`Output Rate`\n\n" @@ -208,6 +214,8 @@ int syncmenu(struct bbslist *bbs, int *speed) "data on the screen. This rate is a maximum, not guaranteed to be attained\n" "In general, you will only use this option for ANSI animations."; i=uifc.list(WIN_MID|WIN_SAV,0,0,0,&j,NULL,"Output Rate",rate_names); + if (i==-1) + check_exit(FALSE); if(i>=0) *speed = rates[i]; } @@ -220,6 +228,8 @@ int syncmenu(struct bbslist *bbs, int *speed) "window. For the selected log level, messages of that level and those above\n" "it will be displayed."; i=uifc.list(WIN_MID|WIN_SAV,0,0,0,&j,NULL,"Log Level",log_levels); + if (i==-1) + check_exit(FALSE); if(i>=0) log_level = j; ret=6; diff --git a/src/syncterm/syncterm.c b/src/syncterm/syncterm.c index 2a773ba014d1807d83de157b7f76c6e884ad416d..306c99fdac13fd59d48a41c679f750c92025e59c 100644 --- a/src/syncterm/syncterm.c +++ b/src/syncterm/syncterm.c @@ -100,6 +100,7 @@ unsigned int scrollback_cols=80; int safe_mode=0; FILE* log_fp; extern ini_style_t ini_style; +BOOL quitting=FALSE; #ifdef _WINSOCKAPI_ @@ -770,6 +771,19 @@ char *output_enum[]={ ,"SDLOverlayFullscreen" ,NULL}; +BOOL check_exit(BOOL force) +{ + if (force || (uifc.exit_flags & UIFC_XF_QUIT)) { + if (settings.confirm_close) { + if (!confirm("Are you sure you want to exit?",NULL)) + return false; + } + quitting=TRUE; + return TRUE; + } + return FALSE; +} + void parse_url(char *url, struct bbslist *bbs, int dflt_conn_type, int force_defaults) { char *p1, *p2, *p3; @@ -1506,7 +1520,7 @@ int main(int argc, char **argv) return(1); load_font_files(); - while(bbs!=NULL || (bbs=show_bbslist(last_bbs, FALSE))!=NULL) { + while((!quitting) && (bbs!=NULL || (bbs=show_bbslist(last_bbs, FALSE))!=NULL)) { gettextinfo(&txtinfo); /* Current mode may have changed while in show_bbslist() */ FREE_AND_NULL(last_bbs); if(!conn_connect(bbs)) { @@ -1548,7 +1562,8 @@ int main(int argc, char **argv) fprintf(log_fp,"%.15s Log opened\n", ctime(&now)+4); } - exit_now=doterm(bbs); + if(doterm(bbs)) + quitting=TRUE; setvideoflags(0); if(log_fp!=NULL) { @@ -1568,7 +1583,7 @@ int main(int argc, char **argv) } settitle("SyncTERM"); } - if(exit_now || url[0]) { + if(quitting || url[0]) { if(bbs != NULL && bbs->id==-1) { if(!safe_mode) { if(settings.prompt_save) { diff --git a/src/syncterm/syncterm.h b/src/syncterm/syncterm.h index 5e42cffce0e2d559b7c57173838d31b5ef9c2521..5aaca55d76a55a28ad1a719d46ad59b2ca96ef85 100644 --- a/src/syncterm/syncterm.h +++ b/src/syncterm/syncterm.h @@ -66,17 +66,20 @@ extern unsigned int scrollback_lines; extern unsigned int scrollback_mode; extern unsigned int scrollback_cols; extern struct syncterm_settings settings; -void parse_url(char *url, struct bbslist *bbs, int dflt_conn_type, int force_defaults); +extern BOOL quitting; extern int default_font; extern char *font_names[]; extern int safe_mode; -char *get_syncterm_filename(char *fn, int fnlen, int type, int shared); -void load_settings(struct syncterm_settings *set); extern char *output_types[]; extern int output_map[]; extern char *output_descrs[]; extern char *output_enum[]; + +void parse_url(char *url, struct bbslist *bbs, int dflt_conn_type, int force_defaults); +char *get_syncterm_filename(char *fn, int fnlen, int type, int shared); +void load_settings(struct syncterm_settings *set); int ciolib_to_screen(int screen); int screen_to_ciolib(int ciolib); +BOOL check_exit(BOOL force); #endif diff --git a/src/syncterm/term.c b/src/syncterm/term.c index 8b79af80d382a5846e7e463db57951a276bb6fb5..7fa7292ab841efc2a2bd8940c765f800cc4224ff 100644 --- a/src/syncterm/term.c +++ b/src/syncterm/term.c @@ -302,6 +302,11 @@ static BOOL zmodem_check_abort(void* vp) time_t now=time(NULL); int key; + if (quitting) { + zm->cancelled=TRUE; + zm->local_abort=TRUE; + return TRUE; + } if(last_check != now) { last_check=now; if(zm!=NULL) { @@ -318,6 +323,12 @@ static BOOL zmodem_check_abort(void* vp) key |= (getch() << 8); if(key==CIO_KEY_MOUSE) getmouse(NULL); + if (key==CIO_KEY_QUIT) { + if (check_exit(FALSE)) { + zm->cancelled=TRUE; + zm->local_abort=TRUE; + } + } break; } } @@ -712,6 +723,7 @@ void begin_upload(struct bbslist *bbs, BOOL autozm, int lastch) result=filepick(&uifc, "Upload", &fpick, bbs->uldir, NULL, UIFC_FP_ALLOWENTRY); if(result==-1 || fpick.files<1) { + check_exit(FALSE); filepick_free(&fpick); uifcbail(); puttext(1,1,txtinfo.screenwidth,txtinfo.screenheight,buf); @@ -791,6 +803,9 @@ void begin_download(struct bbslist *bbs) uifc.helpbuf="Select Protocol"; hold_update=FALSE; switch(uifc.list(WIN_MID|WIN_SAV,0,0,0,&i,NULL,"Protocol",opts)) { + case -1: + check_exit(FALSE); + break; case 0: zmodem_download(bbs); break; @@ -999,6 +1014,7 @@ void guts_transfer(struct bbslist *bbs) result=filepick(&uifc, "Upload", &fpick, bbs->uldir, NULL, UIFC_FP_ALLOWENTRY); if(result==-1 || fpick.files<1) { + check_exit(FALSE); filepick_free(&fpick); uifcbail(); setup_mouse_events(); @@ -1125,7 +1141,10 @@ void zmodem_upload(struct bbslist *bbs, FILE *fp, char *path) lprintf(LOG_NOTICE,"Hit any key to continue..."); if(log_fp!=NULL) fflush(log_fp); - getch(); + if (getch()==0) { + if (getch()<<8 == CIO_KEY_QUIT) + check_exit(FALSE); + } erase_transfer_window(); } @@ -1160,6 +1179,13 @@ BOOL zmodem_duplicate_callback(void *cbdata, void *zm_void) i=0; uifc.helpbuf="Duplicate file... choose action\n"; switch(uifc.list(WIN_MID|WIN_SAV,0,0,0,&i,NULL,"Duplicate File Name",opts)) { + case -1: + if (check_exit(FALSE)) { + ret=FALSE; + break; + } + loop=TRUE; + break; case 0: /* Overwrite */ sprintf(fpath,"%s/%s",cb->bbs->dldir,zm->current_file_name); unlink(fpath); @@ -1228,7 +1254,10 @@ void zmodem_download(struct bbslist *bbs) lprintf(LOG_NOTICE,"Hit any key to continue..."); if(log_fp!=NULL) fflush(log_fp); - getch(); + if (getch()==0) { + if (getch()<<8 == CIO_KEY_QUIT) + check_exit(FALSE); + } erase_transfer_window(); } @@ -1249,6 +1278,11 @@ static BOOL xmodem_check_abort(void* vp) if (xm == NULL) return FALSE; + if (quitting) { + xm->cancelled=TRUE; + return TRUE; + } + if(last_check != now) { last_check=now; while(kbhit()) { @@ -1263,6 +1297,10 @@ static BOOL xmodem_check_abort(void* vp) key |= (getch() << 8); if(key==CIO_KEY_MOUSE) getmouse(NULL); + if (key==CIO_KEY_QUIT) { + if (check_exit(FALSE)) + xm->cancelled=TRUE; + } break; } } @@ -1503,7 +1541,10 @@ void xmodem_upload(struct bbslist *bbs, FILE *fp, char *path, long mode, int las lprintf(LOG_NOTICE,"Hit any key to continue..."); if(log_fp!=NULL) fflush(log_fp); - getch(); + if (getch()==0) { + if (getch()<<8 == CIO_KEY_QUIT) + check_exit(FALSE); + } erase_transfer_window(); } @@ -1537,6 +1578,13 @@ BOOL xmodem_duplicate(xmodem_t *xm, struct bbslist *bbs, char *path, size_t path i=0; uifc.helpbuf="Duplicate file... choose action\n"; switch(uifc.list(WIN_MID|WIN_SAV,0,0,0,&i,NULL,"Duplicate File Name",opts)) { + case -1: + if (check_exit(FALSE)) { + ret=FALSE; + break; + } + loop=TRUE; + break; case 0: /* Overwrite */ unlink(path); ret=TRUE; @@ -1858,7 +1906,10 @@ end: lprintf(LOG_NOTICE,"Hit any key to continue..."); if(log_fp!=NULL) fflush(log_fp); - getch(); + if (getch()==0) { + if (getch()<<8 == CIO_KEY_QUIT) + check_exit(FALSE); + } erase_transfer_window(); } @@ -1904,6 +1955,8 @@ void music_control(struct bbslist *bbs) "according to the ANSI spec. Specifically ESC[|."; if(uifc.list(WIN_MID|WIN_SAV,0,0,0,&i,NULL,"ANSI Music Setup",opts)!=-1) cterm->music_enable=i; + else + check_exit(FALSE); uifcbail(); setup_mouse_events(); puttext(1,1,txtinfo.screenwidth,txtinfo.screenheight,buf); @@ -1934,6 +1987,7 @@ void font_control(struct bbslist *bbs) case CIOLIB_MODE_ANSI: uifcmsg("Not supported in this video output mode." ,"Font cannot be changed in the current video output mode"); + check_exit(FALSE); break; default: i=j=getfont(); @@ -1944,6 +1998,7 @@ void font_control(struct bbslist *bbs) if(k & MSK_INS) { struct file_pick fpick; j=filepick(&uifc, "Load Font From File", &fpick, ".", NULL, 0); + check_exit(FALSE); if(j!=-1 && fpick.files>=1) loadfont(fpick.selected[0]); @@ -1957,6 +2012,8 @@ void font_control(struct bbslist *bbs) enable_xlat = TRUE; } } + else + check_exit(FALSE); break; } uifcbail(); @@ -1997,11 +2054,14 @@ void capture_control(struct bbslist *bbs) "Don't do that though. :-)"; if(uifc.list(WIN_MID|WIN_SAV,0,0,0,&i,NULL,"Capture Type",opts)!=-1) { j=filepick(&uifc, "Capture File", &fpick, bbs->dldir, NULL, UIFC_FP_ALLOWENTRY); + check_exit(FALSE); if(j!=-1 && fpick.files>=1) cterm_openlog(cterm, fpick.selected[0], i?CTERM_LOG_RAW:CTERM_LOG_ASCII); filepick_free(&fpick); } + else + check_exit(FALSE); } else { if(cterm->log & CTERM_LOG_PAUSED) { @@ -2015,6 +2075,9 @@ void capture_control(struct bbslist *bbs) "~ Close ~ Closes the log\n\n"; if(uifc.list(WIN_MID|WIN_SAV,0,0,0,&i,NULL,"Capture Control",opts)!=-1) { switch(i) { + case -1: + check_exit(FALSE); + break; case 0: cterm->log=cterm->log & CTERM_LOG_MASK; break; @@ -2035,6 +2098,9 @@ void capture_control(struct bbslist *bbs) "~ Close ~ Closes the log\n\n"; if(uifc.list(WIN_MID|WIN_SAV,0,0,0,&i,NULL,"Capture Control",opts)!=-1) { switch(i) { + case -1: + check_exit(FALSE); + break; case 0: cterm->log=cterm->log |= CTERM_LOG_PAUSED; break; @@ -2267,7 +2333,7 @@ BOOL doterm(struct bbslist *bbs) /* Main input loop */ oldmc=hold_update; showmouse(); - for(;;) { + for(;!quitting;) { hold_update=TRUE; sleep=TRUE; if(!term.nostatus) @@ -2293,6 +2359,7 @@ BOOL doterm(struct bbslist *bbs) } #endif uifcmsg("Disconnected","`Disconnected`\n\nRemote host dropped connection"); + check_exit(FALSE); cterm_clearscreen(cterm, cterm->attr); /* Clear screen into scrollback */ scrollback_lines=cterm->backpos; cterm_end(cterm); @@ -2461,20 +2528,24 @@ BOOL doterm(struct bbslist *bbs) hold_update=oldmc; /* Get local input */ - while(kbhit()) { + while(quitting || kbhit()) { struct mouse_event mevent; updated=TRUE; gotoxy(wherex(), wherey()); - key=getch(); - if(key==0 || key==0xff) { - key|=getch()<<8; - if(cterm->doorway_mode && ((key & 0xff) == 0) && key != 0x2c00 /* ALT-Z */) { - ch[0]=0; - ch[1]=key>>8; - conn_send(ch,2,0); - key=0; - continue; + if (quitting) + key = CIO_KEY_QUIT; + else { + key=getch(); + if(key==0 || key==0xff) { + key|=getch()<<8; + if(cterm->doorway_mode && ((key & 0xff) == 0) && key != 0x2c00 /* ALT-Z */) { + ch[0]=0; + ch[1]=key>>8; + conn_send(ch,2,0); + key=0; + continue; + } } } @@ -2586,24 +2657,14 @@ BOOL doterm(struct bbslist *bbs) break; } /* FALLTHROUGH for curses/ansi modes */ - case CIO_KEY_QUIT: case 0x2d00: /* Alt-X - Exit */ + case CIO_KEY_QUIT: + if(!check_exit(TRUE)) + break; + // Fallthrough case 0x2300: /* Alt-H - Hangup */ { - char *opts[3]={ - "Yes" - ,"No" - ,"" - }; - char *buf; - - gettextinfo(&txtinfo); - buf=(char *)malloc(txtinfo.screenheight*txtinfo.screenwidth*2); - gettext(1,1,txtinfo.screenwidth,txtinfo.screenheight,buf); - i=0; - init_uifc(FALSE, FALSE); - uifc.helpbuf="Selecting Yes closes the connection\n"; - if(uifc.list(WIN_MID|WIN_SAV,0,0,0,&i,NULL,"Disconnect... Are you sure?",opts)==0) { + if(quitting || confirm("Disconnect... Are you sure?", "Selecting Yes closes the connection\n")) { #ifdef WITH_WXWIDGETS if(html_mode != HTML_MODE_HIDDEN) { hide_html(); @@ -2611,7 +2672,6 @@ BOOL doterm(struct bbslist *bbs) html_mode=HTML_MODE_HIDDEN; } #endif - uifcbail(); setup_mouse_events(); cterm_clearscreen(cterm,cterm->attr); /* Clear screen into scrollback */ scrollback_lines=cterm->backpos; @@ -2619,13 +2679,9 @@ BOOL doterm(struct bbslist *bbs) conn_close(); hidemouse(); hold_update=oldmc; - free(buf); return(key==0x2d00 /* Alt-X? */ || key == CIO_KEY_QUIT); } - uifcbail(); setup_mouse_events(); - puttext(1,1,txtinfo.screenwidth,txtinfo.screenheight,buf); - free(buf); window(txtinfo.winleft,txtinfo.wintop,txtinfo.winright,txtinfo.winbottom); textattr(txtinfo.attribute); gotoxy(txtinfo.curx,txtinfo.cury); diff --git a/src/syncterm/uifcinit.c b/src/syncterm/uifcinit.c index ac53827bad1275e3a7c2c08d20b5ec505968bede..3b0aa5bce5dd546efe04028cf1b7cf895c582bfa 100644 --- a/src/syncterm/uifcinit.c +++ b/src/syncterm/uifcinit.c @@ -95,6 +95,7 @@ void uifcmsg(char *msg, char *helpbuf) if(uifc_initialized) { uifc.helpbuf=helpbuf; uifc.msg(msg); + check_exit(FALSE); } else fprintf(stderr,"%s\n",msg); @@ -120,6 +121,7 @@ void uifcinput(char *title, int len, char *msg, int mode, char *helpbuf) if(uifc_initialized) { uifc.helpbuf=helpbuf; uifc.input(WIN_MID|WIN_SAV, 0, 0, title, msg, len, mode); + check_exit(FALSE); } else fprintf(stderr,"%s\n",msg); @@ -150,8 +152,10 @@ int confirm(char *msg, char *helpbuf) init_uifc(FALSE, FALSE); if(uifc_initialized) { uifc.helpbuf=helpbuf; - if(uifc.list(WIN_MID|WIN_SAV,0,0,0,&copt,NULL,msg,options)!=0) + if(uifc.list(WIN_MID|WIN_SAV,0,0,0,&copt,NULL,msg,options)!=0) { + check_exit(FALSE); ret=FALSE; + } } if(!i) { uifcbail();