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

📄 window.c

📁 大名鼎鼎的远程登录软件putty的Symbian版源码
💻 C
📖 第 1 页 / 共 5 页
字号:
	SetWindowPos(hwnd, NULL, 0, 0, width, height,	    SWP_NOACTIVATE | SWP_NOCOPYBITS |	    SWP_NOMOVE | SWP_NOZORDER);    } else	reset_window(0);    InvalidateRect(hwnd, NULL, TRUE);}static void reset_window(int reinit) {    /*     * This function decides how to resize or redraw when the      * user changes something.      *     * This function doesn't like to change the terminal size but if the     * font size is locked that may be it's only soluion.     */    int win_width, win_height;    RECT cr, wr;#ifdef RDB_DEBUG_PATCH    debug((27, "reset_window()"));#endif    /* Current window sizes ... */    GetWindowRect(hwnd, &wr);    GetClientRect(hwnd, &cr);    win_width  = cr.right - cr.left;    win_height = cr.bottom - cr.top;    if (cfg.resize_action == RESIZE_DISABLED) reinit = 2;    /* Are we being forced to reload the fonts ? */    if (reinit>1) {#ifdef RDB_DEBUG_PATCH	debug((27, "reset_window() -- Forced deinit"));#endif	deinit_fonts();	init_fonts(0,0);    }    /* Oh, looks like we're minimised */    if (win_width == 0 || win_height == 0)	return;    /* Is the window out of position ? */    if ( !reinit && 	    (offset_width != (win_width-font_width*term->cols)/2 ||	     offset_height != (win_height-font_height*term->rows)/2) ){	offset_width = (win_width-font_width*term->cols)/2;	offset_height = (win_height-font_height*term->rows)/2;	InvalidateRect(hwnd, NULL, TRUE);#ifdef RDB_DEBUG_PATCH	debug((27, "reset_window() -> Reposition terminal"));#endif    }    if (IsZoomed(hwnd)) {	/* We're fullscreen, this means we must not change the size of	 * the window so it's the font size or the terminal itself.	 */	extra_width = wr.right - wr.left - cr.right + cr.left;	extra_height = wr.bottom - wr.top - cr.bottom + cr.top;	if (cfg.resize_action != RESIZE_TERM) {	    if (  font_width != win_width/term->cols || 		  font_height != win_height/term->rows) {		deinit_fonts();		init_fonts(win_width/term->cols, win_height/term->rows);		offset_width = (win_width-font_width*term->cols)/2;		offset_height = (win_height-font_height*term->rows)/2;		InvalidateRect(hwnd, NULL, TRUE);#ifdef RDB_DEBUG_PATCH		debug((25, "reset_window() -> Z font resize to (%d, %d)",			font_width, font_height));#endif	    }	} else {	    if (  font_width != win_width/term->cols || 		  font_height != win_height/term->rows) {		/* Our only choice at this point is to change the 		 * size of the terminal; Oh well.		 */		term_size(term, win_height/font_height, win_width/font_width,			  cfg.savelines);		offset_width = (win_width-font_width*term->cols)/2;		offset_height = (win_height-font_height*term->rows)/2;		InvalidateRect(hwnd, NULL, TRUE);#ifdef RDB_DEBUG_PATCH		debug((27, "reset_window() -> Zoomed term_size"));#endif	    }	}	return;    }    /* Hmm, a force re-init means we should ignore the current window     * so we resize to the default font size.     */    if (reinit>0) {#ifdef RDB_DEBUG_PATCH	debug((27, "reset_window() -> Forced re-init"));#endif	offset_width = offset_height = cfg.window_border;	extra_width = wr.right - wr.left - cr.right + cr.left + offset_width*2;	extra_height = wr.bottom - wr.top - cr.bottom + cr.top +offset_height*2;	if (win_width != font_width*term->cols + offset_width*2 ||	    win_height != font_height*term->rows + offset_height*2) {	    /* If this is too large windows will resize it to the maximum	     * allowed window size, we will then be back in here and resize	     * the font or terminal to fit.	     */	    SetWindowPos(hwnd, NULL, 0, 0, 		         font_width*term->cols + extra_width, 			 font_height*term->rows + extra_height,			 SWP_NOMOVE | SWP_NOZORDER);	}	InvalidateRect(hwnd, NULL, TRUE);	return;    }    /* Okay the user doesn't want us to change the font so we try the      * window. But that may be too big for the screen which forces us     * to change the terminal.     */    if ((cfg.resize_action == RESIZE_TERM && reinit<=0) ||        (cfg.resize_action == RESIZE_EITHER && reinit<0) ||	    reinit>0) {	offset_width = offset_height = cfg.window_border;	extra_width = wr.right - wr.left - cr.right + cr.left + offset_width*2;	extra_height = wr.bottom - wr.top - cr.bottom + cr.top +offset_height*2;	if (win_width != font_width*term->cols + offset_width*2 ||	    win_height != font_height*term->rows + offset_height*2) {	    static RECT ss;	    int width, height;				get_fullscreen_rect(&ss);	    width = (ss.right - ss.left - extra_width) / font_width;	    height = (ss.bottom - ss.top - extra_height) / font_height;	    /* Grrr too big */	    if ( term->rows > height || term->cols > width ) {		if (cfg.resize_action == RESIZE_EITHER) {		    /* Make the font the biggest we can */		    if (term->cols > width)			font_width = (ss.right - ss.left - extra_width)			    / term->cols;		    if (term->rows > height)			font_height = (ss.bottom - ss.top - extra_height)			    / term->rows;		    deinit_fonts();		    init_fonts(font_width, font_height);		    width = (ss.right - ss.left - extra_width) / font_width;		    height = (ss.bottom - ss.top - extra_height) / font_height;		} else {		    if ( height > term->rows ) height = term->rows;		    if ( width > term->cols )  width = term->cols;		    term_size(term, height, width, cfg.savelines);#ifdef RDB_DEBUG_PATCH		    debug((27, "reset_window() -> term resize to (%d,%d)",			       height, width));#endif		}	    }	    	    SetWindowPos(hwnd, NULL, 0, 0, 		         font_width*term->cols + extra_width, 			 font_height*term->rows + extra_height,			 SWP_NOMOVE | SWP_NOZORDER);	    InvalidateRect(hwnd, NULL, TRUE);#ifdef RDB_DEBUG_PATCH	    debug((27, "reset_window() -> window resize to (%d,%d)",			font_width*term->cols + extra_width,			font_height*term->rows + extra_height));#endif	}	return;    }    /* We're allowed to or must change the font but do we want to ?  */    if (font_width != (win_width-cfg.window_border*2)/term->cols || 	font_height != (win_height-cfg.window_border*2)/term->rows) {	deinit_fonts();	init_fonts((win_width-cfg.window_border*2)/term->cols, 		   (win_height-cfg.window_border*2)/term->rows);	offset_width = (win_width-font_width*term->cols)/2;	offset_height = (win_height-font_height*term->rows)/2;	extra_width = wr.right - wr.left - cr.right + cr.left +offset_width*2;	extra_height = wr.bottom - wr.top - cr.bottom + cr.top+offset_height*2;	InvalidateRect(hwnd, NULL, TRUE);#ifdef RDB_DEBUG_PATCH	debug((25, "reset_window() -> font resize to (%d,%d)", 		   font_width, font_height));#endif    }}static void set_input_locale(HKL kl){    char lbuf[20];    GetLocaleInfo(LOWORD(kl), LOCALE_IDEFAULTANSICODEPAGE,		  lbuf, sizeof(lbuf));    kbd_codepage = atoi(lbuf);}static void click(Mouse_Button b, int x, int y, int shift, int ctrl, int alt){    int thistime = GetMessageTime();    if (send_raw_mouse && !(cfg.mouse_override && shift)) {	lastbtn = MBT_NOTHING;	term_mouse(term, b, translate_button(b), MA_CLICK,		   x, y, shift, ctrl, alt);	return;    }    if (lastbtn == b && thistime - lasttime < dbltime) {	lastact = (lastact == MA_CLICK ? MA_2CLK :		   lastact == MA_2CLK ? MA_3CLK :		   lastact == MA_3CLK ? MA_CLICK : MA_NOTHING);    } else {	lastbtn = b;	lastact = MA_CLICK;    }    if (lastact != MA_NOTHING)	term_mouse(term, b, translate_button(b), lastact,		   x, y, shift, ctrl, alt);    lasttime = thistime;}/* * Translate a raw mouse button designation (LEFT, MIDDLE, RIGHT) * into a cooked one (SELECT, EXTEND, PASTE). */static Mouse_Button translate_button(Mouse_Button button){    if (button == MBT_LEFT)	return MBT_SELECT;    if (button == MBT_MIDDLE)	return cfg.mouse_is_xterm == 1 ? MBT_PASTE : MBT_EXTEND;    if (button == MBT_RIGHT)	return cfg.mouse_is_xterm == 1 ? MBT_EXTEND : MBT_PASTE;    return 0;			       /* shouldn't happen */}static void show_mouseptr(int show){    static int cursor_visible = 1;    if (!cfg.hide_mouseptr)	       /* override if this feature disabled */	show = 1;    if (cursor_visible && !show)	ShowCursor(FALSE);    else if (!cursor_visible && show)	ShowCursor(TRUE);    cursor_visible = show;}static int is_alt_pressed(void){    BYTE keystate[256];    int r = GetKeyboardState(keystate);    if (!r)	return FALSE;    if (keystate[VK_MENU] & 0x80)	return TRUE;    if (keystate[VK_RMENU] & 0x80)	return TRUE;    return FALSE;}static int is_shift_pressed(void){    BYTE keystate[256];    int r = GetKeyboardState(keystate);    if (!r)	return FALSE;    if (keystate[VK_SHIFT] & 0x80)	return TRUE;    return FALSE;}static int resizing;static LRESULT CALLBACK WndProc(HWND hwnd, UINT message,				WPARAM wParam, LPARAM lParam){    HDC hdc;    static int ignore_clip = FALSE;    static int need_backend_resize = FALSE;    static int fullscr_on_max = FALSE;    static UINT last_mousemove = 0;    switch (message) {      case WM_TIMER:	if (pending_netevent)	    enact_pending_netevent();	if (GetCapture() != hwnd || 	    (send_raw_mouse && !(cfg.mouse_override && is_shift_pressed())))	    term_out(term);	noise_regular();	HideCaret(hwnd);	term_update(term);	ShowCaret(hwnd);	if (cfg.ping_interval > 0) {	    time_t now;	    time(&now);	    if (now - last_movement > cfg.ping_interval) {		if (back)		    back->special(backhandle, TS_PING);		last_movement = now;	    }	}	net_pending_errors();	return 0;      case WM_CREATE:	break;      case WM_CLOSE:	{	    char *str;	    show_mouseptr(1);	    str = dupprintf("%s Exit Confirmation", appname);	    if (!cfg.warn_on_close || session_closed ||		MessageBox(hwnd,			   "Are you sure you want to close this session?",			   str, MB_ICONWARNING | MB_OKCANCEL) == IDOK)		DestroyWindow(hwnd);	    sfree(str);	}	return 0;      case WM_DESTROY:	show_mouseptr(1);	PostQuitMessage(0);	return 0;      case WM_COMMAND:      case WM_SYSCOMMAND:	switch (wParam & ~0xF) {       /* low 4 bits reserved to Windows */	  case IDM_SHOWLOG:	    showeventlog(hwnd);	    break;	  case IDM_NEWSESS:	  case IDM_DUPSESS:	  case IDM_SAVEDSESS:	    {		char b[2048];		char c[30], *cl;		int freecl = FALSE;		STARTUPINFO si;		PROCESS_INFORMATION pi;		HANDLE filemap = NULL;		if (wParam == IDM_DUPSESS) {		    /*		     * Allocate a file-mapping memory chunk for the		     * config structure.		     */		    SECURITY_ATTRIBUTES sa;		    Config *p;		    sa.nLength = sizeof(sa);		    sa.lpSecurityDescriptor = NULL;		    sa.bInheritHandle = TRUE;		    filemap = CreateFileMapping((HANDLE) 0xFFFFFFFF,						&sa,						PAGE_READWRITE,						0, sizeof(Config), NULL);		    if (filemap) {			p = (Config *) MapViewOfFile(filemap,						     FILE_MAP_WRITE,						     0, 0, sizeof(Config));			if (p) {			    *p = cfg;  /* structure copy */			    UnmapViewOfFile(p);			}		    }		    sprintf(c, "putty &%p", filemap);		    cl = c;		} else if (wParam == IDM_SAVEDSESS) {		    if ((lParam - IDM_SAVED_MIN) / 16 < sesslist.nsessions) {			char *session =			    sesslist.sessions[(lParam - IDM_SAVED_MIN) / 16];			cl = snewn(16 + strlen(session), char);				       /* 8, but play safe */			if (!cl)			    cl = NULL;    				       /* not a very important failure mode */			else {			    sprintf(cl, "putty @%s", session);			    freecl = TRUE;			}		    } else			break;		} else		    cl = NULL;		GetModuleFileName(NULL, b, sizeof(b) - 1);		si.cb = sizeof(si);		si.lpReserved = NULL;		si.lpDesktop = NULL;		si.lpTitle = NULL;		si.dwFlags = 0;		si.cbReserved2 = 0;		si.lpReserved2 = NULL;		CreateProcess(b, cl, NULL, NULL, TRUE,			      NORMAL_PRIORITY_CLASS, NULL, NULL, &si, &pi);		if (filemap)		    CloseHandle(filemap);		if (freecl)		    sfree(cl);	    }	    break;	  case IDM_RESTART:	    if (!back) {		logevent(NULL, "----- Session restarted -----");		start_backend();	    }	    break;	  case IDM_RECONF:	    {		Config prev_cfg;		int init_lvl = 1;		GetWindowText(hwnd, cfg.wintitle, sizeof(cfg.wintitle));		prev_cfg = cfg;		if (!do_reconfig(hwnd))		    break;		{		    /* Disable full-screen if resizing forbidden */		    HMENU m = GetSystemMenu (hwnd, FALSE);		    EnableMenuItem(m, IDM_FULLSCREEN, MF_BYCOMMAND | 				   (cfg.resize_action == RESIZE_DISABLED)				   ? MF_GRAYED : MF_ENABLED);		    /* Gracefully unzoom if necessary */		    if (IsZoomed(hwnd) &&			(cfg.resize_action == RESIZE_DISABLED)) {			ShowWindow(hwnd, SW_RESTORE);		    }		}		/* Pass new config data to the logging module */		log_reconfig(logctx, &cfg);		sfree(logpal);		/*		 * Flush the line discipline's edit buffer in the		 * case where local editing has just been disabled.		 */		if (ldisc)		    ldisc_send(ldisc, NULL, 0, 0);		if (pal)		    DeleteObject(pal);		logpal = NULL;		pal = NULL;		cfgtopalette();		init_palette();		/* Pass new config data to the terminal */		term_reconfig(term, &cfg);		/* Pass new config data to the back end */		if (back)		    back->reconfig(backhandle, &cfg);		/* Screen size changed ? */		if (cfg.height != prev_cfg.height ||		    cfg.width != prev_cfg.width ||		    cfg.savelines != prev_cfg.savelines ||		    cfg.resize_action == RESIZE_FONT ||		    (cfg.resize_action == RESIZE_EITHER && IsZoomed(hwnd)) ||		    cfg.resize_action == RESIZE_DISABLED)		    term_size(term, cfg.height, cfg.width, cfg.savelines);		/* Enable or disable the scroll bar, etc */		{		    LONG nflg, flag = GetWindowLong(hwnd, GWL_STYLE);		    LONG nexflag, exflag =

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -