forked from enlightenment/efl
oooh big cleanup. internal elm widget api cleaned up a bit.
SVN revision: 52178
This commit is contained in:
parent
494c1a6dca
commit
68f5b4119b
|
@ -1,11 +1,14 @@
|
||||||
#include <stdbool.h>
|
|
||||||
|
|
||||||
#include <Ecore_X.h>
|
|
||||||
#include <Elementary.h>
|
#include <Elementary.h>
|
||||||
#include "elm_priv.h"
|
|
||||||
/* nash: I have NFI what this does: Just copying the other tests */
|
/* nash: I have NFI what this does: Just copying the other tests */
|
||||||
#ifndef ELM_LIB_QUICKLAUNCH
|
#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/"
|
#define IM "/home/nash/work/samsung/autopaste/images/"
|
||||||
static const char *images[] = {
|
static const char *images[] = {
|
||||||
|
@ -37,7 +40,7 @@ test_drag_source(void *data, Evas_Object *obj, void *eventinfo){
|
||||||
evas_object_show(bx);
|
evas_object_show(bx);
|
||||||
|
|
||||||
ctrls = elm_box_add(win);
|
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_weight_set(ctrls, EVAS_HINT_EXPAND, 0);
|
||||||
evas_object_size_hint_align_set(ctrls, EVAS_HINT_FILL, EVAS_HINT_FILL);
|
evas_object_size_hint_align_set(ctrls, EVAS_HINT_FILL, EVAS_HINT_FILL);
|
||||||
elm_box_pack_end(bx, ctrls);
|
elm_box_pack_end(bx, ctrls);
|
||||||
|
@ -72,13 +75,13 @@ test_drag_source(void *data, Evas_Object *obj, void *eventinfo){
|
||||||
static Eina_Bool
|
static Eina_Bool
|
||||||
_dnd_enter(void *data, int etype, void *ev){
|
_dnd_enter(void *data, int etype, void *ev){
|
||||||
printf("enter\n");
|
printf("enter\n");
|
||||||
return true;
|
return EINA_TRUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
static Eina_Bool
|
static Eina_Bool
|
||||||
_dnd_leave(void *data, int etype, void *ev){
|
_dnd_leave(void *data, int etype, void *ev){
|
||||||
printf("leave\n");
|
printf("leave\n");
|
||||||
return true;
|
return EINA_TRUE;
|
||||||
}
|
}
|
||||||
static Eina_Bool
|
static Eina_Bool
|
||||||
_dnd_position(void *data, int etype, void *ev){
|
_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.y = pos->position.y - 5;
|
||||||
rect.width = 10;
|
rect.width = 10;
|
||||||
rect.height = 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
|
static Eina_Bool
|
||||||
_dnd_status(void *data, int etype, void *ev){
|
_dnd_status(void *data, int etype, void *ev){
|
||||||
printf("status\n");
|
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 */
|
/* 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);
|
// rv = elm_selection_get(ELM_SEL_XDND, ELM_SEL_MARKUP, en);
|
||||||
// if (rv != true){
|
// if (rv != EINA_TRUE){
|
||||||
// printf("Selection set fail\n");
|
// printf("Selection set fail\n");
|
||||||
// }
|
// }
|
||||||
|
|
||||||
return true;
|
return EINA_TRUE;
|
||||||
}
|
}
|
||||||
static Eina_Bool
|
static Eina_Bool
|
||||||
_dnd_finish(void *data, int etype, void *ev){
|
_dnd_finish(void *data, int etype, void *ev){
|
||||||
printf("finish\n");
|
printf("finish\n");
|
||||||
return true;
|
return EINA_TRUE;
|
||||||
}
|
}
|
||||||
void
|
void
|
||||||
test_drag_dest(void *data, Evas_Object *obj, void *event){
|
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));
|
ee = ecore_evas_ecore_evas_get(evas_object_evas_get(win));
|
||||||
xwin = (Ecore_X_Window)ecore_evas_window_get(ee);
|
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);
|
evas_object_show(win);
|
||||||
}
|
}
|
||||||
|
@ -183,6 +186,19 @@ void
|
||||||
test_drag_genlist(void *data, Evas_Object *obj, void *event){
|
test_drag_genlist(void *data, Evas_Object *obj, void *event){
|
||||||
printf("No genlist yet\n");
|
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
|
#endif
|
||||||
|
|
|
@ -1,6 +1,7 @@
|
||||||
MAINTAINERCLEANFILES = Makefile.in
|
MAINTAINERCLEANFILES = Makefile.in
|
||||||
|
|
||||||
AM_CPPFLAGS = \
|
AM_CPPFLAGS = \
|
||||||
|
-DELM_INTERAL_API_MDFGELQ=1 \
|
||||||
-I. \
|
-I. \
|
||||||
-I$(top_builddir) \
|
-I$(top_builddir) \
|
||||||
-I$(top_srcdir) \
|
-I$(top_srcdir) \
|
||||||
|
|
|
@ -2,6 +2,7 @@ AUTOMAKE_OPTIONS = 1.4 foreign
|
||||||
MAINTAINERCLEANFILES = Makefile.in
|
MAINTAINERCLEANFILES = Makefile.in
|
||||||
|
|
||||||
AM_CPPFLAGS = \
|
AM_CPPFLAGS = \
|
||||||
|
-DELM_INTERAL_API_MDFGELQ=1 \
|
||||||
-I. \
|
-I. \
|
||||||
-I$(top_builddir) \
|
-I$(top_builddir) \
|
||||||
-I$(top_srcdir) \
|
-I$(top_srcdir) \
|
||||||
|
@ -25,11 +26,12 @@ endif
|
||||||
|
|
||||||
lib_LTLIBRARIES = libelementary.la
|
lib_LTLIBRARIES = libelementary.la
|
||||||
|
|
||||||
includes_HEADERS = Elementary.h
|
includes_HEADERS = Elementary.h elm_widget.h
|
||||||
includesdir = $(includedir)/elementary-@VMAJ@
|
includesdir = $(includedir)/elementary-@VMAJ@
|
||||||
|
|
||||||
libelementary_la_SOURCES = \
|
libelementary_la_SOURCES = \
|
||||||
elm_priv.h \
|
elm_priv.h \
|
||||||
|
\
|
||||||
elm_main.c \
|
elm_main.c \
|
||||||
elm_theme.c \
|
elm_theme.c \
|
||||||
elm_module.c \
|
elm_module.c \
|
||||||
|
|
|
@ -473,7 +473,7 @@ _item_realize(Elm_Gengrid_Item *item)
|
||||||
const Eina_List *l;
|
const Eina_List *l;
|
||||||
const char *key;
|
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"));
|
"labels"));
|
||||||
EINA_LIST_FOREACH(item->labels, l, key)
|
EINA_LIST_FOREACH(item->labels, l, key)
|
||||||
{
|
{
|
||||||
|
@ -492,7 +492,7 @@ _item_realize(Elm_Gengrid_Item *item)
|
||||||
const Eina_List *l;
|
const Eina_List *l;
|
||||||
const char *key;
|
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"));
|
"icons"));
|
||||||
EINA_LIST_FOREACH(item->icons, l, key)
|
EINA_LIST_FOREACH(item->icons, l, key)
|
||||||
{
|
{
|
||||||
|
@ -514,7 +514,7 @@ _item_realize(Elm_Gengrid_Item *item)
|
||||||
const Eina_List *l;
|
const Eina_List *l;
|
||||||
const char *key;
|
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"));
|
"states"));
|
||||||
EINA_LIST_FOREACH(item->states, l, key)
|
EINA_LIST_FOREACH(item->states, l, key)
|
||||||
{
|
{
|
||||||
|
@ -569,11 +569,11 @@ _item_unrealize(Elm_Gengrid_Item *item)
|
||||||
item->base.view = NULL;
|
item->base.view = NULL;
|
||||||
evas_object_del(item->spacer);
|
evas_object_del(item->spacer);
|
||||||
item->spacer = NULL;
|
item->spacer = NULL;
|
||||||
_elm_stringlist_free(item->labels);
|
elm_widget_stringlist_free(item->labels);
|
||||||
item->labels = NULL;
|
item->labels = NULL;
|
||||||
_elm_stringlist_free(item->icons);
|
elm_widget_stringlist_free(item->icons);
|
||||||
item->icons = NULL;
|
item->icons = NULL;
|
||||||
_elm_stringlist_free(item->states);
|
elm_widget_stringlist_free(item->states);
|
||||||
|
|
||||||
EINA_LIST_FREE(item->icon_objs, icon)
|
EINA_LIST_FREE(item->icon_objs, icon)
|
||||||
evas_object_del(icon);
|
evas_object_del(icon);
|
||||||
|
|
|
@ -900,7 +900,7 @@ _item_realize(Elm_Genlist_Item *it, int in, int calc)
|
||||||
const Eina_List *l;
|
const Eina_List *l;
|
||||||
const char *key;
|
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)
|
EINA_LIST_FOREACH(it->labels, l, key)
|
||||||
{
|
{
|
||||||
char *s = it->itc->func.label_get(it->base.data, it->base.widget, l->data);
|
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 Eina_List *l;
|
||||||
const char *key;
|
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)
|
EINA_LIST_FOREACH(it->icons, l, key)
|
||||||
{
|
{
|
||||||
Evas_Object *ic = it->itc->func.icon_get(it->base.data, it->base.widget, l->data);
|
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 Eina_List *l;
|
||||||
const char *key;
|
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_LIST_FOREACH(it->states, l, key)
|
||||||
{
|
{
|
||||||
Eina_Bool on = it->itc->func.state_get(it->base.data, it->base.widget, l->data);
|
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;
|
it->base.view = NULL;
|
||||||
evas_object_del(it->spacer);
|
evas_object_del(it->spacer);
|
||||||
it->spacer = NULL;
|
it->spacer = NULL;
|
||||||
_elm_stringlist_free(it->labels);
|
elm_widget_stringlist_free(it->labels);
|
||||||
it->labels = NULL;
|
it->labels = NULL;
|
||||||
_elm_stringlist_free(it->icons);
|
elm_widget_stringlist_free(it->icons);
|
||||||
it->icons = NULL;
|
it->icons = NULL;
|
||||||
_elm_stringlist_free(it->states);
|
elm_widget_stringlist_free(it->states);
|
||||||
|
|
||||||
EINA_LIST_FREE(it->icon_objs, icon)
|
EINA_LIST_FREE(it->icon_objs, icon)
|
||||||
evas_object_del(icon);
|
evas_object_del(icon);
|
||||||
|
|
|
@ -315,26 +315,6 @@ _elm_rescale(void)
|
||||||
_elm_win_rescale();
|
_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
|
* @defgroup General General
|
||||||
*/
|
*/
|
||||||
|
@ -611,7 +591,7 @@ elm_quicklaunch_shutdown(void)
|
||||||
_elm_log_dom = -1;
|
_elm_log_dom = -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
_elm_widtype_clear();
|
_elm_widget_type_clear();
|
||||||
|
|
||||||
eina_shutdown();
|
eina_shutdown();
|
||||||
}
|
}
|
||||||
|
|
|
@ -18,17 +18,20 @@
|
||||||
#include "els_box.h"
|
#include "els_box.h"
|
||||||
#include "els_icon.h"
|
#include "els_icon.h"
|
||||||
|
|
||||||
|
#include "elm_widget.h"
|
||||||
|
|
||||||
#define CRITICAL(...) EINA_LOG_DOM_CRIT(_elm_log_dom, __VA_ARGS__)
|
#define CRITICAL(...) EINA_LOG_DOM_CRIT(_elm_log_dom, __VA_ARGS__)
|
||||||
#define ERR(...) EINA_LOG_DOM_ERR(_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 WRN(...) EINA_LOG_DOM_WARN(_elm_log_dom, __VA_ARGS__)
|
||||||
#define INF(...) EINA_LOG_DOM_INFO(_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 DBG(...) EINA_LOG_DOM_DBG (_elm_log_dom, __VA_ARGS__)
|
||||||
|
|
||||||
// FIXME: totally disorganised. clean this up!
|
typedef struct _Elm_Config Elm_Config;
|
||||||
//
|
typedef struct _Elm_Module Elm_Module;
|
||||||
// Why EAPI in a private header ?
|
typedef struct _Elm_Drop_Data Elm_Drop_Data;
|
||||||
// EAPI is temporaty - that widget api will change, but makign it EAPI right now to indicate its bound for externalness
|
|
||||||
|
// FIXME: nash - type name wrong (caps)
|
||||||
|
typedef Eina_Bool (*elm_drop_cb) (void *d, Evas_Object *o, Elm_Drop_Data *data);
|
||||||
|
|
||||||
struct _Elm_Theme
|
struct _Elm_Theme
|
||||||
{
|
{
|
||||||
|
@ -55,7 +58,35 @@ typedef enum _Elm_Engine
|
||||||
ELM_OPENGL_SDL
|
ELM_OPENGL_SDL
|
||||||
} Elm_Engine;
|
} 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
|
/* increment this whenever we change config enough that you need new
|
||||||
* defaults for elm to work.
|
* defaults for elm to work.
|
||||||
|
@ -94,8 +125,6 @@ struct _Elm_Config
|
||||||
double tooltip_delay;
|
double tooltip_delay;
|
||||||
};
|
};
|
||||||
|
|
||||||
typedef struct _Elm_Module Elm_Module;
|
|
||||||
|
|
||||||
struct _Elm_Module
|
struct _Elm_Module
|
||||||
{
|
{
|
||||||
int version;
|
int version;
|
||||||
|
@ -112,29 +141,6 @@ struct _Elm_Module
|
||||||
int references;
|
int references;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
enum _elm_sel_type {
|
|
||||||
ELM_SEL_PRIMARY,
|
|
||||||
ELM_SEL_SECONDARY,
|
|
||||||
ELM_SEL_CLIPBOARD,
|
|
||||||
ELM_SEL_XDND,
|
|
||||||
|
|
||||||
ELM_SEL_MAX,
|
|
||||||
};
|
|
||||||
|
|
||||||
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,
|
|
||||||
};
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
#define ELM_NEW(t) calloc(1, sizeof(t))
|
|
||||||
|
|
||||||
void _elm_win_shutdown(void);
|
void _elm_win_shutdown(void);
|
||||||
void _elm_win_rescale(void);
|
void _elm_win_rescale(void);
|
||||||
|
|
||||||
|
@ -153,225 +159,7 @@ Elm_Module *_elm_module_add(const char *name, const char *as);
|
||||||
void _elm_module_del(Elm_Module *m);
|
void _elm_module_del(Elm_Module *m);
|
||||||
const void *_elm_module_symbol_get(Elm_Module *m, const char *name);
|
const void *_elm_module_symbol_get(Elm_Module *m, const char *name);
|
||||||
|
|
||||||
/* FIXME: should this be public? for now - private (but public symbols) */
|
void _elm_widget_type_clear(void);
|
||||||
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);
|
|
||||||
|
|
||||||
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_unneed_ethumb(void);
|
||||||
|
|
||||||
|
@ -381,50 +169,23 @@ void _elm_config_init(void);
|
||||||
void _elm_config_sub_init(void);
|
void _elm_config_sub_init(void);
|
||||||
void _elm_config_shutdown(void);
|
void _elm_config_shutdown(void);
|
||||||
|
|
||||||
/* FIXME: nash formatiing */
|
void elm_tooltip_theme(Elm_Tooltip *tt);
|
||||||
typedef struct Elm_Drop_Data {
|
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 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_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_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_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_add(Evas_Object *widget,
|
|
||||||
enum _elm_sel_type, elm_drop_cb, void *);
|
|
||||||
Eina_Bool elm_drop_target_del(Evas_Object *widget);
|
Eina_Bool elm_drop_target_del(Evas_Object *widget);
|
||||||
Eina_Bool elm_drag_start(Evas_Object *, enum _elm_sel_format,
|
Eina_Bool elm_drag_start(Evas_Object *, enum _elm_sel_format, const char *, void (*)(void *,Evas_Object*),void*);
|
||||||
const char *,
|
|
||||||
void (*)(void *,Evas_Object*),void*);
|
|
||||||
|
|
||||||
Eina_Bool _elm_dangerous_call_check(const char *call);
|
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 char *_elm_appname;
|
||||||
extern Elm_Config *_elm_config;
|
extern Elm_Config *_elm_config;
|
||||||
extern const char *_elm_data_dir;
|
extern const char *_elm_data_dir;
|
||||||
extern const char *_elm_lib_dir;
|
extern const char *_elm_lib_dir;
|
||||||
extern int _elm_log_dom;
|
extern int _elm_log_dom;
|
||||||
|
|
||||||
extern Eina_List *_elm_win_list;
|
extern Eina_List *_elm_win_list;
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -64,7 +64,7 @@ _del_hook(Evas_Object *obj)
|
||||||
Widget_Data *wd = elm_widget_data_get(obj);
|
Widget_Data *wd = elm_widget_data_get(obj);
|
||||||
if (!wd) return;
|
if (!wd) return;
|
||||||
elm_slideshow_clear(obj);
|
elm_slideshow_clear(obj);
|
||||||
_elm_stringlist_free(wd->transitions);
|
elm_widget_stringlist_free(wd->transitions);
|
||||||
if (wd->timer) ecore_timer_del(wd->timer);
|
if (wd->timer) ecore_timer_del(wd->timer);
|
||||||
EINA_LIST_FREE(wd->layout.list, layout)
|
EINA_LIST_FREE(wd->layout.list, layout)
|
||||||
eina_stringshare_del(layout);
|
eina_stringshare_del(layout);
|
||||||
|
@ -255,11 +255,11 @@ elm_slideshow_add(Evas_Object *parent)
|
||||||
elm_widget_resize_object_set(obj, wd->slideshow);
|
elm_widget_resize_object_set(obj, wd->slideshow);
|
||||||
evas_object_show(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)
|
if (eina_list_count(wd->transitions) > 0)
|
||||||
wd->transition = eina_stringshare_add(eina_list_data_get(wd->transitions));
|
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)
|
if (eina_list_count(wd->layout.list) > 0)
|
||||||
wd->layout.current = eina_list_data_get(wd->layout.list);
|
wd->layout.current = eina_list_data_get(wd->layout.list);
|
||||||
|
|
||||||
|
|
File diff suppressed because it is too large
Load Diff
|
@ -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
|
|
@ -469,6 +469,112 @@ elm_tooltip_theme(Elm_Tooltip *tt)
|
||||||
_elm_tooltip_reconfigure_job_start(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
|
* 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);
|
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
|
* Unset tooltip from object
|
||||||
*
|
*
|
||||||
|
|
Loading…
Reference in New Issue