Bug 630813 part.4 Implement a modifier keys initializer for nsInputEvent r=karlt

This commit is contained in:
Masayuki Nakano 2012-02-22 16:34:31 +09:00
parent 739fe4efcf
commit ed669df5cd
3 changed files with 52 additions and 56 deletions

View File

@ -347,6 +347,11 @@ KeymapWrapper* KeymapWrapper::sInstance = nsnull;
#ifdef PR_LOGGING
static const char* GetBoolName(bool aBool)
{
return aBool ? "TRUE" : "FALSE";
}
/* static */ const char*
KeymapWrapper::GetModifierName(Modifier aModifier)
{
@ -681,5 +686,29 @@ KeymapWrapper::AreModifiersActive(Modifiers aModifiers,
return true;
}
/* static */ void
KeymapWrapper::InitInputEvent(nsInputEvent& aInputEvent,
guint aModifierState)
{
KeymapWrapper* keymapWrapper = GetInstance();
aInputEvent.isShift =
keymapWrapper->AreModifiersActive(SHIFT, aModifierState);
aInputEvent.isControl =
keymapWrapper->AreModifiersActive(CTRL, aModifierState);
aInputEvent.isAlt =
keymapWrapper->AreModifiersActive(ALT, aModifierState);
// XXX DOM Meta key should be TRUE only on Mac. We need to discuss this
// issue later.
aInputEvent.isMeta = false;
PR_LOG(gKeymapWrapperLog, PR_LOG_DEBUG,
("KeymapWrapper(%p): InitInputEvent, aModifierState=0x%08X "
"aKeyEvent={ isShift=%s, isControl=%s, isAlt=%s, isMeta=%s }",
keymapWrapper, aModifierState,
GetBoolName(aInputEvent.isShift), GetBoolName(aInputEvent.isControl),
GetBoolName(aInputEvent.isAlt), GetBoolName(aInputEvent.isMeta)));
}
} // namespace widget
} // namespace mozilla

View File

@ -109,6 +109,12 @@ public:
*/
static bool AreModifiersCurrentlyActive(Modifiers aModifiers);
/**
* InitInputEvent() initializes the aInputEvent with aModifierState.
*/
static void InitInputEvent(nsInputEvent& aInputEvent,
guint aModifierState);
protected:
/**

View File

@ -174,8 +174,6 @@ static GdkWindow *get_inner_gdk_window (GdkWindow *aWindow,
gint *retx, gint *rety);
static inline bool is_context_menu_key(const nsKeyEvent& inKeyEvent);
static void key_event_to_context_menu_event(nsMouseEvent &aEvent,
GdkEventKey *aGdkEvent);
static int is_parent_ungrab_enter(GdkEventCrossing *aEvent);
static int is_parent_grab_leave(GdkEventCrossing *aEvent);
@ -507,10 +505,7 @@ nsWindow::InitKeyEvent(nsKeyEvent &aEvent, GdkEventKey *aGdkEvent)
// event, we should cut out changingMask from modifierState.
}
}
aEvent.isShift = (modifierState & GDK_SHIFT_MASK) != 0;
aEvent.isControl = (modifierState & GDK_CONTROL_MASK) != 0;
aEvent.isAlt = (modifierState & GDK_MOD1_MASK) != 0;
aEvent.isMeta = (modifierState & GDK_MOD4_MASK) != 0;
KeymapWrapper::InitInputEvent(aEvent, modifierState);
// The transformations above and in gdk for the keyval are not invertible
// so link to the GdkEvent (which will vanish soon after return from the
@ -2609,29 +2604,20 @@ nsWindow::OnMotionNotifyEvent(GtkWidget *aWidget, GdkEventMotion *aEvent)
mLastMotionPressure = pressure;
event.pressure = mLastMotionPressure;
guint modifierState;
if (synthEvent) {
#ifdef MOZ_X11
event.refPoint.x = nscoord(xevent.xmotion.x);
event.refPoint.y = nscoord(xevent.xmotion.y);
event.isShift = (xevent.xmotion.state & GDK_SHIFT_MASK)
? true : false;
event.isControl = (xevent.xmotion.state & GDK_CONTROL_MASK)
? true : false;
event.isAlt = (xevent.xmotion.state & GDK_MOD1_MASK)
? true : false;
modifierState = xevent.xmotion.state;
event.time = xevent.xmotion.time;
#else
event.refPoint.x = nscoord(aEvent->x);
event.refPoint.y = nscoord(aEvent->y);
event.isShift = (aEvent->state & GDK_SHIFT_MASK)
? true : false;
event.isControl = (aEvent->state & GDK_CONTROL_MASK)
? true : false;
event.isAlt = (aEvent->state & GDK_MOD1_MASK)
? true : false;
modifierState = aEvent->state;
event.time = aEvent->time;
#endif /* MOZ_X11 */
@ -2646,16 +2632,13 @@ nsWindow::OnMotionNotifyEvent(GtkWidget *aWidget, GdkEventMotion *aEvent)
event.refPoint = point - WidgetToScreenOffset();
}
event.isShift = (aEvent->state & GDK_SHIFT_MASK)
? true : false;
event.isControl = (aEvent->state & GDK_CONTROL_MASK)
? true : false;
event.isAlt = (aEvent->state & GDK_MOD1_MASK)
? true : false;
modifierState = aEvent->state;
event.time = aEvent->time;
}
KeymapWrapper::InitInputEvent(event, modifierState);
nsEventStatus status;
DispatchEvent(&event, status);
}
@ -2728,10 +2711,7 @@ nsWindow::InitButtonEvent(nsMouseEvent &aEvent,
aEvent.refPoint = point - WidgetToScreenOffset();
}
aEvent.isShift = (aGdkEvent->state & GDK_SHIFT_MASK) != 0;
aEvent.isControl = (aGdkEvent->state & GDK_CONTROL_MASK) != 0;
aEvent.isAlt = (aGdkEvent->state & GDK_MOD1_MASK) != 0;
aEvent.isMeta = (aGdkEvent->state & GDK_MOD4_MASK) != 0;
KeymapWrapper::InitInputEvent(aEvent, aGdkEvent->state);
aEvent.time = aGdkEvent->time;
@ -2815,10 +2795,7 @@ nsWindow::OnButtonPressEvent(GtkWidget *aWidget, GdkEventButton *aEvent)
// XXX Why is this delta value different from the scroll event?
event.delta = (aEvent->button == 6) ? -2 : 2;
event.isShift = (aEvent->state & GDK_SHIFT_MASK) != 0;
event.isControl = (aEvent->state & GDK_CONTROL_MASK) != 0;
event.isAlt = (aEvent->state & GDK_MOD1_MASK) != 0;
event.isMeta = (aEvent->state & GDK_MOD4_MASK) != 0;
KeymapWrapper::InitInputEvent(event, aEvent->state);
event.time = aEvent->time;
@ -3250,7 +3227,11 @@ nsWindow::OnKeyPressEvent(GtkWidget *aWidget, GdkEventKey *aEvent)
nsMouseEvent contextMenuEvent(true, NS_CONTEXTMENU, this,
nsMouseEvent::eReal,
nsMouseEvent::eContextMenuKey);
key_event_to_context_menu_event(contextMenuEvent, aEvent);
contextMenuEvent.refPoint = nsIntPoint(0, 0);
contextMenuEvent.time = aEvent->time;
contextMenuEvent.clickCount = 1;
KeymapWrapper::InitInputEvent(contextMenuEvent, aEvent->state);
DispatchEvent(&contextMenuEvent, status);
}
else {
@ -3344,10 +3325,7 @@ nsWindow::OnScrollEvent(GtkWidget *aWidget, GdkEventScroll *aEvent)
event.refPoint = point - WidgetToScreenOffset();
}
event.isShift = (aEvent->state & GDK_SHIFT_MASK) != 0;
event.isControl = (aEvent->state & GDK_CONTROL_MASK) != 0;
event.isAlt = (aEvent->state & GDK_MOD1_MASK) != 0;
event.isMeta = (aEvent->state & GDK_MOD4_MASK) != 0;
KeymapWrapper::InitInputEvent(event, aEvent->state);
event.time = aEvent->time;
@ -6120,12 +6098,8 @@ void
nsWindow::InitDragEvent(nsDragEvent &aEvent)
{
// set the keyboard modifiers
GdkModifierType state = (GdkModifierType)0;
gdk_display_get_pointer(gdk_display_get_default(), NULL, NULL, NULL, &state);
aEvent.isShift = (state & GDK_SHIFT_MASK) ? true : false;
aEvent.isControl = (state & GDK_CONTROL_MASK) ? true : false;
aEvent.isAlt = (state & GDK_MOD1_MASK) ? true : false;
aEvent.isMeta = false; // GTK+ doesn't support the meta key
guint modifierState = KeymapWrapper::GetCurrentModifierState();
KeymapWrapper::InitInputEvent(aEvent, modifierState);
}
// This will update the drag action based on the information in the
@ -6309,19 +6283,6 @@ is_context_menu_key(const nsKeyEvent& aKeyEvent)
!aKeyEvent.isControl && !aKeyEvent.isMeta && !aKeyEvent.isAlt));
}
static void
key_event_to_context_menu_event(nsMouseEvent &aEvent,
GdkEventKey *aGdkEvent)
{
aEvent.refPoint = nsIntPoint(0, 0);
aEvent.isShift = false;
aEvent.isControl = false;
aEvent.isAlt = false;
aEvent.isMeta = false;
aEvent.time = aGdkEvent->time;
aEvent.clickCount = 1;
}
static int
is_parent_ungrab_enter(GdkEventCrossing *aEvent)
{