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