- if (win->m_imContext)
- {
- // In GTK 2.0, we need to hand over the key event to an input method
- // and the IM will emit a "commit" event containing the actual utf8
- // character. In that case the EVT_CHAR events will be sent from
- // there.
- if ( gtk_im_context_filter_keypress(win->m_imContext, gdk_event) )
- return TRUE;
- }
+ // We have to pass key press events through GTK+'s Input Method context
+ // object in order to get correct characters. By doing so, we loose the
+ // ability to let other GTK+'s handlers (namely, widgets' default signal
+ // handlers) handle the signal by returning false from this callback.
+ // Because GTK+ sends the events to parent widgets as well, we can't
+ // afford loosing it, otherwise native widgets inserted into wxPanel
+ // would break in subtle ways (e.g. spacebar would no longer toggle
+ // wxCheckButton's state). Therefore, we only pass the event to IM if it
+ // originated in this window's widget, which we detect by checking if we've
+ // seen the same event before (no events from children are lost this way,
+ // because gtk_window_key_press_callback is installed for native controls
+ // as well and the wxKeyEvent it creates propagates upwards).
+ static GdkEventKey s_lastEvent;
+
+ bool useIM = (win->m_imData != NULL) &&
+ memcmp(gdk_event, &s_lastEvent, sizeof(GdkEventKey)) != 0;
+
+ s_lastEvent = *gdk_event;