From a401e5f372e4fced309043225df9fb4d6583275c Mon Sep 17 00:00:00 2001 From: simon Date: Wed, 17 Oct 2001 21:21:03 +0000 Subject: [PATCH] Wez Furlong's patch to tidy up full-screen mode: make it multi-monitor aware and make the scrollbar separately configurable in and out of full-screen mode. Also (not Wez's patch, this bit) fix the case where the user reconfigures _while_ the window is full-screen, and disables full-screening. (In this case the window should return gracefully to normal, rather than losing all its title bars and getting confused.) git-svn-id: svn://svn.tartarus.org/sgt/putty@1310 cda61777-01e9-0310-a592-d414129be87e --- Makefile | 2 +- mkfiles.pl | 5 +++- putty.h | 1 + settings.c | 2 ++ win_res.rc | 14 +++++----- windlg.c | 13 ++++++++-- window.c | 86 ++++++++++++++++++++++++++++++++++++++++++++++++++++++-------- 7 files changed, 101 insertions(+), 22 deletions(-) diff --git a/Makefile b/Makefile index 8f5bbd71..feba78da 100644 --- a/Makefile +++ b/Makefile @@ -67,7 +67,7 @@ # LFLAGS = /debug # Disable debug and incremental linking and compiling -CFLAGS = /nologo /W3 /O1 /D_WINDOWS /D_WIN32_WINDOWS=0x401 +CFLAGS = /nologo /W3 /O1 /D_WINDOWS /D_WIN32_WINDOWS=0x401 /DWINVER=0x401 LFLAGS = /incremental:no /fixed # Use MSVC DLL diff --git a/mkfiles.pl b/mkfiles.pl index fdf1f146..66fc9423 100755 --- a/mkfiles.pl +++ b/mkfiles.pl @@ -130,6 +130,9 @@ print "# so that the .rsp files still depend on the correct makefile.\n". "MAKEFILE = Makefile.bor\n". "\n". +"# C compilation flags\n". +"CFLAGS = -DWINVER=0x0401\n". +"\n". "# Get include directory for resource compiler\n". "!if !\$d(BCB)\n". "BCB = \$(MAKEDIR)\\..\n". @@ -139,7 +142,7 @@ print "\tbcc32 -w-aus -w-ccc -w-par \$(COMPAT) \$(FWHACK) \$(XFLAGS) \$(CFLAGS) /c \$*.c\n". ".rc.res:\n". "\tbrcc32 \$(FWHACK) \$(RCFL) -i \$(BCB)\\include \\\n". -"\t\t-r -DNO_WINRESRC_H -DWIN32 -D_WIN32 -DWINVER=0x0400 \$*.rc\n". +"\t\t-r -DNO_WINRESRC_H -DWIN32 -D_WIN32 -DWINVER=0x0401 \$*.rc\n". "\n". "OBJ=obj\n". "RES=res\n". diff --git a/putty.h b/putty.h index b9300431..cdab4aa8 100644 --- a/putty.h +++ b/putty.h @@ -303,6 +303,7 @@ typedef struct { int bellovl_s; /* period of silence to re-enable bell (s) */ char bell_wavefile[FILENAME_MAX]; int scrollbar; + int scrollbar_in_fullscreen; enum { RESIZE_TERM, RESIZE_DISABLED, RESIZE_FONT } resize_action; int bce; int blinktext; diff --git a/settings.c b/settings.c index 06919050..8afd6c25 100644 --- a/settings.c +++ b/settings.c @@ -250,6 +250,7 @@ void save_settings(char *section, int do_host, Config * cfg) write_setting_s(sesskey, "LineCodePage", cfg->line_codepage); write_setting_i(sesskey, "CapsLockCyr", cfg->xlat_capslockcyr); write_setting_i(sesskey, "ScrollBar", cfg->scrollbar); + write_setting_i(sesskey, "ScrollBarFullScreen", cfg->scrollbar_in_fullscreen); write_setting_i(sesskey, "ScrollOnKey", cfg->scroll_on_key); write_setting_i(sesskey, "ScrollOnDisp", cfg->scroll_on_disp); write_setting_i(sesskey, "LockSize", cfg->resize_action); @@ -473,6 +474,7 @@ void load_settings(char *section, int do_host, Config * cfg) sizeof(cfg->line_codepage)); gppi (sesskey, "CapsLockCyr", 0, &cfg->xlat_capslockcyr); gppi(sesskey, "ScrollBar", 1, &cfg->scrollbar); + gppi(sesskey, "ScrollBarFullScreen", 0, &cfg->scrollbar_in_fullscreen); gppi(sesskey, "ScrollOnKey", 0, &cfg->scroll_on_key); gppi(sesskey, "ScrollOnDisp", 1, &cfg->scroll_on_disp); gppi(sesskey, "LockSize", 0, &cfg->resize_action); diff --git a/win_res.rc b/win_res.rc index 95d0ef95..05a7eb28 100644 --- a/win_res.rc +++ b/win_res.rc @@ -34,24 +34,24 @@ BEGIN END /* Accelerators used: aco */ -IDD_MAINBOX DIALOG DISCARDABLE 0, 0, 280, 242 +IDD_MAINBOX DIALOG DISCARDABLE 0, 0, 280, 252 STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU CAPTION "PuTTY Configuration" FONT 8, "MS Sans Serif" BEGIN - DEFPUSHBUTTON "&Open", IDOK, 184, 225, 44, 14 - PUSHBUTTON "&Cancel", IDCANCEL, 231, 225, 44, 14 - PUSHBUTTON "&About", IDC_ABOUT, 3, 225, 44, 14, NOT WS_TABSTOP + DEFPUSHBUTTON "&Open", IDOK, 184, 235, 44, 14 + PUSHBUTTON "&Cancel", IDCANCEL, 231, 235, 44, 14 + PUSHBUTTON "&About", IDC_ABOUT, 3, 235, 44, 14, NOT WS_TABSTOP END /* Accelerators used: ac */ -IDD_RECONF DIALOG DISCARDABLE 0, 0, 280, 242 +IDD_RECONF DIALOG DISCARDABLE 0, 0, 280, 252 STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU CAPTION "PuTTY Reconfiguration" FONT 8, "MS Sans Serif" BEGIN - DEFPUSHBUTTON "&Apply", IDOK, 184, 225, 44, 14 - PUSHBUTTON "&Cancel", IDCANCEL, 231, 225, 44, 14 + DEFPUSHBUTTON "&Apply", IDOK, 184, 235, 44, 14 + PUSHBUTTON "&Cancel", IDCANCEL, 231, 235, 44, 14 END /* Accelerators used: co */ diff --git a/windlg.c b/windlg.c index 91a2e27e..25b84450 100644 --- a/windlg.c +++ b/windlg.c @@ -359,6 +359,7 @@ enum { IDCX_ABOUT = IDC_RESIZEFONT, IDC_RESIZENONE, IDC_SCROLLBAR, + IDC_SCROLLBARFULLSCREEN, IDC_CLOSEWARN, IDC_SAVESTATIC, IDC_SAVEEDIT, @@ -675,6 +676,7 @@ static void init_dlg_ctrls(HWND hwnd, int keepsess) cfg.cursor_type == 1 ? IDC_CURUNDER : IDC_CURVERT); CheckDlgButton(hwnd, IDC_BLINKCUR, cfg.blink_cur); CheckDlgButton(hwnd, IDC_SCROLLBAR, cfg.scrollbar); + CheckDlgButton(hwnd, IDC_SCROLLBARFULLSCREEN, cfg.scrollbar_in_fullscreen); CheckRadioButton(hwnd, IDC_RESIZETERM, IDC_RESIZENONE, cfg.resize_action == RESIZE_TERM ? IDC_RESIZETERM : cfg.resize_action == RESIZE_FONT ? IDC_RESIZEFONT : @@ -1040,7 +1042,7 @@ static void create_controls(HWND hwnd, int dlgtype, int panel) } if (panel == windowpanelstart) { - /* The Window panel. Accelerators used: [acgo] rmz sdkp w4ylt f */ + /* The Window panel. Accelerators used: [acgo] rmz sdikp w4ylt f */ struct ctlpos cp; ctlposinit(&cp, hwnd, 80, 3, 13); bartitle(&cp, "Options controlling PuTTY's window", @@ -1059,6 +1061,7 @@ static void create_controls(HWND hwnd, int dlgtype, int panel) staticedit(&cp, "Lines of &scrollback", IDC_SAVESTATIC, IDC_SAVEEDIT, 50); checkbox(&cp, "&Display scrollbar", IDC_SCROLLBAR); + checkbox(&cp, "D&isplay scrollbar in full screen mode", IDC_SCROLLBARFULLSCREEN); checkbox(&cp, "Reset scrollback on &keypress", IDC_SCROLLKEY); checkbox(&cp, "Reset scrollback on dis&play activity", IDC_SCROLLDISP); @@ -1432,7 +1435,7 @@ static int GenericMainDlgProc(HWND hwnd, UINT msg, r.left = 3; r.right = r.left + 75; r.top = 13; - r.bottom = r.top + 206; + r.bottom = r.top + 219; MapDialogRect(hwnd, &r); treeview = CreateWindowEx(WS_EX_CLIENTEDGE, WC_TREEVIEW, "", WS_CHILD | WS_VISIBLE | @@ -2114,6 +2117,12 @@ static int GenericMainDlgProc(HWND hwnd, UINT msg, cfg.scrollbar = IsDlgButtonChecked(hwnd, IDC_SCROLLBAR); break; + case IDC_SCROLLBARFULLSCREEN: + if (HIWORD(wParam) == BN_CLICKED || + HIWORD(wParam) == BN_DOUBLECLICKED) + cfg.scrollbar_in_fullscreen = + IsDlgButtonChecked(hwnd, IDC_SCROLLBARFULLSCREEN); + break; case IDC_RESIZETERM: case IDC_RESIZEFONT: case IDC_RESIZENONE: diff --git a/window.c b/window.c index 8e576bf3..c0e7f3e5 100644 --- a/window.c +++ b/window.c @@ -9,6 +9,12 @@ #include #endif #endif + +#if WINVER < 0x0500 +#define COMPILE_MULTIMON_STUBS +#include +#endif + #include #include #include @@ -42,6 +48,7 @@ #define IDM_ABOUT 0x0140 #define IDM_SAVEDSESS 0x0150 #define IDM_COPYALL 0x0160 +#define IDM_FULLSCREEN 0x0170 #define IDM_SESSLGP 0x0250 /* log type printable */ #define IDM_SESSLGA 0x0260 /* log type all chars */ @@ -72,11 +79,14 @@ static void deinit_fonts(void); /* Window layout information */ static void reset_window(int); -static int full_screen = 0, extra_width, extra_height; +static int full_screen = 0, want_full_screen = 0; +static int extra_width, extra_height; static int font_width, font_height, font_dualwidth; static int offset_width, offset_height; static int was_zoomed = 0; +static int was_full_screen = 0; static int prev_rows, prev_cols; +static int pre_fs_rows, pre_fs_cols; static LONG old_wind_style; static WINDOWPLACEMENT old_wind_placement; @@ -579,6 +589,8 @@ int WINAPI WinMain(HINSTANCE inst, HINSTANCE prev, LPSTR cmdline, int show) AppendMenu(m, MF_ENABLED, IDM_CLRSB, "C&lear Scrollback"); AppendMenu(m, MF_ENABLED, IDM_RESET, "Rese&t Terminal"); AppendMenu(m, MF_SEPARATOR, 0, 0); + AppendMenu(m, MF_ENABLED, IDM_FULLSCREEN, "&Full Screen"); + AppendMenu(m, MF_SEPARATOR, 0, 0); AppendMenu(m, MF_ENABLED, IDM_ABOUT, "&About PuTTY"); } @@ -1189,7 +1201,7 @@ static void reset_window(int reinit) { #endif } - if (IsZoomed(hwnd)) { + if (IsZoomed(hwnd) || full_screen) { /* We're fullscreen, this means we must not change the size of * the window so it's the font size or the terminal itself. */ @@ -1497,6 +1509,11 @@ static LRESULT CALLBACK WndProc(HWND hwnd, UINT message, if (!do_reconfig(hwnd)) break; + /* If user forcibly disables full-screen, gracefully unzoom */ + if (full_screen && !cfg.fullscreenonaltenter) { + flip_full_screen(); + } + if (strcmp(prev_cfg.logfilename, cfg.logfilename) || prev_cfg.logtype != cfg.logtype) { logfclose(); /* reset logging */ @@ -1661,6 +1678,9 @@ static LRESULT CALLBACK WndProc(HWND hwnd, UINT message, if( lParam == 0 ) PostMessage(hwnd, WM_CHAR, ' ', 0); break; + case IDM_FULLSCREEN: + flip_full_screen(); + break; default: if (wParam >= IDM_SAVED_MIN && wParam <= IDM_SAVED_MAX) { SendMessage(hwnd, WM_SYSCOMMAND, IDM_SAVEDSESS, wParam); @@ -1983,7 +2003,6 @@ static LRESULT CALLBACK WndProc(HWND hwnd, UINT message, return rv; } - break; /* break; (never reached) */ case WM_SIZE: #ifdef RDB_DEBUG_PATCH @@ -2032,6 +2051,11 @@ static LRESULT CALLBACK WndProc(HWND hwnd, UINT message, if (cfg.resize_action != RESIZE_FONT) term_size(prev_rows, prev_cols, cfg.savelines); reset_window(0); + } else if (was_full_screen) { + was_full_screen = 0; + if (cfg.resize_action != RESIZE_FONT) + term_size(pre_fs_rows, pre_fs_cols, cfg.savelines); + reset_window(0); } /* This is an unexpected resize, these will normally happen * if the window is too large. Probably either the user @@ -3804,23 +3828,63 @@ void beep(int mode) /* * Toggle full screen mode. Thanks to cwis@nerim.fr for the * implementation. + * Revised by */ static void flip_full_screen(void) { - if (!full_screen) { - int cx, cy; + want_full_screen = !want_full_screen; + if (full_screen == want_full_screen) + return; + + full_screen = want_full_screen; + + old_wind_placement.length = sizeof(old_wind_placement); + + if (full_screen) { + int x, y, cx, cy; +#ifdef MONITOR_DEFAULTTONEAREST + /* The multi-monitor safe way of doing things */ + HMONITOR mon; + MONITORINFO mi; + + mon = MonitorFromWindow(hwnd, MONITOR_DEFAULTTONEAREST); + mi.cbSize = sizeof(mi); + GetMonitorInfo(mon, &mi); + x = mi.rcMonitor.left; + y = mi.rcMonitor.top; + cx = mi.rcMonitor.right; + cy = mi.rcMonitor.bottom; +#else + /* good old fashioned way of doing it */ + x = 0; + y = 0; cx = GetSystemMetrics(SM_CXSCREEN); cy = GetSystemMetrics(SM_CYSCREEN); +#endif + + /* save rows for when we "restore" back down again */ + pre_fs_rows = rows; + pre_fs_cols = cols; + GetWindowPlacement(hwnd, &old_wind_placement); - old_wind_style = GetWindowLong(hwnd, GWL_STYLE); SetWindowLong(hwnd, GWL_STYLE, - old_wind_style & ~(WS_CAPTION | WS_BORDER | WS_THICKFRAME)); - SetWindowPos(hwnd, HWND_TOP, 0, 0, cx, cy, SWP_SHOWWINDOW); - full_screen = 1; + GetWindowLong(hwnd, GWL_STYLE) + & ~((cfg.scrollbar_in_fullscreen ? 0 : WS_VSCROLL) + | WS_CAPTION | WS_BORDER | WS_THICKFRAME)); + /* become topmost */ + SetWindowPos(hwnd, HWND_TOP, x, y, cx, cy, SWP_FRAMECHANGED); } else { - SetWindowLong(hwnd, GWL_STYLE, old_wind_style); + was_full_screen = 1; + SetWindowLong(hwnd, GWL_STYLE, + GetWindowLong(hwnd, GWL_STYLE) + | (cfg.scrollbar ? WS_VSCROLL : 0) + | WS_CAPTION | WS_BORDER | WS_THICKFRAME); + SetWindowPos(hwnd, HWND_TOP, 0, 0, 0, 0, + SWP_NOMOVE|SWP_NOSIZE|SWP_FRAMECHANGED); SetWindowPlacement(hwnd,&old_wind_placement); - full_screen = 0; } + CheckMenuItem(GetSystemMenu(hwnd, FALSE), IDM_FULLSCREEN, + MF_BYCOMMAND| full_screen ? MF_CHECKED : MF_UNCHECKED); } + -- 2.11.0