From 1ec3a9848a6843aca1b3590f636a149dd274efdc Mon Sep 17 00:00:00 2001 From: Robert Roebling Date: Sun, 9 Jun 2002 23:02:58 +0000 Subject: [PATCH] Moved wxCharhookEvent so that it sends the same keycode as wxCharEvent. Removed wxDestroyWindowEvent as it crashes all the time. Corrcted wxTreeCtrl's interception of wxCharEvents as it misinterpreted "F5" for "Z" e.g. git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@15798 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775 --- src/generic/treectlg.cpp | 7 +++-- src/gtk/window.cpp | 66 +++++++++++++++++++++------------------- src/gtk1/window.cpp | 66 +++++++++++++++++++++------------------- 3 files changed, 73 insertions(+), 66 deletions(-) diff --git a/src/generic/treectlg.cpp b/src/generic/treectlg.cpp index 104b899c6d..6d56dc596d 100644 --- a/src/generic/treectlg.cpp +++ b/src/generic/treectlg.cpp @@ -2616,11 +2616,14 @@ void wxGenericTreeCtrl::OnChar( wxKeyEvent &event ) default: // do not use wxIsalnum() here - if ( !event.HasModifiers() && isalnum(keyCode) ) + if ( !event.HasModifiers() && + ((keyCode >= '0' && keyCode <= '9') || + (keyCode >= 'a' && keyCode <= 'z') || + (keyCode >= 'A' && keyCode <= 'Z' ))) { // find the next item starting with the given prefix char ch = (char)keyCode; - + wxTreeItemId id = FindItem(m_current, m_findPrefix + (wxChar)ch); if ( !id.IsOk() ) { diff --git a/src/gtk/window.cpp b/src/gtk/window.cpp index 61eef683dc..5835152aa8 100644 --- a/src/gtk/window.cpp +++ b/src/gtk/window.cpp @@ -1066,28 +1066,16 @@ static gint gtk_window_key_press_callback( GtkWidget *widget, if (g_blockEventsOnDrag) return FALSE; - bool ret = FALSE; - - wxKeyEvent event( wxEVT_CHAR_HOOK ); + + wxKeyEvent event( wxEVT_KEY_DOWN ); if ( !wxTranslateGTKKeyEventToWx(event, win, gdk_event) ) { // unknown key pressed, ignore (the event would be useless anyhow) return FALSE; } - // Implement wxFrame::OnCharHook by checking ancestor. - wxWindow *parent = win; - while (parent && !parent->IsTopLevel()) - parent = parent->GetParent(); - - if (parent) - ret = parent->GetEventHandler()->ProcessEvent( event ); - - if (!ret) - { - event.SetEventType(wxEVT_KEY_DOWN); - ret = win->GetEventHandler()->ProcessEvent( event ); - } + // Emit KEY_DOWN event + bool ret = win->GetEventHandler()->ProcessEvent( event ); #if wxUSE_ACCEL if (!ret) @@ -1109,10 +1097,11 @@ static gint gtk_window_key_press_callback( GtkWidget *widget, } #endif // wxUSE_ACCEL - /* Only send wxEVT_CHAR event if not processed yet. Thus, ALT-x - will only be sent if it is not in an accelerator table. */ + // Only send wxEVT_CHAR event if not processed yet. Thus, ALT-x + // will only be sent if it is not in an accelerator table. if (!ret) { + // Find key code for EVT_CHAR and EVT_CHAR_HOOK events KeySym keysym = gdk_event->keyval; long key_code = wxTranslateKeySymToWXKey(keysym, TRUE /* isChar */); if ( !key_code ) @@ -1132,16 +1121,27 @@ static gint gtk_window_key_press_callback( GtkWidget *widget, { wxLogTrace(TRACE_KEYS, _T("Char event: %ld"), key_code); - // reuse the same event object, just change its type and use the - // translated keycode instead of the raw one - event.SetEventType(wxEVT_CHAR); event.m_keyCode = 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 ); + } - ret = win->GetEventHandler()->ProcessEvent( event ); + if (!ret) + { + event.SetEventType(wxEVT_CHAR); + ret = win->GetEventHandler()->ProcessEvent( event ); + } } } - /* win is a control: tab can be propagated up */ + // win is a control: tab can be propagated up if ( !ret && ((gdk_event->keyval == GDK_Tab) || (gdk_event->keyval == GDK_ISO_Left_Tab)) && // VZ: testing for wxTE_PROCESS_TAB shouldn't be done here the control may @@ -1154,15 +1154,15 @@ static gint gtk_window_key_press_callback( GtkWidget *widget, { wxNavigationKeyEvent new_event; new_event.SetEventObject( win->GetParent() ); - /* GDK reports GDK_ISO_Left_Tab for SHIFT-TAB */ + // 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 */ + // 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 ); } - /* generate wxID_CANCEL if has been pressed (typically in dialogs) */ + // generate wxID_CANCEL if has been pressed (typically in dialogs) if ( !ret && (gdk_event->keyval == GDK_Escape) ) { @@ -1171,9 +1171,9 @@ static gint gtk_window_key_press_callback( GtkWidget *widget, ret = win->GetEventHandler()->ProcessEvent( new_event ); } - /* Doesn't work. */ -#if 0 // (GTK_MINOR_VERSION > 0) - /* Pressing F10 will activate the menu bar of the top frame. */ + // Doesn't work. +#if 0 + // Pressing F10 will activate the menu bar of the top frame if ( (!ret) && (gdk_event->keyval == GDK_F10) ) { @@ -1206,7 +1206,7 @@ static gint gtk_window_key_press_callback( GtkWidget *widget, gtk_signal_emit_stop_by_name( GTK_OBJECT(widget), "key_press_event" ); return TRUE; } - + return FALSE; } @@ -2635,8 +2635,10 @@ void wxWindowGTK::ConnectWidget( GtkWidget *widget ) gtk_signal_connect( GTK_OBJECT(widget), "leave_notify_event", GTK_SIGNAL_FUNC(gtk_window_leave_callback), (gpointer)this ); - gtk_signal_connect( GTK_OBJECT(widget), "destroy", - GTK_SIGNAL_FUNC(gtk_window_destroy_callback), (gpointer)this ); + // This keeps crashing on me. RR. + // + // gtk_signal_connect( GTK_OBJECT(widget), "destroy", + // GTK_SIGNAL_FUNC(gtk_window_destroy_callback), (gpointer)this ); } bool wxWindowGTK::Destroy() diff --git a/src/gtk1/window.cpp b/src/gtk1/window.cpp index 61eef683dc..5835152aa8 100644 --- a/src/gtk1/window.cpp +++ b/src/gtk1/window.cpp @@ -1066,28 +1066,16 @@ static gint gtk_window_key_press_callback( GtkWidget *widget, if (g_blockEventsOnDrag) return FALSE; - bool ret = FALSE; - - wxKeyEvent event( wxEVT_CHAR_HOOK ); + + wxKeyEvent event( wxEVT_KEY_DOWN ); if ( !wxTranslateGTKKeyEventToWx(event, win, gdk_event) ) { // unknown key pressed, ignore (the event would be useless anyhow) return FALSE; } - // Implement wxFrame::OnCharHook by checking ancestor. - wxWindow *parent = win; - while (parent && !parent->IsTopLevel()) - parent = parent->GetParent(); - - if (parent) - ret = parent->GetEventHandler()->ProcessEvent( event ); - - if (!ret) - { - event.SetEventType(wxEVT_KEY_DOWN); - ret = win->GetEventHandler()->ProcessEvent( event ); - } + // Emit KEY_DOWN event + bool ret = win->GetEventHandler()->ProcessEvent( event ); #if wxUSE_ACCEL if (!ret) @@ -1109,10 +1097,11 @@ static gint gtk_window_key_press_callback( GtkWidget *widget, } #endif // wxUSE_ACCEL - /* Only send wxEVT_CHAR event if not processed yet. Thus, ALT-x - will only be sent if it is not in an accelerator table. */ + // Only send wxEVT_CHAR event if not processed yet. Thus, ALT-x + // will only be sent if it is not in an accelerator table. if (!ret) { + // Find key code for EVT_CHAR and EVT_CHAR_HOOK events KeySym keysym = gdk_event->keyval; long key_code = wxTranslateKeySymToWXKey(keysym, TRUE /* isChar */); if ( !key_code ) @@ -1132,16 +1121,27 @@ static gint gtk_window_key_press_callback( GtkWidget *widget, { wxLogTrace(TRACE_KEYS, _T("Char event: %ld"), key_code); - // reuse the same event object, just change its type and use the - // translated keycode instead of the raw one - event.SetEventType(wxEVT_CHAR); event.m_keyCode = 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 ); + } - ret = win->GetEventHandler()->ProcessEvent( event ); + if (!ret) + { + event.SetEventType(wxEVT_CHAR); + ret = win->GetEventHandler()->ProcessEvent( event ); + } } } - /* win is a control: tab can be propagated up */ + // win is a control: tab can be propagated up if ( !ret && ((gdk_event->keyval == GDK_Tab) || (gdk_event->keyval == GDK_ISO_Left_Tab)) && // VZ: testing for wxTE_PROCESS_TAB shouldn't be done here the control may @@ -1154,15 +1154,15 @@ static gint gtk_window_key_press_callback( GtkWidget *widget, { wxNavigationKeyEvent new_event; new_event.SetEventObject( win->GetParent() ); - /* GDK reports GDK_ISO_Left_Tab for SHIFT-TAB */ + // 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 */ + // 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 ); } - /* generate wxID_CANCEL if has been pressed (typically in dialogs) */ + // generate wxID_CANCEL if has been pressed (typically in dialogs) if ( !ret && (gdk_event->keyval == GDK_Escape) ) { @@ -1171,9 +1171,9 @@ static gint gtk_window_key_press_callback( GtkWidget *widget, ret = win->GetEventHandler()->ProcessEvent( new_event ); } - /* Doesn't work. */ -#if 0 // (GTK_MINOR_VERSION > 0) - /* Pressing F10 will activate the menu bar of the top frame. */ + // Doesn't work. +#if 0 + // Pressing F10 will activate the menu bar of the top frame if ( (!ret) && (gdk_event->keyval == GDK_F10) ) { @@ -1206,7 +1206,7 @@ static gint gtk_window_key_press_callback( GtkWidget *widget, gtk_signal_emit_stop_by_name( GTK_OBJECT(widget), "key_press_event" ); return TRUE; } - + return FALSE; } @@ -2635,8 +2635,10 @@ void wxWindowGTK::ConnectWidget( GtkWidget *widget ) gtk_signal_connect( GTK_OBJECT(widget), "leave_notify_event", GTK_SIGNAL_FUNC(gtk_window_leave_callback), (gpointer)this ); - gtk_signal_connect( GTK_OBJECT(widget), "destroy", - GTK_SIGNAL_FUNC(gtk_window_destroy_callback), (gpointer)this ); + // This keeps crashing on me. RR. + // + // gtk_signal_connect( GTK_OBJECT(widget), "destroy", + // GTK_SIGNAL_FUNC(gtk_window_destroy_callback), (gpointer)this ); } bool wxWindowGTK::Destroy() -- 2.47.2