Hello,
The recent changes to the client list menu drew some raised eyebrows.
With input from a few folks I've come up with the attached patch which
will offer the following configuration options. Note that items marked
with (NI) are not yet implemented. Those items are simply ideas I would
like feedback on. If someone feels the need to do those items I'll
spend the time, otherwise they will be removed in time.
It is found via Configuration Panel -> Menus -> Client List Menu.
Config Options:
Group By:
o None
o Desktop
o Window Class
Separate Groups By:
o None
o Separator Bars
o Menus
Sort Order
o None
o Alphabetical
o Most Recently Used (NI)
o Z-order (NI)
Iconified Windows:
o Group with owning desktop
o Group with current desktop
o Separate group (NI)
x Warp to owning desktop
If you liked the behavior the client list offered before I made the
recent changes you would want to select:
Group By: None
Sort Order: None
Personally I really like the "Warp To" option, as I like to keep all my
apps on the desktop I brought them to life on. This will warp you to
the desktop the app was iconified on, instead of bringing it to your
current desktop.
I've tried to test all combinations... but more testing would be
appreciated.
Questions/Comments/Complaints welcome.
--
Regards,
Ravenlock
? e17/apps/e/src/bin/e_int_config_clientlist.c
? e17/apps/e/src/bin/e_int_config_clientlist.h
Index: e17/apps/e/src/bin/Makefile.am
===================================================================
RCS file: /var/cvs/e/e17/apps/e/src/bin/Makefile.am,v
retrieving revision 1.174
diff -u -r1.174 Makefile.am
--- e17/apps/e/src/bin/Makefile.am 13 Feb 2007 16:33:35 -0000 1.174
+++ e17/apps/e/src/bin/Makefile.am 20 Feb 2007 08:13:58 -0000
@@ -185,6 +185,7 @@
e_widget_desk_preview.h \
e_int_config_borders.h \
e_int_config_desk.h \
+e_int_config_clientlist.h \
e_fm_prop.h
enlightenment_src = \
@@ -347,6 +348,7 @@
e_int_config_borders.c \
e_int_config_desk.c \
e_fm_prop.c \
+e_int_config_clientlist.c \
$(ENLIGHTENMENTHEADERS)
enlightenment_SOURCES = \
Index: e17/apps/e/src/bin/e_config.c
===================================================================
RCS file: /var/cvs/e/e17/apps/e/src/bin/e_config.c,v
retrieving revision 1.226
diff -u -r1.226 e_config.c
--- e17/apps/e/src/bin/e_config.c 13 Feb 2007 16:33:35 -0000 1.226
+++ e17/apps/e/src/bin/e_config.c 20 Feb 2007 08:13:59 -0000
@@ -503,6 +503,12 @@
E_CONFIG_VAL(D, T, dpms_suspend_timeout, INT);
E_CONFIG_VAL(D, T, dpms_off_timeout, INT);
+ E_CONFIG_VAL(D, T, clientlist_group_by, INT);
+ E_CONFIG_VAL(D, T, clientlist_separate_with, INT);
+ E_CONFIG_VAL(D, T, clientlist_sort_by, INT);
+ E_CONFIG_VAL(D, T, clientlist_separate_iconified_apps, INT);
+ E_CONFIG_VAL(D, T, clientlist_warp_to_iconified_desktop, INT);
+
E_CONFIG_VAL(D, T, border_raise_on_mouse_action, INT);
E_CONFIG_VAL(D, T, border_raise_on_focus, INT);
E_CONFIG_VAL(D, T, desk_flip_wrap, INT);
@@ -1319,7 +1325,15 @@
e_config->screensaver_blanking = 2;
e_config->screensaver_expose = 2;
IFCFGEND;
-
+
+ IFCFG(0x0110);
+ e_config->clientlist_group_by = 0;
+ e_config->clientlist_separate_with = 0;
+ e_config->clientlist_sort_by = 0;
+ e_config->clientlist_separate_iconified_apps = 0;
+ e_config->clientlist_warp_to_iconified_desktop = 0;
+ IFCFGEND;
+
e_config->config_version = E_CONFIG_FILE_VERSION;
#if 0 /* example of new config */
@@ -1432,6 +1446,12 @@
E_CONFIG_LIMIT(e_config->screensaver_blanking, 0, 2);
E_CONFIG_LIMIT(e_config->screensaver_expose, 0, 2);
+ E_CONFIG_LIMIT(e_config->clientlist_group_by, 0, 2);
+ E_CONFIG_LIMIT(e_config->clientlist_separate_with, 0, 2);
+ E_CONFIG_LIMIT(e_config->clientlist_sort_by, 0, 3);
+ E_CONFIG_LIMIT(e_config->clientlist_separate_iconified_apps, 0, 2);
+ E_CONFIG_LIMIT(e_config->clientlist_warp_to_iconified_desktop, 0, 1);
+
/* FIXME: disabled auto apply because it causes problems */
e_config->cfgdlg_auto_apply = 0;
/* FIXME: desklock personalized password id disabled for security reasons */
Index: e17/apps/e/src/bin/e_config.h
===================================================================
RCS file: /var/cvs/e/e17/apps/e/src/bin/e_config.h,v
retrieving revision 1.141
diff -u -r1.141 e_config.h
--- e17/apps/e/src/bin/e_config.h 13 Feb 2007 16:33:35 -0000 1.141
+++ e17/apps/e/src/bin/e_config.h 20 Feb 2007 08:13:59 -0000
@@ -52,7 +52,7 @@
/* increment this whenever a new set of config values are added but the users
* config doesn't need to be wiped - simply new values need to be put in
*/
-#define E_CONFIG_FILE_GENERATION 0x0109
+#define E_CONFIG_FILE_GENERATION 0x0110
#define E_CONFIG_FILE_VERSION ((E_CONFIG_FILE_EPOCH << 16) |
E_CONFIG_FILE_GENERATION)
#define E_EVAS_ENGINE_DEFAULT 0
@@ -247,6 +247,12 @@
int dpms_off_enable;
int dpms_off_timeout;
+ int clientlist_group_by;
+ int clientlist_separate_with;
+ int clientlist_sort_by;
+ int clientlist_separate_iconified_apps;
+ int clientlist_warp_to_iconified_desktop;
+
int display_res_restore; // GUI
int display_res_width; // GUI
int display_res_height; // GUI
Index: e17/apps/e/src/bin/e_configure.c
===================================================================
RCS file: /var/cvs/e/e17/apps/e/src/bin/e_configure.c,v
retrieving revision 1.89
diff -u -r1.89 e_configure.c
--- e17/apps/e/src/bin/e_configure.c 13 Feb 2007 16:33:35 -0000 1.89
+++ e17/apps/e/src/bin/e_configure.c 20 Feb 2007 08:13:59 -0000
@@ -431,6 +431,7 @@
_e_configure_item_add(cat, _("Applications Menu"),
"enlightenment/applications", e_int_config_apps);
#endif
_e_configure_item_add(cat, _("Menu Settings"),
"enlightenment/menu_settings", e_int_config_menus);
+ _e_configure_item_add(cat, _("Client List Menu"),
"enlightenment/clientlist", e_int_config_clientlist);
cat = _e_configure_category_add(eco, _("Language"), "enlightenment/intl");
_e_configure_item_add(cat, _("Language Settings"), "enlightenment/intl",
e_int_config_intl);
Index: e17/apps/e/src/bin/e_includes.h
===================================================================
RCS file: /var/cvs/e/e17/apps/e/src/bin/e_includes.h,v
retrieving revision 1.147
diff -u -r1.147 e_includes.h
--- e17/apps/e/src/bin/e_includes.h 13 Feb 2007 16:33:35 -0000 1.147
+++ e17/apps/e/src/bin/e_includes.h 20 Feb 2007 08:14:00 -0000
@@ -161,4 +161,5 @@
#include "e_widget_desk_preview.h"
#include "e_int_config_borders.h"
#include "e_int_config_desk.h"
+#include "e_int_config_clientlist.h"
#include "e_fm_prop.h"
Index: e17/apps/e/src/bin/e_int_menus.c
===================================================================
RCS file: /var/cvs/e/e17/apps/e/src/bin/e_int_menus.c,v
retrieving revision 1.196
diff -u -r1.196 e_int_menus.c
--- e17/apps/e/src/bin/e_int_menus.c 18 Feb 2007 11:46:56 -0000 1.196
+++ e17/apps/e/src/bin/e_int_menus.c 20 Feb 2007 08:14:00 -0000
@@ -890,7 +890,7 @@
}
static int
-_e_int_menus_clients_sort_border_cb(void *d1, void *d2)
+_e_int_menus_clients_group_desk_cb(void *d1, void *d2)
{
E_Border *bd1;
E_Border *bd2;
@@ -907,10 +907,153 @@
if (j > k) return 1;
if (j < k) return -1;
+ return -1; /* Returning '-1' on equal is intentional */
+}
+
+static int
+_e_int_menus_clients_group_class_cb(void *d1, void *d2)
+{
+ E_Border *bd1;
+ E_Border *bd2;
+
+ if (!d1) return 1;
+ if (!d2) return -1;
+
+ bd1 = d1;
+ bd2 = d2;
+
+ if (strcmp((const char*)bd1->client.icccm.class, (const
char*)bd2->client.icccm.class) > 0) return 1;
+ if (strcmp((const char*)bd1->client.icccm.class, (const
char*)bd2->client.icccm.class) < 0) return -1;
+ return -1; /* Returning '-1' on equal is intentional */
+}
+
+static int
+_e_int_menus_clients_sort_alpha_cb(void *d1, void *d2)
+{
+ E_Border *bd1;
+ E_Border *bd2;
+
+ if (!d1) return 1;
+ if (!d2) return -1;
+
+ bd1 = d1;
+ bd2 = d2;
+
+ if (strcasecmp(e_border_name_get(bd1), e_border_name_get(bd2)) > 0) return
1;
+ if (strcasecmp(e_border_name_get(bd1), e_border_name_get(bd2)) < 0) return
-1;
return 0;
}
static void
+_e_int_menus_clients_add_by_class(Evas_List *borders, E_Menu *m)
+{
+ Evas_List *l = NULL;
+ E_Menu *subm = NULL;
+ E_Menu_Item *mi;
+ char *class = NULL;
+
+ class = strdup("");
+ for (l = borders; l; l = l->next)
+ {
+ E_Border *bd;
+ bd = l->data;
+ if ( strcmp(class, bd->client.icccm.class) != 0 &&
e_config->clientlist_separate_with != E_CLIENTLIST_GROUP_SEP_NONE)
+ {
+ if (e_config->clientlist_separate_with ==
E_CLIENTLIST_GROUP_SEP_MENU)
+ {
+ if (subm && mi)
+ e_menu_item_submenu_set(mi, subm);
+ mi = e_menu_item_new(m);
+ e_menu_item_label_set(mi, bd->client.icccm.class);
+ e_util_menu_item_edje_icon_set(mi, "enlightenment/windows");
+ subm = e_menu_new();
+ }
+ else
+ {
+ mi = e_menu_item_new(m);
+ e_menu_item_separator_set(mi, 1);
+ }
+ class = strdup(bd->client.icccm.class);
+ }
+ if (e_config->clientlist_separate_with == E_CLIENTLIST_GROUP_SEP_MENU)
+ _e_int_menus_clients_item_create(bd, subm);
+ else
+ _e_int_menus_clients_item_create(bd, m);
+ }
+ if (e_config->clientlist_separate_with == E_CLIENTLIST_GROUP_SEP_MENU &&
subm && mi)
+ e_menu_item_submenu_set(mi, subm);
+}
+
+static void
+_e_int_menus_clients_add_by_desk(E_Desk *curr_desk, Evas_List *borders, E_Menu
*m)
+{
+ E_Desk *desk = NULL;
+ Evas_List *l = NULL, *alt = NULL;
+ E_Menu *subm;
+ E_Menu_Item *mi;
+
+ /* Deal with present desk first */
+ for (l = borders; l; l = l->next)
+ {
+ E_Border *bd;
+
+ bd = l->data;
+ if (bd->desk != curr_desk)
+ {
+ if (!bd->iconic ||
+ (bd->iconic && e_config->clientlist_separate_iconified_apps ==
E_CLIENTLIST_GROUPICONS_OWNER))
+ {
+ alt = evas_list_append(alt, bd);
+ continue;
+ }
+ }
+ _e_int_menus_clients_item_create(bd, m);
+ }
+
+ desk = NULL;
+ subm = NULL;
+ if (evas_list_count(alt) > 0)
+ {
+ if (e_config->clientlist_separate_with == E_CLIENTLIST_GROUP_SEP_MENU)
+ {
+ mi = e_menu_item_new(m);
+ e_menu_item_separator_set(mi, 1);
+ }
+
+ for (l = alt; l; l = l->next)
+ {
+ E_Border *bd;
+
+ bd = l->data;
+ if ( bd->desk != desk && e_config->clientlist_separate_with !=
E_CLIENTLIST_GROUP_SEP_NONE)
+ {
+ if (e_config->clientlist_separate_with ==
E_CLIENTLIST_GROUP_SEP_MENU)
+ {
+ if (subm && mi)
+ e_menu_item_submenu_set(mi, subm);
+ mi = e_menu_item_new(m);
+ e_menu_item_label_set(mi, bd->desk->name);
+ e_util_menu_item_edje_icon_set(mi,
"enlightenment/desktops");
+ subm = e_menu_new();
+ }
+ else
+ {
+ mi = e_menu_item_new(m);
+ e_menu_item_separator_set(mi, 1);
+ }
+ desk = bd->desk;
+ }
+ if (e_config->clientlist_separate_with ==
E_CLIENTLIST_GROUP_SEP_MENU)
+ _e_int_menus_clients_item_create(bd, subm);
+ else
+ _e_int_menus_clients_item_create(bd, m);
+ }
+ if (e_config->clientlist_separate_with == E_CLIENTLIST_GROUP_SEP_MENU
&& subm && mi)
+ e_menu_item_submenu_set(mi, subm);
+ }
+}
+
+static void
_e_int_menus_clients_pre_cb(void *data, E_Menu *m)
{
E_Menu *subm;
@@ -922,8 +1065,7 @@
e_menu_pre_activate_callback_set(m, NULL, NULL);
/* get the current clients */
- zone =
- e_zone_current_get(e_container_current_get(e_manager_current_get()));
+ zone = e_zone_current_get(e_container_current_get(e_manager_current_get()));
desk = e_desk_current_get(zone);
for (l = e_border_client_list(); l; l = l->next)
{
@@ -945,49 +1087,37 @@
mi = e_menu_item_new(m);
e_menu_item_label_set(mi, _("(No Windows)"));
}
- for (l = borders; l; l = l->next)
+
+ if (borders)
{
- E_Border *bd;
-
- bd = l->data;
- if (bd->desk != desk)
+ if (e_config->clientlist_sort_by == E_CLIENTLIST_SORT_ALPHA)
+ borders = evas_list_sort(borders, evas_list_count(borders),
+ _e_int_menus_clients_sort_alpha_cb);
+
+ if (e_config->clientlist_group_by == E_CLIENTLIST_GROUP_DESK)
+ {
+ borders = evas_list_sort(borders, evas_list_count(borders),
+ _e_int_menus_clients_group_desk_cb);
+ _e_int_menus_clients_add_by_desk(desk, borders, m);
+ }
+ if (e_config->clientlist_group_by == E_CLIENTLIST_GROUP_CLASS)
{
- alt = evas_list_append(alt, bd);
- continue;
+ borders = evas_list_sort(borders, evas_list_count(borders),
+ _e_int_menus_clients_group_class_cb);
+ _e_int_menus_clients_add_by_class(borders, m);
}
- _e_int_menus_clients_item_create(bd, m);
- }
-
- alt = evas_list_sort(alt, evas_list_count(alt),
- _e_int_menus_clients_sort_border_cb);
-
- desk = NULL;
- subm = NULL;
- if (evas_list_count(alt) > 0)
- {
- mi = e_menu_item_new(m);
- e_menu_item_separator_set(mi, 1);
- for (l = alt; l; l = l->next)
+ if (e_config->clientlist_group_by == E_CLIENTLIST_GROUP_NONE)
{
- E_Border *bd;
-
- bd = l->data;
- if (bd->desk != desk)
- {
- if (subm && mi)
- e_menu_item_submenu_set(mi, subm);
- mi = e_menu_item_new(m);
- e_menu_item_label_set(mi, bd->desk->name);
- e_util_menu_item_edje_icon_set(mi, "enlightenment/desktops");
- subm = e_menu_new();
- desk = bd->desk;
- }
- _e_int_menus_clients_item_create(bd, subm);
+ for (l = borders; l; l = l->next)
+ {
+ E_Border *bd;
+
+ bd = l->data;
+ _e_int_menus_clients_item_create(bd, m);
+ }
}
- if (subm && mi)
- e_menu_item_submenu_set(mi, subm);
}
-
+
mi = e_menu_item_new(m);
e_menu_item_separator_set(mi, 1);
@@ -1061,12 +1191,18 @@
bd = data;
E_OBJECT_CHECK(bd);
+
if (bd->iconic)
{
+ if (e_config->clientlist_warp_to_iconified_desktop == 1)
+ e_desk_show(bd->desk);
+
if (!bd->lock_user_iconify)
e_border_uniconify(bd);
}
- e_desk_show(bd->desk);
+
+ if (!bd->iconic) e_desk_show(bd->desk);
+
if (!bd->lock_user_stacking)
e_border_raise(bd);
if (!bd->lock_focus_out)
/*
* vim:ts=8:sw=3:sts=8:noexpandtab:cino=>5n-3f0^-2{2
*/
#include "e.h"
struct _E_Config_Dialog_Data
{
int group_by;
int separate_with;
int sort_by;
int separate_iconified_apps;
int warp_to_iconified_desktop;
};
static void
_fill_data(E_Config_Dialog_Data *cfdata)
{
cfdata->group_by = e_config->clientlist_group_by;
cfdata->separate_with = e_config->clientlist_separate_with;
cfdata->sort_by = e_config->clientlist_sort_by;
cfdata->separate_iconified_apps =
e_config->clientlist_separate_iconified_apps;
cfdata->warp_to_iconified_desktop =
e_config->clientlist_warp_to_iconified_desktop;
}
static void *
_create_data(E_Config_Dialog *cfd)
{
E_Config_Dialog_Data *cfdata;
cfdata = E_NEW(E_Config_Dialog_Data, 1);
_fill_data(cfdata);
return cfdata;
}
static void
_free_data(E_Config_Dialog *cfd, E_Config_Dialog_Data *cfdata)
{
E_FREE(cfdata);
}
static int
_basic_apply_data(E_Config_Dialog *cfd, E_Config_Dialog_Data *cfdata)
{
e_config->clientlist_group_by = cfdata->group_by;
e_config->clientlist_separate_with = cfdata->separate_with;
e_config->clientlist_sort_by = cfdata->sort_by;
e_config->clientlist_separate_iconified_apps =
cfdata->separate_iconified_apps;
e_config->clientlist_warp_to_iconified_desktop =
cfdata->warp_to_iconified_desktop;
return 1;
}
static Evas_Object *
_basic_create_widgets(E_Config_Dialog *cfd, Evas *evas, E_Config_Dialog_Data
*cfdata)
{
Evas_Object *o, *of, *ob;
E_Radio_Group *rg;
o = e_widget_list_add(evas, 0, 0);
of = e_widget_framelist_add(evas, _("Group By"), 0);
rg = e_widget_radio_group_new(&(cfdata->group_by));
ob = e_widget_radio_add(evas, _("None"), E_CLIENTLIST_GROUP_NONE, rg);
e_widget_framelist_object_append(of, ob);
ob = e_widget_radio_add(evas, _("Desktop"), E_CLIENTLIST_GROUP_DESK, rg);
e_widget_framelist_object_append(of, ob);
ob = e_widget_radio_add(evas, _("Window Class"), E_CLIENTLIST_GROUP_CLASS,
rg);
e_widget_framelist_object_append(of, ob);
e_widget_list_object_append(o, of, 1, 1, 0.5);
of = e_widget_framelist_add(evas, _("Separate Groups By"), 0);
rg = e_widget_radio_group_new(&(cfdata->separate_with));
ob = e_widget_radio_add(evas, _("None"), E_CLIENTLIST_GROUP_SEP_NONE, rg);
e_widget_framelist_object_append(of, ob);
ob = e_widget_radio_add(evas, _("Using separator bars"),
E_CLIENTLIST_GROUP_SEP_BAR, rg);
e_widget_framelist_object_append(of, ob);
ob = e_widget_radio_add(evas, _("Using menus"), E_CLIENTLIST_GROUP_SEP_MENU,
rg);
e_widget_framelist_object_append(of, ob);
e_widget_list_object_append(o, of, 1, 1, 0.5);
of = e_widget_framelist_add(evas, _("Sort Order"), 0);
rg = e_widget_radio_group_new(&(cfdata->sort_by));
ob = e_widget_radio_add(evas, _("None"), E_CLIENTLIST_SORT_NONE, rg);
e_widget_framelist_object_append(of, ob);
ob = e_widget_radio_add(evas, _("Alphabetical"), E_CLIENTLIST_SORT_ALPHA,
rg);
e_widget_framelist_object_append(of, ob);
ob = e_widget_radio_add(evas, _("Most recently used"),
E_CLIENTLIST_SORT_MOST_RECENT, rg);
e_widget_disabled_set(ob, 1);
e_widget_framelist_object_append(of, ob);
ob = e_widget_radio_add(evas, _("Z-Order"), E_CLIENTLIST_SORT_ZORDER, rg);
e_widget_disabled_set(ob, 1);
e_widget_framelist_object_append(of, ob);
e_widget_list_object_append(o, of, 1, 1, 0.5);
of = e_widget_framelist_add(evas, _("Iconified Windows"), 0);
rg = e_widget_radio_group_new(&(cfdata->separate_iconified_apps));
ob = e_widget_radio_add(evas, _("Group with owning desktop"),
E_CLIENTLIST_GROUPICONS_OWNER, rg);
e_widget_framelist_object_append(of, ob);
ob = e_widget_radio_add(evas, _("Group with current desktop"),
E_CLIENTLIST_GROUPICONS_CURRENT, rg);
e_widget_framelist_object_append(of, ob);
ob = e_widget_radio_add(evas, _("Separate group"),
E_CLIENTLIST_GROUPICONS_SEP, rg);
e_widget_disabled_set(ob, 1);
e_widget_framelist_object_append(of, ob);
ob = e_widget_check_add(evas, _("Warp to owning desktop"),
&(cfdata->warp_to_iconified_desktop));
e_widget_framelist_object_append(of, ob);
e_widget_list_object_append(o, of, 1, 1, 0.5);
return o;
}
EAPI E_Config_Dialog *
e_int_config_clientlist(E_Container *con)
{
E_Config_Dialog *cfd;
E_Config_Dialog_View *v;
if (e_config_dialog_find("E", "_config_clientlist_dialog")) return NULL;
v = E_NEW(E_Config_Dialog_View, 1);
v->create_cfdata = _create_data;
v->free_cfdata = _free_data;
v->basic.apply_cfdata = _basic_apply_data;
v->basic.create_widgets = _basic_create_widgets;
v->advanced.apply_cfdata = NULL;
v->advanced.create_widgets = NULL;
cfd = e_config_dialog_new(con, _("Client List Settings"), "E",
"_config_clientlist_dialog",
"enlightenment/clientlist", 0, v, NULL);
return cfd;
}
#ifdef E_TYPEDEFS
#else
#ifndef E_INT_CONFIG_CLIENTLIST_H
#define E_INT_CONFIG_CLIENTLIST_H
#define E_CLIENTLIST_GROUP_NONE 0
#define E_CLIENTLIST_GROUP_DESK 1
#define E_CLIENTLIST_GROUP_CLASS 2
#define E_CLIENTLIST_GROUP_SEP_NONE 0
#define E_CLIENTLIST_GROUP_SEP_BAR 1
#define E_CLIENTLIST_GROUP_SEP_MENU 2
#define E_CLIENTLIST_SORT_NONE 0
#define E_CLIENTLIST_SORT_ALPHA 1
#define E_CLIENTLIST_SORT_ZORDER 2
#define E_CLIENTLIST_SORT_MOST_RECENT 3
#define E_CLIENTLIST_GROUPICONS_OWNER 0
#define E_CLIENTLIST_GROUPICONS_CURRENT 1
#define E_CLIENTLIST_GROUPICONS_SEP 2
EAPI E_Config_Dialog *e_int_config_clientlist(E_Container *con);
#endif
#endif
-------------------------------------------------------------------------
Take Surveys. Earn Cash. Influence the Future of IT
Join SourceForge.net's Techsay panel and you'll get the chance to share your
opinions on IT & business topics through brief surveys-and earn cash
http://www.techsay.com/default.php?page=join.php&p=sourceforge&CID=DEVDEV
_______________________________________________
enlightenment-devel mailing list
enlightenment-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/enlightenment-devel