forked from enlightenment/enlightenment
add slipwin button - does nothing, but will eventually. for now it is
inactive and a spacer. app&syswin added for changing soon. SVN revision: 37411
This commit is contained in:
parent
5e35047602
commit
6028e0670f
|
@ -834,6 +834,13 @@ collections {
|
|||
group { name: "e/modules/slipwin/base/default";
|
||||
images {
|
||||
image: "base_bg.png" COMP;
|
||||
image: "illume-apps.png" COMP;
|
||||
image: "bt_base1.png" COMP;
|
||||
image: "bt_base2.png" COMP;
|
||||
image: "bt_hilight.png" COMP;
|
||||
image: "bt_shine.png" COMP;
|
||||
image: "bt_dis_base.png" COMP;
|
||||
image: "bt_dis_hilight.png" COMP;
|
||||
}
|
||||
// data.item: "shaped" "1";
|
||||
parts {
|
||||
|
@ -850,9 +857,141 @@ collections {
|
|||
description { state: "default" 0.0;
|
||||
// fixed: 1 1;
|
||||
rel1.offset: 4 4;
|
||||
rel2.offset: -5 -5;
|
||||
rel2 {
|
||||
to_y: "apps";
|
||||
relative: 1.0 0.0;
|
||||
offset: -5 -17;
|
||||
}
|
||||
}
|
||||
}
|
||||
part { name: "apps_image";
|
||||
mouse_events: 0;
|
||||
description { state: "default" 0.0;
|
||||
rel1.to: "apps";
|
||||
rel1.offset: -8 -8;
|
||||
rel2.to: "apps";
|
||||
rel2.offset: 7 7;
|
||||
image {
|
||||
normal: "bt_base2.png";
|
||||
border: 7 7 7 7;
|
||||
}
|
||||
}
|
||||
description { state: "clicked" 0.0;
|
||||
inherit: "default" 0.0;
|
||||
image.normal: "bt_base1.png";
|
||||
}
|
||||
description { state: "disabled" 0.0;
|
||||
inherit: "default" 0.0;
|
||||
image {
|
||||
normal: "bt_dis_base.png";
|
||||
border: 4 4 4 4;
|
||||
}
|
||||
}
|
||||
}
|
||||
part { name: "apps_icon";
|
||||
mouse_events: 0;
|
||||
description { state: "default" 0.0;
|
||||
rel1.to: "apps_image";
|
||||
rel1.offset: 8 8;
|
||||
rel2.to: "apps_image";
|
||||
rel2.offset: -9 -9;
|
||||
aspect: 1.0 1.0;
|
||||
aspect_preference: BOTH;
|
||||
max: 96 96;
|
||||
image.normal: "illume-apps.png";
|
||||
}
|
||||
}
|
||||
part { name: "apps_over1";
|
||||
mouse_events: 0;
|
||||
description { state: "default" 0.0;
|
||||
rel1.to: "apps_image";
|
||||
rel2.to: "apps_image";
|
||||
rel2.relative: 1.0 0.5;
|
||||
image {
|
||||
normal: "bt_hilight.png";
|
||||
border: 7 7 7 0;
|
||||
}
|
||||
}
|
||||
description { state: "disabled" 0.0;
|
||||
inherit: "default" 0.0;
|
||||
image {
|
||||
normal: "bt_dis_hilight.png";
|
||||
border: 4 4 4 0;
|
||||
}
|
||||
}
|
||||
}
|
||||
part { name: "apps_over2";
|
||||
mouse_events: 0;
|
||||
description { state: "default" 0.0;
|
||||
rel1.to: "apps_image";
|
||||
rel2.to: "apps_image";
|
||||
image {
|
||||
normal: "bt_shine.png";
|
||||
border: 7 7 7 7;
|
||||
}
|
||||
}
|
||||
description { state: "disabled" 0.0;
|
||||
inherit: "default" 0.0;
|
||||
visible: 0;
|
||||
}
|
||||
}
|
||||
part { name: "apps";
|
||||
type: RECT;
|
||||
scale: 1;
|
||||
description { state: "default" 0.0;
|
||||
aspect: 1.0 1.0;
|
||||
min: 48 48;
|
||||
aspect_preference: VERTICAL;
|
||||
align: 0.5 1.0;
|
||||
rel1.relative: 0.5 1.0;
|
||||
rel1.offset: 0 -17;
|
||||
rel2.relative: 0.5 1.0;
|
||||
rel2.offset: -1 -17;
|
||||
color: 0 0 0 0;
|
||||
}
|
||||
description { state: "disabled" 0.0;
|
||||
inherit: "default" 0.0;
|
||||
visible: 0;
|
||||
}
|
||||
}
|
||||
}
|
||||
programs {
|
||||
program { name: "appsdown";
|
||||
signal: "mouse,down,1";
|
||||
source: "apps";
|
||||
action: STATE_SET "clicked" 0.0;
|
||||
target: "apps_image";
|
||||
}
|
||||
program { name: "appsup";
|
||||
signal: "mouse,up,1";
|
||||
source: "apps";
|
||||
action: STATE_SET "default" 0.0;
|
||||
target: "apps_image";
|
||||
after: "apps";
|
||||
}
|
||||
program { name: "apps";
|
||||
action: SIGNAL_EMIT "e,action,do,apps" "";
|
||||
}
|
||||
program { name: "appsenabled";
|
||||
signal: "e,state,action,apps,enabled";
|
||||
source: "e";
|
||||
action: STATE_SET "default" 0.0;
|
||||
target: "apps_image";
|
||||
target: "apps_icon";
|
||||
target: "apps_over1";
|
||||
target: "apps_over2";
|
||||
target: "apps";
|
||||
}
|
||||
program { name: "appsdisabled";
|
||||
signal: "e,state,action,apps,disabled";
|
||||
source: "e";
|
||||
action: STATE_SET "disabled" 0.0;
|
||||
target: "apps_image";
|
||||
target: "apps_icon";
|
||||
target: "apps_over1";
|
||||
target: "apps_over2";
|
||||
target: "apps";
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -63,7 +63,11 @@ module_la_SOURCES = e_mod_main.c \
|
|||
e_flaunch.c \
|
||||
e_flaunch.h \
|
||||
e_busycover.c \
|
||||
e_busycover.h
|
||||
e_busycover.h \
|
||||
e_appwin.c \
|
||||
e_appwin.h \
|
||||
e_syswin.c \
|
||||
e_syswin.h
|
||||
|
||||
module_la_LIBADD = @e_libs@ @dlopen_libs@
|
||||
module_la_LDFLAGS = -module -avoid-version
|
||||
|
|
|
@ -0,0 +1,430 @@
|
|||
#include "e.h"
|
||||
#include "e_appwin.h"
|
||||
|
||||
// FIXME: stolen from slipwin. this is meant to be an "app control menu" that
|
||||
// is always availabel by some key binding. this menu should have:
|
||||
//
|
||||
// close app
|
||||
// kill app
|
||||
// home
|
||||
// shutdown
|
||||
// suspend
|
||||
// config
|
||||
|
||||
typedef struct _Win_Entry Win_Entry;
|
||||
|
||||
struct _Win_Entry
|
||||
{
|
||||
E_Appwin *appwin;
|
||||
E_Border *border;
|
||||
Evas_Object *icon;
|
||||
};
|
||||
|
||||
EAPI int E_EVENT_APPWIN_DEL = 0;
|
||||
|
||||
/* internal calls */
|
||||
|
||||
E_Appwin *_e_appwin_new(E_Zone *zone, const char *themedir);
|
||||
static void _e_appwin_free(E_Appwin *ess);
|
||||
static int _e_appwin_cb_animate(void *data);
|
||||
static void _e_appwin_slide(E_Appwin *ess, int out, double len);
|
||||
static int _e_appwin_cb_mouse_up(void *data, int type, void *event);
|
||||
static int _e_appwin_cb_zone_move_resize(void *data, int type, void *event);
|
||||
static int _e_appwin_cb_zone_del(void *data, int type, void *event);
|
||||
static void _e_appwin_event_simple_free(void *data, void *ev);
|
||||
static void _e_appwin_object_del_attach(void *o);
|
||||
static void _e_appwin_cb_item_sel(void *data);
|
||||
|
||||
static Evas_Object *_theme_obj_new(Evas *e, const char *custom_dir, const char *group);
|
||||
|
||||
/* state */
|
||||
static Eina_List *appwins = NULL;
|
||||
|
||||
/* called from the module core */
|
||||
EAPI int
|
||||
e_appwin_init(void)
|
||||
{
|
||||
E_EVENT_APPWIN_DEL = ecore_event_type_new();
|
||||
return 1;
|
||||
}
|
||||
|
||||
EAPI int
|
||||
e_appwin_shutdown(void)
|
||||
{
|
||||
return 1;
|
||||
}
|
||||
|
||||
EAPI E_Appwin *
|
||||
e_appwin_new(E_Zone *zone, const char *themedir)
|
||||
{
|
||||
E_Appwin *esw;
|
||||
Evas_Coord mw, mh;
|
||||
int x, y;
|
||||
Evas_Object *o;
|
||||
|
||||
esw = E_OBJECT_ALLOC(E_Appwin, E_APPWIN_TYPE, _e_appwin_free);
|
||||
if (!esw) return NULL;
|
||||
|
||||
esw->zone = zone;
|
||||
if (themedir) esw->themedir = evas_stringshare_add(themedir);
|
||||
|
||||
esw->clickwin = ecore_x_window_input_new(zone->container->win,
|
||||
zone->x, zone->y, zone->w, zone->h);
|
||||
esw->popup = e_popup_new(esw->zone, -1, -1, 1, 1);
|
||||
ecore_x_window_configure(esw->clickwin,
|
||||
ECORE_X_WINDOW_CONFIGURE_MASK_SIBLING|ECORE_X_WINDOW_CONFIGURE_MASK_STACK_MODE,
|
||||
0, 0, 0, 0, 0,
|
||||
esw->popup->evas_win,
|
||||
ECORE_X_WINDOW_STACK_BELOW);
|
||||
e_popup_layer_set(esw->popup, 220);
|
||||
|
||||
esw->base_obj = _theme_obj_new(esw->popup->evas,
|
||||
esw->themedir,
|
||||
"e/modules/appwin/base/default");
|
||||
|
||||
esw->focused_border = e_border_focused_get();
|
||||
|
||||
edje_object_size_min_calc(esw->base_obj, &mw, &mh);
|
||||
|
||||
o = e_widget_ilist_add(esw->popup->evas, 32 * e_scale, 32 * e_scale, NULL);
|
||||
esw->ilist_obj = o;
|
||||
e_widget_ilist_selector_set(o, 1);
|
||||
edje_object_part_swallow(esw->base_obj, "e.swallow.content", o);
|
||||
evas_object_show(o);
|
||||
|
||||
x = zone->x;
|
||||
y = zone->y + zone->h;
|
||||
mw = zone->w;
|
||||
|
||||
mh = 300;
|
||||
|
||||
e_popup_move_resize(esw->popup, x, y, mw, mh);
|
||||
|
||||
evas_object_resize(esw->base_obj, esw->popup->w, esw->popup->h);
|
||||
e_popup_edje_bg_object_set(esw->popup, esw->base_obj);
|
||||
evas_object_show(esw->base_obj);
|
||||
|
||||
e_popup_show(esw->popup);
|
||||
|
||||
appwins = eina_list_append(appwins, esw);
|
||||
|
||||
esw->handlers = eina_list_append
|
||||
(esw->handlers,
|
||||
ecore_event_handler_add(ECORE_X_EVENT_MOUSE_BUTTON_UP,
|
||||
_e_appwin_cb_mouse_up, esw));
|
||||
|
||||
e_object_del_attach_func_set(E_OBJECT(esw), _e_appwin_object_del_attach);
|
||||
|
||||
return esw;
|
||||
}
|
||||
|
||||
EAPI void
|
||||
e_appwin_show(E_Appwin *esw)
|
||||
{
|
||||
Evas_Object *o;
|
||||
Evas_Coord mw, mh, vw, vh, w, h;
|
||||
Eina_List *borders, *l;
|
||||
Win_Entry *ent;
|
||||
int i, selnum;
|
||||
|
||||
E_OBJECT_CHECK(esw);
|
||||
E_OBJECT_TYPE_CHECK(esw, E_APPWIN_TYPE);
|
||||
|
||||
while (esw->borders)
|
||||
{
|
||||
ent = esw->borders->data;
|
||||
evas_object_del(ent->icon);
|
||||
e_object_unref(E_OBJECT(ent->border));
|
||||
esw->borders = eina_list_remove_list(esw->borders, esw->borders);
|
||||
free(ent);
|
||||
}
|
||||
e_widget_ilist_freeze(esw->ilist_obj);
|
||||
e_widget_ilist_clear(esw->ilist_obj);
|
||||
e_widget_ilist_thaw(esw->ilist_obj);
|
||||
|
||||
borders = e_border_client_list();
|
||||
selnum = -1;
|
||||
e_widget_ilist_freeze(esw->ilist_obj);
|
||||
for (i = 0, l = borders; l; l = l->next)
|
||||
{
|
||||
E_Border *bd;
|
||||
Evas_Object *ic;
|
||||
const char *title;
|
||||
|
||||
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_object_ref(E_OBJECT(bd));
|
||||
title = "???";
|
||||
if (bd->client.netwm.name) title = bd->client.netwm.name;
|
||||
else if (bd->client.icccm.title) title = bd->client.icccm.title;
|
||||
ic = e_border_icon_add(bd, esw->popup->evas);
|
||||
ent = calloc(1, sizeof(Win_Entry));
|
||||
ent->appwin = esw;
|
||||
ent->border = bd;
|
||||
ent->icon = ic;
|
||||
esw->borders = evas_list_append(esw->borders, ent);
|
||||
e_widget_ilist_append(esw->ilist_obj, ic, title, _e_appwin_cb_item_sel, ent, NULL);
|
||||
if (bd == e_border_focused_get()) selnum = i;
|
||||
i++;
|
||||
}
|
||||
e_widget_ilist_thaw(esw->ilist_obj);
|
||||
|
||||
if (selnum >= 0) e_widget_ilist_selected_set(esw->ilist_obj, selnum);
|
||||
|
||||
e_widget_ilist_go(esw->ilist_obj);
|
||||
|
||||
e_widget_ilist_preferred_size_get(esw->ilist_obj, &mw, &mh);
|
||||
edje_extern_object_min_size_set(esw->ilist_obj, mw, mh);
|
||||
edje_object_part_swallow(esw->base_obj, "e.swallow.content", esw->ilist_obj);
|
||||
|
||||
edje_object_size_min_calc(esw->base_obj, &mw, &mh);
|
||||
|
||||
edje_extern_object_min_size_set(esw->ilist_obj, 0, 0);
|
||||
|
||||
|
||||
edje_object_part_swallow(esw->base_obj, "e.swallow.content", esw->ilist_obj);
|
||||
|
||||
mw = esw->zone->w;
|
||||
if (mh > esw->zone->h) mh = esw->zone->h;
|
||||
e_popup_resize(esw->popup, mw, mh);
|
||||
|
||||
evas_object_resize(esw->base_obj, esw->popup->w, esw->popup->h);
|
||||
|
||||
_e_appwin_slide(esw, 1, 1.0);
|
||||
}
|
||||
|
||||
EAPI void
|
||||
e_appwin_hide(E_Appwin *esw)
|
||||
{
|
||||
E_OBJECT_CHECK(esw);
|
||||
E_OBJECT_TYPE_CHECK(esw, E_APPWIN_TYPE);
|
||||
|
||||
_e_appwin_slide(esw, 0, 1.0);
|
||||
}
|
||||
|
||||
EAPI void
|
||||
e_appwin_border_select_callback_set(E_Appwin *esw, void (*func) (void *data, E_Appwin *ess, E_Border *bd), const void *data)
|
||||
{
|
||||
E_OBJECT_CHECK(esw);
|
||||
E_OBJECT_TYPE_CHECK(esw, E_APPWIN_TYPE);
|
||||
esw->callback.func = func;
|
||||
esw->callback.data = data;
|
||||
}
|
||||
|
||||
/* internal calls */
|
||||
static void
|
||||
_e_appwin_free(E_Appwin *esw)
|
||||
{
|
||||
appwins = eina_list_remove(appwins, esw);
|
||||
while (esw->handlers)
|
||||
{
|
||||
if (esw->handlers->data)
|
||||
ecore_event_handler_del(esw->handlers->data);
|
||||
esw->handlers = eina_list_remove_list(esw->handlers, esw->handlers);
|
||||
}
|
||||
if (esw->animator) ecore_animator_del(esw->animator);
|
||||
if (esw->themedir) evas_stringshare_del(esw->themedir);
|
||||
ecore_x_window_del(esw->clickwin);
|
||||
e_object_del(E_OBJECT(esw->popup));
|
||||
free(esw);
|
||||
}
|
||||
|
||||
static int
|
||||
_e_appwin_cb_animate(void *data)
|
||||
{
|
||||
E_Appwin *esw;
|
||||
double t, v;
|
||||
|
||||
esw = data;
|
||||
t = ecore_loop_time_get() - esw->start;
|
||||
if (t > esw->len) t = esw->len;
|
||||
v = t / esw->len;
|
||||
v = 1.0 - v;
|
||||
v = v * v * v * v;
|
||||
v = 1.0 - v;
|
||||
esw->adjust = (esw->adjust_target * v) + (esw->adjust_start * (1.0 - v));
|
||||
e_popup_move(esw->popup,
|
||||
esw->zone->x,
|
||||
esw->zone->y + esw->zone->h - esw->adjust);
|
||||
if (t == esw->len)
|
||||
{
|
||||
esw->animator = NULL;
|
||||
if (esw->out)
|
||||
edje_object_signal_emit(esw->base_obj, "e,state,out,end", "e");
|
||||
else
|
||||
{
|
||||
edje_object_signal_emit(esw->base_obj, "e,state,in,end", "e");
|
||||
while (esw->borders)
|
||||
{
|
||||
Win_Entry *ent;
|
||||
|
||||
ent = esw->borders->data;
|
||||
evas_object_del(ent->icon);
|
||||
e_object_unref(E_OBJECT(ent->border));
|
||||
esw->borders = eina_list_remove_list(esw->borders, esw->borders);
|
||||
free(ent);
|
||||
}
|
||||
e_widget_ilist_freeze(esw->ilist_obj);
|
||||
e_widget_ilist_clear(esw->ilist_obj);
|
||||
e_widget_ilist_thaw(esw->ilist_obj);
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
return 1;
|
||||
}
|
||||
|
||||
static void
|
||||
_e_appwin_slide(E_Appwin *esw, int out, double len)
|
||||
{
|
||||
if (out == esw->out) return;
|
||||
if (len == 0.0) len = 0.000001; /* FIXME: handle len = 0.0 case */
|
||||
|
||||
if (!esw->animator)
|
||||
esw->animator = ecore_animator_add(_e_appwin_cb_animate, esw);
|
||||
esw->start = ecore_loop_time_get();
|
||||
esw->len = len;
|
||||
esw->out = out;
|
||||
esw->adjust_start = esw->adjust;
|
||||
if (esw->out) esw->adjust_target = esw->popup->h;
|
||||
else esw->adjust_target = 0;
|
||||
if (esw->out)
|
||||
{
|
||||
edje_object_signal_emit(esw->base_obj, "e,state,out,begin", "e");
|
||||
ecore_x_window_configure(esw->clickwin,
|
||||
ECORE_X_WINDOW_CONFIGURE_MASK_SIBLING|ECORE_X_WINDOW_CONFIGURE_MASK_STACK_MODE,
|
||||
0, 0, 0, 0, 0,
|
||||
esw->popup->evas_win,
|
||||
ECORE_X_WINDOW_STACK_BELOW);
|
||||
ecore_x_window_show(esw->clickwin);
|
||||
}
|
||||
else
|
||||
{
|
||||
edje_object_signal_emit(esw->base_obj, "e,state,in,begin", "e");
|
||||
ecore_x_window_hide(esw->clickwin);
|
||||
}
|
||||
}
|
||||
|
||||
static int
|
||||
_e_appwin_cb_mouse_up(void *data, int type, void *event)
|
||||
{
|
||||
Ecore_X_Event_Mouse_Button_Up *ev;
|
||||
E_Appwin *esw;
|
||||
|
||||
ev = event;
|
||||
esw = data;
|
||||
if (ev->win == esw->clickwin)
|
||||
{
|
||||
if (esw->out) _e_appwin_slide(esw, 0, 1.0);
|
||||
else _e_appwin_slide(esw, 1, 1.0);
|
||||
}
|
||||
return 1;
|
||||
}
|
||||
|
||||
static int
|
||||
_e_appwin_cb_zone_move_resize(void *data, int type, void *event)
|
||||
{
|
||||
E_Event_Zone_Move_Resize *ev;
|
||||
E_Appwin *esw;
|
||||
|
||||
ev = event;
|
||||
esw = data;
|
||||
if (esw->zone == ev->zone)
|
||||
{
|
||||
/* FIXME: handle new size pants */
|
||||
}
|
||||
return 1;
|
||||
}
|
||||
|
||||
static int
|
||||
_e_appwin_cb_zone_del(void *data, int type, void *event)
|
||||
{
|
||||
E_Event_Zone_Del *ev;
|
||||
E_Appwin *esw;
|
||||
|
||||
ev = event;
|
||||
esw = data;
|
||||
if (esw->zone == ev->zone)
|
||||
{
|
||||
e_object_del(E_OBJECT(esw));
|
||||
}
|
||||
return 1;
|
||||
}
|
||||
|
||||
static void
|
||||
_e_appwin_event_simple_free(void *data, void *ev)
|
||||
{
|
||||
struct _E_Event_Appwin_Simple *e;
|
||||
|
||||
e = ev;
|
||||
e_object_unref(E_OBJECT(e->appwin));
|
||||
free(e);
|
||||
}
|
||||
|
||||
static void
|
||||
_e_appwin_object_del_attach(void *o)
|
||||
{
|
||||
E_Appwin *esw;
|
||||
E_Event_Appwin_Del *ev;
|
||||
|
||||
if (e_object_is_del(E_OBJECT(o))) return;
|
||||
esw = o;
|
||||
while (esw->borders)
|
||||
{
|
||||
Win_Entry *ent;
|
||||
|
||||
ent = esw->borders->data;
|
||||
evas_object_del(ent->icon);
|
||||
e_object_unref(E_OBJECT(ent->border));
|
||||
esw->borders = eina_list_remove_list(esw->borders, esw->borders);
|
||||
free(ent);
|
||||
}
|
||||
ev = calloc(1, sizeof(E_Event_Appwin_Del));
|
||||
ev->appwin = esw;
|
||||
e_object_ref(E_OBJECT(esw));
|
||||
ecore_event_add(E_EVENT_APPWIN_DEL, ev,
|
||||
_e_appwin_event_simple_free, NULL);
|
||||
}
|
||||
|
||||
static void
|
||||
_e_appwin_cb_item_sel(void *data)
|
||||
{
|
||||
Win_Entry *ent;
|
||||
|
||||
ent = data;
|
||||
if (ent->appwin->callback.func)
|
||||
ent->appwin->callback.func(ent->appwin->callback.data, ent->appwin, ent->border);
|
||||
e_appwin_hide(ent->appwin);
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
static Evas_Object *
|
||||
_theme_obj_new(Evas *e, const char *custom_dir, const char *group)
|
||||
{
|
||||
Evas_Object *o;
|
||||
|
||||
o = edje_object_add(e);
|
||||
if (!e_theme_edje_object_set(o, "base/theme/modules/illume", group))
|
||||
{
|
||||
if (custom_dir)
|
||||
{
|
||||
char buf[PATH_MAX];
|
||||
|
||||
snprintf(buf, sizeof(buf), "%s/illume.edj", custom_dir);
|
||||
if (edje_object_file_set(o, buf, group))
|
||||
{
|
||||
printf("OK FALLBACK %s\n", buf);
|
||||
}
|
||||
}
|
||||
}
|
||||
return o;
|
||||
}
|
||||
|
|
@ -0,0 +1,48 @@
|
|||
#ifndef E_APPWIN_H
|
||||
#define E_APPWIN_H
|
||||
|
||||
typedef struct _E_Appwin E_Appwin;
|
||||
typedef struct _E_Event_Appwin_Simple E_Event_Appwin_Del;
|
||||
|
||||
#define E_APPWIN_TYPE 0xE1b0983
|
||||
|
||||
struct _E_Appwin
|
||||
{
|
||||
E_Object e_obj_inherit;
|
||||
E_Zone *zone;
|
||||
E_Popup *popup;
|
||||
Ecore_X_Window clickwin;
|
||||
Evas_Object *base_obj;
|
||||
Evas_Object *ilist_obj;
|
||||
Eina_List *handlers;
|
||||
E_Border *focused_border;
|
||||
Eina_List *borders;
|
||||
struct {
|
||||
void (*func) (void *data, E_Appwin *ess, E_Border *bd);
|
||||
const void *data;
|
||||
} callback;
|
||||
const char *themedir;
|
||||
Ecore_Animator *animator;
|
||||
int adjust_start;
|
||||
int adjust_target;
|
||||
int adjust;
|
||||
double start;
|
||||
double len;
|
||||
unsigned char out : 1;
|
||||
};
|
||||
|
||||
struct _E_Event_Appwin_Simple
|
||||
{
|
||||
E_Appwin *appwin;
|
||||
};
|
||||
|
||||
EAPI int e_appwin_init(void);
|
||||
EAPI int e_appwin_shutdown(void);
|
||||
EAPI E_Appwin *e_appwin_new(E_Zone *zone, const char *themedir);
|
||||
EAPI void e_appwin_show(E_Appwin *esw);
|
||||
EAPI void e_appwin_hide(E_Appwin *esw);
|
||||
EAPI void e_appwin_border_select_callback_set(E_Appwin *esw, void (*func) (void *data, E_Appwin *ess, E_Border *bd), const void *data);
|
||||
|
||||
extern EAPI int E_EVENT_APPWIN_DEL;
|
||||
|
||||
#endif
|
|
@ -8,6 +8,9 @@
|
|||
#include "e_busywin.h"
|
||||
#include "e_simplelock.h"
|
||||
#include "e_flaunch.h"
|
||||
#include "e_slipwin.h"
|
||||
#include "e_appwin.h"
|
||||
#include "e_syswin.h"
|
||||
|
||||
#include "e_mod_main.h"
|
||||
#include "e_mod_layout.h"
|
||||
|
@ -40,6 +43,8 @@ e_modapi_init(E_Module *m)
|
|||
e_pwr_init();
|
||||
e_flaunch_init();
|
||||
e_simplelock_init(m);
|
||||
e_appwin_init();
|
||||
e_syswin_init();
|
||||
_e_mod_layout_init(m);
|
||||
_e_mod_win_init(m);
|
||||
|
||||
|
@ -65,6 +70,8 @@ e_modapi_shutdown(E_Module *m)
|
|||
|
||||
_e_mod_win_shutdown();
|
||||
_e_mod_layout_shutdown();
|
||||
e_syswin_shutdown();
|
||||
e_appwin_shutdown();
|
||||
e_simplelock_shutdown();
|
||||
e_flaunch_shutdown();
|
||||
e_pwr_shutdown();
|
||||
|
|
|
@ -10,6 +10,8 @@
|
|||
#include "e_cfg.h"
|
||||
#include "e_flaunch.h"
|
||||
#include "e_pwr.h"
|
||||
#include "e_appwin.h"
|
||||
#include "e_syswin.h"
|
||||
|
||||
/* internal calls */
|
||||
static void _cb_cfg_exec(const void *data, E_Container *con, const char *params, Efreet_Desktop *desktop);
|
||||
|
@ -64,6 +66,8 @@ static E_Kbd_Int *vkbd_int = NULL;
|
|||
static E_Busywin *busywin = NULL;
|
||||
static E_Busywin *busycover = NULL;
|
||||
static E_Flaunch *flaunch = NULL;
|
||||
static E_Appwin *appwin = NULL;
|
||||
static E_Syswin *syswin = NULL;
|
||||
|
||||
/* called from the module core */
|
||||
void
|
||||
|
@ -100,6 +104,9 @@ _e_mod_win_init(E_Module *m)
|
|||
|
||||
slipwin = e_slipwin_new(zone, e_module_dir_get(m));
|
||||
e_slipwin_border_select_callback_set(slipwin, _cb_slipwin_select, NULL);
|
||||
|
||||
appwin = e_appwin_new(zone, e_module_dir_get(m));
|
||||
syswin = e_syswin_new(zone, e_module_dir_get(m));
|
||||
|
||||
vkbd = e_kbd_new(zone,
|
||||
e_module_dir_get(m),
|
||||
|
@ -167,6 +174,10 @@ _e_mod_win_shutdown(void)
|
|||
slipshelf = NULL;
|
||||
e_object_del(E_OBJECT(slipwin));
|
||||
slipwin = NULL;
|
||||
e_object_del(E_OBJECT(appwin));
|
||||
appwin = NULL;
|
||||
e_object_del(E_OBJECT(syswin));
|
||||
syswin = NULL;
|
||||
}
|
||||
|
||||
static Ecore_Exe *_kbd_exe = NULL;
|
||||
|
@ -633,7 +644,7 @@ _cb_slipshelf_close(const void *data, E_Slipshelf *ess, E_Slipshelf_Action actio
|
|||
}
|
||||
else
|
||||
{
|
||||
// FIXME: poower/shutdown menu
|
||||
e_syswin_show(slipwin);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -0,0 +1,420 @@
|
|||
#include "e.h"
|
||||
#include "e_syswin.h"
|
||||
|
||||
typedef struct _Win_Entry Win_Entry;
|
||||
|
||||
struct _Win_Entry
|
||||
{
|
||||
E_Syswin *syswin;
|
||||
E_Border *border;
|
||||
Evas_Object *icon;
|
||||
};
|
||||
|
||||
EAPI int E_EVENT_SYSWIN_DEL = 0;
|
||||
|
||||
/* internal calls */
|
||||
|
||||
E_Syswin *_e_syswin_new(E_Zone *zone, const char *themedir);
|
||||
static void _e_syswin_free(E_Syswin *ess);
|
||||
static int _e_syswin_cb_animate(void *data);
|
||||
static void _e_syswin_slide(E_Syswin *ess, int out, double len);
|
||||
static int _e_syswin_cb_mouse_up(void *data, int type, void *event);
|
||||
static int _e_syswin_cb_zone_move_resize(void *data, int type, void *event);
|
||||
static int _e_syswin_cb_zone_del(void *data, int type, void *event);
|
||||
static void _e_syswin_event_simple_free(void *data, void *ev);
|
||||
static void _e_syswin_object_del_attach(void *o);
|
||||
static void _e_syswin_cb_item_sel(void *data);
|
||||
|
||||
static Evas_Object *_theme_obj_new(Evas *e, const char *custom_dir, const char *group);
|
||||
|
||||
/* state */
|
||||
static Eina_List *syswins = NULL;
|
||||
|
||||
/* called from the module core */
|
||||
EAPI int
|
||||
e_syswin_init(void)
|
||||
{
|
||||
E_EVENT_SYSWIN_DEL = ecore_event_type_new();
|
||||
return 1;
|
||||
}
|
||||
|
||||
EAPI int
|
||||
e_syswin_shutdown(void)
|
||||
{
|
||||
return 1;
|
||||
}
|
||||
|
||||
EAPI E_Syswin *
|
||||
e_syswin_new(E_Zone *zone, const char *themedir)
|
||||
{
|
||||
E_Syswin *esw;
|
||||
Evas_Coord mw, mh;
|
||||
int x, y;
|
||||
Evas_Object *o;
|
||||
|
||||
esw = E_OBJECT_ALLOC(E_Syswin, E_SYSWIN_TYPE, _e_syswin_free);
|
||||
if (!esw) return NULL;
|
||||
|
||||
esw->zone = zone;
|
||||
if (themedir) esw->themedir = evas_stringshare_add(themedir);
|
||||
|
||||
esw->clickwin = ecore_x_window_input_new(zone->container->win,
|
||||
zone->x, zone->y, zone->w, zone->h);
|
||||
esw->popup = e_popup_new(esw->zone, -1, -1, 1, 1);
|
||||
ecore_x_window_configure(esw->clickwin,
|
||||
ECORE_X_WINDOW_CONFIGURE_MASK_SIBLING|ECORE_X_WINDOW_CONFIGURE_MASK_STACK_MODE,
|
||||
0, 0, 0, 0, 0,
|
||||
esw->popup->evas_win,
|
||||
ECORE_X_WINDOW_STACK_BELOW);
|
||||
e_popup_layer_set(esw->popup, 220);
|
||||
|
||||
esw->base_obj = _theme_obj_new(esw->popup->evas,
|
||||
esw->themedir,
|
||||
"e/modules/syswin/base/default");
|
||||
|
||||
esw->focused_border = e_border_focused_get();
|
||||
|
||||
edje_object_size_min_calc(esw->base_obj, &mw, &mh);
|
||||
|
||||
o = e_widget_ilist_add(esw->popup->evas, 32 * e_scale, 32 * e_scale, NULL);
|
||||
esw->ilist_obj = o;
|
||||
e_widget_ilist_selector_set(o, 1);
|
||||
edje_object_part_swallow(esw->base_obj, "e.swallow.content", o);
|
||||
evas_object_show(o);
|
||||
|
||||
x = zone->x;
|
||||
y = zone->y + zone->h;
|
||||
mw = zone->w;
|
||||
|
||||
mh = 300;
|
||||
|
||||
e_popup_move_resize(esw->popup, x, y, mw, mh);
|
||||
|
||||
evas_object_resize(esw->base_obj, esw->popup->w, esw->popup->h);
|
||||
e_popup_edje_bg_object_set(esw->popup, esw->base_obj);
|
||||
evas_object_show(esw->base_obj);
|
||||
|
||||
e_popup_show(esw->popup);
|
||||
|
||||
syswins = eina_list_append(syswins, esw);
|
||||
|
||||
esw->handlers = eina_list_append
|
||||
(esw->handlers,
|
||||
ecore_event_handler_add(ECORE_X_EVENT_MOUSE_BUTTON_UP,
|
||||
_e_syswin_cb_mouse_up, esw));
|
||||
|
||||
e_object_del_attach_func_set(E_OBJECT(esw), _e_syswin_object_del_attach);
|
||||
|
||||
return esw;
|
||||
}
|
||||
|
||||
EAPI void
|
||||
e_syswin_show(E_Syswin *esw)
|
||||
{
|
||||
Evas_Object *o;
|
||||
Evas_Coord mw, mh, vw, vh, w, h;
|
||||
Eina_List *borders, *l;
|
||||
Win_Entry *ent;
|
||||
int i, selnum;
|
||||
|
||||
E_OBJECT_CHECK(esw);
|
||||
E_OBJECT_TYPE_CHECK(esw, E_SYSWIN_TYPE);
|
||||
|
||||
while (esw->borders)
|
||||
{
|
||||
ent = esw->borders->data;
|
||||
evas_object_del(ent->icon);
|
||||
e_object_unref(E_OBJECT(ent->border));
|
||||
esw->borders = eina_list_remove_list(esw->borders, esw->borders);
|
||||
free(ent);
|
||||
}
|
||||
e_widget_ilist_freeze(esw->ilist_obj);
|
||||
e_widget_ilist_clear(esw->ilist_obj);
|
||||
e_widget_ilist_thaw(esw->ilist_obj);
|
||||
|
||||
borders = e_border_client_list();
|
||||
selnum = -1;
|
||||
e_widget_ilist_freeze(esw->ilist_obj);
|
||||
for (i = 0, l = borders; l; l = l->next)
|
||||
{
|
||||
E_Border *bd;
|
||||
Evas_Object *ic;
|
||||
const char *title;
|
||||
|
||||
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_object_ref(E_OBJECT(bd));
|
||||
title = "???";
|
||||
if (bd->client.netwm.name) title = bd->client.netwm.name;
|
||||
else if (bd->client.icccm.title) title = bd->client.icccm.title;
|
||||
ic = e_border_icon_add(bd, esw->popup->evas);
|
||||
ent = calloc(1, sizeof(Win_Entry));
|
||||
ent->syswin = esw;
|
||||
ent->border = bd;
|
||||
ent->icon = ic;
|
||||
esw->borders = evas_list_append(esw->borders, ent);
|
||||
e_widget_ilist_append(esw->ilist_obj, ic, title, _e_syswin_cb_item_sel, ent, NULL);
|
||||
if (bd == e_border_focused_get()) selnum = i;
|
||||
i++;
|
||||
}
|
||||
e_widget_ilist_thaw(esw->ilist_obj);
|
||||
|
||||
if (selnum >= 0) e_widget_ilist_selected_set(esw->ilist_obj, selnum);
|
||||
|
||||
e_widget_ilist_go(esw->ilist_obj);
|
||||
|
||||
e_widget_ilist_preferred_size_get(esw->ilist_obj, &mw, &mh);
|
||||
edje_extern_object_min_size_set(esw->ilist_obj, mw, mh);
|
||||
edje_object_part_swallow(esw->base_obj, "e.swallow.content", esw->ilist_obj);
|
||||
|
||||
edje_object_size_min_calc(esw->base_obj, &mw, &mh);
|
||||
|
||||
edje_extern_object_min_size_set(esw->ilist_obj, 0, 0);
|
||||
|
||||
|
||||
edje_object_part_swallow(esw->base_obj, "e.swallow.content", esw->ilist_obj);
|
||||
|
||||
mw = esw->zone->w;
|
||||
if (mh > esw->zone->h) mh = esw->zone->h;
|
||||
e_popup_resize(esw->popup, mw, mh);
|
||||
|
||||
evas_object_resize(esw->base_obj, esw->popup->w, esw->popup->h);
|
||||
|
||||
_e_syswin_slide(esw, 1, 1.0);
|
||||
}
|
||||
|
||||
EAPI void
|
||||
e_syswin_hide(E_Syswin *esw)
|
||||
{
|
||||
E_OBJECT_CHECK(esw);
|
||||
E_OBJECT_TYPE_CHECK(esw, E_SYSWIN_TYPE);
|
||||
|
||||
_e_syswin_slide(esw, 0, 1.0);
|
||||
}
|
||||
|
||||
EAPI void
|
||||
e_syswin_border_select_callback_set(E_Syswin *esw, void (*func) (void *data, E_Syswin *ess, E_Border *bd), const void *data)
|
||||
{
|
||||
E_OBJECT_CHECK(esw);
|
||||
E_OBJECT_TYPE_CHECK(esw, E_SYSWIN_TYPE);
|
||||
esw->callback.func = func;
|
||||
esw->callback.data = data;
|
||||
}
|
||||
|
||||
/* internal calls */
|
||||
static void
|
||||
_e_syswin_free(E_Syswin *esw)
|
||||
{
|
||||
syswins = eina_list_remove(syswins, esw);
|
||||
while (esw->handlers)
|
||||
{
|
||||
if (esw->handlers->data)
|
||||
ecore_event_handler_del(esw->handlers->data);
|
||||
esw->handlers = eina_list_remove_list(esw->handlers, esw->handlers);
|
||||
}
|
||||
if (esw->animator) ecore_animator_del(esw->animator);
|
||||
if (esw->themedir) evas_stringshare_del(esw->themedir);
|
||||
ecore_x_window_del(esw->clickwin);
|
||||
e_object_del(E_OBJECT(esw->popup));
|
||||
free(esw);
|
||||
}
|
||||
|
||||
static int
|
||||
_e_syswin_cb_animate(void *data)
|
||||
{
|
||||
E_Syswin *esw;
|
||||
double t, v;
|
||||
|
||||
esw = data;
|
||||
t = ecore_loop_time_get() - esw->start;
|
||||
if (t > esw->len) t = esw->len;
|
||||
v = t / esw->len;
|
||||
v = 1.0 - v;
|
||||
v = v * v * v * v;
|
||||
v = 1.0 - v;
|
||||
esw->adjust = (esw->adjust_target * v) + (esw->adjust_start * (1.0 - v));
|
||||
e_popup_move(esw->popup,
|
||||
esw->zone->x,
|
||||
esw->zone->y + esw->zone->h - esw->adjust);
|
||||
if (t == esw->len)
|
||||
{
|
||||
esw->animator = NULL;
|
||||
if (esw->out)
|
||||
edje_object_signal_emit(esw->base_obj, "e,state,out,end", "e");
|
||||
else
|
||||
{
|
||||
edje_object_signal_emit(esw->base_obj, "e,state,in,end", "e");
|
||||
while (esw->borders)
|
||||
{
|
||||
Win_Entry *ent;
|
||||
|
||||
ent = esw->borders->data;
|
||||
evas_object_del(ent->icon);
|
||||
e_object_unref(E_OBJECT(ent->border));
|
||||
esw->borders = eina_list_remove_list(esw->borders, esw->borders);
|
||||
free(ent);
|
||||
}
|
||||
e_widget_ilist_freeze(esw->ilist_obj);
|
||||
e_widget_ilist_clear(esw->ilist_obj);
|
||||
e_widget_ilist_thaw(esw->ilist_obj);
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
return 1;
|
||||
}
|
||||
|
||||
static void
|
||||
_e_syswin_slide(E_Syswin *esw, int out, double len)
|
||||
{
|
||||
if (out == esw->out) return;
|
||||
if (len == 0.0) len = 0.000001; /* FIXME: handle len = 0.0 case */
|
||||
|
||||
if (!esw->animator)
|
||||
esw->animator = ecore_animator_add(_e_syswin_cb_animate, esw);
|
||||
esw->start = ecore_loop_time_get();
|
||||
esw->len = len;
|
||||
esw->out = out;
|
||||
esw->adjust_start = esw->adjust;
|
||||
if (esw->out) esw->adjust_target = esw->popup->h;
|
||||
else esw->adjust_target = 0;
|
||||
if (esw->out)
|
||||
{
|
||||
edje_object_signal_emit(esw->base_obj, "e,state,out,begin", "e");
|
||||
ecore_x_window_configure(esw->clickwin,
|
||||
ECORE_X_WINDOW_CONFIGURE_MASK_SIBLING|ECORE_X_WINDOW_CONFIGURE_MASK_STACK_MODE,
|
||||
0, 0, 0, 0, 0,
|
||||
esw->popup->evas_win,
|
||||
ECORE_X_WINDOW_STACK_BELOW);
|
||||
ecore_x_window_show(esw->clickwin);
|
||||
}
|
||||
else
|
||||
{
|
||||
edje_object_signal_emit(esw->base_obj, "e,state,in,begin", "e");
|
||||
ecore_x_window_hide(esw->clickwin);
|
||||
}
|
||||
}
|
||||
|
||||
static int
|
||||
_e_syswin_cb_mouse_up(void *data, int type, void *event)
|
||||
{
|
||||
Ecore_X_Event_Mouse_Button_Up *ev;
|
||||
E_Syswin *esw;
|
||||
|
||||
ev = event;
|
||||
esw = data;
|
||||
if (ev->win == esw->clickwin)
|
||||
{
|
||||
if (esw->out) _e_syswin_slide(esw, 0, 1.0);
|
||||
else _e_syswin_slide(esw, 1, 1.0);
|
||||
}
|
||||
return 1;
|
||||
}
|
||||
|
||||
static int
|
||||
_e_syswin_cb_zone_move_resize(void *data, int type, void *event)
|
||||
{
|
||||
E_Event_Zone_Move_Resize *ev;
|
||||
E_Syswin *esw;
|
||||
|
||||
ev = event;
|
||||
esw = data;
|
||||
if (esw->zone == ev->zone)
|
||||
{
|
||||
/* FIXME: handle new size pants */
|
||||
}
|
||||
return 1;
|
||||
}
|
||||
|
||||
static int
|
||||
_e_syswin_cb_zone_del(void *data, int type, void *event)
|
||||
{
|
||||
E_Event_Zone_Del *ev;
|
||||
E_Syswin *esw;
|
||||
|
||||
ev = event;
|
||||
esw = data;
|
||||
if (esw->zone == ev->zone)
|
||||
{
|
||||
e_object_del(E_OBJECT(esw));
|
||||
}
|
||||
return 1;
|
||||
}
|
||||
|
||||
static void
|
||||
_e_syswin_event_simple_free(void *data, void *ev)
|
||||
{
|
||||
struct _E_Event_Syswin_Simple *e;
|
||||
|
||||
e = ev;
|
||||
e_object_unref(E_OBJECT(e->syswin));
|
||||
free(e);
|
||||
}
|
||||
|
||||
static void
|
||||
_e_syswin_object_del_attach(void *o)
|
||||
{
|
||||
E_Syswin *esw;
|
||||
E_Event_Syswin_Del *ev;
|
||||
|
||||
if (e_object_is_del(E_OBJECT(o))) return;
|
||||
esw = o;
|
||||
while (esw->borders)
|
||||
{
|
||||
Win_Entry *ent;
|
||||
|
||||
ent = esw->borders->data;
|
||||
evas_object_del(ent->icon);
|
||||
e_object_unref(E_OBJECT(ent->border));
|
||||
esw->borders = eina_list_remove_list(esw->borders, esw->borders);
|
||||
free(ent);
|
||||
}
|
||||
ev = calloc(1, sizeof(E_Event_Syswin_Del));
|
||||
ev->syswin = esw;
|
||||
e_object_ref(E_OBJECT(esw));
|
||||
ecore_event_add(E_EVENT_SYSWIN_DEL, ev,
|
||||
_e_syswin_event_simple_free, NULL);
|
||||
}
|
||||
|
||||
static void
|
||||
_e_syswin_cb_item_sel(void *data)
|
||||
{
|
||||
Win_Entry *ent;
|
||||
|
||||
ent = data;
|
||||
if (ent->syswin->callback.func)
|
||||
ent->syswin->callback.func(ent->syswin->callback.data, ent->syswin, ent->border);
|
||||
e_syswin_hide(ent->syswin);
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
static Evas_Object *
|
||||
_theme_obj_new(Evas *e, const char *custom_dir, const char *group)
|
||||
{
|
||||
Evas_Object *o;
|
||||
|
||||
o = edje_object_add(e);
|
||||
if (!e_theme_edje_object_set(o, "base/theme/modules/illume", group))
|
||||
{
|
||||
if (custom_dir)
|
||||
{
|
||||
char buf[PATH_MAX];
|
||||
|
||||
snprintf(buf, sizeof(buf), "%s/illume.edj", custom_dir);
|
||||
if (edje_object_file_set(o, buf, group))
|
||||
{
|
||||
printf("OK FALLBACK %s\n", buf);
|
||||
}
|
||||
}
|
||||
}
|
||||
return o;
|
||||
}
|
||||
|
|
@ -0,0 +1,48 @@
|
|||
#ifndef E_SYSWIN_H
|
||||
#define E_SYSWIN_H
|
||||
|
||||
typedef struct _E_Syswin E_Syswin;
|
||||
typedef struct _E_Event_Syswin_Simple E_Event_Syswin_Del;
|
||||
|
||||
#define E_SYSWIN_TYPE 0xE1b0993
|
||||
|
||||
struct _E_Syswin
|
||||
{
|
||||
E_Object e_obj_inherit;
|
||||
E_Zone *zone;
|
||||
E_Popup *popup;
|
||||
Ecore_X_Window clickwin;
|
||||
Evas_Object *base_obj;
|
||||
Evas_Object *ilist_obj;
|
||||
Eina_List *handlers;
|
||||
E_Border *focused_border;
|
||||
Eina_List *borders;
|
||||
struct {
|
||||
void (*func) (void *data, E_Syswin *ess, E_Border *bd);
|
||||
const void *data;
|
||||
} callback;
|
||||
const char *themedir;
|
||||
Ecore_Animator *animator;
|
||||
int adjust_start;
|
||||
int adjust_target;
|
||||
int adjust;
|
||||
double start;
|
||||
double len;
|
||||
unsigned char out : 1;
|
||||
};
|
||||
|
||||
struct _E_Event_Syswin_Simple
|
||||
{
|
||||
E_Syswin *syswin;
|
||||
};
|
||||
|
||||
EAPI int e_syswin_init(void);
|
||||
EAPI int e_syswin_shutdown(void);
|
||||
EAPI E_Syswin *e_syswin_new(E_Zone *zone, const char *themedir);
|
||||
EAPI void e_syswin_show(E_Syswin *esw);
|
||||
EAPI void e_syswin_hide(E_Syswin *esw);
|
||||
EAPI void e_syswin_border_select_callback_set(E_Syswin *esw, void (*func) (void *data, E_Syswin *ess, E_Border *bd), const void *data);
|
||||
|
||||
extern EAPI int E_EVENT_SYSWIN_DEL;
|
||||
|
||||
#endif
|
Loading…
Reference in New Issue