1a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch// Copyright 2014 The Chromium Authors. All rights reserved. 2a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch// Use of this source code is governed by a BSD-style license that can be 3a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch// found in the LICENSE file. 4a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch 5a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch#include "ash/host/ash_window_tree_host_x11.h" 6a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch 7a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch#include <X11/extensions/Xfixes.h> 8a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch#include <X11/extensions/XInput2.h> 9a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch#include <X11/Xatom.h> 10a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch#include <X11/Xlib.h> 11a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch 12a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch#include <string> 13a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch#include <vector> 14a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch 15cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "ash/host/ash_window_tree_host_init_params.h" 16a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch#include "ash/host/root_window_transformer.h" 17a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch#include "base/basictypes.h" 18a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch#include "base/sys_info.h" 19a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch#include "ui/aura/client/screen_position_client.h" 20a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch#include "ui/aura/env.h" 21a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch#include "ui/aura/window.h" 22cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "ui/aura/window_event_dispatcher.h" 23a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch#include "ui/base/x/x11_util.h" 24116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "ui/events/device_data_manager.h" 25a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch#include "ui/events/event.h" 26a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch#include "ui/events/event_utils.h" 27cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "ui/events/platform/platform_event_source.h" 28a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch#include "ui/events/x/device_list_cache_x.h" 29a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch#include "ui/events/x/touch_factory_x11.h" 30a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch#include "ui/gfx/rect.h" 31a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch#include "ui/gfx/screen.h" 32a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch 33a02191e04bc25c4935f804f2c080ae28663d096dBen Murdochnamespace ash { 34a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch 35a02191e04bc25c4935f804f2c080ae28663d096dBen MurdochAshWindowTreeHostX11::AshWindowTreeHostX11(const gfx::Rect& initial_bounds) 36a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch : WindowTreeHostX11(initial_bounds), 37cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) transformer_helper_(this), 38cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) display_ids_(std::make_pair(gfx::Display::kInvalidDisplayID, 39cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) gfx::Display::kInvalidDisplayID)) { 40a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch aura::Env::GetInstance()->AddObserver(this); 41a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch} 42a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch 43a02191e04bc25c4935f804f2c080ae28663d096dBen MurdochAshWindowTreeHostX11::~AshWindowTreeHostX11() { 44a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch aura::Env::GetInstance()->RemoveObserver(this); 45a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch UnConfineCursor(); 46a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch} 47a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch 48a02191e04bc25c4935f804f2c080ae28663d096dBen Murdochvoid AshWindowTreeHostX11::ToggleFullScreen() { NOTIMPLEMENTED(); } 49a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch 50a02191e04bc25c4935f804f2c080ae28663d096dBen Murdochbool AshWindowTreeHostX11::ConfineCursorToRootWindow() { 51a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch#if XFIXES_MAJOR >= 5 52a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch DCHECK(!pointer_barriers_.get()); 53a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch if (pointer_barriers_) 54a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch return false; 55a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch pointer_barriers_.reset(new XID[4]); 56a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch gfx::Rect barrier(bounds()); 57a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch barrier.Inset(transformer_helper_.GetHostInsets()); 58a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch // Horizontal, top barriers. 59a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch pointer_barriers_[0] = XFixesCreatePointerBarrier(xdisplay(), 60a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch x_root_window(), 61a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch barrier.x(), 62a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch barrier.y(), 63a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch barrier.right(), 64a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch barrier.y(), 65a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch BarrierPositiveY, 66a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch 0, 67a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch XIAllDevices); 68a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch // Horizontal, bottom barriers. 69a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch pointer_barriers_[1] = XFixesCreatePointerBarrier(xdisplay(), 70a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch x_root_window(), 71a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch barrier.x(), 72a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch barrier.bottom(), 73a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch barrier.right(), 74a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch barrier.bottom(), 75a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch BarrierNegativeY, 76a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch 0, 77a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch XIAllDevices); 78a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch // Vertical, left barriers. 79a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch pointer_barriers_[2] = XFixesCreatePointerBarrier(xdisplay(), 80a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch x_root_window(), 81a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch barrier.x(), 82a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch barrier.y(), 83a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch barrier.x(), 84a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch barrier.bottom(), 85a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch BarrierPositiveX, 86a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch 0, 87a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch XIAllDevices); 88a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch // Vertical, right barriers. 89a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch pointer_barriers_[3] = XFixesCreatePointerBarrier(xdisplay(), 90a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch x_root_window(), 91a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch barrier.right(), 92a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch barrier.y(), 93a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch barrier.right(), 94a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch barrier.bottom(), 95a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch BarrierNegativeX, 96a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch 0, 97a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch XIAllDevices); 98a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch#endif 99a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch return true; 100a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch} 101a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch 102a02191e04bc25c4935f804f2c080ae28663d096dBen Murdochvoid AshWindowTreeHostX11::UnConfineCursor() { 103a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch#if XFIXES_MAJOR >= 5 104a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch if (pointer_barriers_) { 105a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch XFixesDestroyPointerBarrier(xdisplay(), pointer_barriers_[0]); 106a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch XFixesDestroyPointerBarrier(xdisplay(), pointer_barriers_[1]); 107a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch XFixesDestroyPointerBarrier(xdisplay(), pointer_barriers_[2]); 108a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch XFixesDestroyPointerBarrier(xdisplay(), pointer_barriers_[3]); 109a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch pointer_barriers_.reset(); 110a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch } 111a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch#endif 112a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch} 113a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch 114a02191e04bc25c4935f804f2c080ae28663d096dBen Murdochvoid AshWindowTreeHostX11::SetRootWindowTransformer( 115a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch scoped_ptr<RootWindowTransformer> transformer) { 116a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch transformer_helper_.SetRootWindowTransformer(transformer.Pass()); 117a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch if (pointer_barriers_) { 118a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch UnConfineCursor(); 119a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch ConfineCursorToRootWindow(); 120a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch } 121a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch} 122a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch 123cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)gfx::Insets AshWindowTreeHostX11::GetHostInsets() const { 124cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) return transformer_helper_.GetHostInsets(); 125cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)} 126cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 127a02191e04bc25c4935f804f2c080ae28663d096dBen Murdochaura::WindowTreeHost* AshWindowTreeHostX11::AsWindowTreeHost() { return this; } 128a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch 129cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)void AshWindowTreeHostX11::UpdateDisplayID(int64 id1, int64 id2) { 130cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) display_ids_.first = id1; 131cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) display_ids_.second = id2; 132cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)} 133cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 134cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)void AshWindowTreeHostX11::PrepareForShutdown() { 135cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) if (ui::PlatformEventSource::GetInstance()) 136cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) ui::PlatformEventSource::GetInstance()->RemovePlatformEventDispatcher(this); 137cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)} 138cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 139a02191e04bc25c4935f804f2c080ae28663d096dBen Murdochvoid AshWindowTreeHostX11::SetBounds(const gfx::Rect& bounds) { 140a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch WindowTreeHostX11::SetBounds(bounds); 141a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch if (pointer_barriers_) { 142a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch UnConfineCursor(); 143a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch ConfineCursorToRootWindow(); 144a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch } 145a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch} 146a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch 147a02191e04bc25c4935f804f2c080ae28663d096dBen Murdochgfx::Transform AshWindowTreeHostX11::GetRootTransform() const { 148a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch return transformer_helper_.GetTransform(); 149a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch} 150a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch 151a02191e04bc25c4935f804f2c080ae28663d096dBen Murdochvoid AshWindowTreeHostX11::SetRootTransform(const gfx::Transform& transform) { 152a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch transformer_helper_.SetTransform(transform); 153a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch} 154a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch 155a02191e04bc25c4935f804f2c080ae28663d096dBen Murdochgfx::Transform AshWindowTreeHostX11::GetInverseRootTransform() const { 156a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch return transformer_helper_.GetInverseTransform(); 157a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch} 158a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch 159a02191e04bc25c4935f804f2c080ae28663d096dBen Murdochvoid AshWindowTreeHostX11::UpdateRootWindowSize(const gfx::Size& host_size) { 160a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch transformer_helper_.UpdateWindowSize(host_size); 161a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch} 162a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch 163a02191e04bc25c4935f804f2c080ae28663d096dBen Murdochvoid AshWindowTreeHostX11::OnCursorVisibilityChangedNative(bool show) { 164cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#if defined(OS_CHROMEOS) 165a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch SetCrOSTapPaused(!show); 166cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#endif 167a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch} 168a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch 169a02191e04bc25c4935f804f2c080ae28663d096dBen Murdochvoid AshWindowTreeHostX11::OnWindowInitialized(aura::Window* window) {} 170a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch 171a02191e04bc25c4935f804f2c080ae28663d096dBen Murdochvoid AshWindowTreeHostX11::OnHostInitialized(aura::WindowTreeHost* host) { 172a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch if (host != AsWindowTreeHost()) 173a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch return; 174a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch 175cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#if defined(OS_CHROMEOS) 176a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch // We have to enable Tap-to-click by default because the cursor is set to 177a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch // visible in Shell::InitRootWindowController. 178a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch SetCrOSTapPaused(false); 179cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#endif 180a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch} 181a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch 182a02191e04bc25c4935f804f2c080ae28663d096dBen Murdochvoid AshWindowTreeHostX11::OnConfigureNotify() { 183a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch // Always update barrier and mouse location because |bounds_| might 184a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch // have already been updated in |SetBounds|. 185a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch if (pointer_barriers_) { 186a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch UnConfineCursor(); 187a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch ConfineCursorToRootWindow(); 188a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch } 189a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch} 190a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch 191cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)bool AshWindowTreeHostX11::CanDispatchEvent(const ui::PlatformEvent& event) { 192cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) if(!WindowTreeHostX11::CanDispatchEvent(event)) 193cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) return false; 194cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) XEvent* xev = event; 195cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) ui::EventType type = ui::EventTypeFromNative(xev); 196cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // For touch event, check if the root window is residing on the according 197cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // touch display. 198cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) switch (type) { 199a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch case ui::ET_TOUCH_MOVED: 200a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch case ui::ET_TOUCH_PRESSED: 201a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch case ui::ET_TOUCH_CANCELLED: 202a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch case ui::ET_TOUCH_RELEASED: { 203cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#if defined(OS_CHROMEOS) 204cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) XIDeviceEvent* xiev = static_cast<XIDeviceEvent*>(xev->xcookie.data); 205cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) int64 touch_display_id = 206cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) ui::DeviceDataManager::GetInstance()->GetDisplayForTouchDevice( 207cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) xiev->deviceid); 208cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // If we don't have record of display id for this touch device, check 209cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // that if the event is within the bound of the root window. Note 210cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // that in multi-monitor case, the event position is in framebuffer 211cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // space so the bounds check will not work so well. 212cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) if (touch_display_id == gfx::Display::kInvalidDisplayID) { 213cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) if (base::SysInfo::IsRunningOnChromeOS() && 214cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) !bounds().Contains(ui::EventLocationFromNative(xev))) 215cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) return false; 216cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) } else if (touch_display_id != display_ids_.first && 217cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) touch_display_id != display_ids_.second) { 218cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) return false; 219a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch } 220cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#endif // defined(OS_CHROMEOS) 221cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) return true; 222a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch } 223cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) default: 224cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) return true; 225cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) } 226cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)} 227cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)void AshWindowTreeHostX11::TranslateAndDispatchLocatedEvent( 228cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) ui::LocatedEvent* event) { 229cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) if (!event->IsTouchEvent()) { 230cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) aura::Window* root_window = window(); 231cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) aura::client::ScreenPositionClient* screen_position_client = 232cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) aura::client::GetScreenPositionClient(root_window); 233cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) gfx::Rect local(bounds().size()); 234cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) local.Inset(transformer_helper_.GetHostInsets()); 235cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 236cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) if (screen_position_client && !local.Contains(event->location())) { 237cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) gfx::Point location(event->location()); 238cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // In order to get the correct point in screen coordinates 239cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // during passive grab, we first need to find on which host window 240cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // the mouse is on, and find out the screen coordinates on that 241cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // host window, then convert it back to this host window's coordinate. 242cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) screen_position_client->ConvertHostPointToScreen(root_window, 243cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) &location); 244cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) screen_position_client->ConvertPointFromScreen(root_window, &location); 245cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) ConvertPointToHost(&location); 246cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) event->set_location(location); 247cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) event->set_root_location(location); 248a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch } 249a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch } 250a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch SendEventToProcessor(event); 251a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch} 252a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch 253cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#if defined(OS_CHROMEOS) 254a02191e04bc25c4935f804f2c080ae28663d096dBen Murdochvoid AshWindowTreeHostX11::SetCrOSTapPaused(bool state) { 255a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch if (!ui::IsXInput2Available()) 256a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch return; 257a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch // Temporarily pause tap-to-click when the cursor is hidden. 258a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch Atom prop = atom_cache()->GetAtom("Tap Paused"); 259a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch unsigned char value = state; 260a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch XIDeviceList dev_list = 261a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch ui::DeviceListCacheX::GetInstance()->GetXI2DeviceList(xdisplay()); 262a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch 263a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch // Only slave pointer devices could possibly have tap-paused property. 264a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch for (int i = 0; i < dev_list.count; i++) { 265a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch if (dev_list[i].use == XISlavePointer) { 266a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch Atom old_type; 267a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch int old_format; 268a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch unsigned long old_nvalues, bytes; 269a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch unsigned char* data; 270a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch int result = XIGetProperty(xdisplay(), 271a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch dev_list[i].deviceid, 272a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch prop, 273a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch 0, 274a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch 0, 275a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch False, 276a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch AnyPropertyType, 277a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch &old_type, 278a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch &old_format, 279a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch &old_nvalues, 280a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch &bytes, 281a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch &data); 282a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch if (result != Success) 283a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch continue; 284a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch XFree(data); 285a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch XIChangeProperty(xdisplay(), 286a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch dev_list[i].deviceid, 287a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch prop, 288a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch XA_INTEGER, 289a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch 8, 290a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch PropModeReplace, 291a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch &value, 292a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch 1); 293a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch } 294a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch } 295a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch} 296cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#endif 297a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch 298cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)AshWindowTreeHost* AshWindowTreeHost::Create( 299cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) const AshWindowTreeHostInitParams& init_params) { 300cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) return new AshWindowTreeHostX11(init_params.initial_bounds); 301a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch} 302a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch 303a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch} // namespace ash 304