- // 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 );
- }
- }
-
- // win is a control: tab can be propagated up
- if ( !ret &&
- ((gdk_event->keyval == GDK_Tab) || (gdk_event->keyval == GDK_ISO_Left_Tab)) &&
- win->GetParent() && (win->GetParent()->HasFlag( wxTAB_TRAVERSAL)) )
- {
- wxNavigationKeyEvent new_event;
- new_event.SetEventObject( win->GetParent() );
- // GDK reports GDK_ISO_Left_Tab for SHIFT-TAB
- new_event.SetDirection( (gdk_event->keyval == GDK_Tab) );
- // CTRL-TAB changes the (parent) window, i.e. switch notebook page
- new_event.SetWindowChange( (gdk_event->state & GDK_CONTROL_MASK) );
- new_event.SetCurrentFocus( win );
- ret = win->GetParent()->GetEventHandler()->ProcessEvent( new_event );
- }
-
- if ( !ret &&
- (gdk_event->keyval == GDK_Escape) )
- {
- wxWindow *winForCancel = win, *btnCancel = NULL;
- while ( winForCancel )
- {
- btnCancel = winForCancel->FindWindow(wxID_CANCEL);
- if ( btnCancel ) break;
-
- if ( winForCancel->IsTopLevel() ) break;
-
- winForCancel = winForCancel->GetParent();
- }
-
- if ( btnCancel )
- {
- wxCommandEvent event(wxEVT_COMMAND_BUTTON_CLICKED, wxID_CANCEL);
- event.SetEventObject(btnCancel);
- ret = btnCancel->GetEventHandler()->ProcessEvent(event);
- }
- }
- }
-
- if (ret)
- {
- gtk_signal_emit_stop_by_name( GTK_OBJECT(widget), "key_press_event" );
- return TRUE;
- }
-
- if (!dont_use_IM && 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.
- gtk_im_context_filter_keypress ( (GtkIMContext*) win->m_imContext, gdk_event );
-
- return TRUE;
- }
-
- return FALSE;
-}
-
-static void gtk_wxwindow_commit_cb (GtkIMContext *context,
- const gchar *str,
- wxWindow *window)
-{
- bool ret = FALSE;
-
- wxKeyEvent event( wxEVT_KEY_DOWN );