2011-06-24 Carlos Garcia Campos <cgarcia@igalia.com>
Reviewed by Martin Robinson.
[GTK] Fix runtime critical warnings in WebKit2
https://bugs.webkit.org/show_bug.cgi?id=63256
Check whether there's a view widget before trying to use it in
PlatformScreenGtk. If there isn't a view widget, which is the case
in WebKit2, try to use the default GdkScreen and monitor.
* platform/gtk/PlatformScreenGtk.cpp:
(WebCore::getToplevel): Helper function to get the toplevel
widget.
(WebCore::getVisual): Use getToplevel().
(WebCore::getScreen): Helper funtion to get the screen of a
widget.
(WebCore::screenRect): Use getToplevel() and getScreen().
git-svn-id: http://svn.webkit.org/repository/webkit/trunk@89673 268f45cc-cd09-0410-ab3c-d52691b4dbfc
diff --git a/Source/WebCore/platform/gtk/PlatformScreenGtk.cpp b/Source/WebCore/platform/gtk/PlatformScreenGtk.cpp
index 40b509e..4e0b25e 100644
--- a/Source/WebCore/platform/gtk/PlatformScreenGtk.cpp
+++ b/Source/WebCore/platform/gtk/PlatformScreenGtk.cpp
@@ -45,25 +45,26 @@
namespace WebCore {
+static GtkWidget* getToplevel(GtkWidget* widget)
+{
+ GtkWidget* toplevel = gtk_widget_get_toplevel(widget);
+ return gtk_widget_is_toplevel(toplevel) ? toplevel : 0;
+}
+
static GdkVisual* getVisual(Widget* widget)
{
if (!widget)
return 0;
GtkWidget* container = GTK_WIDGET(widget->root()->hostWindow()->platformPageClient());
-
- if (!container)
- return 0;
-
- if (!gtk_widget_get_realized(container)) {
- GtkWidget* toplevel = gtk_widget_get_toplevel(container);
- if (gtk_widget_is_toplevel(toplevel))
- container = toplevel;
- else
- return 0;
+ if (!container) {
+ GdkScreen* screen = gdk_screen_get_default();
+ return screen ? gdk_screen_get_system_visual(screen) : 0;
}
- return gdk_window_get_visual(gtk_widget_get_window(container));
+ if (!gtk_widget_get_realized(container))
+ container = getToplevel(container);
+ return container ? gdk_window_get_visual(gtk_widget_get_window(container)) : 0;
}
int screenDepth(Widget* widget)
@@ -88,23 +89,30 @@
return screenDepth(widget) < 2;
}
+
+static GdkScreen* getScreen(GtkWidget* widget)
+{
+ return gtk_widget_has_screen(widget) ? gtk_widget_get_screen(widget) : gdk_screen_get_default();
+}
+
FloatRect screenRect(Widget* widget)
{
if (!widget)
return FloatRect();
- GtkWidget* container = gtk_widget_get_toplevel(GTK_WIDGET(widget->root()->hostWindow()->platformPageClient()));
- if (!gtk_widget_is_toplevel(container))
- return FloatRect();
+ GtkWidget* container = GTK_WIDGET(widget->root()->hostWindow()->platformPageClient());
+ if (container)
+ container = getToplevel(container);
- GdkScreen* screen = gtk_widget_has_screen(container) ? gtk_widget_get_screen(container) : gdk_screen_get_default();
+ GdkScreen* screen = container ? getScreen(container) : gdk_screen_get_default();
if (!screen)
return FloatRect();
- gint monitor = gdk_screen_get_monitor_at_window(screen, gtk_widget_get_window(GTK_WIDGET(container)));
+ gint monitor = container ? gdk_screen_get_monitor_at_window(screen, gtk_widget_get_window(container)) : 0;
+
GdkRectangle geometry;
gdk_screen_get_monitor_geometry(screen, monitor, &geometry);
-
+
return FloatRect(geometry.x, geometry.y, geometry.width, geometry.height);
}