538 lines
17 KiB
Plaintext
538 lines
17 KiB
Plaintext
server client
|
|
------ ------
|
|
[accept] <-- connect
|
|
challenge --> [encrypt]
|
|
[verify] <-- response (encrypted challenge, client name)
|
|
hangup if invalid
|
|
query info -->
|
|
<-- info (size)
|
|
|
|
---
|
|
enable heartbeat disconnection or remove heartbeat sending in client
|
|
should either ship with it fully enabled or fully disabled
|
|
possibly make it part of startup negotiation
|
|
|
|
---
|
|
sometimes jumping too far into secondary screen
|
|
probably bogus delta (adding in center pixel coords into delta?)
|
|
this is with an X primary and secondary
|
|
don't know which matters but probably X primary
|
|
|
|
---
|
|
use automake
|
|
use doxygen
|
|
|
|
---
|
|
HTTP stuff
|
|
no way to save config using HTTP
|
|
should have a button or a page to force save of config
|
|
or just save config every time it's changed
|
|
should use authentication (at least basic)
|
|
provide way to kill/restart server via HTTP
|
|
provide way to query why locked to screen?
|
|
handy for debugging at least
|
|
|
|
---
|
|
make generic input devices?
|
|
replace mouse and keyboard with button and valuator devices?
|
|
could fairly easily add new devices then
|
|
valuators would have to come in groups that change together
|
|
mouse position would be two ganged valuators
|
|
key events are not simply button presses though
|
|
they have a non-boolean character, shift state, and repeat count
|
|
maybe another device type: {data, state, repeat}
|
|
|
|
must handle on-the-fly addition/removal of devices
|
|
USB allows hotplugging and we should support, say, an added joystick
|
|
|
|
must have device negotiation
|
|
at very least it negotiates mouse/keyboard at start
|
|
|
|
---
|
|
should add clipboard data type format negotiation
|
|
server sends permitted data type formats
|
|
client responds with known formats in permitted list
|
|
client must only send permitted formats
|
|
server can discard non-permitted formats
|
|
server must only send known, permitted formats to client
|
|
formats are names of the form [a-zA-Z0-9_/]+
|
|
server must be able to translate between all permitted formats
|
|
example: text formats:
|
|
text/plain/CRLF -- windows plain text
|
|
text/plain/LF -- unix plain text
|
|
text/plain/CR -- mac plain text
|
|
text/rtf -- rich text (does that require a particular newline?)
|
|
or image formats:
|
|
image/BMP
|
|
image/RAW
|
|
image/XPM
|
|
|
|
this will allow future versions to interoperate better. it also
|
|
allows compatibility with versions that are identical except for
|
|
the support clipboard formats, obviating bumping up the protocol
|
|
version number.
|
|
|
|
---
|
|
hot keys
|
|
should have keyboard shortcuts to jump to screens
|
|
|
|
---
|
|
win32:
|
|
need icon
|
|
provide taskbar icon
|
|
provide control panel?
|
|
|
|
win32 dll:
|
|
should make this as small as possible
|
|
don't use standard libraries
|
|
use custom _DllMainCRTStartup(); just call DllMain() from it.
|
|
use /MERGE linker switch to merge sections
|
|
|
|
win32 service:
|
|
need message table for proper event reporting
|
|
|
|
clean up c:\winnt\synergy.sgc
|
|
|
|
desktop switcher program failure when running synergy as service
|
|
returns access denied from CreateDesktop()
|
|
don't know why
|
|
|
|
---
|
|
bug with half-duplex keys
|
|
win32 server sent num-lock to grace
|
|
grace converts to half-duplex so only synthesizes key down
|
|
now grace starts server and is locked to screen
|
|
grace should ignore half duplex keys when seeing if locked to screen
|
|
|
|
---
|
|
bug in updating screens
|
|
saw a goofy set of screens after update
|
|
i think the config was similar to:
|
|
A B
|
|
C
|
|
D E
|
|
|
|
---
|
|
should switch to user nobody (or something similar) if running as root
|
|
for security reasons
|
|
will make it impossible to overwrite /etc/synergy.conf
|
|
if that file is only root writable (as it should be)
|
|
|
|
---
|
|
Xsetup file may have to kill previous synergy
|
|
or synergy should exit if there's already a synergy running
|
|
|
|
---
|
|
not handling international characters
|
|
|
|
---
|
|
xscreensaver won't start if pointer on secondary screen
|
|
unless using MIT or SGI screen saver extensions
|
|
otherwise it cannot know when to stop the screen saver
|
|
cos it can't grab mouse and keyboard
|
|
---
|
|
all screensavers hidden when showing win32 screensaver lock window
|
|
win32 kills the screen saver and shows the lock window
|
|
synergy thinks the screen saver is dead (cos the process is)
|
|
deactivates secondary screen screen savers
|
|
user is constrained to locked display, though
|
|
also, we don't detect screen saver restarting if user doesn't unlock screen
|
|
|
|
---
|
|
not distinguishing between caps lock and shift lock
|
|
In Caps Lock mode, the alphabetic keys send their uppercase (shifted) char-
|
|
acter when pressed alone. For Caps Lock mode, pressing and releasing the
|
|
lock key turns on the mode and pressing and releasing the lock key again
|
|
turns off the mode. In Shift Lock mode, all keys on the main keypad send
|
|
their shifted character when pressed alone. For Shift Lock mode, pressing
|
|
and releasing the Lock key turns on the mode, and pressing and releasing
|
|
either the Lock or the Shift key turns off the mode.
|
|
|
|
---
|
|
currently sending all clipboards to all clients
|
|
some clients may not need all clipboards
|
|
add filtering mechanism
|
|
setup is probably part of clipboard (format) negotiation
|
|
|
|
---
|
|
not handling large motif selections
|
|
there must be a limit because properties can only be so big
|
|
don't know protocol for transfer, though
|
|
|
|
---
|
|
need timeout on CXWindowsClipboard::CReply objects
|
|
should flush replies that are too old
|
|
assumption is that requestor is broken
|
|
|
|
---
|
|
inconsistencies
|
|
exceptions
|
|
using getWhat() in some places to return a code, elsewhere returns message
|
|
references/pointers
|
|
should use pointers for any in/out parameter
|
|
but using references in some places
|
|
|
|
---
|
|
avoid fullscreen transparent window on win32
|
|
using CBT hook to discard activation/focus messages
|
|
but it's not being called when we lose keyboard input
|
|
also, we sometimes don't get the keyboard input to start with
|
|
|
|
---
|
|
keyboard hook problems (win32)
|
|
now passing keyboard events through in most cases
|
|
this fixes problem on isabel where toggle lights don't toggle
|
|
and num-lock behaved incorrectly (generated wrong keys).
|
|
seems the DefWindowProc() needed to process the keys
|
|
unfortunately, keys sometimes leak into wrong app. seems related
|
|
to times when we don't get the keyboard input. key events are
|
|
not delivered to app on primary until cursor returns to primary.
|
|
no idea how that's possible.
|
|
current have some code to check active window and reset it in
|
|
keyboard hook. that code doesn't work.
|
|
seem to be having problems with windows key now, too. looks like
|
|
a down is sent but not the corresponding up so secondary system
|
|
thinks the key is always down.
|
|
|
|
---
|
|
try to determine X11 keyboard quirks automatically
|
|
in particular, set the half-duplex flags
|
|
maybe KBD extension will help determine this
|
|
|
|
---
|
|
key events sent to console on win me (95/98?) are very slow
|
|
1/4 to 1/2 second delay before key up is processed
|
|
key up log message is also delayed
|
|
console causing a system-wide delay?
|
|
|
|
---
|
|
adjust thread priorities on win32
|
|
maybe remove changes altogether
|
|
currently isabel starts single-stepping mouse when dragging window
|
|
sometimes it goes normal speed but it's mostly very slow
|
|
even a very high priority doesn't seem to help
|
|
haven't tried real-time priority
|
|
a very high priority on client fixes delay when typeing into console
|
|
is it the output console causing the slowness?
|
|
mouse motion compression seems to handle slow dragging on grace
|
|
pretty sure nothing else was wrong on grace
|
|
maybe same problem and solution on win32
|
|
|
|
---
|
|
results:
|
|
X primary
|
|
ctrl+alt+keypad_add, ctrl+alt_keypad_minus -> eaten by primary X server
|
|
ctrl+alt+backspace probably eaten by primary X server if so configured
|
|
ctrl+alt+delete probably eaten locally
|
|
probably underneath primary X server too
|
|
Win32 desktop -> X laptop
|
|
eaten global hot keys:
|
|
ctrl+alt+delete -> task manager (or logon or reboot)
|
|
alt+[shift+]tab -> cycle through tasks
|
|
alt+[shift+]esc -> cycle windows
|
|
ctrl+esc -> start menu
|
|
windows+R -> run dialog
|
|
windows+M -> minimize all
|
|
windows+shift+M -> undo minimize all
|
|
windows+F1 -> help
|
|
windows+E -> explorer
|
|
windows+F -> find files
|
|
windows+ctrl+F -> find computer
|
|
windows+tab -> cycle through taskbar buttons
|
|
windows+break -> system properties
|
|
not eaten:
|
|
alt+space -> system menu
|
|
shift+F10 -> context menu
|
|
app key -> context menu
|
|
misc:
|
|
accessibility shortcuts: not eaten but dialogs appear anyway
|
|
X laptop -> Win32 desktop
|
|
check:
|
|
shift+tab -> okay
|
|
alt+[shift+]tab -> okay
|
|
alt+[shift+]esc -> okay
|
|
ctrl+esc -> start menu -> okay
|
|
ctrl+esc, esc, shift+F10 -> toolbar context menu -> okay
|
|
F10 -> activate menu in explorer -> okay
|
|
shift+F10 -> context menu -> okay
|
|
alt+space -> context menu -> okay
|
|
alt+hyphen -> MDI window menu -> okay
|
|
alt+letter -> open corresponding menu -> okay
|
|
alt+F6 -> switch between windows in single program -> okay
|
|
shift+insert CD-ROM -> bypass auto-run
|
|
check accessibility shortcuts -> does not work
|
|
check accessibility features
|
|
sticky keys -> no
|
|
filter keys -> no
|
|
toggle keys -> no
|
|
mouse keys -> no
|
|
high contrast -> no
|
|
X desktop -> win32
|
|
check:
|
|
shift+tab
|
|
windows+R -> run dialog
|
|
windows+M -> minimize all
|
|
windows+shift+M -> minimize all
|
|
windows+F1 -> help
|
|
windows+E -> explorer
|
|
windows+F -> find files
|
|
windows+ctrl+F -> find computer
|
|
windows+tab -> cycle through taskbar buttons
|
|
windows+break -> system properties
|
|
app key -> context menu
|
|
Win32 -> Win32
|
|
alt+F6 -> eaten (isabel to audrey, but not audrey to isabel)
|
|
check accessibility shortcuts work on secondary
|
|
check accessibility features work on secondary
|
|
|
|
---
|
|
Accessibility Shortcuts
|
|
|
|
Key Result
|
|
-------------------------------------------------------------------
|
|
Tap SHIFT 5 times Toggles StickyKeys on and off.
|
|
|
|
Press down and hold the right Toggles FilterKeys on and off.
|
|
SHIFT key for 8 seconds
|
|
|
|
Press down and hold the NUM LOCK Toggles ToggleKeys on and off.
|
|
key for 5 seconds
|
|
|
|
Left ALT+left SHIFT+NUM LOCK Toggles MouseKeys on and off.
|
|
|
|
Left ALT+left SHIFT+PRINT SCREEN Toggles High Contrast on and off.
|
|
|
|
---
|
|
disable ctrl+alt+del info:
|
|
SystemParametersInfo(SPI_SETSCREENSAVERRUNNING, TRUE, &dummy, 0)
|
|
fools system into thinking screen saver is running
|
|
that disables ctrl+alt+del, alt+tab, ctrl+esc
|
|
dunno if keystrokes are queued
|
|
may be limited to win 95/98/me
|
|
win nt sp 3 and above:
|
|
low-level keyboard hook is called before ctrl+esc, alt+tab, alt+esc
|
|
use that to capture and disable
|
|
seems that low-level hook is notified of ctrl+alt+del but can't stop it
|
|
win nt sp 2 and below
|
|
ctrl+esc can be disabled by replacing task manager (dunno how)
|
|
RegisterHotKey() can be used to catch alt+tab and alt+esc
|
|
only while app is running, of course
|
|
win nt
|
|
keyboard filter driver can capture keys (see win NT DDK)
|
|
http://216.239.51.100/search?q=cache:q-f03UHhFMMC:www.thescarms.com/VBasic/StopReBoot.asp+alt%2Btab+disable&hl=en
|
|
some info on changing keyboard scan code mapping
|
|
can be used to disable keys but looks like reboot is required
|
|
|
|
---
|
|
Q179905
|
|
suggestion for bypassing hook code when called by debugger.
|
|
may prevent system from getting locked up when debugging.
|
|
|
|
---
|
|
win32 rel notes:
|
|
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Windows\NoInteractiveServices
|
|
can prevent an interactive service from running interactively.
|
|
how can we tell if we're not running interactively?
|
|
even if not interactive we can use MessageBox() to alert user
|
|
use MB_SERVICE_NOTIFICATION flag
|
|
must use a separate thread in initialization if called from handler
|
|
must close dialog if CTRL_LOGOFF_EVENT is received
|
|
see SetConsoleCtrlHandler() and CLog (which uses it)
|
|
maybe possible to get around NoInteractiveServices
|
|
modify DACLs on windows station/desktops to impersonate logged on user
|
|
see "Interacting with the User by a Win32 Service"
|
|
|
|
---
|
|
unix release notes:
|
|
restarting fails to connect until a user logs in:
|
|
Xlib: no protocol specified
|
|
this is caused by login manager
|
|
all clients are rejected, except those started by manager itself
|
|
workaround is to have synergy started by login manager
|
|
should then use --no-restart, though that's not necessary
|
|
affects client and server
|
|
cannot switch screens on login screen:
|
|
xdm,kdm grab keyboard for duration of login screen
|
|
synergy cannot switch unless it can grab keyboard
|
|
gdm doesn't appear to grab keyboard or mouse for duration
|
|
affects server, only
|
|
|
|
=== feedback ===
|
|
send all toggle states instead of (individual) toggle ups/downs (gspencer)
|
|
Actually, Teleffect already does that too, but what I meant was that
|
|
each time the state of a "toggle" key (caps lock, scroll lock, num lock)
|
|
changes on the master, I think it should force the client to take on
|
|
that state, instead of just toggling on the client. That way when Word
|
|
(on the client) helpfullly turns off the caps lock, it doesn't get
|
|
toggled back on when I turn off the caps lock on the master. Ideally,
|
|
it would just notice that Word turned off the caps lock on the client
|
|
and turn it off on the master (and all other clients) too, but I think
|
|
that's probably too complicated to implement.
|
|
|
|
double clicking NT binaries fails (liz)
|
|
add note to README or use separate binaries for services. client
|
|
would also need a dialog to query options. server would probably
|
|
need one too. use dialogs if there are no command line args.
|
|
|
|
how to exit (liz)
|
|
no good way to exit on windows
|
|
|
|
win32 console disappears too quickly (liz)
|
|
maybe show a message box if exiting to due an error
|
|
|
|
better support for reloading configuration (liz)
|
|
use SIGHUP on unix
|
|
use an app message on win32
|
|
provide access through a control panel or taskbar icon
|
|
|
|
non-functional on ctrl+alt+del screen in win2k (kurt)
|
|
i suppose it must be when win2k is the client. mouse input wasn't
|
|
working. keyboard probably didn't work either.
|
|
|
|
gspencer:
|
|
OK, I've narrowed it down a little -- it seems to happen if you have any
|
|
key down (I tried the shift key and the letter 's' key) when you cross
|
|
over from master to client, which would make me suspect the "capture"
|
|
code, since if you have a key down you aren't supposed to be able to
|
|
cross over...
|
|
|
|
|
|
== fixed? ===
|
|
dragging windows is too slow
|
|
grace (as client) exhibits this
|
|
dunno if it happens with audrey2 as the client
|
|
liz says her windows laptop does it too
|
|
also closing/iconifying has a delay
|
|
dragging multiple files also sluggish
|
|
|
|
liz seems to still be seeing sluggish cursor updates
|
|
|
|
---
|
|
automake stuff
|
|
rebuild:
|
|
* 'autoheader' - creates config.h.in
|
|
* 'touch NEWS README AUTHORS ChangeLog'
|
|
* 'touch stamp-h'
|
|
* aclocal - adds aclocal.m4 to directory. Defines some m4 macros used by the auto tools.
|
|
* 'autoconf '- creates configure from configure.in
|
|
* 'automake' - Creates Makefile.in from Makefile.am
|
|
* './configure' - creates Makefile from Makefile.in
|
|
* 'make'
|
|
|
|
funky functions:
|
|
snprintf -- ick!
|
|
some return negative value -- no problem
|
|
some return truncated length -- uh oh
|
|
some return buffer length without truncation -- huh?
|
|
some actually overrun the buffer -- must not build on those!
|
|
|
|
use AC_LIBOBJ(function) for missing/broken functions
|
|
adds function.c to build
|
|
must add @LIBOBJS@ to *_LIBADD
|
|
or AC_REPLACE_FUNCS(function ...)
|
|
automatically calls AC_LIBOBJ for missing functions
|
|
use AC_CHECK_FUNC or AC_CHECK_FUNCS to detect missing functions
|
|
use AC_CHECK_LIB first if function not in std C lib
|
|
|
|
maybe AC_CHECK_TYPE for size_t and ssize_t
|
|
|
|
replace sys/time.h with:
|
|
#if TIME_WITH_SYS_TIME
|
|
# include <sys/time.h>
|
|
# include <time.h>
|
|
#else
|
|
# if HAVE_SYS_TIME_H
|
|
# include <sys/time.h>
|
|
# else
|
|
# include <time.h>
|
|
# endif
|
|
#endif
|
|
|
|
what does `make install' do?
|
|
|
|
check in derived files?
|
|
aclocal.m4
|
|
config.h.in
|
|
configure
|
|
|
|
used library functions:
|
|
accept
|
|
bind
|
|
chdir
|
|
close
|
|
connect
|
|
dup
|
|
fork
|
|
fprintf
|
|
getenv
|
|
gethostbyaddr
|
|
gethostbyname
|
|
gethostname
|
|
getpeername
|
|
getprotobyname
|
|
getprotobynumber
|
|
getservbyname
|
|
getservbyport
|
|
getsockname
|
|
getsockopt
|
|
gettimeofday
|
|
inet_addr
|
|
inet_ntoa
|
|
ioctl
|
|
listen
|
|
memcpy
|
|
memmove
|
|
memset
|
|
nanosleep
|
|
open
|
|
openlog
|
|
poll
|
|
read
|
|
recv
|
|
recvfrom
|
|
send
|
|
sendto
|
|
setsid
|
|
setsockopt
|
|
shutdown
|
|
sigaction
|
|
sigaddset
|
|
sigemptyset
|
|
socket
|
|
sprintf
|
|
strcat
|
|
strcmp
|
|
strerror
|
|
strrchr
|
|
syslog
|
|
umask
|
|
vsnprintf
|
|
write
|
|
|
|
included files
|
|
#include <arpa/inet.h>
|
|
#include <fcntl.h>
|
|
#include <pthread.h>
|
|
#include <pwd.h>
|
|
#include <shlobj.h>
|
|
#include <signal.h>
|
|
#include <sys/ioctl.h>
|
|
#include <sys/stat.h>
|
|
#include <sys/time.h>
|
|
#include <sys/types.h>
|
|
#include <sys/wait.h>
|
|
#include <syslog.h>
|
|
#include <unistd.h>
|
|
these put stuff in std::. replace with .h versions or use std::?
|
|
3 #include <cctype>
|
|
3 #include <cerrno>
|
|
1 #include <clocale>
|
|
3 #include <cstdio>
|
|
4 #include <cstdlib>
|
|
12 #include <cstring>
|
|
1 #include <ctime>
|
|
|
|
can we use AC_REPLACE_FUNCS and only build the missing function files
|
|
in a single directory. do we have to have a separate configure.in
|
|
script to do that?
|