Win32 vncconfig utility merged with VNC 4.1.1 code.

git-svn-id: svn://svn.code.sf.net/p/tigervnc/code/branches/merge-with-vnc-4.1.1@547 3789f03b-4d11-0410-bbf8-ca57d06f2519
diff --git a/vncconfig/Hooking.h b/vncconfig/Hooking.h
index b9bec15..9be82f3 100644
--- a/vncconfig/Hooking.h
+++ b/vncconfig/Hooking.h
@@ -1,5 +1,5 @@
-/* Copyright (C) 2002-2003 RealVNC Ltd.  All Rights Reserved.
- *    
+/* Copyright (C) 2002-2005 RealVNC Ltd.  All Rights Reserved.
+ * 
  * This is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
  * the Free Software Foundation; either version 2 of the License, or
@@ -21,6 +21,7 @@
 #include <rfb_win32/Registry.h>
 #include <rfb_win32/Dialog.h>
 #include <rfb_win32/SDisplay.h>
+#include <rfb_win32/WMPoller.h>
 #include <rfb/ServerCore.h>
 
 namespace rfb {
@@ -32,26 +33,48 @@
       HookingPage(const RegKey& rk)
         : PropSheetPage(GetModuleHandle(0), MAKEINTRESOURCE(IDD_HOOKING)), regKey(rk) {}
       void initDialog() {
-        setItemChecked(IDC_USEHOOKS, rfb::win32::SDisplay::use_hooks);
+        setItemChecked(IDC_USEPOLLING, rfb::win32::SDisplay::updateMethod == 0);
+        setItemChecked(IDC_USEHOOKS, (rfb::win32::SDisplay::updateMethod == 1) &&
+                       rfb::win32::SDisplay::areHooksAvailable());
+        enableItem(IDC_USEHOOKS, rfb::win32::SDisplay::areHooksAvailable());
+        setItemChecked(IDC_USEDRIVER, (rfb::win32::SDisplay::updateMethod == 2) &&
+                       rfb::win32::SDisplay::isDriverAvailable());
+        enableItem(IDC_USEDRIVER, rfb::win32::SDisplay::isDriverAvailable());
         setItemChecked(IDC_POLLCONSOLES, rfb::win32::WMPoller::poll_console_windows);
-        setItemChecked(IDC_COMPAREFB, rfb::Server::compareFB);
+        setItemChecked(IDC_CAPTUREBLT, osVersion.isPlatformNT &&
+                       rfb::win32::DeviceFrameBuffer::useCaptureBlt);
+        enableItem(IDC_CAPTUREBLT, osVersion.isPlatformNT);
+        onCommand(IDC_USEHOOKS, 0);
       }
       bool onCommand(int id, int cmd) {
         switch (id) {
+        case IDC_USEPOLLING:
         case IDC_USEHOOKS:
+        case IDC_USEDRIVER:
         case IDC_POLLCONSOLES:
-        case IDC_COMPAREFB:
-          setChanged((rfb::win32::SDisplay::use_hooks != isItemChecked(IDC_USEHOOKS)) ||
+        case IDC_CAPTUREBLT:
+          setChanged(((rfb::win32::SDisplay::updateMethod == 0) != isItemChecked(IDC_USEPOLLING)) ||
+            ((rfb::win32::SDisplay::updateMethod == 1) != isItemChecked(IDC_USEHOOKS)) ||
+            ((rfb::win32::SDisplay::updateMethod == 2) != isItemChecked(IDC_USEDRIVER)) ||
             (rfb::win32::WMPoller::poll_console_windows != isItemChecked(IDC_POLLCONSOLES)) ||
-            (rfb::Server::compareFB != isItemChecked(IDC_COMPAREFB)));
+            (rfb::win32::DeviceFrameBuffer::useCaptureBlt != isItemChecked(IDC_CAPTUREBLT)));
+          enableItem(IDC_POLLCONSOLES, isItemChecked(IDC_USEHOOKS));
           break;
         }
         return false;
       }
       bool onOk() {
-        regKey.setBool(_T("UseHooks"), isItemChecked(IDC_USEHOOKS));
+        if (isItemChecked(IDC_USEPOLLING))
+          regKey.setInt(_T("UpdateMethod"), 0);
+        if (isItemChecked(IDC_USEHOOKS))
+          regKey.setInt(_T("UpdateMethod"), 1);
+        if (isItemChecked(IDC_USEDRIVER))
+          regKey.setInt(_T("UpdateMethod"), 2);
         regKey.setBool(_T("PollConsoleWindows"), isItemChecked(IDC_POLLCONSOLES));
-        regKey.setBool(_T("CompareFB"), isItemChecked(IDC_COMPAREFB));
+        regKey.setBool(_T("UseCaptureBlt"), isItemChecked(IDC_CAPTUREBLT));
+
+        // *** LEGACY compatibility ***
+        regKey.setBool(_T("UseHooks"), isItemChecked(IDC_USEHOOKS));
         return true;
       }
     protected:
@@ -62,4 +85,4 @@
 
 };
 
-#endif
\ No newline at end of file
+#endif