Merge branch 'gtk_unknown_keys' of https://github.com/martinetd/wxWidgets
Generate wxKeyEvents even for unknown keys in wxGTK. See https://github.com/wxWidgets/wxWidgets/pull/2576
This commit is contained in:
@@ -1321,20 +1321,26 @@ enum wxKeyCategoryFlags
|
||||
This event class contains information about key press and release events.
|
||||
|
||||
The main information carried by this event is the key being pressed or
|
||||
released. It can be accessed using either GetKeyCode() function or
|
||||
GetUnicodeKey(). For the printable characters, the latter should be used as
|
||||
it works for any keys, including non-Latin-1 characters that can be entered
|
||||
when using national keyboard layouts. GetKeyCode() should be used to handle
|
||||
released. It can be accessed using one of GetUnicodeKey(), GetKeyCode()
|
||||
or GetRawKeyCode() functions.
|
||||
For the printable characters, GetUnicodeKey() should be used as it works
|
||||
for any keys, including non-Latin-1 characters that can be entered when
|
||||
using national keyboard layouts. GetKeyCode() should be used to handle
|
||||
special characters (such as cursor arrows keys or @c HOME or @c INS and so
|
||||
on) which correspond to ::wxKeyCode enum elements above the @c WXK_START
|
||||
constant. While GetKeyCode() also returns the character code for Latin-1
|
||||
keys for compatibility, it doesn't work for Unicode characters in general
|
||||
and will return @c WXK_NONE for any non-Latin-1 ones. For this reason, it's
|
||||
recommended to always use GetUnicodeKey() and only fall back to GetKeyCode()
|
||||
if GetUnicodeKey() returned @c WXK_NONE meaning that the event corresponds
|
||||
to a non-printable special keys.
|
||||
and will return @c WXK_NONE for any non-Latin-1 ones.
|
||||
If both GetUnicodeKey() and GetKeyCode() return @c WXK_NONE then the key
|
||||
has no @c WXK_xxx mapping and GetRawKeyCode() can be used to distinguish
|
||||
between keys, but raw key codes are platform specific.
|
||||
For these reasons, it is recommended to always use GetUnicodeKey() and
|
||||
only fall back to GetKeyCode() if GetUnicodeKey() returned @c WXK_NONE,
|
||||
meaning that the event corresponds to a non-printable special keys, then
|
||||
optionally check GetRawKeyCode() if GetKeyCode() also returned @c WXK_NONE
|
||||
or simply ignore that key.
|
||||
|
||||
While both of these functions can be used with the events of @c
|
||||
While these three functions can be used with the events of @c
|
||||
wxEVT_KEY_DOWN, @c wxEVT_KEY_UP and @c wxEVT_CHAR types, the values
|
||||
returned by them are different for the first two events and the last one.
|
||||
For the latter, the key returned corresponds to the character that would
|
||||
@@ -1368,6 +1374,10 @@ enum wxKeyCategoryFlags
|
||||
can be used to retrieve the key code as GetKeyCode() just returns @c
|
||||
WXK_NONE in this case.
|
||||
|
||||
Also, note that @c wxEVT_CHAR events are not generated for keys which do
|
||||
not have a wxWidgets mapping, so GetRawKeyCode() should never be required
|
||||
for this event.
|
||||
|
||||
To summarize: you should handle @c wxEVT_CHAR if you need the translated
|
||||
key and @c wxEVT_KEY_DOWN if you only need the value of the key itself,
|
||||
independent of the current keyboard state.
|
||||
|
@@ -974,7 +974,7 @@ static void wxFillOtherKeyEventFields(wxKeyEvent& event,
|
||||
}
|
||||
|
||||
|
||||
static bool
|
||||
static void
|
||||
wxTranslateGTKKeyEventToWx(wxKeyEvent& event,
|
||||
wxWindowGTK *win,
|
||||
GdkEventKey *gdk_event)
|
||||
@@ -1093,18 +1093,16 @@ wxTranslateGTKKeyEventToWx(wxKeyEvent& event,
|
||||
event.m_uniChar = event.m_keyCode;
|
||||
}
|
||||
|
||||
// sending unknown key events doesn't really make sense
|
||||
// sending a WXK_NONE key and let app deal with it the RawKeyCode if required
|
||||
if ( !key_code && !event.m_uniChar )
|
||||
return false;
|
||||
event.m_keyCode = WXK_NONE;
|
||||
#else
|
||||
if (!key_code)
|
||||
return false;
|
||||
event.m_keyCode = WXK_NONE;
|
||||
#endif // wxUSE_UNICODE
|
||||
|
||||
// now fill all the other fields
|
||||
wxFillOtherKeyEventFields(event, win, gdk_event);
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
|
||||
@@ -1194,10 +1192,8 @@ gtk_window_key_press_callback( GtkWidget *WXUNUSED(widget),
|
||||
|
||||
wxKeyEvent event( wxEVT_KEY_DOWN );
|
||||
bool ret = false;
|
||||
bool return_after_IM = false;
|
||||
|
||||
if( wxTranslateGTKKeyEventToWx(event, win, gdk_event) )
|
||||
{
|
||||
wxTranslateGTKKeyEventToWx(event, win, gdk_event);
|
||||
// Send the CHAR_HOOK event first
|
||||
if ( SendCharHookEvent(event, win) )
|
||||
{
|
||||
@@ -1236,13 +1232,6 @@ gtk_window_key_press_callback( GtkWidget *WXUNUSED(widget),
|
||||
// If not an accelerator, then emit KEY_DOWN event
|
||||
if ( !ret )
|
||||
ret = win->HandleWindowEvent( event );
|
||||
}
|
||||
else
|
||||
{
|
||||
// Return after IM processing as we cannot do
|
||||
// anything with it anyhow.
|
||||
return_after_IM = true;
|
||||
}
|
||||
|
||||
if ( !ret )
|
||||
{
|
||||
@@ -1265,9 +1254,6 @@ gtk_window_key_press_callback( GtkWidget *WXUNUSED(widget),
|
||||
}
|
||||
}
|
||||
|
||||
if (return_after_IM)
|
||||
return FALSE;
|
||||
|
||||
// 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)
|
||||
@@ -1395,11 +1381,7 @@ gtk_window_key_release_callback( GtkWidget * WXUNUSED(widget),
|
||||
wxPROCESS_EVENT_ONCE(GdkEventKey, gdk_event);
|
||||
|
||||
wxKeyEvent event( wxEVT_KEY_UP );
|
||||
if ( !wxTranslateGTKKeyEventToWx(event, win, gdk_event) )
|
||||
{
|
||||
// unknown key pressed, ignore (the event would be useless anyhow)
|
||||
return FALSE;
|
||||
}
|
||||
wxTranslateGTKKeyEventToWx(event, win, gdk_event);
|
||||
|
||||
return win->GTKProcessEvent(event);
|
||||
}
|
||||
|
Reference in New Issue
Block a user