X-Git-Url: https://git.distorted.org.uk/u/mdw/putty/blobdiff_plain/68f9b3d9a6eccbfb006343ec7edc045e7d673973..3ca5c28cafade2c9e0ada4d5b30c1d9b1be32f4c:/window.c diff --git a/window.c b/window.c index 944fdba2..52af23e2 100644 --- a/window.c +++ b/window.c @@ -11,6 +11,11 @@ #endif #endif +#if WINVER < 0x0500 +#define COMPILE_MULTIMON_STUBS +#include +#endif + #include #include #include @@ -42,10 +47,11 @@ #define IDM_TEL_SUSP 0x0110 #define IDM_TEL_EOR 0x0120 #define IDM_TEL_EOF 0x0130 -#define IDM_ABOUT 0x0140 -#define IDM_SAVEDSESS 0x0150 -#define IDM_COPYALL 0x0160 -#define IDM_FULLSCREEN 0x0170 +#define IDM_HELP 0x0140 +#define IDM_ABOUT 0x0150 +#define IDM_SAVEDSESS 0x0160 +#define IDM_COPYALL 0x0170 +#define IDM_FULLSCREEN 0x0180 #define IDM_SESSLGP 0x0250 /* log type printable */ #define IDM_SESSLGA 0x0260 /* log type all chars */ @@ -54,6 +60,7 @@ #define IDM_SAVED_MAX 0x2000 #define WM_IGNORE_CLIP (WM_XUSER + 2) +#define WM_FULLSCR_ON_MAX (WM_XUSER + 3) /* Needed for Chinese support and apparently not always defined. */ #ifndef VK_PROCESSKEY @@ -73,10 +80,15 @@ static void init_palette(void); static void init_fonts(int, int); static void another_font(int); static void deinit_fonts(void); +static void set_input_locale(HKL); + +static int is_full_screen(void); +static void make_full_screen(void); +static void clear_full_screen(void); +static void flip_full_screen(void); /* Window layout information */ static void reset_window(int); -static int full_screen = 0; static int extra_width, extra_height; static int font_width, font_height, font_dualwidth; static int offset_width, offset_height; @@ -88,7 +100,6 @@ static WPARAM pend_netevent_wParam = 0; static LPARAM pend_netevent_lParam = 0; static void enact_pending_netevent(void); static void flash_window(int mode); -static void flip_full_screen(void); static time_t last_movement = 0; @@ -190,6 +201,32 @@ int WINAPI WinMain(HINSTANCE inst, HINSTANCE prev, LPSTR cmdline, int show) } /* + * See if we can find our Help file. + */ + { + char b[2048], *p, *q, *r; + FILE *fp; + GetModuleFileName(NULL, b, sizeof(b) - 1); + r = b; + p = strrchr(b, '\\'); + if (p && p >= r) r = p+1; + q = strrchr(b, ':'); + if (q && q >= r) r = q+1; + strcpy(r, "putty.hlp"); + if ( (fp = fopen(b, "r")) != NULL) { + help_path = dupstr(b); + fclose(fp); + } else + help_path = NULL; + strcpy(r, "putty.cnt"); + if ( (fp = fopen(b, "r")) != NULL) { + help_has_contents = TRUE; + fclose(fp); + } else + help_has_contents = FALSE; + } + + /* * Process the command line. */ { @@ -507,7 +544,7 @@ int WINAPI WinMain(HINSTANCE inst, HINSTANCE prev, LPSTR cmdline, int show) char msg[1024], *title; char *realhost; - error = back->init(cfg.host, cfg.port, &realhost); + error = back->init(cfg.host, cfg.port, &realhost, cfg.tcp_nodelay); if (error) { sprintf(msg, "Unable to open connection to\n" "%.800s\n" "%s", cfg.host, error); @@ -585,10 +622,17 @@ int WINAPI WinMain(HINSTANCE inst, HINSTANCE prev, LPSTR cmdline, int show) AppendMenu(m, (cfg.resize_action == RESIZE_DISABLED) ? MF_GRAYED : MF_ENABLED, IDM_FULLSCREEN, "&Full Screen"); AppendMenu(m, MF_SEPARATOR, 0, 0); + if (help_path) + AppendMenu(m, MF_ENABLED, IDM_HELP, "&Help"); AppendMenu(m, MF_ENABLED, IDM_ABOUT, "&About PuTTY"); } /* + * Set up the initial input locale. + */ + set_input_locale(GetKeyboardLayout(0)); + + /* * Finally show the window! */ ShowWindow(hwnd, show); @@ -666,6 +710,9 @@ int WINAPI WinMain(HINSTANCE inst, HINSTANCE prev, LPSTR cmdline, int show) flash_window(1); /* maintain */ + /* The messages seem unreliable; especially if we're being tricky */ + has_focus = (GetForegroundWindow() == hwnd); + if (in_vbell) /* Hmm, term_update didn't want to do an update too soon ... */ timer_id = SetTimer(hwnd, 1, 50, NULL); @@ -1113,7 +1160,7 @@ void request_resize(int w, int h) /* If the window is maximized supress resizing attempts */ if (IsZoomed(hwnd)) { - if (cfg.resize_action != RESIZE_FONT) + if (cfg.resize_action == RESIZE_TERM) return; } @@ -1150,7 +1197,7 @@ void request_resize(int w, int h) term_size(h, w, cfg.savelines); - if (cfg.resize_action != RESIZE_FONT) { + if (cfg.resize_action != RESIZE_FONT && !IsZoomed(hwnd)) { width = extra_width + font_width * w; height = extra_height + font_height * h; @@ -1185,6 +1232,8 @@ static void reset_window(int reinit) { 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 @@ -1218,7 +1267,7 @@ static void reset_window(int reinit) { 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_FONT) { + if (cfg.resize_action != RESIZE_TERM) { if ( font_width != win_width/cols || font_height != win_height/rows) { deinit_fonts(); @@ -1274,6 +1323,8 @@ static void reset_window(int reinit) { font_height*rows + extra_height, SWP_NOMOVE | SWP_NOZORDER); } + + InvalidateRect(hwnd, NULL, TRUE); return; } @@ -1281,7 +1332,9 @@ static void reset_window(int reinit) { * window. But that may be too big for the screen which forces us * to change the terminal. */ - if ((cfg.resize_action != RESIZE_FONT && reinit==0) || reinit>0) { + 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; @@ -1298,13 +1351,27 @@ static void reset_window(int reinit) { /* Grrr too big */ if ( rows > height || cols > width ) { - if ( height > rows ) height = rows; - if ( width > cols ) width = cols; - term_size(height, width, cfg.savelines); + if (cfg.resize_action == RESIZE_EITHER) { + /* Make the font the biggest we can */ + if (cols > width) + font_width = (ss.right - ss.left - extra_width)/cols; + if (rows > height) + font_height = (ss.bottom - ss.top - extra_height)/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 > rows ) height = rows; + if ( width > cols ) width = cols; + term_size(height, width, cfg.savelines); #ifdef RDB_DEBUG_PATCH - debug((27, "reset_window() -> term resize to (%d,%d)", - height, width)); + debug((27, "reset_window() -> term resize to (%d,%d)", + height, width)); #endif + } } SetWindowPos(hwnd, NULL, 0, 0, @@ -1344,6 +1411,16 @@ static void reset_window(int reinit) { } } +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(); @@ -1415,6 +1492,7 @@ static LRESULT CALLBACK WndProc(HWND hwnd, UINT message, HDC hdc; static int ignore_clip = FALSE; static int need_backend_resize = FALSE; + static int fullscr_on_max = FALSE; switch (message) { case WM_TIMER: @@ -1493,15 +1571,20 @@ static LRESULT CALLBACK WndProc(HWND hwnd, UINT message, sprintf(c, "putty &%p", filemap); cl = c; } else if (wParam == IDM_SAVEDSESS) { - char *session = - sessions[(lParam - IDM_SAVED_MIN) / 16]; - cl = smalloc(16 + strlen(session)); /* 8, but play safe */ - if (!cl) - cl = NULL; /* not a very important failure mode */ - else { - sprintf(cl, "putty @%s", session); - freecl = TRUE; - } + if ((lParam - IDM_SAVED_MIN) / 16 < nsessions) { + char *session = + sessions[(lParam - IDM_SAVED_MIN) / 16]; + cl = smalloc(16 + strlen(session)); + /* 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; @@ -1540,9 +1623,9 @@ static LRESULT CALLBACK WndProc(HWND hwnd, UINT message, (cfg.resize_action == RESIZE_DISABLED) ? MF_GRAYED : MF_ENABLED); /* Gracefully unzoom if necessary */ - if (full_screen && + if (IsZoomed(hwnd) && (cfg.resize_action == RESIZE_DISABLED)) { - flip_full_screen(); + ShowWindow(hwnd, SW_RESTORE); } } @@ -1569,7 +1652,9 @@ static LRESULT CALLBACK WndProc(HWND hwnd, UINT message, if (cfg.height != prev_cfg.height || cfg.width != prev_cfg.width || cfg.savelines != prev_cfg.savelines || - cfg.resize_action != RESIZE_TERM) + cfg.resize_action == RESIZE_FONT || + (cfg.resize_action == RESIZE_EITHER && IsZoomed(hwnd)) || + cfg.resize_action == RESIZE_DISABLED) term_size(cfg.height, cfg.width, cfg.savelines); /* Enable or disable the scroll bar, etc */ @@ -1596,15 +1681,22 @@ static LRESULT CALLBACK WndProc(HWND hwnd, UINT message, nexflag &= ~(WS_EX_CLIENTEDGE); nflg = flag; - if (full_screen ? + if (is_full_screen() ? cfg.scrollbar_in_fullscreen : cfg.scrollbar) nflg |= WS_VSCROLL; else nflg &= ~WS_VSCROLL; + + if (cfg.resize_action == RESIZE_DISABLED || + is_full_screen()) + nflg &= ~WS_THICKFRAME; + else + nflg |= WS_THICKFRAME; + if (cfg.resize_action == RESIZE_DISABLED) - nflg &= ~(WS_THICKFRAME | WS_MAXIMIZEBOX); + nflg &= ~WS_MAXIMIZEBOX; else - nflg |= (WS_THICKFRAME | WS_MAXIMIZEBOX); + nflg |= WS_MAXIMIZEBOX; if (nflg != flag || nexflag != exflag) { if (nflg != flag) @@ -1641,8 +1733,9 @@ static LRESULT CALLBACK WndProc(HWND hwnd, UINT message, cfg.fontcharset != prev_cfg.fontcharset || cfg.vtmode != prev_cfg.vtmode || cfg.bold_colour != prev_cfg.bold_colour || - (cfg.resize_action != RESIZE_FONT && - prev_cfg.resize_action == RESIZE_FONT)) + cfg.resize_action == RESIZE_DISABLED || + cfg.resize_action == RESIZE_EITHER || + (cfg.resize_action != prev_cfg.resize_action)) init_lvl = 2; InvalidateRect(hwnd, NULL, TRUE); @@ -1714,6 +1807,10 @@ static LRESULT CALLBACK WndProc(HWND hwnd, UINT message, case IDM_ABOUT: showabout(hwnd); break; + case IDM_HELP: + WinHelp(hwnd, help_path, + help_has_contents ? HELP_FINDER : HELP_CONTENTS, 0); + break; case SC_MOUSEMENU: /* * We get this if the System menu has been activated @@ -1735,8 +1832,8 @@ static LRESULT CALLBACK WndProc(HWND hwnd, UINT message, PostMessage(hwnd, WM_CHAR, ' ', 0); break; case IDM_FULLSCREEN: - flip_full_screen(); - break; + flip_full_screen(); + break; default: if (wParam >= IDM_SAVED_MIN && wParam <= IDM_SAVED_MAX) { SendMessage(hwnd, WM_SYSCOMMAND, IDM_SAVEDSESS, wParam); @@ -1832,7 +1929,7 @@ static LRESULT CALLBACK WndProc(HWND hwnd, UINT message, * window, we put up the System menu instead of doing * selection. */ - if (full_screen && press && button == MBT_LEFT && + if (is_full_screen() && press && button == MBT_LEFT && X_POS(lParam) == 0 && Y_POS(lParam) == 0) { SendMessage(hwnd, WM_SYSCOMMAND, SC_MOUSEMENU, 0); return 0; @@ -1993,22 +2090,26 @@ static LRESULT CALLBACK WndProc(HWND hwnd, UINT message, * 1) Keep the sizetip uptodate * 2) Make sure the window size is _stepped_ in units of the font size. */ - if (cfg.resize_action == RESIZE_TERM && !alt_pressed) { + if (cfg.resize_action != RESIZE_FONT && !alt_pressed) { int width, height, w, h, ew, eh; LPRECT r = (LPRECT) lParam; - if ( !need_backend_resize && + if ( !need_backend_resize && cfg.resize_action == RESIZE_EITHER && (cfg.height != rows || cfg.width != cols )) { /* - * Great! It seems the host has been changing the terminal - * size, well the user is now grabbing so this is probably - * the least confusing solution in the long run even though - * it a is suprise. Unfortunatly the only way to prevent - * this seems to be to let the host change the window size - * and as that's a user option we're still right back here. - */ + * Great! It seems that both the terminal size and the + * font size have been changed and the user is now dragging. + * + * It will now be difficult to get back to the configured + * font size! + * + * This would be easier but it seems to be too confusing. + term_size(cfg.height, cfg.width, cfg.savelines); reset_window(2); + */ + cfg.height=rows; cfg.width=cols; + InvalidateRect(hwnd, NULL, TRUE); need_backend_resize = TRUE; } @@ -2074,6 +2175,9 @@ static LRESULT CALLBACK WndProc(HWND hwnd, UINT message, return rv; } /* break; (never reached) */ + case WM_FULLSCR_ON_MAX: + fullscr_on_max = TRUE; + break; case WM_SIZE: #ifdef RDB_DEBUG_PATCH debug((27, "WM_SIZE %s (%d,%d)", @@ -2084,13 +2188,17 @@ static LRESULT CALLBACK WndProc(HWND hwnd, UINT message, "...", LOWORD(lParam), HIWORD(lParam))); #endif - if (wParam == SIZE_MINIMIZED) { + if (wParam == SIZE_MINIMIZED) SetWindowText(hwnd, cfg.win_name_always ? window_name : icon_name); - break; - } if (wParam == SIZE_RESTORED || wParam == SIZE_MAXIMIZED) SetWindowText(hwnd, window_name); + if (wParam == SIZE_RESTORED) + clear_full_screen(); + if (wParam == SIZE_MAXIMIZED && fullscr_on_max) { + make_full_screen(); + fullscr_on_max = FALSE; + } if (cfg.resize_action == RESIZE_DISABLED) { /* A resize, well it better be a minimize. */ @@ -2103,11 +2211,11 @@ static LRESULT CALLBACK WndProc(HWND hwnd, UINT message, height = HIWORD(lParam); if (!resizing) { - if (wParam == SIZE_MAXIMIZED) { + if (wParam == SIZE_MAXIMIZED && !was_zoomed) { was_zoomed = 1; prev_rows = rows; prev_cols = cols; - if (cfg.resize_action != RESIZE_FONT) { + if (cfg.resize_action == RESIZE_TERM) { w = width / font_width; if (w < 1) w = 1; h = height / font_height; @@ -2118,9 +2226,12 @@ static LRESULT CALLBACK WndProc(HWND hwnd, UINT message, reset_window(0); } else if (wParam == SIZE_RESTORED && was_zoomed) { was_zoomed = 0; - if (cfg.resize_action != RESIZE_FONT) + if (cfg.resize_action == RESIZE_TERM) term_size(prev_rows, prev_cols, cfg.savelines); - reset_window(0); + if (cfg.resize_action != RESIZE_FONT) + reset_window(2); + else + reset_window(0); } /* This is an unexpected resize, these will normally happen * if the window is too large. Probably either the user @@ -2137,7 +2248,7 @@ static LRESULT CALLBACK WndProc(HWND hwnd, UINT message, * down the connection during an NT opaque drag.) */ if (resizing) { - if (cfg.resize_action == RESIZE_TERM && !alt_pressed) { + if (cfg.resize_action != RESIZE_FONT && !alt_pressed) { need_backend_resize = TRUE; w = (width-cfg.window_border*2) / font_width; if (w < 1) w = 1; @@ -2256,19 +2367,9 @@ static LRESULT CALLBACK WndProc(HWND hwnd, UINT message, net_pending_errors(); return 0; case WM_INPUTLANGCHANGE: - { - /* wParam == Font number */ - /* lParam == Locale */ - char lbuf[20]; - HKL NewInputLocale = (HKL) lParam; - - // lParam == GetKeyboardLayout(0); - - GetLocaleInfo(LOWORD(NewInputLocale), - LOCALE_IDEFAULTANSICODEPAGE, lbuf, sizeof(lbuf)); - - kbd_codepage = atoi(lbuf); - } + /* wParam == Font number */ + /* lParam == Locale */ + set_input_locale((HKL)lParam); break; case WM_IME_NOTIFY: if(wParam == IMN_SETOPENSTATUS) { @@ -3011,7 +3112,8 @@ static int TranslateKey(UINT message, WPARAM wParam, LPARAM lParam, } if (left_alt && wParam == VK_RETURN && cfg.fullscreenonaltenter && (cfg.resize_action != RESIZE_DISABLED)) { - flip_full_screen(); + if ((HIWORD(lParam) & (KF_UP | KF_REPEAT)) != KF_REPEAT) + flip_full_screen(); return -1; } /* Control-Numlock for app-keypad mode switch */ @@ -3578,7 +3680,7 @@ void set_sbar(int total, int start, int page) { SCROLLINFO si; - if (!cfg.scrollbar) + if (is_full_screen() ? !cfg.scrollbar_in_fullscreen : !cfg.scrollbar) return; si.cbSize = sizeof(si); @@ -3711,13 +3813,11 @@ void write_clip(wchar_t * data, int len, int must_deselect) len * sizeof(wchar_t)); clipdata2 = GlobalAlloc(GMEM_DDESHARE | GMEM_MOVEABLE, len2); - if (!clipdata || !clipdata2 || !clipdata3) { + if (!clipdata || !clipdata2) { if (clipdata) GlobalFree(clipdata); if (clipdata2) GlobalFree(clipdata2); - if (clipdata3) - GlobalFree(clipdata3); return; } if (!(lock = GlobalLock(clipdata))) @@ -4019,64 +4119,6 @@ void beep(int mode) } /* - * Toggle full screen mode. Thanks to cwis@nerim.fr for the - * implementation. - * Revised by - */ -static void flip_full_screen(void) -{ - WINDOWPLACEMENT wp; - LONG style; - - wp.length = sizeof(wp); - GetWindowPlacement(hwnd, &wp); - - full_screen = !full_screen; - - if (full_screen) { - if (wp.showCmd == SW_SHOWMAXIMIZED) { - /* Ooops it was already 'zoomed' we have to unzoom it before - * everything will work right. - */ - wp.showCmd = SW_SHOWNORMAL; - SetWindowPlacement(hwnd, &wp); - } - - style = GetWindowLong(hwnd, GWL_STYLE) & ~WS_CAPTION; - style &= ~WS_VSCROLL; - if (cfg.scrollbar_in_fullscreen) - style |= WS_VSCROLL; - SetWindowLong(hwnd, GWL_STYLE, style); - - /* This seems to be needed otherwize explorer doesn't notice - * we want to go fullscreen and it's bar is still visible - */ - SetWindowPos(hwnd, NULL, 0, 0, 0, 0, - SWP_NOACTIVATE | SWP_NOCOPYBITS | - SWP_NOMOVE | SWP_NOSIZE | SWP_NOZORDER | - SWP_FRAMECHANGED); - - wp.showCmd = SW_SHOWMAXIMIZED; - SetWindowPlacement(hwnd, &wp); - } else { - style = GetWindowLong(hwnd, GWL_STYLE) | WS_CAPTION; - style &= ~WS_VSCROLL; - if (cfg.scrollbar) - style |= WS_VSCROLL; - SetWindowLong(hwnd, GWL_STYLE, style); - - /* Don't need to do a SetWindowPos as the resize will force a - * full redraw. - */ - wp.showCmd = SW_SHOWNORMAL; - SetWindowPlacement(hwnd, &wp); - } - - CheckMenuItem(GetSystemMenu(hwnd, FALSE), IDM_FULLSCREEN, - MF_BYCOMMAND| full_screen ? MF_CHECKED : MF_UNCHECKED); -} - -/* * Minimise or restore the window in response to a server-side * request. */ @@ -4105,7 +4147,7 @@ void move_window(int x, int y) */ void set_zorder(int top) { - if (cfg.alwaysontop || full_screen) + if (cfg.alwaysontop) return; /* ignore */ SetWindowPos(hwnd, top ? HWND_TOP : HWND_BOTTOM, 0, 0, 0, 0, SWP_NOMOVE | SWP_NOSIZE); @@ -4125,13 +4167,9 @@ void refresh_window(void) */ void set_zoomed(int zoomed) { - if (IsZoomed(hwnd) || full_screen) { - if (!zoomed) { - if (full_screen) - flip_full_screen(); - else - ShowWindow(hwnd, SW_RESTORE); - } + if (IsZoomed(hwnd)) { + if (!zoomed) + ShowWindow(hwnd, SW_RESTORE); } else { if (zoomed) ShowWindow(hwnd, SW_MAXIMIZE); @@ -4175,3 +4213,105 @@ char *get_window_title(int icon) { return icon ? icon_name : window_name; } + +/* + * See if we're in full-screen mode. + */ +int is_full_screen() +{ + if (!IsZoomed(hwnd)) + return FALSE; + if (GetWindowLong(hwnd, GWL_STYLE) & WS_CAPTION) + return FALSE; + return TRUE; +} + +/* + * Go full-screen. This should only be called when we are already + * maximised. + */ +void make_full_screen() +{ + DWORD style; + int x, y, w, h; + + assert(IsZoomed(hwnd)); + + /* Remove the window furniture. */ + style = GetWindowLong(hwnd, GWL_STYLE); + style &= ~(WS_CAPTION | WS_BORDER | WS_THICKFRAME); + if (cfg.scrollbar_in_fullscreen) + style |= WS_VSCROLL; + else + style &= ~WS_VSCROLL; + SetWindowLong(hwnd, GWL_STYLE, style); + + /* Resize ourselves to exactly cover the nearest monitor. */ +#ifdef MONITOR_DEFAULTTONEAREST + { + HMONITOR mon; + MONITORINFO mi; + mon = MonitorFromWindow(hwnd, MONITOR_DEFAULTTONEAREST); + mi.cbSize = sizeof(mi); + GetMonitorInfo(mon, &mi); + x = mi.rcMonitor.left; + y = mi.rcMonitor.top; + w = mi.rcMonitor.right; + h = mi.rcMonitor.bottom; + } +#else + x = y = 0; + w = GetSystemMetrics(SM_CXSCREEN); + h = GetSystemMetrics(SM_CYSCREEN); +#endif + SetWindowPos(hwnd, HWND_TOP, x, y, w, h, SWP_FRAMECHANGED); + + /* Tick the menu item in the System menu. */ + CheckMenuItem(GetSystemMenu(hwnd, FALSE), IDM_FULLSCREEN, + MF_CHECKED); +} + +/* + * Clear the full-screen attributes. + */ +void clear_full_screen() +{ + DWORD oldstyle, style; + + /* Reinstate the window furniture. */ + style = oldstyle = GetWindowLong(hwnd, GWL_STYLE); + style |= WS_CAPTION | WS_BORDER; + if (cfg.resize_action == RESIZE_DISABLED) + style &= ~WS_THICKFRAME; + else + style |= WS_THICKFRAME; + if (cfg.scrollbar) + style |= WS_VSCROLL; + else + style &= ~WS_VSCROLL; + if (style != oldstyle) { + SetWindowLong(hwnd, GWL_STYLE, style); + SetWindowPos(hwnd, NULL, 0, 0, 0, 0, + SWP_NOMOVE | SWP_NOSIZE | SWP_NOZORDER | + SWP_FRAMECHANGED); + } + + /* Untick the menu item in the System menu. */ + CheckMenuItem(GetSystemMenu(hwnd, FALSE), IDM_FULLSCREEN, + MF_UNCHECKED); +} + +/* + * Toggle full-screen mode. + */ +void flip_full_screen() +{ + if (is_full_screen()) { + ShowWindow(hwnd, SW_RESTORE); + } else if (IsZoomed(hwnd)) { + make_full_screen(); + } else { + SendMessage(hwnd, WM_FULLSCR_ON_MAX, 0, 0); + ShowWindow(hwnd, SW_MAXIMIZE); + } +}