Index: ui/events/x/events_x_unittest.cc |
diff --git a/ui/events/x/events_x_unittest.cc b/ui/events/x/events_x_unittest.cc |
index d4fc3af76b43ac74ac83954fccdd9511583782ce..368682cbb1bd5fec0bb896ada960ac5c5ea5aa92 100644 |
--- a/ui/events/x/events_x_unittest.cc |
+++ b/ui/events/x/events_x_unittest.cc |
@@ -6,6 +6,8 @@ |
#include <X11/extensions/XInput2.h> |
#include <X11/Xlib.h> |
+#include <X11/Xutil.h> |
+#include <X11/XKBlib.h> |
// Generically-named #defines from Xlib that conflict with symbols in GTest. |
#undef Bool |
@@ -40,6 +42,23 @@ void InitButtonEvent(XEvent* event, |
button_event->state = state; |
} |
+// Initializes the passed-in Xlib event. |
+void InitKeyEvent(Display* display, |
+ XEvent* event, |
+ bool is_press, |
+ int keycode, |
+ int state) { |
+ memset(event, 0, sizeof(*event)); |
+ |
+ // We don't bother setting fields that the event code doesn't use, such as |
+ // x_root/y_root and window/root/subwindow. |
+ XKeyEvent* key_event = &(event->xkey); |
+ key_event->display = display; |
+ key_event->type = is_press ? KeyPress : KeyRelease; |
+ key_event->keycode = keycode; |
+ key_event->state = state; |
+} |
+ |
} // namespace |
TEST(EventsXTest, ButtonEvents) { |
@@ -238,4 +257,117 @@ TEST(EventsXTest, TouchEventBasic) { |
EXPECT_FLOAT_EQ(GetTouchForce(scoped_xevent), 0.5f); |
} |
#endif |
+ |
+TEST(EventsXTest, NumpadKeyEvents) { |
+ XEvent event; |
+ Display* display = gfx::GetXDisplay(); |
+ |
+ struct { |
+ bool is_numpad_key; |
+ int x_keysym; |
+ ui::KeyboardCode ui_keycode; |
+ } keys[] = { |
+ // XK_KP_Space and XK_KP_Equal are the extrema in the conventional |
+ // keysymdef.h numbering. |
+ { true, XK_KP_Space }, |
+ { true, XK_KP_Equal }, |
+ // Other numpad keysyms. (This is actually exhaustive in the current list.) |
+ { true, XK_KP_Tab }, |
+ { true, XK_KP_Enter }, |
+ { true, XK_KP_F1 }, |
+ { true, XK_KP_F2 }, |
+ { true, XK_KP_F3 }, |
+ { true, XK_KP_F4 }, |
+ { true, XK_KP_Home }, |
+ { true, XK_KP_Left }, |
+ { true, XK_KP_Up }, |
+ { true, XK_KP_Right }, |
+ { true, XK_KP_Down }, |
+ { true, XK_KP_Prior }, |
+ { true, XK_KP_Page_Up }, |
+ { true, XK_KP_Next }, |
+ { true, XK_KP_Page_Down }, |
+ { true, XK_KP_End }, |
+ { true, XK_KP_Begin }, |
+ { true, XK_KP_Insert }, |
+ { true, XK_KP_Delete }, |
+ { true, XK_KP_Multiply }, |
+ { true, XK_KP_Add }, |
+ { true, XK_KP_Separator }, |
+ { true, XK_KP_Subtract }, |
+ { true, XK_KP_Decimal }, |
+ { true, XK_KP_Divide }, |
+ { true, XK_KP_0 }, |
+ { true, XK_KP_1 }, |
+ { true, XK_KP_2 }, |
+ { true, XK_KP_3 }, |
+ { true, XK_KP_4 }, |
+ { true, XK_KP_5 }, |
+ { true, XK_KP_6 }, |
+ { true, XK_KP_7 }, |
+ { true, XK_KP_8 }, |
+ { true, XK_KP_9 }, |
+ // Largest keysym preceding XK_KP_Space. |
+ { false, XK_Num_Lock }, |
+ // Smallest keysym following XK_KP_Equal. |
+ { false, XK_F1 }, |
+ // Non-numpad analogues of numpad keysyms. |
+ { false, XK_Tab }, |
+ { false, XK_Return }, |
+ { false, XK_F1 }, |
+ { false, XK_F2 }, |
+ { false, XK_F3 }, |
+ { false, XK_F4 }, |
+ { false, XK_Home }, |
+ { false, XK_Left }, |
+ { false, XK_Up }, |
+ { false, XK_Right }, |
+ { false, XK_Down }, |
+ { false, XK_Prior }, |
+ { false, XK_Page_Up }, |
+ { false, XK_Next }, |
+ { false, XK_Page_Down }, |
+ { false, XK_End }, |
+ { false, XK_Insert }, |
+ { false, XK_Delete }, |
+ { false, XK_multiply }, |
+ { false, XK_plus }, |
+ { false, XK_minus }, |
+ { false, XK_period }, |
+ { false, XK_slash }, |
+ { false, XK_0 }, |
+ { false, XK_1 }, |
+ { false, XK_2 }, |
+ { false, XK_3 }, |
+ { false, XK_4 }, |
+ { false, XK_5 }, |
+ { false, XK_6 }, |
+ { false, XK_7 }, |
+ { false, XK_8 }, |
+ { false, XK_9 }, |
+ // Miscellaneous other keysyms. |
+ { false, XK_BackSpace }, |
+ { false, XK_Scroll_Lock }, |
+ { false, XK_Multi_key }, |
+ { false, XK_Select }, |
+ { false, XK_Num_Lock }, |
+ { false, XK_Shift_L }, |
+ { false, XK_space }, |
+ { false, XK_A }, |
+ }; |
+ |
+ for (size_t k = 0; k < ARRAYSIZE_UNSAFE(keys); ++k) { |
+ int x_keycode = XKeysymToKeycode(display, keys[k].x_keysym); |
+ // Exclude keysyms for which the server has no corresponding keycode. |
+ if (x_keycode) { |
+ InitKeyEvent(display, &event, true, x_keycode, 0); |
+ // int keysym = XLookupKeysym(&event.xkey, 0); |
+ // if (keysym) { |
+ ui::KeyEvent ui_key_event(&event, false); |
+ EXPECT_EQ(keys[k].is_numpad_key ? ui::EF_NUMPAD_KEY : 0, |
+ ui_key_event.flags() & ui::EF_NUMPAD_KEY); |
+ } |
+ } |
+} |
+ |
} // namespace ui |