From 4c2a42eaa636708b25b469e453c88cbf1116fc72 Mon Sep 17 00:00:00 2001 From: Christopher Michael Date: Thu, 1 Mar 2007 21:39:06 +0000 Subject: [PATCH] Patch from ravenlock for client list sorting by Most Recently Used & stacking layer. Nice Work :) SVN revision: 28516 --- src/bin/e_int_config_clientlist.c | 30 +++--- src/bin/e_int_menus.c | 146 +++++++++++++++++++++++++----- 2 files changed, 138 insertions(+), 38 deletions(-) diff --git a/src/bin/e_int_config_clientlist.c b/src/bin/e_int_config_clientlist.c index 0518ea321..5703b55fd 100644 --- a/src/bin/e_int_config_clientlist.c +++ b/src/bin/e_int_config_clientlist.c @@ -81,11 +81,12 @@ _basic_apply_data(E_Config_Dialog *cfd, E_Config_Dialog_Data *cfdata) static Evas_Object * _basic_create_widgets(E_Config_Dialog *cfd, Evas *evas, E_Config_Dialog_Data *cfdata) { - Evas_Object *o, *of, *ob; + Evas_Object *o, *of, *ob, *ot; E_Radio_Group *rg; o = e_widget_list_add(evas, 0, 0); - + ot = e_widget_table_add(evas, 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); @@ -94,7 +95,8 @@ _basic_create_widgets(E_Config_Dialog *cfd, Evas *evas, E_Config_Dialog_Data *cf 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); + //e_widget_list_object_append(o, of, 1, 1, 0.5); + e_widget_table_object_append(ot, of, 0, 0, 1, 1, 1, 1, 1, 1); of = e_widget_framelist_add(evas, _("Separate Groups By"), 0); rg = e_widget_radio_group_new(&(cfdata->separate_with)); @@ -104,21 +106,21 @@ _basic_create_widgets(E_Config_Dialog *cfd, Evas *evas, E_Config_Dialog_Data *cf 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); + //e_widget_list_object_append(o, of, 1, 1, 0.5); + e_widget_table_object_append(ot, of, 1, 0, 1, 1, 1, 1, 1, 1); - of = e_widget_framelist_add(evas, _("Sort Order"), 0); + of = e_widget_framelist_add(evas, _("Client 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, _("Window stacking layer"), E_CLIENTLIST_SORT_ZORDER, 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); + //e_widget_list_object_append(o, of, 1, 1, 0.5); + e_widget_table_object_append(ot, of, 0, 1, 1, 1, 1, 1, 1, 1); of = e_widget_framelist_add(evas, _("Iconified Windows"), 0); rg = e_widget_radio_group_new(&(cfdata->separate_iconified_apps)); @@ -127,11 +129,13 @@ _basic_create_widgets(E_Config_Dialog *cfd, Evas *evas, E_Config_Dialog_Data *cf 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); - + //e_widget_list_object_append(o, of, 1, 1, 0.5); + e_widget_table_object_append(ot, of, 1, 1, 1, 1, 1, 1, 1, 1); + + e_widget_list_object_append(o, ot, 1, 1, 0.5); + return o; } diff --git a/src/bin/e_int_menus.c b/src/bin/e_int_menus.c index 20b7b2157..2206c00a4 100644 --- a/src/bin/e_int_menus.c +++ b/src/bin/e_int_menus.c @@ -49,6 +49,14 @@ static void _e_int_menus_clients_free_hook (void *obj); static void _e_int_menus_clients_item_cb (void *data, E_Menu *m, E_Menu_Item *mi); static void _e_int_menus_clients_icon_cb (void *data, E_Menu *m, E_Menu_Item *mi); static void _e_int_menus_clients_cleanup_cb (void *data, E_Menu *m, E_Menu_Item *mi); +static int _e_int_menus_clients_group_desk_cb (void *d1, void *d2); +static int _e_int_menus_clients_group_class_cb (void *d1, void *d2); +static int _e_int_menus_clients_sort_alpha_cb (void *d1, void *d2); +static int _e_int_menus_clients_sort_z_order_cb (void *d1, void *d2); +static void _e_int_menus_clients_add_by_class (Evas_List *borders, E_Menu *m); +static void _e_int_menus_clients_add_by_desk (E_Desk *curr_desk, Evas_List *borders, E_Menu *m); +static void _e_int_menus_clients_add_by_none (Evas_List *borders, E_Menu *m); +static void _e_int_menus_clients_menu_add_iconified (Evas_List *borders, E_Menu *m); static void _e_int_menus_virtuals_pre_cb (void *data, E_Menu *m); static void _e_int_menus_virtuals_item_cb (void *data, E_Menu *m, E_Menu_Item *mi); static void _e_int_menus_themes_about (void *data, E_Menu *m, E_Menu_Item *mi); @@ -954,10 +962,48 @@ _e_int_menus_clients_sort_alpha_cb(void *d1, void *d2) return 0; } +static int +_e_int_menus_clients_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 void +_e_int_menus_clients_menu_add_iconified(Evas_List *borders, E_Menu *m) +{ + Evas_List *l; + E_Menu_Item *mi; + + if (evas_list_count(borders) > 0) + { + mi = e_menu_item_new(m); + e_menu_item_separator_set(mi, 1); + + for (l = borders; l; l = l->next) + { + E_Border *bd; + bd = l->data; + + _e_int_menus_clients_item_create(bd, m); + } + } +} + static void _e_int_menus_clients_add_by_class(Evas_List *borders, E_Menu *m) { - Evas_List *l = NULL; + Evas_List *l = NULL, *ico = NULL; E_Menu *subm = NULL; E_Menu_Item *mi; char *class = NULL; @@ -967,8 +1013,16 @@ _e_int_menus_clients_add_by_class(Evas_List *borders, E_Menu *m) { 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 ((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) { @@ -990,17 +1044,20 @@ _e_int_menus_clients_add_by_class(Evas_List *borders, E_Menu *m) _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); + + _e_int_menus_clients_menu_add_iconified(ico, m); } 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; + Evas_List *l = NULL, *alt = NULL, *ico = NULL; E_Menu *subm; E_Menu_Item *mi; @@ -1009,17 +1066,25 @@ _e_int_menus_clients_add_by_desk(E_Desk *curr_desk, Evas_List *borders, E_Menu * { E_Border *bd; - bd = l->data; + 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)) + 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); + else + _e_int_menus_clients_item_create(bd, m); } desk = NULL; @@ -1036,7 +1101,8 @@ _e_int_menus_clients_add_by_desk(E_Desk *curr_desk, Evas_List *borders, E_Menu * { E_Border *bd; - bd = l->data; + bd = l->data; + if (bd->desk != desk && e_config->clientlist_separate_with != E_CLIENTLIST_GROUP_SEP_NONE) { @@ -1065,6 +1131,31 @@ _e_int_menus_clients_add_by_desk(E_Desk *curr_desk, Evas_List *borders, E_Menu * && subm && mi) e_menu_item_submenu_set(mi, subm); } + + _e_int_menus_clients_menu_add_iconified(ico, m); +} + +static void +_e_int_menus_clients_add_by_none(Evas_List *borders, E_Menu *m) +{ + Evas_List *l = NULL, *ico = NULL; + E_Menu *subm; + E_Menu_Item *mi; + + 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; + } + _e_int_menus_clients_item_create(bd, m); + } + + _e_int_menus_clients_menu_add_iconified(ico, m); } static void @@ -1080,8 +1171,13 @@ _e_int_menus_clients_pre_cb(void *data, E_Menu *m) 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())); - desk = e_desk_current_get(zone); - for (l = e_border_client_list(); l; l = l->next) + desk = e_desk_current_get(zone); + + if (e_config->clientlist_sort_by == E_CLIENTLIST_SORT_MOST_RECENT) + l = e_border_focus_stack_get(); + else + l = e_border_client_list(); + for (; l; l = l->next) { E_Border *border; @@ -1104,31 +1200,31 @@ _e_int_menus_clients_pre_cb(void *data, E_Menu *m) if (borders) { + /* Sort the borders */ 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_sort_by == E_CLIENTLIST_SORT_ZORDER) + borders = evas_list_sort(borders, evas_list_count(borders), + _e_int_menus_clients_sort_z_order_cb); + + /* Group the borders */ if (e_config->clientlist_group_by == E_CLIENTLIST_GROUP_DESK) { - borders = evas_list_sort(borders, evas_list_count(borders), + 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); + _e_int_menus_clients_add_by_desk(desk, borders, m); } if (e_config->clientlist_group_by == E_CLIENTLIST_GROUP_CLASS) - { - 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); + { + 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); } if (e_config->clientlist_group_by == E_CLIENTLIST_GROUP_NONE) { - for (l = borders; l; l = l->next) - { - E_Border *bd; - - bd = l->data; - _e_int_menus_clients_item_create(bd, m); - } + _e_int_menus_clients_add_by_none(borders, m); } }