X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/9cbe96d0932a00ed61bc3cbd8a67013e9c8576e1..000c2be40d8e0231f6565ba2931f4c88add433d9:/src/gtk/window.cpp?ds=sidebyside diff --git a/src/gtk/window.cpp b/src/gtk/window.cpp index d208b4eae4..1e4523f340 100644 --- a/src/gtk/window.cpp +++ b/src/gtk/window.cpp @@ -680,22 +680,57 @@ static void wxFillOtherKeyEventFields(wxKeyEvent& event, event.SetTimestamp( gdk_event->time ); event.SetId(win->GetId()); + event.m_shiftDown = (gdk_event->state & GDK_SHIFT_MASK) != 0; event.m_controlDown = (gdk_event->state & GDK_CONTROL_MASK) != 0; event.m_altDown = (gdk_event->state & GDK_MOD1_MASK) != 0; event.m_metaDown = (gdk_event->state & GDK_META_MASK) != 0; - event.m_rawCode = (wxUint32) gdk_event->keyval; - event.m_rawFlags = 0; -#if wxUSE_UNICODE - event.m_uniChar = gdk_keyval_to_unicode(gdk_event->keyval); - if ( !event.m_uniChar && event.m_keyCode <= WXK_DELETE ) + + // Normally we take the state of modifiers directly from the low level GDK + // event but unfortunately GDK uses a different convention from MSW for the + // key events corresponding to the modifier keys themselves: in it, when + // e.g. Shift key is pressed, GDK_SHIFT_MASK is not set while it is set + // when Shift is released. Under MSW the situation is exactly reversed and + // the modifier corresponding to the key is set when it is pressed and + // unset when it is released. To ensure consistent behaviour between + // platforms (and because it seems to make slightly more sense, although + // arguably both behaviours are reasonable) we follow MSW here. + // + // Final notice: we set the flags to the desired value instead of just + // inverting them because they are not set correctly (i.e. in the same way + // as for the real events generated by the user) for wxUIActionSimulator- + // produced events and it seems better to keep that class code the same + // among all platforms and fix the discrepancy here instead of adding + // wxGTK-specific code to wxUIActionSimulator. + const bool isPress = gdk_event->type == GDK_KEY_PRESS; + switch ( gdk_event->keyval ) { - // Set Unicode key code to the ASCII equivalent for compatibility. E.g. - // let RETURN generate the key event with both key and Unicode key - // codes of 13. - event.m_uniChar = event.m_keyCode; + case GDK_Shift_L: + case GDK_Shift_R: + event.m_shiftDown = isPress; + break; + + case GDK_Control_L: + case GDK_Control_R: + event.m_controlDown = isPress; + break; + + case GDK_Alt_L: + case GDK_Alt_R: + event.m_altDown = isPress; + break; + + case GDK_Meta_L: + case GDK_Meta_R: + case GDK_Super_L: + case GDK_Super_R: + event.m_metaDown = isPress; + break; } -#endif // wxUSE_UNICODE + + event.m_rawCode = (wxUint32) gdk_event->keyval; + event.m_rawFlags = gdk_event->hardware_keycode; + wxGetMousePosition( &x, &y ); win->ScreenToClient( &x, &y ); event.m_x = x; @@ -800,6 +835,17 @@ wxTranslateGTKKeyEventToWx(wxKeyEvent& event, event.m_keyCode = key_code; +#if wxUSE_UNICODE + event.m_uniChar = gdk_keyval_to_unicode(key_code ? key_code : keysym); + if ( !event.m_uniChar && event.m_keyCode <= WXK_DELETE ) + { + // Set Unicode key code to the ASCII equivalent for compatibility. E.g. + // let RETURN generate the key event with both key and Unicode key + // codes of 13. + event.m_uniChar = event.m_keyCode; + } +#endif // wxUSE_UNICODE + // now fill all the other fields wxFillOtherKeyEventFields(event, win, gdk_event); @@ -3748,7 +3794,18 @@ void wxWindowGTK::DoSetToolTip( wxToolTip *tip ) void wxWindowGTK::GTKApplyToolTip( GtkTooltips *tips, const gchar *tip ) { - gtk_tooltips_set_tip(tips, GetConnectWidget(), tip, NULL); + GtkWidget *w = GetConnectWidget(); + gtk_tooltips_set_tip(tips, w, tip, NULL); + +#if GTK_CHECK_VERSION(2, 12, 0) + if ( !tip || tip[0] == '\0' ) + { + // Just applying empty tool tip doesn't work on 2.12.0, so also use + // gtk_widget_set_has_tooltip. + if (gtk_check_version(2, 12, 0) == NULL) + gtk_widget_set_has_tooltip(w, FALSE); + } +#endif } #endif // wxUSE_TOOLTIPS