void ArgumentCoder<Cursor>::encode(ArgumentEncoder& encoder, const Cursor& cursor) { encoder.encodeEnum(cursor.type()); if (cursor.type() != Cursor::Custom) return; if (cursor.image()->isNull()) { encoder << false; // There is no valid image being encoded. return; } encoder << true; encodeImage(encoder, cursor.image()); encoder << cursor.hotSpot(); }
void EwkView::setCursor(const Cursor& cursor) { #ifdef HAVE_ECORE_X Ecore_Evas* ecoreEvas = ecore_evas_ecore_evas_get(smartData()->base.evas); Ecore_X_Window window = getEcoreXWindow(ecoreEvas); if (Image* cursorImage = cursor.image()) { // Custom cursor. if (cursorImage == m_cursorIdentifier.image) return; IntPoint hotSpot; cursorImage->getHotSpot(hotSpot); Ecore_X_Cursor customCursor = createCustomCursor(window, cursorImage, IntSize(cursorImage->size()), hotSpot); if (!customCursor) return; if (m_customCursor) ecore_x_cursor_free(m_customCursor); m_cursorIdentifier.image = cursorImage; m_customCursor = customCursor; } else { if (m_customCursor) { ecore_x_cursor_free(m_customCursor); m_customCursor = ECORE_X_CURSOR_X; } // Standard cursor. const char* group = cursor.platformCursor(); if (!group || group == m_cursorIdentifier.group) return; m_cursorIdentifier.group = group; } updateCursor(window); #endif }
void EwkView::setCursor(const Cursor& cursor) { if (cursor.image()) { // Custom cursor. if (cursor.image() == m_cursorIdentifier) return; m_cursorIdentifier = cursor.image(); Ewk_View_Smart_Data* sd = smartData(); RefPtr<Evas_Object> cursorObject = adoptRef(cursor.image()->getEvasObject(sd->base.evas)); if (!cursorObject) return; // Resize cursor. evas_object_resize(cursorObject.get(), cursor.image()->size().width(), cursor.image()->size().height()); // Get cursor hot spot. IntPoint hotSpot; cursor.image()->getHotSpot(hotSpot); Ecore_Evas* ecoreEvas = ecore_evas_ecore_evas_get(sd->base.evas); // ecore_evas takes care of freeing the cursor object. ecore_evas_object_cursor_set(ecoreEvas, cursorObject.release().leakRef(), EVAS_LAYER_MAX, hotSpot.x(), hotSpot.y()); return; } // Standard cursor. const char* group = cursor.platformCursor(); if (!group || group == m_cursorIdentifier) return; m_cursorIdentifier = group; Ewk_View_Smart_Data* sd = smartData(); RefPtr<Evas_Object> cursorObject = adoptRef(edje_object_add(sd->base.evas)); Ecore_Evas* ecoreEvas = ecore_evas_ecore_evas_get(sd->base.evas); if (!m_theme || !edje_object_file_set(cursorObject.get(), m_theme, group)) { ecore_evas_object_cursor_set(ecoreEvas, 0, 0, 0, 0); #ifdef HAVE_ECORE_X if (WebCore::isUsingEcoreX(sd->base.evas)) WebCore::applyFallbackCursor(ecoreEvas, group); #endif return; } // Set cursor size. Evas_Coord width, height; edje_object_size_min_get(cursorObject.get(), &width, &height); if (width <= 0 || height <= 0) edje_object_size_min_calc(cursorObject.get(), &width, &height); if (width <= 0 || height <= 0) { width = defaultCursorSize; height = defaultCursorSize; } evas_object_resize(cursorObject.get(), width, height); // Get cursor hot spot. const char* data; int hotspotX = 0; data = edje_object_data_get(cursorObject.get(), "hot.x"); if (data) hotspotX = atoi(data); int hotspotY = 0; data = edje_object_data_get(cursorObject.get(), "hot.y"); if (data) hotspotY = atoi(data); // ecore_evas takes care of freeing the cursor object. ecore_evas_object_cursor_set(ecoreEvas, cursorObject.release().leakRef(), EVAS_LAYER_MAX, hotspotX, hotspotY); }