]> git.saurik.com Git - wxWidgets.git/commitdiff
Don't eagerly set wxKeyEvent position fields.
authorVadim Zeitlin <vadim@wxwidgets.org>
Tue, 24 Jul 2012 20:45:52 +0000 (20:45 +0000)
committerVadim Zeitlin <vadim@wxwidgets.org>
Tue, 24 Jul 2012 20:45:52 +0000 (20:45 +0000)
This results in a noticeable delay when using wxGTK via a remote X11
connection for every key event as a round trip to server is needed to get the
mouse pointer position every time a key is pressed or released.

Only provide the position on demand. And explain that it's actually not very
useful as it's simply the same as the current mouse position.

Closes #14361.

git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@72207 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775

include/wx/event.h
include/wx/osx/app.h
interface/wx/event.h
samples/keyboard/keyboard.cpp
src/common/event.cpp
src/gtk/window.cpp
src/msw/window.cpp
src/osx/carbon/app.cpp
src/osx/carbon/nonownedwnd.cpp
src/osx/webview_webkit.mm

index 283a0f56cd4d6e6e9958a24beff68f158e9e34b9..62d3a575a06ddcd792147a9ee9bd89181aef938c 100644 (file)
@@ -1699,10 +1699,10 @@ public:
         { return wxPoint(m_x, m_y); }
 
     // Get X position
-    wxCoord GetX() const { return m_x; }
+    wxCoord GetX() const;
 
     // Get Y position
-    wxCoord GetY() const { return m_y; }
+    wxCoord GetY() const;
 
     // Can be called from wxEVT_CHAR_HOOK handler to allow generation of normal
     // key events even though the event had been handled (by default they would
@@ -1766,6 +1766,7 @@ private:
     {
         m_x = evt.m_x;
         m_y = evt.m_y;
+        m_hasPosition = evt.m_hasPosition;
 
         m_keyCode = evt.m_keyCode;
 
@@ -1776,11 +1777,19 @@ private:
 #endif
     }
 
+    // Initialize m_x and m_y using the current mouse cursor position if
+    // necessary.
+    void InitPositionIfNecessary() const;
+
     // If this flag is true, the normal key events should still be generated
     // even if wxEVT_CHAR_HOOK had been handled. By default it is false as
     // handling wxEVT_CHAR_HOOK suppresses all the subsequent events.
     bool m_allowNext;
 
+    // If true, m_x and m_y were already initialized. If false, try to get them
+    // when they're requested.
+    bool m_hasPosition;
+
     DECLARE_DYNAMIC_CLASS(wxKeyEvent)
 };
 
index 011d0dd021fcaf4596e849228dfb43d0c6310420..5145328d2749299fff7b64d85af44a2cbce3be9d 100644 (file)
@@ -109,10 +109,10 @@ public:
     // For embedded use. By default does nothing.
     virtual void          MacHandleUnhandledEvent( WXEVENTREF ev );
 
-    bool    MacSendKeyDownEvent( wxWindow* focus , long keyval , long modifiers , long when , short wherex , short wherey , wxChar uniChar ) ;
-    bool    MacSendKeyUpEvent( wxWindow* focus , long keyval , long modifiers , long when , short wherex , short wherey , wxChar uniChar ) ;
-    bool    MacSendCharEvent( wxWindow* focus , long keymessage , long modifiers , long when , short wherex , short wherey , wxChar uniChar ) ;
-    void    MacCreateKeyEvent( wxKeyEvent& event, wxWindow* focus , long keymessage , long modifiers , long when , short wherex , short wherey , wxChar uniChar ) ;
+    bool    MacSendKeyDownEvent( wxWindow* focus , long keyval , long modifiers , long when , wxChar uniChar ) ;
+    bool    MacSendKeyUpEvent( wxWindow* focus , long keyval , long modifiers , long when , wxChar uniChar ) ;
+    bool    MacSendCharEvent( wxWindow* focus , long keymessage , long modifiers , long when , wxChar uniChar ) ;
+    void    MacCreateKeyEvent( wxKeyEvent& event, wxWindow* focus , long keymessage , long modifiers , long when , wxChar uniChar ) ;
 #if wxOSX_USE_CARBON
     // we only have applescript on these
     virtual short         MacHandleAEODoc(const WXAPPLEEVENTREF event , WXAPPLEEVENTREF reply) ;
index be9d0d5aa7133fdaab178a45eaadb030288c9156..d02d5a0d377fd0d2e61b09fa32972b949ee85b06 100644 (file)
@@ -1444,6 +1444,9 @@ public:
     //@{
     /**
         Obtains the position (in client coordinates) at which the key was pressed.
+
+        Notice that this position is simply the current mouse pointer position
+        and has no special relationship to the key event itself.
     */
     wxPoint GetPosition() const;
     void GetPosition(long* x, long* y) const;
@@ -1502,11 +1505,15 @@ public:
 
     /**
         Returns the X position (in client coordinates) of the event.
+
+        @see GetPosition()
     */
     wxCoord GetX() const;
 
     /**
         Returns the Y position (in client coordinates) of the event.
+
+        @see GetPosition()
     */
     wxCoord GetY() const;
 
index d90b035fdfdf49441d01cb2f8cf5b0de1f080166..7b30978965f62eefc81f76a36b7760ca490f43c8 100644 (file)
@@ -162,7 +162,7 @@ MyFrame::MyFrame(const wxString& title)
                                             wxTE_READONLY);
     headerText->SetValue(
                " event          key     KeyCode mod   UnicodeKey  "
-               "  RawKeyCode RawKeyFlags");
+               "  RawKeyCode RawKeyFlags  Position");
 
 
     m_logText = new wxTextCtrl(this, wxID_ANY, "",
@@ -404,7 +404,7 @@ wxString GetKeyName(const wxKeyEvent &event)
 void MyFrame::LogEvent(const wxString& name, wxKeyEvent& event)
 {
     wxString msg;
-    // event  key_name  KeyCode  modifiers  Unicode  raw_code raw_flags
+    // event  key_name  KeyCode  modifiers  Unicode  raw_code raw_flags pos
     msg.Printf("%7s %15s %5d   %c%c%c%c"
 #if wxUSE_UNICODE
                    "%5d (U+%04x)"
@@ -416,6 +416,7 @@ void MyFrame::LogEvent(const wxString& name, wxKeyEvent& event)
 #else
                    "  not-set    not-set"
 #endif
+                   "  (%5d,%5d)"
                    "\n",
                name,
                GetKeyName(event),
@@ -432,6 +433,8 @@ void MyFrame::LogEvent(const wxString& name, wxKeyEvent& event)
                , (unsigned long) event.GetRawKeyCode()
                , (unsigned long) event.GetRawKeyFlags()
 #endif
+               , event.GetX()
+               , event.GetY()
                );
 
     m_logText->AppendText(msg);
index 59f6bc004a03e635d88a36949f45d6c2e388dcda..fa39ae924b710be0f4f55c234150b8a4f0776c58 100644 (file)
@@ -736,6 +736,10 @@ wxKeyEvent::wxKeyEvent(wxEventType type)
     m_uniChar = WXK_NONE;
 #endif
 
+    m_x =
+    m_y = wxDefaultCoord;
+    m_hasPosition = false;
+
     InitPropagation();
 }
 
@@ -759,6 +763,42 @@ wxKeyEvent::wxKeyEvent(wxEventType eventType, const wxKeyEvent& evt)
     InitPropagation();
 }
 
+void wxKeyEvent::InitPositionIfNecessary() const
+{
+    if ( m_hasPosition )
+        return;
+
+    // We're const because we're called from const Get[XY]() methods but we
+    // need to update the "cached" values.
+    wxKeyEvent& self = const_cast<wxKeyEvent&>(*this);
+    self.m_hasPosition = true;
+
+    // The only position we can possibly associate with the keyboard event on
+    // the platforms where it doesn't carry it already is the mouse position.
+    wxGetMousePosition(&self.m_x, &self.m_y);
+
+    // If this event is associated with a window, the position should be in its
+    // client coordinates, but otherwise leave it in screen coordinates as what
+    // else can we use?
+    wxWindow* const win = wxDynamicCast(GetEventObject(), wxWindow);
+    if ( win )
+        win->ScreenToClient(&self.m_x, &self.m_y);
+}
+
+wxCoord wxKeyEvent::GetX() const
+{
+    InitPositionIfNecessary();
+
+    return m_x;
+}
+
+wxCoord wxKeyEvent::GetY() const
+{
+    InitPositionIfNecessary();
+
+    return m_y;
+}
+
 bool wxKeyEvent::IsKeyInCategory(int category) const
 {
     switch ( GetKeyCode() )
index 0aec0135426b01aa04b8f46f6c9da1ecca477382..e8dc9150ebfb1bd40033eb35f4b691423045b9ae 100644 (file)
@@ -711,8 +711,6 @@ static void wxFillOtherKeyEventFields(wxKeyEvent& event,
     event.m_rawCode = (wxUint32) gdk_event->keyval;
     event.m_rawFlags = gdk_event->hardware_keycode;
 
-    wxGetMousePosition(&event.m_x, &event.m_y);
-    win->ScreenToClient(&event.m_x, &event.m_y);
     event.SetEventObject( win );
 }
 
index 34e2e2bb4f0114923f6567b3bd6a60b15e57e946..6bb0616f0b5ea0016a4348202491f78865b67abc 100644 (file)
@@ -5682,21 +5682,6 @@ MSWInitAnyKeyEvent(wxKeyEvent& event,
 #ifndef __WXWINCE__
     event.SetTimestamp(::GetMessageTime());
 #endif
-
-    // Event coordinates must be in window client coordinates system which
-    // doesn't make sense if there is no window.
-    //
-    // We could use screen coordinates for such events but this would make the
-    // logic of the event handlers more complicated: you'd need to test for the
-    // event object and interpret the coordinates differently according to
-    // whether it's NULL or not so unless somebody really asks for this let's
-    // just avoid the issue.
-    if ( win )
-    {
-        const wxPoint mousePos = win->ScreenToClient(wxGetMousePosition());
-        event.m_x = mousePos.x;
-        event.m_y = mousePos.y;
-    }
 }
 
 } // anonymous namespace
index 4f1417300e179bb9170d6bd959ce0d205eaf1cbc..7f394e8a2d068eab52196335498d1279d3213118 100644 (file)
@@ -1400,34 +1400,34 @@ wxMouseState wxGetMouseState()
 
 // TODO : once the new key/char handling is tested, move all the code to wxWindow
 
-bool wxApp::MacSendKeyDownEvent( wxWindow* focus , long keymessage , long modifiers , long when , short wherex , short wherey , wxChar uniChar )
+bool wxApp::MacSendKeyDownEvent( wxWindow* focus , long keymessage , long modifiers , long when , wxChar uniChar )
 {
     if ( !focus )
         return false ;
 
     wxKeyEvent event(wxEVT_KEY_DOWN) ;
-    MacCreateKeyEvent( event, focus , keymessage , modifiers , when , wherex , wherey , uniChar ) ;
+    MacCreateKeyEvent( event, focus , keymessage , modifiers , when , uniChar ) ;
 
     return focus->OSXHandleKeyEvent(event);
 }
 
-bool wxApp::MacSendKeyUpEvent( wxWindow* focus , long keymessage , long modifiers , long when , short wherex , short wherey , wxChar uniChar )
+bool wxApp::MacSendKeyUpEvent( wxWindow* focus , long keymessage , long modifiers , long when , wxChar uniChar )
 {
     if ( !focus )
         return false ;
 
     wxKeyEvent event( wxEVT_KEY_UP ) ;
-    MacCreateKeyEvent( event, focus , keymessage , modifiers , when , wherex , wherey , uniChar ) ;
+    MacCreateKeyEvent( event, focus , keymessage , modifiers , when , uniChar ) ;
 
     return focus->OSXHandleKeyEvent(event) ;
 }
 
-bool wxApp::MacSendCharEvent( wxWindow* focus , long keymessage , long modifiers , long when , short wherex , short wherey , wxChar uniChar )
+bool wxApp::MacSendCharEvent( wxWindow* focus , long keymessage , long modifiers , long when , wxChar uniChar )
 {
     if ( !focus )
         return false ;
     wxKeyEvent event(wxEVT_CHAR) ;
-    MacCreateKeyEvent( event, focus , keymessage , modifiers , when , wherex , wherey , uniChar ) ;
+    MacCreateKeyEvent( event, focus , keymessage , modifiers , when , uniChar ) ;
 
     bool handled = false ;
 
@@ -1508,7 +1508,7 @@ bool wxApp::MacSendCharEvent( wxWindow* focus , long keymessage , long modifiers
 }
 
 // This method handles common code for SendKeyDown, SendKeyUp, and SendChar events.
-void wxApp::MacCreateKeyEvent( wxKeyEvent& event, wxWindow* focus , long keymessage , long modifiers , long when , short wherex , short wherey , wxChar uniChar )
+void wxApp::MacCreateKeyEvent( wxKeyEvent& event, wxWindow* focus , long keymessage , long modifiers , long when , wxChar uniChar )
 {
 #if wxOSX_USE_COCOA_OR_CARBON
     
@@ -1590,8 +1590,6 @@ void wxApp::MacCreateKeyEvent( wxKeyEvent& event, wxWindow* focus , long keymess
 
     event.m_rawCode = keymessage;
     event.m_rawFlags = modifiers;
-    event.m_x = wherex;
-    event.m_y = wherey;
     event.SetTimestamp(when);
     event.SetEventObject(focus);
 #else
@@ -1600,8 +1598,6 @@ void wxApp::MacCreateKeyEvent( wxKeyEvent& event, wxWindow* focus , long keymess
     wxUnusedVar(keymessage);
     wxUnusedVar(modifiers);
     wxUnusedVar(when);
-    wxUnusedVar(wherex);
-    wxUnusedVar(wherey);
     wxUnusedVar(uniChar);
 #endif
 }
index 3f63eb0ede6b054d78e2b6d922f4de8ca25593ea..8c70d538d781620abfea469f659bb306ccc4c9e1 100644 (file)
@@ -306,7 +306,6 @@ static pascal OSStatus KeyboardEventHandler( EventHandlerCallRef handler , Event
 
     UInt32 keyCode ;
     UInt32 modifiers ;
-    Point point ;
     UInt32 when = EventTimeToTicks( GetEventTime( event ) ) ;
 
 #if wxUSE_UNICODE
@@ -334,7 +333,6 @@ static pascal OSStatus KeyboardEventHandler( EventHandlerCallRef handler , Event
     GetEventParameter( event, kEventParamKeyMacCharCodes, typeChar, NULL, sizeof(char), NULL, &charCode );
     GetEventParameter( event, kEventParamKeyCode, typeUInt32, NULL, sizeof(UInt32), NULL, &keyCode );
     GetEventParameter( event, kEventParamKeyModifiers, typeUInt32, NULL, sizeof(UInt32), NULL, &modifiers );
-    GetEventParameter( event, kEventParamMouseLocation, typeQDPoint, NULL, sizeof(Point), NULL, &point );
 
     UInt32 message = (keyCode << 8) + charCode;
     switch ( GetEventKind( event ) )
@@ -346,7 +344,7 @@ static pascal OSStatus KeyboardEventHandler( EventHandlerCallRef handler , Event
                 WXEVENTHANDLERCALLREF formerHandler = wxTheApp->MacGetCurrentEventHandlerCallRef() ;
                 wxTheApp->MacSetCurrentEvent( event , handler ) ;
                 if ( /* focus && */ wxTheApp->MacSendKeyDownEvent(
-                    focus , message , modifiers , when , point.h , point.v , uniChar[0] ) )
+                    focus , message , modifiers , when , uniChar[0] ) )
                 {
                     result = noErr ;
                 }
@@ -356,7 +354,7 @@ static pascal OSStatus KeyboardEventHandler( EventHandlerCallRef handler , Event
 
         case kEventRawKeyUp :
             if ( /* focus && */ wxTheApp->MacSendKeyUpEvent(
-                focus , message , modifiers , when , point.h , point.v , uniChar[0] ) )
+                focus , message , modifiers , when , uniChar[0] ) )
             {
                 result = noErr ;
             }
@@ -370,8 +368,6 @@ static pascal OSStatus KeyboardEventHandler( EventHandlerCallRef handler , Event
                 event.m_rawControlDown = modifiers & controlKey;
                 event.m_altDown = modifiers & optionKey;
                 event.m_controlDown = event.m_metaDown = modifiers & cmdKey;
-                event.m_x = point.h;
-                event.m_y = point.v;
 
 #if wxUSE_UNICODE
                 event.m_uniChar = uniChar[0] ;
index fb8796e4ef96d1a484416f61e2b8d8679c53e2a6..0b31750b679510010b2f9454678c2de889bcfaef 100644 (file)
@@ -103,7 +103,6 @@ static pascal OSStatus wxWebKitKeyEventHandler(EventHandlerCallRef handler,
 
     UInt32 keyCode ;
     UInt32 modifiers ;
-    Point point ;
     UInt32 when = EventTimeToTicks( GetEventTime( event ) ) ;
 
 #if wxUSE_UNICODE
@@ -140,8 +139,6 @@ static pascal OSStatus wxWebKitKeyEventHandler(EventHandlerCallRef handler,
                       sizeof(UInt32), NULL, &keyCode );
     GetEventParameter(event, kEventParamKeyModifiers, typeUInt32, NULL,
                       sizeof(UInt32), NULL, &modifiers );
-    GetEventParameter(event, kEventParamMouseLocation, typeQDPoint, NULL,
-                      sizeof(Point), NULL, &point );
 
     UInt32 message = (keyCode << 8) + charCode;
     switch ( GetEventKind( event ) )
@@ -155,7 +152,7 @@ static pascal OSStatus wxWebKitKeyEventHandler(EventHandlerCallRef handler,
 
             wxTheApp->MacSetCurrentEvent( event , handler ) ;
             if ( /* focus && */ wxTheApp->MacSendKeyDownEvent(
-                focus, message, modifiers, when, point.h, point.v, uniChar[0]))
+                focus, message, modifiers, when, uniChar[0]))
             {
                 result = noErr ;
             }
@@ -165,7 +162,7 @@ static pascal OSStatus wxWebKitKeyEventHandler(EventHandlerCallRef handler,
 
         case kEventRawKeyUp :
             if ( /* focus && */ wxTheApp->MacSendKeyUpEvent(
-                focus , message , modifiers , when , point.h , point.v , uniChar[0] ) )
+                focus , message , modifiers , when , uniChar[0] ) )
             {
                 result = noErr ;
             }
@@ -179,8 +176,6 @@ static pascal OSStatus wxWebKitKeyEventHandler(EventHandlerCallRef handler,
                 event.m_controlDown = modifiers & controlKey;
                 event.m_altDown = modifiers & optionKey;
                 event.m_metaDown = modifiers & cmdKey;
-                event.m_x = point.h;
-                event.m_y = point.v;
 
 #if wxUSE_UNICODE
                 event.m_uniChar = uniChar[0] ;