1/* 2 * Copyright (C) 2012 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 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 int shape = getEcoreCursor(cursorString); 110 if (shape < ECORE_X_CURSOR_X || shape > ECORE_X_CURSOR_XTERM) { 111 LOG_ERROR("cannot map an equivalent X cursor for" 112 " c ursor group %s", cursorString); 113 shape = ECORE_X_CURSOR_LEFT_PTR; 114 } 115 116 Ecore_X_Window window; 117#if USE(ACCELERATED_COMPOSITING) 118 window = ecore_evas_gl_x11_window_get(ecoreEvas); 119 // Fallback to software mode if necessary. 120 if (!window) 121#endif 122 window = ecore_evas_software_x11_window_get(ecoreEvas); 123 124 Ecore_X_Cursor cursor = ecore_x_cursor_shape_get(shape); 125 ecore_x_window_cursor_set(window, cursor); 126#endif 127} 128 129int getDPI() 130{ 131#ifdef HAVE_ECORE_X 132 return ecore_x_dpi_get(); 133#else 134 return 160; 135#endif 136} 137 138bool isUsingEcoreX(const Evas* evas) 139{ 140#ifdef HAVE_ECORE_X 141 Ecore_Evas* ecoreEvas = ecore_evas_ecore_evas_get(evas); 142 const char* engine = ecore_evas_engine_name_get(ecoreEvas); 143 return !strcmp(engine, "opengl_x11") 144 || !strcmp(engine, "software_x11") 145 || !strcmp(engine, "software_xcb") 146 || !strcmp(engine, "software_16_x11") 147 || !strncmp(engine, "xrender", sizeof("xrender") - 1); 148#else 149 UNUSED_PARAM(evas); 150 return false; 151#endif 152} 153 154} // namespace WebCore 155