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