f83a5859174847a040d92f90996f615bd10d7e49
[WebKit-https.git] / Source / WebCore / platform / gtk / GtkUtilities.cpp
1 /*
2  * Copyright (C) 2011, Igalia S.L.
3  *
4  *  This library is free software; you can redistribute it and/or
5  *  modify it under the terms of the GNU Lesser General Public
6  *  License as published by the Free Software Foundation; either
7  *  version 2 of the License, or (at your option) any later version.
8  *
9  *  This library is distributed in the hope that it will be useful,
10  *  but WITHOUT ANY WARRANTY; without even the implied warranty of
11  *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
12  *  Lesser General Public License for more details.
13  *
14  *  You should have received a copy of the GNU Lesser General Public
15  *  License along with this library; if not, write to the Free Software
16  *  Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
17  */
18
19 #include "config.h"
20 #include "GtkUtilities.h"
21
22 #include "IntPoint.h"
23 #include <gtk/gtk.h>
24
25 #if PLATFORM(X11)
26 #include <gdk/gdkx.h>
27 #endif
28 #if PLATFORM(WAYLAND) && !defined(GTK_API_VERSION_2)
29 #include <gdk/gdkwayland.h>
30 #endif
31
32 namespace WebCore {
33
34 IntPoint convertWidgetPointToScreenPoint(GtkWidget* widget, const IntPoint& point)
35 {
36     // FIXME: This is actually a very tricky operation and the results of this function should
37     // only be thought of as a guess. For instance, sometimes it may not correctly take into
38     // account window decorations.
39
40     GtkWidget* toplevelWidget = gtk_widget_get_toplevel(widget);
41     if (!toplevelWidget || !gtk_widget_is_toplevel(toplevelWidget) || !GTK_IS_WINDOW(toplevelWidget))
42         return point;
43
44     GdkWindow* gdkWindow = gtk_widget_get_window(toplevelWidget);
45     if (!gdkWindow)
46         return point;
47
48     int xInWindow, yInWindow;
49     gtk_widget_translate_coordinates(widget, toplevelWidget, point.x(), point.y(), &xInWindow, &yInWindow);
50
51     int windowOriginX, windowOriginY;
52     gdk_window_get_origin(gdkWindow, &windowOriginX, &windowOriginY);
53
54     return IntPoint(windowOriginX + xInWindow, windowOriginY + yInWindow);
55 }
56
57 bool widgetIsOnscreenToplevelWindow(GtkWidget* widget)
58 {
59     return gtk_widget_is_toplevel(widget) && GTK_IS_WINDOW(widget) && !GTK_IS_OFFSCREEN_WINDOW(widget);
60 }
61
62 DisplaySystemType getDisplaySystemType()
63 {
64 #if defined(GTK_API_VERSION_2)
65     return DisplaySystemType::X11;
66 #else
67     static DisplaySystemType type = [] {
68         GdkDisplay* display = gdk_display_manager_get_default_display(gdk_display_manager_get());
69 #if PLATFORM(X11)
70         if (GDK_IS_X11_DISPLAY(display))
71             return DisplaySystemType::X11;
72 #endif
73 #if PLATFORM(WAYLAND)
74         if (GDK_IS_WAYLAND_DISPLAY(display))
75             return DisplaySystemType::Wayland;
76 #endif
77         ASSERT_NOT_REACHED();
78         return DisplaySystemType::X11;
79     }();
80     return type;
81 #endif
82 }
83
84 } // namespace WebCore