poll() but there was a race condition where the thread trying
to unblock poll() could send the signal before the polling
thread had entered poll(). Now using a pipe and polling on
that and the client's sockets, and just writing a byte into
the pipe to unblock poll. This persists until the next call
to poll() so we might force poll() to return once unnecessarily
but that's not a problem. This change makes the BSD code
similar to the winsock code, which uses a winsock event instead
of a pipe.
buffer that holds the events and generates system events. This
allows us to switch in/out a platform specific event handler as
necessary without losing our timers and handlers.
event loop model. Streams, stream filters, and sockets are
converted. Client proxies are almost converted. CServer is
in progress. Removed all HTTP code. Haven't converted the
necessary win32 arch stuff.
an event queue and events, TCP sockets converted to use events,
unix multithreading and network stuff converted, and an X Windows
event queue subclass.
doesn't map to anything via AltGr. This is an improvement over
the previous code which would simply discard the key but it
still behaves slightly differently than pressing ctrl+alt+<key>
on the server: if that combination is a hotkey on the server
then the hotkey is performed, even if the combination is also
a valid AltGr combination; on the client, we'll get the AltGr
combination in preference to the hotkey.
using low-level keyboard hooks, fixed handling of the global
keyboard layout dead key buffer, fixed identification of dead
keys, fixed synthesis of AltGr (now using right-alt instead
of left-alt), now using VK_DECIMAL for Separator key, fixed
bug where an unmappable key was treated as virtual key 0xff,
and added support for shift-space (shift was being discarded).
Also fixed failure to hide cursor when leaving primary screen
and added support for handling PrintScreen key.
and then space should convert the dead key to a non-dead key but
previous the key was discarded. Fixed that but VkKeyScan() fails
in this case so added special case to fix that (assuming AltGr is
required). VkKeyScan() can return the wrong result for characters
that have more than one virtual key mapped to them. AltGr+9 (^)
on the French layout has this problem. Now detecting that problem
and using the current keyboard state to decide if AltGr is
required.