]> source.dussan.org Git - tigervnc.git/commitdiff
Added new option, SendSysKeys, which controls if Alt-Tab, Alt-F4 and Alt-Space should...
authorPeter Åstrand <astrand@cendio.se>
Fri, 28 Jan 2005 14:52:50 +0000 (14:52 +0000)
committerPeter Åstrand <astrand@cendio.se>
Fri, 28 Jan 2005 14:52:50 +0000 (14:52 +0000)
git-svn-id: svn://svn.code.sf.net/p/tigervnc/code/trunk@127 3789f03b-4d11-0410-bbf8-ca57d06f2519

vncviewer/CViewOptions.cxx
vncviewer/CViewOptions.h
vncviewer/OptionsDialog.cxx
vncviewer/cview.cxx
vncviewer/cview.h
vncviewer/resource.h
vncviewer/vncviewer.rc

index 13ad7cddaa4d972939c324d6d89c62d256ca80df..39a1a5ca746e480b023ecaad117686d8427aa767 100644 (file)
@@ -66,6 +66,8 @@ static BoolParameter sendPtrEvents("SendPointerEvents",
                          "Send pointer (mouse) events to the server.", true);
 static BoolParameter sendKeyEvents("SendKeyEvents",
                          "Send key presses (and releases) to the server.", true);
+static BoolParameter sendSysKeys("SendSysKeys",
+                         "Send system keys (Alt combinations) to the server.", true);
 
 static BoolParameter clientCutText("ClientCutText",
                          "Send clipboard changes to the server.", true);
@@ -110,7 +112,7 @@ static IntParameter qualityLevel("QualityLevel",
 CViewOptions::CViewOptions()
 : useLocalCursor(::useLocalCursor), useDesktopResize(::useDesktopResize),
 autoSelect(::autoSelect), fullColour(::fullColour), fullScreen(::fullScreen),
-shared(::sharedConnection), sendPtrEvents(::sendPtrEvents), sendKeyEvents(::sendKeyEvents),
+shared(::sharedConnection), sendPtrEvents(::sendPtrEvents), sendKeyEvents(::sendKeyEvents), sendSysKeys(::sendSysKeys),
 preferredEncoding(encodingZRLE), clientCutText(::clientCutText), serverCutText(::serverCutText),
 protocol3_3(::protocol3_3), acceptBell(::acceptBell), lowColourLevel(::lowColourLevel),
 pointerEventInterval(ptrEventInterval), emulate3(::emulate3), monitor(::monitor.getData()),
@@ -214,6 +216,8 @@ void CViewOptions::readFromFile(const char* filename) {
             sendPtrEvents = atoi(value.buf);
           } else if (stricmp(name.buf, "SendKeyEvents") == 0) {
             sendKeyEvents = atoi(value.buf);
+          } else if (stricmp(name.buf, "SendSysKeys") == 0) {
+            sendSysKeys = atoi(value.buf);
           } else if (stricmp(name.buf, "SendCutText") == 0) {
             clientCutText = atoi(value.buf);
           } else if (stricmp(name.buf, "AcceptCutText") == 0) {
@@ -310,6 +314,7 @@ void CViewOptions::writeToFile(const char* filename) {
     fprintf(f, "Shared=%d\n", (int)shared);
     fprintf(f, "SendPtrEvents=%d\n", (int)sendPtrEvents);
     fprintf(f, "SendKeyEvents=%d\n", (int)sendKeyEvents);
+    fprintf(f, "SendSysKeys=%d\n", (int)sendSysKeys);
     fprintf(f, "SendCutText=%d\n", (int)clientCutText);
     fprintf(f, "AcceptCutText=%d\n", (int)serverCutText);
     fprintf(f, "Emulate3=%d\n", (int)emulate3);
@@ -344,6 +349,7 @@ void CViewOptions::writeDefaults() {
   key.setBool(_T("Shared"), shared);
   key.setBool(_T("SendPointerEvents"), sendPtrEvents);
   key.setBool(_T("SendKeyEvents"), sendKeyEvents);
+  key.setBool(_T("SendSysKeys"), sendSysKeys);
   key.setBool(_T("ClientCutText"), clientCutText);
   key.setBool(_T("ServerCutText"), serverCutText);
   key.setBool(_T("Protocol3.3"), protocol3_3);
@@ -399,6 +405,7 @@ CViewOptions& CViewOptions::operator=(const CViewOptions& o) {
   shared = o.shared;
   sendPtrEvents = o.sendPtrEvents;
   sendKeyEvents = o.sendKeyEvents;
+  sendSysKeys = o.sendSysKeys;
   clientCutText = o.clientCutText;
   serverCutText = o.serverCutText;
   emulate3 = o.emulate3;
index d49cab14579ec5ea953a0f071d78ecbb92645e52..b19c75084ccfcdb76866fe181e36f7425900875d 100644 (file)
@@ -58,6 +58,7 @@ namespace rfb {
       bool shared;
       bool sendPtrEvents;
       bool sendKeyEvents;
+      bool sendSysKeys;
       bool clientCutText;
       bool serverCutText;
       bool emulate3;
index 954631fe15e471e887fbe57608de11cf3668e57c..8655dc7006b61d5748ed2ca25b6dbc34d54468e3 100644 (file)
@@ -188,6 +188,7 @@ public:
   virtual void initDialog() {
     setItemChecked(IDC_SEND_POINTER, dlg->options.sendPtrEvents);
     setItemChecked(IDC_SEND_KEYS, dlg->options.sendKeyEvents);
+    setItemChecked(IDC_SEND_SYSKEYS, dlg->options.sendSysKeys);
     setItemChecked(IDC_CLIENT_CUTTEXT, dlg->options.clientCutText);
     setItemChecked(IDC_SERVER_CUTTEXT, dlg->options.serverCutText);
     setItemChecked(IDC_EMULATE3, dlg->options.emulate3);
@@ -210,6 +211,7 @@ public:
   virtual bool onOk() {
     dlg->options.sendPtrEvents = isItemChecked(IDC_SEND_POINTER);
     dlg->options.sendKeyEvents = isItemChecked(IDC_SEND_KEYS);
+    dlg->options.sendSysKeys = isItemChecked(IDC_SEND_SYSKEYS);
     dlg->options.clientCutText = isItemChecked(IDC_CLIENT_CUTTEXT);
     dlg->options.serverCutText = isItemChecked(IDC_SERVER_CUTTEXT);
     dlg->options.emulate3 = isItemChecked(IDC_EMULATE3);
index 1765493fb3c75f3e3199066f1532af0c240fe0ed..180119a197a878179c181c3958dd54c8ccc6af17 100644 (file)
@@ -63,6 +63,8 @@ const int TIMER_BUMPSCROLL = 1;
 const int TIMER_POINTER_INTERVAL = 2;
 const int TIMER_POINTER_3BUTTON = 3;
 
+const int HOTKEY_ALTTAB = 0;
+
 
 IntParameter debugDelay("DebugDelay","Milliseconds to display inverted "
                         "pixel data - a debugging feature", 0);
@@ -174,6 +176,9 @@ CView::CView()
   bumpScrollTimer.setHWND(getHandle());
   bumpScrollTimer.setId(TIMER_BUMPSCROLL);
 
+  // Grab AltTab
+  setAltTabGrab(options.sendSysKeys);
+
   // Hook the clipboard
   clipboard.setNotifier(this);
 
@@ -290,6 +295,8 @@ CView::applyOptions(CViewOptions& opt) {
   // - Inputs
   options.sendPtrEvents = opt.sendPtrEvents;
   options.sendKeyEvents = opt.sendKeyEvents;
+  options.sendSysKeys = opt.sendSysKeys;
+  setAltTabGrab(options.sendSysKeys);
   options.clientCutText = opt.clientCutText;
   options.serverCutText = opt.serverCutText;
   options.emulate3 = opt.emulate3;
@@ -692,10 +699,14 @@ CView::processMessage(UINT msg, WPARAM wParam, LPARAM lParam) {
 
   case WM_SETFOCUS:
     has_focus = true;
+    // Re-register AltTab hotkey
+    setAltTabGrab(options.sendSysKeys);
     break;
   case WM_KILLFOCUS:
     has_focus = false;
     cursorOutsideBuffer();
+    // Unregister AltTab hotkey
+    setAltTabGrab(false);
     // Restore the remote keys to consistent states
     try {
       kbd.releaseAllKeys(writer());
@@ -795,6 +806,35 @@ CView::processMessage(UINT msg, WPARAM wParam, LPARAM lParam) {
 
     // -=- Handle keyboard input
 
+  case WM_HOTKEY:
+    if (wParam == HOTKEY_ALTTAB) {
+      writeKeyEvent(VK_TAB, 0, true);
+      writeKeyEvent(VK_TAB, 0, false);
+      return 0;
+    }
+    break;
+
+  case WM_SYSKEYDOWN:
+    // Translate Alt-Space and Alt-F4 to WM_SYSCHAR and WM_CLOSE,
+    // since we are not using TranslateMessage(). 
+    if (!options.sendSysKeys) {
+      switch (wParam) {
+      case VK_SPACE:
+       writeKeyEvent(VK_MENU, 0, false);
+       SendMessage(getHandle(), WM_SYSCHAR, wParam, lParam);
+       return 0; 
+      case VK_F4:
+       SendMessage(getHandle(), WM_CLOSE, wParam, lParam);
+       return 0; 
+      }
+    }
+
+  case WM_SYSKEYUP:
+    // When we have registered for AltTab as a hotkey, SYSKEYUPs for
+    // Tabs are sent (but no SYSKEYDOWNs). AltTab is handled by
+    // WM_HOTKEY, though.
+    if (wParam == VK_TAB) return 0; 
+
   case WM_KEYUP:
   case WM_KEYDOWN:
     // Hook the MenuKey to pop-up the window menu
@@ -818,12 +858,11 @@ CView::processMessage(UINT msg, WPARAM wParam, LPARAM lParam) {
             TPM_CENTERALIGN | TPM_VCENTERALIGN, pt.x, pt.y, 0, getHandle(), 0);
         }
 
-        // Ignore the MenuKey keypress for both press & release events
-        return 0;
+       // Ignore the MenuKey keypress for both press & release events
+       return 0;
       }
     }
-       case WM_SYSKEYDOWN:
-       case WM_SYSKEYUP:
+
     writeKeyEvent(wParam, lParam, (msg == WM_KEYDOWN) || (msg == WM_SYSKEYDOWN));
     return 0;
 
@@ -949,6 +988,26 @@ CView::showSystemCursor() {
   }
 }
 
+void
+CView::setAltTabGrab(bool grab) {
+  BOOL hotKeyResult;
+  static bool grabstate = false;
+
+  // Do not call RegisterHotKey/UnregisterHotKey if not necessary
+  if (grabstate == grab)
+    return;
+
+  grabstate = grab;
+    
+  // Only works for NT/2k/XP
+  if (grab) {
+    hotKeyResult = RegisterHotKey(hwnd, HOTKEY_ALTTAB, MOD_ALT, VK_TAB);
+    if (!hotKeyResult)
+      vlog.debug("RegisterHotkey failed with error %d", GetLastError());
+  } else {
+    hotKeyResult = UnregisterHotKey(hwnd, HOTKEY_ALTTAB);
+  }
+}
 
 bool
 CView::invalidateBufferRect(const Rect& crect) {
index 2bee1c48a4934b978a443c9d153441338752fbf2..ca97cdce56ce3a71887167926893a2fcefeddf32 100644 (file)
@@ -183,6 +183,9 @@ namespace rfb {
       void hideSystemCursor();
       void showSystemCursor();
 
+      // Grab AltTab?
+      void setAltTabGrab(bool grab);
+
       // cursorOutsideBuffer() is called whenever we detect that the mouse has
       // moved outside the desktop.  It restores the system arrow cursor.
       void cursorOutsideBuffer();
index 3a08e574a565bfaf57ea4ff5a7cad90ba8de5b72..0dde195567ac05d1b4acdb9dc48807252cf7f377 100644 (file)
@@ -68,6 +68,7 @@
 #define IDC_COMPRESSLEVEL               1056
 #define IDC_ALLOW_JPEG                  1057
 #define IDC_QUALITYLEVEL                1058
+#define IDC_SEND_SYSKEYS                1059
 #define ID_CLOSE                        40002
 #define ID_OPTIONS                      40003
 #define ID_NEW_CONNECTION               40004
index ad25574ca65a07c3b5899df6fdeacde4107ded3a..3545bc217a689fc6402849457e641e20f2565262 100644 (file)
@@ -232,17 +232,19 @@ BEGIN
                     BS_AUTOCHECKBOX | WS_TABSTOP,7,10,172,15
     CONTROL         "Send keyboard events to server",IDC_SEND_KEYS,"Button",
                     BS_AUTOCHECKBOX | WS_TABSTOP,7,25,172,15
-    CONTROL         "Send clipboard changes to server",IDC_CLIENT_CUTTEXT,
+    CONTROL         "Send system keys (Alt combinations) to server",IDC_SEND_SYSKEYS,
                     "Button",BS_AUTOCHECKBOX | WS_TABSTOP,7,40,172,15
+    CONTROL         "Send clipboard changes to server",IDC_CLIENT_CUTTEXT,
+                    "Button",BS_AUTOCHECKBOX | WS_TABSTOP,7,55,172,15
     CONTROL         "Accept clipboard changes from server",
                     IDC_SERVER_CUTTEXT,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,
-                    7,55,172,15
+                    7,70,172,15
     CONTROL         "Enable 3-button mouse emulation",IDC_EMULATE3,"Button",
-                    BS_AUTOCHECKBOX | WS_TABSTOP,7,70,172,15
+                    BS_AUTOCHECKBOX | WS_TABSTOP,7,85,172,15
     CONTROL         "Rate-limit mouse move events",IDC_POINTER_INTERVAL,
-                    "Button",BS_AUTOCHECKBOX | WS_TABSTOP,7,86,172,14
-    LTEXT           "Menu key",IDC_STATIC,7,100,98,15,SS_CENTERIMAGE
-    COMBOBOX        IDC_MENU_KEY,105,100,74,105,CBS_DROPDOWNLIST | CBS_SORT | 
+                    "Button",BS_AUTOCHECKBOX | WS_TABSTOP,7,100,172,14
+    LTEXT           "Menu key",IDC_STATIC,7,115,98,15,SS_CENTERIMAGE
+    COMBOBOX        IDC_MENU_KEY,105,115,74,105,CBS_DROPDOWNLIST | CBS_SORT | 
                     WS_VSCROLL | WS_TABSTOP
 END