1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152
|
// Copyright (c) 2015 The Chromium 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 <string>
#include "ppapi/cpp/input_event.h"
#include "ppapi/cpp/instance.h"
#include "ppapi/cpp/module.h"
#include "ppapi/cpp/var.h"
#include "ppapi/cpp/var_dictionary.h"
namespace remoting {
class KeyTesterInstance : public pp::Instance {
public:
explicit KeyTesterInstance(PP_Instance instance) : pp::Instance(instance) {
RequestInputEvents(PP_INPUTEVENT_CLASS_MOUSE | PP_INPUTEVENT_CLASS_WHEEL);
RequestFilteringInputEvents(PP_INPUTEVENT_CLASS_KEYBOARD);
}
virtual ~KeyTesterInstance() {}
bool HandleInputEvent(const pp::InputEvent& event) override {
switch (event.GetType()) {
case PP_INPUTEVENT_TYPE_KEYDOWN:
case PP_INPUTEVENT_TYPE_KEYUP:
case PP_INPUTEVENT_TYPE_CHAR: {
HandleKeyboardEvent(pp::KeyboardInputEvent(event));
break;
}
case PP_INPUTEVENT_TYPE_MOUSEDOWN:
case PP_INPUTEVENT_TYPE_MOUSEUP:
case PP_INPUTEVENT_TYPE_MOUSEMOVE:
case PP_INPUTEVENT_TYPE_MOUSEENTER:
case PP_INPUTEVENT_TYPE_MOUSELEAVE:
case PP_INPUTEVENT_TYPE_CONTEXTMENU: {
HandleMouseEvent(pp::MouseInputEvent(event));
break;
}
case PP_INPUTEVENT_TYPE_WHEEL: {
HandleWheelEvent(pp::WheelInputEvent(event));
break;
}
default:
break;
}
return true;
}
private:
void HandleKeyboardEvent(const pp::KeyboardInputEvent& event) {
pp::VarDictionary out;
out.Set("type", EventTypeToString(event.GetType()));
out.Set("modifiers", (double)event.GetModifiers());
out.Set("keyCode", (double)event.GetKeyCode());
out.Set("characterText", event.GetCharacterText());
out.Set("code", event.GetCode());
PostMessage(out);
}
void HandleMouseEvent(const pp::MouseInputEvent& event) {
pp::VarDictionary out;
out.Set("type", EventTypeToString(event.GetType()));
out.Set("button", (double)event.GetButton());
out.Set("position", PointToString(event.GetPosition()));
out.Set("clickCount", event.GetClickCount());
out.Set("movement", PointToString(event.GetMovement()));
PostMessage(out);
}
void HandleWheelEvent(const pp::WheelInputEvent& event) {
pp::VarDictionary out;
out.Set("type", EventTypeToString(event.GetType()));
out.Set("delta", PointToString(event.GetDelta()));
out.Set("ticks", PointToString(event.GetTicks()));
out.Set("scrollByPage", event.GetScrollByPage());
PostMessage(out);
}
template <typename T>
static std::string PointToString(const T& point) {
return std::to_string(point.x()) + ", " + std::to_string(point.y());
}
static std::string EventTypeToString(PP_InputEvent_Type t) {
switch (t) {
case PP_INPUTEVENT_TYPE_UNDEFINED:
return "UNDEFINED";
case PP_INPUTEVENT_TYPE_MOUSEDOWN:
return "MOUSEDOWN";
case PP_INPUTEVENT_TYPE_MOUSEUP:
return "MOUSEUP";
case PP_INPUTEVENT_TYPE_MOUSEMOVE:
return "MOUSEMOVE";
case PP_INPUTEVENT_TYPE_MOUSEENTER:
return "MOUSEENTER";
case PP_INPUTEVENT_TYPE_MOUSELEAVE:
return "MOUSELEAVE";
case PP_INPUTEVENT_TYPE_WHEEL:
return "WHEEL";
case PP_INPUTEVENT_TYPE_RAWKEYDOWN:
return "RAWKEYDOWN";
case PP_INPUTEVENT_TYPE_KEYDOWN:
return "KEYDOWN";
case PP_INPUTEVENT_TYPE_KEYUP:
return "KEYUP";
case PP_INPUTEVENT_TYPE_CHAR:
return "CHAR";
case PP_INPUTEVENT_TYPE_CONTEXTMENU:
return "CONTEXTMENU";
case PP_INPUTEVENT_TYPE_IME_COMPOSITION_START:
return "IME_COMPOSITION_START";
case PP_INPUTEVENT_TYPE_IME_COMPOSITION_UPDATE:
return "IME_COMPOSITION_UPDATE";
case PP_INPUTEVENT_TYPE_IME_COMPOSITION_END:
return "IME_COMPOSITION_END";
case PP_INPUTEVENT_TYPE_IME_TEXT:
return "IME_TEXT";
case PP_INPUTEVENT_TYPE_TOUCHSTART:
return "TOUCHSTART";
case PP_INPUTEVENT_TYPE_TOUCHMOVE:
return "TOUCHMOVE";
case PP_INPUTEVENT_TYPE_TOUCHEND:
return "TOUCHEND";
case PP_INPUTEVENT_TYPE_TOUCHCANCEL:
return "TOUCHCANCEL";
default:
return "[UNRECOGNIZED]";
}
}
};
class KeyTesterModule : public pp::Module {
public:
KeyTesterModule() : pp::Module() {}
virtual ~KeyTesterModule() {}
virtual pp::Instance* CreateInstance(PP_Instance instance) {
return new KeyTesterInstance(instance);
}
};
} // namespace remoting
namespace pp {
Module* CreateModule() {
return new remoting::KeyTesterModule();
}
} // namespace pp
|