app_list_linux.cc revision f2477e01787aa58f445919b809d89e252beef54f
1ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown// Copyright 2013 The Chromium Authors. All rights reserved. 2ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown// Use of this source code is governed by a BSD-style license that can be 3ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown// found in the LICENSE file. 4ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 5ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#include "chrome/browser/ui/views/app_list/linux/app_list_linux.h" 6ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 7ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#include "base/location.h" 8ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#include "base/single_thread_task_runner.h" 9ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#include "base/thread_task_runner_handle.h" 10ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#include "chrome/browser/profiles/profile.h" 11ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#include "ui/app_list/views/app_list_view.h" 12ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#include "ui/gfx/screen.h" 13ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#include "ui/views/widget/widget.h" 14ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 15ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownAppListLinux::AppListLinux(app_list::AppListView* view, 16ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown const base::Closure& on_should_dismiss) 17ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown : view_(view), 18ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown window_icon_updated_(false), 19ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown on_should_dismiss_(on_should_dismiss) { 20ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown view_->AddObserver(this); 21ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown} 22ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 23ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownAppListLinux::~AppListLinux() { 24ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown view_->RemoveObserver(this); 25ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown} 26ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 27ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownvoid AppListLinux::Show() { 28ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown view_->GetWidget()->Show(); 29ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown if (!window_icon_updated_) { 30ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown view_->GetWidget()->GetTopLevelWidget()->UpdateWindowIcon(); 31ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown window_icon_updated_ = true; 32ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown } 33ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown view_->GetWidget()->Activate(); 34ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown} 35ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 36ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownvoid AppListLinux::Hide() { 37ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown view_->GetWidget()->Hide(); 38ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown} 39ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 40ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownvoid AppListLinux::MoveNearCursor() { 41ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown view_->SetBubbleArrow(views::BubbleBorder::FLOAT); 42ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown // Anchor to the top-left corner of the screen. 43ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown // TODO(mgiuca): Try to anchor near the taskbar and/or mouse cursor. This will 44ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown // depend upon the user's window manager. 45ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown gfx::Size view_size = view_->GetPreferredSize(); 46ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown view_->SetAnchorPoint( 47ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown gfx::Point(view_size.width() / 2, view_size.height() / 2)); 48} 49 50bool AppListLinux::IsVisible() { 51 return view_->GetWidget()->IsVisible(); 52} 53 54void AppListLinux::Prerender() { 55 view_->Prerender(); 56} 57 58void AppListLinux::ReactivateOnNextFocusLoss() { 59 // This is only used on Windows 8, so we ignore it on Linux. 60} 61 62gfx::NativeWindow AppListLinux::GetWindow() { 63 return view_->GetWidget()->GetNativeWindow(); 64} 65 66void AppListLinux::SetProfile(Profile* profile) { 67 view_->SetProfileByPath(profile->GetPath()); 68} 69 70void AppListLinux::OnActivationChanged( 71 views::Widget* /*widget*/, bool active) { 72 if (active) 73 return; 74 75 // Call |on_should_dismiss_| asynchronously. This must be done asynchronously 76 // or our caller will crash, as it expects the app list to remain alive. 77 base::ThreadTaskRunnerHandle::Get()->PostTask(FROM_HERE, on_should_dismiss_); 78} 79