X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/93d23d8fafafbde622aaff99b3520694b7431d4e..a76342da418c75ead546ce2025db24dad261d237:/src/gtk1/window.cpp diff --git a/src/gtk1/window.cpp b/src/gtk1/window.cpp index 99366276c4..cd98009b09 100644 --- a/src/gtk1/window.cpp +++ b/src/gtk1/window.cpp @@ -1097,6 +1097,17 @@ static gint gtk_window_key_press_callback( GtkWidget *widget, if (g_blockEventsOnDrag) return FALSE; +#ifdef __WXGTK20__ + 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; + } +#endif wxKeyEvent event( wxEVT_KEY_DOWN ); if ( !wxTranslateGTKKeyEventToWx(event, win, gdk_event) ) @@ -1134,56 +1145,41 @@ static gint gtk_window_key_press_callback( GtkWidget *widget, { long key_code; KeySym keysym = gdk_event->keyval; -#ifdef __WXGTK20__ - // 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. But only do it this way for non-KeySym keys. - key_code = wxTranslateKeySymToWXKey(gdk_event->keyval, FALSE /* isChar */); - if ( !key_code && win->m_imContext ) - { - gtk_im_context_filter_keypress(win->m_imContext, gdk_event ); - ret = TRUE; - } - else -#endif + // Find key code for EVT_CHAR and EVT_CHAR_HOOK events + key_code = wxTranslateKeySymToWXKey(keysym, TRUE /* isChar */); + if ( !key_code ) { - // Find key code for EVT_CHAR and EVT_CHAR_HOOK events - key_code = wxTranslateKeySymToWXKey(keysym, TRUE /* isChar */); - if ( !key_code ) + if ( gdk_event->length == 1 ) { - if ( gdk_event->length == 1 ) - { - key_code = (unsigned char)gdk_event->string[0]; - } - else if ( wxIsAsciiKeysym(keysym) ) - { - // ASCII key - key_code = (unsigned char)keysym; - } + key_code = (unsigned char)gdk_event->string[0]; } - - if ( key_code ) + else if ( wxIsAsciiKeysym(keysym) ) { - wxLogTrace(TRACE_KEYS, _T("Char event: %ld"), key_code); + // ASCII key + key_code = (unsigned char)keysym; + } + } - event.m_keyCode = key_code; + if ( key_code ) + { + wxLogTrace(TRACE_KEYS, _T("Char event: %ld"), key_code); - // Implement OnCharHook by checking ancesteror top level windows - wxWindow *parent = win; - while (parent && !parent->IsTopLevel()) - parent = parent->GetParent(); - if (parent) - { - event.SetEventType( wxEVT_CHAR_HOOK ); - ret = parent->GetEventHandler()->ProcessEvent( event ); - } + event.m_keyCode = key_code; - if (!ret) - { - event.SetEventType(wxEVT_CHAR); - ret = win->GetEventHandler()->ProcessEvent( event ); - } + // Implement OnCharHook by checking ancesteror top level windows + wxWindow *parent = win; + while (parent && !parent->IsTopLevel()) + parent = parent->GetParent(); + if (parent) + { + event.SetEventType( wxEVT_CHAR_HOOK ); + ret = parent->GetEventHandler()->ProcessEvent( event ); + } + + if (!ret) + { + event.SetEventType(wxEVT_CHAR); + ret = win->GetEventHandler()->ProcessEvent( event ); } } } @@ -1274,11 +1270,15 @@ static void gtk_wxwindow_commit_cb (GtkIMContext *context, if (event.m_uniChar < 256) event.m_keyCode = event.m_uniChar; #else - gunichar uniChar = g_utf8_get_char( str ); - // We cannot handle Unicode in non-Unicode mode - if (uniChar > 255) return; - - event.m_keyCode = uniChar; + wchar_t unistr[2]; + unistr[0] = g_utf8_get_char(str); + unistr[1] = 0; + wxCharBuffer ansistr(wxConvLocal.cWC2MB(unistr)); + // We cannot handle characters that cannot be represented in + // current locale's charset in non-Unicode mode: + if (ansistr.data() == NULL) return; + + event.m_keyCode = ansistr[0u]; #endif @@ -1900,6 +1900,11 @@ static gint gtk_window_focus_in_callback( GtkWidget *widget, if (g_isIdle) wxapp_install_idle_handler(); +#ifdef __WXGTK20__ + if (win->m_imContext) + gtk_im_context_focus_in(win->m_imContext); +#endif + if (!win->m_hasVMT) return FALSE; if (g_blockEventsOnDrag) return FALSE; @@ -1988,6 +1993,11 @@ static gint gtk_window_focus_out_callback( GtkWidget *widget, GdkEventFocus *gdk if (g_isIdle) wxapp_install_idle_handler(); +#ifdef __WXGTK20__ + if (win->m_imContext) + gtk_im_context_focus_out(win->m_imContext); +#endif + if (!win->m_hasVMT) return FALSE; if (g_blockEventsOnDrag) return FALSE;