Add support on Elm to customized cursors

Widgets can have customized cursors setting it with elm_object_cursor_set.
Widget's item can use elm_X_item_cursor_set to set a different cursor
for each item.
It will work only if HAVE_ELEMENTARY_X for now, but support for themeable
cursors is planned.



SVN revision: 52382
This commit is contained in:
Bruno Dilly 2010-09-17 18:24:10 +00:00
parent 902819723b
commit 66e512552f
10 changed files with 509 additions and 1 deletions

View File

@ -655,6 +655,8 @@ extern "C" {
EAPI void elm_gengrid_item_tooltip_unset(Elm_Gengrid_Item *item);
EAPI void elm_gengrid_item_tooltip_style_set(Elm_Gengrid_Item *item, const char *style);
EAPI const char *elm_gengrid_item_tooltip_style_get(const Elm_Gengrid_Item *item);
EAPI void elm_gengrid_item_cursor_set(Elm_Gengrid_Item *item, const char *cursor);
EAPI void elm_gengrid_item_cursor_unset(Elm_Gengrid_Item *item);
EAPI void elm_gengrid_clear(Evas_Object *obj);
EAPI void *elm_gengrid_item_data_get(const Elm_Gengrid_Item *item);
@ -996,6 +998,8 @@ extern "C" {
EAPI void elm_toolbar_item_tooltip_text_set(Elm_Toolbar_Item *item, const char *text);
EAPI void elm_toolbar_item_tooltip_content_cb_set(Elm_Toolbar_Item *item, Elm_Tooltip_Item_Content_Cb func, const void *data, Evas_Smart_Cb del_cb);
EAPI void elm_toolbar_item_tooltip_unset(Elm_Toolbar_Item *item);
EAPI void elm_toolbar_item_cursor_set(Elm_Toolbar_Item *item, const char *cursor);
EAPI void elm_toolbar_item_cursor_unset(Elm_Toolbar_Item *item);
EAPI void elm_toolbar_item_tooltip_style_set(Elm_Toolbar_Item *item, const char *style);
EAPI const char *elm_toolbar_item_tooltip_style_get(const Elm_Toolbar_Item *item);
@ -1037,6 +1041,8 @@ extern "C" {
EAPI void elm_object_tooltip_style_set(Evas_Object *obj, const char *style);
EAPI const char *elm_object_tooltip_style_get(const Evas_Object *obj);
EAPI void elm_object_cursor_set(Evas_Object *obj, const char *cursor);
EAPI void elm_object_cursor_unset(Evas_Object *obj);
typedef struct _Elm_Menu_Item Elm_Menu_Item; /**< Item of Elm_Menu. Sub-type of Elm_Widget_Item */
EAPI Evas_Object *elm_menu_add(Evas_Object *parent);
@ -1111,6 +1117,8 @@ extern "C" {
EAPI void elm_list_item_tooltip_unset(Elm_List_Item *item);
EAPI void elm_list_item_tooltip_style_set(Elm_List_Item *item, const char *style);
EAPI const char *elm_list_item_tooltip_style_get(const Elm_List_Item *item);
EAPI void elm_list_item_cursor_set(Elm_List_Item *item, const char *cursor);
EAPI void elm_list_item_cursor_unset(Elm_List_Item *item);
EAPI void elm_list_bounce_set(Evas_Object *obj, Eina_Bool h_bounce, Eina_Bool v_bounce);
EAPI void elm_list_scroller_policy_set(Evas_Object *obj, Elm_Scroller_Policy policy_h, Elm_Scroller_Policy policy_v);
@ -1253,6 +1261,8 @@ extern "C" {
EAPI void elm_genlist_item_tooltip_unset(Elm_Genlist_Item *item);
EAPI void elm_genlist_item_tooltip_style_set(Elm_Genlist_Item *item, const char *style);
EAPI const char *elm_genlist_item_tooltip_style_get(const Elm_Genlist_Item *item);
EAPI void elm_genlist_item_cursor_set(Elm_Genlist_Item *item, const char *cursor);
EAPI void elm_genlist_item_cursor_unset(Elm_Genlist_Item *item);
EAPI Evas_Object *elm_check_add(Evas_Object *parent);

View File

@ -0,0 +1,88 @@
#ifndef _ELM_CURSOR_H
#define _ELM_CURSOR_H
/**
* @file
* @brief Defines the various cursor types for the X Windows system.
*/
#define ELM_CURSOR_X "x"
#define ELM_CURSOR_ARROW "arrow"
#define ELM_CURSOR_BASED_ARROW_DOWN "based_arrow_down"
#define ELM_CURSOR_BASED_ARROW_UP "based_arrow_up"
#define ELM_CURSOR_BOAT "boat"
#define ELM_CURSOR_BOGOSITY "bogosity"
#define ELM_CURSOR_BOTTOM_LEFT_CORNER "bottom_left_corner"
#define ELM_CURSOR_BOTTOM_RIGHT_CORNER "bottom_right_corner"
#define ELM_CURSOR_BOTTOM_SIDE "bottom_side"
#define ELM_CURSOR_BOTTOM_TEE "bottom_tee"
#define ELM_CURSOR_BOX_SPIRAL "box_spiral"
#define ELM_CURSOR_CENTER_PTR "center_ptr"
#define ELM_CURSOR_CIRCLE "circle"
#define ELM_CURSOR_CLOCK "clock"
#define ELM_CURSOR_COFFEE_MUG "coffee_mug"
#define ELM_CURSOR_CROSS "cross"
#define ELM_CURSOR_CROSS_REVERSE "cross_reverse"
#define ELM_CURSOR_CROSSHAIR "crosshair"
#define ELM_CURSOR_DIAMOND_CROSS "diamond_cross"
#define ELM_CURSOR_DOT "dot"
#define ELM_CURSOR_DOT_BOX_MASK "dot_box_mask"
#define ELM_CURSOR_DOUBLE_ARROW "double_arrow"
#define ELM_CURSOR_DRAFT_LARGE "draft_large"
#define ELM_CURSOR_DRAFT_SMALL "draft_small"
#define ELM_CURSOR_DRAPED_BOX "draped_box"
#define ELM_CURSOR_EXCHANGE "exchange"
#define ELM_CURSOR_FLEUR "fleur"
#define ELM_CURSOR_GOBBLER "gobbler"
#define ELM_CURSOR_GUMBY "gumby"
#define ELM_CURSOR_HAND1 "hand1"
#define ELM_CURSOR_HAND2 "hand2"
#define ELM_CURSOR_HEART "heart"
#define ELM_CURSOR_ICON "icon"
#define ELM_CURSOR_IRON_CROSS "iron_cross"
#define ELM_CURSOR_LEFT_PTR "left_ptr"
#define ELM_CURSOR_LEFT_SIDE "left_side"
#define ELM_CURSOR_LEFT_TEE "left_tee"
#define ELM_CURSOR_LEFTBUTTON "leftbutton"
#define ELM_CURSOR_LL_ANGLE "ll_angle"
#define ELM_CURSOR_LR_ANGLE "lr_angle"
#define ELM_CURSOR_MAN "man"
#define ELM_CURSOR_MIDDLEBUTTON "middlebutton"
#define ELM_CURSOR_MOUSE "mouse"
#define ELM_CURSOR_PENCIL "pencil"
#define ELM_CURSOR_PIRATE "pirate"
#define ELM_CURSOR_PLUS "plus"
#define ELM_CURSOR_QUESTION_ARROW "question_arrow"
#define ELM_CURSOR_RIGHT_PTR "right_ptr"
#define ELM_CURSOR_RIGHT_SIDE "right_side"
#define ELM_CURSOR_RIGHT_TEE "right_tee"
#define ELM_CURSOR_RIGHTBUTTON "rightbutton"
#define ELM_CURSOR_RTL_LOGO "rtl_logo"
#define ELM_CURSOR_SAILBOAT "sailboat"
#define ELM_CURSOR_SB_DOWN_ARROW "sb_down_arrow"
#define ELM_CURSOR_SB_H_DOUBLE_ARROW "sb_h_double_arrow"
#define ELM_CURSOR_SB_LEFT_ARROW "sb_left_arrow"
#define ELM_CURSOR_SB_RIGHT_ARROW "sb_right_arrow"
#define ELM_CURSOR_SB_UP_ARROW "sb_up_arrow"
#define ELM_CURSOR_SB_V_DOUBLE_ARROW "sb_v_double_arrow"
#define ELM_CURSOR_SHUTTLE "shuttle"
#define ELM_CURSOR_SIZING "sizing"
#define ELM_CURSOR_SPIDER "spider"
#define ELM_CURSOR_SPRAYCAN "spraycan"
#define ELM_CURSOR_STAR "star"
#define ELM_CURSOR_TARGET "target"
#define ELM_CURSOR_TCROSS "tcross"
#define ELM_CURSOR_TOP_LEFT_ARROW "top_left_arrow"
#define ELM_CURSOR_TOP_LEFT_CORNER "top_left_corner"
#define ELM_CURSOR_TOP_RIGHT_CORNER "top_right_corner"
#define ELM_CURSOR_TOP_SIDE "top_side"
#define ELM_CURSOR_TOP_TEE "top_tee"
#define ELM_CURSOR_TREK "trek"
#define ELM_CURSOR_UL_ANGLE "ul_angle"
#define ELM_CURSOR_UMBRELLA "umbrella"
#define ELM_CURSOR_UR_ANGLE "ur_angle"
#define ELM_CURSOR_WATCH "watch"
#define ELM_CURSOR_XTERM "xterm"
#endif // ifndef _ELM_CURSOR_H

View File

@ -26,7 +26,7 @@ endif
lib_LTLIBRARIES = libelementary.la
includes_HEADERS = Elementary.h elm_widget.h
includes_HEADERS = Elementary.h Elementary_Cursor.h elm_widget.h
includesdir = $(includedir)/elementary-@VMAJ@
libelementary_la_SOURCES = \
@ -91,6 +91,7 @@ elc_notepad.c \
elc_scrolled_entry.c \
\
els_tooltip.c \
els_cursor.c \
els_pan.c \
els_pan.h \
els_scroller.c \

View File

@ -1576,6 +1576,35 @@ elm_gengrid_item_tooltip_style_get(const Elm_Gengrid_Item *item)
return elm_widget_item_tooltip_style_get(item);
}
/**
* Set the cursor to be shown when mouse is over the gengrid item
*
* @param item Target item
* @param cursor the cursor name to be used.
*
* @see elm_object_cursor_set()
* @ingroup Gengrid
*/
EAPI void
elm_gengrid_item_cursor_set(Elm_Gengrid_Item *item, const char *cursor)
{
elm_widget_item_cursor_set(item, cursor);
}
/**
* Unset the cursor to be shown when mouse is over the gengrid item
*
* @param item Target item
*
* @see elm_object_cursor_unset()
* @ingroup Gengrid
*/
EAPI void
elm_gengrid_item_cursor_unset(Elm_Gengrid_Item *item)
{
elm_widget_item_cursor_unset(item);
}
/**
* Set the always select mode.
*

View File

@ -2993,6 +2993,35 @@ elm_genlist_item_tooltip_style_get(const Elm_Genlist_Item *item)
return elm_widget_item_tooltip_style_get(item);
}
/**
* Set the cursor to be shown when mouse is over the genlist item
*
* @param item Target item
* @param cursor the cursor name to be used.
*
* @see elm_object_cursor_set()
* @ingroup Genlist
*/
EAPI void
elm_genlist_item_cursor_set(Elm_Genlist_Item *item, const char *cursor)
{
elm_widget_item_cursor_set(item, cursor);
}
/**
* Unset the cursor to be shown when mouse is over the genlist item
*
* @param item Target item
*
* @see elm_object_cursor_unset()
* @ingroup Genlist
*/
EAPI void
elm_genlist_item_cursor_unset(Elm_Genlist_Item *item)
{
elm_widget_item_cursor_unset(item);
}
/**
* This sets the horizontal stretching mode
*

View File

@ -1607,6 +1607,35 @@ elm_list_item_tooltip_style_get(const Elm_List_Item *item)
return elm_widget_item_tooltip_style_get(item);
}
/**
* Set the cursor to be shown when mouse is over the list item
*
* @param item Target item
* @param cursor the cursor name to be used.
*
* @see elm_object_cursor_set()
* @ingroup List
*/
EAPI void
elm_list_item_cursor_set(Elm_List_Item *item, const char *cursor)
{
elm_widget_item_cursor_set(item, cursor);
}
/**
* Unset the cursor to be shown when mouse is over the list item
*
* @param item Target item
*
* @see elm_object_cursor_unset()
* @ingroup List
*/
EAPI void
elm_list_item_cursor_unset(Elm_List_Item *item)
{
elm_widget_item_cursor_unset(item);
}
/**
* Set bounce mode
*

View File

@ -949,6 +949,35 @@ elm_toolbar_item_tooltip_style_get(const Elm_Toolbar_Item *item)
return elm_widget_item_tooltip_style_get(item);
}
/**
* Set the cursor to be shown when mouse is over the toolbar item
*
* @param item Target item
* @param cursor the cursor name to be used.
*
* @see elm_object_cursor_set()
* @ingroup Toolbar
*/
EAPI void
elm_toolbar_item_cursor_set(Elm_Toolbar_Item *item, const char *cursor)
{
elm_widget_item_cursor_set(item, cursor);
}
/**
* Unset the cursor to be shown when mouse is over the toolbar item
*
* @param item Target item
*
* @see elm_object_cursor_unset()
* @ingroup Toolbar
*/
EAPI void
elm_toolbar_item_cursor_unset(Elm_Toolbar_Item *item)
{
elm_widget_item_cursor_unset(item);
}
/**
* Get whether the toolbar item opens a menu.
*

View File

@ -1523,6 +1523,20 @@ _elm_widget_item_tooltip_style_get(const Elm_Widget_Item *item)
return elm_object_tooltip_style_get(item->view);
}
EAPI void
_elm_widget_item_cursor_set(Elm_Widget_Item *item, const char *cursor)
{
ELM_WIDGET_ITEM_CHECK_OR_RETURN(item);
elm_object_cursor_set(item->view, cursor);
}
EAPI void
_elm_widget_item_cursor_unset(Elm_Widget_Item *item)
{
ELM_WIDGET_ITEM_CHECK_OR_RETURN(item);
elm_object_cursor_unset(item->view);
}
// smart object funcs
static void
_smart_reconfigure(Smart_Data *sd)

View File

@ -186,6 +186,7 @@
#define ELM_INTERNAL_API_VERSION 7000
typedef struct _Elm_Tooltip Elm_Tooltip;
typedef struct _Elm_Cursor Elm_Cursor;
typedef struct _Elm_Widget_Item Elm_Widget_Item; /**< base structure for all widget items that are not Elm_Widget themselves */
struct _Elm_Widget_Item
@ -286,6 +287,8 @@ EAPI void _elm_widget_item_tooltip_content_cb_set(Elm_Widget_Item *i
EAPI void _elm_widget_item_tooltip_unset(Elm_Widget_Item *item);
EAPI void _elm_widget_item_tooltip_style_set(Elm_Widget_Item *item, const char *style);
EAPI const char *_elm_widget_item_tooltip_style_get(const Elm_Widget_Item *item);
EAPI void _elm_widget_item_cursor_set(Elm_Widget_Item *item, const char *cursor);
EAPI void _elm_widget_item_cursor_unset(Elm_Widget_Item *item);
/**
* Convenience macro to create new widget item, doing casts for you.
@ -359,6 +362,18 @@ EAPI const char *_elm_widget_item_tooltip_style_get(const Elm_Widget_Item *
*/
#define elm_widget_item_tooltip_style_get(item) \
_elm_widget_item_tooltip_style_get((const Elm_Widget_Item *)item)
/**
* Convenience function to set widget item cursor.
* @see _elm_widget_item_cursor_set()
*/
#define elm_widget_item_cursor_set(item, cursor) \
_elm_widget_item_cursor_set((Elm_Widget_Item *)item, cursor)
/**
* Convenience function to unset widget item cursor.
* @see _elm_widget_item_cursor_unset()
*/
#define elm_widget_item_cursor_unset(item) \
_elm_widget_item_cursor_unset((Elm_Widget_Item *)item)
/**
* Cast and ensure the given pointer is an Elm_Widget_Item or return NULL.

View File

@ -0,0 +1,264 @@
#include <Elementary.h>
#include <Elementary_Cursor.h>
#include "elm_priv.h"
#ifdef HAVE_ELEMENTARY_X
#include <Ecore_X.h>
#include <Ecore_X_Cursor.h>
#endif
/**
* @defgroup Cursors Cursors
*
* The Cursor is an internal smart object used to customize the
* cursor displayed over objects (or widgets).
* It can use default X cursors (if using X), or cursors from a
* theme.
*/
static const char _cursor_key[] = "_elm_cursor";
struct _Cursor_Id {
const char *name;
#ifdef HAVE_ELEMENTARY_X
int id;
#endif
};
#ifdef HAVE_ELEMENTARY_X
#define CURSOR(_name, _xid) \
{_name , _xid}
# else
#define CURSOR(_name, _xid) \
{_name}
#endif
/* Please keep order in sync with Ecore_X_Cursor.h values! */
struct _Cursor_Id _cursors[] =
{
CURSOR(ELM_CURSOR_X , ECORE_X_CURSOR_X ),
CURSOR(ELM_CURSOR_ARROW , ECORE_X_CURSOR_ARROW ),
CURSOR(ELM_CURSOR_BASED_ARROW_DOWN , ECORE_X_CURSOR_BASED_ARROW_DOWN ),
CURSOR(ELM_CURSOR_BASED_ARROW_UP , ECORE_X_CURSOR_UP ),
CURSOR(ELM_CURSOR_BOAT , ECORE_X_CURSOR_BOAT ),
CURSOR(ELM_CURSOR_BOGOSITY , ECORE_X_CURSOR_BOGOSITY ),
CURSOR(ELM_CURSOR_BOTTOM_LEFT_CORNER , ECORE_X_CURSOR_BOTTOM_LEFT_CORNER ),
CURSOR(ELM_CURSOR_BOTTOM_RIGHT_CORNER, ECORE_X_CURSOR_BOTTOM_RIGHT_CORNER),
CURSOR(ELM_CURSOR_BOTTOM_SIDE , ECORE_X_CURSOR_BOTTOM_SIDE ),
CURSOR(ELM_CURSOR_BOTTOM_TEE , ECORE_X_CURSOR_BOTTOM_TEE ),
CURSOR(ELM_CURSOR_BOX_SPIRAL , ECORE_X_CURSOR_BOX_SPIRAL ),
CURSOR(ELM_CURSOR_CENTER_PTR , ECORE_X_CURSOR_CENTER_PTR ),
CURSOR(ELM_CURSOR_CIRCLE , ECORE_X_CURSOR_CIRCLE ),
CURSOR(ELM_CURSOR_CLOCK , ECORE_X_CURSOR_CLOCK ),
CURSOR(ELM_CURSOR_COFFEE_MUG , ECORE_X_CURSOR_COFFEE_MUG ),
CURSOR(ELM_CURSOR_CROSS , ECORE_X_CURSOR_CROSS ),
CURSOR(ELM_CURSOR_CROSS_REVERSE , ECORE_X_CURSOR_CROSS_REVERSE ),
CURSOR(ELM_CURSOR_CROSSHAIR , ECORE_X_CURSOR_CROSSHAIR ),
CURSOR(ELM_CURSOR_DIAMOND_CROSS , ECORE_X_CURSOR_DIAMOND_CROSS ),
CURSOR(ELM_CURSOR_DOT , ECORE_X_CURSOR_DOT ),
CURSOR(ELM_CURSOR_DOT_BOX_MASK , ECORE_X_CURSOR_DOT_BOX_MASK ),
CURSOR(ELM_CURSOR_DOUBLE_ARROW , ECORE_X_CURSOR_DOUBLE_ARROW ),
CURSOR(ELM_CURSOR_DRAFT_LARGE , ECORE_X_CURSOR_DRAFT_LARGE ),
CURSOR(ELM_CURSOR_DRAFT_SMALL , ECORE_X_CURSOR_DRAFT_SMALL ),
CURSOR(ELM_CURSOR_DRAPED_BOX , ECORE_X_CURSOR_DRAPED_BOX ),
CURSOR(ELM_CURSOR_EXCHANGE , ECORE_X_CURSOR_EXCHANGE ),
CURSOR(ELM_CURSOR_FLEUR , ECORE_X_CURSOR_FLEUR ),
CURSOR(ELM_CURSOR_GOBBLER , ECORE_X_CURSOR_GOBBLER ),
CURSOR(ELM_CURSOR_GUMBY , ECORE_X_CURSOR_GUMBY ),
CURSOR(ELM_CURSOR_HAND1 , ECORE_X_CURSOR_HAND1 ),
CURSOR(ELM_CURSOR_HAND2 , ECORE_X_CURSOR_HAND2 ),
CURSOR(ELM_CURSOR_HEART , ECORE_X_CURSOR_HEART ),
CURSOR(ELM_CURSOR_ICON , ECORE_X_CURSOR_ICON ),
CURSOR(ELM_CURSOR_IRON_CROSS , ECORE_X_CURSOR_IRON_CROSS ),
CURSOR(ELM_CURSOR_LEFT_PTR , ECORE_X_CURSOR_LEFT_PTR ),
CURSOR(ELM_CURSOR_LEFT_SIDE , ECORE_X_CURSOR_LEFT_SIDE ),
CURSOR(ELM_CURSOR_LEFT_TEE , ECORE_X_CURSOR_LEFT_TEE ),
CURSOR(ELM_CURSOR_LEFTBUTTON , ECORE_X_CURSOR_LEFTBUTTON ),
CURSOR(ELM_CURSOR_LL_ANGLE , ECORE_X_CURSOR_LL_ANGLE ),
CURSOR(ELM_CURSOR_LR_ANGLE , ECORE_X_CURSOR_LR_ANGLE ),
CURSOR(ELM_CURSOR_MAN , ECORE_X_CURSOR_MAN ),
CURSOR(ELM_CURSOR_MIDDLEBUTTON , ECORE_X_CURSOR_MIDDLEBUTTON ),
CURSOR(ELM_CURSOR_MOUSE , ECORE_X_CURSOR_MOUSE ),
CURSOR(ELM_CURSOR_PENCIL , ECORE_X_CURSOR_PENCIL ),
CURSOR(ELM_CURSOR_PIRATE , ECORE_X_CURSOR_PIRATE ),
CURSOR(ELM_CURSOR_PLUS , ECORE_X_CURSOR_PLUS ),
CURSOR(ELM_CURSOR_QUESTION_ARROW , ECORE_X_CURSOR_QUESTION_ARROW ),
CURSOR(ELM_CURSOR_RIGHT_PTR , ECORE_X_CURSOR_RIGHT_PTR ),
CURSOR(ELM_CURSOR_RIGHT_SIDE , ECORE_X_CURSOR_RIGHT_SIDE ),
CURSOR(ELM_CURSOR_RIGHT_TEE , ECORE_X_CURSOR_RIGHT_TEE ),
CURSOR(ELM_CURSOR_RIGHTBUTTON , ECORE_X_CURSOR_RIGHTBUTTON ),
CURSOR(ELM_CURSOR_RTL_LOGO , ECORE_X_CURSOR_RTL_LOGO ),
CURSOR(ELM_CURSOR_SAILBOAT , ECORE_X_CURSOR_SAILBOAT ),
CURSOR(ELM_CURSOR_SB_DOWN_ARROW , ECORE_X_CURSOR_SB_DOWN_ARROW ),
CURSOR(ELM_CURSOR_SB_H_DOUBLE_ARROW , ECORE_X_CURSOR_SB_H_DOUBLE_ARROW ),
CURSOR(ELM_CURSOR_SB_LEFT_ARROW , ECORE_X_CURSOR_SB_LEFT_ARROW ),
CURSOR(ELM_CURSOR_SB_RIGHT_ARROW , ECORE_X_CURSOR_SB_RIGHT_ARROW ),
CURSOR(ELM_CURSOR_SB_UP_ARROW , ECORE_X_CURSOR_SB_UP_ARROW ),
CURSOR(ELM_CURSOR_SB_V_DOUBLE_ARROW , ECORE_X_CURSOR_SB_V_DOUBLE_ARROW ),
CURSOR(ELM_CURSOR_SHUTTLE , ECORE_X_CURSOR_SHUTTLE ),
CURSOR(ELM_CURSOR_SIZING , ECORE_X_CURSOR_SIZING ),
CURSOR(ELM_CURSOR_SPIDER , ECORE_X_CURSOR_SPIDER ),
CURSOR(ELM_CURSOR_SPRAYCAN , ECORE_X_CURSOR_SPRAYCAN ),
CURSOR(ELM_CURSOR_STAR , ECORE_X_CURSOR_STAR ),
CURSOR(ELM_CURSOR_TARGET , ECORE_X_CURSOR_TARGET ),
CURSOR(ELM_CURSOR_TCROSS , ECORE_X_CURSOR_TCROSS ),
CURSOR(ELM_CURSOR_TOP_LEFT_ARROW , ECORE_X_CURSOR_TOP_LEFT_ARROW ),
CURSOR(ELM_CURSOR_TOP_LEFT_CORNER , ECORE_X_CURSOR_TOP_LEFT_CORNER ),
CURSOR(ELM_CURSOR_TOP_RIGHT_CORNER , ECORE_X_CURSOR_TOP_RIGHT_CORNER ),
CURSOR(ELM_CURSOR_TOP_SIDE , ECORE_X_CURSOR_TOP_SIDE ),
CURSOR(ELM_CURSOR_TOP_TEE , ECORE_X_CURSOR_TOP_TEE ),
CURSOR(ELM_CURSOR_TREK , ECORE_X_CURSOR_TREK ),
CURSOR(ELM_CURSOR_UL_ANGLE , ECORE_X_CURSOR_UL_ANGLE ),
CURSOR(ELM_CURSOR_UMBRELLA , ECORE_X_CURSOR_UMBRELLA ),
CURSOR(ELM_CURSOR_UR_ANGLE , ECORE_X_CURSOR_UR_ANGLE ),
CURSOR(ELM_CURSOR_WATCH , ECORE_X_CURSOR_WATCH ),
CURSOR(ELM_CURSOR_XTERM , ECORE_X_CURSOR_XTERM )
};
static const int _cursors_count = sizeof(_cursors)/sizeof(struct _Cursor_Id);
#define ELM_CURSOR_GET_OR_RETURN(cur, obj, ...) \
Elm_Cursor *cur; \
do \
{ \
if (!(obj)) \
{ \
CRITICAL("Null pointer: " #obj); \
return __VA_ARGS__; \
} \
cur = evas_object_data_get((obj), _cursor_key); \
if (!cur) \
{ \
ERR("Object does not have cursor: " #obj); \
return __VA_ARGS__; \
} \
} \
while (0)
struct _Elm_Cursor
{
#ifdef HAVE_ELEMENTARY_X
Ecore_X_Cursor cursor;
Ecore_X_Window win;
#endif
Eina_Bool visible:1;
};
static void
_cursor_mouse_in(void *data, Evas *evas __UNUSED__, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__)
{
Elm_Cursor *cur = data;
#ifdef HAVE_ELEMENTARY_X
ecore_x_window_cursor_set(cur->win, cur->cursor);
cur->visible = EINA_TRUE;
#endif
}
static void
_cursor_mouse_out(void *data, Evas *evas __UNUSED__, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__)
{
Elm_Cursor *cur = data;
#ifdef HAVE_ELEMENTARY_X
cur->visible = EINA_FALSE;
ecore_x_window_cursor_set(cur->win, ECORE_X_CURSOR_X);
#endif
}
static void
_cursor_del(void *data, Evas *evas __UNUSED__, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__)
{
elm_object_cursor_unset(obj);
}
static int
_cur_strcmp(const void *data1, const void *data2)
{
const struct _Cursor_Id *c1 = data1;
const struct _Cursor_Id *c2 = data2;
return strcmp (c1->name, c2->name);
}
/**
* Set the cursor to be shown when mouse is over the object
*
* Set the cursor that will be displayed when mouse is over the
* object. The object can have only one cursor set to it, so if
* this function is called twice for an object, the previous set
* will be unset.
* If using X cursors, a definition of all the valid cursor names
* is listed on Elementary_Cursors.h. If an invalid name is set
* the default cursor will be used.
*
* @param obj the object being set a cursor.
* @param cursor the cursor name to be used.
*
* @ingroup Cursors
*/
EAPI void
elm_object_cursor_set(Evas_Object *obj, const char *cursor)
{
Elm_Cursor *cur = NULL;
struct _Cursor_Id cur_search, *cur_id;
EINA_SAFETY_ON_NULL_RETURN(obj);
cur = evas_object_data_get(obj, _cursor_key);
if (cur)
elm_object_cursor_unset(obj);
if (!cursor) return;
cur_search.name = cursor;
cur_id = bsearch(&cursor, _cursors, _cursors_count,
sizeof(struct _Cursor_Id), _cur_strcmp);
if (!cur_id) {
INF("Cursor couldn't be found");
return;
}
cur = ELM_NEW(Elm_Cursor);
if (!cur) return;
#ifdef HAVE_ELEMENTARY_X
cur->win = elm_win_xwindow_get(obj);
cur->cursor = ecore_x_cursor_shape_get(cur_id->id);
#endif
cur->visible = EINA_FALSE;
evas_object_data_set(obj, _cursor_key, cur);
evas_object_event_callback_add(obj, EVAS_CALLBACK_MOUSE_IN,
_cursor_mouse_in, cur);
evas_object_event_callback_add(obj, EVAS_CALLBACK_MOUSE_OUT,
_cursor_mouse_out, cur);
evas_object_event_callback_add(obj, EVAS_CALLBACK_DEL,
_cursor_del, cur);
}
/**
* Unset cursor for object
*
* Unset cursor for object, and set the cursor to default if the mouse
* was over this object.
*
* @param obj Target object
* @see elm_object_cursor_set()
*
* @ingroup Cursors
*/
EAPI void
elm_object_cursor_unset(Evas_Object *obj)
{
ELM_CURSOR_GET_OR_RETURN(cur, obj);
#ifdef HAVE_ELEMENTARY_X
if (cur->visible)
ecore_x_window_cursor_set(cur->win, ECORE_X_CURSOR_X);
#endif
evas_object_event_callback_del(obj, EVAS_CALLBACK_MOUSE_IN,
_cursor_mouse_in);
evas_object_event_callback_del(obj, EVAS_CALLBACK_MOUSE_OUT,
_cursor_mouse_out);
evas_object_event_callback_del(obj, EVAS_CALLBACK_DEL, _cursor_mouse_out);
evas_object_data_del(obj, _cursor_key);
free(cur);
}