| Index: chrome/browser/ui/gtk/panels/panel_stack_window_gtk.cc
|
| diff --git a/chrome/browser/ui/gtk/panels/panel_stack_window_gtk.cc b/chrome/browser/ui/gtk/panels/panel_stack_window_gtk.cc
|
| deleted file mode 100644
|
| index 09ff84d9b90416c5d0ac14b379ee8998b1252374..0000000000000000000000000000000000000000
|
| --- a/chrome/browser/ui/gtk/panels/panel_stack_window_gtk.cc
|
| +++ /dev/null
|
| @@ -1,255 +0,0 @@
|
| -// Copyright (c) 2013 The Chromium Authors. All rights reserved.
|
| -// Use of this source code is governed by a BSD-style license that can be
|
| -// found in the LICENSE file.
|
| -
|
| -#include "chrome/browser/ui/gtk/panels/panel_stack_window_gtk.h"
|
| -
|
| -#include <gdk/gdkkeysyms.h>
|
| -#include "base/strings/utf_string_conversions.h"
|
| -#include "chrome/browser/ui/panels/panel.h"
|
| -#include "chrome/browser/ui/panels/stacked_panel_collection.h"
|
| -#include "ui/base/x/active_window_watcher_x.h"
|
| -
|
| -// static
|
| -NativePanelStackWindow* NativePanelStackWindow::Create(
|
| - NativePanelStackWindowDelegate* delegate) {
|
| - return new PanelStackWindowGtk(delegate);
|
| -}
|
| -
|
| -PanelStackWindowGtk::PanelStackWindowGtk(
|
| - NativePanelStackWindowDelegate* delegate)
|
| - : delegate_(delegate),
|
| - window_(NULL),
|
| - is_minimized_(false),
|
| - bounds_updates_started_(false) {
|
| - ui::ActiveWindowWatcherX::AddObserver(this);
|
| -}
|
| -
|
| -PanelStackWindowGtk::~PanelStackWindowGtk() {
|
| - ui::ActiveWindowWatcherX::RemoveObserver(this);
|
| -}
|
| -
|
| -void PanelStackWindowGtk::Close() {
|
| - if (!window_)
|
| - return;
|
| - gtk_widget_destroy(GTK_WIDGET(window_));
|
| - window_ = NULL;
|
| -}
|
| -
|
| -void PanelStackWindowGtk::AddPanel(Panel* panel) {
|
| - panels_.push_back(panel);
|
| -
|
| - EnsureWindowCreated();
|
| - SetStackWindowBounds();
|
| -
|
| - // The panel being stacked should not appear on the taskbar.
|
| - gtk_window_set_skip_taskbar_hint(panel->GetNativeWindow(), true);
|
| -}
|
| -
|
| -void PanelStackWindowGtk::RemovePanel(Panel* panel) {
|
| - panels_.remove(panel);
|
| -
|
| - SetStackWindowBounds();
|
| -
|
| - // The panel being unstacked should re-appear on the taskbar.
|
| - // Note that the underlying gtk window is gone when the panel is being
|
| - // closed.
|
| - GtkWindow* gtk_window = panel->GetNativeWindow();
|
| - if (gtk_window)
|
| - gtk_window_set_skip_taskbar_hint(gtk_window, false);
|
| -}
|
| -
|
| -void PanelStackWindowGtk::MergeWith(NativePanelStackWindow* another) {
|
| - PanelStackWindowGtk* another_stack =
|
| - static_cast<PanelStackWindowGtk*>(another);
|
| - for (Panels::const_iterator iter = another_stack->panels_.begin();
|
| - iter != another_stack->panels_.end(); ++iter) {
|
| - Panel* panel = *iter;
|
| - panels_.push_back(panel);
|
| - }
|
| - another_stack->panels_.clear();
|
| -
|
| - SetStackWindowBounds();
|
| -}
|
| -
|
| -bool PanelStackWindowGtk::IsEmpty() const {
|
| - return panels_.empty();
|
| -}
|
| -
|
| -bool PanelStackWindowGtk::HasPanel(Panel* panel) const {
|
| - return std::find(panels_.begin(), panels_.end(), panel) != panels_.end();
|
| -}
|
| -
|
| -void PanelStackWindowGtk::MovePanelsBy(const gfx::Vector2d& delta) {
|
| - for (Panels::const_iterator iter = panels_.begin();
|
| - iter != panels_.end(); ++iter) {
|
| - Panel* panel = *iter;
|
| - gfx::Rect bounds = panel->GetBounds();
|
| - bounds.Offset(delta);
|
| - panel->SetPanelBoundsInstantly(bounds);
|
| - }
|
| -
|
| - SetStackWindowBounds();
|
| -}
|
| -
|
| -void PanelStackWindowGtk::BeginBatchUpdatePanelBounds(bool animate) {
|
| - // Bounds animation is not supported on GTK.
|
| - bounds_updates_started_ = true;
|
| -}
|
| -
|
| -void PanelStackWindowGtk::AddPanelBoundsForBatchUpdate(
|
| - Panel* panel, const gfx::Rect& new_bounds) {
|
| - DCHECK(bounds_updates_started_);
|
| -
|
| - // No need to track it if no change is needed.
|
| - if (panel->GetBounds() == new_bounds)
|
| - return;
|
| -
|
| - // New bounds are stored as the map value.
|
| - bounds_updates_[panel] = new_bounds;
|
| -}
|
| -
|
| -void PanelStackWindowGtk::EndBatchUpdatePanelBounds() {
|
| - DCHECK(bounds_updates_started_);
|
| -
|
| - bounds_updates_started_ = false;
|
| -
|
| - for (BoundsUpdates::const_iterator iter = bounds_updates_.begin();
|
| - iter != bounds_updates_.end(); ++iter) {
|
| - iter->first->SetPanelBoundsInstantly(iter->second);
|
| - }
|
| - bounds_updates_.clear();
|
| -
|
| - SetStackWindowBounds();
|
| -
|
| - delegate_->PanelBoundsBatchUpdateCompleted();
|
| -}
|
| -
|
| -bool PanelStackWindowGtk::IsAnimatingPanelBounds() const {
|
| - return bounds_updates_started_;
|
| -}
|
| -
|
| -void PanelStackWindowGtk::Minimize() {
|
| - gtk_window_iconify(window_);
|
| -}
|
| -
|
| -bool PanelStackWindowGtk::IsMinimized() const {
|
| - return is_minimized_;
|
| -}
|
| -
|
| -void PanelStackWindowGtk::DrawSystemAttention(bool draw_attention) {
|
| - gtk_window_set_urgency_hint(window_, draw_attention);
|
| -}
|
| -
|
| -void PanelStackWindowGtk::OnPanelActivated(Panel* panel) {
|
| - // If a panel in a stack is activated, make sure all other panels in the stack
|
| - // are brought to the top in the z-order.
|
| - for (Panels::const_iterator iter = panels_.begin();
|
| - iter != panels_.end(); ++iter) {
|
| - GtkWindow* gtk_window = (*iter)->GetNativeWindow();
|
| - if (gtk_window) {
|
| - GdkWindow* gdk_window = gtk_widget_get_window(GTK_WIDGET(gtk_window));
|
| - gdk_window_raise(gdk_window);
|
| - }
|
| - }
|
| -}
|
| -
|
| -void PanelStackWindowGtk::ActiveWindowChanged(GdkWindow* active_window) {
|
| - // Bail out if icewm is detected. This is because icewm always creates a
|
| - // window as active and we do not want to perform the logic here to
|
| - // activate a panel window when the background window is being created.
|
| - if (ui::GuessWindowManager() == ui::WM_ICE_WM)
|
| - return;
|
| -
|
| - if (!window_ || panels_.empty())
|
| - return;
|
| -
|
| - // The background stack window is activated when its taskbar icon is clicked.
|
| - // When this occurs, we need to activate the most recently active panel.
|
| - if (gtk_widget_get_window(GTK_WIDGET(window_)) == active_window) {
|
| - Panel* panel_to_focus =
|
| - panels_.front()->stack()->most_recently_active_panel();
|
| - if (panel_to_focus)
|
| - panel_to_focus->Activate();
|
| - }
|
| -}
|
| -
|
| -gboolean PanelStackWindowGtk::OnWindowDeleteEvent(GtkWidget* widget,
|
| - GdkEvent* event) {
|
| - DCHECK(!panels_.empty());
|
| -
|
| - // Make a copy since closing a panel could modify the list.
|
| - Panels panels_copy = panels_;
|
| - for (Panels::const_iterator iter = panels_copy.begin();
|
| - iter != panels_copy.end(); ++iter) {
|
| - (*iter)->Close();
|
| - }
|
| -
|
| - // Return true to prevent the gtk window from being destroyed. Close will
|
| - // destroy it for us.
|
| - return TRUE;
|
| -}
|
| -
|
| -gboolean PanelStackWindowGtk::OnWindowState(GtkWidget* widget,
|
| - GdkEventWindowState* event) {
|
| - bool is_minimized = event->new_window_state & GDK_WINDOW_STATE_ICONIFIED;
|
| - if (is_minimized_ == is_minimized)
|
| - return FALSE;
|
| - is_minimized_ = is_minimized;
|
| -
|
| - for (Panels::const_iterator iter = panels_.begin();
|
| - iter != panels_.end(); ++iter) {
|
| - GtkWindow* gtk_window = (*iter)->GetNativeWindow();
|
| - if (is_minimized_)
|
| - gtk_window_iconify(gtk_window);
|
| - else
|
| - gtk_window_deiconify(gtk_window);
|
| - }
|
| -
|
| - return FALSE;
|
| -}
|
| -
|
| -void PanelStackWindowGtk::EnsureWindowCreated() {
|
| - if (window_)
|
| - return;
|
| -
|
| - DCHECK(!panels_.empty());
|
| - Panel* panel = panels_.front();
|
| -
|
| - // Create a small window that stays behinds the panels.
|
| - window_ = GTK_WINDOW(gtk_window_new(GTK_WINDOW_TOPLEVEL));
|
| - gtk_window_set_decorated(window_, false);
|
| - gtk_window_set_resizable(window_, false);
|
| - gtk_window_set_focus_on_map(window_, false);
|
| - gtk_widget_show(GTK_WIDGET(window_));
|
| - gdk_window_move_resize(gtk_widget_get_window(GTK_WIDGET(window_)),
|
| - panel->GetBounds().x(), panel->GetBounds().y(), 1, 1);
|
| - gdk_window_lower(gtk_widget_get_window(GTK_WIDGET(window_)));
|
| -
|
| - // Connect signal handlers to the window.
|
| - g_signal_connect(window_, "delete-event",
|
| - G_CALLBACK(OnWindowDeleteEventThunk), this);
|
| - g_signal_connect(window_, "window-state-event",
|
| - G_CALLBACK(OnWindowStateThunk), this);
|
| -
|
| - // Should appear on the taskbar.
|
| - gtk_window_set_skip_taskbar_hint(window_, false);
|
| -
|
| - // Set the window icon and title.
|
| - base::string16 title = delegate_->GetTitle();
|
| - gtk_window_set_title(window_, base::UTF16ToUTF8(title).c_str());
|
| -
|
| - gfx::Image app_icon = delegate_->GetIcon();
|
| - if (!app_icon.IsEmpty())
|
| - gtk_window_set_icon(window_, app_icon.ToGdkPixbuf());
|
| -}
|
| -
|
| -void PanelStackWindowGtk::SetStackWindowBounds() {
|
| - if (panels_.empty())
|
| - return;
|
| - Panel* panel = panels_.front();
|
| - // Position the small background window a bit away from the left-top corner
|
| - // such that it will be completely invisible.
|
| - gdk_window_move_resize(gtk_widget_get_window(GTK_WIDGET(window_)),
|
| - panel->GetBounds().x() + 5, panel->GetBounds().y() + 5, 1, 1);
|
| -}
|
|
|