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 14 matching lines...) Expand all Loading... | |
| 25 #include "ui/base/hit_test.h" | 25 #include "ui/base/hit_test.h" |
| 26 #include "ui/base/x/x11_util.h" | 26 #include "ui/base/x/x11_util.h" |
| 27 #include "ui/events/devices/x11/device_data_manager_x11.h" | 27 #include "ui/events/devices/x11/device_data_manager_x11.h" |
| 28 #include "ui/events/devices/x11/device_list_cache_x11.h" | 28 #include "ui/events/devices/x11/device_list_cache_x11.h" |
| 29 #include "ui/events/devices/x11/touch_factory_x11.h" | 29 #include "ui/events/devices/x11/touch_factory_x11.h" |
| 30 #include "ui/events/event_utils.h" | 30 #include "ui/events/event_utils.h" |
| 31 #include "ui/events/platform/platform_event_source.h" | 31 #include "ui/events/platform/platform_event_source.h" |
| 32 #include "ui/events/platform/x11/x11_event_source.h" | 32 #include "ui/events/platform/x11/x11_event_source.h" |
| 33 #include "ui/gfx/display.h" | 33 #include "ui/gfx/display.h" |
| 34 #include "ui/gfx/geometry/insets.h" | 34 #include "ui/gfx/geometry/insets.h" |
| 35 #include "ui/gfx/geometry/size_conversions.h" | |
| 35 #include "ui/gfx/image/image_skia.h" | 36 #include "ui/gfx/image/image_skia.h" |
| 36 #include "ui/gfx/image/image_skia_rep.h" | 37 #include "ui/gfx/image/image_skia_rep.h" |
| 37 #include "ui/gfx/path.h" | 38 #include "ui/gfx/path.h" |
| 38 #include "ui/gfx/path_x11.h" | 39 #include "ui/gfx/path_x11.h" |
| 39 #include "ui/gfx/screen.h" | 40 #include "ui/gfx/screen.h" |
| 40 #include "ui/native_theme/native_theme.h" | 41 #include "ui/native_theme/native_theme.h" |
| 41 #include "ui/views/corewm/tooltip_aura.h" | 42 #include "ui/views/corewm/tooltip_aura.h" |
| 42 #include "ui/views/ime/input_method.h" | 43 #include "ui/views/ime/input_method.h" |
| 43 #include "ui/views/linux_ui/linux_ui.h" | 44 #include "ui/views/linux_ui/linux_ui.h" |
| 44 #include "ui/views/views_delegate.h" | 45 #include "ui/views/views_delegate.h" |
| (...skipping 138 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 183 std::vector<aura::Window*> DesktopWindowTreeHostX11::GetAllOpenWindows() { | 184 std::vector<aura::Window*> DesktopWindowTreeHostX11::GetAllOpenWindows() { |
| 184 std::vector<aura::Window*> windows(open_windows().size()); | 185 std::vector<aura::Window*> windows(open_windows().size()); |
| 185 std::transform(open_windows().begin(), | 186 std::transform(open_windows().begin(), |
| 186 open_windows().end(), | 187 open_windows().end(), |
| 187 windows.begin(), | 188 windows.begin(), |
| 188 GetContentWindowForXID); | 189 GetContentWindowForXID); |
| 189 return windows; | 190 return windows; |
| 190 } | 191 } |
| 191 | 192 |
| 192 gfx::Rect DesktopWindowTreeHostX11::GetX11RootWindowBounds() const { | 193 gfx::Rect DesktopWindowTreeHostX11::GetX11RootWindowBounds() const { |
| 193 return bounds_; | 194 return bounds_in_pixels_; |
| 194 } | 195 } |
| 195 | 196 |
| 196 gfx::Rect DesktopWindowTreeHostX11::GetX11RootWindowOuterBounds() const { | 197 gfx::Rect DesktopWindowTreeHostX11::GetX11RootWindowOuterBounds() const { |
| 197 gfx::Rect outer_bounds(bounds_); | 198 gfx::Rect outer_bounds(bounds_in_pixels_); |
| 198 outer_bounds.Inset(-native_window_frame_borders_); | 199 outer_bounds.Inset(-native_window_frame_borders_); |
| 199 return outer_bounds; | 200 return outer_bounds; |
| 200 } | 201 } |
| 201 | 202 |
| 202 ::Region DesktopWindowTreeHostX11::GetWindowShape() const { | 203 ::Region DesktopWindowTreeHostX11::GetWindowShape() const { |
| 203 return window_shape_; | 204 return window_shape_; |
| 204 } | 205 } |
| 205 | 206 |
| 206 void DesktopWindowTreeHostX11::HandleNativeWidgetActivationChanged( | 207 void DesktopWindowTreeHostX11::HandleNativeWidgetActivationChanged( |
| 207 bool active) { | 208 bool active) { |
| (...skipping 167 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 375 Activate(); | 376 Activate(); |
| 376 } | 377 } |
| 377 | 378 |
| 378 native_widget_delegate_->AsWidget()->SetInitialFocus(show_state); | 379 native_widget_delegate_->AsWidget()->SetInitialFocus(show_state); |
| 379 } | 380 } |
| 380 | 381 |
| 381 void DesktopWindowTreeHostX11::ShowMaximizedWithBounds( | 382 void DesktopWindowTreeHostX11::ShowMaximizedWithBounds( |
| 382 const gfx::Rect& restored_bounds) { | 383 const gfx::Rect& restored_bounds) { |
| 383 ShowWindowWithState(ui::SHOW_STATE_MAXIMIZED); | 384 ShowWindowWithState(ui::SHOW_STATE_MAXIMIZED); |
| 384 // Enforce |restored_bounds_| since calling Maximize() could have reset it. | 385 // Enforce |restored_bounds_| since calling Maximize() could have reset it. |
| 385 restored_bounds_ = restored_bounds; | 386 restored_bounds_ = ToPixelRect(restored_bounds); |
| 386 } | 387 } |
| 387 | 388 |
| 388 bool DesktopWindowTreeHostX11::IsVisible() const { | 389 bool DesktopWindowTreeHostX11::IsVisible() const { |
| 389 return window_mapped_; | 390 return window_mapped_; |
| 390 } | 391 } |
| 391 | 392 |
| 392 void DesktopWindowTreeHostX11::SetSize(const gfx::Size& requested_size) { | 393 void DesktopWindowTreeHostX11::SetSize(const gfx::Size& requested_size) { |
| 393 gfx::Size size = AdjustSize(requested_size); | 394 gfx::Size size_in_pixels = ToPixelRect(gfx::Rect(requested_size)).size(); |
| 394 bool size_changed = bounds_.size() != size; | 395 size_in_pixels = AdjustSize(size_in_pixels); |
| 395 XResizeWindow(xdisplay_, xwindow_, size.width(), size.height()); | 396 bool size_changed = bounds_in_pixels_.size() != size_in_pixels; |
| 396 bounds_.set_size(size); | 397 XResizeWindow(xdisplay_, xwindow_, size_in_pixels.width(), |
| 398 size_in_pixels.height()); | |
| 399 bounds_in_pixels_.set_size(size_in_pixels); | |
| 397 if (size_changed) { | 400 if (size_changed) { |
| 398 OnHostResized(size); | 401 OnHostResized(size_in_pixels); |
| 399 ResetWindowRegion(); | 402 ResetWindowRegion(); |
| 400 } | 403 } |
| 401 } | 404 } |
| 402 | 405 |
| 403 void DesktopWindowTreeHostX11::StackAtTop() { | 406 void DesktopWindowTreeHostX11::StackAtTop() { |
| 404 XRaiseWindow(xdisplay_, xwindow_); | 407 XRaiseWindow(xdisplay_, xwindow_); |
| 405 } | 408 } |
| 406 | 409 |
| 407 void DesktopWindowTreeHostX11::CenterWindow(const gfx::Size& size) { | 410 void DesktopWindowTreeHostX11::CenterWindow(const gfx::Size& size) { |
| 408 gfx::Rect parent_bounds = GetWorkAreaBoundsInScreen(); | 411 gfx::Size size_in_pixels = ToPixelRect(gfx::Rect(size)).size(); |
| 412 gfx::Rect parent_bounds_in_pixels = GetWorkAreaBoundsInPixels(); | |
| 409 | 413 |
| 410 // If |window_|'s transient parent bounds are big enough to contain |size|, | 414 // If |window_|'s transient parent bounds are big enough to contain |
| 411 // use them instead. | 415 // |size_in_pixels|, use them instead. |
| 412 if (wm::GetTransientParent(content_window_)) { | 416 if (wm::GetTransientParent(content_window_)) { |
| 413 gfx::Rect transient_parent_rect = | 417 gfx::Rect transient_parent_rect = |
| 414 wm::GetTransientParent(content_window_)->GetBoundsInScreen(); | 418 wm::GetTransientParent(content_window_)->GetBoundsInScreen(); |
| 415 if (transient_parent_rect.height() >= size.height() && | 419 if (transient_parent_rect.height() >= size_in_pixels.height() && |
| 416 transient_parent_rect.width() >= size.width()) { | 420 transient_parent_rect.width() >= size_in_pixels.width()) { |
| 417 parent_bounds = transient_parent_rect; | 421 parent_bounds_in_pixels = ToPixelRect(transient_parent_rect); |
| 418 } | 422 } |
| 419 } | 423 } |
| 420 | 424 |
| 421 gfx::Rect window_bounds( | 425 gfx::Rect window_bounds( |
| 422 parent_bounds.x() + (parent_bounds.width() - size.width()) / 2, | 426 parent_bounds_in_pixels.x() + |
| 423 parent_bounds.y() + (parent_bounds.height() - size.height()) / 2, | 427 (parent_bounds_in_pixels.width() - size_in_pixels.width()) / 2, |
| 424 size.width(), | 428 parent_bounds_in_pixels.y() + |
| 425 size.height()); | 429 (parent_bounds_in_pixels.height() - size_in_pixels.height()) / 2, |
| 430 size_in_pixels.width(), size_in_pixels.height()); | |
| 426 // Don't size the window bigger than the parent, otherwise the user may not be | 431 // Don't size the window bigger than the parent, otherwise the user may not be |
| 427 // able to close or move it. | 432 // able to close or move it. |
| 428 window_bounds.AdjustToFit(parent_bounds); | 433 window_bounds.AdjustToFit(parent_bounds_in_pixels); |
| 429 | 434 |
| 430 SetBounds(window_bounds); | 435 SetBounds(window_bounds); |
| 431 } | 436 } |
| 432 | 437 |
| 433 void DesktopWindowTreeHostX11::GetWindowPlacement( | 438 void DesktopWindowTreeHostX11::GetWindowPlacement( |
| 434 gfx::Rect* bounds, | 439 gfx::Rect* bounds, |
| 435 ui::WindowShowState* show_state) const { | 440 ui::WindowShowState* show_state) const { |
| 436 *bounds = GetRestoredBounds(); | 441 *bounds = GetRestoredBounds(); |
| 437 | 442 |
| 438 if (IsFullscreen()) { | 443 if (IsFullscreen()) { |
| 439 *show_state = ui::SHOW_STATE_FULLSCREEN; | 444 *show_state = ui::SHOW_STATE_FULLSCREEN; |
| 440 } else if (IsMinimized()) { | 445 } else if (IsMinimized()) { |
| 441 *show_state = ui::SHOW_STATE_MINIMIZED; | 446 *show_state = ui::SHOW_STATE_MINIMIZED; |
| 442 } else if (IsMaximized()) { | 447 } else if (IsMaximized()) { |
| 443 *show_state = ui::SHOW_STATE_MAXIMIZED; | 448 *show_state = ui::SHOW_STATE_MAXIMIZED; |
| 444 } else if (!IsActive()) { | 449 } else if (!IsActive()) { |
| 445 *show_state = ui::SHOW_STATE_INACTIVE; | 450 *show_state = ui::SHOW_STATE_INACTIVE; |
| 446 } else { | 451 } else { |
| 447 *show_state = ui::SHOW_STATE_NORMAL; | 452 *show_state = ui::SHOW_STATE_NORMAL; |
| 448 } | 453 } |
| 449 } | 454 } |
| 450 | 455 |
| 451 gfx::Rect DesktopWindowTreeHostX11::GetWindowBoundsInScreen() const { | 456 gfx::Rect DesktopWindowTreeHostX11::GetWindowBoundsInScreen() const { |
| 452 return bounds_; | 457 return ToDIPRect(bounds_in_pixels_); |
| 453 } | 458 } |
| 454 | 459 |
| 455 gfx::Rect DesktopWindowTreeHostX11::GetClientAreaBoundsInScreen() const { | 460 gfx::Rect DesktopWindowTreeHostX11::GetClientAreaBoundsInScreen() const { |
| 456 // TODO(erg): The NativeWidgetAura version returns |bounds_|, claiming its | 461 // TODO(erg): The NativeWidgetAura version returns |bounds_in_pixels_|, |
| 457 // needed for View::ConvertPointToScreen() to work | 462 // claiming it's needed for View::ConvertPointToScreen() to work correctly. |
| 458 // correctly. DesktopWindowTreeHostWin::GetClientAreaBoundsInScreen() just | 463 // DesktopWindowTreeHostWin::GetClientAreaBoundsInScreen() just asks windows |
| 459 // asks windows what it thinks the client rect is. | 464 // what it thinks the client rect is. |
| 460 // | 465 // |
| 461 // Attempts to calculate the rect by asking the NonClientFrameView what it | 466 // Attempts to calculate the rect by asking the NonClientFrameView what it |
| 462 // thought its GetBoundsForClientView() were broke combobox drop down | 467 // thought its GetBoundsForClientView() were broke combobox drop down |
| 463 // placement. | 468 // placement. |
| 464 return bounds_; | 469 return GetWindowBoundsInScreen(); |
| 465 } | 470 } |
| 466 | 471 |
| 467 gfx::Rect DesktopWindowTreeHostX11::GetRestoredBounds() const { | 472 gfx::Rect DesktopWindowTreeHostX11::GetRestoredBounds() const { |
| 468 // We can't reliably track the restored bounds of a window, but we can get | 473 // We can't reliably track the restored bounds of a window, but we can get |
| 469 // the 90% case down. When *chrome* is the process that requests maximizing | 474 // the 90% case down. When *chrome* is the process that requests maximizing |
| 470 // or restoring bounds, we can record the current bounds before we request | 475 // or restoring bounds, we can record the current bounds before we request |
| 471 // maximization, and clear it when we detect a state change. | 476 // maximization, and clear it when we detect a state change. |
| 472 if (!restored_bounds_.IsEmpty()) | 477 if (!restored_bounds_.IsEmpty()) |
| 473 return restored_bounds_; | 478 return ToDIPRect(restored_bounds_); |
| 474 | 479 |
| 475 return GetWindowBoundsInScreen(); | 480 return GetWindowBoundsInScreen(); |
| 476 } | 481 } |
| 477 | 482 |
| 478 gfx::Rect DesktopWindowTreeHostX11::GetWorkAreaBoundsInScreen() const { | 483 gfx::Rect DesktopWindowTreeHostX11::GetWorkAreaBoundsInScreen() const { |
| 479 std::vector<int> value; | 484 return ToDIPRect(GetWorkAreaBoundsInPixels()); |
| 480 if (ui::GetIntArrayProperty(x_root_window_, "_NET_WORKAREA", &value) && | |
| 481 value.size() >= 4) { | |
| 482 return gfx::Rect(value[0], value[1], value[2], value[3]); | |
| 483 } | |
| 484 | |
| 485 // Fetch the geometry of the root window. | |
| 486 Window root; | |
| 487 int x, y; | |
| 488 unsigned int width, height; | |
| 489 unsigned int border_width, depth; | |
| 490 if (!XGetGeometry(xdisplay_, x_root_window_, &root, &x, &y, | |
| 491 &width, &height, &border_width, &depth)) { | |
| 492 NOTIMPLEMENTED(); | |
| 493 return gfx::Rect(0, 0, 10, 10); | |
| 494 } | |
| 495 | |
| 496 return gfx::Rect(x, y, width, height); | |
| 497 } | 485 } |
| 498 | 486 |
| 499 void DesktopWindowTreeHostX11::SetShape(gfx::NativeRegion native_region) { | 487 void DesktopWindowTreeHostX11::SetShape(gfx::NativeRegion native_region) { |
| 500 if (window_shape_) | 488 if (window_shape_) |
| 501 XDestroyRegion(window_shape_); | 489 XDestroyRegion(window_shape_); |
| 502 custom_window_shape_ = false; | 490 custom_window_shape_ = false; |
| 503 window_shape_ = NULL; | 491 window_shape_ = NULL; |
| 504 | 492 |
| 505 if (native_region) { | 493 if (native_region) { |
| 506 custom_window_shape_ = true; | 494 custom_window_shape_ = true; |
| (...skipping 25 matching lines...) Expand all Loading... | |
| 532 void DesktopWindowTreeHostX11::Maximize() { | 520 void DesktopWindowTreeHostX11::Maximize() { |
| 533 if (HasWMSpecProperty("_NET_WM_STATE_FULLSCREEN")) { | 521 if (HasWMSpecProperty("_NET_WM_STATE_FULLSCREEN")) { |
| 534 // Unfullscreen the window if it is fullscreen. | 522 // Unfullscreen the window if it is fullscreen. |
| 535 SetWMSpecState(false, | 523 SetWMSpecState(false, |
| 536 atom_cache_.GetAtom("_NET_WM_STATE_FULLSCREEN"), | 524 atom_cache_.GetAtom("_NET_WM_STATE_FULLSCREEN"), |
| 537 None); | 525 None); |
| 538 | 526 |
| 539 // Resize the window so that it does not have the same size as a monitor. | 527 // Resize the window so that it does not have the same size as a monitor. |
| 540 // (Otherwise, some window managers immediately put the window back in | 528 // (Otherwise, some window managers immediately put the window back in |
| 541 // fullscreen mode). | 529 // fullscreen mode). |
| 542 gfx::Rect adjusted_bounds(bounds_.origin(), AdjustSize(bounds_.size())); | 530 gfx::Rect adjusted_bounds(bounds_in_pixels_.origin(), |
| 543 if (adjusted_bounds != bounds_) | 531 AdjustSize(bounds_in_pixels_.size())); |
| 532 if (adjusted_bounds != bounds_in_pixels_) | |
| 544 SetBounds(adjusted_bounds); | 533 SetBounds(adjusted_bounds); |
| 545 } | 534 } |
| 546 | 535 |
| 547 // Some WMs do not respect maximization hints on unmapped windows, so we | 536 // Some WMs do not respect maximization hints on unmapped windows, so we |
| 548 // save this one for later too. | 537 // save this one for later too. |
| 549 should_maximize_after_map_ = !window_mapped_; | 538 should_maximize_after_map_ = !window_mapped_; |
| 550 | 539 |
| 551 // When we are in the process of requesting to maximize a window, we can | 540 // When we are in the process of requesting to maximize a window, we can |
| 552 // accurately keep track of our restored bounds instead of relying on the | 541 // accurately keep track of our restored bounds instead of relying on the |
| 553 // heuristics that are in the PropertyNotify and ConfigureNotify handlers. | 542 // heuristics that are in the PropertyNotify and ConfigureNotify handlers. |
| 554 restored_bounds_ = bounds_; | 543 restored_bounds_ = bounds_in_pixels_; |
| 555 | 544 |
| 556 SetWMSpecState(true, | 545 SetWMSpecState(true, |
| 557 atom_cache_.GetAtom("_NET_WM_STATE_MAXIMIZED_VERT"), | 546 atom_cache_.GetAtom("_NET_WM_STATE_MAXIMIZED_VERT"), |
| 558 atom_cache_.GetAtom("_NET_WM_STATE_MAXIMIZED_HORZ")); | 547 atom_cache_.GetAtom("_NET_WM_STATE_MAXIMIZED_HORZ")); |
| 559 if (IsMinimized()) | 548 if (IsMinimized()) |
| 560 ShowWindowWithState(ui::SHOW_STATE_NORMAL); | 549 ShowWindowWithState(ui::SHOW_STATE_NORMAL); |
| 561 } | 550 } |
| 562 | 551 |
| 563 void DesktopWindowTreeHostX11::Minimize() { | 552 void DesktopWindowTreeHostX11::Minimize() { |
| 564 ReleaseCapture(); | 553 ReleaseCapture(); |
| (...skipping 165 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 730 None); | 719 None); |
| 731 if (unmaximize_and_remaximize) | 720 if (unmaximize_and_remaximize) |
| 732 Maximize(); | 721 Maximize(); |
| 733 | 722 |
| 734 // Try to guess the size we will have after the switch to/from fullscreen: | 723 // Try to guess the size we will have after the switch to/from fullscreen: |
| 735 // - (may) avoid transient states | 724 // - (may) avoid transient states |
| 736 // - works around Flash content which expects to have the size updated | 725 // - works around Flash content which expects to have the size updated |
| 737 // synchronously. | 726 // synchronously. |
| 738 // See https://crbug.com/361408 | 727 // See https://crbug.com/361408 |
| 739 if (fullscreen) { | 728 if (fullscreen) { |
| 740 restored_bounds_ = bounds_; | 729 restored_bounds_ = bounds_in_pixels_; |
| 741 const gfx::Display display = | 730 const gfx::Display display = |
| 742 gfx::Screen::GetScreenFor(NULL)->GetDisplayNearestWindow(window()); | 731 gfx::Screen::GetScreenFor(NULL)->GetDisplayNearestWindow(window()); |
| 743 bounds_ = display.bounds(); | 732 bounds_in_pixels_ = ToPixelRect(display.bounds()); |
| 744 } else { | 733 } else { |
| 745 bounds_ = restored_bounds_; | 734 bounds_in_pixels_ = restored_bounds_; |
| 746 } | 735 } |
| 747 OnHostMoved(bounds_.origin()); | 736 OnHostMoved(bounds_in_pixels_.origin()); |
| 748 OnHostResized(bounds_.size()); | 737 OnHostResized(bounds_in_pixels_.size()); |
| 749 | 738 |
| 750 if (HasWMSpecProperty("_NET_WM_STATE_FULLSCREEN") == fullscreen) { | 739 if (HasWMSpecProperty("_NET_WM_STATE_FULLSCREEN") == fullscreen) { |
| 751 Relayout(); | 740 Relayout(); |
| 752 ResetWindowRegion(); | 741 ResetWindowRegion(); |
| 753 } | 742 } |
| 754 // Else: the widget will be relaid out either when the window bounds change or | 743 // Else: the widget will be relaid out either when the window bounds change or |
| 755 // when |xwindow_|'s fullscreen state changes. | 744 // when |xwindow_|'s fullscreen state changes. |
| 756 } | 745 } |
| 757 | 746 |
| 758 bool DesktopWindowTreeHostX11::IsFullscreen() const { | 747 bool DesktopWindowTreeHostX11::IsFullscreen() const { |
| (...skipping 96 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 855 return false; | 844 return false; |
| 856 } | 845 } |
| 857 | 846 |
| 858 void DesktopWindowTreeHostX11::SizeConstraintsChanged() { | 847 void DesktopWindowTreeHostX11::SizeConstraintsChanged() { |
| 859 UpdateMinAndMaxSize(); | 848 UpdateMinAndMaxSize(); |
| 860 } | 849 } |
| 861 | 850 |
| 862 //////////////////////////////////////////////////////////////////////////////// | 851 //////////////////////////////////////////////////////////////////////////////// |
| 863 // DesktopWindowTreeHostX11, aura::WindowTreeHost implementation: | 852 // DesktopWindowTreeHostX11, aura::WindowTreeHost implementation: |
| 864 | 853 |
| 854 gfx::Transform DesktopWindowTreeHostX11::GetRootTransform() const { | |
|
pkotwicz
2015/02/18 22:58:50
Nit: I would be tempted to query the device scale
sadrul
2015/02/18 23:33:58
Done.
| |
| 855 float scale = gfx::Display::GetForcedDeviceScaleFactor(); | |
| 856 if (window_mapped_) { | |
| 857 const gfx::Display display = | |
| 858 gfx::Screen::GetNativeScreen()->GetDisplayNearestPoint( | |
| 859 bounds_in_pixels_.origin()); | |
|
pkotwicz
2015/02/18 22:58:50
tldr: If you plan on making ToPixelRect() / ToDIPR
sadrul
2015/02/18 23:33:58
Changed to use DisplayNearestWindow() instead.
| |
| 860 scale = display.device_scale_factor(); | |
| 861 } | |
| 862 | |
| 863 gfx::Transform transform; | |
| 864 transform.Scale(scale, scale); | |
| 865 return transform; | |
| 866 } | |
| 867 | |
| 865 ui::EventSource* DesktopWindowTreeHostX11::GetEventSource() { | 868 ui::EventSource* DesktopWindowTreeHostX11::GetEventSource() { |
| 866 return this; | 869 return this; |
| 867 } | 870 } |
| 868 | 871 |
| 869 gfx::AcceleratedWidget DesktopWindowTreeHostX11::GetAcceleratedWidget() { | 872 gfx::AcceleratedWidget DesktopWindowTreeHostX11::GetAcceleratedWidget() { |
| 870 return xwindow_; | 873 return xwindow_; |
| 871 } | 874 } |
| 872 | 875 |
| 873 void DesktopWindowTreeHostX11::Show() { | 876 void DesktopWindowTreeHostX11::Show() { |
| 874 ShowWindowWithState(ui::SHOW_STATE_NORMAL); | 877 ShowWindowWithState(ui::SHOW_STATE_NORMAL); |
| 875 native_widget_delegate_->OnNativeWidgetVisibilityChanged(true); | 878 native_widget_delegate_->OnNativeWidgetVisibilityChanged(true); |
| 876 } | 879 } |
| 877 | 880 |
| 878 void DesktopWindowTreeHostX11::Hide() { | 881 void DesktopWindowTreeHostX11::Hide() { |
| 879 if (window_mapped_) { | 882 if (window_mapped_) { |
| 880 XWithdrawWindow(xdisplay_, xwindow_, 0); | 883 XWithdrawWindow(xdisplay_, xwindow_, 0); |
| 881 window_mapped_ = false; | 884 window_mapped_ = false; |
| 882 } | 885 } |
| 883 native_widget_delegate_->OnNativeWidgetVisibilityChanged(false); | 886 native_widget_delegate_->OnNativeWidgetVisibilityChanged(false); |
| 884 } | 887 } |
| 885 | 888 |
| 886 gfx::Rect DesktopWindowTreeHostX11::GetBounds() const { | 889 gfx::Rect DesktopWindowTreeHostX11::GetBounds() const { |
| 887 return bounds_; | 890 return bounds_in_pixels_; |
| 888 } | 891 } |
| 889 | 892 |
| 890 void DesktopWindowTreeHostX11::SetBounds(const gfx::Rect& requested_bounds) { | 893 void DesktopWindowTreeHostX11::SetBounds( |
| 891 gfx::Rect bounds(requested_bounds.origin(), | 894 const gfx::Rect& requested_bounds_in_pixel) { |
| 892 AdjustSize(requested_bounds.size())); | 895 gfx::Rect bounds(requested_bounds_in_pixel.origin(), |
| 893 bool origin_changed = bounds_.origin() != bounds.origin(); | 896 AdjustSize(requested_bounds_in_pixel.size())); |
| 894 bool size_changed = bounds_.size() != bounds.size(); | 897 bool origin_changed = bounds_in_pixels_.origin() != bounds.origin(); |
| 898 bool size_changed = bounds_in_pixels_.size() != bounds.size(); | |
| 895 XWindowChanges changes = {0}; | 899 XWindowChanges changes = {0}; |
| 896 unsigned value_mask = 0; | 900 unsigned value_mask = 0; |
| 897 | 901 |
| 898 if (size_changed) { | 902 if (size_changed) { |
| 899 if (bounds.width() < min_size_.width() || | 903 if (bounds.width() < min_size_.width() || |
| 900 bounds.height() < min_size_.height() || | 904 bounds.height() < min_size_.height() || |
| 901 (!max_size_.IsEmpty() && | 905 (!max_size_.IsEmpty() && |
| 902 (bounds.width() > max_size_.width() || | 906 (bounds.width() > max_size_.width() || |
| 903 bounds.height() > max_size_.height()))) { | 907 bounds.height() > max_size_.height()))) { |
| 904 // Update the minimum and maximum sizes in case they have changed. | 908 // Update the minimum and maximum sizes in case they have changed. |
| (...skipping 15 matching lines...) Expand all Loading... | |
| 920 changes.y = bounds.y(); | 924 changes.y = bounds.y(); |
| 921 value_mask |= CWX | CWY; | 925 value_mask |= CWX | CWY; |
| 922 } | 926 } |
| 923 if (value_mask) | 927 if (value_mask) |
| 924 XConfigureWindow(xdisplay_, xwindow_, value_mask, &changes); | 928 XConfigureWindow(xdisplay_, xwindow_, value_mask, &changes); |
| 925 | 929 |
| 926 // Assume that the resize will go through as requested, which should be the | 930 // Assume that the resize will go through as requested, which should be the |
| 927 // case if we're running without a window manager. If there's a window | 931 // case if we're running without a window manager. If there's a window |
| 928 // manager, it can modify or ignore the request, but (per ICCCM) we'll get a | 932 // manager, it can modify or ignore the request, but (per ICCCM) we'll get a |
| 929 // (possibly synthetic) ConfigureNotify about the actual size and correct | 933 // (possibly synthetic) ConfigureNotify about the actual size and correct |
| 930 // |bounds_| later. | 934 // |bounds_in_pixels_| later. |
| 931 bounds_ = bounds; | 935 bounds_in_pixels_ = bounds; |
| 932 | 936 |
| 933 if (origin_changed) | 937 if (origin_changed) |
| 934 native_widget_delegate_->AsWidget()->OnNativeWidgetMove(); | 938 native_widget_delegate_->AsWidget()->OnNativeWidgetMove(); |
| 935 if (size_changed) { | 939 if (size_changed) { |
| 936 OnHostResized(bounds.size()); | 940 OnHostResized(bounds.size()); |
| 937 ResetWindowRegion(); | 941 ResetWindowRegion(); |
| 938 } | 942 } |
| 939 } | 943 } |
| 940 | 944 |
| 941 gfx::Point DesktopWindowTreeHostX11::GetLocationOnNativeScreen() const { | 945 gfx::Point DesktopWindowTreeHostX11::GetLocationOnNativeScreen() const { |
| 942 return bounds_.origin(); | 946 return bounds_in_pixels_.origin(); |
| 943 } | 947 } |
| 944 | 948 |
| 945 void DesktopWindowTreeHostX11::SetCapture() { | 949 void DesktopWindowTreeHostX11::SetCapture() { |
| 946 if (HasCapture()) | 950 if (HasCapture()) |
| 947 return; | 951 return; |
| 948 | 952 |
| 949 // Grabbing the mouse is asynchronous. However, we synchronously start | 953 // Grabbing the mouse is asynchronous. However, we synchronously start |
| 950 // forwarding all mouse events received by Chrome to the | 954 // forwarding all mouse events received by Chrome to the |
| 951 // aura::WindowEventDispatcher which has capture. This makes capture | 955 // aura::WindowEventDispatcher which has capture. This makes capture |
| 952 // synchronous for all intents and purposes if either: | 956 // synchronous for all intents and purposes if either: |
| (...skipping 22 matching lines...) Expand all Loading... | |
| 975 OnHostLostWindowCapture(); | 979 OnHostLostWindowCapture(); |
| 976 } | 980 } |
| 977 } | 981 } |
| 978 | 982 |
| 979 void DesktopWindowTreeHostX11::SetCursorNative(gfx::NativeCursor cursor) { | 983 void DesktopWindowTreeHostX11::SetCursorNative(gfx::NativeCursor cursor) { |
| 980 XDefineCursor(xdisplay_, xwindow_, cursor.platform()); | 984 XDefineCursor(xdisplay_, xwindow_, cursor.platform()); |
| 981 } | 985 } |
| 982 | 986 |
| 983 void DesktopWindowTreeHostX11::MoveCursorToNative(const gfx::Point& location) { | 987 void DesktopWindowTreeHostX11::MoveCursorToNative(const gfx::Point& location) { |
| 984 XWarpPointer(xdisplay_, None, x_root_window_, 0, 0, 0, 0, | 988 XWarpPointer(xdisplay_, None, x_root_window_, 0, 0, 0, 0, |
| 985 bounds_.x() + location.x(), bounds_.y() + location.y()); | 989 bounds_in_pixels_.x() + location.x(), |
| 990 bounds_in_pixels_.y() + location.y()); | |
| 986 } | 991 } |
| 987 | 992 |
| 988 void DesktopWindowTreeHostX11::OnCursorVisibilityChangedNative(bool show) { | 993 void DesktopWindowTreeHostX11::OnCursorVisibilityChangedNative(bool show) { |
| 989 // TODO(erg): Conditional on us enabling touch on desktop linux builds, do | 994 // TODO(erg): Conditional on us enabling touch on desktop linux builds, do |
| 990 // the same tap-to-click disabling here that chromeos does. | 995 // the same tap-to-click disabling here that chromeos does. |
| 991 } | 996 } |
| 992 | 997 |
| 993 //////////////////////////////////////////////////////////////////////////////// | 998 //////////////////////////////////////////////////////////////////////////////// |
| 994 // DesktopWindowTreeHostX11, ui::EventSource implementation: | 999 // DesktopWindowTreeHostX11, ui::EventSource implementation: |
| 995 | 1000 |
| (...skipping 55 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1051 | 1056 |
| 1052 // x.org will BadMatch if we don't set a border when the depth isn't the | 1057 // x.org will BadMatch if we don't set a border when the depth isn't the |
| 1053 // same as the parent depth. | 1058 // same as the parent depth. |
| 1054 attribute_mask |= CWBorderPixel; | 1059 attribute_mask |= CWBorderPixel; |
| 1055 swa.border_pixel = 0; | 1060 swa.border_pixel = 0; |
| 1056 | 1061 |
| 1057 use_argb_visual_ = true; | 1062 use_argb_visual_ = true; |
| 1058 } | 1063 } |
| 1059 } | 1064 } |
| 1060 | 1065 |
| 1061 bounds_ = gfx::Rect(params.bounds.origin(), | 1066 bounds_in_pixels_ = ToPixelRect(params.bounds); |
| 1062 AdjustSize(params.bounds.size())); | 1067 bounds_in_pixels_ = gfx::Rect(bounds_in_pixels_.origin(), |
| 1063 xwindow_ = XCreateWindow( | 1068 AdjustSize(bounds_in_pixels_.size())); |
| 1064 xdisplay_, x_root_window_, | 1069 xwindow_ = XCreateWindow(xdisplay_, x_root_window_, bounds_in_pixels_.x(), |
| 1065 bounds_.x(), bounds_.y(), | 1070 bounds_in_pixels_.y(), bounds_in_pixels_.width(), |
| 1066 bounds_.width(), bounds_.height(), | 1071 bounds_in_pixels_.height(), |
| 1067 0, // border width | 1072 0, // border width |
| 1068 depth, | 1073 depth, InputOutput, visual, attribute_mask, &swa); |
| 1069 InputOutput, | |
| 1070 visual, | |
| 1071 attribute_mask, | |
| 1072 &swa); | |
| 1073 if (ui::PlatformEventSource::GetInstance()) | 1074 if (ui::PlatformEventSource::GetInstance()) |
| 1074 ui::PlatformEventSource::GetInstance()->AddPlatformEventDispatcher(this); | 1075 ui::PlatformEventSource::GetInstance()->AddPlatformEventDispatcher(this); |
| 1075 open_windows().push_back(xwindow_); | 1076 open_windows().push_back(xwindow_); |
| 1076 | 1077 |
| 1077 // TODO(erg): Maybe need to set a ViewProp here like in RWHL::RWHL(). | 1078 // TODO(erg): Maybe need to set a ViewProp here like in RWHL::RWHL(). |
| 1078 | 1079 |
| 1079 long event_mask = ButtonPressMask | ButtonReleaseMask | FocusChangeMask | | 1080 long event_mask = ButtonPressMask | ButtonReleaseMask | FocusChangeMask | |
| 1080 KeyPressMask | KeyReleaseMask | | 1081 KeyPressMask | KeyReleaseMask | |
| 1081 EnterWindowMask | LeaveWindowMask | | 1082 EnterWindowMask | LeaveWindowMask | |
| 1082 ExposureMask | VisibilityChangeMask | | 1083 ExposureMask | VisibilityChangeMask | |
| (...skipping 118 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1201 // icon. | 1202 // icon. |
| 1202 gfx::ImageSkia* window_icon = ViewsDelegate::views_delegate ? | 1203 gfx::ImageSkia* window_icon = ViewsDelegate::views_delegate ? |
| 1203 ViewsDelegate::views_delegate->GetDefaultWindowIcon() : NULL; | 1204 ViewsDelegate::views_delegate->GetDefaultWindowIcon() : NULL; |
| 1204 if (window_icon) { | 1205 if (window_icon) { |
| 1205 SetWindowIcons(gfx::ImageSkia(), *window_icon); | 1206 SetWindowIcons(gfx::ImageSkia(), *window_icon); |
| 1206 } | 1207 } |
| 1207 CreateCompositor(GetAcceleratedWidget()); | 1208 CreateCompositor(GetAcceleratedWidget()); |
| 1208 } | 1209 } |
| 1209 | 1210 |
| 1210 gfx::Size DesktopWindowTreeHostX11::AdjustSize( | 1211 gfx::Size DesktopWindowTreeHostX11::AdjustSize( |
| 1211 const gfx::Size& requested_size) { | 1212 const gfx::Size& requested_size_in_pixels) { |
| 1212 std::vector<gfx::Display> displays = | 1213 std::vector<gfx::Display> displays = |
| 1213 gfx::Screen::GetScreenByType(gfx::SCREEN_TYPE_NATIVE)->GetAllDisplays(); | 1214 gfx::Screen::GetScreenByType(gfx::SCREEN_TYPE_NATIVE)->GetAllDisplays(); |
| 1214 // Compare against all monitor sizes. The window manager can move the window | 1215 // Compare against all monitor sizes. The window manager can move the window |
| 1215 // to whichever monitor it wants. | 1216 // to whichever monitor it wants. |
| 1216 for (size_t i = 0; i < displays.size(); ++i) { | 1217 for (size_t i = 0; i < displays.size(); ++i) { |
| 1217 if (requested_size == displays[i].size()) { | 1218 if (requested_size_in_pixels == displays[i].GetSizeInPixel()) { |
| 1218 return gfx::Size(requested_size.width() - 1, | 1219 return gfx::Size(requested_size_in_pixels.width() - 1, |
| 1219 requested_size.height() - 1); | 1220 requested_size_in_pixels.height() - 1); |
| 1220 } | 1221 } |
| 1221 } | 1222 } |
| 1222 | 1223 |
| 1223 // Do not request a 0x0 window size. It causes an XError. | 1224 // Do not request a 0x0 window size. It causes an XError. |
| 1224 gfx::Size size = requested_size; | 1225 gfx::Size size = requested_size_in_pixels; |
| 1225 size.SetToMax(gfx::Size(1,1)); | 1226 size.SetToMax(gfx::Size(1,1)); |
| 1226 return size; | 1227 return size; |
| 1227 } | 1228 } |
| 1228 | 1229 |
| 1229 void DesktopWindowTreeHostX11::OnWMStateUpdated() { | 1230 void DesktopWindowTreeHostX11::OnWMStateUpdated() { |
| 1230 std::vector< ::Atom> atom_list; | 1231 std::vector< ::Atom> atom_list; |
| 1231 // Ignore the return value of ui::GetAtomArrayProperty(). Fluxbox removes the | 1232 // Ignore the return value of ui::GetAtomArrayProperty(). Fluxbox removes the |
| 1232 // _NET_WM_STATE property when no _NET_WM_STATE atoms are set. | 1233 // _NET_WM_STATE property when no _NET_WM_STATE atoms are set. |
| 1233 ui::GetAtomArrayProperty(xwindow_, "_NET_WM_STATE", &atom_list); | 1234 ui::GetAtomArrayProperty(xwindow_, "_NET_WM_STATE", &atom_list); |
| 1234 | 1235 |
| (...skipping 23 matching lines...) Expand all Loading... | |
| 1258 } else { | 1259 } else { |
| 1259 content_window_->Show(); | 1260 content_window_->Show(); |
| 1260 compositor()->SetVisible(true); | 1261 compositor()->SetVisible(true); |
| 1261 } | 1262 } |
| 1262 } | 1263 } |
| 1263 | 1264 |
| 1264 if (restored_bounds_.IsEmpty()) { | 1265 if (restored_bounds_.IsEmpty()) { |
| 1265 DCHECK(!IsFullscreen()); | 1266 DCHECK(!IsFullscreen()); |
| 1266 if (IsMaximized()) { | 1267 if (IsMaximized()) { |
| 1267 // The request that we become maximized originated from a different | 1268 // The request that we become maximized originated from a different |
| 1268 // process. |bounds_| already contains our maximized bounds. Do a best | 1269 // process. |bounds_in_pixels_| already contains our maximized bounds. Do |
| 1269 // effort attempt to get restored bounds by setting it to our previously | 1270 // a best effort attempt to get restored bounds by setting it to our |
| 1270 // set bounds (and if we get this wrong, we aren't any worse off since | 1271 // previously set bounds (and if we get this wrong, we aren't any worse |
| 1271 // we'd otherwise be returning our maximized bounds). | 1272 // off since we'd otherwise be returning our maximized bounds). |
| 1272 restored_bounds_ = previous_bounds_; | 1273 restored_bounds_ = previous_bounds_; |
| 1273 } | 1274 } |
| 1274 } else if (!IsMaximized() && !IsFullscreen()) { | 1275 } else if (!IsMaximized() && !IsFullscreen()) { |
| 1275 // If we have restored bounds, but WM_STATE no longer claims to be | 1276 // If we have restored bounds, but WM_STATE no longer claims to be |
| 1276 // maximized or fullscreen, we should clear our restored bounds. | 1277 // maximized or fullscreen, we should clear our restored bounds. |
| 1277 restored_bounds_ = gfx::Rect(); | 1278 restored_bounds_ = gfx::Rect(); |
| 1278 } | 1279 } |
| 1279 | 1280 |
| 1280 // Ignore requests by the window manager to enter or exit fullscreen (e.g. as | 1281 // Ignore requests by the window manager to enter or exit fullscreen (e.g. as |
| 1281 // a result of pressing a window manager accelerator key). Chrome does not | 1282 // a result of pressing a window manager accelerator key). Chrome does not |
| (...skipping 192 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1474 if (window_shape_) | 1475 if (window_shape_) |
| 1475 XDestroyRegion(window_shape_); | 1476 XDestroyRegion(window_shape_); |
| 1476 window_shape_ = NULL; | 1477 window_shape_ = NULL; |
| 1477 | 1478 |
| 1478 if (!IsMaximized() && !IsFullscreen()) { | 1479 if (!IsMaximized() && !IsFullscreen()) { |
| 1479 gfx::Path window_mask; | 1480 gfx::Path window_mask; |
| 1480 views::Widget* widget = native_widget_delegate_->AsWidget(); | 1481 views::Widget* widget = native_widget_delegate_->AsWidget(); |
| 1481 if (widget->non_client_view()) { | 1482 if (widget->non_client_view()) { |
| 1482 // Some frame views define a custom (non-rectangular) window mask. If | 1483 // Some frame views define a custom (non-rectangular) window mask. If |
| 1483 // so, use it to define the window shape. If not, fall through. | 1484 // so, use it to define the window shape. If not, fall through. |
| 1484 widget->non_client_view()->GetWindowMask(bounds_.size(), &window_mask); | 1485 widget->non_client_view()->GetWindowMask(bounds_in_pixels_.size(), |
| 1486 &window_mask); | |
| 1485 if (window_mask.countPoints() > 0) { | 1487 if (window_mask.countPoints() > 0) { |
| 1486 window_shape_ = gfx::CreateRegionFromSkPath(window_mask); | 1488 window_shape_ = gfx::CreateRegionFromSkPath(window_mask); |
| 1487 XShapeCombineRegion(xdisplay_, xwindow_, ShapeBounding, | 1489 XShapeCombineRegion(xdisplay_, xwindow_, ShapeBounding, |
| 1488 0, 0, window_shape_, false); | 1490 0, 0, window_shape_, false); |
| 1489 return; | 1491 return; |
| 1490 } | 1492 } |
| 1491 } | 1493 } |
| 1492 } | 1494 } |
| 1493 | 1495 |
| 1494 // If we didn't set the shape for any reason, reset the shaping information. | 1496 // If we didn't set the shape for any reason, reset the shaping information. |
| 1495 // How this is done depends on the border style, due to quirks and bugs in | 1497 // How this is done depends on the border style, due to quirks and bugs in |
| 1496 // various window managers. | 1498 // various window managers. |
| 1497 if (ShouldUseNativeFrame()) { | 1499 if (ShouldUseNativeFrame()) { |
| 1498 // If the window has system borders, the mask must be set to null (not a | 1500 // If the window has system borders, the mask must be set to null (not a |
| 1499 // rectangle), because several window managers (eg, KDE, XFCE, XMonad) will | 1501 // rectangle), because several window managers (eg, KDE, XFCE, XMonad) will |
| 1500 // not put borders on a window with a custom shape. | 1502 // not put borders on a window with a custom shape. |
| 1501 XShapeCombineMask(xdisplay_, xwindow_, ShapeBounding, 0, 0, None, ShapeSet); | 1503 XShapeCombineMask(xdisplay_, xwindow_, ShapeBounding, 0, 0, None, ShapeSet); |
| 1502 } else { | 1504 } else { |
| 1503 // Conversely, if the window does not have system borders, the mask must be | 1505 // Conversely, if the window does not have system borders, the mask must be |
| 1504 // manually set to a rectangle that covers the whole window (not null). This | 1506 // manually set to a rectangle that covers the whole window (not null). This |
| 1505 // is due to a bug in KWin <= 4.11.5 (KDE bug #330573) where setting a null | 1507 // is due to a bug in KWin <= 4.11.5 (KDE bug #330573) where setting a null |
| 1506 // shape causes the hint to disable system borders to be ignored (resulting | 1508 // shape causes the hint to disable system borders to be ignored (resulting |
| 1507 // in a double border). | 1509 // in a double border). |
| 1508 XRectangle r = {0, 0, static_cast<unsigned short>(bounds_.width()), | 1510 XRectangle r = {0, |
| 1509 static_cast<unsigned short>(bounds_.height())}; | 1511 0, |
| 1512 static_cast<unsigned short>(bounds_in_pixels_.width()), | |
| 1513 static_cast<unsigned short>(bounds_in_pixels_.height())}; | |
| 1510 XShapeCombineRectangles( | 1514 XShapeCombineRectangles( |
| 1511 xdisplay_, xwindow_, ShapeBounding, 0, 0, &r, 1, ShapeSet, YXBanded); | 1515 xdisplay_, xwindow_, ShapeBounding, 0, 0, &r, 1, ShapeSet, YXBanded); |
| 1512 } | 1516 } |
| 1513 } | 1517 } |
| 1514 | 1518 |
| 1515 void DesktopWindowTreeHostX11::SerializeImageRepresentation( | 1519 void DesktopWindowTreeHostX11::SerializeImageRepresentation( |
| 1516 const gfx::ImageSkiaRep& rep, | 1520 const gfx::ImageSkiaRep& rep, |
| 1517 std::vector<unsigned long>* data) { | 1521 std::vector<unsigned long>* data) { |
| 1518 int width = rep.GetWidth(); | 1522 int width = rep.GetWidth(); |
| 1519 data->push_back(width); | 1523 data->push_back(width); |
| (...skipping 54 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1574 show_state != ui::SHOW_STATE_INACTIVE && | 1578 show_state != ui::SHOW_STATE_INACTIVE && |
| 1575 show_state != ui::SHOW_STATE_MAXIMIZED) { | 1579 show_state != ui::SHOW_STATE_MAXIMIZED) { |
| 1576 // It will behave like SHOW_STATE_NORMAL. | 1580 // It will behave like SHOW_STATE_NORMAL. |
| 1577 NOTIMPLEMENTED(); | 1581 NOTIMPLEMENTED(); |
| 1578 } | 1582 } |
| 1579 | 1583 |
| 1580 // Before we map the window, set size hints. Otherwise, some window managers | 1584 // Before we map the window, set size hints. Otherwise, some window managers |
| 1581 // will ignore toplevel XMoveWindow commands. | 1585 // will ignore toplevel XMoveWindow commands. |
| 1582 XSizeHints size_hints; | 1586 XSizeHints size_hints; |
| 1583 size_hints.flags = PPosition; | 1587 size_hints.flags = PPosition; |
| 1584 size_hints.x = bounds_.x(); | 1588 size_hints.x = bounds_in_pixels_.x(); |
| 1585 size_hints.y = bounds_.y(); | 1589 size_hints.y = bounds_in_pixels_.y(); |
| 1586 XSetWMNormalHints(xdisplay_, xwindow_, &size_hints); | 1590 XSetWMNormalHints(xdisplay_, xwindow_, &size_hints); |
| 1587 | 1591 |
| 1588 // If SHOW_STATE_INACTIVE, tell the window manager not to focus the window | 1592 // If SHOW_STATE_INACTIVE, tell the window manager not to focus the window |
| 1589 // when mapping. This is done by setting the _NET_WM_USER_TIME to 0. See e.g. | 1593 // when mapping. This is done by setting the _NET_WM_USER_TIME to 0. See e.g. |
| 1590 // http://standards.freedesktop.org/wm-spec/latest/ar01s05.html | 1594 // http://standards.freedesktop.org/wm-spec/latest/ar01s05.html |
| 1591 unsigned long wm_user_time_ms = (show_state == ui::SHOW_STATE_INACTIVE) ? | 1595 unsigned long wm_user_time_ms = (show_state == ui::SHOW_STATE_INACTIVE) ? |
| 1592 0 : X11DesktopHandler::get()->wm_user_time_ms(); | 1596 0 : X11DesktopHandler::get()->wm_user_time_ms(); |
| 1593 if (show_state == ui::SHOW_STATE_INACTIVE || wm_user_time_ms != 0) { | 1597 if (show_state == ui::SHOW_STATE_INACTIVE || wm_user_time_ms != 0) { |
| 1594 XChangeProperty(xdisplay_, | 1598 XChangeProperty(xdisplay_, |
| 1595 xwindow_, | 1599 xwindow_, |
| (...skipping 139 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1735 // sure the root window size is maintained properly. | 1739 // sure the root window size is maintained properly. |
| 1736 int translated_x = xev->xconfigure.x; | 1740 int translated_x = xev->xconfigure.x; |
| 1737 int translated_y = xev->xconfigure.y; | 1741 int translated_y = xev->xconfigure.y; |
| 1738 if (!xev->xconfigure.send_event && !xev->xconfigure.override_redirect) { | 1742 if (!xev->xconfigure.send_event && !xev->xconfigure.override_redirect) { |
| 1739 Window unused; | 1743 Window unused; |
| 1740 XTranslateCoordinates(xdisplay_, xwindow_, x_root_window_, | 1744 XTranslateCoordinates(xdisplay_, xwindow_, x_root_window_, |
| 1741 0, 0, &translated_x, &translated_y, &unused); | 1745 0, 0, &translated_x, &translated_y, &unused); |
| 1742 } | 1746 } |
| 1743 gfx::Rect bounds(translated_x, translated_y, | 1747 gfx::Rect bounds(translated_x, translated_y, |
| 1744 xev->xconfigure.width, xev->xconfigure.height); | 1748 xev->xconfigure.width, xev->xconfigure.height); |
| 1745 bool size_changed = bounds_.size() != bounds.size(); | 1749 bool size_changed = bounds_in_pixels_.size() != bounds.size(); |
| 1746 bool origin_changed = bounds_.origin() != bounds.origin(); | 1750 bool origin_changed = bounds_in_pixels_.origin() != bounds.origin(); |
| 1747 previous_bounds_ = bounds_; | 1751 previous_bounds_ = bounds_in_pixels_; |
| 1748 bounds_ = bounds; | 1752 bounds_in_pixels_ = bounds; |
| 1749 | 1753 |
| 1750 if (origin_changed) | 1754 if (origin_changed) |
| 1751 OnHostMoved(bounds_.origin()); | 1755 OnHostMoved(bounds_in_pixels_.origin()); |
| 1752 | 1756 |
| 1753 if (size_changed) { | 1757 if (size_changed) { |
| 1754 delayed_resize_task_.Reset(base::Bind( | 1758 delayed_resize_task_.Reset(base::Bind( |
| 1755 &DesktopWindowTreeHostX11::DelayedResize, | 1759 &DesktopWindowTreeHostX11::DelayedResize, |
| 1756 close_widget_factory_.GetWeakPtr(), | 1760 close_widget_factory_.GetWeakPtr(), |
| 1757 bounds.size())); | 1761 bounds.size())); |
| 1758 base::MessageLoop::current()->PostTask( | 1762 base::MessageLoop::current()->PostTask( |
| 1759 FROM_HERE, delayed_resize_task_.callback()); | 1763 FROM_HERE, delayed_resize_task_.callback()); |
| 1760 } | 1764 } |
| 1761 break; | 1765 break; |
| (...skipping 161 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1923 } | 1927 } |
| 1924 return ui::POST_DISPATCH_STOP_PROPAGATION; | 1928 return ui::POST_DISPATCH_STOP_PROPAGATION; |
| 1925 } | 1929 } |
| 1926 | 1930 |
| 1927 void DesktopWindowTreeHostX11::DelayedResize(const gfx::Size& size) { | 1931 void DesktopWindowTreeHostX11::DelayedResize(const gfx::Size& size) { |
| 1928 OnHostResized(size); | 1932 OnHostResized(size); |
| 1929 ResetWindowRegion(); | 1933 ResetWindowRegion(); |
| 1930 delayed_resize_task_.Cancel(); | 1934 delayed_resize_task_.Cancel(); |
| 1931 } | 1935 } |
| 1932 | 1936 |
| 1937 gfx::Rect DesktopWindowTreeHostX11::GetWorkAreaBoundsInPixels() const { | |
| 1938 std::vector<int> value; | |
| 1939 if (ui::GetIntArrayProperty(x_root_window_, "_NET_WORKAREA", &value) && | |
| 1940 value.size() >= 4) { | |
| 1941 return gfx::Rect(value[0], value[1], value[2], value[3]); | |
| 1942 } | |
| 1943 | |
| 1944 // Fetch the geometry of the root window. | |
| 1945 Window root; | |
| 1946 int x, y; | |
| 1947 unsigned int width, height; | |
| 1948 unsigned int border_width, depth; | |
| 1949 if (!XGetGeometry(xdisplay_, x_root_window_, &root, &x, &y, &width, &height, | |
| 1950 &border_width, &depth)) { | |
| 1951 NOTIMPLEMENTED(); | |
| 1952 return gfx::Rect(0, 0, 10, 10); | |
| 1953 } | |
| 1954 | |
| 1955 return gfx::Rect(x, y, width, height); | |
| 1956 } | |
| 1957 | |
| 1958 gfx::Rect DesktopWindowTreeHostX11::ToDIPRect( | |
| 1959 const gfx::Rect& rect_in_pixels) const { | |
| 1960 gfx::RectF rect_in_dip = rect_in_pixels; | |
| 1961 GetRootTransform().TransformRectReverse(&rect_in_dip); | |
| 1962 return gfx::ToEnclosingRect(rect_in_dip); | |
| 1963 } | |
| 1964 | |
| 1965 gfx::Rect DesktopWindowTreeHostX11::ToPixelRect( | |
| 1966 const gfx::Rect& rect_in_dip) const { | |
| 1967 gfx::RectF rect_in_pixels = rect_in_dip; | |
| 1968 GetRootTransform().TransformRect(&rect_in_pixels); | |
| 1969 return gfx::ToEnclosingRect(rect_in_pixels); | |
| 1970 } | |
| 1971 | |
| 1933 //////////////////////////////////////////////////////////////////////////////// | 1972 //////////////////////////////////////////////////////////////////////////////// |
| 1934 // DesktopWindowTreeHost, public: | 1973 // DesktopWindowTreeHost, public: |
| 1935 | 1974 |
| 1936 // static | 1975 // static |
| 1937 DesktopWindowTreeHost* DesktopWindowTreeHost::Create( | 1976 DesktopWindowTreeHost* DesktopWindowTreeHost::Create( |
| 1938 internal::NativeWidgetDelegate* native_widget_delegate, | 1977 internal::NativeWidgetDelegate* native_widget_delegate, |
| 1939 DesktopNativeWidgetAura* desktop_native_widget_aura) { | 1978 DesktopNativeWidgetAura* desktop_native_widget_aura) { |
| 1940 return new DesktopWindowTreeHostX11(native_widget_delegate, | 1979 return new DesktopWindowTreeHostX11(native_widget_delegate, |
| 1941 desktop_native_widget_aura); | 1980 desktop_native_widget_aura); |
| 1942 } | 1981 } |
| 1943 | 1982 |
| 1944 // static | 1983 // static |
| 1945 ui::NativeTheme* DesktopWindowTreeHost::GetNativeTheme(aura::Window* window) { | 1984 ui::NativeTheme* DesktopWindowTreeHost::GetNativeTheme(aura::Window* window) { |
| 1946 const views::LinuxUI* linux_ui = views::LinuxUI::instance(); | 1985 const views::LinuxUI* linux_ui = views::LinuxUI::instance(); |
| 1947 if (linux_ui) { | 1986 if (linux_ui) { |
| 1948 ui::NativeTheme* native_theme = linux_ui->GetNativeTheme(window); | 1987 ui::NativeTheme* native_theme = linux_ui->GetNativeTheme(window); |
| 1949 if (native_theme) | 1988 if (native_theme) |
| 1950 return native_theme; | 1989 return native_theme; |
| 1951 } | 1990 } |
| 1952 | 1991 |
| 1953 return ui::NativeTheme::instance(); | 1992 return ui::NativeTheme::instance(); |
| 1954 } | 1993 } |
| 1955 | 1994 |
| 1956 } // namespace views | 1995 } // namespace views |
| OLD | NEW |