summaryrefslogtreecommitdiffstats
path: root/WebCore/platform/gtk/PlatformScreenGtk.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'WebCore/platform/gtk/PlatformScreenGtk.cpp')
-rw-r--r--WebCore/platform/gtk/PlatformScreenGtk.cpp94
1 files changed, 78 insertions, 16 deletions
diff --git a/WebCore/platform/gtk/PlatformScreenGtk.cpp b/WebCore/platform/gtk/PlatformScreenGtk.cpp
index 74c785f..9788253 100644
--- a/WebCore/platform/gtk/PlatformScreenGtk.cpp
+++ b/WebCore/platform/gtk/PlatformScreenGtk.cpp
@@ -1,6 +1,8 @@
/*
* Copyright (C) 2006 Apple Computer, Inc. All rights reserved.
* Copyright (C) 2006 Michael Emmel mike.emmel@gmail.com
+ * Copyright (C) 2008 Christian Dywan <christian@imendio.com>
+ * Copyright (C) 2008 Collabora Ltd.
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
@@ -28,44 +30,104 @@
#include "config.h"
#include "PlatformScreen.h"
+#include "HostWindow.h"
#include "NotImplemented.h"
+#include "ScrollView.h"
#include "Widget.h"
#include <gtk/gtk.h>
+#if PLATFORM(X11)
+#include <gdk/gdkx.h>
+#include <X11/Xatom.h>
+#endif
+
namespace WebCore {
int screenDepth(Widget* widget)
{
- ASSERT(widget->containingWindow() && GTK_WIDGET(widget->containingWindow())->window);
+ GtkWidget* container = GTK_WIDGET(widget->root()->hostWindow()->platformWindow());
+ if (!container)
+ return 24;
- gint dummy, depth;
- gdk_window_get_geometry(GTK_WIDGET(widget->containingWindow())->window, &dummy, &dummy, &dummy, &dummy, &depth);
- return depth;
+ GdkVisual* visual = gdk_drawable_get_visual(GDK_DRAWABLE(GTK_WIDGET(widget->root()->hostWindow()->platformWindow())->window));
+ return visual->depth;
}
-int screenDepthPerComponent(Widget*)
+int screenDepthPerComponent(Widget* widget)
{
- notImplemented();
- return 8;
+ GtkWidget* container = GTK_WIDGET(widget->root()->hostWindow()->platformWindow());
+ if (!container)
+ return 8;
+
+ GdkVisual* visual = gdk_drawable_get_visual(GDK_DRAWABLE(GTK_WIDGET(widget->root()->hostWindow()->platformWindow())->window));
+ return visual->bits_per_rgb;
}
-bool screenIsMonochrome(Widget*)
+bool screenIsMonochrome(Widget* widget)
{
- notImplemented();
- return false;
+ GtkWidget* container = GTK_WIDGET(widget->root()->hostWindow()->platformWindow());
+ if (!container)
+ return false;
+
+ return screenDepth(widget) < 2;
}
-FloatRect screenRect(Widget*)
+FloatRect screenRect(Widget* widget)
{
- notImplemented();
- return FloatRect();
+ GtkWidget* container = GTK_WIDGET(widget->root()->hostWindow()->platformWindow());
+ if (!container)
+ return FloatRect();
+
+ GdkScreen* screen = gtk_widget_has_screen(container) ? gtk_widget_get_screen(container) : gdk_screen_get_default();
+ if (!screen)
+ return FloatRect();
+
+ gint monitor = gdk_screen_get_monitor_at_window(screen, GTK_WIDGET(container)->window);
+ GdkRectangle geometry;
+ gdk_screen_get_monitor_geometry(screen, monitor, &geometry);
+
+ return FloatRect(geometry.x, geometry.y, geometry.width, geometry.height);
}
-FloatRect screenAvailableRect(Widget*)
+FloatRect screenAvailableRect(Widget* widget)
{
- notImplemented();
- return FloatRect();
+#if PLATFORM(X11)
+ GtkWidget* container = GTK_WIDGET(widget->root()->hostWindow()->platformWindow());
+ if (!container)
+ return FloatRect();
+
+ if (!GTK_WIDGET_REALIZED(container))
+ return screenRect(widget);
+
+ GdkDrawable* rootWindow = GDK_DRAWABLE(gtk_widget_get_root_window(container));
+ GdkDisplay* display = gdk_drawable_get_display(rootWindow);
+ Atom xproperty = gdk_x11_get_xatom_by_name_for_display(display, "_NET_WORKAREA");
+
+ Atom retType;
+ int retFormat;
+ long *workAreaPos = NULL;
+ unsigned long retNItems;
+ unsigned long retAfter;
+ int xRes = XGetWindowProperty(GDK_DISPLAY_XDISPLAY(display), GDK_WINDOW_XWINDOW(rootWindow), xproperty,
+ 0, 4, FALSE, XA_CARDINAL, &retType, &retFormat, &retNItems, &retAfter, (guchar**)&workAreaPos);
+
+ FloatRect rect;
+ if (xRes == Success && workAreaPos != NULL && retType == XA_CARDINAL && retNItems == 4 && retFormat == 32) {
+ rect = FloatRect(workAreaPos[0], workAreaPos[1], workAreaPos[2], workAreaPos[3]);
+ // rect contains the available space in the whole screen not just in the monitor
+ // containing the widget, so we intersect it with the monitor rectangle.
+ rect.intersect(screenRect(widget));
+ } else
+ rect = screenRect(widget);
+
+ if (workAreaPos)
+ XFree(workAreaPos);
+
+ return rect;
+#else
+ return screenRect(widget);
+#endif
}
} // namespace WebCore