📄 macterm.c
字号:
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 *attr, 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;
static void mac_growterm(WindowPtr window, EventRecord *event)
{
Rect limits;
long grow_result;
int newrows, newcols;
Session *s;
#if !TARGET_API_MAC_CARBON
DragGrayRgnUPP draghooksave;
GrafPtr portsave;
FontInfo fi;
#endif
s = mac_windowsession(window);
#if !TARGET_API_MAC_CARBON
draghooksave = LMGetDragHook();
growterm_state.oldmsg[0] = '\0';
growterm_state.zeromouse = event->where;
growterm_state.zeromouse.h -= s->term->cols * s->font_width;
growterm_state.zeromouse.v -= s->term->rows * s->font_height;
growterm_state.s = s;
GetPort(&portsave);
SetPort(s->window);
BackColor(whiteColor);
ForeColor(blackColor);
TextFont(systemFont);
TextFace(0);
TextSize(12);
GetFontInfo(&fi);
SetRect(&growterm_state.msgrect, 0, 0,
StringWidth("\p99999x99999") + 4, fi.ascent + fi.descent + 4);
SetPt(&growterm_state.msgorigin, 2, fi.ascent + 2);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -