Index: chrome/browser/ui/gtk/fullscreen_exit_bubble_gtk.cc |
diff --git a/chrome/browser/ui/gtk/fullscreen_exit_bubble_gtk.cc b/chrome/browser/ui/gtk/fullscreen_exit_bubble_gtk.cc |
index d9fba76244ecb41119e45eb2f6bbb37fbe183101..a7d1d1478753aef05d5b1e1f8f0b060e6b4eb435 100644 |
--- a/chrome/browser/ui/gtk/fullscreen_exit_bubble_gtk.cc |
+++ b/chrome/browser/ui/gtk/fullscreen_exit_bubble_gtk.cc |
@@ -12,25 +12,13 @@ |
#include "grit/ui_strings.h" |
#include "ui/base/l10n/l10n_util.h" |
-namespace { |
- |
-// Padding around the link text. |
-const int kPaddingPixels = 8; |
- |
-// Time before the link slides away. This is a bit longer than the Windows |
-// timeout because we don't yet support reshowing when the mouse moves to the |
-// of the screen. |
-const int kInitialDelayMs = 3000; |
- |
-// How long the slide up animation takes when hiding the bubble. |
-const int kSlideOutDurationMs = 700; |
- |
-} |
- |
FullscreenExitBubbleGtk::FullscreenExitBubbleGtk( |
- GtkFloatingContainer* container) |
- : container_(container) { |
+ GtkFloatingContainer* container, |
+ CommandUpdater::CommandUpdaterDelegate* delegate) |
+ : FullscreenExitBubble(delegate), |
+ container_(container) { |
InitWidgets(); |
+ StartWatchingMouse(); |
} |
FullscreenExitBubbleGtk::~FullscreenExitBubbleGtk() { |
@@ -42,7 +30,8 @@ void FullscreenExitBubbleGtk::InitWidgets() { |
// and put into a slide widget. |
// The Windows code actually looks up the accelerator key in the accelerator |
- // table and then converts the key to a string (in a switch statement). |
+ // table and then converts the key to a string (in a switch statement). This |
+ // doesn't seem to be implemented for Gtk, so we just use F11 directly. |
std::string exit_text_utf8("<span color=\"white\" size=\"large\">"); |
exit_text_utf8.append(l10n_util::GetStringFUTF8( |
IDS_EXIT_FULLSCREEN_MODE, l10n_util::GetStringUTF16(IDS_APP_F11_KEY))); |
@@ -53,35 +42,79 @@ void FullscreenExitBubbleGtk::InitWidgets() { |
FALSE); |
signals_.Connect(link, "clicked", G_CALLBACK(OnLinkClickedThunk), this); |
- GtkWidget* container = gtk_util::CreateGtkBorderBin( |
+ link_container_.Own(gtk_util::CreateGtkBorderBin( |
link, >k_util::kGdkBlack, |
- kPaddingPixels, kPaddingPixels, kPaddingPixels, kPaddingPixels); |
- gtk_util::ActAsRoundedWindow(container, gtk_util::kGdkGreen, kPaddingPixels, |
+ kPaddingPx, kPaddingPx, kPaddingPx, kPaddingPx)); |
+ gtk_util::ActAsRoundedWindow(link_container_.get(), gtk_util::kGdkGreen, |
+ kPaddingPx, |
gtk_util::ROUNDED_BOTTOM_LEFT | gtk_util::ROUNDED_BOTTOM_RIGHT, |
gtk_util::BORDER_NONE); |
- slide_widget_.reset(new SlideAnimatorGtk(container, |
+ slide_widget_.reset(new SlideAnimatorGtk(link_container_.get(), |
SlideAnimatorGtk::DOWN, kSlideOutDurationMs, false, false, NULL)); |
gtk_widget_set_name(widget(), "exit-fullscreen-bubble"); |
- gtk_widget_show_all(container); |
+ gtk_widget_show_all(link_container_.get()); |
gtk_widget_show(widget()); |
slide_widget_->OpenWithoutAnimation(); |
- // TODO(tc): Implement the more complex logic in the windows version for |
- // when to show/hide the exit bubble. |
- initial_delay_.Start(base::TimeDelta::FromMilliseconds(kInitialDelayMs), this, |
- &FullscreenExitBubbleGtk::Hide); |
- |
gtk_floating_container_add_floating(GTK_FLOATING_CONTAINER(container_), |
widget()); |
signals_.Connect(container_, "set-floating-position", |
G_CALLBACK(OnSetFloatingPositionThunk), this); |
} |
+gfx::Rect FullscreenExitBubbleGtk::GetPopupRect( |
+ bool ignore_animation_state) const { |
+ GtkRequisition bubble_size; |
+ if (ignore_animation_state) { |
+ gtk_widget_size_request(link_container_.get(), &bubble_size); |
+ } else { |
+ gtk_widget_size_request(widget(), &bubble_size); |
+ } |
+ return gfx::Rect(bubble_size.width, bubble_size.height); |
+} |
+ |
+gfx::Point FullscreenExitBubbleGtk::GetCursorScreenPoint() { |
+ GdkDisplay* display = gtk_widget_get_display(widget()); |
+ |
+ // Get cursor position. |
+ // TODO: this hits the X server, so we may want to consider decreasing |
+ // kPositionCheckHz if we detect that we're running remotely. |
+ int x, y; |
+ gdk_display_get_pointer(display, NULL, &x, &y, NULL); |
+ |
+ return gfx::Point(x, y); |
+} |
+ |
+bool FullscreenExitBubbleGtk::WindowContainsPoint(gfx::Point pos) { |
+ GtkWindow* window = GTK_WINDOW( |
+ gtk_widget_get_ancestor(widget(), GTK_TYPE_WINDOW)); |
+ int width, height, x, y; |
+ gtk_window_get_size(window, &width, &height); |
+ gtk_window_get_position(window, &x, &y); |
+ return gfx::Rect(x, y, width, height).Contains(pos); |
+} |
+ |
+bool FullscreenExitBubbleGtk::IsWindowActive() { |
+ if (!widget()->parent) |
+ return false; |
+ GtkWindow* window = GTK_WINDOW( |
+ gtk_widget_get_ancestor(widget(), GTK_TYPE_WINDOW)); |
+ return gtk_window_is_active(window); |
+} |
+ |
void FullscreenExitBubbleGtk::Hide() { |
slide_widget_->Close(); |
} |
+void FullscreenExitBubbleGtk::Show() { |
+ slide_widget_->Open(); |
+} |
+ |
+bool FullscreenExitBubbleGtk::IsAnimating() { |
+ return slide_widget_->IsAnimating(); |
+} |
+ |
void FullscreenExitBubbleGtk::OnSetFloatingPosition( |
GtkWidget* floating_container, |
GtkAllocation* allocation) { |
@@ -102,6 +135,5 @@ void FullscreenExitBubbleGtk::OnSetFloatingPosition( |
} |
void FullscreenExitBubbleGtk::OnLinkClicked(GtkWidget* link) { |
- GtkWindow* window = GTK_WINDOW(gtk_widget_get_toplevel(widget())); |
- gtk_window_unfullscreen(window); |
+ ToggleFullscreen(); |
} |