| 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_window_gtk.h" | 5 #include "chrome/browser/ui/gtk/browser_window_gtk.h" |
| 6 | 6 |
| 7 #include <gdk/gdkkeysyms.h> | 7 #include <gdk/gdkkeysyms.h> |
| 8 | 8 |
| 9 #include <dlfcn.h> | 9 #include <dlfcn.h> |
| 10 #include <string> | 10 #include <string> |
| (...skipping 306 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 317 render_area_vbox_(NULL), | 317 render_area_vbox_(NULL), |
| 318 render_area_floating_container_(NULL), | 318 render_area_floating_container_(NULL), |
| 319 render_area_event_box_(NULL), | 319 render_area_event_box_(NULL), |
| 320 toolbar_border_(NULL), | 320 toolbar_border_(NULL), |
| 321 browser_(browser), | 321 browser_(browser), |
| 322 state_(GDK_WINDOW_STATE_WITHDRAWN), | 322 state_(GDK_WINDOW_STATE_WITHDRAWN), |
| 323 contents_split_(NULL), | 323 contents_split_(NULL), |
| 324 frame_cursor_(NULL), | 324 frame_cursor_(NULL), |
| 325 is_active_(!ui::ActiveWindowWatcherX::WMSupportsActivation()), | 325 is_active_(!ui::ActiveWindowWatcherX::WMSupportsActivation()), |
| 326 last_click_time_(0), | 326 last_click_time_(0), |
| 327 maximize_after_show_(false), | 327 show_state_after_show_(ui::SHOW_STATE_DEFAULT), |
| 328 suppress_window_raise_(false), | 328 suppress_window_raise_(false), |
| 329 accel_group_(NULL), | 329 accel_group_(NULL), |
| 330 debounce_timer_disabled_(false) { | 330 debounce_timer_disabled_(false) { |
| 331 } | 331 } |
| 332 | 332 |
| 333 BrowserWindowGtk::~BrowserWindowGtk() { | 333 BrowserWindowGtk::~BrowserWindowGtk() { |
| 334 ui::ActiveWindowWatcherX::RemoveObserver(this); | 334 ui::ActiveWindowWatcherX::RemoveObserver(this); |
| 335 | 335 |
| 336 browser_->tabstrip_model()->RemoveObserver(this); | 336 browser_->tabstrip_model()->RemoveObserver(this); |
| 337 } | 337 } |
| (...skipping 300 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 638 void BrowserWindowGtk::Show() { | 638 void BrowserWindowGtk::Show() { |
| 639 // The Browser associated with this browser window must become the active | 639 // The Browser associated with this browser window must become the active |
| 640 // browser at the time Show() is called. This is the natural behaviour under | 640 // browser at the time Show() is called. This is the natural behaviour under |
| 641 // Windows, but gtk_widget_show won't show the widget (and therefore won't | 641 // Windows, but gtk_widget_show won't show the widget (and therefore won't |
| 642 // call OnFocusIn()) until we return to the runloop. Therefore any calls to | 642 // call OnFocusIn()) until we return to the runloop. Therefore any calls to |
| 643 // BrowserList::GetLastActive() (for example, in bookmark_util), will return | 643 // BrowserList::GetLastActive() (for example, in bookmark_util), will return |
| 644 // the previous browser instead if we don't explicitly set it here. | 644 // the previous browser instead if we don't explicitly set it here. |
| 645 BrowserList::SetLastActive(browser()); | 645 BrowserList::SetLastActive(browser()); |
| 646 | 646 |
| 647 gtk_window_present(window_); | 647 gtk_window_present(window_); |
| 648 if (maximize_after_show_) { | 648 if (show_state_after_show_ == ui::SHOW_STATE_MAXIMIZED) { |
| 649 gtk_window_maximize(window_); | 649 gtk_window_maximize(window_); |
| 650 maximize_after_show_ = false; | 650 show_state_after_show_ = ui::SHOW_STATE_NORMAL; |
| 651 } else if (show_state_after_show_ == ui::SHOW_STATE_MINIMIZED) { |
| 652 gtk_window_iconify(window_); |
| 653 show_state_after_show_ = ui::SHOW_STATE_NORMAL; |
| 651 } | 654 } |
| 652 | 655 |
| 653 // If we have sized the window by setting a size request for the render | 656 // If we have sized the window by setting a size request for the render |
| 654 // area, then undo it so that the render view can later adjust its own | 657 // area, then undo it so that the render view can later adjust its own |
| 655 // size. | 658 // size. |
| 656 gtk_widget_set_size_request(contents_container_->widget(), -1, -1); | 659 gtk_widget_set_size_request(contents_container_->widget(), -1, -1); |
| 657 } | 660 } |
| 658 | 661 |
| 659 void BrowserWindowGtk::ShowInactive() { | 662 void BrowserWindowGtk::ShowInactive() { |
| 660 gtk_window_set_focus_on_map(window_, false); | 663 gtk_window_set_focus_on_map(window_, false); |
| (...skipping 168 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 829 } | 832 } |
| 830 | 833 |
| 831 gfx::Rect BrowserWindowGtk::GetBounds() const { | 834 gfx::Rect BrowserWindowGtk::GetBounds() const { |
| 832 return bounds_; | 835 return bounds_; |
| 833 } | 836 } |
| 834 | 837 |
| 835 bool BrowserWindowGtk::IsMaximized() const { | 838 bool BrowserWindowGtk::IsMaximized() const { |
| 836 return (state_ & GDK_WINDOW_STATE_MAXIMIZED); | 839 return (state_ & GDK_WINDOW_STATE_MAXIMIZED); |
| 837 } | 840 } |
| 838 | 841 |
| 842 bool BrowserWindowGtk::IsMinimized() const { |
| 843 return (state_ & GDK_WINDOW_STATE_ICONIFIED); |
| 844 } |
| 845 |
| 839 bool BrowserWindowGtk::ShouldDrawContentDropShadow() { | 846 bool BrowserWindowGtk::ShouldDrawContentDropShadow() { |
| 840 return !IsMaximized() && UseCustomFrame(); | 847 return !IsMaximized() && UseCustomFrame(); |
| 841 } | 848 } |
| 842 | 849 |
| 843 void BrowserWindowGtk::SetFullscreen(bool fullscreen) { | 850 void BrowserWindowGtk::SetFullscreen(bool fullscreen) { |
| 844 // gtk_window_(un)fullscreen asks the window manager to toggle the EWMH | 851 // gtk_window_(un)fullscreen asks the window manager to toggle the EWMH |
| 845 // for fullscreen windows. Not all window managers support this. | 852 // for fullscreen windows. Not all window managers support this. |
| 846 if (fullscreen) { | 853 if (fullscreen) { |
| 847 gtk_window_fullscreen(window_); | 854 gtk_window_fullscreen(window_); |
| 848 } else { | 855 } else { |
| (...skipping 745 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1594 | 1601 |
| 1595 void BrowserWindowGtk::QueueToolbarRedraw() { | 1602 void BrowserWindowGtk::QueueToolbarRedraw() { |
| 1596 gtk_widget_queue_draw(toolbar_->widget()); | 1603 gtk_widget_queue_draw(toolbar_->widget()); |
| 1597 } | 1604 } |
| 1598 | 1605 |
| 1599 void BrowserWindowGtk::SetGeometryHints() { | 1606 void BrowserWindowGtk::SetGeometryHints() { |
| 1600 // If we call gtk_window_maximize followed by gtk_window_present, compiz gets | 1607 // If we call gtk_window_maximize followed by gtk_window_present, compiz gets |
| 1601 // confused and maximizes the window, but doesn't set the | 1608 // confused and maximizes the window, but doesn't set the |
| 1602 // GDK_WINDOW_STATE_MAXIMIZED bit. So instead, we keep track of whether to | 1609 // GDK_WINDOW_STATE_MAXIMIZED bit. So instead, we keep track of whether to |
| 1603 // maximize and call it after gtk_window_present. | 1610 // maximize and call it after gtk_window_present. |
| 1604 maximize_after_show_ = browser_->GetSavedMaximizedState(); | 1611 show_state_after_show_ = browser_->GetSavedWindowShowState(); |
| 1605 | 1612 |
| 1606 gfx::Rect bounds = browser_->GetSavedWindowBounds(); | 1613 gfx::Rect bounds = browser_->GetSavedWindowBounds(); |
| 1607 // We don't blindly call SetBounds here: that sets a forced position | 1614 // We don't blindly call SetBounds here: that sets a forced position |
| 1608 // on the window and we intentionally *don't* do that for normal | 1615 // on the window and we intentionally *don't* do that for normal |
| 1609 // windows. Most programs do not restore their window position on | 1616 // windows. Most programs do not restore their window position on |
| 1610 // Linux, instead letting the window manager choose a position. | 1617 // Linux, instead letting the window manager choose a position. |
| 1611 // | 1618 // |
| 1612 // However, in cases like dropping a tab where the bounds are | 1619 // However, in cases like dropping a tab where the bounds are |
| 1613 // specifically set, we do want to position explicitly. We also | 1620 // specifically set, we do want to position explicitly. We also |
| 1614 // force the position as part of session restore, as applications | 1621 // force the position as part of session restore, as applications |
| (...skipping 268 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1883 } | 1890 } |
| 1884 | 1891 |
| 1885 void BrowserWindowGtk::UpdateCustomFrame() { | 1892 void BrowserWindowGtk::UpdateCustomFrame() { |
| 1886 gtk_window_set_decorated(window_, !UseCustomFrame()); | 1893 gtk_window_set_decorated(window_, !UseCustomFrame()); |
| 1887 titlebar_->UpdateCustomFrame(UseCustomFrame() && !IsFullscreen()); | 1894 titlebar_->UpdateCustomFrame(UseCustomFrame() && !IsFullscreen()); |
| 1888 UpdateWindowShape(bounds_.width(), bounds_.height()); | 1895 UpdateWindowShape(bounds_.width(), bounds_.height()); |
| 1889 } | 1896 } |
| 1890 | 1897 |
| 1891 void BrowserWindowGtk::SaveWindowPosition() { | 1898 void BrowserWindowGtk::SaveWindowPosition() { |
| 1892 // Browser::SaveWindowPlacement is used for session restore. | 1899 // Browser::SaveWindowPlacement is used for session restore. |
| 1900 ui::WindowShowState show_state = ui::SHOW_STATE_NORMAL; |
| 1901 if (IsMaximized()) |
| 1902 show_state = ui::SHOW_STATE_MAXIMIZED; |
| 1903 else if (IsMinimized()) |
| 1904 show_state = ui::SHOW_STATE_MINIMIZED; |
| 1905 |
| 1893 if (browser_->ShouldSaveWindowPlacement()) | 1906 if (browser_->ShouldSaveWindowPlacement()) |
| 1894 browser_->SaveWindowPlacement(restored_bounds_, IsMaximized()); | 1907 browser_->SaveWindowPlacement(restored_bounds_, show_state); |
| 1895 | 1908 |
| 1896 // We also need to save the placement for startup. | 1909 // We also need to save the placement for startup. |
| 1897 // This is a web of calls between views and delegates on Windows, but the | 1910 // This is a web of calls between views and delegates on Windows, but the |
| 1898 // crux of the logic follows. See also cocoa/browser_window_controller.mm. | 1911 // crux of the logic follows. See also cocoa/browser_window_controller.mm. |
| 1899 if (!browser_->profile()->GetPrefs()) | 1912 if (!browser_->profile()->GetPrefs()) |
| 1900 return; | 1913 return; |
| 1901 | 1914 |
| 1902 std::string window_name = browser_->GetWindowPlacementKey(); | 1915 std::string window_name = browser_->GetWindowPlacementKey(); |
| 1903 DictionaryPrefUpdate update(browser_->profile()->GetPrefs(), | 1916 DictionaryPrefUpdate update(browser_->profile()->GetPrefs(), |
| 1904 window_name.c_str()); | 1917 window_name.c_str()); |
| (...skipping 468 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2373 // are taken from the WMs' source code. | 2386 // are taken from the WMs' source code. |
| 2374 return (wm_name == "Blackbox" || | 2387 return (wm_name == "Blackbox" || |
| 2375 wm_name == "compiz" || | 2388 wm_name == "compiz" || |
| 2376 wm_name == "Compiz" || | 2389 wm_name == "Compiz" || |
| 2377 wm_name == "e16" || // Enlightenment DR16 | 2390 wm_name == "e16" || // Enlightenment DR16 |
| 2378 wm_name == "Metacity" || | 2391 wm_name == "Metacity" || |
| 2379 wm_name == "Mutter" || | 2392 wm_name == "Mutter" || |
| 2380 wm_name == "Openbox" || | 2393 wm_name == "Openbox" || |
| 2381 wm_name == "Xfwm4"); | 2394 wm_name == "Xfwm4"); |
| 2382 } | 2395 } |
| OLD | NEW |