diff options
Diffstat (limited to 'WebCore/platform/gtk/PlatformScreenGtk.cpp')
-rw-r--r-- | WebCore/platform/gtk/PlatformScreenGtk.cpp | 94 |
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 |