Merge "Change navigator.language dynamically" into tizen_2.1
[framework/web/webkit-efl.git] / Source / WebCore / platform / efl / PlatformScreenEfl.cpp
1 /*
2  * Copyright (C) 2007 Apple Inc.  All rights reserved.
3  * Copyright (C) 2008 Nokia Corporation and/or its subsidiary(-ies)
4  * Copyright (C) 2008 Holger Hans Peter Freyther
5  * Copyright (C) 2008 INdT - Instituto Nokia de Tecnologia
6  * Copyright (C) 2009-2010 ProFUSION embedded systems
7  * Copyright (C) 2009-2010 Samsung Electronics
8  * Copyright (C) 2012 Intel Corporation. All rights reserved.
9  *
10  * Redistribution and use in source and binary forms, with or without
11  * modification, are permitted provided that the following conditions
12  * are met:
13  *
14  * 1.  Redistributions of source code must retain the above copyright
15  *     notice, this list of conditions and the following disclaimer.
16  * 2.  Redistributions in binary form must reproduce the above copyright
17  *     notice, this list of conditions and the following disclaimer in the
18  *     documentation and/or other materials provided with the distribution.
19  * 3.  Neither the name of Apple Computer, Inc. ("Apple") nor the names of
20  *     its contributors may be used to endorse or promote products derived
21  *     from this software without specific prior written permission.
22  *
23  * THIS SOFTWARE IS PROVIDED BY APPLE AND ITS CONTRIBUTORS "AS IS" AND ANY
24  * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
25  * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
26  * DISCLAIMED. IN NO EVENT SHALL APPLE OR ITS CONTRIBUTORS BE LIABLE FOR ANY
27  * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
28  * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
29  * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
30  * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
31  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
32  * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
33  */
34
35 #include "config.h"
36 #include "PlatformScreen.h"
37
38 #include "NotImplemented.h"
39 #include "PlatformString.h"
40 #include "Widget.h"
41
42 #include <Ecore_Evas.h>
43 #include <wtf/text/CString.h>
44
45 #ifdef HAVE_ECORE_X
46 #include <Ecore_X.h>
47 #endif
48
49 #if ENABLE(TIZEN_WEBKIT2)
50 #include "Frame.h"
51 #include "FrameView.h"
52 #include "Settings.h"
53 #endif
54
55 #if ENABLE(TIZEN_VIEWPORT_META_TAG)
56 #include "Chrome.h"
57 #include "ChromeClient.h"
58 #include "Frame.h"
59 #include "FrameView.h"
60 #include "Page.h"
61 #include "Settings.h"
62 #endif
63
64 #if ENABLE(TIZEN_WEBKIT2_CONTEXT_X_WINDOW)
65 #include <EflScreenUtilities.h>
66 #endif
67
68 namespace WebCore {
69
70 int screenHorizontalDPI(Widget*)
71 {
72     notImplemented();
73     return 0;
74 }
75
76 int screenVerticalDPI(Widget*)
77 {
78     notImplemented();
79     return 0;
80 }
81
82 int screenDepth(Widget*)
83 {
84
85 #ifdef HAVE_ECORE_X
86     return ecore_x_default_depth_get(ecore_x_display_get(), ecore_x_default_screen_get());
87 #else
88    return 24;
89 #endif
90 }
91
92 int screenDepthPerComponent(Widget* widget)
93 {
94     if (!widget)
95         return 8;
96
97     int depth = screenDepth(widget);
98
99     switch (depth) {
100     // Special treat 0 as an error, and return 8 bit per component.
101     case 0:
102     case 24:
103     case 32:
104         return 8;
105    case 8:
106         return 2;
107     default:
108         return depth / 3;
109     }
110 }
111
112 bool screenIsMonochrome(Widget* widget)
113 {
114     return screenDepth(widget) < 2;
115 }
116
117 FloatRect screenRect(Widget* widget)
118 {
119 #ifdef HAVE_ECORE_X
120 #if !ENABLE(ORIENTATION_EVENTS)
121     UNUSED_PARAM(widget);
122 #endif
123     // Fallback to realistic values if the EcoreX call fails
124     // and we cannot accurately detect the screen size.
125     int width = 800;
126     int height = 600;
127     ecore_x_screen_size_get(ecore_x_default_screen_get(), &width, &height);
128
129 #if OS(TIZEN)
130 #if ENABLE(ORIENTATION_EVENTS)
131     // Getting orientation via Ecore_X_Window cannot be fully synced
132     // So, we use Frame::orientation() if we have widget here
133     if (widget) {
134         FrameView* frameView = static_cast<FrameView*>(widget);
135         Frame* frame = frameView->frame();
136         int orientation = frame ? frame->orientation() : 0;
137         if (orientation == 90 || orientation == 270) {
138             int temp = width;
139             width = height;
140             height = temp;
141         }
142         return FloatRect(0, 0, width, height);
143     }
144 #endif
145
146     int count = 0;
147     unsigned char *prop_data = NULL;
148     Ecore_X_Window xWindow = ecore_x_window_root_first_get();
149 #if ENABLE(TIZEN_WEBKIT2_CONTEXT_X_WINDOW)
150     if (Ecore_X_Window applicationXWindow = getXWindow())
151         xWindow = applicationXWindow;
152 #endif
153     int ret = ecore_x_window_prop_property_get(xWindow, ECORE_X_ATOM_E_ILLUME_ROTATE_WINDOW_ANGLE, ECORE_X_ATOM_CARDINAL, 32, &prop_data, &count);
154
155     int angle = 0;
156     if (ret && prop_data)
157         memcpy(&angle, prop_data, sizeof(int));
158
159     if (prop_data)
160         free(prop_data);
161
162     // ecore_x_screen_size_get() doesn't return orientation applied size
163     // we can consider orientation with window's angle
164     if (angle == 90 || angle == 270) {
165         int temp = width;
166         width = height;
167         height = temp;
168     }
169 #endif
170
171     return FloatRect(0, 0, width, height);
172 #else
173     if (!widget || !widget->evas())
174         return FloatRect();
175
176     int x, y, w, h;
177     ecore_evas_screen_geometry_get(ecore_evas_ecore_evas_get(widget->evas()), &x, &y, &w, &h);
178     return FloatRect(x, y, w, h);
179 #endif
180 }
181
182 FloatRect screenAvailableRect(Widget* widget)
183 {
184     return screenRect(widget);
185 }
186
187 void screenColorProfile(ColorProfile&)
188 {
189     notImplemented();
190 }
191
192 }