1/*
2 * Copyright (C) 2012-2014 Samsung Electronics
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 "EflScreenUtilities.h"
21
22#ifdef HAVE_ECORE_X
23#include <Ecore_Evas.h>
24#include <Ecore_X.h>
25#include <wtf/HashMap.h>
26#include <wtf/text/StringHash.h>
27#endif
28
29namespace WebCore {
30
31#ifdef HAVE_ECORE_X
32class CursorMap {
33private:
34    HashMap<String, unsigned short> m_cursorStringMap;
35
36public:
37    CursorMap();
38    int cursor(const String&);
39};
40
41int CursorMap::cursor(const String& cursorGroup)
42{
43    int ret = m_cursorStringMap.get(cursorGroup);
44
45    if (ret < ECORE_X_CURSOR_X || ret > ECORE_X_CURSOR_XTERM)
46        ret = ECORE_X_CURSOR_LEFT_PTR;
47
48    return ret;
49}
50
51CursorMap::CursorMap()
52{
53    m_cursorStringMap.set(ASCIILiteral("cursor/pointer"), ECORE_X_CURSOR_LEFT_PTR);
54    m_cursorStringMap.set(ASCIILiteral("cursor/move"), ECORE_X_CURSOR_FLEUR);
55    m_cursorStringMap.set(ASCIILiteral("cursor/cross"), ECORE_X_CURSOR_CROSS);
56    m_cursorStringMap.set(ASCIILiteral("cursor/hand"), ECORE_X_CURSOR_HAND2);
57    m_cursorStringMap.set(ASCIILiteral("cursor/i_beam"), ECORE_X_CURSOR_XTERM);
58    m_cursorStringMap.set(ASCIILiteral("cursor/wait"), ECORE_X_CURSOR_WATCH);
59    m_cursorStringMap.set(ASCIILiteral("cursor/help"), ECORE_X_CURSOR_QUESTION_ARROW);
60    m_cursorStringMap.set(ASCIILiteral("cursor/east_resize"), ECORE_X_CURSOR_RIGHT_SIDE);
61    m_cursorStringMap.set(ASCIILiteral("cursor/north_resize"), ECORE_X_CURSOR_TOP_SIDE);
62    m_cursorStringMap.set(ASCIILiteral("cursor/north_east_resize"), ECORE_X_CURSOR_TOP_RIGHT_CORNER);
63    m_cursorStringMap.set(ASCIILiteral("cursor/north_west_resize"), ECORE_X_CURSOR_TOP_LEFT_CORNER);
64    m_cursorStringMap.set(ASCIILiteral("cursor/south_resize"), ECORE_X_CURSOR_BOTTOM_SIDE);
65    m_cursorStringMap.set(ASCIILiteral("cursor/south_east_resize"), ECORE_X_CURSOR_BOTTOM_RIGHT_CORNER);
66    m_cursorStringMap.set(ASCIILiteral("cursor/south_west_resize"), ECORE_X_CURSOR_BOTTOM_LEFT_CORNER);
67    m_cursorStringMap.set(ASCIILiteral("cursor/west_resize"), ECORE_X_CURSOR_LEFT_SIDE);
68    m_cursorStringMap.set(ASCIILiteral("cursor/north_south_resize"), ECORE_X_CURSOR_SB_V_DOUBLE_ARROW);
69    m_cursorStringMap.set(ASCIILiteral("cursor/east_west_resize"), ECORE_X_CURSOR_SB_H_DOUBLE_ARROW);
70    m_cursorStringMap.set(ASCIILiteral("cursor/north_east_south_west_resize"), ECORE_X_CURSOR_SIZING);
71    m_cursorStringMap.set(ASCIILiteral("cursor/north_west_south_east_resize"), ECORE_X_CURSOR_SIZING);
72    m_cursorStringMap.set(ASCIILiteral("cursor/column_resize"), ECORE_X_CURSOR_SB_H_DOUBLE_ARROW);
73    m_cursorStringMap.set(ASCIILiteral("cursor/row_resize"), ECORE_X_CURSOR_SB_V_DOUBLE_ARROW);
74    m_cursorStringMap.set(ASCIILiteral("cursor/middle_panning"),  ECORE_X_CURSOR_CROSS_REVERSE);
75    m_cursorStringMap.set(ASCIILiteral("cursor/east_panning"), ECORE_X_CURSOR_CROSS_REVERSE);
76    m_cursorStringMap.set(ASCIILiteral("cursor/north_panning"), ECORE_X_CURSOR_CROSS_REVERSE);
77    m_cursorStringMap.set(ASCIILiteral("cursor/north_east_panning"), ECORE_X_CURSOR_CROSS_REVERSE);
78    m_cursorStringMap.set(ASCIILiteral("cursor/north_west_panning"), ECORE_X_CURSOR_CROSS_REVERSE);
79    m_cursorStringMap.set(ASCIILiteral("cursor/south_panning"), ECORE_X_CURSOR_CROSS_REVERSE);
80    m_cursorStringMap.set(ASCIILiteral("cursor/south_east_panning"), ECORE_X_CURSOR_CROSS_REVERSE);
81    m_cursorStringMap.set(ASCIILiteral("cursor/south_west_panning"), ECORE_X_CURSOR_CROSS_REVERSE);
82    m_cursorStringMap.set(ASCIILiteral("cursor/west_panning"), ECORE_X_CURSOR_CROSS_REVERSE);
83    m_cursorStringMap.set(ASCIILiteral("cursor/vertical_text"), ECORE_X_CURSOR_SB_DOWN_ARROW);
84    m_cursorStringMap.set(ASCIILiteral("cursor/cell"), ECORE_X_CURSOR_ICON);
85    m_cursorStringMap.set(ASCIILiteral("cursor/context_menu"), ECORE_X_CURSOR_HAND2);
86    m_cursorStringMap.set(ASCIILiteral("cursor/no_drop"), ECORE_X_CURSOR_DOT_BOX_MASK);
87    m_cursorStringMap.set(ASCIILiteral("cursor/copy"), ECORE_X_CURSOR_ICON);
88    m_cursorStringMap.set(ASCIILiteral("cursor/progress"), ECORE_X_CURSOR_WATCH);
89    m_cursorStringMap.set(ASCIILiteral("cursor/alias"), ECORE_X_CURSOR_MAN);
90    m_cursorStringMap.set(ASCIILiteral("cursor/none"), ECORE_X_CURSOR_X);
91    m_cursorStringMap.set(ASCIILiteral("cursor/not_allowed"), ECORE_X_CURSOR_X);
92    m_cursorStringMap.set(ASCIILiteral("cursor/zoom_in"), ECORE_X_CURSOR_DIAMOND_CROSS);
93    m_cursorStringMap.set(ASCIILiteral("cursor/zoom_out"), ECORE_X_CURSOR_DIAMOND_CROSS);
94    m_cursorStringMap.set(ASCIILiteral("cursor/grab"), ECORE_X_CURSOR_HAND2);
95    m_cursorStringMap.set(ASCIILiteral("cursor/grabbing"), ECORE_X_CURSOR_HAND2);
96}
97
98int getEcoreCursor(const String& cursorString)
99{
100    DEPRECATED_DEFINE_STATIC_LOCAL(CursorMap, cursorStringMap, ());
101
102    return cursorStringMap.cursor(cursorString);
103}
104#endif
105
106void applyFallbackCursor(Ecore_Evas* ecoreEvas, const char* cursorString)
107{
108#ifdef HAVE_ECORE_X
109    Ecore_X_Window window = getEcoreXWindow(ecoreEvas);
110    if (!window)
111        return;
112
113    int shape = getEcoreCursor(cursorString);
114    if (shape < ECORE_X_CURSOR_X || shape > ECORE_X_CURSOR_XTERM) {
115        LOG_ERROR("cannot map an equivalent X cursor for"
116                  " c ursor group %s", cursorString);
117        shape = ECORE_X_CURSOR_LEFT_PTR;
118    }
119
120    Ecore_X_Cursor cursor = ecore_x_cursor_shape_get(shape);
121    ecore_x_window_cursor_set(window, cursor);
122#endif
123}
124
125Ecore_X_Window getEcoreXWindow(Ecore_Evas* ecoreEvas)
126{
127    const char* engine = ecore_evas_engine_name_get(ecoreEvas);
128
129    if (!strcmp(engine, "opengl_x11"))
130        return ecore_evas_gl_x11_window_get(ecoreEvas);
131
132    if (!strcmp(engine, "software_x11"))
133        return ecore_evas_software_x11_window_get(ecoreEvas);
134
135    return 0;
136}
137
138} // namespace WebCore
139