Index: ppapi/native_client/tests/ppapi_simple_tests/event.cc |
=================================================================== |
--- ppapi/native_client/tests/ppapi_simple_tests/event.cc (revision 0) |
+++ ppapi/native_client/tests/ppapi_simple_tests/event.cc (revision 0) |
@@ -0,0 +1,250 @@ |
+// Copyright (c) 2011 The Native Client Authors. All rights reserved. |
+// Use of this source code is governed by a BSD-style license that can be |
+// found in the LICENSE file. |
+ |
+#include <stdint.h> |
+#include <stdlib.h> |
+ |
+#include <sstream> |
+#include <string> |
+#include <queue> |
+ |
+#include "ppapi/c/pp_input_event.h" |
+#include "ppapi/c/ppp_input_event.h" |
+#include "ppapi/cpp/instance.h" |
+#include "ppapi/cpp/module.h" |
+#include "ppapi/cpp/point.h" |
+#include "ppapi/cpp/var.h" |
+#include "ppapi/cpp/input_event.h" |
+ |
+ |
+using std::string; |
+using std::queue; |
+using std::ostringstream; |
+ |
+const int kDefaultEventBufferSize = 10; |
+ |
+namespace { |
+ |
+string ModifierToString(uint32_t modifier) { |
+ string s; |
+ if (modifier & PP_INPUTEVENT_MODIFIER_SHIFTKEY) { |
+ s += "shift "; |
+ } |
+ if (modifier & PP_INPUTEVENT_MODIFIER_CONTROLKEY) { |
+ s += "ctrl "; |
+ } |
+ if (modifier & PP_INPUTEVENT_MODIFIER_ALTKEY) { |
+ s += "alt "; |
+ } |
+ if (modifier & PP_INPUTEVENT_MODIFIER_METAKEY) { |
+ s += "meta "; |
+ } |
+ if (modifier & PP_INPUTEVENT_MODIFIER_ISKEYPAD) { |
+ s += "keypad "; |
+ } |
+ if (modifier & PP_INPUTEVENT_MODIFIER_ISAUTOREPEAT) { |
+ s += "autorepeat "; |
+ } |
+ if (modifier & PP_INPUTEVENT_MODIFIER_LEFTBUTTONDOWN) { |
+ s += "left-button-down "; |
+ } |
+ if (modifier & PP_INPUTEVENT_MODIFIER_MIDDLEBUTTONDOWN) { |
+ s += "middle-button-down "; |
+ } |
+ if (modifier & PP_INPUTEVENT_MODIFIER_RIGHTBUTTONDOWN) { |
+ s += "right-button-down "; |
+ } |
+ if (modifier & PP_INPUTEVENT_MODIFIER_CAPSLOCKKEY) { |
+ s += "caps-lock "; |
+ } |
+ if (modifier & PP_INPUTEVENT_MODIFIER_NUMLOCKKEY) { |
+ s += "num-lock "; |
+ } |
+ return s; |
+} |
+ |
+ |
+string MouseButtonToString(PP_InputEvent_MouseButton button) { |
+ switch (button) { |
+ case PP_INPUTEVENT_MOUSEBUTTON_NONE: |
+ return "None"; |
+ case PP_INPUTEVENT_MOUSEBUTTON_LEFT: |
+ return "Left"; |
+ case PP_INPUTEVENT_MOUSEBUTTON_MIDDLE: |
+ return "Middle"; |
+ case PP_INPUTEVENT_MOUSEBUTTON_RIGHT: |
+ return "Right"; |
+ default: |
+ ostringstream stream; |
+ stream << "Unrecognized (" << static_cast<int32_t>(button) << ")"; |
+ return stream.str(); |
+ } |
+} |
+ |
+ |
+string KeyEvent(const pp::KeyboardInputEvent& key_event, |
+ const string& kind) { |
+ ostringstream stream; |
+ stream << "Key event:" << kind |
+ << " modifier:" << ModifierToString(key_event.GetModifiers()) |
+ << " key_code:" << key_event.GetKeyCode() |
+ << " time:" << key_event.GetTimeStamp() |
+ << " text:" << key_event.GetCharacterText().DebugString() |
+ << "\n"; |
+ return stream.str(); |
+} |
+ |
+ |
+string MouseEvent(const pp::MouseInputEvent& mouse_event, |
+ const string& kind) { |
+ ostringstream stream; |
+ stream << "Mouse event:" << kind |
+ << " modifier:" << ModifierToString(mouse_event.GetModifiers()) |
+ << " button:" << MouseButtonToString(mouse_event.GetButton()) |
+ << " x:" << mouse_event.GetPosition().x() |
+ << " y:" << mouse_event.GetPosition().y() |
+ << " click_count:" << mouse_event.GetClickCount() |
+ << " time:" << mouse_event.GetTimeStamp() |
+ << "\n"; |
+ return stream.str(); |
+} |
+ |
+ |
+string WheelEvent(const pp::WheelInputEvent& wheel_event) { |
+ ostringstream stream; |
+ stream << "Wheel event." |
+ << " modifier:" << ModifierToString(wheel_event.GetModifiers()) |
+ << " deltax:" << wheel_event.GetDelta().x() |
+ << " deltay:" << wheel_event.GetDelta().y() |
+ << " wheel_ticks_x:" << wheel_event.GetTicks().x() |
+ << " wheel_ticks_y:" << wheel_event.GetTicks().y() |
+ << " scroll_by_page:" |
+ << (wheel_event.GetScrollByPage() ? "true" : "false") |
+ << "\n"; |
+ return stream.str(); |
+} |
+ |
+ |
+string EventToString(const pp::InputEvent& event) { |
+ ostringstream stream; |
+ switch (event.GetType()) { |
+ default: |
+ case PP_INPUTEVENT_TYPE_UNDEFINED: |
+ stream << "Unrecognized Event (" << static_cast<int32_t>(event.GetType()) |
+ << ")"; |
+ return stream.str(); |
+ |
+ case PP_INPUTEVENT_TYPE_MOUSEDOWN: |
+ return MouseEvent(pp::MouseInputEvent(event), "Down"); |
+ case PP_INPUTEVENT_TYPE_MOUSEUP: |
+ return MouseEvent(pp::MouseInputEvent(event), "Up"); |
+ case PP_INPUTEVENT_TYPE_MOUSEMOVE: |
+ return MouseEvent(pp::MouseInputEvent(event), "Move"); |
+ case PP_INPUTEVENT_TYPE_MOUSEENTER: |
+ return MouseEvent(pp::MouseInputEvent(event), "Enter"); |
+ case PP_INPUTEVENT_TYPE_MOUSELEAVE: |
+ return MouseEvent(pp::MouseInputEvent(event), "Leave"); |
+ |
+ case PP_INPUTEVENT_TYPE_WHEEL: |
+ return WheelEvent(pp::WheelInputEvent(event)); |
+ |
+ case PP_INPUTEVENT_TYPE_RAWKEYDOWN: |
+ return KeyEvent(pp::KeyboardInputEvent(event), "RawKeyDown"); |
+ case PP_INPUTEVENT_TYPE_KEYDOWN: |
+ return KeyEvent(pp::KeyboardInputEvent(event), "Down"); |
+ case PP_INPUTEVENT_TYPE_KEYUP: |
+ return KeyEvent(pp::KeyboardInputEvent(event), "Up"); |
+ case PP_INPUTEVENT_TYPE_CHAR: |
+ return KeyEvent(pp::KeyboardInputEvent(event), "Char"); |
+ } |
+} |
+ |
+void StringReplace(string* input, |
+ const string& find, |
+ const string& replace) { |
+ if (find.length() == 0 || input->length() == 0) { |
+ return; |
+ } |
+ |
+ size_t start_pos = 0; |
+ while (1) { |
+ start_pos = input->find(find, start_pos); |
+ if (start_pos == string::npos) { |
+ break; |
+ } |
+ input->replace(start_pos, find.length(), replace); |
+ start_pos += replace.length(); |
+ } |
+} |
+ |
+} // namespace |
+ |
+ |
+class MyInstance : public pp::Instance { |
+ private: |
+ size_t max_buffer_size_; |
+ queue<string> event_buffer_; |
+ |
+ void ParseArgs(uint32_t argc, const char* argn[], const char* argv[]) { |
+ for (uint32_t i = 0; i < argc; ++i) { |
+ const std::string tag = argn[i]; |
+ if (tag == "buffer_size") max_buffer_size_ = strtol(argv[i], 0, 0); |
+ // ignore other tags |
+ } |
+ } |
+ |
+ // Dump all the event via PostMessage for testing |
+ void FlushEventBuffer() { |
+ while (event_buffer_.size() > 0) { |
+ string s = event_buffer_.front(); |
+ event_buffer_.pop(); |
+ // Replace space with underscore to simplify testing |
+ StringReplace(&s, " ", "_"); |
+ pp::Var message(s); |
+ PostMessage(message); |
+ } |
+ } |
+ |
+ public: |
+ explicit MyInstance(PP_Instance instance) |
+ : pp::Instance(instance), max_buffer_size_(kDefaultEventBufferSize) { |
+ RequestInputEvents(PP_INPUTEVENT_CLASS_MOUSE | PP_INPUTEVENT_CLASS_WHEEL); |
+ RequestFilteringInputEvents(PP_INPUTEVENT_CLASS_KEYBOARD); |
+ } |
+ |
+ virtual ~MyInstance() {} |
+ |
+ virtual bool Init(uint32_t argc, const char* argn[], const char* argv[]) { |
+ ParseArgs(argc, argn, argv); |
+ return true; |
+ } |
+ |
+ virtual bool HandleInputEvent(const pp::InputEvent& event) { |
+ ostringstream stream; |
+ stream << pp_instance() << ": " << EventToString(event); |
+ event_buffer_.push(stream.str()); |
+ if (event_buffer_.size() >= max_buffer_size_) { |
+ FlushEventBuffer(); |
+ } |
+ return true; |
+ } |
+ |
+ virtual void DidChangeFocus(bool has_focus) { |
+ FlushEventBuffer(); |
+ } |
+}; |
+ |
+// standard boilerplate code below |
+class MyModule : public pp::Module { |
+ public: |
+ virtual pp::Instance* CreateInstance(PP_Instance instance) { |
+ return new MyInstance(instance); |
+ } |
+}; |
+ |
+namespace pp { |
+ Module* CreateModule() { |
+ return new MyModule(); |
+ } |
+} |