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

📄 macterm.c

📁 大名鼎鼎的远程登录软件putty的Symbian版源码
💻 C
📖 第 1 页 / 共 4 页
字号:
    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 + -