diff options
author | thestig@chromium.org <thestig@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2009-05-22 21:18:28 +0000 |
---|---|---|
committer | thestig@chromium.org <thestig@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2009-05-22 21:18:28 +0000 |
commit | c6d97ad27c69d7909c55ebbec523c3df10ec08a0 (patch) | |
tree | 0d780af45fa9e3a2965c7d67c347941982f80e3f | |
parent | 7f6f0623f4ee9bb83f168c97c85b71f0f8e52bec (diff) | |
download | chromium_src-c6d97ad27c69d7909c55ebbec523c3df10ec08a0.zip chromium_src-c6d97ad27c69d7909c55ebbec523c3df10ec08a0.tar.gz chromium_src-c6d97ad27c69d7909c55ebbec523c3df10ec08a0.tar.bz2 |
Add a single monitor implementation of WindowSizer for Linux.
BUG=10005
Review URL: http://codereview.chromium.org/114041
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@16796 0039d316-1c4b-4281-b951-d872f2087c98
-rw-r--r-- | chrome/browser/browser.cc | 15 | ||||
-rw-r--r-- | chrome/browser/extensions/extension_tabs_module.cc | 6 | ||||
-rw-r--r-- | chrome/browser/gtk/browser_window_gtk.cc | 13 | ||||
-rw-r--r-- | chrome/browser/window_sizer_linux.cc | 85 | ||||
-rw-r--r-- | chrome/chrome.gyp | 4 | ||||
-rw-r--r-- | chrome/common/temp_scaffolding_stubs.cc | 16 | ||||
-rw-r--r-- | chrome/common/temp_scaffolding_stubs.h | 11 |
7 files changed, 104 insertions, 46 deletions
diff --git a/chrome/browser/browser.cc b/chrome/browser/browser.cc index 618fb4a..cf30a20 100644 --- a/chrome/browser/browser.cc +++ b/chrome/browser/browser.cc @@ -37,6 +37,7 @@ #include "chrome/browser/tab_contents/site_instance.h" #include "chrome/browser/tab_contents/tab_contents.h" #include "chrome/browser/tab_contents/tab_contents_view.h" +#include "chrome/browser/window_sizer.h" #include "chrome/common/chrome_constants.h" #include "chrome/common/chrome_switches.h" #include "chrome/common/notification_service.h" @@ -77,10 +78,6 @@ #include "chrome/common/child_process_host.h" #endif // OS_WIN -#if defined(OS_WIN) || defined(OS_MACOSX) -#include "chrome/browser/window_sizer.h" -#endif - #if defined(TOOLKIT_VIEWS) #include "chrome/browser/dock_info.h" #endif @@ -1802,7 +1799,8 @@ void Browser::AddNewContents(TabContents* source, // AddTabContents method does. if (type_ & TYPE_APP) transition = PageTransition::START_PAGE; - b->tabstrip_model()->AddTabContents(new_contents, -1, false, transition, true); + b->tabstrip_model()->AddTabContents(new_contents, -1, false, transition, + true); b->window()->Show(); return; } @@ -1815,7 +1813,8 @@ void Browser::AddNewContents(TabContents* source, initial_pos, user_gesture); browser->window()->Show(); } else if (disposition != SUPPRESS_OPEN) { - tabstrip_model_.AddTabContents(new_contents, -1, false, PageTransition::LINK, + tabstrip_model_.AddTabContents(new_contents, -1, false, + PageTransition::LINK, disposition == NEW_FOREGROUND_TAB); } } @@ -2364,8 +2363,10 @@ void Browser::ProcessPendingUIUpdates() { // Updating the URL happens synchronously in ScheduleUIUpdate. TabContents* selected_tab = GetSelectedTabContents(); - if (selected_tab && flags & TabContents::INVALIDATE_LOAD && GetStatusBubble()) + if (selected_tab && + flags & TabContents::INVALIDATE_LOAD && GetStatusBubble()) { GetStatusBubble()->SetStatus(selected_tab->GetStatusText()); + } if (flags & TabContents::INVALIDATE_TAB) { tabstrip_model_.UpdateTabContentsStateAt( diff --git a/chrome/browser/extensions/extension_tabs_module.cc b/chrome/browser/extensions/extension_tabs_module.cc index cddafa5..322239a 100644 --- a/chrome/browser/extensions/extension_tabs_module.cc +++ b/chrome/browser/extensions/extension_tabs_module.cc @@ -13,13 +13,7 @@ #include "chrome/browser/extensions/extensions_service.h" #include "chrome/browser/renderer_host/render_view_host_delegate.h" #include "chrome/browser/tab_contents/navigation_entry.h" - -// TODO(port): Port these files. -#if defined(OS_WIN) || defined(OS_MACOSX) #include "chrome/browser/window_sizer.h" -#else -#include "chrome/common/temp_scaffolding_stubs.h" -#endif namespace { // Error messages. diff --git a/chrome/browser/gtk/browser_window_gtk.cc b/chrome/browser/gtk/browser_window_gtk.cc index 34e42f0..5be3667 100644 --- a/chrome/browser/gtk/browser_window_gtk.cc +++ b/chrome/browser/gtk/browser_window_gtk.cc @@ -746,13 +746,21 @@ void BrowserWindowGtk::AddFindBar(FindBarGtk* findbar) { } void BrowserWindowGtk::SetGeometryHints() { - gtk_window_set_default_size(window_, 640, 480); - // Allow the user to resize us arbitrarily small. GdkGeometry geometry; geometry.min_width = 1; geometry.min_height = 1; gtk_window_set_geometry_hints(window_, NULL, &geometry, GDK_HINT_MIN_SIZE); + + if (browser_->GetSavedMaximizedState()) + gtk_window_maximize(window_); + else + gtk_window_unmaximize(window_); + + gfx::Rect rect = browser_->GetSavedWindowBounds(); + gtk_window_set_default_size(window_, + static_cast<gint>(rect.width()), + static_cast<gint>(rect.height())); } void BrowserWindowGtk::SetWindowIcon() { @@ -832,4 +840,3 @@ bool BrowserWindowGtk::IsToolbarSupported() { return browser_->SupportsWindowFeature(Browser::FEATURE_TOOLBAR) || browser_->SupportsWindowFeature(Browser::FEATURE_LOCATIONBAR); } - diff --git a/chrome/browser/window_sizer_linux.cc b/chrome/browser/window_sizer_linux.cc new file mode 100644 index 0000000..524dfb4 --- /dev/null +++ b/chrome/browser/window_sizer_linux.cc @@ -0,0 +1,85 @@ +// Copyright (c) 2009 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "chrome/browser/window_sizer.h" + +#include <gtk/gtk.h> + +#include "base/logging.h" +#include "chrome/browser/browser.h" + +// How much horizontal and vertical offset there is between newly +// opened windows. We don't care on Linux since the window manager generally +// does a good job of window placement. +const int WindowSizer::kWindowTilePixels = 0; + +// An implementation of WindowSizer::MonitorInfoProvider that gets the actual +// monitor information from X via GDK. +class DefaultMonitorInfoProvider : public WindowSizer::MonitorInfoProvider { + public: + DefaultMonitorInfoProvider() { } + + virtual gfx::Rect GetPrimaryMonitorWorkArea() const { + gfx::Rect rect = GetScreenWorkArea(); + return rect.Intersect(GetPrimaryMonitorBounds()); + } + + virtual gfx::Rect GetPrimaryMonitorBounds() const { + GdkScreen* screen = gdk_screen_get_default(); + GdkRectangle rect; + gdk_screen_get_monitor_geometry(screen, 0, &rect); + return gfx::Rect(rect); + } + + virtual gfx::Rect GetMonitorWorkAreaMatching( + const gfx::Rect& match_rect) const { + // TODO(thestig) Implement multi-monitor support. + return GetPrimaryMonitorWorkArea(); + } + + virtual gfx::Point GetBoundsOffsetMatching( + const gfx::Rect& match_rect) const { + // TODO(thestig) Implement multi-monitor support. + return GetPrimaryMonitorWorkArea().origin(); + } + + void UpdateWorkAreas() { + // TODO(thestig) Implement multi-monitor support. + work_areas_.clear(); + work_areas_.push_back(GetPrimaryMonitorBounds()); + } + + private: + gfx::Rect GetScreenWorkArea() const { + gboolean r; + glong *data; + gint data_len; + r = gdk_property_get(gdk_get_default_root_window(), // a gdk window + gdk_atom_intern("_NET_WORKAREA", FALSE), // property + gdk_atom_intern("CARDINAL", FALSE), // property type + 0, // byte offset into property + 0xff, // property length to retrieve + false, // delete property after retrieval? + NULL, // returned property type + NULL, // returned data format + &data_len, // returned data len + reinterpret_cast<guchar**>(&data)); // returned data + CHECK(r); + CHECK(data_len >= 16); + gint x = data[0]; + gint y = data[1]; + gint width = data[0] + data[2]; + gint height = data[1] + data[3]; + g_free(data); + return gfx::Rect(x, y, width, height); + } + + DISALLOW_COPY_AND_ASSIGN(DefaultMonitorInfoProvider); +}; + +// static +WindowSizer::MonitorInfoProvider* +WindowSizer::CreateDefaultMonitorInfoProvider() { + return new DefaultMonitorInfoProvider(); +} diff --git a/chrome/chrome.gyp b/chrome/chrome.gyp index 8e852f3..0ab9824 100644 --- a/chrome/chrome.gyp +++ b/chrome/chrome.gyp @@ -1519,6 +1519,7 @@ 'browser/window_sizer.cc', 'browser/window_sizer.h', 'browser/window_sizer_mac.mm', + 'browser/window_sizer_linux.cc', 'browser/window_sizer_win.cc', 'browser/worker_host/worker_process_host.cc', 'browser/worker_host/worker_process_host.h', @@ -1545,9 +1546,6 @@ '../build/linux/system.gyp:gtk', ], 'sources!': [ - # TODO(port): add this to the Linux build once a - # window_sizer_linux.cc is written - 'browser/window_sizer.cc', 'browser/debugger/debugger_shell_stubs.cc', # Windows-specific files. 'browser/download/download_exe.cc', diff --git a/chrome/common/temp_scaffolding_stubs.cc b/chrome/common/temp_scaffolding_stubs.cc index de4babc..4c05c9a 100644 --- a/chrome/common/temp_scaffolding_stubs.cc +++ b/chrome/common/temp_scaffolding_stubs.cc @@ -293,22 +293,6 @@ void DragDownload(const DownloadItem* download, SkBitmap* icon) { } // namespace download_util -#if defined(OS_LINUX) -void WindowSizer::GetBrowserWindowBounds(const std::wstring& app_name, - const gfx::Rect& specified_bounds, - Browser* browser, - gfx::Rect* window_bounds, - bool* maximized) { - // If we're given a bounds, use it (for things like tearing off tabs during - // drags). If not, make up something reasonable until the rest of the - // WindowSizer infrastructure is in place. - *window_bounds = specified_bounds; - if (specified_bounds.IsEmpty()) { - *window_bounds = gfx::Rect(0, 0, 1024, 768); - } -} -#endif - #if defined(OS_MACOSX) void HungRendererDialog::HideForTabContents(TabContents*) { NOTIMPLEMENTED(); diff --git a/chrome/common/temp_scaffolding_stubs.h b/chrome/common/temp_scaffolding_stubs.h index b0b7d1a..3cb8bcb 100644 --- a/chrome/common/temp_scaffolding_stubs.h +++ b/chrome/common/temp_scaffolding_stubs.h @@ -345,17 +345,6 @@ class DockInfo { }; #endif -#if defined(OS_LINUX) -class WindowSizer { - public: - static void GetBrowserWindowBounds(const std::wstring& app_name, - const gfx::Rect& specified_bounds, - Browser* browser, - gfx::Rect* window_bounds, - bool* maximized); -}; -#endif - //--------------------------------------------------------------------------- // These stubs are for Profile |