From 1976ca8502a340591fa90d4bd0971b3ed6ef2fa0 Mon Sep 17 00:00:00 2001 From: "evan@chromium.org" Date: Wed, 27 May 2009 00:06:46 +0000 Subject: 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 --- chrome/browser/window_sizer_linux.cc | 57 +++++++++++++++++++++++------------- 1 file 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(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); -- cgit v1.1