enlightenment/src/modules/everything/evry_plug_border_act.c

224 lines
4.2 KiB
C

#include "e.h"
#include "e_mod_main.h"
typedef struct _Inst Inst;
struct _Inst
{
E_Border *border;
};
static Evry_Plugin *p;
static Inst *inst;
static void
_act_cb_border_switch_to(E_Border *bd)
{
E_Zone *zone;
zone = e_util_zone_current_get(e_manager_current_get());
if (bd->desk != (e_desk_current_get(zone)))
e_desk_show(bd->desk);
if (bd->shaded)
e_border_unshade(bd, E_DIRECTION_UP);
if (bd->iconic)
e_border_uniconify(bd);
else
e_border_raise(bd);
/* e_border_focus_set(bd, 1, 1); */
e_border_focus_set_with_pointer(bd);
}
static void
_act_cb_border_fullscreen(E_Border *bd)
{
if (!bd->fullscreen)
e_border_fullscreen(bd, E_FULLSCREEN_RESIZE);
else
e_border_unfullscreen(bd);
}
static void
_act_cb_border_close(E_Border *bd)
{
if (!bd->lock_close) e_border_act_close_begin(bd);
}
static void
_act_cb_border_minimize(E_Border *bd)
{
if (!bd->lock_user_iconify) e_border_iconify(bd);
}
static void
_act_cb_border_unminimize(E_Border *bd)
{
if (!bd->lock_user_iconify) e_border_uniconify(bd);
}
static int
_begin(Evry_Plugin *p __UNUSED__, const Evry_Item *item)
{
E_Border *bd;
bd = item->data[0];
/* e_object_ref(E_OBJECT(bd)); */
inst->border = bd;
return 1;
}
static int
_cb_sort(const void *data1, const void *data2)
{
const Evry_Item *it1, *it2;
it1 = data1;
it2 = data2;
return (it1->priority - it2->priority);
}
static void
_item_add(Evry_Plugin *p, const char *label, void (*action_cb) (E_Border *bd), const char *icon, char *m1, char *m2)
{
Evry_Item *it;
int prio = 1;
if (m1[0] && m2[0])
{
if (e_util_glob_case_match(label, m1))
prio = 1;
else if (e_util_glob_case_match(label, m2))
prio = 2;
else
prio = 0;
}
if (!prio) return;
it = evry_item_new(p, label);
it->data[0] = action_cb;
it->data[1] = (void *) eina_stringshare_add(icon);
it->priority = prio;
p->items = eina_list_prepend(p->items, it);
}
static void
_cleanup(Evry_Plugin *p)
{
Evry_Item *it;
EINA_LIST_FREE(p->items, it)
{
if (it->data[1]) eina_stringshare_del((const char *)it->data[1]);
evry_item_free(it);
}
}
static int
_fetch(Evry_Plugin *p, const char *input __UNUSED__)
{
char m1[128];
char m2[128];
_cleanup(p);
if (input)
{
snprintf(m1, sizeof(m1), "%s*", input);
snprintf(m2, sizeof(m2), "*%s*", input);
}
else
{
m1[0] = 0;
m2[0] = 0;
}
_item_add(p, _("Switch To"), _act_cb_border_switch_to, "go-next", m1, m2);
if (inst->border->iconic)
_item_add(p, _("Uniconify"), _act_cb_border_unminimize, "window-minimize", m1, m2);
else
_item_add(p, _("Iconify"), _act_cb_border_minimize, "window-minimize", m1, m2);
if (!inst->border->fullscreen)
_item_add(p, _("Fullscreen"), _act_cb_border_fullscreen, "view-fullscreen", m1, m2);
else
_item_add(p, _("Unfullscreen"), _act_cb_border_fullscreen, "view-restore", m1, m2);
_item_add(p, _("Close"), _act_cb_border_close, "window-close", m1, m2);
if (eina_list_count(p->items) > 0)
{
p->items = eina_list_sort(p->items, eina_list_count(p->items), _cb_sort);
return 1;
}
return 0;
}
static int
_action(Evry_Plugin *p __UNUSED__, const Evry_Item *item, const char *input __UNUSED__)
{
void (*border_action) (E_Border *bd);
border_action = item->data[0];
border_action(inst->border);
return EVRY_ACTION_FINISHED;
}
static Evas_Object *
_item_icon_get(Evry_Plugin *p __UNUSED__, const Evry_Item *it, Evas *e)
{
Evas_Object *o;
o = e_icon_add(e);
evry_icon_theme_set(o, (const char *)it->data[1]);
/* icon = edje_object_add(e);
* e_theme_edje_object_set(icon, "base/theme/borders", (const char *)it->data[1]); */
return o;
}
static Eina_Bool
_init(void)
{
p = E_NEW(Evry_Plugin, 1);
p->name = "Window Action";
p->type = type_action;
p->type_in = "BORDER";
p->type_out = "NONE";
p->need_query = 0;
p->begin = &_begin;
p->fetch = &_fetch;
p->action = &_action;
p->cleanup = &_cleanup;
p->icon_get = &_item_icon_get;
evry_plugin_register(p);
inst = E_NEW(Inst, 1);
return EINA_TRUE;
}
static void
_shutdown(void)
{
evry_plugin_unregister(p);
E_FREE(p);
E_FREE(inst);
}
EINA_MODULE_INIT(_init);
EINA_MODULE_SHUTDOWN(_shutdown);