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

Add a general way to request an immediate top-level callback.

This is a little like schedule_timer, in that the callback you provide
will be run from the top-level message loop of whatever application
you're in; but unlike the timer mechanism, it will happen
_immediately_.

The aim is to provide a general way to avoid re-entrance of code, in
cases where just _doing_ the thing you want done is liable to trigger
a confusing recursive call to the function in which you came to the
decision to do it; instead, you just request a top-level callback at
the message loop's earliest convenience, and do it then.

[originally from svn r10019]
This commit is contained in:
Simon Tatham
2013-08-17 16:06:08 +00:00
parent 883641845f
commit 75c79e318f
9 changed files with 130 additions and 6 deletions

View File

@ -869,6 +869,8 @@ int WINAPI WinMain(HINSTANCE inst, HINSTANCE prev, LPSTR cmdline, int show)
} else
sfree(handles);
run_toplevel_callbacks();
while (PeekMessage(&msg, NULL, 0, 0, PM_REMOVE)) {
if (msg.message == WM_QUIT)
goto finished; /* two-level break */
@ -877,12 +879,11 @@ int WINAPI WinMain(HINSTANCE inst, HINSTANCE prev, LPSTR cmdline, int show)
DispatchMessage(&msg);
/* Send the paste buffer if there's anything to send */
term_paste(term);
/* If there's nothing new in the queue then we can do everything
* we've delayed, reading the socket, writing, and repainting
* the window.
*/
if (must_close_session)
close_session();
run_toplevel_callbacks();
}
/* The messages seem unreliable; especially if we're being tricky */

View File

@ -738,6 +738,8 @@ int main(int argc, char **argv)
}
}
run_toplevel_callbacks();
if (n == WAIT_TIMEOUT) {
now = next;
} else {

View File

@ -585,6 +585,8 @@ int do_eventsel_loop(HANDLE other_event)
sfree(handles);
run_toplevel_callbacks();
if (n == WAIT_TIMEOUT) {
now = next;
} else {