PlatformScreenGtk.cpp [plain text]
#include "config.h"
#include "PlatformScreen.h"
#include "GtkVersioning.h"
#include "HostWindow.h"
#include "NotImplemented.h"
#include "ScrollView.h"
#include "Widget.h"
#include <gtk/gtk.h>
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)
{
GtkWidget* container = widget ? GTK_WIDGET(widget->root()->hostWindow()->platformPageClient()) : 0;
if (!container) {
GdkScreen* screen = gdk_screen_get_default();
return screen ? gdk_screen_get_system_visual(screen) : 0;
}
if (!gtk_widget_get_realized(container))
container = getToplevel(container);
return container ? gdk_window_get_visual(gtk_widget_get_window(container)) : 0;
}
int screenHorizontalDPI(Widget* widget)
{
notImplemented();
return 0;
}
int screenVerticalDPI(Widget* widget)
{
notImplemented();
return 0;
}
int screenDepth(Widget* widget)
{
GdkVisual* visual = getVisual(widget);
if (!visual)
return 24;
return gdk_visual_get_depth(visual);
}
int screenDepthPerComponent(Widget* widget)
{
GdkVisual* visual = getVisual(widget);
if (!visual)
return 8;
return gdk_visual_get_bits_per_rgb(visual);
}
bool screenIsMonochrome(Widget* widget)
{
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)
{
GtkWidget* container = widget ? GTK_WIDGET(widget->root()->hostWindow()->platformPageClient()) : 0;
if (container)
container = getToplevel(container);
GdkScreen* screen = container ? getScreen(container) : gdk_screen_get_default();
if (!screen)
return FloatRect();
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);
}
FloatRect screenAvailableRect(Widget* widget)
{
GtkWidget* container = widget ? GTK_WIDGET(widget->root()->hostWindow()->platformPageClient()) : 0;
if (container && !gtk_widget_get_realized(container))
return screenRect(widget);
GdkScreen* screen = container ? getScreen(container) : gdk_screen_get_default();
if (!screen)
return FloatRect();
gint monitor = container ? gdk_screen_get_monitor_at_window(screen, gtk_widget_get_window(container)) : 0;
GdkRectangle workArea;
gdk_screen_get_monitor_workarea(screen, monitor, &workArea);
return FloatRect(workArea.x, workArea.y, workArea.width, workArea.height);
}
}