Chromium Code Reviews| 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/views/widget/desktop_aura/desktop_window_tree_host_x11.h" | 5 #include "ui/views/widget/desktop_aura/desktop_window_tree_host_x11.h" |
| 6 | 6 |
| 7 #include <X11/extensions/shape.h> | 7 #include <X11/extensions/shape.h> |
| 8 #include <X11/extensions/XInput2.h> | 8 #include <X11/extensions/XInput2.h> |
| 9 #include <X11/Xatom.h> | 9 #include <X11/Xatom.h> |
| 10 #include <X11/Xregion.h> | 10 #include <X11/Xregion.h> |
| (...skipping 926 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 937 swa.override_redirect = True; | 937 swa.override_redirect = True; |
| 938 window_type = atom_cache_.GetAtom("_NET_WM_WINDOW_TYPE_DND"); | 938 window_type = atom_cache_.GetAtom("_NET_WM_WINDOW_TYPE_DND"); |
| 939 break; | 939 break; |
| 940 default: | 940 default: |
| 941 window_type = atom_cache_.GetAtom("_NET_WM_WINDOW_TYPE_NORMAL"); | 941 window_type = atom_cache_.GetAtom("_NET_WM_WINDOW_TYPE_NORMAL"); |
| 942 break; | 942 break; |
| 943 } | 943 } |
| 944 if (swa.override_redirect) | 944 if (swa.override_redirect) |
| 945 attribute_mask |= CWOverrideRedirect; | 945 attribute_mask |= CWOverrideRedirect; |
| 946 | 946 |
| 947 x_bounds_ = params.bounds; | |
| 947 bounds_ = params.bounds; | 948 bounds_ = params.bounds; |
| 948 xwindow_ = XCreateWindow( | 949 xwindow_ = XCreateWindow( |
| 949 xdisplay_, x_root_window_, | 950 xdisplay_, x_root_window_, |
| 950 bounds_.x(), bounds_.y(), | 951 bounds_.x(), bounds_.y(), |
| 951 bounds_.width(), bounds_.height(), | 952 bounds_.width(), bounds_.height(), |
| 952 0, // border width | 953 0, // border width |
| 953 CopyFromParent, // depth | 954 CopyFromParent, // depth |
| 954 InputOutput, | 955 InputOutput, |
| 955 CopyFromParent, // visual | 956 CopyFromParent, // visual |
| 956 attribute_mask, | 957 attribute_mask, |
| (...skipping 156 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1113 } | 1114 } |
| 1114 | 1115 |
| 1115 void DesktopWindowTreeHostX11::OnCaptureReleased() { | 1116 void DesktopWindowTreeHostX11::OnCaptureReleased() { |
| 1116 x11_capture_.reset(); | 1117 x11_capture_.reset(); |
| 1117 g_current_capture = NULL; | 1118 g_current_capture = NULL; |
| 1118 OnHostLostWindowCapture(); | 1119 OnHostLostWindowCapture(); |
| 1119 native_widget_delegate_->OnMouseCaptureLost(); | 1120 native_widget_delegate_->OnMouseCaptureLost(); |
| 1120 } | 1121 } |
| 1121 | 1122 |
| 1122 void DesktopWindowTreeHostX11::DispatchMouseEvent(ui::MouseEvent* event) { | 1123 void DesktopWindowTreeHostX11::DispatchMouseEvent(ui::MouseEvent* event) { |
| 1124 // The event location is relative to |x_bounds_|. However, Aura uses |bounds_| | |
| 1125 // for all computations, including converting to screen coordinates. Offset | |
| 1126 // the event location so that converting the event location to screen | |
| 1127 // coordinates returns the correct value. | |
| 1128 gfx::Vector2d event_offset(x_bounds_.origin() - bounds_.origin()); | |
| 1129 event->set_location(event->location() + event_offset); | |
| 1130 event->set_root_location(event->location() + event_offset); | |
| 1131 | |
|
sadrul
2014/03/13 15:41:31
This doesn't look right. Can you update DesktopWin
pkotwicz
2014/03/13 19:47:48
I think I understand what you are asking.
You are
| |
| 1123 if (!g_current_capture || g_current_capture == this) { | 1132 if (!g_current_capture || g_current_capture == this) { |
| 1124 SendEventToProcessor(event); | 1133 SendEventToProcessor(event); |
| 1125 } else { | 1134 } else { |
| 1126 // Another DesktopWindowTreeHostX11 has installed itself as | 1135 // Another DesktopWindowTreeHostX11 has installed itself as |
| 1127 // capture. Translate the event's location and dispatch to the other. | 1136 // capture. Translate the event's location and dispatch to the other. |
| 1128 event->ConvertLocationToTarget(window(), g_current_capture->window()); | 1137 event->ConvertLocationToTarget(window(), g_current_capture->window()); |
| 1129 g_current_capture->SendEventToProcessor(event); | 1138 g_current_capture->SendEventToProcessor(event); |
| 1130 } | 1139 } |
| 1131 } | 1140 } |
| 1132 | 1141 |
| (...skipping 192 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1325 DCHECK_EQ(xwindow_, xev->xconfigure.window); | 1334 DCHECK_EQ(xwindow_, xev->xconfigure.window); |
| 1326 DCHECK_EQ(xwindow_, xev->xconfigure.event); | 1335 DCHECK_EQ(xwindow_, xev->xconfigure.event); |
| 1327 // It's possible that the X window may be resized by some other means than | 1336 // It's possible that the X window may be resized by some other means than |
| 1328 // from within aura (e.g. the X window manager can change the size). Make | 1337 // from within aura (e.g. the X window manager can change the size). Make |
| 1329 // sure the root window size is maintained properly. | 1338 // sure the root window size is maintained properly. |
| 1330 int translated_x = xev->xconfigure.x; | 1339 int translated_x = xev->xconfigure.x; |
| 1331 int translated_y = xev->xconfigure.y; | 1340 int translated_y = xev->xconfigure.y; |
| 1332 if (!xev->xconfigure.send_event && !xev->xconfigure.override_redirect) { | 1341 if (!xev->xconfigure.send_event && !xev->xconfigure.override_redirect) { |
| 1333 Window unused; | 1342 Window unused; |
| 1334 XTranslateCoordinates(xdisplay_, xwindow_, x_root_window_, | 1343 XTranslateCoordinates(xdisplay_, xwindow_, x_root_window_, |
| 1335 0, 0, &translated_x, &translated_y, &unused); | 1344 0, 0, &translated_x, &translated_y, &unused); |
|
pkotwicz
2014/03/13 03:49:45
The event coordinates matched exactly those that I
sadrul
2014/03/13 15:41:31
I don't understand what you are asking. This is ha
pkotwicz
2014/03/13 19:47:48
Sorry for not being clear. I understand why XTrans
| |
| 1336 } | 1345 } |
| 1337 gfx::Rect bounds(translated_x, translated_y, | 1346 gfx::Rect bounds(translated_x, translated_y, |
| 1338 xev->xconfigure.width, xev->xconfigure.height); | 1347 xev->xconfigure.width, xev->xconfigure.height); |
| 1339 bool size_changed = bounds_.size() != bounds.size(); | 1348 bool size_changed = bounds_.size() != bounds.size(); |
| 1340 bool origin_changed = bounds_.origin() != bounds.origin(); | 1349 bool origin_changed = bounds_.origin() != bounds.origin(); |
| 1341 previous_bounds_ = bounds_; | 1350 previous_bounds_ = bounds_; |
| 1351 x_bounds_ = bounds; | |
| 1342 bounds_ = bounds; | 1352 bounds_ = bounds; |
| 1343 if (size_changed) | 1353 if (size_changed) |
| 1344 OnHostResized(bounds.size()); | 1354 OnHostResized(bounds.size()); |
| 1345 if (origin_changed) | 1355 if (origin_changed) |
| 1346 OnHostMoved(bounds_.origin()); | 1356 OnHostMoved(bounds_.origin()); |
| 1347 ResetWindowRegion(); | 1357 ResetWindowRegion(); |
| 1348 break; | 1358 break; |
| 1349 } | 1359 } |
| 1350 case GenericEvent: { | 1360 case GenericEvent: { |
| 1351 ui::TouchFactory* factory = ui::TouchFactory::GetInstance(); | 1361 ui::TouchFactory* factory = ui::TouchFactory::GetInstance(); |
| (...skipping 212 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1564 if (linux_ui) { | 1574 if (linux_ui) { |
| 1565 ui::NativeTheme* native_theme = linux_ui->GetNativeTheme(); | 1575 ui::NativeTheme* native_theme = linux_ui->GetNativeTheme(); |
| 1566 if (native_theme) | 1576 if (native_theme) |
| 1567 return native_theme; | 1577 return native_theme; |
| 1568 } | 1578 } |
| 1569 | 1579 |
| 1570 return ui::NativeTheme::instance(); | 1580 return ui::NativeTheme::instance(); |
| 1571 } | 1581 } |
| 1572 | 1582 |
| 1573 } // namespace views | 1583 } // namespace views |
| OLD | NEW |