| OLD | NEW |
| 1 // Copyright (c) 2011 The Native Client Authors. All rights reserved. | 1 // Copyright (c) 2011 The Native Client Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 // C headers | 5 // C headers |
| 6 #include <cassert> | 6 #include <cassert> |
| 7 #include <cstdio> | 7 #include <cstdio> |
| 8 | 8 |
| 9 // C++ headers | 9 // C++ headers |
| 10 #include <sstream> | 10 #include <sstream> |
| 11 #include <string> | 11 #include <string> |
| 12 | 12 |
| 13 // NaCl | 13 // NaCl |
| 14 #include "ppapi/c/pp_input_event.h" | 14 #include "native_client/src/third_party/ppapi/cpp/input_event.h" |
| 15 #include "ppapi/cpp/instance.h" | 15 #include "native_client/src/third_party/ppapi/cpp/instance.h" |
| 16 #include "ppapi/cpp/module.h" | 16 #include "native_client/src/third_party/ppapi/cpp/module.h" |
| 17 #include "ppapi/cpp/var.h" | 17 #include "native_client/src/third_party/ppapi/cpp/point.h" |
| 18 #include "native_client/src/third_party/ppapi/cpp/var.h" |
| 18 | 19 |
| 19 namespace { | 20 namespace { |
| 20 const char* const kEventsPropertyName = "events"; | 21 const char* const kEventsPropertyName = "events"; |
| 21 | 22 |
| 22 // Convert a given modifier to a descriptive string. Note that the actual | 23 // Convert a given modifier to a descriptive string. Note that the actual |
| 23 // declared type of modifier in each of the event structs (e.g., | 24 // declared type of modifier in each of the event classes is uint32_t, but it is |
| 24 // PP_InputEvent_Key.modifier) is uint32_t, but it is expected to be | 25 // expected to be interpreted as a bitfield of 'or'ed PP_InputEvent_Modifier |
| 25 // interpreted as a bitfield of 'or'ed PP_InputEvent_Modifier values. | 26 // values. |
| 26 std::string ModifierToString(uint32_t modifier) { | 27 std::string ModifierToString(uint32_t modifier) { |
| 27 std::string s; | 28 std::string s; |
| 28 if (modifier & PP_INPUTEVENT_MODIFIER_SHIFTKEY) { | 29 if (modifier & PP_INPUTEVENT_MODIFIER_SHIFTKEY) { |
| 29 s += "shift "; | 30 s += "shift "; |
| 30 } | 31 } |
| 31 if (modifier & PP_INPUTEVENT_MODIFIER_CONTROLKEY) { | 32 if (modifier & PP_INPUTEVENT_MODIFIER_CONTROLKEY) { |
| 32 s += "ctrl "; | 33 s += "ctrl "; |
| 33 } | 34 } |
| 34 if (modifier & PP_INPUTEVENT_MODIFIER_ALTKEY) { | 35 if (modifier & PP_INPUTEVENT_MODIFIER_ALTKEY) { |
| 35 s += "alt "; | 36 s += "alt "; |
| (...skipping 44 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 80 } | 81 } |
| 81 } | 82 } |
| 82 | 83 |
| 83 } // namespace | 84 } // namespace |
| 84 | 85 |
| 85 class EventInstance : public pp::Instance { | 86 class EventInstance : public pp::Instance { |
| 86 public: | 87 public: |
| 87 explicit EventInstance(PP_Instance instance) | 88 explicit EventInstance(PP_Instance instance) |
| 88 : pp::Instance(instance) { | 89 : pp::Instance(instance) { |
| 89 std::printf("EventInstance created.\n"); | 90 std::printf("EventInstance created.\n"); |
| 91 RequestInputEvents(PP_INPUTEVENT_CLASS_MOUSE | PP_INPUTEVENT_CLASS_WHEEL); |
| 92 RequestFilteringInputEvents(PP_INPUTEVENT_CLASS_KEYBOARD); |
| 90 } | 93 } |
| 91 virtual ~EventInstance() {} | 94 virtual ~EventInstance() {} |
| 92 | 95 |
| 93 void KeyEvent(PP_InputEvent_Key key, | 96 void GotKeyEvent(const pp::KeyboardInputEvent& key_event, |
| 94 PP_TimeTicks time, | 97 const std::string& kind) { |
| 95 const std::string& kind) { | |
| 96 std::ostringstream stream; | 98 std::ostringstream stream; |
| 97 stream << pp_instance() << ":" | 99 stream << pp_instance() << ":" |
| 98 << " Key event:" << kind.c_str() | 100 << " Key event:" << kind |
| 99 << " modifier:" << ModifierToString(key.modifier) | 101 << " modifier:" << ModifierToString(key_event.GetModifiers()) |
| 100 << " key_code:" << key.key_code | 102 << " key_code:" << key_event.GetKeyCode() |
| 101 << " time:" << time | 103 << " time:" << key_event.GetTimeStamp() |
| 104 << " text:" << key_event.GetCharacterText().DebugString() |
| 102 << "\n"; | 105 << "\n"; |
| 103 std::printf("%s", stream.str().c_str()); | 106 std::printf("%s", stream.str().c_str()); |
| 104 PostMessage(stream.str()); | 107 PostMessage(stream.str()); |
| 105 } | 108 } |
| 106 | 109 |
| 107 void MouseEvent(PP_InputEvent_Mouse mouse_event, | 110 void GotMouseEvent(const pp::MouseInputEvent& mouse_event, |
| 108 PP_TimeTicks time, | 111 const std::string& kind) { |
| 109 const std::string& kind) { | |
| 110 std::ostringstream stream; | 112 std::ostringstream stream; |
| 111 stream << pp_instance() << ":" | 113 stream << pp_instance() << ":" |
| 112 << " Mouse event:" << kind.c_str() | 114 << " Mouse event:" << kind |
| 113 << " modifier:" << ModifierToString(mouse_event.modifier).c_str() | 115 << " modifier:" << ModifierToString(mouse_event.GetModifiers()) |
| 114 << " button:" << MouseButtonToString(mouse_event.button).c_str() | 116 << " button:" << MouseButtonToString(mouse_event.GetMouseButton()) |
| 115 << " x:" << mouse_event.x | 117 << " x:" << mouse_event.GetMousePosition().x() |
| 116 << " y:" << mouse_event.y | 118 << " y:" << mouse_event.GetMousePosition().y() |
| 117 << " click_count:" << mouse_event.click_count | 119 << " click_count:" << mouse_event.GetMouseClickCount() |
| 118 << " time:" << time | 120 << " time:" << mouse_event.GetTimeStamp() |
| 119 << "\n"; | 121 << "\n"; |
| 120 std::printf("%s", stream.str().c_str()); | 122 std::printf("%s", stream.str().c_str()); |
| 121 PostMessage(stream.str()); | 123 PostMessage(stream.str()); |
| 122 } | 124 } |
| 123 | 125 |
| 124 void CharEvent(PP_InputEvent_Character char_event, PP_TimeTicks time) { | 126 void GotWheelEvent(const pp::WheelInputEvent& wheel_event) { |
| 125 std::ostringstream stream; | 127 std::ostringstream stream; |
| 126 stream << pp_instance() << ": Character event." | 128 stream << pp_instance() << ": Wheel event." |
| 127 << " modifier:" << ModifierToString(char_event.modifier).c_str() | 129 << " modifier:" << ModifierToString(wheel_event.GetModifiers()) |
| 128 << " text:" << char_event.text | 130 << " deltax:" << wheel_event.GetWheelDelta().x() |
| 129 << " time:" << time | 131 << " deltay:" << wheel_event.GetWheelDelta().y() |
| 132 << " wheel_ticks_x:" << wheel_event.GetWheelTicks().x() |
| 133 << " wheel_ticks_y:" << wheel_event.GetWheelTicks().y() |
| 134 << " scroll_by_page:" |
| 135 << (wheel_event.GetScrollByPage() ? "true" : "false") |
| 130 << "\n"; | 136 << "\n"; |
| 131 std::printf("%s", stream.str().c_str()); | 137 std::printf("%s", stream.str().c_str()); |
| 132 PostMessage(stream.str()); | 138 PostMessage(stream.str()); |
| 133 } | |
| 134 | |
| 135 void WheelEvent(PP_InputEvent_Wheel wheel_event, PP_TimeTicks time) { | |
| 136 std::ostringstream stream; | |
| 137 stream << pp_instance() << ": Wheel event." | |
| 138 << " modifier:" << ModifierToString(wheel_event.modifier).c_str() | |
| 139 << " deltax:" << wheel_event.delta_x | |
| 140 << " deltay:" << wheel_event.delta_y | |
| 141 << " wheel_ticks_x:" << wheel_event.wheel_ticks_x | |
| 142 << " wheel_ticks_y:" << wheel_event.wheel_ticks_y | |
| 143 << " scroll_by_page:" | |
| 144 << (wheel_event.scroll_by_page ? "true" : "false") | |
| 145 << "\n"; | |
| 146 std::printf("%s", stream.str().c_str()); | |
| 147 PostMessage(stream.str()); | |
| 148 } | 139 } |
| 149 | 140 |
| 150 // Handle an incoming input event by switching on type and dispatching | 141 // Handle an incoming input event by switching on type and dispatching |
| 151 // to the appropriate subtype handler. | 142 // to the appropriate subtype handler. |
| 152 virtual bool HandleInputEvent(const PP_InputEvent& event) { | 143 virtual bool HandleInputEvent(const pp::InputEvent& event) { |
| 153 std::printf("HandleInputEvent called\n"); | 144 std::printf("HandleInputEvent called\n"); |
| 154 switch (event.type) { | 145 switch (event.GetType()) { |
| 155 case PP_INPUTEVENT_TYPE_UNDEFINED: | 146 case PP_INPUTEVENT_TYPE_UNDEFINED: |
| 156 std::printf("Undefined event.\n"); | 147 std::printf("Undefined event.\n"); |
| 157 break; | 148 break; |
| 158 case PP_INPUTEVENT_TYPE_MOUSEDOWN: | 149 case PP_INPUTEVENT_TYPE_MOUSEDOWN: |
| 159 MouseEvent(event.u.mouse, event.time_stamp, "Down"); | 150 GotMouseEvent(pp::MouseInputEvent(event), "Down"); |
| 160 break; | 151 break; |
| 161 case PP_INPUTEVENT_TYPE_MOUSEUP: | 152 case PP_INPUTEVENT_TYPE_MOUSEUP: |
| 162 MouseEvent(event.u.mouse, event.time_stamp, "Up"); | 153 GotMouseEvent(pp::MouseInputEvent(event), "Up"); |
| 163 break; | 154 break; |
| 164 case PP_INPUTEVENT_TYPE_MOUSEMOVE: | 155 case PP_INPUTEVENT_TYPE_MOUSEMOVE: |
| 165 MouseEvent(event.u.mouse, event.time_stamp, "Move"); | 156 GotMouseEvent(pp::MouseInputEvent(event), "Move"); |
| 166 break; | 157 break; |
| 167 case PP_INPUTEVENT_TYPE_MOUSEENTER: | 158 case PP_INPUTEVENT_TYPE_MOUSEENTER: |
| 168 MouseEvent(event.u.mouse, event.time_stamp, "Enter"); | 159 GotMouseEvent(pp::MouseInputEvent(event), "Enter"); |
| 169 break; | 160 break; |
| 170 case PP_INPUTEVENT_TYPE_MOUSELEAVE: | 161 case PP_INPUTEVENT_TYPE_MOUSELEAVE: |
| 171 MouseEvent(event.u.mouse, event.time_stamp, "Leave"); | 162 GotMouseEvent(pp::MouseInputEvent(event), "Leave"); |
| 172 break; | 163 break; |
| 173 case PP_INPUTEVENT_TYPE_MOUSEWHEEL: | 164 case PP_INPUTEVENT_TYPE_MOUSEWHEEL: |
| 174 WheelEvent(event.u.wheel, event.time_stamp); | 165 GotWheelEvent(pp::WheelInputEvent(event)); |
| 175 break; | 166 break; |
| 176 case PP_INPUTEVENT_TYPE_RAWKEYDOWN: | 167 case PP_INPUTEVENT_TYPE_RAWKEYDOWN: |
| 177 KeyEvent(event.u.key, event.time_stamp, "RawKeyDown"); | 168 GotKeyEvent(pp::KeyboardInputEvent(event), "RawKeyDown"); |
| 178 break; | 169 break; |
| 179 case PP_INPUTEVENT_TYPE_KEYDOWN: | 170 case PP_INPUTEVENT_TYPE_KEYDOWN: |
| 180 KeyEvent(event.u.key, event.time_stamp, "Down"); | 171 GotKeyEvent(pp::KeyboardInputEvent(event), "Down"); |
| 181 break; | 172 break; |
| 182 case PP_INPUTEVENT_TYPE_KEYUP: | 173 case PP_INPUTEVENT_TYPE_KEYUP: |
| 183 KeyEvent(event.u.key, event.time_stamp, "Up"); | 174 GotKeyEvent(pp::KeyboardInputEvent(event), "Up"); |
| 184 break; | 175 break; |
| 185 case PP_INPUTEVENT_TYPE_CHAR: | 176 case PP_INPUTEVENT_TYPE_CHAR: |
| 186 CharEvent(event.u.character, event.time_stamp); | 177 GotKeyEvent(pp::KeyboardInputEvent(event), "Character"); |
| 187 break; | 178 break; |
| 188 default: | 179 default: |
| 189 std::printf("Unrecognized event type: %d\n", event.type); | 180 std::printf("Unrecognized event type: %d\n", event.GetType()); |
| 190 assert(false); | 181 assert(false); |
| 191 return false; | 182 return false; |
| 192 } | 183 } |
| 193 return true; | 184 return true; |
| 194 } | 185 } |
| 195 }; | 186 }; |
| 196 | 187 |
| 197 // The EventModule provides an implementation of pp::Module that creates | 188 // The EventModule provides an implementation of pp::Module that creates |
| 198 // EventInstance objects when invoked. This is part of the glue code that makes | 189 // EventInstance objects when invoked. This is part of the glue code that makes |
| 199 // our example accessible to ppapi. | 190 // our example accessible to ppapi. |
| (...skipping 10 matching lines...) Expand all Loading... |
| 210 | 201 |
| 211 // Implement the required pp::CreateModule function that creates our specific | 202 // Implement the required pp::CreateModule function that creates our specific |
| 212 // kind of Module (in this case, EventModule). This is part of the glue code | 203 // kind of Module (in this case, EventModule). This is part of the glue code |
| 213 // that makes our example accessible to ppapi. | 204 // that makes our example accessible to ppapi. |
| 214 namespace pp { | 205 namespace pp { |
| 215 Module* CreateModule() { | 206 Module* CreateModule() { |
| 216 std::printf("Creating EventModule.\n"); | 207 std::printf("Creating EventModule.\n"); |
| 217 return new EventModule(); | 208 return new EventModule(); |
| 218 } | 209 } |
| 219 } | 210 } |
| OLD | NEW |