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.
|
This event class contains information about key press and release events.
|
||||||
|
|
||||||
The main information carried by this event is the key being pressed or
|
The main information carried by this event is the key being pressed or
|
||||||
released. It can be accessed using either GetKeyCode() function or
|
released. It can be accessed using one of GetUnicodeKey(), GetKeyCode()
|
||||||
GetUnicodeKey(). For the printable characters, the latter should be used as
|
or GetRawKeyCode() functions.
|
||||||
it works for any keys, including non-Latin-1 characters that can be entered
|
For the printable characters, GetUnicodeKey() should be used as it works
|
||||||
when using national keyboard layouts. GetKeyCode() should be used to handle
|
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
|
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
|
on) which correspond to ::wxKeyCode enum elements above the @c WXK_START
|
||||||
constant. While GetKeyCode() also returns the character code for Latin-1
|
constant. While GetKeyCode() also returns the character code for Latin-1
|
||||||
keys for compatibility, it doesn't work for Unicode characters in general
|
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
|
and will return @c WXK_NONE for any non-Latin-1 ones.
|
||||||
recommended to always use GetUnicodeKey() and only fall back to GetKeyCode()
|
If both GetUnicodeKey() and GetKeyCode() return @c WXK_NONE then the key
|
||||||
if GetUnicodeKey() returned @c WXK_NONE meaning that the event corresponds
|
has no @c WXK_xxx mapping and GetRawKeyCode() can be used to distinguish
|
||||||
to a non-printable special keys.
|
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
|
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.
|
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
|
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
|
can be used to retrieve the key code as GetKeyCode() just returns @c
|
||||||
WXK_NONE in this case.
|
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
|
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,
|
key and @c wxEVT_KEY_DOWN if you only need the value of the key itself,
|
||||||
independent of the current keyboard state.
|
independent of the current keyboard state.
|
||||||
|
@@ -974,7 +974,7 @@ static void wxFillOtherKeyEventFields(wxKeyEvent& event,
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
static bool
|
static void
|
||||||
wxTranslateGTKKeyEventToWx(wxKeyEvent& event,
|
wxTranslateGTKKeyEventToWx(wxKeyEvent& event,
|
||||||
wxWindowGTK *win,
|
wxWindowGTK *win,
|
||||||
GdkEventKey *gdk_event)
|
GdkEventKey *gdk_event)
|
||||||
@@ -1093,18 +1093,16 @@ wxTranslateGTKKeyEventToWx(wxKeyEvent& event,
|
|||||||
event.m_uniChar = event.m_keyCode;
|
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 )
|
if ( !key_code && !event.m_uniChar )
|
||||||
return false;
|
event.m_keyCode = WXK_NONE;
|
||||||
#else
|
#else
|
||||||
if (!key_code)
|
if (!key_code)
|
||||||
return false;
|
event.m_keyCode = WXK_NONE;
|
||||||
#endif // wxUSE_UNICODE
|
#endif // wxUSE_UNICODE
|
||||||
|
|
||||||
// now fill all the other fields
|
// now fill all the other fields
|
||||||
wxFillOtherKeyEventFields(event, win, gdk_event);
|
wxFillOtherKeyEventFields(event, win, gdk_event);
|
||||||
|
|
||||||
return true;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@@ -1194,10 +1192,8 @@ gtk_window_key_press_callback( GtkWidget *WXUNUSED(widget),
|
|||||||
|
|
||||||
wxKeyEvent event( wxEVT_KEY_DOWN );
|
wxKeyEvent event( wxEVT_KEY_DOWN );
|
||||||
bool ret = false;
|
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
|
// Send the CHAR_HOOK event first
|
||||||
if ( SendCharHookEvent(event, win) )
|
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 not an accelerator, then emit KEY_DOWN event
|
||||||
if ( !ret )
|
if ( !ret )
|
||||||
ret = win->HandleWindowEvent( event );
|
ret = win->HandleWindowEvent( event );
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
// Return after IM processing as we cannot do
|
|
||||||
// anything with it anyhow.
|
|
||||||
return_after_IM = true;
|
|
||||||
}
|
|
||||||
|
|
||||||
if ( !ret )
|
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
|
// Only send wxEVT_CHAR event if not processed yet. Thus, ALT-x
|
||||||
// will only be sent if it is not in an accelerator table.
|
// will only be sent if it is not in an accelerator table.
|
||||||
if (!ret)
|
if (!ret)
|
||||||
@@ -1395,11 +1381,7 @@ gtk_window_key_release_callback( GtkWidget * WXUNUSED(widget),
|
|||||||
wxPROCESS_EVENT_ONCE(GdkEventKey, gdk_event);
|
wxPROCESS_EVENT_ONCE(GdkEventKey, gdk_event);
|
||||||
|
|
||||||
wxKeyEvent event( wxEVT_KEY_UP );
|
wxKeyEvent event( wxEVT_KEY_UP );
|
||||||
if ( !wxTranslateGTKKeyEventToWx(event, win, gdk_event) )
|
wxTranslateGTKKeyEventToWx(event, win, gdk_event);
|
||||||
{
|
|
||||||
// unknown key pressed, ignore (the event would be useless anyhow)
|
|
||||||
return FALSE;
|
|
||||||
}
|
|
||||||
|
|
||||||
return win->GTKProcessEvent(event);
|
return win->GTKProcessEvent(event);
|
||||||
}
|
}
|
||||||
|
Reference in New Issue
Block a user