diff options
author | evan@chromium.org <evan@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2009-05-27 00:06:46 +0000 |
---|---|---|
committer | evan@chromium.org <evan@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2009-05-27 00:06:46 +0000 |
commit | 1976ca8502a340591fa90d4bd0971b3ed6ef2fa0 (patch) | |
tree | d53dca563a115fe98b0682872b2a51938ada66bd /chrome/browser/window_sizer_linux.cc | |
parent | 588811c4de221eb4017741c23e90b42243f7584d (diff) | |
download | chromium_src-1976ca8502a340591fa90d4bd0971b3ed6ef2fa0.zip chromium_src-1976ca8502a340591fa90d4bd0971b3ed6ef2fa0.tar.gz chromium_src-1976ca8502a340591fa90d4bd0971b3ed6ef2fa0.tar.bz2 |
linux: fix CHECK fail in window_sizer.
1) We shouldn't use CHECK for situations that can reasonably occur.
2) We need to recover from the case where this WORKAREA property isn't
available.
Review URL: http://codereview.chromium.org/113877
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@16956 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'chrome/browser/window_sizer_linux.cc')
-rw-r--r-- | chrome/browser/window_sizer_linux.cc | 57 |
1 files changed, 37 insertions, 20 deletions
diff --git a/chrome/browser/window_sizer_linux.cc b/chrome/browser/window_sizer_linux.cc index cd44490..4cee190 100644 --- a/chrome/browser/window_sizer_linux.cc +++ b/chrome/browser/window_sizer_linux.cc @@ -21,8 +21,12 @@ class DefaultMonitorInfoProvider : public WindowSizer::MonitorInfoProvider { DefaultMonitorInfoProvider() { } virtual gfx::Rect GetPrimaryMonitorWorkArea() const { - gfx::Rect rect = GetScreenWorkArea(); - return rect.Intersect(GetPrimaryMonitorBounds()); + gfx::Rect rect; + if (GetScreenWorkArea(&rect)) + return rect.Intersect(GetPrimaryMonitorBounds()); + + // Return the best we've got. + return GetPrimaryMonitorBounds(); } virtual gfx::Rect GetPrimaryMonitorBounds() const { @@ -51,29 +55,42 @@ class DefaultMonitorInfoProvider : public WindowSizer::MonitorInfoProvider { } private: - gfx::Rect GetScreenWorkArea() const { - gboolean r; - guchar* raw_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 - &raw_data); // returned data - CHECK(r); - CHECK(data_len >= 16); + // Get the available screen space as a gfx::Rect, or return false if + // if it's unavailable (i.e. the window manager doesn't support + // retrieving this). + bool GetScreenWorkArea(gfx::Rect* out_rect) const { + gboolean ok; + guchar* raw_data = NULL; + gint data_len = 0; + ok = 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 + &raw_data); // returned data + if (!ok) + return false; + + // We expect to get four longs back: x1, y1, x2, y2. + if (data_len != 4 * sizeof(glong)) { + NOTREACHED(); + g_free(raw_data); + return false; + } + glong* data = reinterpret_cast<glong*>(raw_data); 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); + g_free(raw_data); + + out_rect->SetRect(x, y, width, height); + return true; } DISALLOW_COPY_AND_ASSIGN(DefaultMonitorInfoProvider); |