Chromium Code Reviews| 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..f8736ca277c7de820e6b4e500afb97e56c6dd8b7 100644 |
| --- a/chrome/browser/ui/gtk/fullscreen_exit_bubble_gtk.cc |
| +++ b/chrome/browser/ui/gtk/fullscreen_exit_bubble_gtk.cc |
| @@ -17,20 +17,15 @@ 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 +37,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,22 +49,21 @@ void FullscreenExitBubbleGtk::InitWidgets() { |
| FALSE); |
| signals_.Connect(link, "clicked", G_CALLBACK(OnLinkClickedThunk), this); |
| - GtkWidget* container = gtk_util::CreateGtkBorderBin( |
| + link_container_ = gtk_util::CreateGtkBorderBin( |
| link, >k_util::kGdkBlack, |
| kPaddingPixels, kPaddingPixels, kPaddingPixels, kPaddingPixels); |
| - gtk_util::ActAsRoundedWindow(container, gtk_util::kGdkGreen, kPaddingPixels, |
| + gtk_util::ActAsRoundedWindow(link_container_, gtk_util::kGdkGreen, |
| + kPaddingPixels, |
| 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_, |
| 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_); |
| 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); |
| @@ -78,10 +73,54 @@ void FullscreenExitBubbleGtk::InitWidgets() { |
| 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_, &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. |
| + int x, y; |
| + gdk_display_get_pointer(display, NULL, &x, &y, NULL); |
|
tony
2011/08/02 17:04:25
Don't you need to get screen to make sure you're o
jeremya
2011/08/03 07:32:30
I've tested with multiple monitors, and didn't see
|
| + |
| + 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() { |
| + 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 +141,5 @@ void FullscreenExitBubbleGtk::OnSetFloatingPosition( |
| } |
| void FullscreenExitBubbleGtk::OnLinkClicked(GtkWidget* link) { |
| - GtkWindow* window = GTK_WINDOW(gtk_widget_get_toplevel(widget())); |
| - gtk_window_unfullscreen(window); |
| + ToggleFullscreen(); |
| } |