Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 // Copyright (c) 2011 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2011 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "chrome/browser/ui/gtk/browser_titlebar.h" | 5 #include "chrome/browser/ui/gtk/browser_titlebar.h" |
| 6 | 6 |
| 7 #include <gdk/gdkkeysyms.h> | 7 #include <gdk/gdkkeysyms.h> |
| 8 #include <gtk/gtk.h> | 8 #include <gtk/gtk.h> |
| 9 | 9 |
| 10 #include <string> | 10 #include <string> |
| (...skipping 201 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 212 titlebar_left_buttons_hbox_(NULL), | 212 titlebar_left_buttons_hbox_(NULL), |
| 213 titlebar_right_buttons_hbox_(NULL), | 213 titlebar_right_buttons_hbox_(NULL), |
| 214 titlebar_left_spy_frame_(NULL), | 214 titlebar_left_spy_frame_(NULL), |
| 215 titlebar_right_spy_frame_(NULL), | 215 titlebar_right_spy_frame_(NULL), |
| 216 top_padding_left_(NULL), | 216 top_padding_left_(NULL), |
| 217 top_padding_right_(NULL), | 217 top_padding_right_(NULL), |
| 218 app_mode_favicon_(NULL), | 218 app_mode_favicon_(NULL), |
| 219 app_mode_title_(NULL), | 219 app_mode_title_(NULL), |
| 220 using_custom_frame_(false), | 220 using_custom_frame_(false), |
| 221 window_has_focus_(false), | 221 window_has_focus_(false), |
| 222 window_has_mouse_(false), | |
| 222 theme_service_(NULL) { | 223 theme_service_(NULL) { |
| 223 Init(); | 224 Init(); |
| 224 } | 225 } |
| 225 | 226 |
| 226 void BrowserTitlebar::Init() { | 227 void BrowserTitlebar::Init() { |
| 227 // The widget hierarchy is shown below. | 228 // The widget hierarchy is shown below. |
| 228 // | 229 // |
| 229 // +- EventBox (container_) ------------------------------------------------+ | 230 // +- EventBox (container_) ------------------------------------------------+ |
| 230 // +- HBox (container_hbox_) -----------------------------------------------+ | 231 // +- HBox (container_hbox_) -----------------------------------------------+ |
| 231 // |+ VBox ---++- Algn. -++- Alignment --------------++- Algn. -++ VBox ---+| | 232 // |+ VBox ---++- Algn. -++- Alignment --------------++- Algn. -++ VBox ---+| |
| (...skipping 45 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 277 container_ = gtk_event_box_new(); | 278 container_ = gtk_event_box_new(); |
| 278 gtk_widget_set_name(container_, "chrome-browser-titlebar"); | 279 gtk_widget_set_name(container_, "chrome-browser-titlebar"); |
| 279 gtk_event_box_set_visible_window(GTK_EVENT_BOX(container_), FALSE); | 280 gtk_event_box_set_visible_window(GTK_EVENT_BOX(container_), FALSE); |
| 280 gtk_container_add(GTK_CONTAINER(container_), container_hbox_); | 281 gtk_container_add(GTK_CONTAINER(container_), container_hbox_); |
| 281 | 282 |
| 282 g_signal_connect(container_, "scroll-event", G_CALLBACK(OnScrollThunk), this); | 283 g_signal_connect(container_, "scroll-event", G_CALLBACK(OnScrollThunk), this); |
| 283 | 284 |
| 284 g_signal_connect(window_, "window-state-event", | 285 g_signal_connect(window_, "window-state-event", |
| 285 G_CALLBACK(OnWindowStateChangedThunk), this); | 286 G_CALLBACK(OnWindowStateChangedThunk), this); |
| 286 | 287 |
| 288 if (is_type_panel()) { | |
| 289 g_signal_connect(window_, "enter-notify-event", | |
| 290 G_CALLBACK(OnEnterNotifyThunk), this); | |
| 291 g_signal_connect(window_, "leave-notify-event", | |
| 292 G_CALLBACK(OnLeaveNotifyThunk), this); | |
| 293 } | |
| 294 | |
| 287 // Allocate the two button boxes on the left and right parts of the bar, | 295 // Allocate the two button boxes on the left and right parts of the bar, |
| 288 // spyguy frames in case of incognito mode, and profile button boxes. | 296 // spyguy frames in case of incognito mode, and profile button boxes. |
| 289 titlebar_left_buttons_vbox_ = gtk_vbox_new(FALSE, 0); | 297 titlebar_left_buttons_vbox_ = gtk_vbox_new(FALSE, 0); |
| 298 | |
|
Evan Stade
2011/06/21 02:58:08
?
prasadt
2011/06/21 18:21:06
Done. Removed empty line, left over from some cha
| |
| 290 gtk_box_pack_start(GTK_BOX(container_hbox_), titlebar_left_buttons_vbox_, | 299 gtk_box_pack_start(GTK_BOX(container_hbox_), titlebar_left_buttons_vbox_, |
| 291 FALSE, FALSE, 0); | 300 FALSE, FALSE, 0); |
| 292 if (browser_window_->browser()->profile()->IsOffTheRecord() && | 301 if (browser_window_->browser()->profile()->IsOffTheRecord() && |
| 293 browser_window_->browser()->is_type_tabbed()) { | 302 browser_window_->browser()->is_type_tabbed()) { |
| 294 titlebar_left_spy_frame_ = gtk_alignment_new(0.0, 0.0, 1.0, 1.0); | 303 titlebar_left_spy_frame_ = gtk_alignment_new(0.0, 0.0, 1.0, 1.0); |
| 295 gtk_widget_set_no_show_all(titlebar_left_spy_frame_, TRUE); | 304 gtk_widget_set_no_show_all(titlebar_left_spy_frame_, TRUE); |
| 296 gtk_alignment_set_padding(GTK_ALIGNMENT(titlebar_left_spy_frame_), 0, | 305 gtk_alignment_set_padding(GTK_ALIGNMENT(titlebar_left_spy_frame_), 0, |
| 297 kOTRBottomSpacing, kOTRSideSpacing, kOTRSideSpacing); | 306 kOTRBottomSpacing, kOTRSideSpacing, kOTRSideSpacing); |
| 298 gtk_box_pack_start(GTK_BOX(container_hbox_), titlebar_left_spy_frame_, | 307 gtk_box_pack_start(GTK_BOX(container_hbox_), titlebar_left_spy_frame_, |
| 299 FALSE, FALSE, 0); | 308 FALSE, FALSE, 0); |
| (...skipping 21 matching lines...) Expand all Loading... | |
| 321 if (browser_window_->browser()->profile()->IsOffTheRecord() && | 330 if (browser_window_->browser()->profile()->IsOffTheRecord() && |
| 322 browser_window_->browser()->is_type_tabbed()) { | 331 browser_window_->browser()->is_type_tabbed()) { |
| 323 titlebar_right_spy_frame_ = gtk_alignment_new(0.0, 0.0, 1.0, 1.0); | 332 titlebar_right_spy_frame_ = gtk_alignment_new(0.0, 0.0, 1.0, 1.0); |
| 324 gtk_widget_set_no_show_all(titlebar_right_spy_frame_, TRUE); | 333 gtk_widget_set_no_show_all(titlebar_right_spy_frame_, TRUE); |
| 325 gtk_alignment_set_padding(GTK_ALIGNMENT(titlebar_right_spy_frame_), 0, | 334 gtk_alignment_set_padding(GTK_ALIGNMENT(titlebar_right_spy_frame_), 0, |
| 326 kOTRBottomSpacing, kOTRSideSpacing, kOTRSideSpacing); | 335 kOTRBottomSpacing, kOTRSideSpacing, kOTRSideSpacing); |
| 327 gtk_box_pack_end(GTK_BOX(container_hbox_), titlebar_right_spy_frame_, | 336 gtk_box_pack_end(GTK_BOX(container_hbox_), titlebar_right_spy_frame_, |
| 328 FALSE, FALSE, 0); | 337 FALSE, FALSE, 0); |
| 329 } | 338 } |
| 330 titlebar_right_buttons_vbox_ = gtk_vbox_new(FALSE, 0); | 339 titlebar_right_buttons_vbox_ = gtk_vbox_new(FALSE, 0); |
| 340 | |
|
Evan Stade
2011/06/21 02:58:08
?
prasadt
2011/06/21 18:21:06
Done.
| |
| 331 gtk_box_pack_end(GTK_BOX(container_hbox_), titlebar_right_buttons_vbox_, | 341 gtk_box_pack_end(GTK_BOX(container_hbox_), titlebar_right_buttons_vbox_, |
| 332 FALSE, FALSE, 0); | 342 FALSE, FALSE, 0); |
| 333 | 343 |
| 334 #if defined(USE_GCONF) | 344 #if defined(USE_GCONF) |
| 335 // Either read the gconf database and register for updates (on GNOME), or use | 345 // Either read the gconf database and register for updates (on GNOME), or use |
| 336 // the default value (anywhere else). | 346 // the default value (anywhere else). |
| 337 GConfTitlebarListener::GetInstance()->SetTitlebarButtons(this); | 347 GConfTitlebarListener::GetInstance()->SetTitlebarButtons(this); |
| 338 #else | 348 #else |
| 339 BuildButtons(kDefaultButtonString); | 349 BuildButtons(kDefaultButtonString); |
| 340 #endif | 350 #endif |
| (...skipping 28 matching lines...) Expand all Loading... | |
| 369 FALSE, 0); | 379 FALSE, 0); |
| 370 // We use the app logo as a placeholder image so the title doesn't jump | 380 // We use the app logo as a placeholder image so the title doesn't jump |
| 371 // around. | 381 // around. |
| 372 ResourceBundle& rb = ResourceBundle::GetSharedInstance(); | 382 ResourceBundle& rb = ResourceBundle::GetSharedInstance(); |
| 373 app_mode_favicon_ = gtk_image_new_from_pixbuf( | 383 app_mode_favicon_ = gtk_image_new_from_pixbuf( |
| 374 rb.GetRTLEnabledPixbufNamed(IDR_PRODUCT_LOGO_16)); | 384 rb.GetRTLEnabledPixbufNamed(IDR_PRODUCT_LOGO_16)); |
| 375 g_object_set_data(G_OBJECT(app_mode_favicon_), "left-align-popup", | 385 g_object_set_data(G_OBJECT(app_mode_favicon_), "left-align-popup", |
| 376 reinterpret_cast<void*>(true)); | 386 reinterpret_cast<void*>(true)); |
| 377 gtk_container_add(GTK_CONTAINER(favicon_event_box), app_mode_favicon_); | 387 gtk_container_add(GTK_CONTAINER(favicon_event_box), app_mode_favicon_); |
| 378 | 388 |
| 389 if (is_type_panel()) { | |
| 390 panel_wrench_button_.reset( | |
| 391 BuildTitlebarButton(IDR_BALLOON_WRENCH, IDR_BALLOON_WRENCH_P, | |
| 392 IDR_BALLOON_WRENCH_H, app_mode_hbox, FALSE, | |
| 393 IDS_NEW_TAB_APP_SETTINGS)); | |
| 394 gtk_widget_set_no_show_all(panel_wrench_button_->widget(), TRUE); | |
| 395 } | |
| 396 | |
| 379 app_mode_title_ = gtk_label_new(NULL); | 397 app_mode_title_ = gtk_label_new(NULL); |
| 380 gtk_label_set_ellipsize(GTK_LABEL(app_mode_title_), PANGO_ELLIPSIZE_END); | 398 gtk_label_set_ellipsize(GTK_LABEL(app_mode_title_), PANGO_ELLIPSIZE_END); |
| 381 gtk_misc_set_alignment(GTK_MISC(app_mode_title_), 0.0, 0.5); | 399 gtk_misc_set_alignment(GTK_MISC(app_mode_title_), 0.0, 0.5); |
| 382 gtk_box_pack_start(GTK_BOX(app_mode_hbox), app_mode_title_, TRUE, TRUE, | 400 gtk_box_pack_start(GTK_BOX(app_mode_hbox), app_mode_title_, TRUE, TRUE, |
| 383 0); | 401 0); |
| 384 | 402 |
| 385 // Register with the theme provider to set the |app_mode_title_| label | 403 // Register with the theme provider to set the |app_mode_title_| label |
| 386 // color. | 404 // color. |
| 387 theme_service_ = GtkThemeService::GetFrom( | 405 theme_service_ = GtkThemeService::GetFrom( |
| 388 browser_window_->browser()->profile()); | 406 browser_window_->browser()->profile()); |
| (...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 422 tokenizer.set_options(StringTokenizer::RETURN_DELIMS); | 440 tokenizer.set_options(StringTokenizer::RETURN_DELIMS); |
| 423 int left_count = 0; | 441 int left_count = 0; |
| 424 int right_count = 0; | 442 int right_count = 0; |
| 425 while (tokenizer.GetNext()) { | 443 while (tokenizer.GetNext()) { |
| 426 if (tokenizer.token_is_delim()) { | 444 if (tokenizer.token_is_delim()) { |
| 427 if (*tokenizer.token_begin() == ':') | 445 if (*tokenizer.token_begin() == ':') |
| 428 left_side = false; | 446 left_side = false; |
| 429 } else { | 447 } else { |
| 430 base::StringPiece token = tokenizer.token_piece(); | 448 base::StringPiece token = tokenizer.token_piece(); |
| 431 if (token == "minimize") { | 449 if (token == "minimize") { |
| 432 (left_side ? left_count : right_count)++; | 450 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.
| |
| 433 GtkWidget* parent_box = GetButtonHBox(left_side); | 451 (left_side ? left_count : right_count)++; |
| 434 minimize_button_.reset( | 452 GtkWidget* parent_box = GetButtonHBox(left_side); |
| 435 BuildTitlebarButton(IDR_MINIMIZE, IDR_MINIMIZE_P, | 453 minimize_button_.reset( |
| 436 IDR_MINIMIZE_H, parent_box, | 454 BuildTitlebarButton(IDR_MINIMIZE, IDR_MINIMIZE_P, |
| 437 IDS_XPFRAME_MINIMIZE_TOOLTIP)); | 455 IDR_MINIMIZE_H, parent_box, true, |
| 456 IDS_XPFRAME_MINIMIZE_TOOLTIP)); | |
| 438 | 457 |
| 439 gtk_widget_size_request(minimize_button_->widget(), | 458 gtk_widget_size_request(minimize_button_->widget(), |
| 440 &minimize_button_req_); | 459 &minimize_button_req_); |
| 460 } | |
| 441 } else if (token == "maximize") { | 461 } else if (token == "maximize") { |
| 442 (left_side ? left_count : right_count)++; | 462 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.
| |
| 443 GtkWidget* parent_box = GetButtonHBox(left_side); | 463 (left_side ? left_count : right_count)++; |
| 444 restore_button_.reset( | 464 GtkWidget* parent_box = GetButtonHBox(left_side); |
| 445 BuildTitlebarButton(IDR_RESTORE, IDR_RESTORE_P, | 465 restore_button_.reset( |
| 446 IDR_RESTORE_H, parent_box, | 466 BuildTitlebarButton(IDR_RESTORE, IDR_RESTORE_P, |
| 447 IDS_XPFRAME_RESTORE_TOOLTIP)); | 467 IDR_RESTORE_H, parent_box, true, |
| 448 maximize_button_.reset( | 468 IDS_XPFRAME_RESTORE_TOOLTIP)); |
| 449 BuildTitlebarButton(IDR_MAXIMIZE, IDR_MAXIMIZE_P, | 469 maximize_button_.reset( |
| 450 IDR_MAXIMIZE_H, parent_box, | 470 BuildTitlebarButton(IDR_MAXIMIZE, IDR_MAXIMIZE_P, |
| 451 IDS_XPFRAME_MAXIMIZE_TOOLTIP)); | 471 IDR_MAXIMIZE_H, parent_box, true, |
| 472 IDS_XPFRAME_MAXIMIZE_TOOLTIP)); | |
| 452 | 473 |
| 453 gtk_util::SetButtonClickableByMouseButtons(maximize_button_->widget(), | 474 gtk_util::SetButtonClickableByMouseButtons(maximize_button_->widget(), |
| 454 true, true, true); | 475 true, true, true); |
| 455 gtk_widget_size_request(restore_button_->widget(), | 476 gtk_widget_size_request(restore_button_->widget(), |
| 456 &restore_button_req_); | 477 &restore_button_req_); |
| 478 } | |
| 457 } else if (token == "close") { | 479 } else if (token == "close") { |
| 458 (left_side ? left_count : right_count)++; | 480 (left_side ? left_count : right_count)++; |
| 459 GtkWidget* parent_box = GetButtonHBox(left_side); | 481 GtkWidget* parent_box = GetButtonHBox(left_side); |
| 460 close_button_.reset( | 482 close_button_.reset( |
| 461 BuildTitlebarButton(IDR_CLOSE, IDR_CLOSE_P, | 483 BuildTitlebarButton(IDR_CLOSE, IDR_CLOSE_P, |
| 462 IDR_CLOSE_H, parent_box, | 484 IDR_CLOSE_H, parent_box, true, |
| 463 IDS_XPFRAME_CLOSE_TOOLTIP)); | 485 IDS_XPFRAME_CLOSE_TOOLTIP)); |
| 464 close_button_->set_flipped(left_side); | 486 close_button_->set_flipped(left_side); |
| 465 | 487 |
| 466 gtk_widget_size_request(close_button_->widget(), &close_button_req_); | 488 gtk_widget_size_request(close_button_->widget(), &close_button_req_); |
| 467 } | 489 } |
| 468 // Ignore any other values like "pin" since we don't have images for | 490 // Ignore any other values like "pin" since we don't have images for |
| 469 // those. | 491 // those. |
| 470 } | 492 } |
| 471 } | 493 } |
| 472 | 494 |
| (...skipping 52 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 525 top_padding_left_ = top_padding; | 547 top_padding_left_ = top_padding; |
| 526 } else { | 548 } else { |
| 527 titlebar_right_buttons_hbox_ = buttons_hbox; | 549 titlebar_right_buttons_hbox_ = buttons_hbox; |
| 528 top_padding_right_ = top_padding; | 550 top_padding_right_ = top_padding; |
| 529 } | 551 } |
| 530 | 552 |
| 531 return buttons_hbox; | 553 return buttons_hbox; |
| 532 } | 554 } |
| 533 | 555 |
| 534 CustomDrawButton* BrowserTitlebar::BuildTitlebarButton(int image, | 556 CustomDrawButton* BrowserTitlebar::BuildTitlebarButton(int image, |
| 535 int image_pressed, int image_hot, GtkWidget* box, int tooltip) { | 557 int image_pressed, int image_hot, GtkWidget* box, bool start, |
| 558 int tooltip) { | |
| 536 CustomDrawButton* button = new CustomDrawButton(image, image_pressed, | 559 CustomDrawButton* button = new CustomDrawButton(image, image_pressed, |
| 537 image_hot, 0); | 560 image_hot, 0); |
| 538 gtk_widget_add_events(GTK_WIDGET(button->widget()), GDK_POINTER_MOTION_MASK); | 561 gtk_widget_add_events(GTK_WIDGET(button->widget()), GDK_POINTER_MOTION_MASK); |
| 539 g_signal_connect(button->widget(), "clicked", | 562 g_signal_connect(button->widget(), "clicked", |
| 540 G_CALLBACK(OnButtonClickedThunk), this); | 563 G_CALLBACK(OnButtonClickedThunk), this); |
| 541 g_signal_connect(button->widget(), "motion-notify-event", | 564 g_signal_connect(button->widget(), "motion-notify-event", |
| 542 G_CALLBACK(OnMouseMoveEvent), browser_window_); | 565 G_CALLBACK(OnMouseMoveEvent), browser_window_); |
| 543 std::string localized_tooltip = l10n_util::GetStringUTF8(tooltip); | 566 std::string localized_tooltip = l10n_util::GetStringUTF8(tooltip); |
| 544 gtk_widget_set_tooltip_text(button->widget(), | 567 gtk_widget_set_tooltip_text(button->widget(), |
| 545 localized_tooltip.c_str()); | 568 localized_tooltip.c_str()); |
| 546 gtk_box_pack_start(GTK_BOX(box), button->widget(), FALSE, FALSE, 0); | 569 if (start) |
| 570 gtk_box_pack_start(GTK_BOX(box), button->widget(), FALSE, FALSE, 0); | |
| 571 else | |
| 572 gtk_box_pack_end(GTK_BOX(box), button->widget(), FALSE, FALSE, 0); | |
| 547 return button; | 573 return button; |
| 548 } | 574 } |
| 549 | 575 |
| 550 void BrowserTitlebar::UpdateCustomFrame(bool use_custom_frame) { | 576 void BrowserTitlebar::UpdateCustomFrame(bool use_custom_frame) { |
| 551 using_custom_frame_ = use_custom_frame; | 577 using_custom_frame_ = use_custom_frame; |
| 552 if (!use_custom_frame || | 578 if (!use_custom_frame || |
| 553 (browser_window_->IsMaximized() && unity::IsRunning())) { | 579 (browser_window_->IsMaximized() && unity::IsRunning())) { |
| 554 if (titlebar_left_buttons_vbox_) | 580 if (titlebar_left_buttons_vbox_) |
| 555 gtk_widget_hide(titlebar_left_buttons_vbox_); | 581 gtk_widget_hide(titlebar_left_buttons_vbox_); |
| 556 if (titlebar_right_buttons_vbox_) | 582 if (titlebar_right_buttons_vbox_) |
| (...skipping 11 matching lines...) Expand all Loading... | |
| 568 void BrowserTitlebar::UpdateTitleAndIcon() { | 594 void BrowserTitlebar::UpdateTitleAndIcon() { |
| 569 if (!app_mode_title_) | 595 if (!app_mode_title_) |
| 570 return; | 596 return; |
| 571 | 597 |
| 572 // Get the page title and elide it to the available space. | 598 // Get the page title and elide it to the available space. |
| 573 string16 title = browser_window_->browser()->GetWindowTitleForCurrentTab(); | 599 string16 title = browser_window_->browser()->GetWindowTitleForCurrentTab(); |
| 574 gtk_label_set_text(GTK_LABEL(app_mode_title_), UTF16ToUTF8(title).c_str()); | 600 gtk_label_set_text(GTK_LABEL(app_mode_title_), UTF16ToUTF8(title).c_str()); |
| 575 | 601 |
| 576 // Note: we want to exclude the application popup window. | 602 // Note: we want to exclude the application popup window. |
| 577 if (browser_window_->browser()->is_app() && | 603 if (browser_window_->browser()->is_app() && |
| 578 !browser_window_->browser()->is_type_popup()) { | 604 browser_window_->browser()->is_type_tabbed()) { |
| 579 // Update the system app icon. We don't need to update the icon in the top | 605 // Update the system app icon. We don't need to update the icon in the top |
| 580 // left of the custom frame, that will get updated when the throbber is | 606 // left of the custom frame, that will get updated when the throbber is |
| 581 // updated. | 607 // updated. |
| 582 SkBitmap icon = browser_window_->browser()->GetCurrentPageIcon(); | 608 SkBitmap icon = browser_window_->browser()->GetCurrentPageIcon(); |
| 583 if (icon.empty()) { | 609 if (icon.empty()) { |
| 584 gtk_util::SetWindowIcon(window_); | 610 gtk_util::SetWindowIcon(window_); |
| 585 } else { | 611 } else { |
| 586 GdkPixbuf* icon_pixbuf = gfx::GdkPixbufFromSkBitmap(&icon); | 612 GdkPixbuf* icon_pixbuf = gfx::GdkPixbufFromSkBitmap(&icon); |
| 587 gtk_window_set_icon(window_, icon_pixbuf); | 613 gtk_window_set_icon(window_, icon_pixbuf); |
| 588 g_object_unref(icon_pixbuf); | 614 g_object_unref(icon_pixbuf); |
| (...skipping 206 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 795 if (event->direction == GDK_SCROLL_LEFT || | 821 if (event->direction == GDK_SCROLL_LEFT || |
| 796 event->direction == GDK_SCROLL_UP) { | 822 event->direction == GDK_SCROLL_UP) { |
| 797 if (index != 0) | 823 if (index != 0) |
| 798 tabstrip_model->SelectPreviousTab(); | 824 tabstrip_model->SelectPreviousTab(); |
| 799 } else if (index + 1 < tabstrip_model->count()) { | 825 } else if (index + 1 < tabstrip_model->count()) { |
| 800 tabstrip_model->SelectNextTab(); | 826 tabstrip_model->SelectNextTab(); |
| 801 } | 827 } |
| 802 return TRUE; | 828 return TRUE; |
| 803 } | 829 } |
| 804 | 830 |
| 831 gboolean BrowserTitlebar::OnEnterNotify(GtkWidget* widget, | |
| 832 GdkEventCrossing* event) { | |
| 833 if (window_ && panel_wrench_button_.get()) | |
| 834 gtk_widget_show(panel_wrench_button_->widget()); | |
| 835 | |
| 836 window_has_mouse_ = TRUE; | |
| 837 return FALSE; | |
| 838 } | |
| 839 | |
| 840 gboolean BrowserTitlebar::OnLeaveNotify(GtkWidget* widget, | |
| 841 GdkEventCrossing* event) { | |
| 842 if (window_ && panel_wrench_button_.get()) { | |
| 843 // leave-notify-event gets fired on window when mouse moves to a child | |
| 844 // widget inside the window. Check co-ordinates to determine whether the | |
| 845 // mouse is in the window. | |
| 846 window_has_mouse_ = | |
| 847 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
| |
| 848 event->y > 0 && event->y < browser_window_->GetBounds().height(); | |
| 849 if (!window_has_mouse_ && !window_has_focus_) | |
| 850 gtk_widget_hide(panel_wrench_button_->widget()); | |
| 851 } | |
| 852 | |
| 853 return FALSE; | |
| 854 } | |
| 855 | |
| 805 // static | 856 // static |
| 806 void BrowserTitlebar::OnButtonClicked(GtkWidget* button) { | 857 void BrowserTitlebar::OnButtonClicked(GtkWidget* button) { |
| 807 if (close_button_.get() && close_button_->widget() == button) { | 858 if (close_button_.get() && close_button_->widget() == button) { |
| 808 browser_window_->Close(); | 859 browser_window_->Close(); |
| 809 } else if (restore_button_.get() && restore_button_->widget() == button) { | 860 } else if (restore_button_.get() && restore_button_->widget() == button) { |
| 810 browser_window_->UnMaximize(); | 861 browser_window_->UnMaximize(); |
| 811 } else if (maximize_button_.get() && maximize_button_->widget() == button) { | 862 } else if (maximize_button_.get() && maximize_button_->widget() == button) { |
| 812 MaximizeButtonClicked(); | 863 MaximizeButtonClicked(); |
| 813 } else if (minimize_button_.get() && minimize_button_->widget() == button) { | 864 } else if (minimize_button_.get() && minimize_button_->widget() == button) { |
| 814 gtk_window_iconify(window_); | 865 gtk_window_iconify(window_); |
| (...skipping 90 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 905 } | 956 } |
| 906 } | 957 } |
| 907 | 958 |
| 908 void BrowserTitlebar::ActiveWindowChanged(GdkWindow* active_window) { | 959 void BrowserTitlebar::ActiveWindowChanged(GdkWindow* active_window) { |
| 909 // Can be called during shutdown; BrowserWindowGtk will set our |window_| | 960 // Can be called during shutdown; BrowserWindowGtk will set our |window_| |
| 910 // to NULL during that time. | 961 // to NULL during that time. |
| 911 if (!window_) | 962 if (!window_) |
| 912 return; | 963 return; |
| 913 | 964 |
| 914 window_has_focus_ = GTK_WIDGET(window_)->window == active_window; | 965 window_has_focus_ = GTK_WIDGET(window_)->window == active_window; |
| 966 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.
| |
| 967 if (window_has_focus_ || window_has_mouse_) | |
| 968 gtk_widget_show(panel_wrench_button_->widget()); | |
| 969 else | |
| 970 gtk_widget_hide(panel_wrench_button_->widget()); | |
| 971 } | |
| 915 UpdateTextColor(); | 972 UpdateTextColor(); |
| 916 } | 973 } |
| 917 | 974 |
| 975 bool BrowserTitlebar::is_type_panel() { | |
| 976 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
| |
| 977 browser_window_->browser()->is_type_panel(); | |
| 978 } | |
| 979 | |
| 918 /////////////////////////////////////////////////////////////////////////////// | 980 /////////////////////////////////////////////////////////////////////////////// |
| 919 // BrowserTitlebar::Throbber implementation | 981 // BrowserTitlebar::Throbber implementation |
| 920 // TODO(tc): Handle anti-clockwise spinning when waiting for a connection. | 982 // TODO(tc): Handle anti-clockwise spinning when waiting for a connection. |
| 921 | 983 |
| 922 // We don't bother to clean up these or the pixbufs they contain when we exit. | 984 // We don't bother to clean up these or the pixbufs they contain when we exit. |
| 923 static std::vector<GdkPixbuf*>* g_throbber_frames = NULL; | 985 static std::vector<GdkPixbuf*>* g_throbber_frames = NULL; |
| 924 static std::vector<GdkPixbuf*>* g_throbber_waiting_frames = NULL; | 986 static std::vector<GdkPixbuf*>* g_throbber_waiting_frames = NULL; |
| 925 | 987 |
| 926 // Load |resource_id| from the ResourceBundle and split it into a series of | 988 // Load |resource_id| from the ResourceBundle and split it into a series of |
| 927 // square GdkPixbufs that get stored in |frames|. | 989 // square GdkPixbufs that get stored in |frames|. |
| (...skipping 47 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 975 ui::SimpleMenuModel::Delegate* delegate) | 1037 ui::SimpleMenuModel::Delegate* delegate) |
| 976 : SimpleMenuModel(delegate) { | 1038 : SimpleMenuModel(delegate) { |
| 977 AddItemWithStringId(IDC_NEW_TAB, IDS_TAB_CXMENU_NEWTAB); | 1039 AddItemWithStringId(IDC_NEW_TAB, IDS_TAB_CXMENU_NEWTAB); |
| 978 AddItemWithStringId(IDC_RESTORE_TAB, IDS_RESTORE_TAB); | 1040 AddItemWithStringId(IDC_RESTORE_TAB, IDS_RESTORE_TAB); |
| 979 AddSeparator(); | 1041 AddSeparator(); |
| 980 AddItemWithStringId(IDC_TASK_MANAGER, IDS_TASK_MANAGER); | 1042 AddItemWithStringId(IDC_TASK_MANAGER, IDS_TASK_MANAGER); |
| 981 AddSeparator(); | 1043 AddSeparator(); |
| 982 AddCheckItemWithStringId(kShowWindowDecorationsCommand, | 1044 AddCheckItemWithStringId(kShowWindowDecorationsCommand, |
| 983 IDS_SHOW_WINDOW_DECORATIONS_MENU); | 1045 IDS_SHOW_WINDOW_DECORATIONS_MENU); |
| 984 } | 1046 } |
| OLD | NEW |