Chromium Code Reviews| Index: chrome/browser/ui/gtk/browser_titlebar.cc |
| diff --git a/chrome/browser/ui/gtk/browser_titlebar.cc b/chrome/browser/ui/gtk/browser_titlebar.cc |
| index 4dd48c56ba1be94073dfb9bdedf25edc246148ca..63700131eba958caa41b9e453e222b99c4f7cb80 100644 |
| --- a/chrome/browser/ui/gtk/browser_titlebar.cc |
| +++ b/chrome/browser/ui/gtk/browser_titlebar.cc |
| @@ -219,6 +219,7 @@ BrowserTitlebar::BrowserTitlebar(BrowserWindowGtk* browser_window, |
| app_mode_title_(NULL), |
| using_custom_frame_(false), |
| window_has_focus_(false), |
| + window_has_mouse_(false), |
| theme_service_(NULL) { |
| Init(); |
| } |
| @@ -284,9 +285,17 @@ void BrowserTitlebar::Init() { |
| g_signal_connect(window_, "window-state-event", |
| G_CALLBACK(OnWindowStateChangedThunk), this); |
| + if (is_type_panel()) { |
| + g_signal_connect(window_, "enter-notify-event", |
| + G_CALLBACK(OnEnterNotifyThunk), this); |
| + g_signal_connect(window_, "leave-notify-event", |
| + G_CALLBACK(OnLeaveNotifyThunk), this); |
| + } |
| + |
| // Allocate the two button boxes on the left and right parts of the bar, |
| // spyguy frames in case of incognito mode, and profile button boxes. |
| titlebar_left_buttons_vbox_ = gtk_vbox_new(FALSE, 0); |
| + |
|
Evan Stade
2011/06/21 02:58:08
?
prasadt
2011/06/21 18:21:06
Done. Removed empty line, left over from some cha
|
| gtk_box_pack_start(GTK_BOX(container_hbox_), titlebar_left_buttons_vbox_, |
| FALSE, FALSE, 0); |
| if (browser_window_->browser()->profile()->IsOffTheRecord() && |
| @@ -328,6 +337,7 @@ void BrowserTitlebar::Init() { |
| FALSE, FALSE, 0); |
| } |
| titlebar_right_buttons_vbox_ = gtk_vbox_new(FALSE, 0); |
| + |
|
Evan Stade
2011/06/21 02:58:08
?
prasadt
2011/06/21 18:21:06
Done.
|
| gtk_box_pack_end(GTK_BOX(container_hbox_), titlebar_right_buttons_vbox_, |
| FALSE, FALSE, 0); |
| @@ -376,6 +386,14 @@ void BrowserTitlebar::Init() { |
| reinterpret_cast<void*>(true)); |
| gtk_container_add(GTK_CONTAINER(favicon_event_box), app_mode_favicon_); |
| + if (is_type_panel()) { |
| + panel_wrench_button_.reset( |
| + BuildTitlebarButton(IDR_BALLOON_WRENCH, IDR_BALLOON_WRENCH_P, |
| + IDR_BALLOON_WRENCH_H, app_mode_hbox, FALSE, |
| + IDS_NEW_TAB_APP_SETTINGS)); |
| + gtk_widget_set_no_show_all(panel_wrench_button_->widget(), TRUE); |
| + } |
| + |
| app_mode_title_ = gtk_label_new(NULL); |
| gtk_label_set_ellipsize(GTK_LABEL(app_mode_title_), PANGO_ELLIPSIZE_END); |
| gtk_misc_set_alignment(GTK_MISC(app_mode_title_), 0.0, 0.5); |
| @@ -429,37 +447,41 @@ void BrowserTitlebar::BuildButtons(const std::string& button_string) { |
| } else { |
| base::StringPiece token = tokenizer.token_piece(); |
| if (token == "minimize") { |
| - (left_side ? left_count : right_count)++; |
| - GtkWidget* parent_box = GetButtonHBox(left_side); |
| - minimize_button_.reset( |
| - BuildTitlebarButton(IDR_MINIMIZE, IDR_MINIMIZE_P, |
| - IDR_MINIMIZE_H, parent_box, |
| - IDS_XPFRAME_MINIMIZE_TOOLTIP)); |
| - |
| - gtk_widget_size_request(minimize_button_->widget(), |
| - &minimize_button_req_); |
| + if (!is_type_panel()) { |
|
Evan Stade
2011/06/21 02:58:08
move into if statement above
prasadt
2011/06/21 18:21:06
Done.
|
| + (left_side ? left_count : right_count)++; |
| + GtkWidget* parent_box = GetButtonHBox(left_side); |
| + minimize_button_.reset( |
| + BuildTitlebarButton(IDR_MINIMIZE, IDR_MINIMIZE_P, |
| + IDR_MINIMIZE_H, parent_box, true, |
| + IDS_XPFRAME_MINIMIZE_TOOLTIP)); |
| + |
| + gtk_widget_size_request(minimize_button_->widget(), |
| + &minimize_button_req_); |
| + } |
| } else if (token == "maximize") { |
| - (left_side ? left_count : right_count)++; |
| - GtkWidget* parent_box = GetButtonHBox(left_side); |
| - restore_button_.reset( |
| - BuildTitlebarButton(IDR_RESTORE, IDR_RESTORE_P, |
| - IDR_RESTORE_H, parent_box, |
| - IDS_XPFRAME_RESTORE_TOOLTIP)); |
| - maximize_button_.reset( |
| - BuildTitlebarButton(IDR_MAXIMIZE, IDR_MAXIMIZE_P, |
| - IDR_MAXIMIZE_H, parent_box, |
| - IDS_XPFRAME_MAXIMIZE_TOOLTIP)); |
| - |
| - gtk_util::SetButtonClickableByMouseButtons(maximize_button_->widget(), |
| - true, true, true); |
| - gtk_widget_size_request(restore_button_->widget(), |
| - &restore_button_req_); |
| + if (!is_type_panel()) { |
|
Evan Stade
2011/06/21 02:58:08
move into if statement above
prasadt
2011/06/21 18:21:06
Done.
|
| + (left_side ? left_count : right_count)++; |
| + GtkWidget* parent_box = GetButtonHBox(left_side); |
| + restore_button_.reset( |
| + BuildTitlebarButton(IDR_RESTORE, IDR_RESTORE_P, |
| + IDR_RESTORE_H, parent_box, true, |
| + IDS_XPFRAME_RESTORE_TOOLTIP)); |
| + maximize_button_.reset( |
| + BuildTitlebarButton(IDR_MAXIMIZE, IDR_MAXIMIZE_P, |
| + IDR_MAXIMIZE_H, parent_box, true, |
| + IDS_XPFRAME_MAXIMIZE_TOOLTIP)); |
| + |
| + gtk_util::SetButtonClickableByMouseButtons(maximize_button_->widget(), |
| + true, true, true); |
| + gtk_widget_size_request(restore_button_->widget(), |
| + &restore_button_req_); |
| + } |
| } else if (token == "close") { |
| (left_side ? left_count : right_count)++; |
| GtkWidget* parent_box = GetButtonHBox(left_side); |
| close_button_.reset( |
| BuildTitlebarButton(IDR_CLOSE, IDR_CLOSE_P, |
| - IDR_CLOSE_H, parent_box, |
| + IDR_CLOSE_H, parent_box, true, |
| IDS_XPFRAME_CLOSE_TOOLTIP)); |
| close_button_->set_flipped(left_side); |
| @@ -532,7 +554,8 @@ GtkWidget* BrowserTitlebar::GetButtonHBox(bool left_side) { |
| } |
| CustomDrawButton* BrowserTitlebar::BuildTitlebarButton(int image, |
| - int image_pressed, int image_hot, GtkWidget* box, int tooltip) { |
| + int image_pressed, int image_hot, GtkWidget* box, bool start, |
| + int tooltip) { |
| CustomDrawButton* button = new CustomDrawButton(image, image_pressed, |
| image_hot, 0); |
| gtk_widget_add_events(GTK_WIDGET(button->widget()), GDK_POINTER_MOTION_MASK); |
| @@ -543,7 +566,10 @@ CustomDrawButton* BrowserTitlebar::BuildTitlebarButton(int image, |
| std::string localized_tooltip = l10n_util::GetStringUTF8(tooltip); |
| gtk_widget_set_tooltip_text(button->widget(), |
| localized_tooltip.c_str()); |
| - gtk_box_pack_start(GTK_BOX(box), button->widget(), FALSE, FALSE, 0); |
| + if (start) |
| + gtk_box_pack_start(GTK_BOX(box), button->widget(), FALSE, FALSE, 0); |
| + else |
| + gtk_box_pack_end(GTK_BOX(box), button->widget(), FALSE, FALSE, 0); |
| return button; |
| } |
| @@ -575,7 +601,7 @@ void BrowserTitlebar::UpdateTitleAndIcon() { |
| // Note: we want to exclude the application popup window. |
| if (browser_window_->browser()->is_app() && |
| - !browser_window_->browser()->is_type_popup()) { |
| + browser_window_->browser()->is_type_tabbed()) { |
| // Update the system app icon. We don't need to update the icon in the top |
| // left of the custom frame, that will get updated when the throbber is |
| // updated. |
| @@ -802,6 +828,31 @@ gboolean BrowserTitlebar::OnScroll(GtkWidget* widget, GdkEventScroll* event) { |
| return TRUE; |
| } |
| +gboolean BrowserTitlebar::OnEnterNotify(GtkWidget* widget, |
| + GdkEventCrossing* event) { |
| + if (window_ && panel_wrench_button_.get()) |
| + gtk_widget_show(panel_wrench_button_->widget()); |
| + |
| + window_has_mouse_ = TRUE; |
| + return FALSE; |
| +} |
| + |
| +gboolean BrowserTitlebar::OnLeaveNotify(GtkWidget* widget, |
| + GdkEventCrossing* event) { |
| + if (window_ && panel_wrench_button_.get()) { |
| + // leave-notify-event gets fired on window when mouse moves to a child |
| + // widget inside the window. Check co-ordinates to determine whether the |
| + // mouse is in the window. |
| + window_has_mouse_ = |
| + event->x > 0 && event->x < browser_window_->GetBounds().width() && |
|
Evan Stade
2011/06/21 02:58:08
did you try using event->detail ?
prasadt
2011/06/21 18:21:06
No I didn't notice that field. I tried it and see
|
| + event->y > 0 && event->y < browser_window_->GetBounds().height(); |
| + if (!window_has_mouse_ && !window_has_focus_) |
| + gtk_widget_hide(panel_wrench_button_->widget()); |
| + } |
| + |
| + return FALSE; |
| +} |
| + |
| // static |
| void BrowserTitlebar::OnButtonClicked(GtkWidget* button) { |
| if (close_button_.get() && close_button_->widget() == button) { |
| @@ -912,9 +963,20 @@ void BrowserTitlebar::ActiveWindowChanged(GdkWindow* active_window) { |
| return; |
| window_has_focus_ = GTK_WIDGET(window_)->window == active_window; |
| + if (is_type_panel() && panel_wrench_button_.get()) { |
|
Evan Stade
2011/06/21 02:58:08
can panel_wrench_button_ actually be null here?
prasadt
2011/06/21 18:21:06
On closer look, no. Removed the check.
|
| + if (window_has_focus_ || window_has_mouse_) |
| + gtk_widget_show(panel_wrench_button_->widget()); |
| + else |
| + gtk_widget_hide(panel_wrench_button_->widget()); |
| + } |
| UpdateTextColor(); |
| } |
| +bool BrowserTitlebar::is_type_panel() { |
| + return CommandLine::ForCurrentProcess()->HasSwitch(switches::kEnablePanels) && |
|
Evan Stade
2011/06/21 02:58:08
why is the first part necessary?
prasadt
2011/06/21 18:21:06
Panel type is enabled by default (scratch pad for
|
| + browser_window_->browser()->is_type_panel(); |
| +} |
| + |
| /////////////////////////////////////////////////////////////////////////////// |
| // BrowserTitlebar::Throbber implementation |
| // TODO(tc): Handle anti-clockwise spinning when waiting for a connection. |