diff --git a/mozilla/widget/src/xlib/nsAppShell.cpp b/mozilla/widget/src/xlib/nsAppShell.cpp index a999deefe03..e994601c1a5 100644 --- a/mozilla/widget/src/xlib/nsAppShell.cpp +++ b/mozilla/widget/src/xlib/nsAppShell.cpp @@ -483,10 +483,17 @@ nsAppShell::HandleKeyPressEvent(XEvent *event, nsWidget *aWidget) { PR_LOG(XlibWidgetsLM, PR_LOG_DEBUG, ("KeyPress event for window 0x%lx\n", event->xkey.window)); - nsKeyEvent keyEvent; - KeySym keysym; - keysym = XKeycodeToKeysym(event->xkey.display, event->xkey.keycode, 0); + // Dont dispatch events for modifier keys pressed ALONE + if (nsKeyCode::KeyCodeIsModifier(event->xkey.keycode)) + { + return; + } + + nsKeyEvent keyEvent; + + KeySym keysym = nsKeyCode::ConvertKeyCodeToKeySym(event->xkey.display, + event->xkey.keycode); keyEvent.keyCode = nsKeyCode::ConvertKeySymToVirtualKey(keysym); keyEvent.charCode = 0; @@ -494,17 +501,53 @@ nsAppShell::HandleKeyPressEvent(XEvent *event, nsWidget *aWidget) keyEvent.isShift = event->xkey.state & ShiftMask; keyEvent.isControl = event->xkey.state & ControlMask; keyEvent.isAlt = event->xkey.state & Mod1Mask; - keyEvent.point.x = 0; - keyEvent.point.y = 0; + keyEvent.point.x = event->xkey.x; + keyEvent.point.y = event->xkey.y; keyEvent.message = NS_KEY_DOWN; keyEvent.widget = aWidget; keyEvent.eventStructType = NS_KEY_EVENT; + printf("keysym = %d, keycode = %d, char = %c\n", + keysym, + event->xkey.keycode, + keyEvent.keyCode); + +// NS_ADDREF(aWidget); + + aWidget->DispatchKeyEvent(keyEvent); + +// NS_RELEASE(aWidget); + +#if 1 + + + keyEvent.keyCode = nsKeyCode::ConvertKeySymToVirtualKey(keysym); + keyEvent.charCode = 0; + keyEvent.time = event->xkey.time; + keyEvent.isShift = event->xkey.state & ShiftMask; + keyEvent.isControl = event->xkey.state & ControlMask; + keyEvent.isAlt = event->xkey.state & Mod1Mask; + keyEvent.point.x = event->xkey.x; + keyEvent.point.y = event->xkey.y; + keyEvent.message = NS_KEY_PRESS; + keyEvent.widget = aWidget; + keyEvent.eventStructType = NS_KEY_EVENT; + +#if 1 + char buf[2]; + + buf[0] = keyEvent.keyCode; + buf[1] = nsnull; + + keyEvent.charCode = keyEvent.keyCode; +#endif + NS_ADDREF(aWidget); aWidget->DispatchKeyEvent(keyEvent); - NS_ADDREF(aWidget); + NS_RELEASE(aWidget); +#endif } void @@ -513,10 +556,15 @@ nsAppShell::HandleKeyReleaseEvent(XEvent *event, nsWidget *aWidget) PR_LOG(XlibWidgetsLM, PR_LOG_DEBUG, ("KeyRelease event for window 0x%lx\n", event->xkey.window)); - nsKeyEvent keyEvent; - KeySym keysym; + // Dont dispatch events for modifier keys pressed ALONE + if (nsKeyCode::KeyCodeIsModifier(event->xkey.keycode)) + { + return; + } - keysym = XKeycodeToKeysym(event->xkey.display, event->xkey.keycode, 0); + nsKeyEvent keyEvent; + KeySym keysym = nsKeyCode::ConvertKeyCodeToKeySym(event->xkey.display, + event->xkey.keycode); keyEvent.keyCode = nsKeyCode::ConvertKeySymToVirtualKey(keysym); keyEvent.charCode = 0; @@ -524,8 +572,8 @@ nsAppShell::HandleKeyReleaseEvent(XEvent *event, nsWidget *aWidget) keyEvent.isShift = event->xkey.state & ShiftMask; keyEvent.isControl = event->xkey.state & ControlMask; keyEvent.isAlt = event->xkey.state & Mod1Mask; - keyEvent.point.x = 0; - keyEvent.point.y = 0; + keyEvent.point.x = event->xkey.x; + keyEvent.point.y = event->xkey.y; keyEvent.message = NS_KEY_UP; keyEvent.widget = aWidget; keyEvent.eventStructType = NS_KEY_EVENT; @@ -534,7 +582,7 @@ nsAppShell::HandleKeyReleaseEvent(XEvent *event, nsWidget *aWidget) aWidget->DispatchKeyEvent(keyEvent); - NS_ADDREF(aWidget); + NS_RELEASE(aWidget); } void diff --git a/mozilla/widget/src/xlib/nsKeyCode.cpp b/mozilla/widget/src/xlib/nsKeyCode.cpp index 7e119942db6..f6fa7d1713f 100644 --- a/mozilla/widget/src/xlib/nsKeyCode.cpp +++ b/mozilla/widget/src/xlib/nsKeyCode.cpp @@ -21,6 +21,7 @@ #include #include #include +#include #include "nsGUIEvent.h" // For NS_VK @@ -158,7 +159,7 @@ struct nsKeyConverter nsKeycodes[] = { }; #endif -int +PRInt32 nsKeyCode::ConvertKeySymToVirtualKey(KeySym keysym) { #if 0 @@ -173,6 +174,7 @@ nsKeyCode::ConvertKeySymToVirtualKey(KeySym keysym) // mozilla does not, convert gdk's to mozilla's if (keysym >= XK_a && keysym <= XK_z) return keysym - XK_a + NS_VK_A; + if (keysym >= XK_A && keysym <= XK_Z) return keysym - XK_A + NS_VK_A; @@ -185,9 +187,10 @@ nsKeyCode::ConvertKeySymToVirtualKey(KeySym keysym) return keysym - XK_KP_0 + NS_VK_NUMPAD0; // misc other things - for (i = 0; i < length; i++) { + for (i = 0; i < length; i++) + { if (nsKeycodes[i].keysym == keysym) - return(nsKeycodes[i].vkCode); + return nsKeycodes[i].vkCode; } // function keys @@ -211,3 +214,36 @@ nsKeyCode::ConvertKeySymToVirtualKey(KeySym keysym) return((int)keysym); #endif } + +////////////////////////////////////////////////////////////////////////// +/* static */ PRBool +nsKeyCode::KeyCodeIsModifier(KeyCode aKeyCode) +{ + if (aKeyCode == XK_Shift_L || + aKeyCode == XK_Shift_R || + aKeyCode == XK_Control_L || + aKeyCode == XK_Control_R || + aKeyCode == XK_Caps_Lock || + aKeyCode == XK_Shift_Lock || + aKeyCode == XK_Meta_L || + aKeyCode == XK_Meta_R || + aKeyCode == XK_Alt_L || + aKeyCode == XK_Alt_R) + { + return PR_TRUE; + } + + return PR_FALSE; +} +////////////////////////////////////////////////////////////////////////// +/* static */ KeySym +nsKeyCode::ConvertKeyCodeToKeySym(Display * aDisplay, + KeyCode aKeyCode) +{ + KeySym keysym = 0; + + keysym = XKeycodeToKeysym(aDisplay, aKeyCode, 0); + + return keysym; +} +////////////////////////////////////////////////////////////////////////// diff --git a/mozilla/widget/src/xlib/nsKeyCode.h b/mozilla/widget/src/xlib/nsKeyCode.h index 724ae3d7aad..27b850bfa4b 100644 --- a/mozilla/widget/src/xlib/nsKeyCode.h +++ b/mozilla/widget/src/xlib/nsKeyCode.h @@ -20,10 +20,18 @@ #define __nsKeyCode_h #include +#include + +#include "prtypes.h" struct nsKeyCode { - static int ConvertKeySymToVirtualKey(KeySym keysym); + static PRInt32 ConvertKeySymToVirtualKey(KeySym aKeySym); + + static PRBool KeyCodeIsModifier(KeyCode aKeyCode); + + static KeySym ConvertKeyCodeToKeySym(Display *aDisplay, + KeyCode aKeyCode); }; #endif // __nsKeyCode_h