OLD | NEW |
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 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 #include "ui/aura/root_window_host_linux.h" | 5 #include "ui/aura/root_window_host_linux.h" |
6 | 6 |
7 #include <strings.h> | 7 #include <strings.h> |
8 #include <X11/cursorfont.h> | 8 #include <X11/cursorfont.h> |
9 #include <X11/extensions/Xfixes.h> | 9 #include <X11/extensions/Xfixes.h> |
10 #include <X11/extensions/XInput2.h> | 10 #include <X11/extensions/XInput2.h> |
(...skipping 75 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
86 | 86 |
87 // Receive resize events for the root-window so |x_root_bounds_| can be | 87 // Receive resize events for the root-window so |x_root_bounds_| can be |
88 // updated. | 88 // updated. |
89 XWindowAttributes attr; | 89 XWindowAttributes attr; |
90 XGetWindowAttributes(display, root_window, &attr); | 90 XGetWindowAttributes(display, root_window, &attr); |
91 if (!(attr.your_event_mask & StructureNotifyMask)) { | 91 if (!(attr.your_event_mask & StructureNotifyMask)) { |
92 XSelectInput(display, root_window, | 92 XSelectInput(display, root_window, |
93 StructureNotifyMask | attr.your_event_mask); | 93 StructureNotifyMask | attr.your_event_mask); |
94 } | 94 } |
95 | 95 |
96 XIEventMask evmask; | 96 if (!base::MessagePumpForUI::HasXInput2()) |
| 97 return; |
| 98 |
97 unsigned char mask[XIMaskLen(XI_LASTEVENT)] = {}; | 99 unsigned char mask[XIMaskLen(XI_LASTEVENT)] = {}; |
98 memset(mask, 0, sizeof(mask)); | 100 memset(mask, 0, sizeof(mask)); |
99 | 101 |
100 XISetMask(mask, XI_HierarchyChanged); | 102 XISetMask(mask, XI_HierarchyChanged); |
101 | |
102 XISetMask(mask, XI_KeyPress); | 103 XISetMask(mask, XI_KeyPress); |
103 XISetMask(mask, XI_KeyRelease); | 104 XISetMask(mask, XI_KeyRelease); |
104 | 105 |
| 106 XIEventMask evmask; |
| 107 evmask.deviceid = XIAllDevices; |
| 108 evmask.mask_len = sizeof(mask); |
| 109 evmask.mask = mask; |
| 110 XISelectEvents(display, root_window, &evmask, 1); |
| 111 |
| 112 // Selecting for touch events seems to fail on some cases (e.g. when logging |
| 113 // in incognito). So select for non-touch events first, and then select for |
| 114 // touch-events (but keep the other events in the mask, i.e. do not memset |
| 115 // |mask| back to 0). |
| 116 // TODO(sad): Figure out why this happens. http://crbug.com/153976 |
105 #if defined(USE_XI2_MT) | 117 #if defined(USE_XI2_MT) |
106 XISetMask(mask, XI_TouchBegin); | 118 XISetMask(mask, XI_TouchBegin); |
107 XISetMask(mask, XI_TouchUpdate); | 119 XISetMask(mask, XI_TouchUpdate); |
108 XISetMask(mask, XI_TouchEnd); | 120 XISetMask(mask, XI_TouchEnd); |
| 121 XISelectEvents(display, root_window, &evmask, 1); |
109 #endif | 122 #endif |
110 evmask.deviceid = XIAllDevices; | |
111 evmask.mask_len = sizeof(mask); | |
112 evmask.mask = mask; | |
113 | |
114 XISelectEvents(display, root_window, &evmask, 1); | |
115 } | 123 } |
116 | 124 |
117 // We emulate Windows' WM_KEYDOWN and WM_CHAR messages. WM_CHAR events are only | 125 // We emulate Windows' WM_KEYDOWN and WM_CHAR messages. WM_CHAR events are only |
118 // generated for certain keys; see | 126 // generated for certain keys; see |
119 // http://msdn.microsoft.com/en-us/library/windows/desktop/ms646268.aspx. Per | 127 // http://msdn.microsoft.com/en-us/library/windows/desktop/ms646268.aspx. Per |
120 // discussion on http://crbug.com/108480, char events should furthermore not be | 128 // discussion on http://crbug.com/108480, char events should furthermore not be |
121 // generated for Tab, Escape, and Backspace. | 129 // generated for Tab, Escape, and Backspace. |
122 bool ShouldSendCharEventForKeyboardCode(ui::KeyboardCode keycode) { | 130 bool ShouldSendCharEventForKeyboardCode(ui::KeyboardCode keycode) { |
123 if ((keycode >= ui::VKEY_0 && keycode <= ui::VKEY_9) || | 131 if ((keycode >= ui::VKEY_0 && keycode <= ui::VKEY_9) || |
124 (keycode >= ui::VKEY_A && keycode <= ui::VKEY_Z) || | 132 (keycode >= ui::VKEY_A && keycode <= ui::VKEY_Z) || |
(...skipping 779 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
904 return new RootWindowHostLinux(bounds); | 912 return new RootWindowHostLinux(bounds); |
905 } | 913 } |
906 | 914 |
907 // static | 915 // static |
908 gfx::Size RootWindowHost::GetNativeScreenSize() { | 916 gfx::Size RootWindowHost::GetNativeScreenSize() { |
909 ::Display* xdisplay = base::MessagePumpAuraX11::GetDefaultXDisplay(); | 917 ::Display* xdisplay = base::MessagePumpAuraX11::GetDefaultXDisplay(); |
910 return gfx::Size(DisplayWidth(xdisplay, 0), DisplayHeight(xdisplay, 0)); | 918 return gfx::Size(DisplayWidth(xdisplay, 0), DisplayHeight(xdisplay, 0)); |
911 } | 919 } |
912 | 920 |
913 } // namespace aura | 921 } // namespace aura |
OLD | NEW |