X-Git-Url: https://git.distorted.org.uk/~mdw/sgt/putty/blobdiff_plain/2425184bb0dd4cf3924f717c0b07c2ca6e7da4e6..c6ccd5c22a25aca610b0120b3eec1e6efd1aab97:/unix/gtkwin.c?ds=inline diff --git a/unix/gtkwin.c b/unix/gtkwin.c index 93cc68e9..2f4943d8 100644 --- a/unix/gtkwin.c +++ b/unix/gtkwin.c @@ -95,6 +95,7 @@ struct gui_data { char *progname, **gtkargvstart; int ngtkargs; guint32 input_event_time; /* Timestamp of the most recent input event. */ + int reconfiguring; }; struct draw_ctx { @@ -176,6 +177,12 @@ void ldisc_update(void *frontend, int echo, int edit) */ } +char *get_ttymode(void *frontend, const char *mode) +{ + struct gui_data *inst = (struct gui_data *)frontend; + return term_get_ttymode(inst->term, mode); +} + int from_backend(void *frontend, int is_stderr, const char *data, int len) { struct gui_data *inst = (struct gui_data *)frontend; @@ -2560,7 +2567,11 @@ int do_cmdline(int argc, char **argv, int do_everything, } else if(!strcmp(p, "-help") || !strcmp(p, "--help")) { help(stdout); exit(0); - + + } else if (!strcmp(p, "-pgpfp")) { + pgp_fingerprints(); + exit(1); + } else if(p[0] != '-' && (!do_everything || process_nonoption_arg(p, cfg))) { /* do nothing */ @@ -2878,6 +2889,11 @@ void change_settings_menuitem(GtkMenuItem *item, gpointer data) assert(lenof(ww) == NCFGCOLOURS); + if (inst->reconfiguring) + return; + else + inst->reconfiguring = TRUE; + cfg2 = inst->cfg; /* structure copy */ if (do_config_box(title, &cfg2, 1, @@ -2995,6 +3011,7 @@ void change_settings_menuitem(GtkMenuItem *item, gpointer data) gtk_widget_queue_draw(inst->area); } sfree(title); + inst->reconfiguring = FALSE; } void fork_and_exec_self(struct gui_data *inst, int fd_to_close, ...) @@ -3215,6 +3232,33 @@ void saved_session_freedata(GtkMenuItem *item, gpointer data) sfree(str); } +static void update_savedsess_menu(GtkMenuItem *menuitem, gpointer data) +{ + struct gui_data *inst = (struct gui_data *)data; + struct sesslist sesslist; + int i; + + gtk_container_foreach(GTK_CONTAINER(inst->sessionsmenu), + (GtkCallback)gtk_widget_destroy, NULL); + + get_sesslist(&sesslist, TRUE); + for (i = 1; i < sesslist.nsessions; i++) { + GtkWidget *menuitem = + gtk_menu_item_new_with_label(sesslist.sessions[i]); + gtk_container_add(GTK_CONTAINER(inst->sessionsmenu), menuitem); + gtk_widget_show(menuitem); + gtk_object_set_data(GTK_OBJECT(menuitem), "user-data", + dupstr(sesslist.sessions[i])); + gtk_signal_connect(GTK_OBJECT(menuitem), "activate", + GTK_SIGNAL_FUNC(saved_session_menuitem), + inst); + gtk_signal_connect(GTK_OBJECT(menuitem), "destroy", + GTK_SIGNAL_FUNC(saved_session_freedata), + inst); + } + get_sesslist(&sesslist, FALSE); /* free up */ +} + void update_specials_menu(void *frontend) { struct gui_data *inst = (struct gui_data *)frontend; @@ -3494,28 +3538,10 @@ int pt_main(int argc, char **argv) gtk_widget_hide(inst->restartitem); MKMENUITEM("Duplicate Session", dup_session_menuitem); if (saved_sessions) { - struct sesslist sesslist; - int i; - inst->sessionsmenu = gtk_menu_new(); - - get_sesslist(&sesslist, TRUE); - for (i = 1; i < sesslist.nsessions; i++) { - menuitem = gtk_menu_item_new_with_label(sesslist.sessions[i]); - gtk_container_add(GTK_CONTAINER(inst->sessionsmenu), menuitem); - gtk_widget_show(menuitem); - gtk_object_set_data(GTK_OBJECT(menuitem), "user-data", - dupstr(sesslist.sessions[i])); - gtk_signal_connect(GTK_OBJECT(menuitem), "activate", - GTK_SIGNAL_FUNC(saved_session_menuitem), - inst); - gtk_signal_connect(GTK_OBJECT(menuitem), "destroy", - GTK_SIGNAL_FUNC(saved_session_freedata), - inst); - } - get_sesslist(&sesslist, FALSE); - - MKMENUITEM("Saved Sessions", NULL); + /* sessionsmenu will be updated when it's invoked */ + /* XXX is this the right way to do dynamic menus in Gtk? */ + MKMENUITEM("Saved Sessions", update_savedsess_menu); gtk_menu_item_set_submenu(GTK_MENU_ITEM(menuitem), inst->sessionsmenu); }