oooh big cleanup. internal elm widget api cleaned up a bit.

SVN revision: 52178
This commit is contained in:
Carsten Haitzler 2010-09-13 07:56:23 +00:00
parent 494c1a6dca
commit 68f5b4119b
11 changed files with 1197 additions and 1016 deletions

View File

@ -1,11 +1,14 @@
#include <stdbool.h>
#include <Ecore_X.h>
#include <Elementary.h>
#include "elm_priv.h"
/* nash: I have NFI what this does: Just copying the other tests */
#ifndef ELM_LIB_QUICKLAUNCH
// FIXME: nash - depends on Ecore_X.h - shouldnt. should be agnostic of display
// system here and elm provide any dnd stuff needed, wrapped as needed
#ifdef HAVE_CONFIG_H
# include "elementary_config.h"
#endif
#ifdef HAVE_ELEMENTARY_X
# include <Ecore_X.h>
#define IM "/home/nash/work/samsung/autopaste/images/"
static const char *images[] = {
@ -37,7 +40,7 @@ test_drag_source(void *data, Evas_Object *obj, void *eventinfo){
evas_object_show(bx);
ctrls = elm_box_add(win);
elm_box_horizontal_set(ctrls, true);
elm_box_horizontal_set(ctrls, EINA_TRUE);
evas_object_size_hint_weight_set(ctrls, EVAS_HINT_EXPAND, 0);
evas_object_size_hint_align_set(ctrls, EVAS_HINT_FILL, EVAS_HINT_FILL);
elm_box_pack_end(bx, ctrls);
@ -72,13 +75,13 @@ test_drag_source(void *data, Evas_Object *obj, void *eventinfo){
static Eina_Bool
_dnd_enter(void *data, int etype, void *ev){
printf("enter\n");
return true;
return EINA_TRUE;
}
static Eina_Bool
_dnd_leave(void *data, int etype, void *ev){
printf("leave\n");
return true;
return EINA_TRUE;
}
static Eina_Bool
_dnd_position(void *data, int etype, void *ev){
@ -96,14 +99,14 @@ _dnd_position(void *data, int etype, void *ev){
rect.y = pos->position.y - 5;
rect.width = 10;
rect.height = 10;
ecore_x_dnd_send_status(true, false, rect, pos->action);
ecore_x_dnd_send_status(EINA_TRUE, EINA_FALSE, rect, pos->action);
return true;
return EINA_TRUE;
}
static Eina_Bool
_dnd_status(void *data, int etype, void *ev){
printf("status\n");
return true;
return EINA_TRUE;
}
@ -120,16 +123,16 @@ _dnd_drop(void *data, int etype, void *ev){
/* FIXME: elm_selection_get is in elm_priv.h and does not build with -fvisibility=hidden */
// rv = elm_selection_get(ELM_SEL_XDND, ELM_SEL_MARKUP, en);
// if (rv != true){
// if (rv != EINA_TRUE){
// printf("Selection set fail\n");
// }
return true;
return EINA_TRUE;
}
static Eina_Bool
_dnd_finish(void *data, int etype, void *ev){
printf("finish\n");
return true;
return EINA_TRUE;
}
void
test_drag_dest(void *data, Evas_Object *obj, void *event){
@ -174,7 +177,7 @@ test_drag_dest(void *data, Evas_Object *obj, void *event){
ee = ecore_evas_ecore_evas_get(evas_object_evas_get(win));
xwin = (Ecore_X_Window)ecore_evas_window_get(ee);
ecore_x_dnd_aware_set(xwin, true);
ecore_x_dnd_aware_set(xwin, EINA_TRUE);
evas_object_show(win);
}
@ -183,6 +186,19 @@ void
test_drag_genlist(void *data, Evas_Object *obj, void *event){
printf("No genlist yet\n");
}
#else
void
test_drag_source(void *data, Evas_Object *obj, void *eventinfo)
{
}
void
test_drag_dest(void *data, Evas_Object *obj, void *event)
{
}
void
test_drag_genlist(void *data, Evas_Object *obj, void *event)
{
}
#endif
#endif

View File

@ -1,6 +1,7 @@
MAINTAINERCLEANFILES = Makefile.in
AM_CPPFLAGS = \
-DELM_INTERAL_API_MDFGELQ=1 \
-I. \
-I$(top_builddir) \
-I$(top_srcdir) \

View File

@ -2,6 +2,7 @@ AUTOMAKE_OPTIONS = 1.4 foreign
MAINTAINERCLEANFILES = Makefile.in
AM_CPPFLAGS = \
-DELM_INTERAL_API_MDFGELQ=1 \
-I. \
-I$(top_builddir) \
-I$(top_srcdir) \
@ -25,11 +26,12 @@ endif
lib_LTLIBRARIES = libelementary.la
includes_HEADERS = Elementary.h
includes_HEADERS = Elementary.h elm_widget.h
includesdir = $(includedir)/elementary-@VMAJ@
libelementary_la_SOURCES = \
elm_priv.h \
\
elm_main.c \
elm_theme.c \
elm_module.c \

View File

@ -473,7 +473,7 @@ _item_realize(Elm_Gengrid_Item *item)
const Eina_List *l;
const char *key;
item->labels = _elm_stringlist_get(edje_object_data_get(item->base.view,
item->labels = elm_widget_stringlist_get(edje_object_data_get(item->base.view,
"labels"));
EINA_LIST_FOREACH(item->labels, l, key)
{
@ -492,7 +492,7 @@ _item_realize(Elm_Gengrid_Item *item)
const Eina_List *l;
const char *key;
item->icons = _elm_stringlist_get(edje_object_data_get(item->base.view,
item->icons = elm_widget_stringlist_get(edje_object_data_get(item->base.view,
"icons"));
EINA_LIST_FOREACH(item->icons, l, key)
{
@ -514,7 +514,7 @@ _item_realize(Elm_Gengrid_Item *item)
const Eina_List *l;
const char *key;
item->states = _elm_stringlist_get(edje_object_data_get(item->base.view,
item->states = elm_widget_stringlist_get(edje_object_data_get(item->base.view,
"states"));
EINA_LIST_FOREACH(item->states, l, key)
{
@ -569,11 +569,11 @@ _item_unrealize(Elm_Gengrid_Item *item)
item->base.view = NULL;
evas_object_del(item->spacer);
item->spacer = NULL;
_elm_stringlist_free(item->labels);
elm_widget_stringlist_free(item->labels);
item->labels = NULL;
_elm_stringlist_free(item->icons);
elm_widget_stringlist_free(item->icons);
item->icons = NULL;
_elm_stringlist_free(item->states);
elm_widget_stringlist_free(item->states);
EINA_LIST_FREE(item->icon_objs, icon)
evas_object_del(icon);

View File

@ -900,7 +900,7 @@ _item_realize(Elm_Genlist_Item *it, int in, int calc)
const Eina_List *l;
const char *key;
it->labels = _elm_stringlist_get(edje_object_data_get(it->base.view, "labels"));
it->labels = elm_widget_stringlist_get(edje_object_data_get(it->base.view, "labels"));
EINA_LIST_FOREACH(it->labels, l, key)
{
char *s = it->itc->func.label_get(it->base.data, it->base.widget, l->data);
@ -917,7 +917,7 @@ _item_realize(Elm_Genlist_Item *it, int in, int calc)
const Eina_List *l;
const char *key;
it->icons = _elm_stringlist_get(edje_object_data_get(it->base.view, "icons"));
it->icons = elm_widget_stringlist_get(edje_object_data_get(it->base.view, "icons"));
EINA_LIST_FOREACH(it->icons, l, key)
{
Evas_Object *ic = it->itc->func.icon_get(it->base.data, it->base.widget, l->data);
@ -936,7 +936,7 @@ _item_realize(Elm_Genlist_Item *it, int in, int calc)
const Eina_List *l;
const char *key;
it->states = _elm_stringlist_get(edje_object_data_get(it->base.view, "states"));
it->states = elm_widget_stringlist_get(edje_object_data_get(it->base.view, "states"));
EINA_LIST_FOREACH(it->states, l, key)
{
Eina_Bool on = it->itc->func.state_get(it->base.data, it->base.widget, l->data);
@ -988,11 +988,11 @@ _item_unrealize(Elm_Genlist_Item *it)
it->base.view = NULL;
evas_object_del(it->spacer);
it->spacer = NULL;
_elm_stringlist_free(it->labels);
elm_widget_stringlist_free(it->labels);
it->labels = NULL;
_elm_stringlist_free(it->icons);
elm_widget_stringlist_free(it->icons);
it->icons = NULL;
_elm_stringlist_free(it->states);
elm_widget_stringlist_free(it->states);
EINA_LIST_FREE(it->icon_objs, icon)
evas_object_del(icon);

View File

@ -315,26 +315,6 @@ _elm_rescale(void)
_elm_win_rescale();
}
static Eina_List *widtypes = NULL;
void
_elm_widtype_register(const char **ptr)
{
widtypes = eina_list_append(widtypes, (void *)ptr);
}
static void
_elm_widtype_clear(void)
{
const char **ptr;
EINA_LIST_FREE(widtypes, ptr)
{
eina_stringshare_del(*ptr);
*ptr = NULL;
}
}
/**
* @defgroup General General
*/
@ -611,7 +591,7 @@ elm_quicklaunch_shutdown(void)
_elm_log_dom = -1;
}
_elm_widtype_clear();
_elm_widget_type_clear();
eina_shutdown();
}

View File

@ -18,44 +18,75 @@
#include "els_box.h"
#include "els_icon.h"
#include "elm_widget.h"
#define CRITICAL(...) EINA_LOG_DOM_CRIT(_elm_log_dom, __VA_ARGS__)
#define ERR(...) EINA_LOG_DOM_ERR(_elm_log_dom, __VA_ARGS__)
#define WRN(...) EINA_LOG_DOM_WARN(_elm_log_dom, __VA_ARGS__)
#define INF(...) EINA_LOG_DOM_INFO(_elm_log_dom, __VA_ARGS__)
#define DBG(...) EINA_LOG_DOM_DBG(_elm_log_dom, __VA_ARGS__)
#define ERR(...) EINA_LOG_DOM_ERR (_elm_log_dom, __VA_ARGS__)
#define WRN(...) EINA_LOG_DOM_WARN(_elm_log_dom, __VA_ARGS__)
#define INF(...) EINA_LOG_DOM_INFO(_elm_log_dom, __VA_ARGS__)
#define DBG(...) EINA_LOG_DOM_DBG (_elm_log_dom, __VA_ARGS__)
// FIXME: totally disorganised. clean this up!
//
// Why EAPI in a private header ?
// EAPI is temporaty - that widget api will change, but makign it EAPI right now to indicate its bound for externalness
typedef struct _Elm_Config Elm_Config;
typedef struct _Elm_Module Elm_Module;
typedef struct _Elm_Drop_Data Elm_Drop_Data;
// FIXME: nash - type name wrong (caps)
typedef Eina_Bool (*elm_drop_cb) (void *d, Evas_Object *o, Elm_Drop_Data *data);
struct _Elm_Theme
{
Eina_List *overlay;
Eina_List *themes;
Eina_List *extension;
Eina_Hash *cache;
Eina_List *overlay;
Eina_List *themes;
Eina_List *extension;
Eina_Hash *cache;
const char *theme;
int ref;
int ref;
};
typedef enum _Elm_Engine
{
ELM_SOFTWARE_X11,
ELM_SOFTWARE_FB,
ELM_SOFTWARE_DIRECTFB,
ELM_SOFTWARE_16_X11,
ELM_XRENDER_X11,
ELM_OPENGL_X11,
ELM_SOFTWARE_WIN32,
ELM_SOFTWARE_16_WINCE,
ELM_SOFTWARE_SDL,
ELM_SOFTWARE_16_SDL,
ELM_OPENGL_SDL
ELM_SOFTWARE_FB,
ELM_SOFTWARE_DIRECTFB,
ELM_SOFTWARE_16_X11,
ELM_XRENDER_X11,
ELM_OPENGL_X11,
ELM_SOFTWARE_WIN32,
ELM_SOFTWARE_16_WINCE,
ELM_SOFTWARE_SDL,
ELM_SOFTWARE_16_SDL,
ELM_OPENGL_SDL
} Elm_Engine;
typedef struct _Elm_Config Elm_Config;
// FIXME: nash - make typedef like above with caps etc. named right
enum _elm_sel_type
{
ELM_SEL_PRIMARY,
ELM_SEL_SECONDARY,
ELM_SEL_CLIPBOARD,
ELM_SEL_XDND,
ELM_SEL_MAX,
};
// FIXME: nash - same as above
enum _elm_sel_format
{
/** Plain unformated text: Used for things that don't want rich markup */
ELM_SEL_FORMAT_TEXT = 0x01,
/** Edje textblock markup, including inline images */
ELM_SEL_FORMAT_MARKUP = 0x02,
/** Images */
ELM_SEL_FORMAT_IMAGE = 0x04,
};
struct _Elm_Drop_Data
{
int x, y;
enum _elm_sel_format format;
void *data;
int len;
};
/* increment this whenever we change config enough that you need new
* defaults for elm to work.
@ -69,362 +100,92 @@ typedef struct _Elm_Config Elm_Config;
struct _Elm_Config
{
int config_version;
int engine;
int thumbscroll_enable;
int thumbscroll_threshhold;
double thumbscroll_momentum_threshhold;
double thumbscroll_friction;
double thumbscroll_bounce_friction;
double page_scroll_friction;
double bring_in_scroll_friction;
double zoom_friction;
int thumbscroll_bounce_enable;
double scale;
int bgpixmap;
int compositing;
Eina_List *font_dirs;
int font_hinting;
int image_cache;
int font_cache;
int finger_size;
double fps;
const char *theme;
const char *modules;
double tooltip_delay;
int config_version;
int engine;
int thumbscroll_enable;
int thumbscroll_threshhold;
double thumbscroll_momentum_threshhold;
double thumbscroll_friction;
double thumbscroll_bounce_friction;
double page_scroll_friction;
double bring_in_scroll_friction;
double zoom_friction;
int thumbscroll_bounce_enable;
double scale;
int bgpixmap;
int compositing;
Eina_List *font_dirs;
int font_hinting;
int image_cache;
int font_cache;
int finger_size;
double fps;
const char *theme;
const char *modules;
double tooltip_delay;
};
typedef struct _Elm_Module Elm_Module;
struct _Elm_Module
{
int version;
const char *name;
const char *as;
const char *so_path;
const char *data_dir;
const char *bin_dir;
void *handle;
void *data;
void *api;
int (*init_func) (Elm_Module *m);
int (*shutdown_func) (Elm_Module *m);
int references;
int version;
const char *name;
const char *as;
const char *so_path;
const char *data_dir;
const char *bin_dir;
void *handle;
void *data;
void *api;
int (*init_func) (Elm_Module *m);
int (*shutdown_func) (Elm_Module *m);
int references;
};
void _elm_win_shutdown(void);
void _elm_win_rescale(void);
enum _elm_sel_type {
ELM_SEL_PRIMARY,
ELM_SEL_SECONDARY,
ELM_SEL_CLIPBOARD,
ELM_SEL_XDND,
int _elm_theme_object_set(Evas_Object *parent, Evas_Object *o, const char *clas, const char *group, const char *style);
int _elm_theme_object_icon_set(Evas_Object *parent, Evas_Object *o, const char *group, const char *style);
int _elm_theme_set(Elm_Theme *th, Evas_Object *o, const char *clas, const char *group, const char *style);
int _elm_theme_icon_set(Elm_Theme *th, Evas_Object *o, const char *group, const char *style);
int _elm_theme_parse(Elm_Theme *th, const char *theme);
void _elm_theme_shutdown(void);
ELM_SEL_MAX,
};
void _elm_module_init(void);
void _elm_module_shutdown(void);
void _elm_module_parse(const char *s);
Elm_Module *_elm_module_find_as(const char *as);
Elm_Module *_elm_module_add(const char *name, const char *as);
void _elm_module_del(Elm_Module *m);
const void *_elm_module_symbol_get(Elm_Module *m, const char *name);
enum _elm_sel_format {
/** Plain unformated text: Used for things that don't want rich markup */
ELM_SEL_FORMAT_TEXT = 0x01,
/** Edje textblock markup, including inline images */
ELM_SEL_FORMAT_MARKUP = 0x02,
/** Images */
ELM_SEL_FORMAT_IMAGE = 0x04,
};
void _elm_widget_type_clear(void);
void _elm_unneed_ethumb(void);
void _elm_rescale(void);
#define ELM_NEW(t) calloc(1, sizeof(t))
void _elm_config_init(void);
void _elm_config_sub_init(void);
void _elm_config_shutdown(void);
void _elm_win_shutdown(void);
void _elm_win_rescale(void);
void elm_tooltip_theme(Elm_Tooltip *tt);
void elm_object_sub_tooltip_content_cb_set(Evas_Object *eventarea, Evas_Object *owner, Elm_Tooltip_Content_Cb func, const void *data, Evas_Smart_Cb del_cb);
int _elm_theme_object_set(Evas_Object *parent, Evas_Object *o, const char *clas, const char *group, const char *style);
int _elm_theme_object_icon_set(Evas_Object *parent, Evas_Object *o, const char *group, const char *style);
int _elm_theme_set(Elm_Theme *th, Evas_Object *o, const char *clas, const char *group, const char *style);
int _elm_theme_icon_set(Elm_Theme *th, Evas_Object *o, const char *group, const char *style);
int _elm_theme_parse(Elm_Theme *th, const char *theme);
void _elm_theme_shutdown(void);
Eina_Bool elm_selection_set(enum _elm_sel_type selection, Evas_Object *widget, enum _elm_sel_format format, const char *buf);
Eina_Bool elm_selection_clear(enum _elm_sel_type selection, Evas_Object *widget);
Eina_Bool elm_selection_get(enum _elm_sel_type selection, enum _elm_sel_format format, Evas_Object *widget);
Eina_Bool elm_drop_target_add(Evas_Object *widget, enum _elm_sel_type, elm_drop_cb, void *);
Eina_Bool elm_drop_target_del(Evas_Object *widget);
Eina_Bool elm_drag_start(Evas_Object *, enum _elm_sel_format, const char *, void (*)(void *,Evas_Object*),void*);
void _elm_module_init(void);
void _elm_module_shutdown(void);
void _elm_module_parse(const char *s);
Elm_Module *_elm_module_find_as(const char *as);
Elm_Module *_elm_module_add(const char *name, const char *as);
void _elm_module_del(Elm_Module *m);
const void *_elm_module_symbol_get(Elm_Module *m, const char *name);
/* FIXME: should this be public? for now - private (but public symbols) */
EAPI Evas_Object *elm_widget_add(Evas *evas);
EAPI void elm_widget_del_hook_set(Evas_Object *obj, void (*func) (Evas_Object *obj));
EAPI void elm_widget_del_pre_hook_set(Evas_Object *obj, void (*func) (Evas_Object *obj));
EAPI void elm_widget_focus_hook_set(Evas_Object *obj, void (*func) (Evas_Object *obj));
EAPI void elm_widget_activate_hook_set(Evas_Object *obj, void (*func) (Evas_Object *obj));
EAPI void elm_widget_disable_hook_set(Evas_Object *obj, void (*func) (Evas_Object *obj));
EAPI void elm_widget_theme_hook_set(Evas_Object *obj, void (*func) (Evas_Object *obj));
EAPI void elm_widget_changed_hook_set(Evas_Object *obj, void (*func) (Evas_Object *obj));
EAPI void elm_widget_signal_emit_hook_set(Evas_Object *obj, void (*func) (Evas_Object *obj, const char *emission, const char *source));
EAPI void elm_widget_signal_callback_add_hook_set(Evas_Object *obj, void (*func) (Evas_Object *obj, const char *emission, const char *source, void (*func_cb) (void *data, Evas_Object *o, const char *emission, const char *source), void *data));
EAPI void elm_widget_signal_callback_del_hook_set(Evas_Object *obj, void *(*func) (Evas_Object *obj, const char *emission, const char *source, void (*func_cb) (void *data, Evas_Object *o, const char *emission, const char *source)));
EAPI void elm_widget_theme(Evas_Object *obj);
EAPI void elm_widget_on_focus_hook_set(Evas_Object *obj, void (*func) (void *data, Evas_Object *obj), void *data);
EAPI void elm_widget_on_change_hook_set(Evas_Object *obj, void (*func) (void *data, Evas_Object *obj), void *data);
EAPI void elm_widget_on_show_region_hook_set(Evas_Object *obj, void (*func) (void *data, Evas_Object *obj), void *data);
EAPI void elm_widget_data_set(Evas_Object *obj, void *data);
EAPI void *elm_widget_data_get(const Evas_Object *obj);
EAPI void elm_widget_sub_object_add(Evas_Object *obj, Evas_Object *sobj);
EAPI void elm_widget_sub_object_del(Evas_Object *obj, Evas_Object *sobj);
EAPI void elm_widget_resize_object_set(Evas_Object *obj, Evas_Object *sobj);
EAPI void elm_widget_hover_object_set(Evas_Object *obj, Evas_Object *sobj);
EAPI void elm_widget_signal_emit(Evas_Object *obj, const char *emission, const char *source);
EAPI void elm_widget_signal_callback_add(Evas_Object *obj, const char *emission, const char *source, void (*func) (void *data, Evas_Object *o, const char *emission, const char *source), void *data);
EAPI void *elm_widget_signal_callback_del(Evas_Object *obj, const char *emission, const char *source, void (*func) (void *data, Evas_Object *o, const char *emission, const char *source));
EAPI void elm_widget_can_focus_set(Evas_Object *obj, int can_focus);
EAPI int elm_widget_can_focus_get(const Evas_Object *obj);
EAPI int elm_widget_focus_get(const Evas_Object *obj);
EAPI Evas_Object *elm_widget_focused_object_get(const Evas_Object *obj);
EAPI Evas_Object *elm_widget_top_get(const Evas_Object *obj);
EAPI int elm_widget_focus_jump(Evas_Object *obj, int forward);
EAPI void elm_widget_focus_set(Evas_Object *obj, int first);
EAPI void elm_widget_focused_object_clear(Evas_Object *obj);
EAPI Evas_Object *elm_widget_parent_get(const Evas_Object *obj);
EAPI void elm_widget_focus_steal(Evas_Object *obj);
EAPI void elm_widget_activate(Evas_Object *obj);
EAPI void elm_widget_change(Evas_Object *obj);
EAPI void elm_widget_disabled_set(Evas_Object *obj, int disabled);
EAPI int elm_widget_disabled_get(const Evas_Object *obj);
EAPI void elm_widget_show_region_set(Evas_Object *obj, Evas_Coord x, Evas_Coord y, Evas_Coord w, Evas_Coord h);
EAPI void elm_widget_show_region_get(const Evas_Object *obj, Evas_Coord *x, Evas_Coord *y, Evas_Coord *w, Evas_Coord *h);
EAPI void elm_widget_scroll_hold_push(Evas_Object *obj);
EAPI void elm_widget_scroll_hold_pop(Evas_Object *obj);
EAPI int elm_widget_scroll_hold_get(const Evas_Object *obj);
EAPI void elm_widget_scroll_freeze_push(Evas_Object *obj);
EAPI void elm_widget_scroll_freeze_pop(Evas_Object *obj);
EAPI int elm_widget_scroll_freeze_get(const Evas_Object *obj);
EAPI void elm_widget_scale_set(Evas_Object *obj, double scale);
EAPI double elm_widget_scale_get(const Evas_Object *obj);
EAPI void elm_widget_theme_set(Evas_Object *obj, Elm_Theme *th);
EAPI Elm_Theme *elm_widget_theme_get(const Evas_Object *obj);
EAPI void elm_widget_style_set(Evas_Object *obj, const char *style);
EAPI const char *elm_widget_style_get(const Evas_Object *obj);
EAPI void elm_widget_type_set(Evas_Object *obj, const char *type);
EAPI const char *elm_widget_type_get(const Evas_Object *obj);
EAPI void elm_widget_drag_lock_x_set(Evas_Object *obj, Eina_Bool lock);
EAPI void elm_widget_drag_lock_y_set(Evas_Object *obj, Eina_Bool lock);
EAPI Eina_Bool elm_widget_drag_lock_x_get(const Evas_Object *obj);
EAPI Eina_Bool elm_widget_drag_lock_y_get(const Evas_Object *obj);
EAPI int elm_widget_drag_child_locked_x_get(const Evas_Object *obj);
EAPI int elm_widget_drag_child_locked_y_get(const Evas_Object *obj);
EAPI Eina_Bool elm_widget_is(const Evas_Object *obj);
EAPI Evas_Object *elm_widget_parent_widget_get(const Evas_Object *obj);
Eina_Bool _elm_dangerous_call_check(const char *call);
typedef struct _Elm_Tooltip Elm_Tooltip;
void elm_widget_tooltip_add(Evas_Object *obj, Elm_Tooltip *tt);
void elm_widget_tooltip_del(Evas_Object *obj, Elm_Tooltip *tt);
void elm_tooltip_theme(Elm_Tooltip *tt);
EAPI void elm_object_sub_tooltip_content_cb_set(Evas_Object *eventarea, Evas_Object *owner, Elm_Tooltip_Content_Cb func, const void *data, Evas_Smart_Cb del_cb);
EAPI Eina_List *_elm_stringlist_get(const char *str);
EAPI void _elm_stringlist_free(Eina_List *list);
Eina_Bool _elm_widget_type_check(const Evas_Object *obj, const char *type);
typedef struct _Elm_Widget_Item Elm_Widget_Item; /**< base structure for all widget items that are not Elm_Widget themselves */
struct _Elm_Widget_Item
{
/* ef1 ~~ efl, el3 ~~ elm */
#define ELM_WIDGET_ITEM_MAGIC 0xef1e1301
EINA_MAGIC
Evas_Object *widget; /**< the owner widget that owns this item */
Evas_Object *view; /**< the base view object */
const void *data; /**< item specific data */
Evas_Smart_Cb del_cb; /**< used to notify the item is being deleted */
/* widget variations should have data from here and on */
/* @todo: TODO check if this is enough for 1.0 release, maybe add padding! */
};
Elm_Widget_Item *_elm_widget_item_new(Evas_Object *parent, size_t alloc_size);
void _elm_widget_item_del(Elm_Widget_Item *item);
void _elm_widget_item_pre_notify_del(Elm_Widget_Item *item);
void _elm_widget_item_del_cb_set(Elm_Widget_Item *item, Evas_Smart_Cb del_cb);
void _elm_widget_item_data_set(Elm_Widget_Item *item, const void *data);
void *_elm_widget_item_data_get(const Elm_Widget_Item *item);
void _elm_widget_item_tooltip_text_set(Elm_Widget_Item *item, const char *text);
void _elm_widget_item_tooltip_content_cb_set(Elm_Widget_Item *item, Elm_Tooltip_Item_Content_Cb func, const void *data, Evas_Smart_Cb del_cb);
void _elm_widget_item_tooltip_unset(Elm_Widget_Item *item);
void _elm_widget_item_tooltip_style_set(Elm_Widget_Item *item, const char *style);
const char *_elm_widget_item_tooltip_style_get(const Elm_Widget_Item *item);
/**
* Convenience macro to create new widget item, doing casts for you.
* @see _elm_widget_item_new()
* @param parent a valid elm_widget variant.
* @param type the C type that extends Elm_Widget_Item
*/
#define elm_widget_item_new(parent, type) \
(type *)_elm_widget_item_new((parent), sizeof(type))
/**
* Convenience macro to delete widget item, doing casts for you.
* @see _elm_widget_item_del()
* @param item a valid item.
*/
#define elm_widget_item_del(item) \
_elm_widget_item_del((Elm_Widget_Item *)item)
/**
* Convenience macro to notify deletion of widget item, doing casts for you.
* @see _elm_widget_item_pre_notify_del()
*/
#define elm_widget_item_pre_notify_del(item) \
_elm_widget_item_pre_notify_del((Elm_Widget_Item *)item)
/**
* Convenience macro to set deletion callback of widget item, doing casts for you.
* @see _elm_widget_item_del_cb_set()
*/
#define elm_widget_item_del_cb_set(item, del_cb) \
_elm_widget_item_del_cb_set((Elm_Widget_Item *)item, del_cb)
/**
* Set item's data
* @see _elm_widget_item_data_set()
*/
#define elm_widget_item_data_set(item, data) \
_elm_widget_item_data_set((Elm_Widget_Item *)item, data)
/**
* Get item's data
* @see _elm_widget_item_data_get()
*/
#define elm_widget_item_data_get(item) \
_elm_widget_item_data_get((const Elm_Widget_Item *)item)
/**
* Convenience function to set widget item tooltip as a text string.
* @see _elm_widget_item_tooltip_text_set()
*/
#define elm_widget_item_tooltip_text_set(item, text) \
_elm_widget_item_tooltip_text_set((Elm_Widget_Item *)item, text)
/**
* Convenience function to set widget item tooltip.
* @see _elm_widget_item_tooltip_content_cb_set()
*/
#define elm_widget_item_tooltip_content_cb_set(item, func, data, del_cb) \
_elm_widget_item_tooltip_content_cb_set((Elm_Widget_Item *)item, \
func, data, del_cb)
/**
* Convenience function to unset widget item tooltip.
* @see _elm_widget_item_tooltip_unset()
*/
#define elm_widget_item_tooltip_unset(item) \
_elm_widget_item_tooltip_unset((Elm_Widget_Item *)item)
/**
* Convenience function to change item's tooltip style.
* @see _elm_widget_item_tooltip_style_set()
*/
#define elm_widget_item_tooltip_style_set(item, style) \
_elm_widget_item_tooltip_style_set((Elm_Widget_Item *)item, style)
/**
* Convenience function to query item's tooltip style.
* @see _elm_widget_item_tooltip_style_get()
*/
#define elm_widget_item_tooltip_style_get(item) \
_elm_widget_item_tooltip_style_get((const Elm_Widget_Item *)item)
void _elm_widget_item_tooltip_content_cb_set(Elm_Widget_Item *item, Elm_Tooltip_Item_Content_Cb func, const void *data, Evas_Smart_Cb del_cb);
/**
* Cast and ensure the given pointer is an Elm_Widget_Item or return NULL.
*/
#define ELM_WIDGET_ITEM(item) \
((item && EINA_MAGIC_CHECK(item, ELM_WIDGET_ITEM_MAGIC)) ? \
((Elm_Widget_Item *)(item)) : NULL)
#define ELM_WIDGET_ITEM_CHECK_OR_RETURN(item, ...) \
do \
{ \
if (!item) \
{ \
CRITICAL("Elm_Widget_Item " # item " is NULL!"); \
return __VA_ARGS__; \
} \
if (!EINA_MAGIC_CHECK(item, ELM_WIDGET_ITEM_MAGIC)) \
{ \
EINA_MAGIC_FAIL(item, ELM_WIDGET_ITEM_MAGIC); \
return __VA_ARGS__; \
} \
} \
while (0)
#define ELM_WIDGET_ITEM_CHECK_OR_GOTO(item, label) \
do \
{ \
if (!item) \
{ \
CRITICAL("Elm_Widget_Item " # item " is NULL!"); \
goto label; \
} \
if (!EINA_MAGIC_CHECK(item, ELM_WIDGET_ITEM_MAGIC)) \
{ \
EINA_MAGIC_FAIL(item, ELM_WIDGET_ITEM_MAGIC); \
goto label; \
} \
} \
while (0)
void _elm_unneed_ethumb(void);
void _elm_rescale(void);
void _elm_config_init(void);
void _elm_config_sub_init(void);
void _elm_config_shutdown(void);
/* FIXME: nash formatiing */
typedef struct Elm_Drop_Data {
int x,y;
enum _elm_sel_format format;
void *data;
int len;
} Elm_Drop_Data;
typedef Eina_Bool (*elm_drop_cb)(void *, Evas_Object *, Elm_Drop_Data *data);
Eina_Bool elm_selection_set(enum _elm_sel_type selection, Evas_Object *widget, enum _elm_sel_format format, const char *buf);
Eina_Bool elm_selection_clear(enum _elm_sel_type selection, Evas_Object *widget);
Eina_Bool elm_selection_get(enum _elm_sel_type selection, enum _elm_sel_format format, Evas_Object *widget);
/* FIXME: Need a typedef for the callback */
Eina_Bool elm_drop_target_add(Evas_Object *widget,
enum _elm_sel_type, elm_drop_cb, void *);
Eina_Bool elm_drop_target_del(Evas_Object *widget);
Eina_Bool elm_drag_start(Evas_Object *, enum _elm_sel_format,
const char *,
void (*)(void *,Evas_Object*),void*);
Eina_Bool _elm_dangerous_call_check(const char *call);
void _elm_widtype_register(const char **ptr);
#define ELM_SET_WIDTYPE(widtype, type) \
do { \
if (!widtype) { \
widtype = eina_stringshare_add(type); \
_elm_widtype_register(&widtype); \
} \
} while (0)
//#define ELM_CHECK_WIDTYPE(obj, widtype) if (elm_widget_type_get(obj) != widtype) return
#define ELM_CHECK_WIDTYPE(obj, widtype) if (!_elm_widget_type_check((obj), (widtype))) return
extern char *_elm_appname;
extern Elm_Config *_elm_config;
extern const char *_elm_data_dir;
extern const char *_elm_lib_dir;
extern int _elm_log_dom;
extern Eina_List *_elm_win_list;
extern char *_elm_appname;
extern Elm_Config *_elm_config;
extern const char *_elm_data_dir;
extern const char *_elm_lib_dir;
extern int _elm_log_dom;
extern Eina_List *_elm_win_list;
#endif

View File

@ -64,7 +64,7 @@ _del_hook(Evas_Object *obj)
Widget_Data *wd = elm_widget_data_get(obj);
if (!wd) return;
elm_slideshow_clear(obj);
_elm_stringlist_free(wd->transitions);
elm_widget_stringlist_free(wd->transitions);
if (wd->timer) ecore_timer_del(wd->timer);
EINA_LIST_FREE(wd->layout.list, layout)
eina_stringshare_del(layout);
@ -255,11 +255,11 @@ elm_slideshow_add(Evas_Object *parent)
elm_widget_resize_object_set(obj, wd->slideshow);
evas_object_show(wd->slideshow);
wd->transitions = _elm_stringlist_get(edje_object_data_get(wd->slideshow, "transitions"));
wd->transitions = elm_widget_stringlist_get(edje_object_data_get(wd->slideshow, "transitions"));
if (eina_list_count(wd->transitions) > 0)
wd->transition = eina_stringshare_add(eina_list_data_get(wd->transitions));
wd->layout.list = _elm_stringlist_get(edje_object_data_get(wd->slideshow, "layouts"));
wd->layout.list = elm_widget_stringlist_get(edje_object_data_get(wd->slideshow, "layouts"));
if (eina_list_count(wd->layout.list) > 0)
wd->layout.current = eina_list_data_get(wd->layout.list);

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,406 @@
#ifndef ELM_WIDGET_H
#define ELM_WIDGET_H
/* DO NOT USE THIUS HEADER UNLESS YOU ARE PREPARED FOR BESAKING OF YOUR
* CODE. THIS IS ELEMENTARY'S INTERNAL WIDGET API (for now) AND IS NOT
* FINAL. CALL elm_widget_api_check(ELM_INTERNAL_API_VERSION) TO CHECK IT
* AT RUNTIME
*
* How to make your own widget? like this:
*
* #include <Elementary.h>
* #include "elm_priv.h"
*
* typedef struct _Widget_Data Widget_Data;
*
* struct _Widget_Data
* {
* //
* Evas_Object *sub;
* // add any other widget data here too
* };
*
* static const char *widtype = NULL;
* static void _del_hook(Evas_Object *obj);
* static void _theme_hook(Evas_Object *obj);
* static void _disable_hook(Evas_Object *obj);
* static void _sizing_eval(Evas_Object *obj);
* static void _on_focus_hook(void *data, Evas_Object *obj);
*
* static const char SIG_CLICKED[] = "clicked";
* static const Evas_Smart_Cb_Description _signals[] = {
* {SIG_CLICKED, ""},
* {NULL, NULL}
* };
*
* static void
* _del_hook(Evas_Object *obj)
* {
* Widget_Data *wd = elm_widget_data_get(obj);
* if (!wd) return;
* // delete hook - on delete of object delete object struct etc.
* free(wd);
* }
*
* static void
* _on_focus_hook(void *data __UNUSED__, Evas_Object *obj)
* {
* Widget_Data *wd = elm_widget_data_get(obj);
* if (!wd) return;
* // handle focus going in and out - optional, but if you want to, set
* // this hook and handle it (eg emit a signal to an edje obj)
* if (elm_widget_focus_get(obj))
* {
* edje_object_signal_emit(wd->sub, "elm,action,focus", "elm");
* evas_object_focus_set(wd->sub, 1);
* }
* else
* {
* edje_object_signal_emit(wd->sub, "elm,action,unfocus", "elm");
* evas_object_focus_set(wd->sub, 0);
* }
* }
*
* static void
* _theme_hook(Evas_Object *obj)
* {
* Widget_Data *wd = elm_widget_data_get(obj);
* if (!wd) return;
* // handle change in theme/scale etc. etc.
* // XXX: export _elm_theme_object_set
* _elm_theme_object_set(obj, wd->sub, "mywidget", "base",
* elm_widget_style_get(obj));
* }
*
* static void
* _disable_hook(Evas_Object *obj)
* {
* Widget_Data *wd = elm_widget_data_get(obj);
* if (!wd) return;
* // optional, gbut handle if the widget gets disabled or not
* if (elm_widget_disabled_get(obj))
* edje_object_signal_emit(wd->sub, "elm,state,disabled", "elm");
* else
* edje_object_signal_emit(wd->sub, "elm,state,enabled", "elm");
* }
*
* static void
* _sizing_eval(Evas_Object *obj)
* {
* Widget_Data *wd = elm_widget_data_get(obj);
* Evas_Coord minw = -1, minh = -1, maxw = -1, maxh = -1;
* //
* if (!wd) return;
* elm_coords_finger_size_adjust(1, &minw, 1, &minh);
* edje_object_size_min_restricted_calc(wd->sub, &minw, &minh, minw, minh);
* elm_coords_finger_size_adjust(1, &minw, 1, &minh);
* evas_object_size_hint_min_set(obj, minw, minh);
* evas_object_size_hint_max_set(obj, maxw, maxh);
* }
*
* // actual api to create your widget. add more to manipulate it as needed
* // mark your calls with EAPI to make them "external api" calls.
* EAPI Evas_Object *
* elm_mywidget_add(Evas_Object *parent)
* {
* Evas_Object *obj;
* Evas *e;
* Widget_Data *wd;
*
* // ALWAYS call this - this checks that your widget matches that of
* // elementary and that the api hasn't broken. if it has this returns
* // false and you need to handle this error gracefully
* if (!elm_widget_api_check(ELM_INTERNAL_API_VERSION)) return NULL;
*
* // basic - allocate data for widget and fill it
* wd = ELM_NEW(Widget_Data);
* e = evas_object_evas_get(parent);
* obj = elm_widget_add(e);
* // give it a type name and set yp a mywidget type string if needed
* ELM_SET_WIDTYPE(widtype, "mywidget");
* elm_widget_type_set(obj, "mywidget");
* // tell the parent widget that we are a sub object
* elm_widget_sub_object_add(parent, obj);
* // setup hooks we need (some are optional)
* elm_widget_on_focus_hook_set(obj, _on_focus_hook, NULL);
* elm_widget_data_set(obj, wd);
* elm_widget_del_hook_set(obj, _del_hook);
* elm_widget_theme_hook_set(obj, _theme_hook);
* elm_widget_disable_hook_set(obj, _disable_hook);
* // this widget can focus (true, means yes it can, false means it can't)
* elm_widget_can_focus_set(obj, EINA_TRUE);
*
* // for this widget we will ad d1 sub object that is an edje object
* wd->sub = edje_object_add(e);
* // set the theme. this follows a scheme for group name like this:
* // "elm/WIDGETNAME/ELEMENT/STYLE"
* // so here it will be:
* // "elm/mywidget/base/default"
* // changing style changes style name from default (all widgets start
* // with the default style) and element is for your widget internal
* // structure as you see fit
* elm_widget_theme_object_set(obj, wd->sub, "mywidget", "base", "default");
* // listen to a signal from the edje object to produce widget smart
* // callback (like click)
* edje_object_signal_callback_add(wd->sub, "elm,action,click", "",
* _signal_clicked, obj);
* // set this sub object as the "resize object". widgets get 1 resize
* // object that is zresized along with the object wrapper.
* elm_widget_resize_object_set(obj, wd->sub);
*
* // evaluate sizing of the widget (minimum size calc etc.). optional but
* // not a bad idea to do here. it will get queued for later anyway
* _sizing_eval(obj);
*
* // register the smart callback descriptions so we can have some runtime
* // info as to what the smart callback strings mean
* evas_object_smart_callbacks_descriptions_set(obj, _signals);
* return obj;
* }
*
* // example - do "whatever" to the widget (here just emit a signal)
* EAPI void
* elm_mywidget_whatever(Evas_Object *obj)
* {
* // check if type is correct - check will return if it fails
* ELM_CHECK_WIDTYPE(obj, widtype);
* // get widget data - tyope is correct and sany by this point, so this
* // should never fail
* Widget_Data *wd = elm_widget_data_get(obj);
* // do whatever you like
* edje_object_signal_emit(wd->sub, "elm,state,action,whatever", "elm");
* }
*
* // you can add more - you need to see elementary's code to know how to
* // handle all cases. rememebr this api is not stable and may change. it's
* // internal
*
*/
#ifndef ELM_INTERAL_API_MDFGELQ
# warning "You are using an internal elementary API. This API is not stable"
# warning "and is subject to change. You use this at your own risk."
# warning "Remember to call elm_widget_api_check(ELM_INTERNAL_API_VERSION);"
# warning "in your widgets before you call any other elm_widget calls to do"
# warning "a correct runtime version check."
#endif
#define ELM_INTERNAL_API_VERSION 7000
typedef struct _Elm_Tooltip Elm_Tooltip;
typedef struct _Elm_Widget_Item Elm_Widget_Item; /**< base structure for all widget items that are not Elm_Widget themselves */
struct _Elm_Widget_Item
{
/* ef1 ~~ efl, el3 ~~ elm */
#define ELM_WIDGET_ITEM_MAGIC 0xef1e1301
EINA_MAGIC;
Evas_Object *widget; /**< the owner widget that owns this item */
Evas_Object *view; /**< the base view object */
const void *data; /**< item specific data */
Evas_Smart_Cb del_cb; /**< used to notify the item is being deleted */
/* widget variations should have data from here and on */
/* @todo: TODO check if this is enough for 1.0 release, maybe add padding! */
};
#define ELM_NEW(t) calloc(1, sizeof(t))
EAPI Eina_Bool elm_widget_api_check(int ver);
EAPI Evas_Object *elm_widget_add(Evas *evas);
EAPI void elm_widget_del_hook_set(Evas_Object *obj, void (*func) (Evas_Object *obj));
EAPI void elm_widget_del_pre_hook_set(Evas_Object *obj, void (*func) (Evas_Object *obj));
EAPI void elm_widget_focus_hook_set(Evas_Object *obj, void (*func) (Evas_Object *obj));
EAPI void elm_widget_activate_hook_set(Evas_Object *obj, void (*func) (Evas_Object *obj));
EAPI void elm_widget_disable_hook_set(Evas_Object *obj, void (*func) (Evas_Object *obj));
EAPI void elm_widget_theme_hook_set(Evas_Object *obj, void (*func) (Evas_Object *obj));
EAPI void elm_widget_changed_hook_set(Evas_Object *obj, void (*func) (Evas_Object *obj));
EAPI void elm_widget_signal_emit_hook_set(Evas_Object *obj, void (*func) (Evas_Object *obj, const char *emission, const char *source));
EAPI void elm_widget_signal_callback_add_hook_set(Evas_Object *obj, void (*func) (Evas_Object *obj, const char *emission, const char *source, void (*func_cb) (void *data, Evas_Object *o, const char *emission, const char *source), void *data));
EAPI void elm_widget_signal_callback_del_hook_set(Evas_Object *obj, void *(*func) (Evas_Object *obj, const char *emission, const char *source, void (*func_cb) (void *data, Evas_Object *o, const char *emission, const char *source)));
EAPI void elm_widget_theme(Evas_Object *obj);
EAPI void elm_widget_on_focus_hook_set(Evas_Object *obj, void (*func) (void *data, Evas_Object *obj), void *data);
EAPI void elm_widget_on_change_hook_set(Evas_Object *obj, void (*func) (void *data, Evas_Object *obj), void *data);
EAPI void elm_widget_on_show_region_hook_set(Evas_Object *obj, void (*func) (void *data, Evas_Object *obj), void *data);
EAPI void elm_widget_data_set(Evas_Object *obj, void *data);
EAPI void *elm_widget_data_get(const Evas_Object *obj);
EAPI void elm_widget_sub_object_add(Evas_Object *obj, Evas_Object *sobj);
EAPI void elm_widget_sub_object_del(Evas_Object *obj, Evas_Object *sobj);
EAPI void elm_widget_resize_object_set(Evas_Object *obj, Evas_Object *sobj);
EAPI void elm_widget_hover_object_set(Evas_Object *obj, Evas_Object *sobj);
EAPI void elm_widget_signal_emit(Evas_Object *obj, const char *emission, const char *source);
EAPI void elm_widget_signal_callback_add(Evas_Object *obj, const char *emission, const char *source, void (*func) (void *data, Evas_Object *o, const char *emission, const char *source), void *data);
EAPI void *elm_widget_signal_callback_del(Evas_Object *obj, const char *emission, const char *source, void (*func) (void *data, Evas_Object *o, const char *emission, const char *source));
EAPI void elm_widget_can_focus_set(Evas_Object *obj, int can_focus);
EAPI int elm_widget_can_focus_get(const Evas_Object *obj);
EAPI int elm_widget_focus_get(const Evas_Object *obj);
EAPI Evas_Object *elm_widget_focused_object_get(const Evas_Object *obj);
EAPI Evas_Object *elm_widget_top_get(const Evas_Object *obj);
EAPI Eina_Bool elm_widget_is(const Evas_Object *obj);
EAPI Evas_Object *elm_widget_parent_widget_get(const Evas_Object *obj);
EAPI int elm_widget_focus_jump(Evas_Object *obj, int forward);
EAPI void elm_widget_focus_set(Evas_Object *obj, int first);
EAPI void elm_widget_focused_object_clear(Evas_Object *obj);
EAPI Evas_Object *elm_widget_parent_get(const Evas_Object *obj);
EAPI void elm_widget_focus_steal(Evas_Object *obj);
EAPI void elm_widget_activate(Evas_Object *obj);
EAPI void elm_widget_change(Evas_Object *obj);
EAPI void elm_widget_disabled_set(Evas_Object *obj, int disabled);
EAPI int elm_widget_disabled_get(const Evas_Object *obj);
EAPI void elm_widget_show_region_set(Evas_Object *obj, Evas_Coord x, Evas_Coord y, Evas_Coord w, Evas_Coord h);
EAPI void elm_widget_show_region_get(const Evas_Object *obj, Evas_Coord *x, Evas_Coord *y, Evas_Coord *w, Evas_Coord *h);
EAPI void elm_widget_scroll_hold_push(Evas_Object *obj);
EAPI void elm_widget_scroll_hold_pop(Evas_Object *obj);
EAPI int elm_widget_scroll_hold_get(const Evas_Object *obj);
EAPI void elm_widget_scroll_freeze_push(Evas_Object *obj);
EAPI void elm_widget_scroll_freeze_pop(Evas_Object *obj);
EAPI int elm_widget_scroll_freeze_get(const Evas_Object *obj);
EAPI void elm_widget_scale_set(Evas_Object *obj, double scale);
EAPI double elm_widget_scale_get(const Evas_Object *obj);
EAPI void elm_widget_theme_set(Evas_Object *obj, Elm_Theme *th);
EAPI Elm_Theme *elm_widget_theme_get(const Evas_Object *obj);
EAPI void elm_widget_style_set(Evas_Object *obj, const char *style);
EAPI const char *elm_widget_style_get(const Evas_Object *obj);
EAPI void elm_widget_type_set(Evas_Object *obj, const char *type);
EAPI const char *elm_widget_type_get(const Evas_Object *obj);
EAPI void elm_widget_tooltip_add(Evas_Object *obj, Elm_Tooltip *tt);
EAPI void elm_widget_tooltip_del(Evas_Object *obj, Elm_Tooltip *tt);
EAPI void elm_widget_drag_lock_x_set(Evas_Object *obj, Eina_Bool lock);
EAPI void elm_widget_drag_lock_y_set(Evas_Object *obj, Eina_Bool lock);
EAPI Eina_Bool elm_widget_drag_lock_x_get(const Evas_Object *obj);
EAPI Eina_Bool elm_widget_drag_lock_y_get(const Evas_Object *obj);
EAPI int elm_widget_drag_child_locked_x_get(const Evas_Object *obj);
EAPI int elm_widget_drag_child_locked_y_get(const Evas_Object *obj);
EAPI int elm_widget_theme_object_set(Evas_Object *obj, Evas_Object *edj, const char *wname, const char *welement, const char *wstyle);
EAPI void elm_widget_type_register(const char **ptr);
EAPI Eina_Bool elm_widget_type_check(const Evas_Object *obj, const char *type);
EAPI Eina_List *elm_widget_stringlist_get(const char *str);
EAPI void elm_widget_stringlist_free(Eina_List *list);
EAPI Elm_Widget_Item *_elm_widget_item_new(Evas_Object *parent, size_t alloc_size);
EAPI void _elm_widget_item_del(Elm_Widget_Item *item);
EAPI void _elm_widget_item_pre_notify_del(Elm_Widget_Item *item);
EAPI void _elm_widget_item_del_cb_set(Elm_Widget_Item *item, Evas_Smart_Cb del_cb);
EAPI void _elm_widget_item_data_set(Elm_Widget_Item *item, const void *data);
EAPI void *_elm_widget_item_data_get(const Elm_Widget_Item *item);
EAPI void _elm_widget_item_tooltip_text_set(Elm_Widget_Item *item, const char *text);
EAPI void _elm_widget_item_tooltip_content_cb_set(Elm_Widget_Item *item, Elm_Tooltip_Item_Content_Cb func, const void *data, Evas_Smart_Cb del_cb);
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);
/**
* Convenience macro to create new widget item, doing casts for you.
* @see _elm_widget_item_new()
* @param parent a valid elm_widget variant.
* @param type the C type that extends Elm_Widget_Item
*/
#define elm_widget_item_new(parent, type) \
(type *)_elm_widget_item_new((parent), sizeof(type))
/**
* Convenience macro to delete widget item, doing casts for you.
* @see _elm_widget_item_del()
* @param item a valid item.
*/
#define elm_widget_item_del(item) \
_elm_widget_item_del((Elm_Widget_Item *)item)
/**
* Convenience macro to notify deletion of widget item, doing casts for you.
* @see _elm_widget_item_pre_notify_del()
*/
#define elm_widget_item_pre_notify_del(item) \
_elm_widget_item_pre_notify_del((Elm_Widget_Item *)item)
/**
* Convenience macro to set deletion callback of widget item, doing casts for you.
* @see _elm_widget_item_del_cb_set()
*/
#define elm_widget_item_del_cb_set(item, del_cb) \
_elm_widget_item_del_cb_set((Elm_Widget_Item *)item, del_cb)
/**
* Set item's data
* @see _elm_widget_item_data_set()
*/
#define elm_widget_item_data_set(item, data) \
_elm_widget_item_data_set((Elm_Widget_Item *)item, data)
/**
* Get item's data
* @see _elm_widget_item_data_get()
*/
#define elm_widget_item_data_get(item) \
_elm_widget_item_data_get((const Elm_Widget_Item *)item)
/**
* Convenience function to set widget item tooltip as a text string.
* @see _elm_widget_item_tooltip_text_set()
*/
#define elm_widget_item_tooltip_text_set(item, text) \
_elm_widget_item_tooltip_text_set((Elm_Widget_Item *)item, text)
/**
* Convenience function to set widget item tooltip.
* @see _elm_widget_item_tooltip_content_cb_set()
*/
#define elm_widget_item_tooltip_content_cb_set(item, func, data, del_cb) \
_elm_widget_item_tooltip_content_cb_set((Elm_Widget_Item *)item, \
func, data, del_cb)
/**
* Convenience function to unset widget item tooltip.
* @see _elm_widget_item_tooltip_unset()
*/
#define elm_widget_item_tooltip_unset(item) \
_elm_widget_item_tooltip_unset((Elm_Widget_Item *)item)
/**
* Convenience function to change item's tooltip style.
* @see _elm_widget_item_tooltip_style_set()
*/
#define elm_widget_item_tooltip_style_set(item, style) \
_elm_widget_item_tooltip_style_set((Elm_Widget_Item *)item, style)
/**
* Convenience function to query item's tooltip style.
* @see _elm_widget_item_tooltip_style_get()
*/
#define elm_widget_item_tooltip_style_get(item) \
_elm_widget_item_tooltip_style_get((const Elm_Widget_Item *)item)
/**
* Cast and ensure the given pointer is an Elm_Widget_Item or return NULL.
*/
#define ELM_WIDGET_ITEM(item) \
((item && EINA_MAGIC_CHECK(item, ELM_WIDGET_ITEM_MAGIC)) ? \
((Elm_Widget_Item *)(item)) : NULL)
#define ELM_WIDGET_ITEM_CHECK_OR_RETURN(item, ...) \
do { \
if (!item) { \
CRITICAL("Elm_Widget_Item " # item " is NULL!"); \
return __VA_ARGS__; \
} \
if (!EINA_MAGIC_CHECK(item, ELM_WIDGET_ITEM_MAGIC)) { \
EINA_MAGIC_FAIL(item, ELM_WIDGET_ITEM_MAGIC); \
return __VA_ARGS__; \
} \
} while (0)
#define ELM_WIDGET_ITEM_CHECK_OR_GOTO(item, label) \
do { \
if (!item) { \
CRITICAL("Elm_Widget_Item " # item " is NULL!"); \
goto label; \
} \
if (!EINA_MAGIC_CHECK(item, ELM_WIDGET_ITEM_MAGIC)) { \
EINA_MAGIC_FAIL(item, ELM_WIDGET_ITEM_MAGIC); \
goto label; \
} \
} while (0)
#define ELM_SET_WIDTYPE(widtype, type) \
do { \
if (!widtype) { \
widtype = eina_stringshare_add(type); \
elm_widget_type_register(&widtype); \
} \
} while (0)
#define ELM_CHECK_WIDTYPE(obj, widtype) \
if (!elm_widget_type_check((obj), (widtype))) return
#endif

View File

@ -469,6 +469,112 @@ elm_tooltip_theme(Elm_Tooltip *tt)
_elm_tooltip_reconfigure_job_start(tt);
}
/**
* Set the content to be shown in the tooltip object for specific event area.
*
* Setup the tooltip to object. The object @a eventarea can have only
* one tooltip, so any previous tooltip data is removed. @p func(with
* @p data) will be called every time that need show the tooltip and
* it should return a valid Evas_Object. This object is then managed
* fully by tooltip system and is deleted when the tooltip is gone.
*
* This is an internal function that is used by objects with sub-items
* that want to provide different tooltips for each of them. The @a
* owner object should be an elm_widget and will be used to track
* theme changes and to feed @a func and @a del_cb. The @a eventarea
* may be any object and is the one that should be used later on with
* elm_object_tooltip apis, such as elm_object_tooltip_hide(),
* elm_object_tooltip_show() or elm_object_tooltip_unset().
*
* @param eventarea the object being attached a tooltip.
* @param owner the elm_widget that owns this object, will be used to
* track theme changes and to be used in @a func or @a del_cb.
* @param func the function used to create the tooltip contents. The
* @a Evas_Object parameters will receive @a owner as value.
* @param data what to provide to @a func as callback data/context.
* @param del_cb called when data is not needed anymore, either when
* another callback replaces @func, the tooltip is unset with
* elm_object_tooltip_unset() or the owner object @a obj
* dies. This callback receives as the first parameter the
* given @a data, and @c event_info is NULL.
*
* @internal
* @ingroup Tooltips
*/
void
elm_object_sub_tooltip_content_cb_set(Evas_Object *eventarea, Evas_Object *owner, Elm_Tooltip_Content_Cb func, const void *data, Evas_Smart_Cb del_cb)
{
Elm_Tooltip *tt = NULL;
Eina_Bool just_created;
EINA_SAFETY_ON_NULL_GOTO(owner, error);
EINA_SAFETY_ON_NULL_GOTO(eventarea, error);
if (!func)
{
elm_object_tooltip_unset(eventarea);
return;
}
tt = evas_object_data_get(eventarea, _tooltip_key);
if (tt)
{
if (tt->owner != owner)
{
evas_object_event_callback_del_full
(tt->owner, EVAS_CALLBACK_DEL, _elm_tooltip_obj_del_cb, tt);
elm_widget_tooltip_del(tt->owner, tt);
evas_object_event_callback_add
(owner, EVAS_CALLBACK_DEL, _elm_tooltip_obj_del_cb, tt);
elm_widget_tooltip_add(tt->owner, tt);
}
if ((tt->func == func) && (tt->data == data) &&
(tt->del_cb == del_cb))
return;
_elm_tooltip_data_clean(tt);
just_created = EINA_FALSE;
}
else
{
tt = ELM_NEW(Elm_Tooltip);
if (!tt) goto error;
tt->owner = owner;
tt->eventarea = eventarea;
tt->evas = evas_object_evas_get(eventarea);
evas_object_data_set(eventarea, _tooltip_key, tt);
just_created = EINA_TRUE;
evas_object_event_callback_add
(eventarea, EVAS_CALLBACK_MOUSE_IN,
_elm_tooltip_obj_mouse_in_cb, tt);
evas_object_event_callback_add
(eventarea, EVAS_CALLBACK_MOUSE_OUT,
_elm_tooltip_obj_mouse_out_cb, tt);
evas_object_event_callback_add
(eventarea, EVAS_CALLBACK_DEL, _elm_tooltip_obj_del_cb, tt);
evas_object_event_callback_add
(owner, EVAS_CALLBACK_DEL, _elm_tooltip_obj_del_cb, tt);
elm_widget_tooltip_add(tt->owner, tt);
}
tt->func = func;
tt->data = data;
tt->del_cb = del_cb;
if (!just_created) _elm_tooltip_reconfigure_job_start(tt);
return;
error:
if (tt) _elm_tooltip_hide(tt);
if (del_cb) del_cb((void *)data, owner, NULL);
}
/**
* Force show tooltip of object
*
@ -555,111 +661,6 @@ elm_object_tooltip_content_cb_set(Evas_Object *obj, Elm_Tooltip_Content_Cb func,
elm_object_sub_tooltip_content_cb_set(obj, obj, func, data, del_cb);
}
/**
* Set the content to be shown in the tooltip object for specific event area.
*
* Setup the tooltip to object. The object @a eventarea can have only
* one tooltip, so any previous tooltip data is removed. @p func(with
* @p data) will be called every time that need show the tooltip and
* it should return a valid Evas_Object. This object is then managed
* fully by tooltip system and is deleted when the tooltip is gone.
*
* This is an internal function that is used by objects with sub-items
* that want to provide different tooltips for each of them. The @a
* owner object should be an elm_widget and will be used to track
* theme changes and to feed @a func and @a del_cb. The @a eventarea
* may be any object and is the one that should be used later on with
* elm_object_tooltip apis, such as elm_object_tooltip_hide(),
* elm_object_tooltip_show() or elm_object_tooltip_unset().
*
* @param eventarea the object being attached a tooltip.
* @param owner the elm_widget that owns this object, will be used to
* track theme changes and to be used in @a func or @a del_cb.
* @param func the function used to create the tooltip contents. The
* @a Evas_Object parameters will receive @a owner as value.
* @param data what to provide to @a func as callback data/context.
* @param del_cb called when data is not needed anymore, either when
* another callback replaces @func, the tooltip is unset with
* elm_object_tooltip_unset() or the owner object @a obj
* dies. This callback receives as the first parameter the
* given @a data, and @c event_info is NULL.
*
* @internal
* @ingroup Tooltips
*/
EAPI void
elm_object_sub_tooltip_content_cb_set(Evas_Object *eventarea, Evas_Object *owner, Elm_Tooltip_Content_Cb func, const void *data, Evas_Smart_Cb del_cb)
{
Elm_Tooltip *tt = NULL;
Eina_Bool just_created;
EINA_SAFETY_ON_NULL_GOTO(owner, error);
EINA_SAFETY_ON_NULL_GOTO(eventarea, error);
if (!func)
{
elm_object_tooltip_unset(eventarea);
return;
}
tt = evas_object_data_get(eventarea, _tooltip_key);
if (tt)
{
if (tt->owner != owner)
{
evas_object_event_callback_del_full
(tt->owner, EVAS_CALLBACK_DEL, _elm_tooltip_obj_del_cb, tt);
elm_widget_tooltip_del(tt->owner, tt);
evas_object_event_callback_add
(owner, EVAS_CALLBACK_DEL, _elm_tooltip_obj_del_cb, tt);
elm_widget_tooltip_add(tt->owner, tt);
}
if ((tt->func == func) && (tt->data == data) &&
(tt->del_cb == del_cb))
return;
_elm_tooltip_data_clean(tt);
just_created = EINA_FALSE;
}
else
{
tt = ELM_NEW(Elm_Tooltip);
if (!tt) goto error;
tt->owner = owner;
tt->eventarea = eventarea;
tt->evas = evas_object_evas_get(eventarea);
evas_object_data_set(eventarea, _tooltip_key, tt);
just_created = EINA_TRUE;
evas_object_event_callback_add
(eventarea, EVAS_CALLBACK_MOUSE_IN,
_elm_tooltip_obj_mouse_in_cb, tt);
evas_object_event_callback_add
(eventarea, EVAS_CALLBACK_MOUSE_OUT,
_elm_tooltip_obj_mouse_out_cb, tt);
evas_object_event_callback_add
(eventarea, EVAS_CALLBACK_DEL, _elm_tooltip_obj_del_cb, tt);
evas_object_event_callback_add
(owner, EVAS_CALLBACK_DEL, _elm_tooltip_obj_del_cb, tt);
elm_widget_tooltip_add(tt->owner, tt);
}
tt->func = func;
tt->data = data;
tt->del_cb = del_cb;
if (!just_created) _elm_tooltip_reconfigure_job_start(tt);
return;
error:
if (tt) _elm_tooltip_hide(tt);
if (del_cb) del_cb((void *)data, owner, NULL);
}
/**
* Unset tooltip from object
*