Handle Ctrl+AltGr on Windows
Improve AltGr detection even further on Windows so we can detect the
case when Ctrl and AltGr are pressed together.
diff --git a/vncviewer/Viewport.cxx b/vncviewer/Viewport.cxx
index ba0b0e9..1c0503c 100644
--- a/vncviewer/Viewport.cxx
+++ b/vncviewer/Viewport.cxx
@@ -838,24 +838,18 @@
// Ctrl+Alt. However the remote end might not be Windows, so we need
// to merge those in to a single AltGr event. We detect this case
// by seeing the two key events directly after each other with a very
- // short time between them (<50ms).
+ // short time between them (<50ms) and supress the Ctrl event.
if (self->altGrArmed) {
self->altGrArmed = false;
Fl::remove_timeout(handleAltGrTimeout);
if (isExtended && (keyCode == 0x38) && (vKey == VK_MENU) &&
((msg->time - self->altGrCtrlTime) < 50)) {
- // FIXME: We fail to detect this if either Ctrl key is
- // first manually pressed as Windows then no longer
- // sends the fake Ctrl down event. It does however
- // happily send real Ctrl events even when AltGr
- // is already down.
- vlog.debug("Detected AltGr combination");
- self->handleKeyPress(0xb8, XK_ISO_Level3_Shift);
- return 1;
+ // Alt seen, so this is an AltGr sequence
+ } else {
+ // Not Alt, so fire the queued up Ctrl event
+ self->handleKeyPress(0x1d, XK_Control_L);
}
-
- self->handleKeyPress(0x1d, XK_Control_L);
}
if (keyCode == SCAN_FAKE) {
@@ -917,12 +911,18 @@
if ((keySym == XK_Shift_L) && (keyCode == 0x36))
keySym = XK_Shift_R;
- // Possible start of AltGr sequence? (see above)
- if ((keyCode == 0x1d) && (keySym == XK_Control_L)) {
- self->altGrArmed = true;
- self->altGrCtrlTime = msg->time;
- Fl::add_timeout(0.1, handleAltGrTimeout, self);
- return 1;
+ // AltGr handling (see above)
+ if (win32_has_altgr()) {
+ if ((keyCode == 0xb8) && (keySym == XK_Alt_R))
+ keySym = XK_ISO_Level3_Shift;
+
+ // Possible start of AltGr sequence?
+ if ((keyCode == 0x1d) && (keySym == XK_Control_L)) {
+ self->altGrArmed = true;
+ self->altGrCtrlTime = msg->time;
+ Fl::add_timeout(0.1, handleAltGrTimeout, self);
+ return 1;
+ }
}
self->handleKeyPress(keyCode, keySym);