diff --git a/include/wx/utils.h b/include/wx/utils.h index ecc35d98e6..db163acb3e 100644 --- a/include/wx/utils.h +++ b/include/wx/utils.h @@ -84,6 +84,11 @@ WXDLLEXPORT int wxGetOsVersion(int *majorVsn= (int *) NULL,int *minorVsn= (int * // Return a string with the current date/time WXDLLEXPORT wxString wxNow(); +// Synthesize KeyUp events holding down a key and producing +// KeyDown events with autorepeat. On by default an always +// on in wxMSW. +WXDLLEXPORT bool wxSetDetectableAutoRepeat( bool flag ); + // ---------------------------------------------------------------------------- // Window ID management // ---------------------------------------------------------------------------- diff --git a/src/common/utilscmn.cpp b/src/common/utilscmn.cpp index 3fe071d7b3..3b67989d3a 100644 --- a/src/common/utilscmn.cpp +++ b/src/common/utilscmn.cpp @@ -355,6 +355,16 @@ StringMatch (char *str1, char *str2, bool subString, bool exact) return FALSE; } +// Synthesize KeyUp events holding down a key and producing +// KeyDown events with autorepeat. On by default an always +// on in wxMSW. wxGTK version in utilsgtk.cpp. +#ifndef __WXGTK__ +bool wxSetDetectableAutoRepeat( bool WXUNUSED(flag) ) +{ + return TRUE; // detectable auto-repeat is the only mode MSW supports +} +#endif + // Return the current date/time // [volatile] wxString wxNow( void ) diff --git a/src/gtk/app.cpp b/src/gtk/app.cpp index c35b4af51d..3494913603 100644 --- a/src/gtk/app.cpp +++ b/src/gtk/app.cpp @@ -596,6 +596,8 @@ int wxEntry( int argc, char *argv[] ) gtk_init( &argc, &argv ); + wxSetDetectableAutoRepeat( TRUE ); + if (!wxApp::Initialize()) return -1; diff --git a/src/gtk/utilsgtk.cpp b/src/gtk/utilsgtk.cpp index d9ceaf81f4..4a64e6a797 100644 --- a/src/gtk/utilsgtk.cpp +++ b/src/gtk/utilsgtk.cpp @@ -35,6 +35,7 @@ #include #include #include +#include "X11/XKBlib.h" // ---------------------------------------------------------------------------- // misc. @@ -45,6 +46,15 @@ void wxBell() gdk_beep(); } +// Synthesize KeyUp events holding down a key and producing +// KeyDown events with autorepeat. +bool wxSetDetectableAutoRepeat( bool flag ) +{ + Bool result; + XkbSetDetectableAutoRepeat( GDK_DISPLAY(), flag, &result ); + return result; // true if keyboard hardware supports this mode +} + // ---------------------------------------------------------------------------- // display characterstics // ---------------------------------------------------------------------------- diff --git a/src/gtk/window.cpp b/src/gtk/window.cpp index 8bf4d36bfa..cff51e599d 100644 --- a/src/gtk/window.cpp +++ b/src/gtk/window.cpp @@ -563,8 +563,6 @@ static gint gtk_window_key_press_callback( GtkWidget *widget, GdkEventKey *gdk_e printf( "\n" ); */ - bool ret = FALSE; - int x = 0; int y = 0; GdkModifierType state; @@ -572,6 +570,11 @@ static gint gtk_window_key_press_callback( GtkWidget *widget, GdkEventKey *gdk_e long key_code = get_unmodified_wx_keysym( gdk_event ); + /* sending unknown key events doesn't really make sense */ + if (key_code == 0) return FALSE; + + bool ret = FALSE; + wxKeyEvent event( wxEVT_KEY_DOWN ); event.SetTimestamp( gdk_event->time ); event.m_shiftDown = (gdk_event->state & GDK_SHIFT_MASK); @@ -702,6 +705,9 @@ static gint gtk_window_key_release_callback( GtkWidget *widget, GdkEventKey *gdk */ long key_code = get_unmodified_wx_keysym( gdk_event ); + + /* sending unknown key events doesn't really make sense */ + if (key_code == 0) return FALSE; int x = 0; int y = 0; diff --git a/src/gtk1/app.cpp b/src/gtk1/app.cpp index c35b4af51d..3494913603 100644 --- a/src/gtk1/app.cpp +++ b/src/gtk1/app.cpp @@ -596,6 +596,8 @@ int wxEntry( int argc, char *argv[] ) gtk_init( &argc, &argv ); + wxSetDetectableAutoRepeat( TRUE ); + if (!wxApp::Initialize()) return -1; diff --git a/src/gtk1/utilsgtk.cpp b/src/gtk1/utilsgtk.cpp index d9ceaf81f4..4a64e6a797 100644 --- a/src/gtk1/utilsgtk.cpp +++ b/src/gtk1/utilsgtk.cpp @@ -35,6 +35,7 @@ #include #include #include +#include "X11/XKBlib.h" // ---------------------------------------------------------------------------- // misc. @@ -45,6 +46,15 @@ void wxBell() gdk_beep(); } +// Synthesize KeyUp events holding down a key and producing +// KeyDown events with autorepeat. +bool wxSetDetectableAutoRepeat( bool flag ) +{ + Bool result; + XkbSetDetectableAutoRepeat( GDK_DISPLAY(), flag, &result ); + return result; // true if keyboard hardware supports this mode +} + // ---------------------------------------------------------------------------- // display characterstics // ---------------------------------------------------------------------------- diff --git a/src/gtk1/window.cpp b/src/gtk1/window.cpp index 8bf4d36bfa..cff51e599d 100644 --- a/src/gtk1/window.cpp +++ b/src/gtk1/window.cpp @@ -563,8 +563,6 @@ static gint gtk_window_key_press_callback( GtkWidget *widget, GdkEventKey *gdk_e printf( "\n" ); */ - bool ret = FALSE; - int x = 0; int y = 0; GdkModifierType state; @@ -572,6 +570,11 @@ static gint gtk_window_key_press_callback( GtkWidget *widget, GdkEventKey *gdk_e long key_code = get_unmodified_wx_keysym( gdk_event ); + /* sending unknown key events doesn't really make sense */ + if (key_code == 0) return FALSE; + + bool ret = FALSE; + wxKeyEvent event( wxEVT_KEY_DOWN ); event.SetTimestamp( gdk_event->time ); event.m_shiftDown = (gdk_event->state & GDK_SHIFT_MASK); @@ -702,6 +705,9 @@ static gint gtk_window_key_release_callback( GtkWidget *widget, GdkEventKey *gdk */ long key_code = get_unmodified_wx_keysym( gdk_event ); + + /* sending unknown key events doesn't really make sense */ + if (key_code == 0) return FALSE; int x = 0; int y = 0;