⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 osxwin.m

📁 putty
💻 M
📖 第 1 页 / 共 3 页
字号:
	use_coutput = TRUE;
	end = 2;
	special = TRUE;
    }

    /* Control-Shift-Space is 160 (ISO8859 nonbreaking space) */
    if (n == 1 && (m & NSControlKeyMask) && (m & NSShiftKeyMask) &&
	cm == ' ') {
	output[1] = '\240';
	end = 2;
    }

    /* Control-2, Control-Space and Control-@ are all NUL. */
    if ((m & NSControlKeyMask) && n == 1 &&
	(cm == '2' || cm == '@' || cm == ' ') && c == cm) {
	output[1] = '\0';
	end = 2;
    }

    /* We don't let MacOS tell us what Backspace is! We know better. */
    if (cm == 0x7F && !(m & NSShiftKeyMask)) {
	coutput[1] = cfg.bksp_is_delete ? '\x7F' : '\x08';
	end = 2;
	use_coutput = special = TRUE;
    }
    /* For Shift Backspace, do opposite of what is configured. */
    if (cm == 0x7F && (m & NSShiftKeyMask)) {
	coutput[1] = cfg.bksp_is_delete ? '\x08' : '\x7F';
	end = 2;
	use_coutput = special = TRUE;
    }

    /* Shift-Tab is ESC [ Z. Oddly, this combination generates ^Y by
     * default on MacOS! */
    if (cm == 0x19 && (m & NSShiftKeyMask) && !(m & NSControlKeyMask)) {
	end = 1;
	output[end++] = '\033';
	output[end++] = '[';
	output[end++] = 'Z';
    }

    /*
     * NetHack keypad mode.
     */
    if (cfg.nethack_keypad && (m & NSNumericPadKeyMask)) {
	wchar_t *keys = NULL;
	switch (cm) {
	  case '1': keys = L"bB"; break;
	  case '2': keys = L"jJ"; break;
	  case '3': keys = L"nN"; break;
	  case '4': keys = L"hH"; break;
	  case '5': keys = L".."; break;
	  case '6': keys = L"lL"; break;
	  case '7': keys = L"yY"; break;
	  case '8': keys = L"kK"; break;
	  case '9': keys = L"uU"; break;
	}
	if (keys) {
	    end = 2;
	    if (m & NSShiftKeyMask)
		output[1] = keys[1];
	    else
		output[1] = keys[0];
	    goto done;
	}
    }

    /*
     * Application keypad mode.
     */
    if (term->app_keypad_keys && !cfg.no_applic_k &&
	(m & NSNumericPadKeyMask)) {
	int xkey = 0;
	switch (cm) {
	  case NSClearLineFunctionKey: xkey = 'P'; break;
	  case '=': xkey = 'Q'; break;
	  case '/': xkey = 'R'; break;
	  case '*': xkey = 'S'; break;
	    /*
	     * FIXME: keypad - and + need to be mapped to ESC O l
	     * and ESC O k, or ESC O l and ESC O m, depending on
	     * xterm function key mode, and I can't remember which
	     * goes where.
	     */
	  case '\003': xkey = 'M'; break;
	  case '0': xkey = 'p'; break;
	  case '1': xkey = 'q'; break;
	  case '2': xkey = 'r'; break;
	  case '3': xkey = 's'; break;
	  case '4': xkey = 't'; break;
	  case '5': xkey = 'u'; break;
	  case '6': xkey = 'v'; break;
	  case '7': xkey = 'w'; break;
	  case '8': xkey = 'x'; break;
	  case '9': xkey = 'y'; break;
	  case '.': xkey = 'n'; break;
	}
	if (xkey) {
	    if (term->vt52_mode) {
		if (xkey >= 'P' && xkey <= 'S') {
		    output[end++] = '\033';
		    output[end++] = xkey;
		} else {
		    output[end++] = '\033';
		    output[end++] = '?';
		    output[end++] = xkey;
		}
	    } else {
		output[end++] = '\033';
		output[end++] = 'O';
		output[end++] = xkey;
	    }
	    goto done;
	}
    }

    /*
     * Next, all the keys that do tilde codes. (ESC '[' nn '~',
     * for integer decimal nn.)
     *
     * We also deal with the weird ones here. Linux VCs replace F1
     * to F5 by ESC [ [ A to ESC [ [ E. rxvt doesn't do _that_, but
     * does replace Home and End (1~ and 4~) by ESC [ H and ESC O w
     * respectively.
     */
    {
	int code = 0;
	switch (cm) {
	  case NSF1FunctionKey:
	    code = (m & NSShiftKeyMask ? 23 : 11);
	    break;
	  case NSF2FunctionKey:
	    code = (m & NSShiftKeyMask ? 24 : 12);
	    break;
	  case NSF3FunctionKey:
	    code = (m & NSShiftKeyMask ? 25 : 13);
	    break;
	  case NSF4FunctionKey:
	    code = (m & NSShiftKeyMask ? 26 : 14);
	    break;
	  case NSF5FunctionKey:
	    code = (m & NSShiftKeyMask ? 28 : 15);
	    break;
	  case NSF6FunctionKey:
	    code = (m & NSShiftKeyMask ? 29 : 17);
	    break;
	  case NSF7FunctionKey:
	    code = (m & NSShiftKeyMask ? 31 : 18);
	    break;
	  case NSF8FunctionKey:
	    code = (m & NSShiftKeyMask ? 32 : 19);
	    break;
	  case NSF9FunctionKey:
	    code = (m & NSShiftKeyMask ? 33 : 20);
	    break;
	  case NSF10FunctionKey:
	    code = (m & NSShiftKeyMask ? 34 : 21);
	    break;
	  case NSF11FunctionKey:
	    code = 23;
	    break;
	  case NSF12FunctionKey:
	    code = 24;
	    break;
	  case NSF13FunctionKey:
	    code = 25;
	    break;
	  case NSF14FunctionKey:
	    code = 26;
	    break;
	  case NSF15FunctionKey:
	    code = 28;
	    break;
	  case NSF16FunctionKey:
	    code = 29;
	    break;
	  case NSF17FunctionKey:
	    code = 31;
	    break;
	  case NSF18FunctionKey:
	    code = 32;
	    break;
	  case NSF19FunctionKey:
	    code = 33;
	    break;
	  case NSF20FunctionKey:
	    code = 34;
	    break;
	}
	if (!(m & NSControlKeyMask)) switch (cm) {
	  case NSHomeFunctionKey:
	    code = 1;
	    break;
#ifdef FIXME
	  case GDK_Insert: case GDK_KP_Insert:
	    code = 2;
	    break;
#endif
	  case NSDeleteFunctionKey:
	    code = 3;
	    break;
	  case NSEndFunctionKey:
	    code = 4;
	    break;
	  case NSPageUpFunctionKey:
	    code = 5;
	    break;
	  case NSPageDownFunctionKey:
	    code = 6;
	    break;
	}
	/* Reorder edit keys to physical order */
	if (cfg.funky_type == FUNKY_VT400 && code <= 6)
	    code = "\0\2\1\4\5\3\6"[code];

	if (term->vt52_mode && code > 0 && code <= 6) {
	    output[end++] = '\033';
	    output[end++] = " HLMEIG"[code];
	    goto done;
	}

	if (cfg.funky_type == FUNKY_SCO &&     /* SCO function keys */
	    code >= 11 && code <= 34) {
	    char codes[] = "MNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz@[\\]^_`{";
	    int index = 0;
	    switch (cm) {
	      case NSF1FunctionKey: index = 0; break;
	      case NSF2FunctionKey: index = 1; break;
	      case NSF3FunctionKey: index = 2; break;
	      case NSF4FunctionKey: index = 3; break;
	      case NSF5FunctionKey: index = 4; break;
	      case NSF6FunctionKey: index = 5; break;
	      case NSF7FunctionKey: index = 6; break;
	      case NSF8FunctionKey: index = 7; break;
	      case NSF9FunctionKey: index = 8; break;
	      case NSF10FunctionKey: index = 9; break;
	      case NSF11FunctionKey: index = 10; break;
	      case NSF12FunctionKey: index = 11; break;
	    }
	    if (m & NSShiftKeyMask) index += 12;
	    if (m & NSControlKeyMask) index += 24;
	    output[end++] = '\033';
	    output[end++] = '[';
	    output[end++] = codes[index];
	    goto done;
	}
	if (cfg.funky_type == FUNKY_SCO &&     /* SCO small keypad */
	    code >= 1 && code <= 6) {
	    char codes[] = "HL.FIG";
	    if (code == 3) {
		output[1] = '\x7F';
		end = 2;
	    } else {
		output[end++] = '\033';
		output[end++] = '[';
		output[end++] = codes[code-1];
	    }
	    goto done;
	}
	if ((term->vt52_mode || cfg.funky_type == FUNKY_VT100P) &&
	    code >= 11 && code <= 24) {
	    int offt = 0;
	    if (code > 15)
		offt++;
	    if (code > 21)
		offt++;
	    if (term->vt52_mode) {
		output[end++] = '\033';
		output[end++] = code + 'P' - 11 - offt;
	    } else {
		output[end++] = '\033';
		output[end++] = 'O';
		output[end++] = code + 'P' - 11 - offt;
	    }
	    goto done;
	}
	if (cfg.funky_type == FUNKY_LINUX && code >= 11 && code <= 15) {
	    output[end++] = '\033';
	    output[end++] = '[';
	    output[end++] = '[';	
	    output[end++] = code + 'A' - 11;
	    goto done;
	}
	if (cfg.funky_type == FUNKY_XTERM && code >= 11 && code <= 14) {
	    if (term->vt52_mode) {
		output[end++] = '\033';
		output[end++] = code + 'P' - 11;
	    } else {
		output[end++] = '\033';
		output[end++] = 'O';
		output[end++] = code + 'P' - 11;
	    }
	    goto done;
	}
	if (cfg.rxvt_homeend && (code == 1 || code == 4)) {
	    if (code == 1) {
		output[end++] = '\033';
		output[end++] = '[';
		output[end++] = 'H';
	    } else {
		output[end++] = '\033';
		output[end++] = 'O';
		output[end++] = 'w';
	    }
	    goto done;
	}
	if (code) {
	    char buf[20];
	    sprintf(buf, "\x1B[%d~", code);
	    for (i = 0; buf[i]; i++)
		output[end++] = buf[i];
	    goto done;
	}
    }

    /*
     * Cursor keys. (This includes the numberpad cursor keys,
     * if we haven't already done them due to app keypad mode.)
     */
    {
	int xkey = 0;
	switch (cm) {
	  case NSUpArrowFunctionKey: xkey = 'A'; break;
	  case NSDownArrowFunctionKey: xkey = 'B'; break;
	  case NSRightArrowFunctionKey: xkey = 'C'; break;
	  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;
	    }
	    goto done;
	}
    }

    done:

    /*
     * Failing everything else, send the exact Unicode we got from
     * OS X.
     */
    if (end == start) {
	if (n > lenof(output)-start)
	    n = lenof(output)-start;   /* _shouldn't_ happen! */
	for (i = 0; i < n; i++) {
	    output[i+start] = [s characterAtIndex:i];
	}
	end = n+start;
    }

    if (use_coutput) {
	assert(special);
	assert(end < lenof(coutput));
	coutput[end] = '\0';
	ldisc_send(ldisc, coutput+start, -2, TRUE);
    } else {
	luni_send(ldisc, output+start, end-start, TRUE);
    }
}

- (int)fromBackend:(const char *)data len:(int)len isStderr:(int)is_stderr
{
    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
{
    if (alert_ctx || alert_qhead) {
	/*
	 * Queue this alert to be shown later.
	 */
	struct alert_queue *qitem = snew(struct alert_queue);
	qitem->next = NULL;
	qitem->alert = alert;
	qitem->callback = callback;
	qitem->ctx = ctx;
	if (alert_qtail)
	    alert_qtail->next = qitem;
	else
	    alert_qhead = qitem;
	alert_qtail = qitem;
    } else {
	alert_callback = callback;
	alert_ctx = ctx;	       /* NB this is assumed to need freeing! */
	[alert beginSheetModalForWindow:self modalDelegate:self
	 didEndSelector:@selector(alertSheetDidEnd:returnCode:contextInfo:)
	 contextInfo:NULL];
    }
}

- (void)alertSheetDidEnd:(NSAlert *)alert returnCode:(int)returnCode
    contextInfo:(void *)contextInfo
{
    [self performSelectorOnMainThread:
     @selector(alertSheetDidFinishEnding:)
     withObject:[NSNumber numberWithInt:returnCode]
     waitUntilDone:NO];

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -