mirror of
https://git.tartarus.org/simon/putty.git
synced 2025-01-10 01:48:00 +00:00
f9e572595b
This is a piece of refactoring that's been overdue forever. In the Unix front end, all the variables specific to a particular SSH session live in a big 'inst' structure, and calls to any of the trait APIs like Seat or TermWin can recover the right 'inst' from their input context pointer. But the Windows frontend was written before that kind of thing became habitual to me, and all its variables have been just lying around at the top level of window.c, and most of those context pointers were just ignored. Now I've swept them all up and put them where they ought to be, in a big context structure. This was made immeasurably easier by the very nifty 'clang-rename' tool, which can rename a single variable in a C source file, and find just the right set of identifiers to change even if other variables in the file have the same name, even in sub-scopes. So I started by clang-renaming all the top-level variables in question to have names beginning with a prefix that didn't previously appear anywhere in the code; checked that still worked; and then moved all the declarations into the struct type and did a purely textual search-and-replace of the prefix with 'wgs->'. One potential benefit of this change is that it allows more than one instance of the WinGuiSeat structure to exist in the same process. I don't have any immediate plans to actually do that, but it's nice to know it wouldn't be ruled out if we ever did need it. But that's not the main reason I did it. The main reason is that I recently looked at the output of a Windows build using clang -Wall, and was horrified by the number of casual shadowings of generically-named global variables like 'term' and 'conf' with local variables of the same name. That seemed like a recipe for confusion, and I decided the best way to disambiguate them all was to do this refactoring that I'd wanted anyway for years. A few uses of the global variables occurred in functions that didn't have convenient access to the right WinGuiSeat via a callback parameter of some kind. Those had to be treated specially. Most were cleaned up in advance by the previous few commits; the remaining fixes in this commit itself were in functions like modalfatalbox(), nonfatal() and cleanup_exit(). The error reporting functions want the terminal HWND to use as a MessageBox parameter; they also have the side effect of un-hiding the mouse pointer in the terminal window, in case it's hidden; and cleanup_exit wanted to free some resources dangling off the WinGuiSeat. For most of those cases, I've made a linked list of all currently live WinGuiSeat structures, so that they can loop over _all_ live instances (whether there's one as usual, none, or maybe more than one in future). The parent window for non-connection-specific error messages is found by simply picking one arbitrarily off the linked list (if any); the cleanups are done by iterating over the _whole_ list. The mouse-pointer unhiding is dealt with by simply allowing show_mouseptr to take a _null_ WinGuiSeat pointer. The only thing it needs the context for at all is to check whether pointer-hiding is enabled in the session's Conf; so if we're _un_-hiding the pointer we don't need to check, and can unhide it unconditionally. The remaining global variables in window.c are the new linked list of all WinGuiSeat structures; 'wm_mousewheel' and 'trust_icon' which really should be global across all WinGuiSeats even if we were to have more than one; and there's a static variable 'cursor_visible' in show_mouseptr() which is likewise legitimately Seat-independent (since it records the last value we passed to the Win32 API ShowCursor function, and _that's_ global across the whole process state). All of this should cause no functional change whatsoever. |
||
---|---|---|
charset | ||
cmake | ||
contrib | ||
crypto | ||
doc | ||
icons | ||
keygen | ||
otherbackends | ||
proxy | ||
ssh | ||
stubs | ||
terminal | ||
test | ||
unix | ||
utils | ||
windows | ||
.gitignore | ||
aqsync.c | ||
be_list.c | ||
Buildscr | ||
Buildscr.cv | ||
callback.c | ||
cgtest.c | ||
CHECKLST.txt | ||
clicons.c | ||
CMakeLists.txt | ||
cmdgen.c | ||
cmdline.c | ||
config.c | ||
console.c | ||
console.h | ||
defs.h | ||
dialog.c | ||
dialog.h | ||
errsock.c | ||
import.c | ||
LATEST.VER | ||
ldisc.c | ||
LICENCE | ||
licence.pl | ||
logging.c | ||
marshal.h | ||
misc.h | ||
mksrcarc.sh | ||
mkunxarc.sh | ||
mpint.h | ||
network.h | ||
pageant.c | ||
pageant.h | ||
pinger.c | ||
pscp.c | ||
psftp.c | ||
psftp.h | ||
psftpcommon.c | ||
psocks.c | ||
psocks.h | ||
putty.h | ||
puttymem.h | ||
README | ||
release.pl | ||
settings.c | ||
sign.sh | ||
ssh.h | ||
sshcr.h | ||
sshkeygen.h | ||
sshpubk.c | ||
sshrand.c | ||
storage.h | ||
timing.c | ||
tree234.h | ||
version.h | ||
x11disp.c |
This is the README for PuTTY, a free Windows and Unix Telnet and SSH client. PuTTY is built using CMake <https://cmake.org/>. To compile in the simplest way (on any of Linux, Windows or Mac), run these commands in the source directory: cmake . cmake --build . Then, to install in the simplest way on Linux or Mac: cmake --build . --target install On Unix, pterm would like to be setuid or setgid, as appropriate, to permit it to write records of user logins to /var/run/utmp and /var/log/wtmp. (Of course it will not use this privilege for anything else, and in particular it will drop all privileges before starting up complex subsystems like GTK.) The cmake install step doesn't attempt to add these privileges, so if you want user login recording to work, you should manually ch{own,grp} and chmod the pterm binary yourself after installation. If you don't do this, pterm will still work, but not update the user login databases. Documentation (in various formats including Windows Help and Unix `man' pages) is built from the Halibut (`.but') files in the `doc' subdirectory using `doc/Makefile'. If you aren't using one of our source snapshots, you'll need to do this yourself. Halibut can be found at <https://www.chiark.greenend.org.uk/~sgtatham/halibut/>. The PuTTY home web site is https://www.chiark.greenend.org.uk/~sgtatham/putty/ If you want to send bug reports or feature requests, please read the Feedback section of the web site before doing so. Sending one-line reports saying `it doesn't work' will waste your time as much as ours. See the file LICENCE for the licence conditions.