edit FIXME's in:
  PORTING

make man pages
  docbook?
  should have makefile target to build these
  remove line from BUGS about missing man pages

---
not removing all doxygen generated files in dist-clean or maintainer-clean
  should remove them all in dist-clean

---
check for cancellation points:
  following functions may be interrupted (returning -1, errno=EINTR):
    read(), write(), ioctl(), select(), poll(), pause(), connect(),
    accept(), syslog(), TCP operations
    creat(), close(), getmsg(), putmsg(), msgrcv(), msgsnd(),
    recv(), send(), wait(), waitpid(), wait3(), sigpause()
  should ensure that we handle EINTR anywhere these are called.  in
  particular we must call testCancel() (should do that anyway) and
  sometimes restart the call.
  make sure unbounded time win32 calls do testCancel().

---
not handling large motif selections
  don't know protocol for transfer

---
not handling international characters

---
CServer::setConfig() should update network ports
  if the server address or http address change then the old ports
  should be closed and new ones opened.

---
try to determine X11 keyboard quirks automatically
  in particular, set the half-duplex flags
  maybe KBD extension will help determine this

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

---
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

  bug in updating screens
	saw a goofy set of screens after update
	i think the config was similar to:
      A B
      C
      D E

---
win32:
  need icon
  provide taskbar icon
  provide control panel?

win32 service:
  need message table for proper event reporting

desktop switcher program failure when running synergy as service
  returns access denied from CreateDesktop()
  don't know why

---
hot keys
  should have keyboard shortcuts to jump to screens

---
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)

---
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.

---
need timeout on CXWindowsClipboard::CReply objects
  should flush replies that are too old
  assumption is that requestor is broken

---
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.

---
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 typing into console
  is it the output console causing the slowness?

---
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.

---
automake stuff
  rebuild:
    * 'touch NEWS README AUTHORS ChangeLog'
    * 'touch stamp-h'
    * 'aclocal'     - creates aclocal.m4
    * 'autoheader'  - creates config.h.in
    * '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

  AC_FUNC_MEMCMP -- adds memcmp.o to LIBOBJS if memcmp is broken
  AC_FUNC_STRFTIME -- check for strftime(), define HAVE_STRFTIME
  AC_FUNC_VPRINTF -- check for vprintf(), define HAVE_VPRINTF
		also checks for _doprnt(), define HAVE_DOPRNT

  #if STDC_HEADERS
  # include <string.h>
  #else
  # if !HAVE_STRCHR
  #  define strchr index
  #  define strrchr rindex
  # endif
  char *strchr (), *strrchr ();
  # if !HAVE_MEMCPY
  #  define memcpy(d, s, n) bcopy ((s), (d), (n))
  #  define memmove(d, s, n) bcopy ((s), (d), (n))
  # endif
  #endif

must provide fallbacks for stuff:
  non-reentrant functions:
    put (shared) lock around non-reentrant function
    provide reentrant API
	  gethostbyaddr
	  gethostbyname
	  getprotobyname
	  getprotobynumber
	  getservbyname
	  getservbyport
      gmtime
      getpwuid
      strerror
  string/memory functions:
	memcpy
	memcmp
	memmove
	memset
	strcat
	strcmp
	strcpy
	strrchr

used library functions:
	accept
	bind
	chdir
	close
	connect
	dup
	exit
	fcntl
*	fork
	fprintf
*	free
	getenv
	gethostbyaddr
	gethostbyname
	gethostname
	getpeername
	getprotobyname
	getprotobynumber
	getpwuid_r
	getservbyname
	getservbyport
	getsockname
	getsockopt
	gettimeofday
	getuid
	inet_addr
	inet_ntoa
	ioctl
	listen
*	malloc
	mbrtowc
	mbsinit
	memcpy
!	memcmp
	memmove
	memset
	nanosleep
	open
	openlog
	poll
	read
	recv
	recvfrom
	send
	sendto
	setsid
	setsockopt
	shutdown
	sigaction
	sigaddset
	sigemptyset
	sigwait
	socket
	sprintf
	strcat
	strcmp
	strcpy
	strerror
	strrchr
	strtol
	sysconf
	syslog
	umask
	vsnprintf
	wcrtomb
	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?