blob: 0504169372ece55638c55b02b1628b8d0bfeb5f2 (
plain)
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) 2012 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.
#ifndef UI_AURA_ROOT_WINDOW_HOST_X11_H_
#define UI_AURA_ROOT_WINDOW_HOST_X11_H_
#include <X11/Xlib.h>
#include <vector>
// Get rid of a macro from Xlib.h that conflicts with Aura's RootWindow class.
#undef RootWindow
#include "base/memory/scoped_ptr.h"
#include "base/message_loop/message_pump_dispatcher.h"
#include "ui/aura/aura_export.h"
#include "ui/aura/env_observer.h"
#include "ui/aura/window_tree_host.h"
#include "ui/base/x/x11_util.h"
#include "ui/events/event_source.h"
#include "ui/gfx/insets.h"
#include "ui/gfx/rect.h"
#include "ui/gfx/x/x11_atom_cache.h"
namespace ui {
class MouseEvent;
}
namespace aura {
namespace internal {
class TouchEventCalibrate;
}
class AURA_EXPORT WindowTreeHostX11 : public WindowTreeHost,
public base::MessagePumpDispatcher,
public ui::EventSource,
public EnvObserver {
public:
explicit WindowTreeHostX11(const gfx::Rect& bounds);
virtual ~WindowTreeHostX11();
// Overridden from Dispatcher overrides:
virtual bool Dispatch(const base::NativeEvent& event) OVERRIDE;
// WindowTreeHost Overrides.
virtual RootWindow* GetRootWindow() OVERRIDE;
virtual gfx::AcceleratedWidget GetAcceleratedWidget() OVERRIDE;
virtual void Show() OVERRIDE;
virtual void Hide() OVERRIDE;
virtual void ToggleFullScreen() OVERRIDE;
virtual gfx::Rect GetBounds() const OVERRIDE;
virtual void SetBounds(const gfx::Rect& bounds) OVERRIDE;
virtual gfx::Insets GetInsets() const OVERRIDE;
virtual void SetInsets(const gfx::Insets& insets) OVERRIDE;
virtual gfx::Point GetLocationOnNativeScreen() const OVERRIDE;
virtual void SetCapture() OVERRIDE;
virtual void ReleaseCapture() OVERRIDE;
virtual void SetCursor(gfx::NativeCursor cursor_type) OVERRIDE;
virtual bool QueryMouseLocation(gfx::Point* location_return) OVERRIDE;
virtual bool ConfineCursorToRootWindow() OVERRIDE;
virtual void UnConfineCursor() OVERRIDE;
virtual void OnCursorVisibilityChanged(bool show) OVERRIDE;
virtual void MoveCursorTo(const gfx::Point& location) OVERRIDE;
virtual void PostNativeEvent(const base::NativeEvent& event) OVERRIDE;
virtual void OnDeviceScaleFactorChanged(float device_scale_factor) OVERRIDE;
virtual void PrepareForShutdown() OVERRIDE;
// EnvObserver overrides.
virtual void OnWindowInitialized(Window* window) OVERRIDE;
virtual void OnRootWindowInitialized(RootWindow* root_window) OVERRIDE;
// ui::EventSource overrides.
virtual ui::EventProcessor* GetEventProcessor() OVERRIDE;
private:
class MouseMoveFilter;
bool DispatchEventForRootWindow(const base::NativeEvent& event);
// Dispatches XI2 events. Note that some events targetted for the X root
// window are dispatched to the aura root window (e.g. touch events after
// calibration).
void DispatchXI2Event(const base::NativeEvent& event);
// Returns true if there's an X window manager present... in most cases. Some
// window managers (notably, ion3) don't implement enough of ICCCM for us to
// detect that they're there.
bool IsWindowManagerPresent();
// Sets the cursor on |xwindow_| to |cursor|. Does not check or update
// |current_cursor_|.
void SetCursorInternal(gfx::NativeCursor cursor);
// Translates the native mouse location into screen coordinates and and
// dispatches the event to WindowTreeHostDelegate.
void TranslateAndDispatchMouseEvent(ui::MouseEvent* event);
// Update is_internal_display_ based on delegate_ state
void UpdateIsInternalDisplay();
// Set the CrOS touchpad "tap paused" property. It is used to temporarily
// turn off the Tap-to-click feature when the mouse pointer is invisible.
void SetCrOSTapPaused(bool state);
// The display and the native X window hosting the root window.
XDisplay* xdisplay_;
::Window xwindow_;
// The native root window.
::Window x_root_window_;
// Current Aura cursor.
gfx::NativeCursor current_cursor_;
// Is the window mapped to the screen?
bool window_mapped_;
// The bounds of |xwindow_|.
gfx::Rect bounds_;
// The insets that specifies the effective area within the |window_|.
gfx::Insets insets_;
// True if the root host resides on the internal display
bool is_internal_display_;
scoped_ptr<XID[]> pointer_barriers_;
scoped_ptr<internal::TouchEventCalibrate> touch_calibrate_;
scoped_ptr<MouseMoveFilter> mouse_move_filter_;
ui::X11AtomCache atom_cache_;
// Touch ids of which the touch press happens at side bezel region.
uint32 bezel_tracking_ids_;
DISALLOW_COPY_AND_ASSIGN(WindowTreeHostX11);
};
namespace test {
// Set the default value of the override redirect flag used to
// create a X window for WindowTreeHostX11.
AURA_EXPORT void SetUseOverrideRedirectWindowByDefault(bool override_redirect);
} // namespace test
} // namespace aura
#endif // UI_AURA_ROOT_WINDOW_HOST_X11_H_
|