Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(6)

Side by Side Diff: components/arc/input/arc_input_bridge.h

Issue 1596663002: arc-bridge: Introduce the ArcService class (Closed) Base URL: https://chromium.googlesource.com/a/chromium/src.git@master
Patch Set: Fixed Chrome OS build Created 4 years, 11 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
1 // Copyright 2015 The Chromium Authors. All rights reserved. 1 // Copyright 2015 The Chromium 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 #ifndef COMPONENTS_EXO_ARC_INPUT_ARC_INPUT_BRIDGE_H_ 5 #ifndef COMPONENTS_ARC_INPUT_ARC_INPUT_BRIDGE_H_
6 #define COMPONENTS_EXO_ARC_INPUT_ARC_INPUT_BRIDGE_H_ 6 #define COMPONENTS_ARC_INPUT_ARC_INPUT_BRIDGE_H_
7 7
8 #include <stdint.h>
9 #include <string>
10 #include <vector>
11
12 #include "base/files/scoped_file.h"
8 #include "base/macros.h" 13 #include "base/macros.h"
9 #include "components/arc/arc_bridge_service.h" 14 #include "components/arc/arc_bridge_service.h"
15 #include "components/arc/arc_service.h"
16 #include "ui/aura/env.h"
hidehiko 2016/01/18 01:26:45 nit: Looks unnecessary?
Luis Héctor Chávez 2016/01/19 17:43:54 Done.
17 #include "ui/aura/env_observer.h"
18 #include "ui/aura/window_tracker.h"
19 #include "ui/events/event.h"
20 #include "ui/events/event_handler.h"
21
22 namespace aura {
23 class Window;
hidehiko 2016/01/18 01:26:45 Can we include ui/aura/window.h directly, as we do
Luis Héctor Chávez 2016/01/19 17:43:54 To reduce compilation time, I'd prefer to remove u
24 }
25
26 namespace ui {
27 enum class DomCode;
28 }
10 29
11 namespace arc { 30 namespace arc {
12 31
13 class ArcBridgeService; 32 class ArcBridgeService;
14 33
15 // The ArcInputBridge is responsible for sending input events from ARC windows 34 // The ArcInputBridge is responsible for sending input events from ARC
16 // to the ARC instance. 35 // windows to the ARC instance.
17 // It hooks into aura::Env to watch for ExoSurface windows that are running ARC 36 // It hooks into aura::Env to watch for ExoSurface windows that are running ARC
18 // applications. On those windows the input bridge will attach an EventPreTarget 37 // applications. On those windows the input bridge will attach an EventPreTarget
19 // to capture all input events. 38 // to capture all input events.
20 // To send those events to the ARC instance it will create bridge input devices 39 // To send those events to the ARC instance it will create bridge input devices
21 // through the ArcBridgeService, which will provide a file descriptor to which 40 // through the ArcBridgeService, which will provide a file descriptor to which
22 // we can send linux input_event's. 41 // we can send linux input_event's.
23 // ui::Events to the ARC windows are translated to linux input_event's, which 42 // ui::Events to the ARC windows are translated to linux input_event's, which
24 // are then sent through the respective file descriptor. 43 // are then sent through the respective file descriptor.
25 class ArcInputBridge { 44 class ArcInputBridge : public ArcService,
45 public ArcBridgeService::Observer,
46 public aura::EnvObserver,
47 public ui::EventHandler {
26 public: 48 public:
27 virtual ~ArcInputBridge() {} 49 // The constructor will register an Observer with aura::Env and the
50 // ArcBridgeService. From then on, no further interaction with this class
51 // is needed.
52 explicit ArcInputBridge(ArcBridgeService* arc_bridge);
53 ~ArcInputBridge() override;
28 54
29 // Creates a new instance of ArcInputBridge. It will register an Observer 55 // Overridden from ui::EventHandler:
30 // with aura::Env and the ArcBridgeService. 56 void OnEvent(ui::Event* event) override;
31 static scoped_ptr<ArcInputBridge> Create(
32 ArcBridgeService* arc_bridge_service);
33 57
34 protected: 58 // Overridden from aura::EnvObserver:
35 ArcInputBridge() {} 59 void OnWindowInitialized(aura::Window* new_window) override;
60
61 // Overridden from ArcBridgeService::Observer:
62 void OnInputInstanceReady() override;
36 63
37 private: 64 private:
65 // Specialized method to translate and send events to the right file
66 // descriptor.
67 void SendKeyEvent(ui::KeyEvent* event);
68 void SendTouchEvent(ui::TouchEvent* event);
69 void SendMouseEvent(ui::MouseEvent* event);
70
71 // Helper method to send a struct input_event to the file descriptor. This
72 // method is to be called on the ui thread and will post a request to send
73 // the event to the io thread.
74 // The parameters map directly to the members of input_event as
75 // defined by the evdev protocol.
76 // |type| is the type of event to sent, such as EV_SYN, EV_KEY, EV_ABS.
77 // |code| is either interpreted as axis (ABS_X, ABS_Y, ...) or as key-code
78 // (KEY_A, KEY_B, ...).
79 // |value| is either the value of that axis or the boolean value of the key
80 // as in 0 (released), 1 (pressed) or 2 (repeated press).
81 void SendKernelEvent(const base::ScopedFD& fd,
82 base::TimeDelta timestamp,
83 uint16_t type,
84 uint16_t code,
85 int value);
86
87 // Shorthand for sending EV_SYN/SYN_REPORT
88 void SendSynReport(const base::ScopedFD& fd, base::TimeDelta timestamp);
89
90 // Return existing or new slot for this event.
91 int AcquireTouchSlot(ui::TouchEvent* event);
92
93 // Return touch slot for tracking id.
94 int FindTouchSlot(int tracking_id);
95
96 // Maps DOM key codes to evdev key codes
97 uint16_t DomCodeToEvdevCode(ui::DomCode dom_code);
98
99 // Setup bridge devices on the instance side. This needs to be called after
100 // the InstanceBootPhase::SYSTEM_SERVICES_READY has been reached.
101 void SetupBridgeDevices();
102
103 // Creates and registers file descriptor pair with the ARC bridge service,
104 // the write end is returned while the read end is sent through the bridge
105 // to the ARC instance.
106 // TODO(denniskempin): Make this interface more typesafe.
107 // |name| should be the displayable name of the emulated device (e.g. "Chrome
108 // OS Keyboard"), |device_type| the name of the device type (e.g. "keyboard")
109 // and |fd| a file descriptor that emulates the kernel events of the device.
110 // This can only be called on the thread that this class was created on.
111 base::ScopedFD CreateBridgeInputDevice(const std::string& name,
112 const std::string& device_type);
113
114 // Owned by ArcServiceManager which makes sure ArcBridgeService is destroyed
115 // after ArcInputBridge.
116 ArcBridgeService* const arc_bridge_service_;
117
118 // File descriptors for the different device types.
119 base::ScopedFD keyboard_fd_;
120 base::ScopedFD mouse_fd_;
121 base::ScopedFD touchscreen_fd_;
122
123 // Scroll accumlator.
124 float offset_x_acc_;
125 float offset_y_acc_;
126
127 // Currently selected slot for multi-touch events.
128 int current_slot_;
129
130 // List of touch tracking id to slot assignments.
131 std::vector<int> current_slot_tracking_ids_;
132
133 scoped_refptr<base::SequencedTaskRunner> origin_task_runner_;
134
135 // List of windows we are hooked into
136 aura::WindowTracker arc_windows_;
137
138 // WeakPtrFactory to use for callbacks.
139 base::WeakPtrFactory<ArcInputBridge> weak_factory_;
140
38 DISALLOW_COPY_AND_ASSIGN(ArcInputBridge); 141 DISALLOW_COPY_AND_ASSIGN(ArcInputBridge);
39 }; 142 };
40 143
41 } // namespace arc 144 } // namespace arc
42 145
43 #endif // COMPONENTS_EXO_ARC_INPUT_ARC_INPUT_BRIDGE_H_ 146 #endif // COMPONENTS_ARC_INPUT_ARC_INPUT_BRIDGE_H_
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698