/*
* Set up a backend.
*/
- {
- int i;
+ back = backend_from_proto(cfg.protocol);
+ if (!back)
back = &pty_backend;
- for (i = 0; backends[i].backend != NULL; i++)
- if (backends[i].protocol == cfg.protocol) {
- back = backends[i].backend;
- break;
- }
- }
{
const char *error;
*/
[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.
case NSLeftArrowFunctionKey: xkey = 'D'; break;
}
if (xkey) {
- /*
- * The arrow keys normally do ESC [ A and so on. In
- * app cursor keys mode they do ESC O A instead.
- * Ctrl toggles the two modes.
- */
- if (term->vt52_mode) {
- output[end++] = '\033';
- output[end++] = xkey;
- } else if (!term->app_cursor_keys ^ !(m & NSControlKeyMask)) {
- output[end++] = '\033';
- output[end++] = 'O';
- output[end++] = xkey;
- } else {
- output[end++] = '\033';
- output[end++] = '[';
- output[end++] = xkey;
- }
+ end += format_arrow_key(output+end, term, xkey,
+ m & NSControlKeyMask);
goto done;
}
}
return term_data(term, is_stderr, data, len);
}
+- (int)fromBackendUntrusted:(const char *)data len:(int)len
+{
+ return term_data_untrusted(term, data, len);
+}
+
- (void)startAlert:(NSAlert *)alert
withCallback:(void (*)(void *, int))callback andCtx:(void *)ctx
{
}
}
+- (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
+}
+
+- (Terminal *)term
+{
+ return term;
+}
+
@end
int from_backend(void *frontend, int is_stderr, const char *data, int len)
return [win fromBackend:data len:len isStderr:is_stderr];
}
-void frontend_keypress(void *handle)
+int from_backend_untrusted(void *frontend, const char *data, int len)
{
- /* FIXME */
+ SessionWindow *win = (SessionWindow *)frontend;
+ return [win fromBackendUntrusted:data len:len];
}
-void connection_fatal(void *frontend, char *p, ...)
+int get_userpass_input(prompts_t *p, unsigned char *in, int inlen)
{
- //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);
+ SessionWindow *win = (SessionWindow *)p->frontend;
+ Terminal *term = [win term];
+ return term_get_userpass_input(term, p, in, inlen);
}
-void notify_remote_exit(void *frontend)
+void frontend_keypress(void *handle)
{
- //SessionWindow *win = (SessionWindow *)frontend;
/* FIXME */
}
+void notify_remote_exit(void *frontend)
+{
+ SessionWindow *win = (SessionWindow *)frontend;
+
+ [win notifyRemoteExit];
+}
+
void ldisc_update(void *frontend, int echo, int edit)
{
//SessionWindow *win = (SessionWindow *)frontend;
*/
}
+char *get_ttymode(void *frontend, const char *mode)
+{
+ SessionWindow *win = (SessionWindow *)frontend;
+ Terminal *term = [win term];
+ return term_get_ttymode(term, mode);
+}
+
void update_specials_menu(void *frontend)
{
//SessionWindow *win = (SessionWindow *)frontend;
* may want to perform additional actions on any kind of bell (for
* example, taskbar flashing in Windows).
*/
-void beep(void *frontend, int mode)
+void do_beep(void *frontend, int mode)
{
//SessionWindow *win = (SessionWindow *)frontend;
if (mode != BELL_VISUAL)
for (i = 0; i < NEXTCOLOURS; i++) {
if (i < 216) {
int r = i / 36, g = (i / 6) % 6, b = i % 6;
- [win setColour:i+16 r:r/5.0 g:g/5.0 b:b/5.0];
+ r = r ? r*40+55 : 0; g = g ? b*40+55 : 0; b = b ? b*40+55 : 0;
+ [win setColour:i+16 r:r/255.0 g:g/255.0 b:b/255.0];
} else {
int shade = i - 216;
- float fshade = (shade + 1) / (float)(NEXTCOLOURS - 216 + 1);
+ float fshade = (shade * 10 + 8) / 255.0;
[win setColour:i+16 r:fshade g:fshade b:fshade];
}
}
/* FIXME */
}
-void write_clip(void *frontend, wchar_t * data, int len, int must_deselect)
+void write_clip(void *frontend, wchar_t *data, int *attr, int len, int must_deselect)
{
//SessionWindow *win = (SessionWindow *)frontend;
/* FIXME */