make extra actions work. use them from illume.

SVN revision: 37811
This commit is contained in:
Carsten Haitzler 2008-11-26 12:54:23 +00:00
parent 3c66ab8d7a
commit 6cf459572f
7 changed files with 213 additions and 2 deletions

View File

@ -373,6 +373,36 @@ collections {
}
}
group { name: "e/icons/enlightenment/home";
images.image: "illume-home.png" COMP;
max: 96 96;
parts {
part { name: "icon";
repeat_events: 1;
description { state: "default" 0.0;
aspect: 1.0 1.0;
aspect_preference: BOTH;
image.normal: "illume-home.png";
}
}
}
}
group { name: "e/icons/enlightenment/close";
images.image: "illume-close.png" COMP;
max: 96 96;
parts {
part { name: "icon";
repeat_events: 1;
description { state: "default" 0.0;
aspect: 1.0 1.0;
aspect_preference: BOTH;
image.normal: "illume-close.png";
}
}
}
}
group { name: "e/modules/slipshelf/controls/default";
images {
image: "bt_base1.png" COMP;

View File

@ -2705,6 +2705,33 @@ e_action_find(const char *name)
return act;
}
EAPI const char *
e_action_predef_label_get(const char *action, const char *params)
{
E_Action_Group *actg = NULL;
E_Action_Description *actd = NULL;
Eina_List *l, *l2;
for (l = action_groups; l; l = l->next)
{
actg = l->data;
for (l2 = actg->acts; l2; l2 = l2->next)
{
actd = l2->data;
if (!strcmp(actd->act_cmd, action))
{
if ((params) && (actd->act_params) &&
(!strcmp(params, actd->act_params)))
{
return actd->act_name;
}
}
}
}
if (params) return e_action_predef_label_get(action, NULL);
return NULL;
}
EAPI void
e_action_predef_name_set(const char *act_grp, const char *act_name, const char *act_cmd, const char *act_params, const char *param_example, int editable)
{

View File

@ -54,6 +54,7 @@ EAPI E_Action *e_action_add(const char *name);
EAPI void e_action_del(const char *name);
EAPI E_Action *e_action_find(const char *name);
EAPI const char *e_action_predef_label_get(const char *action, const char *params);
EAPI void e_action_predef_name_set(const char *act_grp, const char *act_name, const char *act_cmd, const char *act_params, const char *param_example, int editable);
EAPI void e_action_predef_name_del(const char *act_grp, const char *act_name);
EAPI void e_action_predef_name_all_del(void);

View File

@ -118,6 +118,46 @@ e_sys_action_do(E_Sys_Action a, char *param)
return ret;
}
static Eina_List *extra_actions = NULL;
EAPI E_Sys_Con_Action *
e_sys_con_extra_action_register(const char *label,
const char *icon_group,
const char *button_name,
void (*func) (void *data),
const void *data)
{
E_Sys_Con_Action *sca;
sca = E_NEW(E_Sys_Con_Action, 1);
if (label)
sca->label = eina_stringshare_add(label);
if (icon_group)
sca->icon_group = eina_stringshare_add(icon_group);
if (button_name)
sca->button_name = eina_stringshare_add(button_name);
sca->func = func;
sca->data = data;
extra_actions = eina_list_append(extra_actions, sca);
return sca;
}
EAPI void
e_sys_con_extra_action_unregister(E_Sys_Con_Action *sca)
{
extra_actions = eina_list_remove(extra_actions, sca);
if (sca->label) eina_stringshare_del(sca->label);
if (sca->icon_group) eina_stringshare_del(sca->icon_group);
if (sca->button_name) eina_stringshare_del(sca->button_name);
free(sca);
}
EAPI const Eina_List *
e_sys_con_extra_action_list_get(void)
{
return extra_actions;
}
/* local subsystem functions */
static int
_e_sys_cb_timer(void *data)

View File

@ -3,6 +3,7 @@
*/
#ifdef E_TYPEDEFS
typedef struct _E_Sys_Con_Action E_Sys_Con_Action;
typedef enum _E_Sys_Action E_Sys_Action;
enum _E_Sys_Action
@ -19,6 +20,15 @@ enum _E_Sys_Action
E_SYS_HIBERNATE
};
struct _E_Sys_Con_Action
{
const char *label;
const char *icon_group;
const char *button_name;
void (*func) (void *data);
const void *data;
};
#else
#ifndef E_SYS_H
#define E_SYS_H
@ -28,5 +38,13 @@ EAPI int e_sys_shutdown(void);
EAPI int e_sys_action_possible_get(E_Sys_Action a);
EAPI int e_sys_action_do(E_Sys_Action a, char *param);
EAPI E_Sys_Con_Action *e_sys_con_extra_action_register(const char *label,
const char *icon_group,
const char *button_name,
void (*func) (void *data),
const void *data);
EAPI void e_sys_con_extra_action_unregister(E_Sys_Con_Action *sca);
EAPI const Eina_List *e_sys_con_extra_action_list_get(void);
#endif
#endif

View File

@ -39,6 +39,8 @@ static int _cb_efreet_desktop_change(void *data, int type, void *event);
static void _apps_unpopulate(void);
static void _apps_populate(void);
static int _cb_update_deferred(void *data);
static void _cb_sys_con_close(void *data);
static void _cb_sys_con_home(void *data);
static void _e_illume_pan_set(Evas_Object *obj, Evas_Coord x, Evas_Coord y);
static void _e_illume_pan_get(Evas_Object *obj, Evas_Coord *x, Evas_Coord *y);
@ -69,6 +71,9 @@ static E_Flaunch *flaunch = NULL;
static E_Appwin *appwin = NULL;
static E_Syswin *syswin = NULL;
static E_Sys_Con_Action *sys_con_act_close = NULL;
static E_Sys_Con_Action *sys_con_act_home = NULL;
/* called from the module core */
void
_e_mod_win_init(E_Module *m)
@ -144,11 +149,20 @@ _e_mod_win_init(E_Module *m)
_apps_unpopulate();
_apps_populate();
e_configure_registry_custom_desktop_exec_callback_set(_cb_cfg_exec, NULL);
sys_con_act_close = e_sys_con_extra_action_register
(_("Close"), "enlightenment/close", "button", _cb_sys_con_close, NULL);
sys_con_act_home = e_sys_con_extra_action_register
(_("Home"), "enlightenment/home", "button", _cb_sys_con_home, NULL);
}
void
_e_mod_win_shutdown(void)
{
e_sys_con_extra_action_unregister(sys_con_act_close);
sys_con_act_close = NULL;
e_sys_con_extra_action_unregister(sys_con_act_home);
sys_con_act_home = NULL;
e_object_del(E_OBJECT(flaunch));
flaunch = NULL;
if (busywin)
@ -1107,6 +1121,44 @@ _cb_update_deferred(void *data)
return 0;
}
static void
_cb_sys_con_close(void *data)
{
E_Border *bd;
bd = e_border_focused_get();
if (bd)
{
if (e_object_is_del(E_OBJECT(bd))) return;
if ((!bd->client.icccm.accepts_focus) &&
(!bd->client.icccm.take_focus)) return;
if (bd->client.netwm.state.skip_taskbar) return;
if (bd->user_skip_winlist) return;
_e_mod_layout_border_close(bd);
}
}
static void
_cb_sys_con_home(void *data)
{
Eina_List *l, *borders;
borders = e_border_client_list();
for (l = borders; l; l = l->next)
{
E_Border *bd;
bd = l->data;
if (e_object_is_del(E_OBJECT(bd))) continue;
if ((!bd->client.icccm.accepts_focus) &&
(!bd->client.icccm.take_focus)) continue;
if (bd->client.netwm.state.skip_taskbar) continue;
if (bd->user_skip_winlist) continue;
_e_mod_layout_border_hide(bd);
}
}
static void
_e_illume_pan_set(Evas_Object *obj, Evas_Coord x, Evas_Coord y)
{

View File

@ -13,6 +13,7 @@ static int _cb_mouse_wheel(void *data, int type, void *event);
static void _cb_signal_close(void *data, Evas_Object *obj, const char *emission, const char *source);
static void _cb_signal_syscon(void *data, Evas_Object *obj, const char *emission, const char *source);
static void _cb_signal_action(void *data, Evas_Object *obj, const char *emission, const char *source);
static void _cb_signal_action_extra(void *data, Evas_Object *obj, const char *emission, const char *source);
static int _cb_timeout_defaction(void *data);
/* local subsystem globals */
@ -163,7 +164,8 @@ e_syscon_show(E_Zone *zone, const char *defact)
else
e_theme_edje_object_set(o, "base/theme/widgets",
"e/widgets/syscon/item/button");
// edje_object_part_text_set(o, "e.text.label", sca->action);
edje_object_part_text_set(o, "e.text.label",
e_action_predef_label_get(sca->action, sca->params));
if (sca->icon)
{
o2 = edje_object_add(popup->evas);
@ -189,7 +191,37 @@ e_syscon_show(E_Zone *zone, const char *defact)
iw, ih, iw, ih);
evas_object_show(o);
}
// FIXME: "extra" list needs to be handled
for (l = (Eina_List *)e_sys_con_extra_action_list_get(); l; l = l->next)
{
E_Sys_Con_Action *sca;
char buf[1024];
sca = l->data;
o = edje_object_add(popup->evas);
edje_object_signal_callback_add(o, "e,action,click", "", _cb_signal_action_extra, sca);
if (sca->button_name)
{
snprintf(buf, sizeof(buf), "e/widgets/syscon/item/%s",
sca->button_name);
e_theme_edje_object_set(o, "base/theme/widgets", buf);
}
else
e_theme_edje_object_set(o, "base/theme/widgets",
"e/widgets/syscon/item/button");
edje_object_part_text_set(o, "e.text.label", sca->label);
if (sca->icon_group)
{
o2 = edje_object_add(popup->evas);
e_util_edje_icon_set(o2, sca->icon_group);
edje_object_part_swallow(o, "e.swallow.icon", o2);
evas_object_show(o2);
}
e_flowlayout_pack_end(o_flow_extra, o);
iw = ih = e_config->syscon.extra.icon_size * e_scale;
e_flowlayout_pack_options_set(o, 1, 1, 0, 0, 0.5, 0.5,
iw, ih, iw, ih);
evas_object_show(o);
}
e_flowlayout_fill_set(o_flow_main, 1);
edje_object_part_swallow(o_bg, "e.swallow.main", o_flow_main);
@ -391,6 +423,17 @@ _cb_signal_action(void *data, Evas_Object *obj, const char *emission, const char
if (a) a->func.go(NULL, sca->params);
}
static void
_cb_signal_action_extra(void *data, Evas_Object *obj, const char *emission, const char *source)
{
E_Sys_Con_Action *sca;
e_syscon_hide();
sca = data;
if (!sca) return;
if (sca->func) sca->func((void *)sca->data);
}
static int
_cb_timeout_defaction(void *data)
{