6 #define BORDER_FULLSCREEN 3
7 #define BORDER_TODESK 4
10 typedef struct _Plugin Plugin;
11 typedef struct _Border_Item Border_Item;
27 #define GET_BORDER(_bd, _it) Border_Item *_bd = (Border_Item *)_it;
29 static const Evry_API *evry = NULL;
30 static Evry_Module *evry_module = NULL;
31 static Evry_Plugin *_plug;
32 static Eina_List *_actions = NULL;
34 static Evas_Object *_icon_get(Evry_Item *it, Evas *e);
36 /***************************************************************************/
39 _border_item_free(Evry_Item *it)
43 e_object_unref(E_OBJECT(bi->border));
49 _border_item_add(Plugin *p, E_Border *bd)
54 if (bd->client.netwm.state.skip_taskbar)
56 if (bd->client.netwm.state.skip_pager)
59 bi = EVRY_ITEM_NEW(Border_Item, p, e_border_name_get(bd), _icon_get, _border_item_free);
60 snprintf(buf, sizeof(buf), "%d:%d %s",
61 bd->desk->x, bd->desk->y,
62 (bd->desktop ? bd->desktop->name : ""));
63 EVRY_ITEM_DETAIL_SET(bi, buf);
66 e_object_ref(E_OBJECT(bd));
68 p->borders = eina_list_append(p->borders, bi);
74 _cb_border_remove(void *data, __UNUSED__ int type, void *event)
76 E_Event_Border_Remove *ev = event;
81 EINA_LIST_FOREACH(p->borders, l, bi)
82 if (bi->border == ev->border)
85 if (!bi) return ECORE_CALLBACK_PASS_ON;
87 p->borders = eina_list_remove(p->borders, bi);
88 p->base.items = eina_list_remove(p->base.items, bi);
91 EVRY_PLUGIN_UPDATE(p, EVRY_UPDATE_ADD);
93 return ECORE_CALLBACK_PASS_ON;
96 _cb_border_add(void *data, __UNUSED__ int type, void *event)
98 E_Event_Border_Add *ev = event;
102 if (!_border_item_add(p, ev->border))
103 return ECORE_CALLBACK_PASS_ON;
105 EVRY_PLUGIN_ITEMS_CLEAR(p);
107 min = EVRY_PLUGIN(p)->config->min_query;
109 if ((!p->input && (min == 0)) ||
110 (p->input && (strlen(p->input) >= min)))
112 EVRY_PLUGIN_ITEMS_ADD(p, p->borders, p->input, 1, 0);
114 EVRY_PLUGIN_UPDATE(p, EVRY_UPDATE_ADD);
117 return ECORE_CALLBACK_PASS_ON;
121 _get_borderlist(Plugin *p)
126 p->handlers = eina_list_append
127 (p->handlers, ecore_event_handler_add
128 (E_EVENT_BORDER_REMOVE, _cb_border_remove, p));
130 p->handlers = eina_list_append
131 (p->handlers, ecore_event_handler_add
132 (E_EVENT_BORDER_ADD, _cb_border_add, p));
134 EINA_LIST_FOREACH(e_border_focus_stack_get(), l, bd)
135 _border_item_add(p, bd);
139 _begin(Evry_Plugin *plugin, const Evry_Item *item __UNUSED__)
142 EVRY_PLUGIN_INSTANCE(p, plugin);
144 return EVRY_PLUGIN(p);
148 _finish(Evry_Plugin *plugin)
150 Ecore_Event_Handler *h;
153 GET_PLUGIN(p, plugin);
155 IF_RELEASE(p->input);
157 EVRY_PLUGIN_ITEMS_CLEAR(p);
159 EINA_LIST_FREE(p->borders, bi)
162 EINA_LIST_FREE(p->handlers, h)
163 ecore_event_handler_del(h);
169 _fetch(Evry_Plugin *plugin, const char *input)
171 int len = (input ? strlen(input) : 0);
173 GET_PLUGIN(p, plugin);
175 EVRY_PLUGIN_ITEMS_CLEAR(p);
177 if (len >= plugin->config->min_query)
179 IF_RELEASE(p->input);
182 p->input = eina_stringshare_add(input);
187 EVRY_PLUGIN_ITEMS_ADD(p, p->borders, input, 1, 0);
190 return !!(p->base.items);
194 _icon_get(Evry_Item *it, Evas *e)
198 Evas_Object *o = NULL;
199 E_Border *bd = bi->border;
203 o = edje_object_add(e);
204 if (!bd->internal_icon)
205 e_util_edje_icon_set(o, "enlightenment/e");
206 else if (!bd->internal_icon_key)
209 ext = strrchr(bd->internal_icon, '.');
210 if ((ext) && ((!strcmp(ext, ".edj"))))
212 if (!edje_object_file_set(o, bd->internal_icon, "icon"))
213 e_util_edje_icon_set(o, "enlightenment/e");
219 e_icon_file_set(o, bd->internal_icon);
223 if (!e_util_edje_icon_set(o, bd->internal_icon))
224 e_util_edje_icon_set(o, "enlightenment/e");
229 edje_object_file_set(o, bd->internal_icon,
230 bd->internal_icon_key);
235 if (!o && bd->desktop)
236 o = e_util_desktop_icon_add(bd->desktop, 128, e);
238 if (!o && bd->client.netwm.icons)
240 int i, size, tmp, found = 0;
243 size = bd->client.netwm.icons[0].width;
245 for (i = 1; i < bd->client.netwm.num_icons; i++)
247 if ((tmp = bd->client.netwm.icons[i].width) > size)
254 e_icon_data_set(o, bd->client.netwm.icons[found].data,
255 bd->client.netwm.icons[found].width,
256 bd->client.netwm.icons[found].height);
257 e_icon_alpha_set(o, 1);
262 o = e_border_icon_add(bd, e);
268 /***************************************************************************/
271 _check_border(Evry_Action *act, const Evry_Item *it)
275 int action = EVRY_ITEM_DATA_INT_GET(act);
276 E_Border *bd = bi->border;
277 E_Zone *zone = e_util_zone_current_get(e_manager_current_get());
293 if (bd->lock_focus_in)
298 if (bd->lock_user_iconify)
302 case BORDER_FULLSCREEN:
303 if (!bd->lock_user_fullscreen)
308 if (bd->desk == (e_desk_current_get(zone)))
317 _act_border(Evry_Action *act)
319 GET_BORDER(bi, act->it1.item);
321 int action = EVRY_ITEM_DATA_INT_GET(act);
322 E_Border *bd = bi->border;
323 E_Zone *zone = e_util_zone_current_get(e_manager_current_get());
335 e_border_act_close_begin(bd);
339 if (bd->desk != (e_desk_current_get(zone)))
340 e_desk_show(bd->desk);
345 e_border_iconify(bd);
348 case BORDER_FULLSCREEN:
350 e_border_fullscreen(bd, E_FULLSCREEN_RESIZE);
352 e_border_unfullscreen(bd);
356 if (bd->desk != (e_desk_current_get(zone)))
357 e_border_desk_set(bd, e_desk_current_get(zone));
367 e_border_unshade(bd, E_DIRECTION_UP);
370 e_border_uniconify(bd);
374 if (!bd->lock_focus_out)
376 e_border_focus_set(bd, 1, 1);
377 e_border_focus_latest_set(bd);
380 if ((e_config->focus_policy != E_FOCUS_CLICK) ||
381 (e_config->winlist_warp_at_end) ||
382 (e_config->winlist_warp_while_selecting))
384 int warp_to_x = bd->x + (bd->w / 2);
385 if (warp_to_x < (bd->zone->x + 1))
386 warp_to_x = bd->zone->x + ((bd->x + bd->w - bd->zone->x) / 2);
387 else if (warp_to_x >= (bd->zone->x + bd->zone->w - 1))
388 warp_to_x = (bd->zone->x + bd->zone->w + bd->x) / 2;
390 int warp_to_y = bd->y + (bd->h / 2);
391 if (warp_to_y < (bd->zone->y + 1))
392 warp_to_y = bd->zone->y + ((bd->y + bd->h - bd->zone->y) / 2);
393 else if (warp_to_y >= (bd->zone->y + bd->zone->h - 1))
394 warp_to_y = (bd->zone->y + bd->zone->h + bd->y) / 2;
396 ecore_x_pointer_warp(bd->zone->container->win, warp_to_x, warp_to_y);
398 /* e_border_focus_set_with_pointer(bd); */
405 _plugins_init(const Evry_API *_api)
409 if (evry_module->active)
414 if (!evry->api_version_check(EVRY_API_VERSION))
417 _plug = EVRY_PLUGIN_NEW(Plugin, N_("Windows"),
418 "preferences-system-windows",
420 _begin, _finish, _fetch, NULL);
421 _plug->transient = EINA_TRUE;
422 evry->plugin_register(_plug, EVRY_PLUGIN_SUBJECT, 2);
424 act = EVRY_ACTION_NEW(_("Switch to Window"),
425 EVRY_TYPE_BORDER, 0, "go-next",
426 _act_border, _check_border);
427 EVRY_ITEM_DATA_INT_SET(act, BORDER_SHOW);
428 evry->action_register(act, 1);
430 _actions = eina_list_append(_actions, act);
432 act = EVRY_ACTION_NEW(_("Iconify"),
433 EVRY_TYPE_BORDER, 0, "go-down",
434 _act_border, _check_border);
435 EVRY_ITEM_DATA_INT_SET(act, BORDER_HIDE);
436 _actions = eina_list_append(_actions, act);
437 evry->action_register(act, 2);
439 act = EVRY_ACTION_NEW(_("Toggle Fullscreen"),
440 EVRY_TYPE_BORDER, 0, "view-fullscreen",
441 _act_border, _check_border);
442 EVRY_ITEM_DATA_INT_SET(act, BORDER_FULLSCREEN);
443 _actions = eina_list_append(_actions, act);
444 evry->action_register(act, 4);
446 act = EVRY_ACTION_NEW(_("Close"),
447 EVRY_TYPE_BORDER, 0, "list-remove",
448 _act_border, _check_border);
449 EVRY_ITEM_DATA_INT_SET(act, BORDER_CLOSE);
450 _actions = eina_list_append(_actions, act);
451 evry->action_register(act, 3);
453 act = EVRY_ACTION_NEW(_("Send to Desktop"),
454 EVRY_TYPE_BORDER, 0, "go-previous",
455 _act_border, _check_border);
456 EVRY_ITEM_DATA_INT_SET(act, BORDER_TODESK);
457 _actions = eina_list_append(_actions, act);
458 evry->action_register(act, 3);
464 _plugins_shutdown(void)
468 if (!evry_module->active) return;
470 EVRY_PLUGIN_FREE(_plug);
472 EINA_LIST_FREE(_actions, act)
473 EVRY_ACTION_FREE(act);
475 evry_module->active = EINA_FALSE;
478 /***************************************************************************/
481 evry_plug_windows_init(E_Module *m)
483 EVRY_MODULE_NEW(evry_module, evry, _plugins_init, _plugins_shutdown);
489 evry_plug_windows_shutdown(void)
491 EVRY_MODULE_FREE(evry_module);
495 evry_plug_windows_save(void){}