📄 macterm.c
字号:
s = mac_windowsession(window); menu = GetMenuHandle(mFile); DisableItem(menu, iSave); /* XXX enable if modified */ EnableItem(menu, iSaveAs); EnableItem(menu, iDuplicate); menu = GetMenuHandle(mEdit); EnableItem(menu, 0); DisableItem(menu, iUndo); DisableItem(menu, iCut); if (1/*s->term->selstate == SELECTED*/) EnableItem(menu, iCopy); else DisableItem(menu, iCopy);#if TARGET_API_MAC_CARBON if (1)#else if (GetScrap(NULL, kScrapFlavorTypeText, &offset) == noTypeErr)#endif DisableItem(menu, iPaste); else EnableItem(menu, iPaste); DisableItem(menu, iClear); EnableItem(menu, iSelectAll); menu = GetMenuHandle(mWindow); EnableItem(menu, 0); EnableItem(menu, iShowEventLog);}static void mac_menuterm(WindowPtr window, short menu, short item){ Session *s; s = mac_windowsession(window); switch (menu) { case mEdit: switch (item) { case iCopy: /* term_copy(s); */ break; case iPaste: term_do_paste(s->term); break; } break; case mWindow: switch(item) { case iShowEventLog: mac_showeventlog(s); break; } break; }} static void mac_clickterm(WindowPtr window, EventRecord *event){ Session *s; Point mouse; ControlHandle control; int part; static ControlActionUPP mac_scrolltracker_upp = NULL; s = mac_windowsession(window); SetPort((GrafPtr)GetWindowPort(window)); mouse = event->where; GlobalToLocal(&mouse); part = FindControl(mouse, window, &control); if (control == s->scrollbar) { switch (part) { case kControlIndicatorPart: if (TrackControl(control, mouse, NULL) == kControlIndicatorPart) term_scroll(s->term, +1, GetControlValue(control)); break; case kControlUpButtonPart: case kControlDownButtonPart: case kControlPageUpPart: case kControlPageDownPart: if (mac_scrolltracker_upp == NULL) mac_scrolltracker_upp = NewControlActionUPP(&mac_scrolltracker); TrackControl(control, mouse, mac_scrolltracker_upp); break; } } else { text_click(s, event); }}static void text_click(Session *s, EventRecord *event){ Point localwhere; int row, col; static UInt32 lastwhen = 0; static Session *lastsess = NULL; static int lastrow = -1, lastcol = -1; static Mouse_Action lastact = MA_NOTHING; SetPort((GrafPtr)GetWindowPort(s->window)); localwhere = event->where; GlobalToLocal(&localwhere); col = PTOCC(localwhere.h); row = PTOCR(localwhere.v); if (event->when - lastwhen < GetDblTime() && row == lastrow && col == lastcol && s == lastsess) lastact = (lastact == MA_CLICK ? MA_2CLK : lastact == MA_2CLK ? MA_3CLK : lastact == MA_3CLK ? MA_CLICK : MA_NOTHING); else lastact = MA_CLICK; term_mouse(s->term, MBT_LEFT, event->modifiers & shiftKey ? MBT_EXTEND : MBT_SELECT, lastact, col, row, event->modifiers & shiftKey, event->modifiers & controlKey, event->modifiers & optionKey); lastsess = s; lastrow = row; lastcol = col; while (StillDown()) { GetMouse(&localwhere); col = PTOCC(localwhere.h); row = PTOCR(localwhere.v); term_mouse(s->term, MBT_LEFT, event->modifiers & shiftKey ? MBT_EXTEND : MBT_SELECT, MA_DRAG, col, row, event->modifiers & shiftKey, event->modifiers & controlKey, event->modifiers & optionKey); if (row > s->term->rows - 1) term_scroll(s->term, 0, row - (s->term->rows - 1)); else if (row < 0) term_scroll(s->term, 0, row); } term_mouse(s->term, MBT_LEFT, event->modifiers & shiftKey ? MBT_EXTEND : MBT_SELECT, MA_RELEASE, col, row, event->modifiers & shiftKey, event->modifiers & controlKey, event->modifiers & optionKey); lastwhen = TickCount();}void write_clip(void *cookie, wchar_t *data, int len, int must_deselect){#if !TARGET_API_MAC_CARBON Session *s = cookie; char *mactextbuf; ByteCount iread, olen; wchar_t *unitextptr; StScrpRec *stsc; size_t stsz; OSErr err; int i; /* * See "Programming with the Text Encoding Conversion Manager" * Appendix E for Unicode scrap conventions. * * XXX Maybe PICT scrap too. */ if (ZeroScrap() != noErr) return; PutScrap(len * sizeof(*data), kScrapFlavorTypeUnicode, data); /* Replace LINE SEPARATORs with CR for TEXT output. */ for (i = 0; i < len; i++) if (data[i] == 0x2028) data[i] = 0x000d; mactextbuf = snewn(len, char); /* XXX DBCS */ if (s->uni_to_font != NULL) { err = ConvertFromUnicodeToText(s->uni_to_font, len * sizeof(UniChar), (UniChar *)data, kUnicodeUseFallbacksMask, 0, NULL, NULL, NULL, len, &iread, &olen, mactextbuf); if (err != noErr && err != kTECUsedFallbacksStatus) return; } else if (s->font_charset != CS_NONE) { unitextptr = data; olen = charset_from_unicode(&unitextptr, &len, mactextbuf, 1024, s->font_charset, NULL, ".", 1); } else return; PutScrap(olen, kScrapFlavorTypeText, mactextbuf); sfree(mactextbuf); stsz = offsetof(StScrpRec, scrpStyleTab) + sizeof(ScrpSTElement); stsc = smalloc(stsz); stsc->scrpNStyles = 1; stsc->scrpStyleTab[0].scrpStartChar = 0; stsc->scrpStyleTab[0].scrpHeight = s->font_height; stsc->scrpStyleTab[0].scrpAscent = s->font_ascent; stsc->scrpStyleTab[0].scrpFont = s->fontnum; stsc->scrpStyleTab[0].scrpFace = 0; stsc->scrpStyleTab[0].scrpSize = s->cfg.font.size; stsc->scrpStyleTab[0].scrpColor.red = 0; stsc->scrpStyleTab[0].scrpColor.green = 0; stsc->scrpStyleTab[0].scrpColor.blue = 0; PutScrap(stsz, kScrapFlavorTypeTextStyle, stsc); sfree(stsc);#endif}void get_clip(void *frontend, wchar_t **p, int *lenp){#if TARGET_API_MAC_CARBON *lenp = 0;#else Session *s = frontend; static Handle h = NULL; static wchar_t *data = NULL; Handle texth; long offset; int textlen; TextEncoding enc; TextToUnicodeInfo scrap_to_uni; ByteCount iread, olen; int charset; char *tptr; OSErr err; if (p == NULL) { /* release memory */ if (h != NULL) DisposeHandle(h); h = NULL; if (data != NULL) sfree(data); data = NULL; } else { if (GetScrap(NULL, kScrapFlavorTypeUnicode, &offset) > 0) { if (h == NULL) h = NewHandle(0); *lenp = GetScrap(h, kScrapFlavorTypeUnicode, &offset) / sizeof(**p); HLock(h); *p = (wchar_t *)*h; } else if (GetScrap(NULL, kScrapFlavorTypeText, &offset) > 0) { texth = NewHandle(0); textlen = GetScrap(texth, kScrapFlavorTypeText, &offset); HLock(texth); data = snewn(textlen, wchar_t); /* XXX should use 'styl' scrap if it's there. */ if (mac_gestalts.encvvers != 0 && UpgradeScriptInfoToTextEncoding(smSystemScript, kTextLanguageDontCare, kTextRegionDontCare, NULL, &enc) == noErr && CreateTextToUnicodeInfoByEncoding(enc, &scrap_to_uni) == noErr) { err = ConvertFromTextToUnicode(scrap_to_uni, textlen, *texth, 0, 0, NULL, NULL, NULL, textlen * 2, &iread, &olen, data); DisposeTextToUnicodeInfo(&scrap_to_uni); if (err == noErr) { *p = data; *lenp = olen / sizeof(**p); } else { *p = NULL; *lenp = 0; } } else { charset = charset_from_macenc(GetScriptManagerVariable(smSysScript), GetScriptManagerVariable(smRegionCode), mac_gestalts.sysvers, NULL); if (charset != CS_NONE) { tptr = *texth; *lenp = charset_to_unicode(&tptr, &textlen, data, textlen * 2, charset, NULL, NULL, 0); } *p = data; } DisposeHandle(texth); } else { *p = NULL; *lenp = 0; } }#endif}static pascal void mac_scrolltracker(ControlHandle control, short part){ Session *s;#if TARGET_API_MAC_CARBON s = mac_windowsession(GetControlOwner(control));#else s = mac_windowsession((*control)->contrlOwner);#endif switch (part) { case kControlUpButtonPart: term_scroll(s->term, 0, -1); break; case kControlDownButtonPart: term_scroll(s->term, 0, +1); break; case kControlPageUpPart: term_scroll(s->term, 0, -(s->term->rows - 1)); break; case kControlPageDownPart: term_scroll(s->term, 0, +(s->term->rows - 1)); break; }}static void mac_keyterm(WindowPtr window, EventRecord *event){ Session *s = mac_windowsession(window); Key_Sym keysym = PK_NULL; unsigned int mods = 0, flags = PKF_NUMLOCK; UniChar utxt[1]; char txt[1]; size_t len = 0; ScriptCode key_script; ObscureCursor();#if 0 fprintf(stderr, "Got key event %08x\n", event->message);#endif /* No meta key yet -- that'll be rather fun. */ /* Keys that we handle locally */ if (event->modifiers & shiftKey) { switch ((event->message & keyCodeMask) >> 8) { case 0x74: /* shift-pageup */ term_scroll(s->term, 0, -(s->term->rows - 1)); return; case 0x79: /* shift-pagedown */ term_scroll(s->term, 0, +(s->term->rows - 1)); return; } } if (event->modifiers & shiftKey) mods |= PKM_SHIFT; if (event->modifiers & controlKey) mods |= PKM_CONTROL; if (event->what == autoKey) flags |= PKF_REPEAT; /* Mac key events consist of a virtual key code and a character code. */ switch ((event->message & keyCodeMask) >> 8) { case 0x24: keysym = PK_RETURN; break; case 0x30: keysym = PK_TAB; break; case 0x33: keysym = PK_BACKSPACE; break; case 0x35: keysym = PK_ESCAPE; break; case 0x7A: keysym = PK_F1; break; case 0x78: keysym = PK_F2; break; case 0x63: keysym = PK_F3; break; case 0x76: keysym = PK_F4; break; case 0x60: keysym = PK_F5; break; case 0x61: keysym = PK_F6; break; case 0x62: keysym = PK_F7; break; case 0x64: keysym = PK_F8; break; case 0x65: keysym = PK_F9; break; case 0x6D: keysym = PK_F10; break; case 0x67: keysym = PK_F11; break; case 0x6F: keysym = PK_F12; break; case 0x69: keysym = PK_F13; break; case 0x6B: keysym = PK_F14; break; case 0x71: keysym = PK_F15; break; case 0x72: keysym = PK_INSERT; break; case 0x73: keysym = PK_HOME; break; case 0x74: keysym = PK_PAGEUP; break; case 0x75: keysym = PK_DELETE; break; case 0x77: keysym = PK_END; break; case 0x79: keysym = PK_PAGEDOWN; break; case 0x47: keysym = PK_PF1; break; case 0x51: keysym = PK_PF2; break; case 0x4B: keysym = PK_PF3; break; case 0x43: keysym = PK_PF4; break; case 0x4E: keysym = PK_KPMINUS; break; case 0x45: keysym = PK_KPCOMMA; break; case 0x41: keysym = PK_KPDECIMAL; break; case 0x4C: keysym = PK_KPENTER; break; case 0x52: keysym = PK_KP0; break; case 0x53: keysym = PK_KP1; break; case 0x54: keysym = PK_KP2; break; case 0x55: keysym = PK_KP3; break; case 0x56: keysym = PK_KP4; break; case 0x57: keysym = PK_KP5; break; case 0x58: keysym = PK_KP6; break; case 0x59: keysym = PK_KP7; break; case 0x5B: keysym = PK_KP8; break; case 0x5C: keysym = PK_KP9; break; case 0x7B: keysym = PK_LEFT; break; case 0x7C: keysym = PK_RIGHT; break; case 0x7D: keysym = PK_DOWN; break; case 0x7E: keysym = PK_UP; break; } /* Map from key script to Unicode. */ txt[0] = event->message & charCodeMask; key_script = GetScriptManagerVariable(smKeyScript); if (mac_gestalts.encvvers != 0) { static TextToUnicodeInfo key_to_uni = NULL; static ScriptCode key_to_uni_script; TextEncoding enc; ByteCount iread, olen; OSErr err; if (key_to_uni != NULL && key_to_uni_script != key_script) DisposeTextToUnicodeInfo(&key_to_uni); if (key_to_uni == NULL || key_to_uni_script != key_script) { if (UpgradeScriptInfoToTextEncoding(key_script, kTextLanguageDontCare, kTextRegionDontCare, NULL, &enc) == noErr && CreateTextToUnicodeInfoByEncoding(enc, &key_to_uni) == noErr) key_to_uni_script = key_script; else key_to_uni = NULL; } if (key_to_uni != NULL) { err = ConvertFromTextToUnicode(key_to_uni, 1, txt, (kUnicodeKeepInfoMask | kUnicodeStringUnterminatedMask), 0, NULL, NULL, NULL, sizeof(utxt), &iread, &olen, utxt); if (err == noErr) len = olen / sizeof(*utxt); } } else { int charset; char *tptr = txt; int tlen = 1; charset = charset_from_macenc(key_script, GetScriptManagerVariable(smRegionCode), mac_gestalts.sysvers, NULL); if (charset != CS_NONE) { len = charset_to_unicode(&tptr, &tlen, utxt, sizeof(utxt), charset, NULL, NULL, 0); } } term_key(s->term, keysym, utxt, len, mods, flags);}void request_paste(void *frontend){ Session *s = frontend; /* * In the Mac OS, pasting is synchronous: we can read the * clipboard with no difficulty, so request_paste() can just go * ahead and paste. */ term_do_paste(s->term);}static struct { Rect msgrect; Point msgorigin; Point zeromouse; Session *s; char oldmsg[20];} growterm_state;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -