Am Samstag, den 14.01.2006, 23:20 +0200 schrieb Hisham Mardam Bey:
> > its old + new. I use the thinktux cvs, seems it isn´t updated there,
> > because otherwise my old changes wouldn´t be displayed by diff, right?
> 
> I forgot to cvs ci. (=
> I did it like 15 minutes ago, so it should be on thinktux in like 10
> mins or 15 mins max. (=

I don´t know if did you check it the old patch or took the new parts
out. The new stuff I mentioned in the last mail is in patch 6. It also
includes the right string-sizes for the assocs. 

In patch 5 is the beginning of the sort option. If you are pleased with
how it works in general, then it would be great if you could have a
deeper look at it. The problem is that one can change often between the
modes and sometimes not all appear again. After that happens a further
mode- or dir-change will cause an infinite loop at
icon_canvas_reset/_unpack.
(size and modtime show a strange sorting order)
   
can you please mention my patches as from 'jeff' the 'mista' just came
in my head as I was searching for something that sounds together with
rastamasta. 

> btw, are you on irc? (#edevelop)

no, not used to it. but i´ll come around.

> 
> --
> Hisham Mardam Bey
> MSc (Computer Science)
> http://hisham.cc/
> +9613609386
> Codito Ergo Sum (I Code Therefore I Am)
> 
? e_fileman_smart-2.c
Index: e_fileman_smart.c
===================================================================
RCS file: /root/e17/apps/e/src/bin/e_fileman_smart.c,v
retrieving revision 1.1.1.45
diff -u -r1.1.1.45 e_fileman_smart.c
--- e_fileman_smart.c	14 Jan 2006 21:35:10 -0000	1.1.1.45
+++ e_fileman_smart.c	15 Jan 2006 00:01:59 -0000
@@ -104,7 +104,8 @@
 static void                _e_fm_file_delete         (E_Fm_Icon *icon);
 
 static void                _e_fm_dir_set                (E_Fm_Smart_Data *sd, const char *dir);
-static int                _e_fm_dir_files_get          (void *data);
+static int                 _e_fm_dir_files_get          (void *data);
+static int                 _e_fm_dir_files_get_sorted   (E_Fm_Smart_Data *sd);
 static char               *_e_fm_dir_pop                (const char *path);
 static void                _e_fm_file_free              (E_Fm_Icon *icon);
 static void                _e_fm_dir_monitor_cb         (void *data, Ecore_File_Monitor *ecore_file_monitor,  Ecore_File_Event event, const char *path);
@@ -146,9 +147,13 @@
 static int                 _e_fm_drop_selection_cb (void *data, int type, void *event);
 static void                _e_fm_drop_done_cb      (E_Drag *drag, int dropped);
 
+static void 							 _e_fm_files_sort(E_Fm_Smart_Data *sd);
 static int                 _e_fm_files_sort_name_cb    (void *d1, void *d2);
 static int                 _e_fm_files_sort_modtime_cb (void *d1, void *d2);
 static int                 _e_fm_files_sort_layout_name_cb    (void *d1, void *d2);
+static int                 _e_fm_files_sort_name_dir_first_cb    (void *d1, void *d2);
+static int                 _e_fm_files_sort_extension_cb(void *d1, void *d2);
+static int                 _e_fm_files_sort_size_cb(void *d1, void *d2);
 
 static void                _e_fm_selector_send_file (E_Fm_Icon *icon);
 static void                _e_fm_selector_send_hilite_file (E_Fm_Icon *icon);
@@ -1357,27 +1362,120 @@
 
 static void
 _e_fm_menu_arrange_cb(void *data, E_Menu *m, E_Menu_Item *mi)
-{
+{   
    E_Fm_Smart_Data *sd;
 
    sd = data;
 
+   if(e_menu_item_num_get(mi) == sd->arrange)
+   	return;
+
    switch (e_menu_item_num_get(mi))
-     {
-      case E_FILEMAN_CANVAS_ARRANGE_NAME:
-	sd->files = evas_list_sort(sd->files, evas_list_count(sd->files), _e_fm_files_sort_name_cb);
-	sd->arrange = E_FILEMAN_CANVAS_ARRANGE_NAME;
-	_e_fm_redraw(sd);
-	break;
+    {
+     case E_FILEMAN_CANVAS_ARRANGE_NAME:
+       sd->arrange = E_FILEMAN_CANVAS_ARRANGE_NAME;
+       _e_fm_files_sort(sd);
+       break;
+     case E_FILEMAN_CANVAS_ARRANGE_MODTIME:
+       sd->arrange = E_FILEMAN_CANVAS_ARRANGE_MODTIME;
+       _e_fm_files_sort(sd);
+       break;
+     case E_FILEMAN_CANVAS_ARRANGE_NAME_DIR_FIRST:
+       sd->arrange = E_FILEMAN_CANVAS_ARRANGE_NAME_DIR_FIRST; 
+       _e_fm_files_sort(sd);
+       break;
+     case E_FILEMAN_CANVAS_ARRANGE_SIZE:
+       sd->arrange = E_FILEMAN_CANVAS_ARRANGE_SIZE; 
+       _e_fm_files_sort(sd);
+       break;
+     case E_FILEMAN_CANVAS_ARRANGE_EXTENSION:
+       sd->arrange = E_FILEMAN_CANVAS_ARRANGE_EXTENSION; 
+       _e_fm_files_sort(sd);
+       break;
+    }
+}
 
-      case E_FILEMAN_CANVAS_ARRANGE_MODTIME:
-	sd->files = evas_list_sort(sd->files, evas_list_count(sd->files), _e_fm_files_sort_modtime_cb);
-	sd->arrange = E_FILEMAN_CANVAS_ARRANGE_MODTIME;
-	_e_fm_redraw(sd);
-	break;
-     }
+
+static void 
+_e_fm_files_sort(E_Fm_Smart_Data *sd){
+	Ecore_Sheap            *heap;
+	Evas_List *list;
+	E_Fm_Icon *icon ,*icon_topdir;
+	icon_topdir = NULL;
+
+
+
+  e_icon_canvas_width_fix(sd->layout, sd->w);
+  sd->position = 0.0;
+  e_icon_canvas_reset(sd->layout);
+	
+	list = sd->files;
+	
+	
+  e_icon_canvas_freeze(sd->layout); 
+   
+
+/*	icon_topdir = list->data;
+	if(!strcmp(icon_topdir->file->name, ".."))
+		list = evas_list_remove_list(list,list);
+	else
+		icon_topdir = NULL;
+*/
+			
+	  switch(sd->arrange)
+	  {
+	  case E_FILEMAN_CANVAS_ARRANGE_NAME_DIR_FIRST:
+	  	heap = ecore_sheap_new(ECORE_COMPARE_CB(_e_fm_files_sort_name_dir_first_cb), evas_list_count(list));
+	  	break;
+	  case E_FILEMAN_CANVAS_ARRANGE_NAME:
+	  	heap = ecore_sheap_new(ECORE_COMPARE_CB(_e_fm_files_sort_name_cb), evas_list_count(list));
+			break;	  
+	  case E_FILEMAN_CANVAS_ARRANGE_MODTIME:
+	  	heap = ecore_sheap_new(ECORE_COMPARE_CB(_e_fm_files_sort_modtime_cb), evas_list_count(list));
+			break;
+		case E_FILEMAN_CANVAS_ARRANGE_SIZE:
+	  	heap = ecore_sheap_new(ECORE_COMPARE_CB(_e_fm_files_sort_size_cb), evas_list_count(list));
+			break;
+		case E_FILEMAN_CANVAS_ARRANGE_EXTENSION:
+	  	heap = ecore_sheap_new(ECORE_COMPARE_CB(_e_fm_files_sort_extension_cb), evas_list_count(list));
+	  	break;
+	  }
+	  
+	if(heap)
+	{
+	 sd->files = NULL;
+   
+   while (list)
+   {  
+		 icon = list->data;
+		 if(icon) ecore_sheap_insert(heap, icon); /* if(icon) ??? */
+	 	 list = list->next;
+   }
+   
+/*   if(icon_topdir)
+   {
+      sd->files = evas_list_append(sd->files, icon_topdir);     
+        e_icon_canvas_pack(sd->layout, icon_topdir->icon_obj, e_fm_icon_create, e_fm_icon_destroy, icon_topdir);
+   }
+*/   
+  
+   while ((icon = ecore_sheap_extract(heap)))
+   {
+     sd->files = evas_list_append(sd->files, icon);     
+     e_icon_canvas_pack(sd->layout, icon->icon_obj, e_fm_icon_create, e_fm_icon_destroy, icon);
+ 	 }
+   ecore_sheap_destroy(heap);   
+   
+   e_icon_canvas_thaw(sd->layout);
+   
+   e_icon_canvas_virtual_size_get(sd->layout, &sd->child.w, &sd->child.h);   
+   evas_object_smart_callback_call(sd->object, "changed", NULL);   
+	}
 }
 
+
+
+
 static void
 _e_fm_menu_refresh_cb(void *data, E_Menu *m, E_Menu_Item *mi)
 {
@@ -1388,6 +1486,7 @@
    _e_fm_redraw(sd);
 }
 
+
 static void
 _e_fm_dir_set(E_Fm_Smart_Data *sd, const char *dir)
 {
@@ -1493,12 +1592,55 @@
 	  }
      }
 
-   sd->dir2 = dir2;
-   if(sd->timer)
+   sd->dir2 = dir2;   
+   if(sd->arrange != E_FILEMAN_CANVAS_ARRANGE_NAME)
+   		_e_fm_dir_files_get_sorted(sd);
+   else 
+   { 
+  	if(sd->timer)
      ecore_timer_del(sd->timer);
-   sd->timer = ecore_timer_add(sd->timer_int, _e_fm_dir_files_get, sd);
+   	sd->timer = ecore_timer_add(sd->timer_int, _e_fm_dir_files_get, sd);
+   }
+}
+
+
+static int
+_e_fm_dir_files_get_sorted(E_Fm_Smart_Data *sd)
+{
+   E_Fm_Icon       *icon;   
+   char             path[PATH_MAX];
+
+		for(;sd->files_raw; sd->files_raw = evas_list_remove_list(sd->files_raw, sd->files_raw))
+		{  
+			 char *f;
+			 f = sd->files_raw->data;
+       icon = E_NEW(E_Fm_Icon, 1);
+       if (!icon) break; 
+			 snprintf(path, sizeof(path), "%s/%s", sd->dir, f);
+       icon->file = e_fm_file_new(path);
+       if (!icon->file)
+	 {
+	    E_FREE(icon);
+	 }
+	 		else
+	 {
+      icon->icon_obj = e_fm_icon_add(sd->evas);
+	    icon->sd = sd;
+	    e_fm_icon_file_set(icon->icon_obj, icon->file);
+	    sd->files = evas_list_append(sd->files, icon);  
+	    evas_object_event_callback_add(icon->icon_obj, EVAS_CALLBACK_MOUSE_DOWN, _e_fm_icon_mouse_down_cb, icon);
+	    evas_object_event_callback_add(icon->icon_obj, EVAS_CALLBACK_MOUSE_UP, _e_fm_icon_mouse_up_cb, icon);
+	    evas_object_event_callback_add(icon->icon_obj, EVAS_CALLBACK_MOUSE_IN, _e_fm_icon_mouse_in_cb, icon);
+	    evas_object_event_callback_add(icon->icon_obj, EVAS_CALLBACK_MOUSE_OUT, _e_fm_icon_mouse_out_cb, icon);
+	    evas_object_event_callback_add(icon->icon_obj, EVAS_CALLBACK_MOUSE_MOVE, _e_fm_icon_mouse_move_cb, sd);
+	    evas_object_show(icon->icon_obj);
+	 }
+	}		
+		_e_fm_files_sort(sd);
 }
 
+
+
 static int
 _e_fm_dir_files_get(void *data)
 {
@@ -1900,40 +2042,72 @@
 
 	sd->menu = mn;
 
-       /*- Arrange -*/
-	mi = e_menu_item_new(mn);
-	e_menu_item_label_set(mi, _("Arrange Icons"));
-	e_menu_item_icon_edje_set(mi,
-				  (char *)e_theme_edje_file_get("base/theme/fileman",
-								"fileman/button/arrange"),
-				  "fileman/button/arrange");
-
-	mn = e_menu_new();
-	e_menu_category_set(mn,"fileman/unknown/arrange");
-	e_menu_category_data_set("fileman/unknown/arrange",sd);
-	e_menu_item_submenu_set(mi, mn);
-
-	mi = e_menu_item_new(mn);
-	e_menu_item_label_set(mi, _("By Name"));
-	e_menu_item_radio_set(mi, 1);
-	e_menu_item_radio_group_set(mi, 2);
-	if (sd->arrange == E_FILEMAN_CANVAS_ARRANGE_NAME) e_menu_item_toggle_set(mi, 1);
-	e_menu_item_callback_set(mi, _e_fm_menu_arrange_cb, sd);
-	e_menu_item_icon_edje_set(mi,
-				  (char *)e_theme_edje_file_get("base/theme/fileman",
-								"fileman/button/arrange_name"),
-				  "fileman/button/arrange_name");
-
-	mi = e_menu_item_new(mn);
-	e_menu_item_label_set(mi, _("By Mod Time"));
-	e_menu_item_radio_set(mi, 1);
-	e_menu_item_radio_group_set(mi, 2);
-	if (sd->arrange == E_FILEMAN_CANVAS_ARRANGE_MODTIME) e_menu_item_toggle_set(mi, 1);
-	e_menu_item_callback_set(mi, _e_fm_menu_arrange_cb, sd);
-	e_menu_item_icon_edje_set(mi,
-				  (char *)e_theme_edje_file_get("base/theme/fileman",
-								"fileman/button/arrange_time"),
-				  "fileman/button/arrange_time");
+  /*- Arrange -*/
+   mi = e_menu_item_new(mn);
+   e_menu_item_label_set(mi, _("Arrange Icons"));
+   e_menu_item_icon_edje_set(mi,
+		 (char *)e_theme_edje_file_get("base/theme/fileman",
+					       "fileman/button/arrange"),
+		 "fileman/button/arrange");
+
+   mn = e_menu_new();
+   e_menu_item_submenu_set(mi, mn);
+
+   mi = e_menu_item_new(mn);
+   e_menu_item_label_set(mi, _("By Name"));
+   e_menu_item_radio_set(mi, 1);
+   e_menu_item_radio_group_set(mi, 2);
+   if (sd->arrange == E_FILEMAN_CANVAS_ARRANGE_NAME) e_menu_item_toggle_set(mi, 1);
+   e_menu_item_callback_set(mi, _e_fm_menu_arrange_cb, sd);
+   e_menu_item_icon_edje_set(mi,
+		 (char *)e_theme_edje_file_get("base/theme/fileman",
+					       "fileman/button/arrange_name"),
+		 "fileman/button/arrange_name");
+
+   mi = e_menu_item_new(mn);
+   e_menu_item_label_set(mi, _("By Mod Time"));
+   e_menu_item_radio_set(mi, 1);
+   e_menu_item_radio_group_set(mi, 2);
+   if (sd->arrange == E_FILEMAN_CANVAS_ARRANGE_MODTIME) e_menu_item_toggle_set(mi, 1);
+   e_menu_item_callback_set(mi, _e_fm_menu_arrange_cb, sd);
+   e_menu_item_icon_edje_set(mi,
+		 (char *)e_theme_edje_file_get("base/theme/fileman",
+					       "fileman/button/arrange_time"),
+		 "fileman/button/arrange_time");
+    
+    mi = e_menu_item_new(mn);
+   e_menu_item_label_set(mi, _("Directorys First"));
+   e_menu_item_radio_set(mi, 1);
+   e_menu_item_radio_group_set(mi, 2);
+   if (sd->arrange == E_FILEMAN_CANVAS_ARRANGE_NAME_DIR_FIRST) e_menu_item_toggle_set(mi, 1);
+   e_menu_item_callback_set(mi, _e_fm_menu_arrange_cb, sd);
+   e_menu_item_icon_edje_set(mi,
+		 (char *)e_theme_edje_file_get("base/theme/fileman",
+					       "fileman/button/arrange_name"),
+		 "fileman/button/arrange_name");
+		 
+	  mi = e_menu_item_new(mn);
+   e_menu_item_label_set(mi, _("By Size"));
+   e_menu_item_radio_set(mi, 1);
+   e_menu_item_radio_group_set(mi, 2);
+   if (sd->arrange == E_FILEMAN_CANVAS_ARRANGE_SIZE) e_menu_item_toggle_set(mi, 1);
+   e_menu_item_callback_set(mi, _e_fm_menu_arrange_cb, sd);
+   e_menu_item_icon_edje_set(mi,
+		 (char *)e_theme_edje_file_get("base/theme/fileman",
+					       "fileman/button/arrange_name"),
+		 "fileman/button/arrange_name");
+		 
+		   mi = e_menu_item_new(mn);
+   e_menu_item_label_set(mi, _("By Type"));
+   e_menu_item_radio_set(mi, 1);
+   e_menu_item_radio_group_set(mi, 2);
+   if (sd->arrange == E_FILEMAN_CANVAS_ARRANGE_EXTENSION) e_menu_item_toggle_set(mi, 1);
+   e_menu_item_callback_set(mi, _e_fm_menu_arrange_cb, sd);
+   e_menu_item_icon_edje_set(mi,
+		 (char *)e_theme_edje_file_get("base/theme/fileman",
+					       "fileman/button/arrange_name"),
+		 "fileman/button/arrange_name");	 
+       
        /*- New -*/
 	mi = e_menu_item_new(sd->menu);
 	e_menu_item_label_set(mi, _("New"));
@@ -3256,6 +3430,7 @@
    free(drag->data);
 }
 
+
 /* sort functions */
 static int
 _e_fm_files_sort_name_cb(void *d1, void *d2)
@@ -3273,10 +3448,10 @@
 {
    Evas_Object *e1, *e2;
    E_Fm_File *f1, *f2;
-
+   
    e1 = d1;
    e2 = d2;
-
+   
    f1 = e_fm_icon_file_get(e1);
    f2 = e_fm_icon_file_get(e2);
 
@@ -3294,6 +3469,54 @@
    return (e1->file->mtime > e2->file->mtime);
 }
 
+static int
+_e_fm_files_sort_size_cb(void *d1, void *d2)
+{
+   E_Fm_Icon *e1, *e2;
+
+   e1 = d1;
+   e2 = d2;
+
+   return (e1->file->size > e2->file->size);
+}
+
+static int
+_e_fm_files_sort_name_dir_first_cb(void *d1, void *d2)
+{
+   E_Fm_Icon *e1, *e2;
+
+   e1 = d1;
+   e2 = d2;
+	if(e1->file->type == E_FM_FILE_TYPE_DIRECTORY){
+		if(e2->file->type == E_FM_FILE_TYPE_DIRECTORY)
+			return (strcmp(e1->file->name, e2->file->name));
+		else
+			return -1;
+	}else 
+			if(e2->file->type == E_FM_FILE_TYPE_DIRECTORY)
+				return 1;
+			else
+				return (strcmp(e1->file->name, e2->file->name));
+}
+static int
+_e_fm_files_sort_extension_cb(void *d1, void *d2)
+{
+   E_Fm_Icon *e1, *e2;
+
+   e1 = d1;
+   e2 = d2;
+	if(e1->file->type == E_FM_FILE_TYPE_DIRECTORY){
+		if(e2->file->type == E_FM_FILE_TYPE_DIRECTORY)
+			return (strcmp(e1->file->mime, e2->file->mime));
+		else
+			return -1;
+	}else 
+			if(e2->file->type == E_FM_FILE_TYPE_DIRECTORY)
+				return 1;
+			else
+				return (strcmp(e1->file->mime, e2->file->mime));
+}
+
 static void
 _e_fm_selector_send_file(E_Fm_Icon *icon)
 {
Index: e_fileman_smart.h
===================================================================
RCS file: /root/e17/apps/e/src/bin/e_fileman_smart.h,v
retrieving revision 1.1.1.5
diff -u -r1.1.1.5 e_fileman_smart.h
--- e_fileman_smart.h	7 Jan 2006 00:06:11 -0000	1.1.1.5
+++ e_fileman_smart.h	15 Jan 2006 00:01:59 -0000
@@ -70,8 +70,10 @@
 enum _E_Fm_Arrange
 {
    E_FILEMAN_CANVAS_ARRANGE_NAME = 0,
-     E_FILEMAN_CANVAS_ARRANGE_MODTIME = 1,
-     E_FILEMAN_CANVAS_ARRANGE_SIZE = 2,
+   E_FILEMAN_CANVAS_ARRANGE_MODTIME = 1,
+   E_FILEMAN_CANVAS_ARRANGE_NAME_DIR_FIRST = 2,
+   E_FILEMAN_CANVAS_ARRANGE_SIZE = 3,
+   E_FILEMAN_CANVAS_ARRANGE_EXTENSION = 4
 };
 
 enum _E_Fm_State
Index: e_fileman_smart.c
===================================================================
RCS file: /root/e17/apps/e/src/bin/e_fileman_smart.c,v
retrieving revision 1.1.1.45
diff -u -r1.1.1.45 e_fileman_smart.c
--- e_fileman_smart.c	14 Jan 2006 21:35:10 -0000	1.1.1.45
+++ e_fileman_smart.c	14 Jan 2006 22:16:14 -0000
@@ -463,35 +463,35 @@
 /* local subsystem functions */
 
 int
-_e_fm_init_assoc(E_Fm_Smart_Data *sd)
+_e_fm_init_assoc(E_Fm_Smart_Data *sd) /* TODO: check if this gets freed correctly*/
 {
    E_Fm_Assoc_App *assoc;
 
    assoc = E_NEW(E_Fm_Assoc_App, 1);
    assoc->mime = (char*)E_NEW(char *, 5);
    snprintf(assoc->mime, 5, "%s", ".jpg");
-   assoc->app = (char*)E_NEW(char *, 7);
-   snprintf(assoc->app, 5, "gimp-remote");
+   assoc->app = (char*)E_NEW(char *, 12);
+   snprintf(assoc->app, 12, "gimp-remote");
    sd->conf.main->apps = evas_list_append(sd->conf.main->apps, assoc);
 
    assoc = E_NEW(E_Fm_Assoc_App, 1);
    assoc->mime = (char*)E_NEW(char *, 5);
    snprintf(assoc->mime, 5, "%s", ".jpg");
-   assoc->app = (char*)E_NEW(char *, 7);
+   assoc->app = (char*)E_NEW(char *, 8);
    snprintf(assoc->app, 8, "exhibit");
    sd->conf.main->apps = evas_list_append(sd->conf.main->apps, assoc);
 
    assoc = E_NEW(E_Fm_Assoc_App, 1);
    assoc->mime = (char*)E_NEW(char *, 5);
    snprintf(assoc->mime, 5, "%s", ".png");
-   assoc->app = (char*)E_NEW(char *, 7);
-   snprintf(assoc->app, 5, "gimp-remote");
+   assoc->app = (char*)E_NEW(char *, 12);
+   snprintf(assoc->app, 12, "gimp-remote");
    sd->conf.main->apps = evas_list_append(sd->conf.main->apps, assoc);
 
    assoc = E_NEW(E_Fm_Assoc_App, 1);
    assoc->mime = (char*)E_NEW(char *, 5);
    snprintf(assoc->mime, 5, "%s", ".png");
-   assoc->app = (char*)E_NEW(char *, 7);
+   assoc->app = (char*)E_NEW(char *, 8);
    snprintf(assoc->app, 8, "exhibit");
    sd->conf.main->apps = evas_list_append(sd->conf.main->apps, assoc);
 
@@ -505,10 +505,80 @@
    assoc = E_NEW(E_Fm_Assoc_App, 1);
    assoc->mime = (char*)E_NEW(char *, 5);
    snprintf(assoc->mime, 5, "%s", ".mp3");
-   assoc->app = (char*)E_NEW(char *, 7);
+   assoc->app = (char*)E_NEW(char *, 8);
    snprintf(assoc->app, 8, "xmms -Q");
    sd->conf.main->apps = evas_list_append(sd->conf.main->apps, assoc);
 
+   assoc = E_NEW(E_Fm_Assoc_App, 1);
+   assoc->mime = (char*)E_NEW(char *, 10);
+   snprintf(assoc->mime, 10, "%s", "directory");
+   assoc->app = (char*)E_NEW(char *, 8);
+   snprintf(assoc->app, 8, "entropy");
+   sd->conf.main->apps = evas_list_append(sd->conf.main->apps, assoc);
+
+   assoc = E_NEW(E_Fm_Assoc_App, 1);
+   assoc->mime = (char*)E_NEW(char *, 5);
+   snprintf(assoc->mime, 5, "%s", ".eap");
+   assoc->app = (char*)E_NEW(char *, 17);
+   snprintf(assoc->app, 17, "e_util_eapp_edit");
+   sd->conf.main->apps = evas_list_append(sd->conf.main->apps, assoc);
+ 
+	Evas_List *l, *list, *apps;
+
+
+	list = e_app_name_glob_list("*");
+	for (apps = sd->conf.main->apps; apps; apps = apps->next)
+	{
+		assoc = apps->data;
+		assoc->eap = NULL;
+		for (l = list; l; l = l->next)
+		{
+			E_App *a;
+			a = l->data; 
+			
+			if((a->exe) && !strncmp(a->exe, assoc->app, strlen(assoc->app)))
+			{
+				assoc->eap = a;		
+				break;
+			}
+		}
+	}
+	
+	
+	
+	/* THIS IS THE HACK */
+  char *token,*mime;
+  char dot[PATH_MAX]; 
+	for (l = list; l; l = l->next)
+	{
+		E_App *a;
+		a = l->data; 
+		if (a->exe && a->comment && strlen(a->comment) > 1)
+		{
+			mime = strdup(a->comment); 
+			if(token = strtok(mime, ";"))
+			{	
+				assoc = E_NEW(E_Fm_Assoc_App, 1);
+	   		snprintf(dot, PATH_MAX , _(".%s"), token);
+	   		assoc->mime = strdup(dot);
+	   		assoc->app = a->exe;
+	   		assoc->eap = a;
+	   		sd->conf.main->apps = evas_list_append(sd->conf.main->apps, assoc);
+				while(token = strtok(NULL, ";")) // take next token of mime
+				{
+					assoc = E_NEW(E_Fm_Assoc_App, 1);
+	   			snprintf(dot, PATH_MAX , _(".%s"), token);
+	   			assoc->mime = strdup(dot);
+	   			assoc->app = a->exe;
+	   			assoc->eap = a; 	   			
+	   			sd->conf.main->apps = evas_list_append(sd->conf.main->apps, assoc);			
+				}
+	 		}
+	  }	
+  } 
+ evas_list_free(list);
+ free(token);
+ free(mime);
    return 1;
 }
 
@@ -871,12 +941,15 @@
 static void
 _e_fm_file_menu_open(void *data, E_Menu *m, E_Menu_Item *mi)
 {
+   E_Fm_Smart_Data *sd;
    E_Fm_Icon *icon;
    E_Fm_Assoc_App *assoc;
    Evas_List *l;
-   icon = data;
+   
+   sd = data;
+   icon = sd->selection.current.file;
 
-   for (l = icon->sd->conf.main->apps; l; l = l->next)
+   for (l = sd->conf.main->apps; l; l = l->next)
      {
 	assoc = l->data;
 	if(!strcmp(assoc->app,mi->label)){
@@ -888,7 +961,7 @@
    switch (icon->file->type)
      {
       case E_FM_FILE_TYPE_DIRECTORY:
-	_e_fm_dir_set(icon->sd, icon->file->path);
+	_e_fm_dir_set(sd, icon->file->path);
 	break;
       case E_FM_FILE_TYPE_FILE:
 	if ((!e_fm_file_assoc_exec(icon->file) && (e_fm_file_can_exec(icon->file))))
@@ -2208,10 +2281,9 @@
 
 	mi = NULL;
 	if((mo = evas_hash_find(icon->sd->mime_menu_hash,icon->file->mime)) == NULL)
-	  {
-	     /*- Arrange -*/
-	     mo = e_menu_new();
+			{
 
+	     mo = e_menu_new();
 	     for (l = icon->sd->conf.main->apps; l; l = l->next)
 	       {
 		  assoc = l->data;
@@ -2223,13 +2295,13 @@
 		       e_menu_item_radio_set(mi, 1);
 		       e_menu_item_radio_group_set(mi, 2);
 
-		       /*
-		       if (!((assoc->app->icon_class) &&
-			     (e_util_menu_item_edje_icon_list_set(mi, assoc->app->icon_class))))
-			 e_menu_item_icon_edje_set(mi, assoc->app->path, "item");
-		       */
+		       if(assoc->eap)
+		       {
+		       	if (!e_util_menu_item_edje_icon_list_set(mi, assoc->eap->icon_class))
+							 e_menu_item_icon_edje_set(mi, assoc->eap->path, "icon");
+		       }
 
-		       e_menu_item_callback_set(mi, _e_fm_file_menu_open, icon);
+		       e_menu_item_callback_set(mi, _e_fm_file_menu_open, icon->sd);
 		    }
 		  assoc = NULL;
 	       }
@@ -2244,17 +2316,19 @@
 									  "fileman/button/open"),
 					    "fileman/button/open");
 	       }
-	  }
-	else
-	  {
-	     mi = e_menu_item_new(mn);
-	     e_menu_item_label_set(mi, _("Open with"));
-	     e_menu_item_icon_edje_set(mi,
-				       (char *)e_theme_edje_file_get("base/theme/fileman",
-								     "fileman/button/open"),
-				       "fileman/button/open");
-	     e_menu_item_submenu_set(mi, mo);
-	  }
+			}
+	     else
+   		{
+      mi = e_menu_item_new(mn);
+		  e_menu_item_submenu_set(mi, mo);
+		  e_menu_item_label_set(mi, _("Open with"));
+		  e_menu_item_icon_edje_set(mi,
+					    (char *)e_theme_edje_file_get("base/theme/fileman",
+									  "fileman/button/open"),
+					    "fileman/button/open");
+   		} 
+
+
 
 	mi = e_menu_item_new(mn);
 	e_menu_item_label_set(mi, _("Open"));
Index: e_fileman_smart.h
===================================================================
RCS file: /root/e17/apps/e/src/bin/e_fileman_smart.h,v
retrieving revision 1.1.1.5
diff -u -r1.1.1.5 e_fileman_smart.h
--- e_fileman_smart.h	7 Jan 2006 00:06:11 -0000	1.1.1.5
+++ e_fileman_smart.h	14 Jan 2006 22:16:14 -0000
@@ -193,6 +193,7 @@
 {
    char *mime;
    char *app;
+   E_App *eap;
 };
 
 EAPI int                   e_fm_init(void);

Reply via email to