1
0
mirror of https://git.tartarus.org/simon/putty.git synced 2025-03-16 03:53:01 -05:00

Fix side-effect of Always On Top patch: any reconfiguring in mid-session

was zapping the window to the top left corner of the screen

[originally from svn r780]
This commit is contained in:
Simon Tatham 2000-10-30 10:39:10 +00:00
parent 21299d2c39
commit a739876719

172
window.c
View File

@ -1156,92 +1156,102 @@ static LRESULT CALLBACK WndProc (HWND hwnd, UINT message,
} }
break; break;
case IDM_RECONF: case IDM_RECONF:
if (!do_reconfig(hwnd)) {
break; int prev_alwaysontop = cfg.alwaysontop;
just_reconfigged = TRUE; if (!do_reconfig(hwnd))
{ break;
int i; just_reconfigged = TRUE;
for (i=0; i<8; i++) {
if (fonts[i]) int i;
DeleteObject(fonts[i]); for (i=0; i<8; i++)
} if (fonts[i])
bold_mode = cfg.bold_colour ? BOLD_COLOURS : BOLD_FONT; DeleteObject(fonts[i]);
und_mode = UND_FONT; }
init_fonts(0); bold_mode = cfg.bold_colour ? BOLD_COLOURS : BOLD_FONT;
sfree(logpal); und_mode = UND_FONT;
/* Telnet will change local echo -> remote if the remote asks */ init_fonts(0);
if (cfg.protocol != PROT_TELNET) sfree(logpal);
ldisc = (cfg.ldisc_term ? &ldisc_term : &ldisc_simple); /*
if (pal) * Telnet will change local echo -> remote if the
DeleteObject(pal); * remote asks.
logpal = NULL; */
pal = NULL; if (cfg.protocol != PROT_TELNET)
cfgtopalette(); ldisc = (cfg.ldisc_term ? &ldisc_term : &ldisc_simple);
init_palette(); if (pal)
DeleteObject(pal);
logpal = NULL;
pal = NULL;
cfgtopalette();
init_palette();
/* Enable or disable the scroll bar, etc */ /* Enable or disable the scroll bar, etc */
{ {
LONG nflg, flag = GetWindowLong(hwnd, GWL_STYLE); LONG nflg, flag = GetWindowLong(hwnd, GWL_STYLE);
LONG nexflag, exflag = GetWindowLong(hwnd, GWL_EXSTYLE); LONG nexflag, exflag = GetWindowLong(hwnd, GWL_EXSTYLE);
nexflag = exflag; nexflag = exflag;
if (cfg.alwaysontop) { if (cfg.alwaysontop != prev_alwaysontop) {
nexflag = WS_EX_TOPMOST; if (cfg.alwaysontop) {
SetWindowPos(hwnd, HWND_TOPMOST, 0, 0, 0, 0, SWP_NOSIZE); nexflag = WS_EX_TOPMOST;
} else { SetWindowPos(hwnd, HWND_TOPMOST, 0, 0, 0, 0,
nexflag = 0; SWP_NOMOVE | SWP_NOSIZE);
SetWindowPos(hwnd, HWND_NOTOPMOST, 0, 0, 0, 0, SWP_NOSIZE); } else {
nexflag = 0;
SetWindowPos(hwnd, HWND_NOTOPMOST, 0, 0, 0, 0,
SWP_NOMOVE | SWP_NOSIZE);
}
}
nflg = flag;
if (cfg.scrollbar) nflg |= WS_VSCROLL;
else nflg &= ~WS_VSCROLL;
if (cfg.locksize)
nflg &= ~(WS_THICKFRAME|WS_MAXIMIZEBOX);
else
nflg |= (WS_THICKFRAME|WS_MAXIMIZEBOX);
if (nflg != flag || nexflag != exflag)
{
RECT cr, wr;
if (nflg != flag)
SetWindowLong(hwnd, GWL_STYLE, nflg);
if (nexflag != exflag)
SetWindowLong(hwnd, GWL_EXSTYLE, nexflag);
SendMessage (hwnd, WM_IGNORE_SIZE, 0, 0);
SetWindowPos(hwnd, NULL, 0,0,0,0,
SWP_NOACTIVATE|SWP_NOCOPYBITS|
SWP_NOMOVE|SWP_NOSIZE|SWP_NOZORDER|
SWP_FRAMECHANGED);
GetWindowRect (hwnd, &wr);
GetClientRect (hwnd, &cr);
extra_width = wr.right - wr.left - cr.right + cr.left;
extra_height = wr.bottom - wr.top - cr.bottom + cr.top;
}
} }
nflg = flag; term_size(cfg.height, cfg.width, cfg.savelines);
if (cfg.scrollbar) nflg |= WS_VSCROLL; InvalidateRect(hwnd, NULL, TRUE);
else nflg &= ~WS_VSCROLL; SetWindowPos (hwnd, NULL, 0, 0,
if (cfg.locksize) extra_width + font_width * cfg.width,
nflg &= ~(WS_THICKFRAME|WS_MAXIMIZEBOX); extra_height + font_height * cfg.height,
else SWP_NOACTIVATE | SWP_NOCOPYBITS |
nflg |= (WS_THICKFRAME|WS_MAXIMIZEBOX); SWP_NOMOVE | SWP_NOZORDER);
if (IsIconic(hwnd)) {
if (nflg != flag || nexflag != exflag) SetWindowText (hwnd,
{ cfg.win_name_always ? window_name : icon_name);
RECT cr, wr; }
}
if (nflg != flag)
SetWindowLong(hwnd, GWL_STYLE, nflg);
if (nexflag != exflag)
SetWindowLong(hwnd, GWL_EXSTYLE, nexflag);
SendMessage (hwnd, WM_IGNORE_SIZE, 0, 0);
SetWindowPos(hwnd, NULL, 0,0,0,0,
SWP_NOACTIVATE|SWP_NOCOPYBITS|
SWP_NOMOVE|SWP_NOSIZE|SWP_NOZORDER|
SWP_FRAMECHANGED);
GetWindowRect (hwnd, &wr);
GetClientRect (hwnd, &cr);
extra_width = wr.right - wr.left - cr.right + cr.left;
extra_height = wr.bottom - wr.top - cr.bottom + cr.top;
}
}
term_size(cfg.height, cfg.width, cfg.savelines);
InvalidateRect(hwnd, NULL, TRUE);
SetWindowPos (hwnd, NULL, 0, 0,
extra_width + font_width * cfg.width,
extra_height + font_height * cfg.height,
SWP_NOACTIVATE | SWP_NOCOPYBITS |
SWP_NOMOVE | SWP_NOZORDER);
if (IsIconic(hwnd)) {
SetWindowText (hwnd,
cfg.win_name_always ? window_name : icon_name);
}
break; break;
case IDM_CLRSB: case IDM_CLRSB:
term_clrsb(); term_clrsb();
break; break;
case IDM_RESET: case IDM_RESET:
term_pwron(); term_pwron();
break; break;
case IDM_TEL_AYT: back->special (TS_AYT); break; case IDM_TEL_AYT: back->special (TS_AYT); break;
case IDM_TEL_BRK: back->special (TS_BRK); break; case IDM_TEL_BRK: back->special (TS_BRK); break;
case IDM_TEL_SYNCH: back->special (TS_SYNCH); break; case IDM_TEL_SYNCH: back->special (TS_SYNCH); break;
case IDM_TEL_EC: back->special (TS_EC); break; case IDM_TEL_EC: back->special (TS_EC); break;