Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 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/panels/panel_browser_window_gtk.h" | 5 #include "chrome/browser/ui/panels/panel_browser_window_gtk.h" |
| 6 | 6 |
| 7 #include "base/bind.h" | 7 #include "base/bind.h" |
| 8 #include "chrome/browser/ui/browser_list.h" | 8 #include "chrome/browser/ui/browser_list.h" |
| 9 #include "chrome/browser/ui/gtk/browser_titlebar.h" | 9 #include "chrome/browser/ui/gtk/browser_titlebar.h" |
| 10 #include "chrome/browser/ui/panels/panel.h" | 10 #include "chrome/browser/ui/panels/panel.h" |
| 11 #include "chrome/browser/ui/panels/panel_bounds_animation.h" | 11 #include "chrome/browser/ui/panels/panel_bounds_animation.h" |
| 12 #include "chrome/browser/ui/panels/panel_drag_gtk.h" | |
| 12 #include "chrome/browser/ui/panels/panel_manager.h" | 13 #include "chrome/browser/ui/panels/panel_manager.h" |
| 13 #include "chrome/browser/ui/panels/panel_strip.h" | 14 #include "chrome/browser/ui/panels/panel_strip.h" |
| 14 #include "chrome/browser/ui/panels/panel_settings_menu_model.h" | 15 #include "chrome/browser/ui/panels/panel_settings_menu_model.h" |
| 15 #include "chrome/common/chrome_notification_types.h" | 16 #include "chrome/common/chrome_notification_types.h" |
| 16 #include "content/public/browser/notification_service.h" | 17 #include "content/public/browser/notification_service.h" |
| 17 #include "ui/base/dragdrop/gtk_dnd_util.h" | 18 #include "ui/base/dragdrop/gtk_dnd_util.h" |
| 18 | 19 |
| 19 using content::WebContents; | 20 using content::WebContents; |
| 20 | 21 |
| 21 namespace { | 22 namespace { |
| (...skipping 12 matching lines...) Expand all Loading... | |
| 34 | 35 |
| 35 // Markup for title text in draw attention state. Set to color white. | 36 // Markup for title text in draw attention state. Set to color white. |
| 36 const char* const kDrawAttentionTitleMarkupPrefix = | 37 const char* const kDrawAttentionTitleMarkupPrefix = |
| 37 "<span fgcolor='#ffffff'>"; | 38 "<span fgcolor='#ffffff'>"; |
| 38 const char* const kDrawAttentionTitleMarkupSuffix = "</span>"; | 39 const char* const kDrawAttentionTitleMarkupSuffix = "</span>"; |
| 39 | 40 |
| 40 // Set minimium width for window really small so it can be reduced to icon only | 41 // Set minimium width for window really small so it can be reduced to icon only |
| 41 // size in overflow expansion state. | 42 // size in overflow expansion state. |
| 42 const int kMinWindowWidth = 2; | 43 const int kMinWindowWidth = 2; |
| 43 | 44 |
| 44 } | 45 } // namespace |
| 45 | 46 |
| 46 NativePanel* Panel::CreateNativePanel(Browser* browser, Panel* panel, | 47 NativePanel* Panel::CreateNativePanel(Browser* browser, Panel* panel, |
| 47 const gfx::Rect& bounds) { | 48 const gfx::Rect& bounds) { |
| 48 PanelBrowserWindowGtk* panel_browser_window_gtk = | 49 PanelBrowserWindowGtk* panel_browser_window_gtk = |
| 49 new PanelBrowserWindowGtk(browser, panel, bounds); | 50 new PanelBrowserWindowGtk(browser, panel, bounds); |
| 50 panel_browser_window_gtk->Init(); | 51 panel_browser_window_gtk->Init(); |
| 51 return panel_browser_window_gtk; | 52 return panel_browser_window_gtk; |
| 52 } | 53 } |
| 53 | 54 |
| 54 PanelBrowserWindowGtk::PanelBrowserWindowGtk(Browser* browser, | 55 PanelBrowserWindowGtk::PanelBrowserWindowGtk(Browser* browser, |
| (...skipping 42 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 97 this, | 98 this, |
| 98 chrome::NOTIFICATION_PANEL_CHANGED_LAYOUT_MODE, | 99 chrome::NOTIFICATION_PANEL_CHANGED_LAYOUT_MODE, |
| 99 content::Source<Panel>(panel_.get())); | 100 content::Source<Panel>(panel_.get())); |
| 100 registrar_.Add( | 101 registrar_.Add( |
| 101 this, | 102 this, |
| 102 chrome::NOTIFICATION_WINDOW_CLOSED, | 103 chrome::NOTIFICATION_WINDOW_CLOSED, |
| 103 content::Source<GtkWindow>(window())); | 104 content::Source<GtkWindow>(window())); |
| 104 } | 105 } |
| 105 | 106 |
| 106 bool PanelBrowserWindowGtk::GetWindowEdge(int x, int y, GdkWindowEdge* edge) { | 107 bool PanelBrowserWindowGtk::GetWindowEdge(int x, int y, GdkWindowEdge* edge) { |
| 107 // Since panels are not resizable or movable by the user, we should not | 108 // Only detect the window edge when panels can be resized by the user. |
| 108 // detect the window edge for behavioral purposes. The edge, if any, | 109 // This method is used by the base class to detect when the cursor has |
| 109 // is present only for visual aspects. | 110 // hit the window edge in order to change the cursor to a resize cursor |
| 110 return FALSE; | 111 // and to detect when to initiate a resize drag. |
| 112 return panel_->CanResizeByMouse() ? | |
| 113 BrowserWindowGtk::GetWindowEdge(x, y, edge) : FALSE; | |
| 114 } | |
| 115 | |
| 116 void PanelBrowserWindowGtk::EnsureDragHelperCreated() { | |
| 117 if (drag_helper_.get()) | |
| 118 return; | |
| 119 | |
| 120 drag_helper_.reset(new PanelDragGtk(panel_.get())); | |
| 121 gtk_box_pack_end(GTK_BOX(window_vbox_), drag_helper_->widget(), | |
| 122 FALSE, FALSE, 0); | |
| 111 } | 123 } |
| 112 | 124 |
| 113 bool PanelBrowserWindowGtk::HandleTitleBarLeftMousePress( | 125 bool PanelBrowserWindowGtk::HandleTitleBarLeftMousePress( |
| 114 GdkEventButton* event, | 126 GdkEventButton* event, |
| 115 guint32 last_click_time, | 127 guint32 last_click_time, |
| 116 gfx::Point last_click_position) { | 128 gfx::Point last_click_position) { |
| 117 // In theory we should never enter this function as we have a handler for | 129 // In theory we should never enter this function as we have a handler for |
| 118 // button press on titlebar where we handle this. Not putting NOTREACHED() | 130 // button press on titlebar where we handle this. Not putting NOTREACHED() |
| 119 // here because we don't want to crash if hit-testing for titlebar in window | 131 // here because we don't want to crash if hit-testing for titlebar in window |
| 120 // button press handler in BrowserWindowGtk is off by a pixel or two. | 132 // button press handler in BrowserWindowGtk is off by a pixel or two. |
| 121 DLOG(WARNING) << "Hit-testing for titlebar off by a pixel or two?"; | 133 DLOG(WARNING) << "Hit-testing for titlebar off by a pixel or two?"; |
| 122 return TRUE; | 134 return TRUE; |
| 123 } | 135 } |
| 124 | 136 |
| 137 bool PanelBrowserWindowGtk::HandleWindowEdgeLeftMousePress( | |
| 138 GtkWindow* window, | |
| 139 GdkWindowEdge edge, | |
| 140 GdkEventButton* event) { | |
| 141 DCHECK_EQ(1U, event->button); | |
| 142 DCHECK_EQ(GDK_BUTTON_PRESS, event->type); | |
| 143 | |
| 144 EnsureDragHelperCreated(); | |
| 145 // Resize cursor was set by BrowserWindowGtk when mouse moved over | |
| 146 // window edge. | |
| 147 GdkCursor* cursor = | |
| 148 gdk_window_get_cursor(gtk_widget_get_window(GTK_WIDGET(window_))); | |
|
Evan Stade
2012/04/12 03:25:29
2 more indent
jennb
2012/04/12 18:00:24
Done.
| |
| 149 drag_helper_->InitialWindowEdgeMousePress(event, cursor, edge); | |
| 150 return TRUE; | |
| 151 } | |
| 152 | |
| 125 void PanelBrowserWindowGtk::SaveWindowPosition() { | 153 void PanelBrowserWindowGtk::SaveWindowPosition() { |
| 126 // We don't save window position for panels as it's controlled by | 154 // We don't save window position for panels as it's controlled by |
| 127 // PanelManager. | 155 // PanelManager. |
| 128 return; | 156 return; |
| 129 } | 157 } |
| 130 | 158 |
| 131 void PanelBrowserWindowGtk::SetGeometryHints() { | 159 void PanelBrowserWindowGtk::SetGeometryHints() { |
| 132 // Set minimum height the window can be set to. | 160 // Set minimum height the window can be set to. |
| 133 GdkGeometry hints; | 161 GdkGeometry hints; |
| 134 hints.min_height = Panel::kMinimizedPanelHeight; | 162 hints.min_height = Panel::kMinimizedPanelHeight; |
| (...skipping 144 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 279 bounds_animator_.reset(); | 307 bounds_animator_.reset(); |
| 280 | 308 |
| 281 CleanupDragDrop(); | 309 CleanupDragDrop(); |
| 282 if (drag_widget_) { | 310 if (drag_widget_) { |
| 283 // Terminate the grab if we have it. We could do this using any widget, | 311 // Terminate the grab if we have it. We could do this using any widget, |
| 284 // |drag_widget_| is just convenient. | 312 // |drag_widget_| is just convenient. |
| 285 gtk_grab_add(drag_widget_); | 313 gtk_grab_add(drag_widget_); |
| 286 gtk_grab_remove(drag_widget_); | 314 gtk_grab_remove(drag_widget_); |
| 287 DestroyDragWidget(); | 315 DestroyDragWidget(); |
| 288 } | 316 } |
| 317 | |
| 318 if (drag_helper_.get()) | |
| 319 drag_helper_.reset(); | |
| 320 | |
| 289 panel_->OnNativePanelClosed(); | 321 panel_->OnNativePanelClosed(); |
| 290 break; | 322 break; |
| 291 } | 323 } |
| 292 | 324 |
| 293 BrowserWindowGtk::Observe(type, source, details); | 325 BrowserWindowGtk::Observe(type, source, details); |
| 294 } | 326 } |
| 295 | 327 |
| 296 void PanelBrowserWindowGtk::ShowPanel() { | 328 void PanelBrowserWindowGtk::ShowPanel() { |
| 297 Show(); | 329 Show(); |
| 298 } | 330 } |
| (...skipping 253 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 552 CreateDragWidget(); | 584 CreateDragWidget(); |
| 553 if (!system_drag_disabled_for_testing_) { | 585 if (!system_drag_disabled_for_testing_) { |
| 554 GtkTargetList* list = ui::GetTargetListFromCodeMask(ui::CHROME_TAB); | 586 GtkTargetList* list = ui::GetTargetListFromCodeMask(ui::CHROME_TAB); |
| 555 gtk_drag_begin(drag_widget_, list, GDK_ACTION_MOVE, 1, last_mouse_down_); | 587 gtk_drag_begin(drag_widget_, list, GDK_ACTION_MOVE, 1, last_mouse_down_); |
| 556 // gtk_drag_begin increments reference count for GtkTargetList. So unref | 588 // gtk_drag_begin increments reference count for GtkTargetList. So unref |
| 557 // it here to reduce the reference count. | 589 // it here to reduce the reference count. |
| 558 gtk_target_list_unref(list); | 590 gtk_target_list_unref(list); |
| 559 } | 591 } |
| 560 panel_->manager()->StartDragging(panel_.get(), gfx::Point(old_x, old_y)); | 592 panel_->manager()->StartDragging(panel_.get(), gfx::Point(old_x, old_y)); |
| 561 } | 593 } |
| 562 | |
| 563 if (drag_widget_) { | 594 if (drag_widget_) { |
| 564 panel_->manager()->Drag(gfx::Point(new_x, new_y)); | 595 panel_->manager()->Drag(gfx::Point(new_x, new_y)); |
| 565 gdk_event_free(last_mouse_down_); | 596 gdk_event_free(last_mouse_down_); |
| 566 last_mouse_down_ = gdk_event_copy(event); | 597 last_mouse_down_ = gdk_event_copy(event); |
| 567 } | 598 } |
| 568 } | 599 } |
| 569 | 600 |
| 570 void PanelBrowserWindowGtk::AnimationEnded(const ui::Animation* animation) { | 601 void PanelBrowserWindowGtk::AnimationEnded(const ui::Animation* animation) { |
| 571 titlebar()->SendEnterNotifyToCloseButtonIfUnderMouse(); | 602 titlebar()->SendEnterNotifyToCloseButtonIfUnderMouse(); |
| 572 | 603 |
| (...skipping 328 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 901 MessageLoopForUI::current()->RunAllPending(); | 932 MessageLoopForUI::current()->RunAllPending(); |
| 902 } | 933 } |
| 903 | 934 |
| 904 bool NativePanelTestingGtk::IsWindowSizeKnown() const { | 935 bool NativePanelTestingGtk::IsWindowSizeKnown() const { |
| 905 return !panel_browser_window_gtk_->frame_size_.IsEmpty(); | 936 return !panel_browser_window_gtk_->frame_size_.IsEmpty(); |
| 906 } | 937 } |
| 907 | 938 |
| 908 bool NativePanelTestingGtk::IsAnimatingBounds() const { | 939 bool NativePanelTestingGtk::IsAnimatingBounds() const { |
| 909 return panel_browser_window_gtk_->IsAnimatingBounds(); | 940 return panel_browser_window_gtk_->IsAnimatingBounds(); |
| 910 } | 941 } |
| OLD | NEW |