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 73 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 84 const int k_NET_WM_STATE_REMOVE = 0; | 84 const int k_NET_WM_STATE_REMOVE = 0; |
| 85 | 85 |
| 86 // Special value of the _NET_WM_DESKTOP property which indicates that the window | 86 // Special value of the _NET_WM_DESKTOP property which indicates that the window |
| 87 // should appear on all desktops. | 87 // should appear on all desktops. |
| 88 const int kAllDesktops = 0xFFFFFFFF; | 88 const int kAllDesktops = 0xFFFFFFFF; |
| 89 | 89 |
| 90 const char* kAtomsToCache[] = { | 90 const char* kAtomsToCache[] = { |
| 91 "UTF8_STRING", | 91 "UTF8_STRING", |
| 92 "WM_DELETE_WINDOW", | 92 "WM_DELETE_WINDOW", |
| 93 "WM_PROTOCOLS", | 93 "WM_PROTOCOLS", |
| 94 "_NET_ACTIVE_WINDOW", | |
| 94 "_NET_FRAME_EXTENTS", | 95 "_NET_FRAME_EXTENTS", |
| 95 "_NET_WM_CM_S0", | 96 "_NET_WM_CM_S0", |
| 96 "_NET_WM_DESKTOP", | 97 "_NET_WM_DESKTOP", |
| 97 "_NET_WM_ICON", | 98 "_NET_WM_ICON", |
| 98 "_NET_WM_NAME", | 99 "_NET_WM_NAME", |
| 99 "_NET_WM_PID", | 100 "_NET_WM_PID", |
| 100 "_NET_WM_PING", | 101 "_NET_WM_PING", |
| 101 "_NET_WM_STATE", | 102 "_NET_WM_STATE", |
| 102 "_NET_WM_STATE_ABOVE", | 103 "_NET_WM_STATE_ABOVE", |
| 103 "_NET_WM_STATE_FULLSCREEN", | 104 "_NET_WM_STATE_FULLSCREEN", |
| (...skipping 71 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 175 should_maximize_after_map_(false), | 176 should_maximize_after_map_(false), |
| 176 use_argb_visual_(false), | 177 use_argb_visual_(false), |
| 177 drag_drop_client_(NULL), | 178 drag_drop_client_(NULL), |
| 178 native_widget_delegate_(native_widget_delegate), | 179 native_widget_delegate_(native_widget_delegate), |
| 179 desktop_native_widget_aura_(desktop_native_widget_aura), | 180 desktop_native_widget_aura_(desktop_native_widget_aura), |
| 180 content_window_(NULL), | 181 content_window_(NULL), |
| 181 window_parent_(NULL), | 182 window_parent_(NULL), |
| 182 custom_window_shape_(false), | 183 custom_window_shape_(false), |
| 183 urgency_hint_set_(false), | 184 urgency_hint_set_(false), |
| 184 activatable_(true), | 185 activatable_(true), |
| 186 has_pointer_(false), | |
| 187 has_pointer_grab_(false), | |
| 188 has_pointer_focus_(false), | |
| 189 has_window_focus_(false), | |
| 190 has_focus_(false), | |
| 185 close_widget_factory_(this) { | 191 close_widget_factory_(this) { |
| 186 } | 192 } |
| 187 | 193 |
| 188 DesktopWindowTreeHostX11::~DesktopWindowTreeHostX11() { | 194 DesktopWindowTreeHostX11::~DesktopWindowTreeHostX11() { |
| 189 window()->ClearProperty(kHostForRootWindow); | 195 window()->ClearProperty(kHostForRootWindow); |
| 190 aura::client::SetWindowMoveClient(window(), NULL); | 196 aura::client::SetWindowMoveClient(window(), NULL); |
| 191 desktop_native_widget_aura_->OnDesktopWindowTreeHostDestroyed(this); | 197 desktop_native_widget_aura_->OnDesktopWindowTreeHostDestroyed(this); |
| 192 DestroyDispatcher(); | 198 DestroyDispatcher(); |
| 193 } | 199 } |
| 194 | 200 |
| (...skipping 28 matching lines...) Expand all Loading... | |
| 223 gfx::Rect DesktopWindowTreeHostX11::GetX11RootWindowOuterBounds() const { | 229 gfx::Rect DesktopWindowTreeHostX11::GetX11RootWindowOuterBounds() const { |
| 224 gfx::Rect outer_bounds(bounds_in_pixels_); | 230 gfx::Rect outer_bounds(bounds_in_pixels_); |
| 225 outer_bounds.Inset(-native_window_frame_borders_in_pixels_); | 231 outer_bounds.Inset(-native_window_frame_borders_in_pixels_); |
| 226 return outer_bounds; | 232 return outer_bounds; |
| 227 } | 233 } |
| 228 | 234 |
| 229 ::Region DesktopWindowTreeHostX11::GetWindowShape() const { | 235 ::Region DesktopWindowTreeHostX11::GetWindowShape() const { |
| 230 return window_shape_.get(); | 236 return window_shape_.get(); |
| 231 } | 237 } |
| 232 | 238 |
| 233 void DesktopWindowTreeHostX11::HandleNativeWidgetActivationChanged( | 239 void DesktopWindowTreeHostX11::BeforeActivationStateChanged() { |
| 234 bool active) { | 240 was_active_ = IsActive(); |
| 235 if (active) { | 241 had_pointer_grab_ = has_pointer_grab_; |
| 242 had_window_focus_ = has_window_focus_; | |
| 243 } | |
| 244 | |
| 245 void DesktopWindowTreeHostX11::AfterActivationStateChanged() { | |
| 246 if (had_pointer_grab_ && !has_pointer_grab_) | |
| 247 dispatcher()->OnHostLostMouseGrab(); | |
| 248 if (had_window_focus_ && !has_window_focus_) | |
| 249 OnHostLostWindowCapture(); | |
|
danakj
2016/08/19 21:43:45
Why do we not do this if we had pointer focus but
Tom (Use chromium acct)
2016/08/22 20:27:07
You're right, I was unclear about the definition o
danakj
2016/08/26 19:58:43
Agree, thanks for figuring out what it means
| |
| 250 | |
| 251 if (!was_active_ && IsActive()) { | |
| 236 FlashFrame(false); | 252 FlashFrame(false); |
| 237 OnHostActivated(); | 253 OnHostActivated(); |
| 254 // TODO(thomasanderson): Remove this window shuffling and use XWindowCache | |
| 255 // instead. | |
| 238 open_windows().remove(xwindow_); | 256 open_windows().remove(xwindow_); |
| 239 open_windows().insert(open_windows().begin(), xwindow_); | 257 open_windows().insert(open_windows().begin(), xwindow_); |
| 240 } else { | |
| 241 ReleaseCapture(); | |
| 242 } | 258 } |
| 259 if (was_active_ != IsActive()) { | |
| 260 desktop_native_widget_aura_->HandleActivationChanged(IsActive()); | |
| 261 native_widget_delegate_->AsWidget()->GetRootView()->SchedulePaint(); | |
| 262 } | |
| 263 } | |
| 243 | 264 |
| 244 desktop_native_widget_aura_->HandleActivationChanged(active); | 265 void DesktopWindowTreeHostX11::OnCrossingEvent(bool enter, |
| 266 bool focus, | |
|
danakj
2016/08/19 21:43:45
focus_in_window_or_ancestor?
Tom (Use chromium acct)
2016/08/22 20:27:07
Done.
| |
| 267 int detail) { | |
| 268 if (detail == NotifyInferior) | |
|
danakj
2016/08/19 21:43:45
When the mouse moves from the root into |xwindow_|
danakj
2016/08/19 23:17:32
Oh I see.
EnterNotify with Inferior means we're c
Tom (Use chromium acct)
2016/08/22 20:27:07
Done.
| |
| 269 return; | |
| 245 | 270 |
| 246 native_widget_delegate_->AsWidget()->GetRootView()->SchedulePaint(); | 271 BeforeActivationStateChanged(); |
| 272 | |
| 273 has_pointer_ = enter; | |
| 274 if (focus && !has_window_focus_) | |
|
danakj
2016/08/19 21:43:45
// If focus is not in an ancestor then this crossi
Tom (Use chromium acct)
2016/08/22 20:27:07
Done. I wrote something different though.
| |
| 275 has_pointer_focus_ = has_pointer_; | |
| 276 | |
| 277 AfterActivationStateChanged(); | |
| 278 } | |
| 279 | |
| 280 void DesktopWindowTreeHostX11::OnFocusEvent(bool focus_in, | |
| 281 int mode, | |
| 282 int detail) { | |
| 283 if (detail == NotifyInferior) | |
|
danakj
2016/08/19 23:29:58
Can you say the same thing here moreorless?
Tom (Use chromium acct)
2016/08/22 20:27:07
Done.
| |
| 284 return; | |
| 285 BeforeActivationStateChanged(); | |
| 286 if (mode != NotifyWhileGrabbed && detail != NotifyPointer) | |
|
danakj
2016/08/19 23:29:58
Can you throw some comments here kinda like the he
danakj
2016/08/19 23:59:30
Also can you explain by ignore Pointer here in a c
danakj
2016/08/19 23:59:30
Maybe better would be to say that while grabbed we
Tom (Use chromium acct)
2016/08/22 20:27:07
Done.
Tom (Use chromium acct)
2016/08/22 20:27:07
Done.
| |
| 287 has_focus_ = focus_in; | |
| 288 if (mode != NotifyGrab && mode != NotifyUngrab && | |
| 289 mode != XINotifyPassiveGrab && mode != XINotifyPassiveUngrab) { | |
| 290 if (detail != NotifyPointer) | |
| 291 has_window_focus_ = focus_in; | |
| 292 if (has_pointer_) { | |
| 293 switch (detail) { | |
| 294 case NotifyAncestor: | |
| 295 case NotifyVirtual: | |
|
danakj
2016/08/19 23:59:30
Can you leave a comment why NonLinear(Virtual) are
Tom (Use chromium acct)
2016/08/22 20:27:07
Done.
| |
| 296 has_pointer_focus_ = !focus_in; | |
| 297 break; | |
| 298 case NotifyPointer: | |
| 299 has_pointer_focus_ = focus_in; | |
| 300 break; | |
| 301 default: | |
| 302 break; | |
| 303 } | |
| 304 } | |
| 305 } | |
| 306 ignore_input_ = false; | |
| 307 AfterActivationStateChanged(); | |
| 247 } | 308 } |
| 248 | 309 |
| 249 void DesktopWindowTreeHostX11::AddObserver( | 310 void DesktopWindowTreeHostX11::AddObserver( |
| 250 views::DesktopWindowTreeHostObserverX11* observer) { | 311 views::DesktopWindowTreeHostObserverX11* observer) { |
| 251 observer_list_.AddObserver(observer); | 312 observer_list_.AddObserver(observer); |
| 252 } | 313 } |
| 253 | 314 |
| 254 void DesktopWindowTreeHostX11::RemoveObserver( | 315 void DesktopWindowTreeHostX11::RemoveObserver( |
| 255 views::DesktopWindowTreeHostObserverX11* observer) { | 316 views::DesktopWindowTreeHostObserverX11* observer) { |
| 256 observer_list_.RemoveObserver(observer); | 317 observer_list_.RemoveObserver(observer); |
| (...skipping 44 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 301 sanitized_params.bounds.set_height(100); | 362 sanitized_params.bounds.set_height(100); |
| 302 | 363 |
| 303 InitX11Window(sanitized_params); | 364 InitX11Window(sanitized_params); |
| 304 } | 365 } |
| 305 | 366 |
| 306 void DesktopWindowTreeHostX11::OnNativeWidgetCreated( | 367 void DesktopWindowTreeHostX11::OnNativeWidgetCreated( |
| 307 const Widget::InitParams& params) { | 368 const Widget::InitParams& params) { |
| 308 window()->SetProperty(kViewsWindowForRootWindow, content_window_); | 369 window()->SetProperty(kViewsWindowForRootWindow, content_window_); |
| 309 window()->SetProperty(kHostForRootWindow, this); | 370 window()->SetProperty(kHostForRootWindow, this); |
| 310 | 371 |
| 311 // Ensure that the X11DesktopHandler exists so that it dispatches activation | 372 // Ensure that the X11DesktopHandler exists so that it tracks create/destroy |
| 312 // messages to us. | 373 // notify events. |
| 313 X11DesktopHandler::get(); | 374 X11DesktopHandler::get(); |
| 314 | 375 |
| 315 // TODO(erg): Unify this code once the other consumer goes away. | 376 // TODO(erg): Unify this code once the other consumer goes away. |
| 316 SwapNonClientEventHandler( | 377 SwapNonClientEventHandler( |
| 317 std::unique_ptr<ui::EventHandler>(new X11WindowEventFilter(this))); | 378 std::unique_ptr<ui::EventHandler>(new X11WindowEventFilter(this))); |
| 318 SetUseNativeFrame(params.type == Widget::InitParams::TYPE_WINDOW && | 379 SetUseNativeFrame(params.type == Widget::InitParams::TYPE_WINDOW && |
| 319 !params.remove_standard_frame); | 380 !params.remove_standard_frame); |
| 320 | 381 |
| 321 x11_window_move_client_.reset(new X11DesktopWindowMoveClient); | 382 x11_window_move_client_.reset(new X11DesktopWindowMoveClient); |
| 322 aura::client::SetWindowMoveClient(window(), x11_window_move_client_.get()); | 383 aura::client::SetWindowMoveClient(window(), x11_window_move_client_.get()); |
| (...skipping 76 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 399 } | 460 } |
| 400 | 461 |
| 401 aura::WindowTreeHost* DesktopWindowTreeHostX11::AsWindowTreeHost() { | 462 aura::WindowTreeHost* DesktopWindowTreeHostX11::AsWindowTreeHost() { |
| 402 return this; | 463 return this; |
| 403 } | 464 } |
| 404 | 465 |
| 405 void DesktopWindowTreeHostX11::ShowWindowWithState( | 466 void DesktopWindowTreeHostX11::ShowWindowWithState( |
| 406 ui::WindowShowState show_state) { | 467 ui::WindowShowState show_state) { |
| 407 if (compositor()) | 468 if (compositor()) |
| 408 compositor()->SetVisible(true); | 469 compositor()->SetVisible(true); |
| 409 if (!window_mapped_) | 470 if (!IsVisible()) |
| 410 MapWindow(show_state); | 471 MapWindow(show_state); |
| 411 | 472 |
| 412 switch (show_state) { | 473 switch (show_state) { |
| 413 case ui::SHOW_STATE_MAXIMIZED: | 474 case ui::SHOW_STATE_MAXIMIZED: |
| 414 Maximize(); | 475 Maximize(); |
| 415 break; | 476 break; |
| 416 case ui::SHOW_STATE_MINIMIZED: | 477 case ui::SHOW_STATE_MINIMIZED: |
| 417 Minimize(); | 478 Minimize(); |
| 418 break; | 479 break; |
| 419 case ui::SHOW_STATE_FULLSCREEN: | 480 case ui::SHOW_STATE_FULLSCREEN: |
| 420 SetFullscreen(true); | 481 SetFullscreen(true); |
| 421 break; | 482 break; |
| 422 default: | 483 default: |
| 423 break; | 484 break; |
| 424 } | 485 } |
| 425 | 486 |
| 426 // Makes the window activated by default if the state is not INACTIVE or | 487 // Makes the window activated by default if the state is not INACTIVE or |
| 427 // MINIMIZED. | 488 // MINIMIZED. |
| 428 if (show_state != ui::SHOW_STATE_INACTIVE && | 489 if (show_state != ui::SHOW_STATE_INACTIVE && |
| 429 show_state != ui::SHOW_STATE_MINIMIZED && | 490 show_state != ui::SHOW_STATE_MINIMIZED) { |
| 430 activatable_) { | |
| 431 Activate(); | 491 Activate(); |
| 432 } | 492 } |
| 433 | 493 |
| 434 native_widget_delegate_->AsWidget()->SetInitialFocus(show_state); | 494 native_widget_delegate_->AsWidget()->SetInitialFocus(show_state); |
| 435 } | 495 } |
| 436 | 496 |
| 437 void DesktopWindowTreeHostX11::ShowMaximizedWithBounds( | 497 void DesktopWindowTreeHostX11::ShowMaximizedWithBounds( |
| 438 const gfx::Rect& restored_bounds) { | 498 const gfx::Rect& restored_bounds) { |
| 439 ShowWindowWithState(ui::SHOW_STATE_MAXIMIZED); | 499 ShowWindowWithState(ui::SHOW_STATE_MAXIMIZED); |
| 440 // Enforce |restored_bounds_in_pixels_| since calling Maximize() could have | 500 // Enforce |restored_bounds_in_pixels_| since calling Maximize() could have |
| 441 // reset it. | 501 // reset it. |
| 442 restored_bounds_in_pixels_ = ToPixelRect(restored_bounds); | 502 restored_bounds_in_pixels_ = ToPixelRect(restored_bounds); |
| 443 } | 503 } |
| 444 | 504 |
| 445 bool DesktopWindowTreeHostX11::IsVisible() const { | 505 bool DesktopWindowTreeHostX11::IsVisible() const { |
| 446 return window_mapped_; | 506 return window_mapped_ && !wait_for_unmap_; |
| 447 } | 507 } |
| 448 | 508 |
| 449 void DesktopWindowTreeHostX11::SetSize(const gfx::Size& requested_size) { | 509 void DesktopWindowTreeHostX11::SetSize(const gfx::Size& requested_size) { |
| 450 gfx::Size size_in_pixels = ToPixelRect(gfx::Rect(requested_size)).size(); | 510 gfx::Size size_in_pixels = ToPixelRect(gfx::Rect(requested_size)).size(); |
| 451 size_in_pixels = AdjustSize(size_in_pixels); | 511 size_in_pixels = AdjustSize(size_in_pixels); |
| 452 bool size_changed = bounds_in_pixels_.size() != size_in_pixels; | 512 bool size_changed = bounds_in_pixels_.size() != size_in_pixels; |
| 453 XResizeWindow(xdisplay_, xwindow_, size_in_pixels.width(), | 513 XResizeWindow(xdisplay_, xwindow_, size_in_pixels.width(), |
| 454 size_in_pixels.height()); | 514 size_in_pixels.height()); |
| 455 bounds_in_pixels_.set_size(size_in_pixels); | 515 bounds_in_pixels_.set_size(size_in_pixels); |
| 456 if (size_changed) { | 516 if (size_changed) { |
| (...skipping 150 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 607 } else { | 667 } else { |
| 608 window_shape_.reset(gfx::CreateRegionFromSkRegion(*native_region)); | 668 window_shape_.reset(gfx::CreateRegionFromSkRegion(*native_region)); |
| 609 } | 669 } |
| 610 | 670 |
| 611 custom_window_shape_ = true; | 671 custom_window_shape_ = true; |
| 612 } | 672 } |
| 613 ResetWindowRegion(); | 673 ResetWindowRegion(); |
| 614 } | 674 } |
| 615 | 675 |
| 616 void DesktopWindowTreeHostX11::Activate() { | 676 void DesktopWindowTreeHostX11::Activate() { |
| 617 if (!window_mapped_) | 677 if (!IsVisible() || !activatable_) |
| 618 return; | 678 return; |
| 619 | 679 |
| 620 X11DesktopHandler::get()->ActivateWindow(xwindow_); | 680 BeforeActivationStateChanged(); |
| 681 | |
| 682 ignore_input_ = false; | |
| 683 | |
| 684 // wmii says that it supports _NET_ACTIVE_WINDOW but does not. | |
| 685 // https://code.google.com/p/wmii/issues/detail?id=266 | |
| 686 static bool wm_supports_active_window = | |
| 687 ui::GuessWindowManager() != ui::WM_WMII && | |
| 688 ui::WmSupportsHint(atom_cache_.GetAtom("_NET_ACTIVE_WINDOW")); | |
| 689 | |
| 690 Time timestamp = ui::X11EventSource::GetInstance()->GetTimestamp(); | |
| 691 | |
| 692 if (wm_supports_active_window) { | |
| 693 XEvent xclient; | |
| 694 memset(&xclient, 0, sizeof(xclient)); | |
| 695 xclient.type = ClientMessage; | |
| 696 xclient.xclient.window = xwindow_; | |
| 697 xclient.xclient.message_type = atom_cache_.GetAtom("_NET_ACTIVE_WINDOW"); | |
| 698 xclient.xclient.format = 32; | |
| 699 xclient.xclient.data.l[0] = 1; // Specified we are an app. | |
| 700 xclient.xclient.data.l[1] = timestamp; | |
| 701 // TODO(thomasanderson): if another chrome window is active, specify that in | |
| 702 // data.l[2]. The EWMH spec claims this may make the WM more likely to | |
| 703 // service our _NET_ACTIVE_WINDOW request. | |
| 704 xclient.xclient.data.l[2] = None; | |
| 705 xclient.xclient.data.l[3] = 0; | |
| 706 xclient.xclient.data.l[4] = 0; | |
| 707 | |
| 708 XSendEvent(xdisplay_, x_root_window_, False, | |
| 709 SubstructureRedirectMask | SubstructureNotifyMask, &xclient); | |
| 710 } else { | |
| 711 XRaiseWindow(xdisplay_, xwindow_); | |
| 712 // Directly ask the X server to give focus to the window. Note that the call | |
| 713 // will raise an X error if the window is not mapped. | |
| 714 XSetInputFocus(xdisplay_, xwindow_, RevertToParent, timestamp); | |
| 715 // At this point, we know we will receive focus, and some tests depend on a | |
| 716 // window being IsActive() immediately after an Activate(), so just set this | |
| 717 // state now. | |
| 718 has_pointer_focus_ = false; | |
| 719 has_window_focus_ = true; | |
| 720 } | |
| 721 AfterActivationStateChanged(); | |
| 621 } | 722 } |
| 622 | 723 |
| 623 void DesktopWindowTreeHostX11::Deactivate() { | 724 void DesktopWindowTreeHostX11::Deactivate() { |
| 624 if (!IsActive()) | 725 BeforeActivationStateChanged(); |
| 625 return; | 726 |
| 727 // Ignore future input events. | |
| 728 ignore_input_ = true; | |
| 626 | 729 |
| 627 ReleaseCapture(); | 730 ReleaseCapture(); |
| 628 X11DesktopHandler::get()->DeactivateWindow(xwindow_); | 731 XLowerWindow(xdisplay_, xwindow_); |
| 732 | |
| 733 AfterActivationStateChanged(); | |
| 629 } | 734 } |
| 630 | 735 |
| 631 bool DesktopWindowTreeHostX11::IsActive() const { | 736 bool DesktopWindowTreeHostX11::IsActive() const { |
| 632 return X11DesktopHandler::get()->IsActiveWindow(xwindow_); | 737 // Focus and stacking order are independent in X11. Since we cannot guarantee |
| 738 // a window is topmost iff it has focus, just use the focus state to determine | |
| 739 // if a window is active. Note that Activate() and Deactivate() change the | |
| 740 // stacking order in addition to changing the focus state. | |
| 741 bool is_active = (has_focus_ || has_pointer_focus_) && !ignore_input_; | |
|
danakj
2016/08/19 23:29:58
FWIW normally an X window will show itself as visi
Tom (Use chromium acct)
2016/08/22 20:27:07
The cross-platform code seems to want a window to
danakj
2016/08/22 20:32:42
OK just to be clear then, when alt-tabbing does th
| |
| 742 | |
| 743 // is_active => window_mapped_ | |
| 744 // !window_mapped_ => !is_active | |
| 745 DCHECK(!is_active || window_mapped_); | |
| 746 | |
| 747 return is_active; | |
| 633 } | 748 } |
| 634 | 749 |
| 635 void DesktopWindowTreeHostX11::Maximize() { | 750 void DesktopWindowTreeHostX11::Maximize() { |
| 636 if (HasWMSpecProperty("_NET_WM_STATE_FULLSCREEN")) { | 751 if (HasWMSpecProperty("_NET_WM_STATE_FULLSCREEN")) { |
| 637 // Unfullscreen the window if it is fullscreen. | 752 // Unfullscreen the window if it is fullscreen. |
| 638 SetWMSpecState(false, | 753 SetWMSpecState(false, |
| 639 atom_cache_.GetAtom("_NET_WM_STATE_FULLSCREEN"), | 754 atom_cache_.GetAtom("_NET_WM_STATE_FULLSCREEN"), |
| 640 None); | 755 None); |
| 641 | 756 |
| 642 // Resize the window so that it does not have the same size as a monitor. | 757 // Resize the window so that it does not have the same size as a monitor. |
| 643 // (Otherwise, some window managers immediately put the window back in | 758 // (Otherwise, some window managers immediately put the window back in |
| 644 // fullscreen mode). | 759 // fullscreen mode). |
| 645 gfx::Rect adjusted_bounds_in_pixels(bounds_in_pixels_.origin(), | 760 gfx::Rect adjusted_bounds_in_pixels(bounds_in_pixels_.origin(), |
| 646 AdjustSize(bounds_in_pixels_.size())); | 761 AdjustSize(bounds_in_pixels_.size())); |
| 647 if (adjusted_bounds_in_pixels != bounds_in_pixels_) | 762 if (adjusted_bounds_in_pixels != bounds_in_pixels_) |
| 648 SetBounds(adjusted_bounds_in_pixels); | 763 SetBounds(adjusted_bounds_in_pixels); |
| 649 } | 764 } |
| 650 | 765 |
| 651 // Some WMs do not respect maximization hints on unmapped windows, so we | 766 // Some WMs do not respect maximization hints on unmapped windows, so we |
| 652 // save this one for later too. | 767 // save this one for later too. |
| 653 should_maximize_after_map_ = !window_mapped_; | 768 should_maximize_after_map_ = !IsVisible(); |
| 654 | 769 |
| 655 // When we are in the process of requesting to maximize a window, we can | 770 // When we are in the process of requesting to maximize a window, we can |
| 656 // accurately keep track of our restored bounds instead of relying on the | 771 // accurately keep track of our restored bounds instead of relying on the |
| 657 // heuristics that are in the PropertyNotify and ConfigureNotify handlers. | 772 // heuristics that are in the PropertyNotify and ConfigureNotify handlers. |
| 658 restored_bounds_in_pixels_ = bounds_in_pixels_; | 773 restored_bounds_in_pixels_ = bounds_in_pixels_; |
| 659 | 774 |
| 660 SetWMSpecState(true, | 775 SetWMSpecState(true, |
| 661 atom_cache_.GetAtom("_NET_WM_STATE_MAXIMIZED_VERT"), | 776 atom_cache_.GetAtom("_NET_WM_STATE_MAXIMIZED_VERT"), |
| 662 atom_cache_.GetAtom("_NET_WM_STATE_MAXIMIZED_HORZ")); | 777 atom_cache_.GetAtom("_NET_WM_STATE_MAXIMIZED_HORZ")); |
| 663 if (IsMinimized()) | 778 if (IsMinimized()) |
| (...skipping 300 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 964 | 1079 |
| 965 void DesktopWindowTreeHostX11::SizeConstraintsChanged() { | 1080 void DesktopWindowTreeHostX11::SizeConstraintsChanged() { |
| 966 UpdateMinAndMaxSize(); | 1081 UpdateMinAndMaxSize(); |
| 967 } | 1082 } |
| 968 | 1083 |
| 969 //////////////////////////////////////////////////////////////////////////////// | 1084 //////////////////////////////////////////////////////////////////////////////// |
| 970 // DesktopWindowTreeHostX11, aura::WindowTreeHost implementation: | 1085 // DesktopWindowTreeHostX11, aura::WindowTreeHost implementation: |
| 971 | 1086 |
| 972 gfx::Transform DesktopWindowTreeHostX11::GetRootTransform() const { | 1087 gfx::Transform DesktopWindowTreeHostX11::GetRootTransform() const { |
| 973 display::Display display = display::Screen::GetScreen()->GetPrimaryDisplay(); | 1088 display::Display display = display::Screen::GetScreen()->GetPrimaryDisplay(); |
| 974 if (window_mapped_) { | 1089 if (IsVisible()) { |
| 975 aura::Window* win = const_cast<aura::Window*>(window()); | 1090 aura::Window* win = const_cast<aura::Window*>(window()); |
| 976 display = display::Screen::GetScreen()->GetDisplayNearestWindow(win); | 1091 display = display::Screen::GetScreen()->GetDisplayNearestWindow(win); |
| 977 } | 1092 } |
| 978 | 1093 |
| 979 float scale = display.device_scale_factor(); | 1094 float scale = display.device_scale_factor(); |
| 980 gfx::Transform transform; | 1095 gfx::Transform transform; |
| 981 transform.Scale(scale, scale); | 1096 transform.Scale(scale, scale); |
| 982 return transform; | 1097 return transform; |
| 983 } | 1098 } |
| 984 | 1099 |
| 985 ui::EventSource* DesktopWindowTreeHostX11::GetEventSource() { | 1100 ui::EventSource* DesktopWindowTreeHostX11::GetEventSource() { |
| 986 return this; | 1101 return this; |
| 987 } | 1102 } |
| 988 | 1103 |
| 989 gfx::AcceleratedWidget DesktopWindowTreeHostX11::GetAcceleratedWidget() { | 1104 gfx::AcceleratedWidget DesktopWindowTreeHostX11::GetAcceleratedWidget() { |
| 990 return xwindow_; | 1105 return xwindow_; |
| 991 } | 1106 } |
| 992 | 1107 |
| 993 void DesktopWindowTreeHostX11::ShowImpl() { | 1108 void DesktopWindowTreeHostX11::ShowImpl() { |
| 994 ShowWindowWithState(ui::SHOW_STATE_NORMAL); | 1109 ShowWindowWithState(ui::SHOW_STATE_NORMAL); |
| 995 native_widget_delegate_->OnNativeWidgetVisibilityChanged(true); | 1110 native_widget_delegate_->OnNativeWidgetVisibilityChanged(true); |
| 996 } | 1111 } |
| 997 | 1112 |
| 998 void DesktopWindowTreeHostX11::HideImpl() { | 1113 void DesktopWindowTreeHostX11::HideImpl() { |
| 999 if (window_mapped_) { | 1114 if (IsVisible()) { |
| 1000 XWithdrawWindow(xdisplay_, xwindow_, 0); | 1115 XWithdrawWindow(xdisplay_, xwindow_, 0); |
| 1001 window_mapped_ = false; | |
| 1002 wait_for_unmap_ = true; | 1116 wait_for_unmap_ = true; |
| 1003 } | 1117 } |
| 1004 native_widget_delegate_->OnNativeWidgetVisibilityChanged(false); | 1118 native_widget_delegate_->OnNativeWidgetVisibilityChanged(false); |
| 1005 } | 1119 } |
| 1006 | 1120 |
| 1007 gfx::Rect DesktopWindowTreeHostX11::GetBounds() const { | 1121 gfx::Rect DesktopWindowTreeHostX11::GetBounds() const { |
| 1008 return bounds_in_pixels_; | 1122 return bounds_in_pixels_; |
| 1009 } | 1123 } |
| 1010 | 1124 |
| 1011 void DesktopWindowTreeHostX11::SetBounds( | 1125 void DesktopWindowTreeHostX11::SetBounds( |
| (...skipping 405 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1417 insets.size() == 4) { | 1531 insets.size() == 4) { |
| 1418 // |insets| are returned in the order: [left, right, top, bottom]. | 1532 // |insets| are returned in the order: [left, right, top, bottom]. |
| 1419 native_window_frame_borders_in_pixels_ = | 1533 native_window_frame_borders_in_pixels_ = |
| 1420 gfx::Insets(insets[2], insets[0], insets[3], insets[1]); | 1534 gfx::Insets(insets[2], insets[0], insets[3], insets[1]); |
| 1421 } else { | 1535 } else { |
| 1422 native_window_frame_borders_in_pixels_ = gfx::Insets(); | 1536 native_window_frame_borders_in_pixels_ = gfx::Insets(); |
| 1423 } | 1537 } |
| 1424 } | 1538 } |
| 1425 | 1539 |
| 1426 void DesktopWindowTreeHostX11::UpdateMinAndMaxSize() { | 1540 void DesktopWindowTreeHostX11::UpdateMinAndMaxSize() { |
| 1427 if (!window_mapped_) | 1541 if (!IsVisible()) |
| 1428 return; | 1542 return; |
| 1429 | 1543 |
| 1430 gfx::Size minimum_in_pixels = | 1544 gfx::Size minimum_in_pixels = |
| 1431 ToPixelRect(gfx::Rect(native_widget_delegate_->GetMinimumSize())).size(); | 1545 ToPixelRect(gfx::Rect(native_widget_delegate_->GetMinimumSize())).size(); |
| 1432 gfx::Size maximum_in_pixels = | 1546 gfx::Size maximum_in_pixels = |
| 1433 ToPixelRect(gfx::Rect(native_widget_delegate_->GetMaximumSize())).size(); | 1547 ToPixelRect(gfx::Rect(native_widget_delegate_->GetMaximumSize())).size(); |
| 1434 if (min_size_in_pixels_ == minimum_in_pixels && | 1548 if (min_size_in_pixels_ == minimum_in_pixels && |
| 1435 max_size_in_pixels_ == maximum_in_pixels) | 1549 max_size_in_pixels_ == maximum_in_pixels) |
| 1436 return; | 1550 return; |
| 1437 | 1551 |
| (...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1473 unsigned long wm_user_time_ms = static_cast<unsigned long>( | 1587 unsigned long wm_user_time_ms = static_cast<unsigned long>( |
| 1474 (ui::EventTimeFromNative(event) - base::TimeTicks()).InMilliseconds()); | 1588 (ui::EventTimeFromNative(event) - base::TimeTicks()).InMilliseconds()); |
| 1475 XChangeProperty(xdisplay_, | 1589 XChangeProperty(xdisplay_, |
| 1476 xwindow_, | 1590 xwindow_, |
| 1477 atom_cache_.GetAtom("_NET_WM_USER_TIME"), | 1591 atom_cache_.GetAtom("_NET_WM_USER_TIME"), |
| 1478 XA_CARDINAL, | 1592 XA_CARDINAL, |
| 1479 32, | 1593 32, |
| 1480 PropModeReplace, | 1594 PropModeReplace, |
| 1481 reinterpret_cast<const unsigned char *>(&wm_user_time_ms), | 1595 reinterpret_cast<const unsigned char *>(&wm_user_time_ms), |
| 1482 1); | 1596 1); |
| 1483 X11DesktopHandler::get()->set_wm_user_time_ms(wm_user_time_ms); | |
| 1484 } | 1597 } |
| 1485 } | 1598 } |
| 1486 | 1599 |
| 1487 void DesktopWindowTreeHostX11::SetWMSpecState(bool enabled, | 1600 void DesktopWindowTreeHostX11::SetWMSpecState(bool enabled, |
| 1488 ::Atom state1, | 1601 ::Atom state1, |
| 1489 ::Atom state2) { | 1602 ::Atom state2) { |
| 1490 XEvent xclient; | 1603 XEvent xclient; |
| 1491 memset(&xclient, 0, sizeof(xclient)); | 1604 memset(&xclient, 0, sizeof(xclient)); |
| 1492 xclient.type = ClientMessage; | 1605 xclient.type = ClientMessage; |
| 1493 xclient.xclient.window = xwindow_; | 1606 xclient.xclient.window = xwindow_; |
| (...skipping 180 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1674 // will ignore toplevel XMoveWindow commands. | 1787 // will ignore toplevel XMoveWindow commands. |
| 1675 XSizeHints size_hints; | 1788 XSizeHints size_hints; |
| 1676 size_hints.flags = PPosition; | 1789 size_hints.flags = PPosition; |
| 1677 size_hints.x = bounds_in_pixels_.x(); | 1790 size_hints.x = bounds_in_pixels_.x(); |
| 1678 size_hints.y = bounds_in_pixels_.y(); | 1791 size_hints.y = bounds_in_pixels_.y(); |
| 1679 XSetWMNormalHints(xdisplay_, xwindow_, &size_hints); | 1792 XSetWMNormalHints(xdisplay_, xwindow_, &size_hints); |
| 1680 | 1793 |
| 1681 // If SHOW_STATE_INACTIVE, tell the window manager not to focus the window | 1794 // If SHOW_STATE_INACTIVE, tell the window manager not to focus the window |
| 1682 // when mapping. This is done by setting the _NET_WM_USER_TIME to 0. See e.g. | 1795 // when mapping. This is done by setting the _NET_WM_USER_TIME to 0. See e.g. |
| 1683 // http://standards.freedesktop.org/wm-spec/latest/ar01s05.html | 1796 // http://standards.freedesktop.org/wm-spec/latest/ar01s05.html |
| 1684 unsigned long wm_user_time_ms = (show_state == ui::SHOW_STATE_INACTIVE) ? | 1797 ignore_input_ = show_state == ui::SHOW_STATE_INACTIVE; |
| 1685 0 : X11DesktopHandler::get()->wm_user_time_ms(); | 1798 unsigned long wm_user_time_ms = |
| 1799 ignore_input_ ? 0 : ui::X11EventSource::GetInstance()->GetTimestamp(); | |
| 1686 if (show_state == ui::SHOW_STATE_INACTIVE || wm_user_time_ms != 0) { | 1800 if (show_state == ui::SHOW_STATE_INACTIVE || wm_user_time_ms != 0) { |
| 1687 XChangeProperty(xdisplay_, | 1801 XChangeProperty( |
| 1688 xwindow_, | 1802 xdisplay_, xwindow_, atom_cache_.GetAtom("_NET_WM_USER_TIME"), |
| 1689 atom_cache_.GetAtom("_NET_WM_USER_TIME"), | 1803 XA_CARDINAL, 32, PropModeReplace, |
| 1690 XA_CARDINAL, | 1804 reinterpret_cast<const unsigned char*>(&wm_user_time_ms), 1); |
| 1691 32, | |
| 1692 PropModeReplace, | |
| 1693 reinterpret_cast<const unsigned char *>(&wm_user_time_ms), | |
| 1694 1); | |
| 1695 } | 1805 } |
| 1696 | 1806 |
| 1697 ui::X11EventSource* event_source = ui::X11EventSource::GetInstance(); | 1807 ui::X11EventSource* event_source = ui::X11EventSource::GetInstance(); |
| 1698 DCHECK(event_source); | 1808 DCHECK(event_source); |
| 1699 | 1809 |
| 1700 if (wait_for_unmap_) { | 1810 if (wait_for_unmap_) { |
| 1701 // Block until our window is unmapped. This avoids a race condition when | 1811 // Block until our window is unmapped. This avoids a race condition when |
| 1702 // remapping an unmapped window. | 1812 // remapping an unmapped window. |
| 1703 event_source->BlockUntilWindowUnmapped(xwindow_); | 1813 event_source->BlockUntilWindowUnmapped(xwindow_); |
| 1704 DCHECK(!wait_for_unmap_); | 1814 DCHECK(!wait_for_unmap_); |
| (...skipping 41 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1746 TRACE_EVENT1("views", "DesktopWindowTreeHostX11::Dispatch", | 1856 TRACE_EVENT1("views", "DesktopWindowTreeHostX11::Dispatch", |
| 1747 "event->type", event->type); | 1857 "event->type", event->type); |
| 1748 | 1858 |
| 1749 UpdateWMUserTime(event); | 1859 UpdateWMUserTime(event); |
| 1750 | 1860 |
| 1751 // May want to factor CheckXEventForConsistency(xev); into a common location | 1861 // May want to factor CheckXEventForConsistency(xev); into a common location |
| 1752 // since it is called here. | 1862 // since it is called here. |
| 1753 switch (xev->type) { | 1863 switch (xev->type) { |
| 1754 case EnterNotify: | 1864 case EnterNotify: |
| 1755 case LeaveNotify: { | 1865 case LeaveNotify: { |
| 1866 OnCrossingEvent(xev->type == EnterNotify, xev->xcrossing.focus, | |
| 1867 xev->xcrossing.detail); | |
| 1868 | |
| 1756 // Ignore EventNotify and LeaveNotify events from children of |xwindow_|. | 1869 // Ignore EventNotify and LeaveNotify events from children of |xwindow_|. |
| 1757 // NativeViewGLSurfaceGLX adds a child to |xwindow_|. | 1870 // NativeViewGLSurfaceGLX adds a child to |xwindow_|. |
| 1758 // TODO(pkotwicz|tdanderson): Figure out whether the suppression is | 1871 if (xev->xcrossing.detail != NotifyInferior) { |
| 1759 // necessary. crbug.com/385716 | 1872 ui::MouseEvent mouse_event(xev); |
| 1760 if (xev->xcrossing.detail == NotifyInferior) | 1873 DispatchMouseEvent(&mouse_event); |
| 1761 break; | 1874 } |
| 1762 | |
| 1763 ui::MouseEvent mouse_event(xev); | |
| 1764 DispatchMouseEvent(&mouse_event); | |
| 1765 break; | 1875 break; |
| 1766 } | 1876 } |
| 1767 case Expose: { | 1877 case Expose: { |
| 1768 gfx::Rect damage_rect_in_pixels(xev->xexpose.x, xev->xexpose.y, | 1878 gfx::Rect damage_rect_in_pixels(xev->xexpose.x, xev->xexpose.y, |
| 1769 xev->xexpose.width, xev->xexpose.height); | 1879 xev->xexpose.width, xev->xexpose.height); |
| 1770 compositor()->ScheduleRedrawRect(damage_rect_in_pixels); | 1880 compositor()->ScheduleRedrawRect(damage_rect_in_pixels); |
| 1771 break; | 1881 break; |
| 1772 } | 1882 } |
| 1773 case KeyPress: { | 1883 case KeyPress: { |
| 1774 ui::KeyEvent keydown_event(xev); | 1884 ui::KeyEvent keydown_event(xev); |
| 1775 DispatchKeyEvent(&keydown_event); | 1885 DispatchKeyEvent(&keydown_event); |
| 1776 break; | 1886 break; |
| 1777 } | 1887 } |
| 1778 case KeyRelease: { | 1888 case KeyRelease: { |
| 1779 // There is no way to deactivate a window in X11 so ignore input if | 1889 // There is no way to deactivate a window in X11 so ignore input if |
| 1780 // window is supposed to be 'inactive'. See comments in | 1890 // window is supposed to be 'inactive'. |
| 1781 // X11DesktopHandler::DeactivateWindow() for more details. | |
| 1782 if (!IsActive() && !HasCapture()) | 1891 if (!IsActive() && !HasCapture()) |
| 1783 break; | 1892 break; |
| 1784 | 1893 |
| 1785 ui::KeyEvent key_event(xev); | 1894 ui::KeyEvent key_event(xev); |
| 1786 DispatchKeyEvent(&key_event); | 1895 DispatchKeyEvent(&key_event); |
| 1787 break; | 1896 break; |
| 1788 } | 1897 } |
| 1789 case ButtonPress: | 1898 case ButtonPress: |
| 1790 case ButtonRelease: { | 1899 case ButtonRelease: { |
| 1791 ui::EventType event_type = ui::EventTypeFromNative(xev); | 1900 ui::EventType event_type = ui::EventTypeFromNative(xev); |
| (...skipping 10 matching lines...) Expand all Loading... | |
| 1802 break; | 1911 break; |
| 1803 } | 1912 } |
| 1804 case ui::ET_UNKNOWN: | 1913 case ui::ET_UNKNOWN: |
| 1805 // No event is created for X11-release events for mouse-wheel buttons. | 1914 // No event is created for X11-release events for mouse-wheel buttons. |
| 1806 break; | 1915 break; |
| 1807 default: | 1916 default: |
| 1808 NOTREACHED() << event_type; | 1917 NOTREACHED() << event_type; |
| 1809 } | 1918 } |
| 1810 break; | 1919 break; |
| 1811 } | 1920 } |
| 1812 case FocusOut: | 1921 case FocusIn: |
| 1813 if (xev->xfocus.mode != NotifyGrab) { | 1922 case FocusOut: { |
|
danakj
2016/08/19 21:43:45
nit: {} are not needed since there's no vars decla
Tom (Use chromium acct)
2016/08/22 20:27:07
Done.
| |
| 1814 ReleaseCapture(); | 1923 OnFocusEvent(xev->type == FocusIn, event->xfocus.mode, |
| 1815 OnHostLostWindowCapture(); | 1924 event->xfocus.detail); |
| 1816 X11DesktopHandler::get()->ProcessXEvent(xev); | |
| 1817 } else { | |
| 1818 dispatcher()->OnHostLostMouseGrab(); | |
| 1819 } | |
| 1820 break; | 1925 break; |
| 1821 case FocusIn: | 1926 } |
| 1822 X11DesktopHandler::get()->ProcessXEvent(xev); | |
| 1823 break; | |
| 1824 case ConfigureNotify: { | 1927 case ConfigureNotify: { |
| 1825 DCHECK_EQ(xwindow_, xev->xconfigure.window); | 1928 DCHECK_EQ(xwindow_, xev->xconfigure.window); |
| 1826 DCHECK_EQ(xwindow_, xev->xconfigure.event); | 1929 DCHECK_EQ(xwindow_, xev->xconfigure.event); |
| 1827 // It's possible that the X window may be resized by some other means than | 1930 // It's possible that the X window may be resized by some other means than |
| 1828 // from within aura (e.g. the X window manager can change the size). Make | 1931 // from within aura (e.g. the X window manager can change the size). Make |
| 1829 // sure the root window size is maintained properly. | 1932 // sure the root window size is maintained properly. |
| 1830 int translated_x_in_pixels = xev->xconfigure.x; | 1933 int translated_x_in_pixels = xev->xconfigure.x; |
| 1831 int translated_y_in_pixels = xev->xconfigure.y; | 1934 int translated_y_in_pixels = xev->xconfigure.y; |
| 1832 if (!xev->xconfigure.send_event && !xev->xconfigure.override_redirect) { | 1935 if (!xev->xconfigure.send_event && !xev->xconfigure.override_redirect) { |
| 1833 Window unused; | 1936 Window unused; |
| (...skipping 19 matching lines...) Expand all Loading... | |
| 1853 base::ThreadTaskRunnerHandle::Get()->PostTask( | 1956 base::ThreadTaskRunnerHandle::Get()->PostTask( |
| 1854 FROM_HERE, delayed_resize_task_.callback()); | 1957 FROM_HERE, delayed_resize_task_.callback()); |
| 1855 } | 1958 } |
| 1856 break; | 1959 break; |
| 1857 } | 1960 } |
| 1858 case GenericEvent: { | 1961 case GenericEvent: { |
| 1859 ui::TouchFactory* factory = ui::TouchFactory::GetInstance(); | 1962 ui::TouchFactory* factory = ui::TouchFactory::GetInstance(); |
| 1860 if (!factory->ShouldProcessXI2Event(xev)) | 1963 if (!factory->ShouldProcessXI2Event(xev)) |
| 1861 break; | 1964 break; |
| 1862 | 1965 |
| 1966 XIEnterEvent* enter_event = static_cast<XIEnterEvent*>(xev->xcookie.data); | |
| 1967 switch (static_cast<XIEvent*>(xev->xcookie.data)->evtype) { | |
| 1968 case XI_Enter: | |
| 1969 case XI_Leave: | |
| 1970 OnCrossingEvent(enter_event->evtype == XI_Enter, enter_event->focus, | |
| 1971 enter_event->detail); | |
| 1972 break; | |
| 1973 case XI_FocusIn: | |
| 1974 case XI_FocusOut: | |
| 1975 OnFocusEvent(enter_event->evtype == XI_FocusIn, enter_event->mode, | |
|
danakj
2016/08/19 23:59:30
Would you consider rewriting the mode to non-XI co
Tom (Use chromium acct)
2016/08/22 20:27:07
Done.
| |
| 1976 enter_event->detail); | |
| 1977 break; | |
| 1978 default: | |
| 1979 break; | |
| 1980 } | |
| 1981 | |
| 1863 ui::EventType type = ui::EventTypeFromNative(xev); | 1982 ui::EventType type = ui::EventTypeFromNative(xev); |
| 1864 XEvent last_event; | 1983 XEvent last_event; |
| 1865 int num_coalesced = 0; | 1984 int num_coalesced = 0; |
| 1866 | 1985 |
| 1867 switch (type) { | 1986 switch (type) { |
| 1868 case ui::ET_TOUCH_MOVED: | 1987 case ui::ET_TOUCH_MOVED: |
| 1869 num_coalesced = ui::CoalescePendingMotionEvents(xev, &last_event); | 1988 num_coalesced = ui::CoalescePendingMotionEvents(xev, &last_event); |
| 1870 if (num_coalesced > 0) | 1989 if (num_coalesced > 0) |
| 1871 xev = &last_event; | 1990 xev = &last_event; |
| 1872 // fallthrough | 1991 // fallthrough |
| (...skipping 60 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1933 | 2052 |
| 1934 // Some WMs only respect maximize hints after the window has been mapped. | 2053 // Some WMs only respect maximize hints after the window has been mapped. |
| 1935 // Check whether we need to re-do a maximization. | 2054 // Check whether we need to re-do a maximization. |
| 1936 if (should_maximize_after_map_) { | 2055 if (should_maximize_after_map_) { |
| 1937 Maximize(); | 2056 Maximize(); |
| 1938 should_maximize_after_map_ = false; | 2057 should_maximize_after_map_ = false; |
| 1939 } | 2058 } |
| 1940 | 2059 |
| 1941 break; | 2060 break; |
| 1942 } | 2061 } |
| 1943 case UnmapNotify: { | 2062 case UnmapNotify: { |
|
danakj
2016/08/19 21:43:45
jw do we care about DestroyNotify? Presumably no..
Tom (Use chromium acct)
2016/08/22 20:27:07
no
| |
| 2063 window_mapped_ = false; | |
| 1944 wait_for_unmap_ = false; | 2064 wait_for_unmap_ = false; |
| 2065 has_pointer_ = false; | |
| 2066 has_pointer_grab_ = false; | |
| 2067 has_pointer_focus_ = false; | |
| 2068 has_window_focus_ = false; | |
| 2069 has_focus_ = false; | |
| 1945 FOR_EACH_OBSERVER(DesktopWindowTreeHostObserverX11, | 2070 FOR_EACH_OBSERVER(DesktopWindowTreeHostObserverX11, |
| 1946 observer_list_, | 2071 observer_list_, |
| 1947 OnWindowUnmapped(xwindow_)); | 2072 OnWindowUnmapped(xwindow_)); |
| 1948 break; | 2073 break; |
| 1949 } | 2074 } |
| 1950 case ClientMessage: { | 2075 case ClientMessage: { |
| 1951 Atom message_type = xev->xclient.message_type; | 2076 Atom message_type = xev->xclient.message_type; |
| 1952 if (message_type == atom_cache_.GetAtom("WM_PROTOCOLS")) { | 2077 if (message_type == atom_cache_.GetAtom("WM_PROTOCOLS")) { |
| 1953 Atom protocol = static_cast<Atom>(xev->xclient.data.l[0]); | 2078 Atom protocol = static_cast<Atom>(xev->xclient.data.l[0]); |
| 1954 if (protocol == atom_cache_.GetAtom("WM_DELETE_WINDOW")) { | 2079 if (protocol == atom_cache_.GetAtom("WM_DELETE_WINDOW")) { |
| (...skipping 139 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 2094 if (linux_ui) { | 2219 if (linux_ui) { |
| 2095 ui::NativeTheme* native_theme = linux_ui->GetNativeTheme(window); | 2220 ui::NativeTheme* native_theme = linux_ui->GetNativeTheme(window); |
| 2096 if (native_theme) | 2221 if (native_theme) |
| 2097 return native_theme; | 2222 return native_theme; |
| 2098 } | 2223 } |
| 2099 | 2224 |
| 2100 return ui::NativeThemeAura::instance(); | 2225 return ui::NativeThemeAura::instance(); |
| 2101 } | 2226 } |
| 2102 | 2227 |
| 2103 } // namespace views | 2228 } // namespace views |
| OLD | NEW |