Enlightenment CVS committal Author : urandom Project : e_modules Module : winselector
Dir : e_modules/winselector Modified Files: e_mod_main.c Log Message: use the settings for the e client menu =================================================================== RCS file: /cvs/e/e_modules/winselector/e_mod_main.c,v retrieving revision 1.13 retrieving revision 1.14 diff -u -3 -r1.13 -r1.14 --- e_mod_main.c 30 Mar 2007 21:00:24 -0000 1.13 +++ e_mod_main.c 22 Jul 2007 21:15:04 -0000 1.14 @@ -40,13 +40,24 @@ static void _win_menu_icon_cb(void *data, E_Menu *m, E_Menu_Item *mi); static void _win_menu_item_drag(void *data, E_Menu *m, E_Menu_Item *mi); static void _win_menu_free_hook(void *obj); -static void _win_menu_item_create(E_Border *bd, E_Menu *m, Instance *inst); +static void _win_menu_item_create(E_Border *bd, E_Menu *m); static int _window_cb_focus_in(void *data, int type, void *event); static int _window_cb_focus_out(void *data, int type, void *event); static int _window_cb_icon_change(void *data, int type, void *event); static int _window_cb_border_remove(void *data, int type, void *event); static void _focus_in(E_Border *bd, Instance *inst); static void _focus_out(Instance *inst); +static void _win_menu_fill_separator(E_Menu *m); +static int _win_menu_fill_normal(Evas_List *normal, E_Menu *m); +static int _win_menu_fill_alt(Evas_List *alt, E_Menu *m); +static int _win_menu_fill_iconified (Evas_List *borders, E_Menu *m); +static int _win_menu_sort_alpha_cb (void *d1, void *d2); +static int _win_menu_sort_z_order_cb (void *d1, void *d2); +static int _win_menu_group_desk_cb (void *d1, void *d2); +static int _win_menu_group_class_cb (void *d1, void *d2); +static void _win_menu_add_by_class (Evas_List *borders, E_Menu *m); +static void _win_menu_add_by_desk (E_Desk *curr_desk, Evas_List *borders, E_Menu *m, E_Gadcon_Orient orient); +static void _win_menu_add_by_none (Evas_List *borders, E_Menu *m); static E_Module *winsel_module = NULL; Evas_List *handlers; @@ -258,47 +269,38 @@ e_menu_item_label_set(mi, _("(No Windows)")); return; } - for (l = borders; l; l = l->next) - { - E_Border *bd = l->data; - if (inst->gcc->gadcon->orient == E_GADCON_ORIENT_BOTTOM - || inst->gcc->gadcon->orient == E_GADCON_ORIENT_CORNER_BL - || inst->gcc->gadcon->orient == E_GADCON_ORIENT_CORNER_BR - || inst->gcc->gadcon->orient == E_GADCON_ORIENT_CORNER_RB - || inst->gcc->gadcon->orient == E_GADCON_ORIENT_CORNER_LB) - { - if (bd->desk == desk) - { - alt = evas_list_append(alt, bd); - continue; - } - } - else - { - if (bd->desk != desk) - { - alt = evas_list_append(alt, bd); - continue; - } - } - _win_menu_item_create(bd, m, inst); - } - mi = e_menu_item_new(m); - e_menu_item_separator_set(mi, 1); - - for (l = alt; l; l = l->next) - { - E_Border *bd = l->data; + /* Sort the borders */ + if (e_config->clientlist_sort_by == E_CLIENTLIST_SORT_ALPHA) + borders = evas_list_sort(borders, evas_list_count(borders), + _win_menu_sort_alpha_cb); + + if (e_config->clientlist_sort_by == E_CLIENTLIST_SORT_ZORDER) + borders = evas_list_sort(borders, evas_list_count(borders), + _win_menu_sort_z_order_cb); - _win_menu_item_create(bd, m, inst); + /* Group the borders */ + if (e_config->clientlist_group_by == E_CLIENTLIST_GROUP_DESK) + { + borders = evas_list_sort(borders, evas_list_count(borders), + _win_menu_group_desk_cb); + _win_menu_add_by_desk(desk, borders, m, inst->gcc->gadcon->orient); + } + if (e_config->clientlist_group_by == E_CLIENTLIST_GROUP_CLASS) + { + borders = evas_list_sort(borders, evas_list_count(borders), + _win_menu_group_class_cb); + _win_menu_add_by_class(borders, m); } + if (e_config->clientlist_group_by == E_CLIENTLIST_GROUP_NONE) + _win_menu_add_by_none(borders, m); + e_object_free_attach_func_set(E_OBJECT(m), _win_menu_free_hook); e_object_data_set(E_OBJECT(m), borders); } static void -_win_menu_item_create(E_Border *bd, E_Menu *m, Instance *inst) +_win_menu_item_create(E_Border *bd, E_Menu *m) { E_Menu_Item *mi; const char *title; @@ -493,6 +495,317 @@ if (inst->bd_icon) evas_object_del(inst->bd_icon); inst->bd_icon = NULL; +} + +static Evas_List *_win_menu_sort_by_orientation(Evas_List *list, E_Gadcon_Orient orient) +{ + if (orient == E_GADCON_ORIENT_BOTTOM + || orient == E_GADCON_ORIENT_CORNER_BL + || orient == E_GADCON_ORIENT_CORNER_BR + || orient == E_GADCON_ORIENT_CORNER_RB + || orient == E_GADCON_ORIENT_CORNER_LB) + return evas_list_reverse(list); +} + +static int _win_menu_sort_alpha_cb(void *d1, void *d2) +{ + E_Border *bd1; + E_Border *bd2; + const char *name1; + const char *name2; + + if (!d1) return 1; + if (!d2) return -1; + + bd1 = d1; + bd2 = d2; + name1 = e_border_name_get(bd1); + name2 = e_border_name_get(bd2); + + if (strcasecmp(name1, name2) > 0) return 1; + if (strcasecmp(name1, name2) < 0) return -1; + return 0; +} + +static int _win_menu_sort_z_order_cb(void *d1, void *d2) +{ + E_Border *bd1; + E_Border *bd2; + + if (!d1) return 1; + if (!d2) return -1; + + bd1 = d1; + bd2 = d2; + + if (bd1->layer < bd2->layer) return 1; + if (bd1->layer > bd2->layer) return -1; + return 0; +} + +static int _win_menu_group_desk_cb(void *d1, void *d2) +{ + E_Border *bd1; + E_Border *bd2; + int j,k; + + if (!d1) return 1; + if (!d2) return -1; + + bd1 = d1; + bd2 = d2; + + j = bd1->desk->y * 12 + bd1->desk->x; + k = bd2->desk->y * 12 + bd2->desk->x; + + if (j > k) return 1; + if (j < k) return -1; + return -1; /* Returning '-1' on equal is intentional */ +} + +static int _win_menu_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 void _win_menu_add_by_class(Evas_List *borders, E_Menu *m) +{ + Evas_List *l = NULL, *ico = 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 ((bd->iconic) && + (e_config->clientlist_separate_iconified_apps == E_CLIENTLIST_GROUPICONS_SEP)) + { + ico = evas_list_append(ico, bd); + continue; + } + + 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) + _win_menu_item_create(bd, subm); + else + _win_menu_item_create(bd, m); + } + + if ((e_config->clientlist_separate_with == E_CLIENTLIST_GROUP_SEP_MENU) + && subm && mi) + e_menu_item_submenu_set(mi, subm); + + _win_menu_fill_iconified(ico, m); +} + +static void _win_menu_add_by_desk(E_Desk *curr_desk, Evas_List *borders, E_Menu *m, E_Gadcon_Orient orient) +{ + Evas_List *l = NULL, *normal = NULL, *alt = NULL, *ico = NULL; + + /* Deal with present desk first */ + for (l = borders; l; l = l->next) + { + E_Border *bd; + + bd = l->data; + if (bd->iconic && e_config->clientlist_separate_iconified_apps && E_CLIENTLIST_GROUPICONS_SEP) + { + ico = evas_list_append(ico, bd); + continue; + } + + 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; + } + } + else + normal = evas_list_append(normal, bd); + } + + if (orient == E_GADCON_ORIENT_BOTTOM + || orient == E_GADCON_ORIENT_CORNER_BL + || orient == E_GADCON_ORIENT_CORNER_BR + || orient == E_GADCON_ORIENT_CORNER_RB + || orient == E_GADCON_ORIENT_CORNER_LB) + { + if (_win_menu_fill_iconified(ico, m)) + _win_menu_fill_separator(m); + if (_win_menu_fill_alt(alt, m) && evas_list_count(normal) > 0) + _win_menu_fill_separator(m); + + _win_menu_fill_normal(normal, m); + } + else + { + if (_win_menu_fill_normal(normal, m)) + _win_menu_fill_separator(m); + if (_win_menu_fill_alt(alt, m) && evas_list_count(ico) > 0) + _win_menu_fill_separator(m); + + _win_menu_fill_iconified(ico, m); + } +} + +static void _win_menu_add_by_none(Evas_List *borders, E_Menu *m) +{ + Evas_List *l = NULL, *ico = NULL; + + for (l = borders; l; l = l->next) + { + E_Border *bd; + + bd = l->data; + if (bd->iconic && e_config->clientlist_separate_iconified_apps && E_CLIENTLIST_GROUPICONS_SEP) + { + ico = evas_list_append(ico, bd); + continue; + } + _win_menu_item_create(bd, m); + } + + _win_menu_fill_iconified(ico, m); +} + +static void _win_menu_fill_separator(E_Menu *m) +{ + E_Menu_Item *mi = NULL; + + mi = e_menu_item_new(m); + e_menu_item_separator_set(mi, 1); +} + +static int _win_menu_fill_normal(Evas_List *normal, E_Menu *m) +{ + Evas_List *l = NULL; + + if (evas_list_count(normal) > 0) + { + for (l = normal; l; l = l->next) + { + E_Border *bd; + + bd = l->data; + _win_menu_item_create(bd, m); + } + return 1; + } + return 0; +} + +static int _win_menu_fill_alt(Evas_List *alt, E_Menu *m) +{ + E_Menu_Item *mi = NULL; + E_Menu *subm = NULL; + E_Desk *desk = NULL; + Evas_List *l = NULL; + int first = 1; + + if (evas_list_count(alt) > 0) + { + 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 + { + if (!first) + { + mi = e_menu_item_new(m); + e_menu_item_separator_set(mi, 1); + } + first = 0; + } + desk = bd->desk; + } + if (e_config->clientlist_separate_with == E_CLIENTLIST_GROUP_SEP_MENU) + _win_menu_item_create(bd, subm); + else + _win_menu_item_create(bd, m); + } + if (e_config->clientlist_separate_with == E_CLIENTLIST_GROUP_SEP_MENU + && subm && mi) + e_menu_item_submenu_set(mi, subm); + return 1; + } + return 0; +} + +static int _win_menu_fill_iconified(Evas_List *borders, E_Menu *m) +{ + Evas_List *l; + E_Menu_Item *mi; + + if (evas_list_count(borders) > 0) + { + for (l = borders; l; l = l->next) + { + E_Border *bd; + bd = l->data; + + _win_menu_item_create(bd, m); + } + return 1; + } + return 0; } /* module setup */ ------------------------------------------------------------------------- This SF.net email is sponsored by: Splunk Inc. Still grepping through log files to find problems? Stop. Now Search log events and configuration files using AJAX and a browser. Download your FREE copy of Splunk now >> http://get.splunk.com/ _______________________________________________ enlightenment-cvs mailing list enlightenment-cvs@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/enlightenment-cvs