enlightenment/src/modules/everything/evry_plug_border_act.c

235 lines
4.5 KiB
C

#include "Evry.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_to_desktop(E_Border *bd)
{
E_Zone *zone;
E_Desk *desk;
zone = e_util_zone_current_get(e_manager_current_get());
desk = e_desk_current_get(zone);
e_border_desk_set(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 Evry_Plugin *
_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 p;
}
static int
_cb_sort(const void *data1, const void *data2)
{
const Evry_Item *it1 = data1;
const Evry_Item *it2 = data2;
return (it1->fuzzy_match - it2->fuzzy_match);
}
static void
_item_free(Evry_Item *it)
{
if (it->data[1]) eina_stringshare_del((const char *)it->data[1]);
}
static void
_item_add(Evry_Plugin *p, const char *label, void (*action_cb) (E_Border *bd), const char *icon, const char *input)
{
Evry_Item *it;
int match = 1;
if (input)
match = evry_fuzzy_match(label, input);
if (!match) return;
it = evry_item_new(p, label, _item_free);
it->data[0] = action_cb;
it->data[1] = (void *) eina_stringshare_add(icon);
it->fuzzy_match = match;
p->items = eina_list_prepend(p->items, it);
}
static void
_cleanup(Evry_Plugin *p)
{
Evry_Item *it;
EINA_LIST_FREE(p->items, it)
evry_item_free(it);
}
static int
_fetch(Evry_Plugin *p, const char *input)
{
E_Zone *zone;
E_Desk *desk;
zone = e_util_zone_current_get(e_manager_current_get());
desk = e_desk_current_get(zone);
_cleanup(p);
_item_add(p, _("Switch to Window"),
_act_cb_border_switch_to,
"go-next", input);
if (desk != inst->border->desk)
_item_add(p, _("Send to Deskop"),
_act_cb_border_to_desktop,
"go-previous", input);
if (inst->border->iconic)
_item_add(p, _("Uniconify"),
_act_cb_border_unminimize,
"window-minimize", input);
else
_item_add(p, _("Iconify"),
_act_cb_border_minimize,
"window-minimize", input);
if (!inst->border->fullscreen)
_item_add(p, _("Fullscreen"),
_act_cb_border_fullscreen,
"view-fullscreen", input);
else
_item_add(p, _("Unfullscreen"),
_act_cb_border_fullscreen,
"view-restore", input);
_item_add(p, _("Close"),
_act_cb_border_close,
"window-close", input);
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 = evry_icon_theme_get((const char *)it->data[1], e);
return o;
}
static Eina_Bool
_init(void)
{
p = evry_plugin_new(NULL, "Window Action", type_action, "BORDER", NULL, 0, NULL, NULL,
_begin, _cleanup, _fetch, _action, _item_icon_get, NULL, NULL);
evry_plugin_register(p, 1);
inst = E_NEW(Inst, 1);
return EINA_TRUE;
}
static void
_shutdown(void)
{
evry_plugin_free(p, 1);
E_FREE(inst);
}
EINA_MODULE_INIT(_init);
EINA_MODULE_SHUTDOWN(_shutdown);