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.
doesn't appear to have any negative consequences and may prevent
synergy from freezing when some X client (probably the window
manager) grabs the server.
is ignored on that client (it has no effect on the server). This
is useful for keyboards that don't have separate number pads and
the user often uses the client's keyboard directly, when turning
on NumLock interferes with normal typing.
to connect. This prevents a log from filling up while the client
can't connect for no useful reason. Also removed --camp option
and cleaned up handling of client connection. Users must now use
--restart instead of --camp.
sending a key that requires AltGr. That's because AltGr *is*
ctrl and alt but AltGr should be seen on clients as mode
switch without the ctrl and alt. I can't think of a better
way to do this other than to not send modifier keystrokes to
the clients at all.
with applying the incorrect shift and mode switch modifiers to
some keycodes, such as getting Pointer_EnableKeys when pressing
shift with NumLock enabled.
need a precompose area or status area. This includes IMs that
do simple dead key composition. This only changes the server.
The client still does not decompose a character it cannot
generate directly into the keysyms to compose the character.
family because nt automatically converts to and from the unicode
format. This may fix text encoding errors when synergy puts
non-ascii text on the clipboard and other clients prefer CF_TEXT
to CF_UNICODE (which they should not because synergy lists
CF_UNICODE first).
is accessible (was already fixed when inaccessible). This change
also ignores press and release of virtual key 0, which should never
happen but does according to one user.
warping on screen 0. That just doesn't work if screen 0 is not at
0,0. So now always use XWarpPointer() if there are multiple
xinerama screens and the appropriate option is enabled.
true, faking a mouse motion outside screen 0 is clamped onto screen 0.
When the workaround is enabled, we use XWarpPointer() instead of an
XTest fake motion. This isn't perfect but the only real fix requires
patching XTest.
Some users requested this. Also, the hider window is mapped before
warping the mouse so the active window shouldn't change if the focus
policy is point-to-focus. Showing the window first can also reduce
the likelihood of seeing the cursor briefly in its hidden position.
the server from auto-repeating fake events, which is undesired
since synergy will do the auto-repeating itself. This also
disables auto-repeat on any keys locally configured on X11 to not
auto-repeat. That's mainly to suppress auto-repeat on modifier
keys, which auto-repeat on win32 but not X11.
now captures non-client area mouse messages. Previously, these
were ignored (because i forgot about them) and they caused all
kinds of problems because they weren't forwarded. For example,
clicking on a window border would cause the window to start
resizing when the mouse came back to the server screen. Moving
inside a title bar meant that the mouse wouldn't move on the
client screen.
Second, because non-client messages are now handled, the full
screen transparent window is no longer necessary to capture
input so it's never displayed. (The window is still necessary
for clipboard ownership so it's still created.) No transparent
window means no screen flashing. It also means we don't have to
become the foreground and active window. This plays better with
apps that minimize or restore when they're no longer the
foreground application/active window.
Third, fixed the low level keyboard hook to forward toggle key
updates, which it was neglecting to do.
Finally, keyboard and mouse input is always forwarded from the hook
to the primary screen handler which then shadows the current key
and mouse button state. If we're using low level hooks then this
isn't really necessary and GetKeyState() always returns the right
info but without low level hooks it means we can just use the
shadow state. It also means we don't have to show our window in
order to get the system's key state table up to date, fixing the
screen flash when checking for the scroll lock state.
realtime priority). After some testing it appears that anything
less than this can starve synergy in some circumstances, preventing
it from forwarding messages to clients. This is a rather risky
change since synergy can now virtually take over a system if it
behaves badly. This change only affects windows systems since
lib/arch of other platforms don't yet attempt to boost priority.
key handling to win32 on both client and server. It also changes
the protocol and adds code to ensure every key pressed also gets
released and that that doesn't get confused when the KeyID for
the press is different from the KeyID of the release (or repeat).
screen saver from activating. It was unnecessary since the built-in
screen saver is disabled as appropriate; this call was just to
ensure that the screen saver wouldn't start if an external program
reactivated the screen saver after synergy disabled it.
It's possible that this was causing screen flicker under gnome, though
i don't know why. It's also possible that periodically sending events
to xscreensaver is causing the flicker but removing that code is more
difficult because xscreensaver can't be disabled, only deactivated or
killed.
events to other hook functions, which broke some tools like objectbar.
Second, windows key processing was fixed. Previously pressing and
release the key would only send a press event, locking the user onto
the client window; also, the win32 server treated as a Meta modifier
instead of a Super modifier, which broke any use of it as any kind of
modifier key. Third, added hacks to support several key combinations
on windows 95/98/me that are treated specially by windows, including
Alt+Tab, Alt+Shift+Tab, Alt+Esc, Alt+Shift+Esc, Ctrl+Esc, and any
combination using the windows key like Win+E and Win+F but not
Ctrl+Alt+Del. Fourth, scroll lock only locking to the client (which
only happened when using a synergy server on windows) has been fixed;
unfortunately the solution causes a lot of screen redraws for some
reason. Finally, there's been a fix to clipboard handling that may
or may not fix a problem where the clipboard would stop transferring
between systems after a little while. I can't be sure if it fixes
the problem because I can't reproduce the problem.
entering the loop waiting for it to deactivate. The failure
to check was causing the screen saver code to kick in when
the screen saver timeout occurred, even if the screen saver
wasn't enabled (because Windows still sends the screen saver
activating message for no good reason when the screen saver
is disabled).
when not on the primary monitor. This should eliminate the flicker
between virtual display 0,0 and the correct position. While this
allows the user to confuse synergy by using the client's mouse,
synergy recovers quickly and easily from any confusion.
a race condition where the synergy server updates the mouse
position but the synergy hook later receives a mouse update from
before the position change (i.e. out of order).
use Xlib to convert an unmatched keysym to upper and lower case and
use whichever, if any, is not the same as the original keysym.
This supports case conversion in any language that Xlib supports
it in.
mouse behavior on multimonitor windows systems. Those errors
broke synergy on all windows systems running as a server.
Also added an attempt to reduce the occasional jump that can
occur when switching screens when windows is the server.
code in a conditional for moving left that blew an assert verifying
that the mouse position was really on the screen if the neighbor
screen wasn't connected.
After that was fixed there was another problem when one screen
linked to another which then linked (in the same direction) to
itself. If the latter screen wasn't connected then it'd get into
an infinite loop.
It was doing that already if started through synergy but not if
started by something outside of synergy. In particular, if you
use `xscreensaver-command --activate' synergy used to send fake
mouse motion events every 5 seconds to deactivate it. That's
unlikely to be what the user wanted, especially if the locking is
enabled since it would force the password dialog to appear.
As before, it's recommended that client screens not use locking
because xscreensaver will not deactivate without getting a
password even if we make the request through a programmatic
interface. Presumably that's for security reasons but it makes
life harder for synergy.
reported by the synergy hook dll is in a space with 0,0 in the
upper-left which is not necessarily the same as the virtual desktop
space. So the windows primary screen now accounts for that. On
the secondary screen, mouse_event() doesn't seem to accept negative
coordinates even on the windows NT family, making monitors with
negative coordinates inaccessible via absolute moves. So if the
move will be to negative coordinates, use the windows 95 family
fallback of absolute moving to 0,0 then relative moving to the
final position.
and the platform specific implementations to lib/platform.
Added an lib/arch method to query the platform's native wide
character encoding and changed CUnicode to use it. All
platform dependent code is now in lib/arch, lib/platform,
and the programs under cmd. Also added more documentation.
lib/arch. This should make porting easier. Will probably
continue to refactor a little more, moving platform dependent
event handling stuff into lib/platform.
and sending those options to the appropriate client screens.
Currently, two options are supported: halfDuplexCapsLock and
halfDuplexNumLock mark the caps lock and num lock keys,
respectively, as being half-duplex.
the mouse is locked to the screen. We can't tell if a half-
duplex key is physically down and logically down just means
it's active so there's no point in letting it lock the mouse
to the screen.
their state when the screen was entered. Previously when
leaving a client screen the toggle keys kept their state so,
say, caps lock, would remain on. This was inconvenient if
you then used the client's keyboard directly.
from a windows server. Was converting ctrl+alt on windows to
mode switch on the server. No longer doing that; windows clients
will interpret ctrl+alt as AltGr and other clients will just see
ctrl+alt. Also made the right alt key mode switch on windows
servers in case the user wants to force a mode switch, but that
means the right alt key no longer acts as alt on clients.
an internal compiler error; building that file without
optimization works around the compiler bug. Sadly, synergy can
only interact with X windows, not native MacOS windows.
handling read errors at all and error handling for writes was
never being used. Now the socket disconnects if a read or write
fails on the socket for any reason except EINTR. Also added
<netinet/in.h> to includes in CNetwork.h because it's needed on
some platforms.
anyway but isn't implemented in winsock, removed use of INADDR_NONE
which some platforms don't define except on winsock which does
define it, and changed SOL_TCP to IPPROTO_TCP which should work on
more platforms.
more robust now. Also added handling of Super modifier key and
changed windows keys to map to Super instead of Meta, which is
the default on my keyboard.