📄 osxwin.m
字号:
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 + -