Fixed detection of Meta key state so that NumLock isn't misdetected as Meta.

git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/branches/WX_2_8_BRANCH@54758 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
This commit is contained in:
Václav Slavík
2008-07-21 22:09:22 +00:00
parent f671cd5668
commit b2a8de5a15
2 changed files with 33 additions and 8 deletions

View File

@@ -117,7 +117,7 @@ All (Unix):
wxMSW: wxMSW:
+ Potentially incompatible change: wxExecute() arguments are now quoted if they - Potentially incompatible change: wxExecute() arguments are now quoted if they
contain spaces and existing quotes are escaped with a backslash. However, to contain spaces and existing quotes are escaped with a backslash. However, to
preserve compatibility, the argument is unchanged if it is already quoted. preserve compatibility, the argument is unchanged if it is already quoted.
Notice that this behaviour will change in wxWidgets 3.0 where all arguments Notice that this behaviour will change in wxWidgets 3.0 where all arguments
@@ -131,8 +131,10 @@ wxMSW:
wxGTK: wxGTK:
- Fix masking of disabled bitmaps in wxMenuItem and wxStaticBitmap. - Fixed masking of disabled bitmaps in wxMenuItem and wxStaticBitmap.
- Fix generation of events for an initially empty wxDirPickerCtrl. - Fixed generation of events for an initially empty wxDirPickerCtrl.
- Fixed detection of Meta key state so that NumLock isn't misdetected
as Meta (requires GTK+ 2.10).
wxMac: wxMac:

View File

@@ -59,6 +59,29 @@
#include <gdk/gdkkeysyms.h> #include <gdk/gdkkeysyms.h>
#include <gdk/gdkx.h> #include <gdk/gdkx.h>
#if !GTK_CHECK_VERSION(2,10,0)
// GTK+ can reliably detect Meta key state only since 2.10 when
// GDK_META_MASK was introduced -- there wasn't any way to detect it
// in older versions. wxGTK used GDK_MOD2_MASK for this purpose, but
// GDK_MOD2_MASK is documented as:
//
// the fifth modifier key (it depends on the modifier mapping of the X
// server which key is interpreted as this modifier)
//
// In other words, it isn't guaranteed to map to Meta. This is a real
// problem: it is common to map NumLock to it (in fact, it's an exception
// if the X server _doesn't_ use it for NumLock). So the old code caused
// wxKeyEvent::MetaDown() to always return true as long as NumLock was on
// on many systems, which broke all applications using
// wxKeyEvent::GetModifiers() to check modifiers state (see e.g. here:
// http://tinyurl.com/56lsk2).
//
// Because of this, it's better to not detect Meta key state at all than
// to detect it incorrectly. Hence the following #define, which causes
// m_metaDown to be always set to false.
#define GDK_META_MASK 0
#endif
//----------------------------------------------------------------------------- //-----------------------------------------------------------------------------
// documentation on internals // documentation on internals
//----------------------------------------------------------------------------- //-----------------------------------------------------------------------------
@@ -838,7 +861,7 @@ static void wxFillOtherKeyEventFields(wxKeyEvent& event,
event.m_shiftDown = (gdk_event->state & GDK_SHIFT_MASK) != 0; event.m_shiftDown = (gdk_event->state & GDK_SHIFT_MASK) != 0;
event.m_controlDown = (gdk_event->state & GDK_CONTROL_MASK) != 0; event.m_controlDown = (gdk_event->state & GDK_CONTROL_MASK) != 0;
event.m_altDown = (gdk_event->state & GDK_MOD1_MASK) != 0; event.m_altDown = (gdk_event->state & GDK_MOD1_MASK) != 0;
event.m_metaDown = (gdk_event->state & GDK_MOD2_MASK) != 0; event.m_metaDown = (gdk_event->state & GDK_META_MASK) != 0;
event.m_scanCode = gdk_event->keyval; event.m_scanCode = gdk_event->keyval;
event.m_rawCode = (wxUint32) gdk_event->keyval; event.m_rawCode = (wxUint32) gdk_event->keyval;
event.m_rawFlags = 0; event.m_rawFlags = 0;
@@ -1281,7 +1304,7 @@ template<typename T> void InitMouseEvent(wxWindowGTK *win,
event.m_shiftDown = (gdk_event->state & GDK_SHIFT_MASK); event.m_shiftDown = (gdk_event->state & GDK_SHIFT_MASK);
event.m_controlDown = (gdk_event->state & GDK_CONTROL_MASK); event.m_controlDown = (gdk_event->state & GDK_CONTROL_MASK);
event.m_altDown = (gdk_event->state & GDK_MOD1_MASK); event.m_altDown = (gdk_event->state & GDK_MOD1_MASK);
event.m_metaDown = (gdk_event->state & GDK_MOD2_MASK); event.m_metaDown = (gdk_event->state & GDK_META_MASK);
event.m_leftDown = (gdk_event->state & GDK_BUTTON1_MASK); event.m_leftDown = (gdk_event->state & GDK_BUTTON1_MASK);
event.m_middleDown = (gdk_event->state & GDK_BUTTON2_MASK); event.m_middleDown = (gdk_event->state & GDK_BUTTON2_MASK);
event.m_rightDown = (gdk_event->state & GDK_BUTTON3_MASK); event.m_rightDown = (gdk_event->state & GDK_BUTTON3_MASK);
@@ -1790,7 +1813,7 @@ window_scroll_event(GtkWidget*, GdkEventScroll* gdk_event, wxWindow* win)
event.m_shiftDown = (gdk_event->state & GDK_SHIFT_MASK); event.m_shiftDown = (gdk_event->state & GDK_SHIFT_MASK);
event.m_controlDown = (gdk_event->state & GDK_CONTROL_MASK); event.m_controlDown = (gdk_event->state & GDK_CONTROL_MASK);
event.m_altDown = (gdk_event->state & GDK_MOD1_MASK); event.m_altDown = (gdk_event->state & GDK_MOD1_MASK);
event.m_metaDown = (gdk_event->state & GDK_MOD2_MASK); event.m_metaDown = (gdk_event->state & GDK_META_MASK);
event.m_leftDown = (gdk_event->state & GDK_BUTTON1_MASK); event.m_leftDown = (gdk_event->state & GDK_BUTTON1_MASK);
event.m_middleDown = (gdk_event->state & GDK_BUTTON2_MASK); event.m_middleDown = (gdk_event->state & GDK_BUTTON2_MASK);
event.m_rightDown = (gdk_event->state & GDK_BUTTON3_MASK); event.m_rightDown = (gdk_event->state & GDK_BUTTON3_MASK);
@@ -2003,7 +2026,7 @@ gtk_window_leave_callback( GtkWidget *widget,
event.m_shiftDown = (state & GDK_SHIFT_MASK) != 0; event.m_shiftDown = (state & GDK_SHIFT_MASK) != 0;
event.m_controlDown = (state & GDK_CONTROL_MASK) != 0; event.m_controlDown = (state & GDK_CONTROL_MASK) != 0;
event.m_altDown = (state & GDK_MOD1_MASK) != 0; event.m_altDown = (state & GDK_MOD1_MASK) != 0;
event.m_metaDown = (state & GDK_MOD2_MASK) != 0; event.m_metaDown = (state & GDK_META_MASK) != 0;
event.m_leftDown = (state & GDK_BUTTON1_MASK) != 0; event.m_leftDown = (state & GDK_BUTTON1_MASK) != 0;
event.m_middleDown = (state & GDK_BUTTON2_MASK) != 0; event.m_middleDown = (state & GDK_BUTTON2_MASK) != 0;
event.m_rightDown = (state & GDK_BUTTON3_MASK) != 0; event.m_rightDown = (state & GDK_BUTTON3_MASK) != 0;
@@ -2289,7 +2312,7 @@ wxMouseState wxGetMouseState()
ms.SetControlDown(mask & GDK_CONTROL_MASK); ms.SetControlDown(mask & GDK_CONTROL_MASK);
ms.SetShiftDown(mask & GDK_SHIFT_MASK); ms.SetShiftDown(mask & GDK_SHIFT_MASK);
ms.SetAltDown(mask & GDK_MOD1_MASK); ms.SetAltDown(mask & GDK_MOD1_MASK);
ms.SetMetaDown(mask & GDK_MOD2_MASK); ms.SetMetaDown(mask & GDK_META_MASK);
return ms; return ms;
} }