Close On Exit and Warn On Close fixes: (a) pty_reconfig needs to
[u/mdw/putty] / unix / pterm.c
index 14fb45d..f2e8b12 100644 (file)
@@ -93,8 +93,7 @@ char *x_get_default(const char *key)
 
 void connection_fatal(void *frontend, char *p, ...)
 {
-    Terminal *term = (Terminal *)frontend;
-    struct gui_data *inst = (struct gui_data *)term->frontend;
+    struct gui_data *inst = (struct gui_data *)frontend;
 
     va_list ap;
     char *msg;
@@ -153,21 +152,15 @@ void ldisc_update(void *frontend, int echo, int edit)
      */
 }
 
-int askappend(void *frontend, Filename filename)
+int from_backend(void *frontend, int is_stderr, const char *data, int len)
 {
-    /*
-     * Logging in an xterm-alike is liable to be something you only
-     * do at serious diagnostic need. Hence, I'm going to take the
-     * easy option for now and assume we always want to overwrite
-     * log files. I can always make it properly configurable later.
-     */
-    return 2;
+    struct gui_data *inst = (struct gui_data *)frontend;
+    return term_data(inst->term, is_stderr, data, len);
 }
 
 void logevent(void *frontend, char *string)
 {
-    Terminal *term = (Terminal *)frontend;
-    struct gui_data *inst = (struct gui_data *)term->frontend;
+    struct gui_data *inst = (struct gui_data *)frontend;
 
     log_eventlog(inst->logctx, string);
 
@@ -212,8 +205,7 @@ static Mouse_Button translate_button(Mouse_Button button)
  */
 void *get_window(void *frontend)
 {
-    Terminal *term = (Terminal *)frontend;
-    struct gui_data *inst = (struct gui_data *)term->frontend;
+    struct gui_data *inst = (struct gui_data *)frontend;
     return inst->window;
 }
 
@@ -349,10 +341,11 @@ char *get_window_title(void *frontend, int icon)
 
 gint delete_window(GtkWidget *widget, GdkEvent *event, gpointer data)
 {
-    /*
-     * We could implement warn-on-close here if we really wanted
-     * to.
-     */
+    struct gui_data *inst = (struct gui_data *)data;
+    if (!inst->exited && inst->cfg.warn_on_close) {
+       if (!reallyclose(inst))
+           return TRUE;
+    }
     return FALSE;
 }
 
@@ -1312,6 +1305,9 @@ void write_clip(void *frontend, wchar_t * data, int len, int must_deselect)
            gtk_selection_add_target(inst->area, GDK_SELECTION_PRIMARY,
                                     utf8_string_atom, 1);
     }
+
+    if (must_deselect)
+       term_deselect(inst->term);
 }
 
 void selection_get(GtkWidget *widget, GtkSelectionData *seldata,
@@ -1977,8 +1973,7 @@ char *get_x_display(void *frontend)
 
 long get_windowid(void *frontend)
 {
-    Terminal *term = (Terminal *)frontend;
-    struct gui_data *inst = (struct gui_data *)(term->frontend);
+    struct gui_data *inst = (struct gui_data *)frontend;
     return (long)GDK_WINDOW_XWINDOW(inst->area->window);
 }
 
@@ -2504,8 +2499,6 @@ void change_settings_menuitem(GtkMenuItem *item, gpointer data)
             oldcfg.window_border != cfg2.window_border || need_size) {
             set_geom_hints(inst);
             request_resize(inst, cfg2.width, cfg2.height);
-            //term_size(inst->term, cfg2.height, cfg2.width, cfg2.savelines);
-            // where TF is our configure event going?!
         }
 
         term_invalidate(inst->term);
@@ -2515,8 +2508,7 @@ void change_settings_menuitem(GtkMenuItem *item, gpointer data)
 
 void update_specials_menu(void *frontend)
 {
-    Terminal *term = (Terminal *)frontend;
-    struct gui_data *inst = (struct gui_data *)term->frontend;
+    struct gui_data *inst = (struct gui_data *)frontend;
 
     const struct telnet_special *specials;
 
@@ -2733,7 +2725,7 @@ int pt_main(int argc, char **argv)
     {
        char *realhost, *error;
 
-       error = inst->back->init((void *)inst->term, &inst->backhandle,
+       error = inst->back->init((void *)inst, &inst->backhandle,
                                  &inst->cfg, inst->cfg.host, inst->cfg.port,
                                  &realhost, inst->cfg.tcp_nodelay);
 
@@ -2755,7 +2747,7 @@ int pt_main(int argc, char **argv)
         }
     }
     inst->back->provide_logctx(inst->backhandle, inst->logctx);
-    update_specials_menu(inst->term);
+    update_specials_menu(inst);
 
     term_provide_resize_fn(inst->term, inst->back->size, inst->backhandle);