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

📄 macterm.c

📁 putty
💻 C
📖 第 1 页 / 共 4 页
字号:
	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 + -