First crack at `terminal-modes' in SSH. PuTTY now sends ERASE by default,
[u/mdw/putty] / macosx / osxwin.m
index 0b0c3ff..f3cba03 100644 (file)
      */
     [self center];                    /* :-) */
 
+    exited = FALSE;
+
     return self;
 }
 
      * Do so.
      */
     sfree(alert_ctx);
+    if (back)
+       back->free(backhandle);
+    if (ldisc)
+       ldisc_free(ldisc);
+    /* ldisc must be freed before term, since ldisc_free expects term
+     * still to be around. */
+    if (logctx)
+       log_free(logctx);
+    if (term)
+       term_free(term);
     [super dealloc];
 }
 
     char coutput[32];
     int use_coutput = FALSE, special = FALSE, start, end;
 
-printf("n=%d c=U+%04x cm=U+%04x m=%08x\n", n, c, cm, m);
+//printf("n=%d c=U+%04x cm=U+%04x m=%08x\n", n, c, cm, m);
 
     /*
      * FIXME: Alt+numberpad codes.
@@ -846,6 +858,33 @@ printf("n=%d c=U+%04x cm=U+%04x m=%08x\n", n, c, cm, m);
     }
 }
 
+- (void)notifyRemoteExit
+{
+    int exitcode;
+
+    if (!exited && (exitcode = back->exitcode(backhandle)) >= 0)
+       [self endSession:(exitcode == 0)];
+}
+
+- (void)endSession:(int)clean
+{
+    exited = TRUE;
+    if (ldisc) {
+       ldisc_free(ldisc);
+       ldisc = NULL;
+    }
+    if (back) {
+       back->free(backhandle);
+       backhandle = NULL;
+       back = NULL;
+       //FIXME: update specials menu;
+    }
+    if (cfg.close_on_exit == FORCE_ON ||
+       (cfg.close_on_exit == AUTO && clean))
+       [self close];
+    // FIXME: else show restart menu item
+}
+
 @end
 
 int from_backend(void *frontend, int is_stderr, const char *data, int len)
@@ -859,23 +898,11 @@ void frontend_keypress(void *handle)
     /* FIXME */
 }
 
-void connection_fatal(void *frontend, char *p, ...)
-{
-    //SessionWindow *win = (SessionWindow *)frontend;
-    /* FIXME: proper OS X GUI stuff */
-    va_list ap;
-    fprintf(stderr, "FATAL ERROR: ");
-    va_start(ap, p);
-    vfprintf(stderr, p, ap);
-    va_end(ap);
-    fputc('\n', stderr);
-    exit(1);
-}
-
 void notify_remote_exit(void *frontend)
 {
-    //SessionWindow *win = (SessionWindow *)frontend;
-    /* FIXME */
+    SessionWindow *win = (SessionWindow *)frontend;
+
+    [win notifyRemoteExit];
 }
 
 void ldisc_update(void *frontend, int echo, int edit)
@@ -886,6 +913,13 @@ void ldisc_update(void *frontend, int echo, int edit)
      */
 }
 
+char *get_ttymode(void *frontend, const char *mode)
+{
+    SessionWindow *win = (SessionWindow *)ctx;
+    Terminal *term = [win term];
+    return term_get_ttymode(term, mode);
+}
+
 void update_specials_menu(void *frontend)
 {
     //SessionWindow *win = (SessionWindow *)frontend;