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 114006fe4e1468887aba9960b489f10f7eae9b76..c140e731fef39fd6e5cdac358cd7b7aafbe76bfa 100644 |
--- a/chrome/browser/ui/gtk/fullscreen_exit_bubble_gtk.cc |
+++ b/chrome/browser/ui/gtk/fullscreen_exit_bubble_gtk.cc |
@@ -4,6 +4,7 @@ |
#include "chrome/browser/ui/gtk/fullscreen_exit_bubble_gtk.h" |
+#include "base/utf_string_conversions.h" |
#include "chrome/browser/ui/browser.h" |
#include "chrome/browser/ui/gtk/gtk_chrome_link_button.h" |
#include "chrome/browser/ui/gtk/gtk_util.h" |
@@ -14,6 +15,11 @@ |
#include "ui/base/gtk/gtk_hig_constants.h" |
#include "ui/base/l10n/l10n_util.h" |
+namespace { |
+const GdkColor kFrameColor = GDK_COLOR_RGB(0x63, 0x63, 0x63); |
+const int kMiddlePaddingPx = 30; |
+} // namespace |
+ |
FullscreenExitBubbleGtk::FullscreenExitBubbleGtk( |
GtkFloatingContainer* container, |
Browser* browser, |
@@ -24,7 +30,6 @@ FullscreenExitBubbleGtk::FullscreenExitBubbleGtk( |
url_(url), |
show_buttons_(ask_permission) { |
InitWidgets(); |
- StartWatchingMouse(); |
} |
FullscreenExitBubbleGtk::~FullscreenExitBubbleGtk() { |
@@ -38,43 +43,95 @@ void FullscreenExitBubbleGtk::InitWidgets() { |
// 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). 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( |
+ std::string exit_text_utf8(l10n_util::GetStringFUTF8( |
IDS_EXIT_FULLSCREEN_MODE, l10n_util::GetStringUTF16(IDS_APP_F11_KEY))); |
- exit_text_utf8.append("</span>"); |
- GtkWidget* link = gtk_chrome_link_button_new_with_markup( |
- exit_text_utf8.c_str()); |
- gtk_chrome_link_button_set_use_gtk_theme(GTK_CHROME_LINK_BUTTON(link), |
+ link_ = gtk_chrome_link_button_new(exit_text_utf8.c_str()); |
+ gtk_chrome_link_button_set_use_gtk_theme(GTK_CHROME_LINK_BUTTON(link_), |
FALSE); |
- signals_.Connect(link, "clicked", G_CALLBACK(OnLinkClickedThunk), this); |
- |
- |
- link_container_.Own(gtk_util::CreateGtkBorderBin( |
- link, &ui::kGdkBlack, |
- kPaddingPx, kPaddingPx, kPaddingPx, kPaddingPx)); |
- GdkColor green = GDK_COLOR_RGB(0x00, 0xff, 0x00); |
- gtk_util::ActAsRoundedWindow(link_container_.get(), green, kPaddingPx, |
- gtk_util::ROUNDED_BOTTOM_LEFT | gtk_util::ROUNDED_BOTTOM_RIGHT, |
- gtk_util::BORDER_NONE); |
- slide_widget_.reset(new SlideAnimatorGtk(link_container_.get(), |
+ GtkWidget* hbox = gtk_hbox_new(false, 0); |
+ |
+ GtkWidget* button_link_hbox = gtk_hbox_new(false, ui::kControlSpacing); |
+ allow_button_ = gtk_button_new_with_label( |
+ l10n_util::GetStringUTF8(IDS_FULLSCREEN_INFOBAR_ALLOW).c_str()); |
+ deny_button_ = gtk_button_new_with_label( |
+ l10n_util::GetStringUTF8(IDS_FULLSCREEN_INFOBAR_DENY).c_str()); |
+ gtk_box_pack_end(GTK_BOX(button_link_hbox), deny_button_, FALSE, FALSE, 0); |
+ gtk_box_pack_end(GTK_BOX(button_link_hbox), allow_button_, FALSE, FALSE, 0); |
+ gtk_box_pack_end(GTK_BOX(button_link_hbox), link_, FALSE, FALSE, 0); |
+ |
+ GtkWidget* message_label = gtk_label_new(GetMessage(url_).c_str()); |
+ |
+ gtk_box_pack_start(GTK_BOX(hbox), message_label, FALSE, FALSE, 0); |
+ gtk_box_pack_end(GTK_BOX(hbox), button_link_hbox, FALSE, FALSE, 0); |
+ |
+ GtkWidget* bubble = gtk_util::CreateGtkBorderBin( |
+ hbox, &ui::kGdkWhite, |
+ kPaddingPx, kPaddingPx, kPaddingPx, kPaddingPx); |
+ gtk_util::ActAsRoundedWindow(bubble, kFrameColor, 3, |
+ gtk_util::ROUNDED_ALL, gtk_util::BORDER_ALL); |
+ GtkWidget* alignment = gtk_alignment_new(0.0, 0.0, 1.0, 1.0); |
+ gtk_alignment_set_padding(GTK_ALIGNMENT(alignment), 5, 0, 0, 0); |
+ gtk_container_add(GTK_CONTAINER(alignment), bubble); |
+ ui_container_.Own(alignment); |
+ |
+ slide_widget_.reset(new SlideAnimatorGtk(ui_container_.get(), |
SlideAnimatorGtk::DOWN, kSlideOutDurationMs, false, false, NULL)); |
gtk_widget_set_name(widget(), "exit-fullscreen-bubble"); |
- gtk_widget_show_all(link_container_.get()); |
+ gtk_widget_show_all(ui_container_.get()); |
gtk_widget_show(widget()); |
slide_widget_->OpenWithoutAnimation(); |
gtk_floating_container_add_floating(GTK_FLOATING_CONTAINER(container_), |
widget()); |
+ |
+ // The widget needs to not change size when the allow/deny buttons are |
+ // replaced by the exit link, so we wrap the buttons and the link in their |
+ // own HBox, and force its size to be the max of the two sizes. |
+ GtkRequisition req; |
+ int button_width = 0; |
+ gtk_widget_size_request(allow_button_, &req); |
+ button_width += req.width; |
+ gtk_widget_size_request(deny_button_, &req); |
+ button_width += req.width; |
+ button_width += ui::kControlSpacing; |
+ int height = req.height; |
+ gtk_widget_size_request(link_, &req); |
+ int width = std::max(button_width, req.width); |
+ gtk_widget_set_size_request(button_link_hbox, width, height); |
+ |
+ gtk_widget_size_request(message_label, &req); |
+ gtk_widget_set_size_request(hbox, req.width + width + kMiddlePaddingPx, -1); |
+ |
signals_.Connect(container_, "set-floating-position", |
G_CALLBACK(OnSetFloatingPositionThunk), this); |
+ signals_.Connect(link_, "clicked", G_CALLBACK(OnLinkClickedThunk), this); |
+ signals_.Connect(allow_button_, "clicked", |
+ G_CALLBACK(&OnAllowClickedThunk), this); |
+ signals_.Connect(deny_button_, "clicked", |
+ G_CALLBACK(&OnDenyClickedThunk), this); |
+ gtk_widget_hide(link_); |
+ if (!show_buttons_) { |
+ HideButtons(); |
+ } |
+} |
+ |
+std::string FullscreenExitBubbleGtk::GetMessage(const GURL& url) { |
+ if (url.is_empty()) { |
+ return l10n_util::GetStringUTF8( |
+ IDS_FULLSCREEN_INFOBAR_USER_ENTERED_FULLSCREEN); |
+ } |
+ if (url.SchemeIsFile()) |
+ return l10n_util::GetStringUTF8(IDS_FULLSCREEN_INFOBAR_FILE_PAGE_NAME); |
+ return l10n_util::GetStringFUTF8(IDS_FULLSCREEN_INFOBAR_REQUEST_PERMISSION, |
+ UTF8ToUTF16(url.host())); |
} |
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); |
+ gtk_widget_size_request(ui_container_.get(), &bubble_size); |
} else { |
gtk_widget_size_request(widget(), &bubble_size); |
} |
@@ -144,3 +201,18 @@ void FullscreenExitBubbleGtk::OnSetFloatingPosition( |
void FullscreenExitBubbleGtk::OnLinkClicked(GtkWidget* link) { |
ToggleFullscreen(); |
} |
+ |
+void FullscreenExitBubbleGtk::HideButtons() { |
+ gtk_widget_hide(allow_button_); |
+ gtk_widget_hide(deny_button_); |
+ gtk_widget_show(link_); |
+ StartWatchingMouse(); |
+} |
+ |
+void FullscreenExitBubbleGtk::OnAllowClicked(GtkWidget* button) { |
+ AcceptFullscreen(url_); |
+ HideButtons(); |
+} |
+void FullscreenExitBubbleGtk::OnDenyClicked(GtkWidget* button) { |
+ CancelFullscreen(); |
+} |