Enlightenment CVS committal

Author  : raster
Project : e17
Module  : apps/e

Dir     : e17/apps/e/src/bin


Modified Files:
        e_fm.c e_fm.h e_fm_mime.c e_fm_mime.h e_int_config_mime.c 


Log Message:


fix list remove. add cache flush. use it.

===================================================================
RCS file: /cvs/e/e17/apps/e/src/bin/e_fm.c,v
retrieving revision 1.104
retrieving revision 1.105
diff -u -3 -r1.104 -r1.105
--- e_fm.c      3 Nov 2006 12:04:51 -0000       1.104
+++ e_fm.c      4 Nov 2006 02:31:52 -0000       1.105
@@ -14,17 +14,25 @@
  * custom frames or icons yet
  */
 
-typedef enum
+typedef enum _E_Fm2_Action_Type
 {
    FILE_ADD,
      FILE_DEL,
      FILE_CHANGE
 } E_Fm2_Action_Type;
-    
+
+typedef enum _E_Fm2_Fop_Type
+{
+   FOP_DELETE,
+     FOP_MOVE
+} E_Fm2_Fop_Type;
+
 typedef struct _E_Fm2_Smart_Data E_Fm2_Smart_Data;
 typedef struct _E_Fm2_Region     E_Fm2_Region;
 typedef struct _E_Fm2_Icon       E_Fm2_Icon;
 typedef struct _E_Fm2_Action     E_Fm2_Action;
+typedef struct _E_Fm2_Fop        E_Fm2_Fop;
+typedef struct _E_Fm2_Fop_Item   E_Fm2_Fop_Item;
 
 struct _E_Fm2_Smart_Data
 {
@@ -98,6 +106,8 @@
       char            *buf;
    } typebuf;
    
+   E_Fm2_Fop          *fop;
+   
    E_Object           *eobj;
    E_Drop_Handler     *drop_handler;
    E_Fm2_Icon         *drop_icon;
@@ -152,6 +162,23 @@
    int                flags;
 };
 
+struct _E_Fm2_Fop
+{
+   Evas_Object *obj;
+   const char  *dir;
+   Evas_List   *items;
+   Ecore_Idler *idler;
+};
+
+struct _E_Fm2_Fop_Item
+{
+   E_Fm2_Fop_Type  type;
+   E_Fm2_Fop      *fop;
+   const char     *file;
+   DIR            *dir;
+   unsigned char   is_dir : 1;
+};
+
 static const char *_e_fm2_dev_path_map(const char *dev, const char *path);
 static void _e_fm2_file_add(Evas_Object *obj, char *file, int unique, char 
*file_rel, int after);
 static void _e_fm2_file_del(Evas_Object *obj, char *file);
@@ -271,6 +298,7 @@
 static char *_e_fm2_meta_path = NULL;
 static Evas_Smart *_e_fm2_smart = NULL;
 static Evas_List *_e_fm2_list = NULL;
+static Evas_List *_e_fm2_fop_list = NULL;
 
 /* externally accessible functions */
 EAPI int
@@ -726,10 +754,185 @@
 }
 
 EAPI void
+e_fm2_all_icons_update(void)
+{
+   /* FIXME: implement - update all icons as config changes */
+}
+
+static E_Fm2_Fop *_e_fm2_fop_add(E_Fm2_Smart_Data *sd);
+static void _e_fm2_fop_del(E_Fm2_Fop *fop);
+static void _e_fm2_fop_detach(E_Fm2_Smart_Data *sd);
+static int _e_fm2_fop_process(E_Fm2_Fop *fop);
+static int _e_fm2_cb_fop_idler(void *data);
+static int _e_fm2_cb_fop_timer(void *data);
+
+static E_Fm2_Fop *
+_e_fm2_fop_add(E_Fm2_Smart_Data *sd)
+{
+   if (!sd->fop)
+     {
+       sd->fop = E_NEW(E_Fm2_Fop, 1);
+       if (!sd->fop) return NULL;
+       sd->fop->obj = sd->obj;
+       sd->fop->dir = evas_stringshare_add(e_fm2_real_path_get(sd->obj));
+       if (!sd->fop->dir)
+         {
+            free(sd->fop);
+            sd->fop = NULL;
+            return NULL;
+         }
+       sd->fop->idler = ecore_idler_add(_e_fm2_cb_fop_idler, sd->fop);
+       if (!sd->fop->idler)
+         {
+            evas_stringshare_del(sd->fop->dir);
+            free(sd->fop);
+            sd->fop = NULL;
+            return NULL;
+         }
+       /* FIXME: add a timer that updates the fop->obj to the current
+        * file being deleted and spin the wheel
+        */
+     }
+   _e_fm2_fop_list = evas_list_append(_e_fm2_fop_list, sd->fop);
+   return sd->fop;
+}
+
+static void
+_e_fm2_fop_del(E_Fm2_Fop *fop)
+{
+   if (fop->idler)
+     {
+       ecore_idler_del(fop->idler);
+       fop->idler = NULL;
+     } 
+   /* FIXME: delete timer */
+   if (fop->dir)
+     {
+       evas_stringshare_del(fop->dir);
+       fop->dir = NULL;
+     }
+   if (fop->obj)
+     {
+       E_Fm2_Smart_Data *sd;
+       
+       sd = evas_object_smart_data_get(fop->obj);
+       if (sd) sd->fop = NULL;
+       fop->obj = NULL;
+     }
+   _e_fm2_fop_list = evas_list_remove(_e_fm2_fop_list, fop);
+  free(fop);
+}
+
+static void
+_e_fm2_fop_detach(E_Fm2_Smart_Data *sd)
+{
+   if (!sd->fop) return;
+   sd->fop->obj = NULL;
+   sd->fop = NULL;
+}
+
+static int
+_e_fm2_fop_process(E_Fm2_Fop *fop)
+{
+   E_Fm2_Fop_Item *fi, *fi2;
+   char buf[4096];
+   struct dirent *dp;
+   
+   if (fop->items) return 0;
+   fi = fop->items->data;
+   switch (fi->type)
+     {
+      case FOP_DELETE:
+       if (fi->dir)
+         {
+            dp = readdir(fi->dir);
+            if (!dp)
+              {
+                 snprintf(buf, sizeof(buf), "%s/%s", fi->fop->dir, fi->file);
+                 ecore_file_rmdir(buf);
+              }
+            else
+              {
+                 if ((!strcmp(dp->d_name, ".")) || (!strcmp(dp->d_name, 
".."))) return 1;
+                 fi2 = E_NEW(E_Fm2_Fop_Item, 1);
+                 fi2->fop = fop;
+                 fi2->type = FOP_DELETE;
+                 snprintf(buf, sizeof(buf), "%s/%s/%s", fi->fop->dir, 
fi->file, dp->d_name);
+                 fi2->is_dir = ecore_file_is_dir(buf);
+                 snprintf(buf, sizeof(buf), "%s/%s", fi->file, dp->d_name);
+                 fi2->file = evas_stringshare_add(buf);
+                 fi->fop->items = evas_list_prepend(fi->fop->items, fi2);
+                 return 1;
+              }
+         }
+       else if (fi->is_dir)
+         {
+            snprintf(buf, sizeof(buf), "%s/%s", fi->fop->dir, fi->file);
+            fi->dir = opendir(buf);
+            if (!fi->dir)
+              ecore_file_rmdir(buf);
+            else
+              return 1;
+         }
+       else
+         {
+            snprintf(buf, sizeof(buf), "%s/%s", fi->fop->dir, fi->file);
+            ecore_file_unlink(buf);
+         }
+       break;
+      case FOP_MOVE:
+       /* FIXME: */
+       break;
+      default:
+       break;
+     }
+   /* remove and free */
+   fop->items = evas_list_remove_list(fop->items, fop->items);
+   if (fi->file)
+     {
+       evas_stringshare_del(fi->file);
+       fi->file = NULL;
+     }
+   if (fi->dir)
+     {
+       closedir(fi->dir);
+       fi->dir = NULL;
+     }
+   free(fi);
+   if (fop->items) return 0;
+   return 1;
+}
+
+static int
+_e_fm2_cb_fop_idler(void *data)
+{
+   E_Fm2_Fop *fop;
+   
+   fop = data;
+   if (!_e_fm2_fop_process(fop))
+     {
+       _e_fm2_fop_del(fop);
+       return 0;
+     }
+   return 1;
+}
+
+static int
+_e_fm2_cb_fop_timer(void *data)
+{
+   E_Fm2_Fop *fop;
+   
+   fop = data;
+   return 1;
+}
+
+EAPI void
 e_fm2_fop_delete_add(Evas_Object *obj, E_Fm2_Icon_Info *ici)
 {
    E_Fm2_Smart_Data *sd;
-
+   E_Fm2_Fop *fop;
+   E_Fm2_Fop_Item *fi;
+   
    sd = evas_object_smart_data_get(obj);
    if (!sd) return; // safety
    if (!evas_object_type_get(obj)) return; // safety
@@ -751,6 +954,15 @@
     * per fop item processed, if obj is attached to fop - report status usig
     * the status overlay for the fm edj obj.
     */
+   fop = _e_fm2_fop_add(sd);
+   if (!fop) return;
+   
+   fi = E_NEW(E_Fm2_Fop_Item, 1);
+   fi->fop = fop;
+   fi->type = FOP_DELETE;
+   fi->file = evas_stringshare_add(ici->file);
+   if (S_ISDIR(ici->statinfo.st_mode)) fi->is_dir = 1;
+   fi->fop->items = evas_list_append(fi->fop->items, fi);
 }
 
 /* FIXME: not so easy with .orders etc. */
===================================================================
RCS file: /cvs/e/e17/apps/e/src/bin/e_fm.h,v
retrieving revision 1.28
retrieving revision 1.29
diff -u -3 -r1.28 -r1.29
--- e_fm.h      1 Nov 2006 12:52:49 -0000       1.28
+++ e_fm.h      4 Nov 2006 02:31:52 -0000       1.29
@@ -139,5 +139,6 @@
 EAPI void                  e_fm2_pan_max_get(Evas_Object *obj, Evas_Coord *x, 
Evas_Coord *y);
 EAPI void                  e_fm2_pan_child_size_get(Evas_Object *obj, 
Evas_Coord *w, Evas_Coord *h);
 
+EAPI void                  e_fm2_all_icons_update(void);
 #endif
 #endif
===================================================================
RCS file: /cvs/e/e17/apps/e/src/bin/e_fm_mime.c,v
retrieving revision 1.9
retrieving revision 1.10
diff -u -3 -r1.9 -r1.10
--- e_fm_mime.c 22 Sep 2006 19:55:11 -0000      1.9
+++ e_fm_mime.c 4 Nov 2006 02:31:53 -0000       1.10
@@ -69,20 +69,10 @@
    const char *homedir = NULL;
    Evas_List *l;
    E_Config_Mime_Icon *mi;
-   Evas_List *freelist = NULL;
    
-   /* 0.0 clean out hash cache once it has mroe than 256 entried in it */
-   if (evas_hash_size(icon_map) > 256)
-     {
-       evas_hash_foreach(icon_map, _e_fm_mime_icon_foreach, &freelist);
-       while (freelist)
-         {
-            evas_stringshare_del(freelist->data);
-            freelist = evas_list_remove_list(freelist, freelist);
-         }
-       evas_hash_free(icon_map);
-       icon_map = NULL;
-     }
+   /* 0.0 clean out hash cache once it has mroe than 512 entries in it */
+   if (evas_hash_size(icon_map) > 512) e_fm_mime_icon_cache_flush();
+   
    /* 0. look in mapping cache */
    val = evas_hash_find(icon_map, mime);
    if (val) return val;
@@ -149,6 +139,21 @@
    icon_map = evas_hash_add(icon_map, mime, val);
    return val;
    
+}
+
+EAPI void
+e_fm_mime_icon_cache_flush(void)
+{
+   Evas_List *freelist = NULL;
+   
+   evas_hash_foreach(icon_map, _e_fm_mime_icon_foreach, &freelist);
+   while (freelist)
+     {
+       evas_stringshare_del(freelist->data);
+       freelist = evas_list_remove_list(freelist, freelist);
+     }
+   evas_hash_free(icon_map);
+   icon_map = NULL;
 }
 
 /* local subsystem functions */
===================================================================
RCS file: /cvs/e/e17/apps/e/src/bin/e_fm_mime.h,v
retrieving revision 1.2
retrieving revision 1.3
diff -u -3 -r1.2 -r1.3
--- e_fm_mime.h 16 Sep 2006 11:35:54 -0000      1.2
+++ e_fm_mime.h 4 Nov 2006 02:31:53 -0000       1.3
@@ -9,6 +9,7 @@
 
 EAPI const char *e_fm_mime_filename_get(const char *fname);
 EAPI const char *e_fm_mime_icon_get(const char *mime);
+EAPI void e_fm_mime_icon_cache_flush(void);
     
 #endif
 #endif
===================================================================
RCS file: /cvs/e/e17/apps/e/src/bin/e_int_config_mime.c,v
retrieving revision 1.8
retrieving revision 1.9
diff -u -3 -r1.8 -r1.9
--- e_int_config_mime.c 4 Nov 2006 02:04:39 -0000       1.8
+++ e_int_config_mime.c 4 Nov 2006 02:31:53 -0000       1.9
@@ -277,14 +277,15 @@
        mi = l->data;
        if (!mi) continue;
        if (strcmp(mi->mime, cfdata->sel_mt)) continue;
-       if (mi->mime)
-         evas_stringshare_del(mi->mime);
-       if (mi->icon)
-         evas_stringshare_del(mi->icon);
-       e_config->mime_icons = evas_list_remove_list(e_config->mime_icons, 
-                                                    e_config->mime_icons);
+       if (mi->mime) evas_stringshare_del(mi->mime);
+       if (mi->icon) evas_stringshare_del(mi->icon);
+       e_config->mime_icons = evas_list_remove_list(e_config->mime_icons, l);
        break;
      }
+   e_config_save_queue();
+   e_fm_mime_icon_cache_flush();
+   e_fm2_all_icons_update();
+   
    _fill_data(cfdata);
    _fill_list(cfdata);
 }
@@ -319,6 +320,8 @@
 
    e_config->mime_icons = evas_list_append(e_config->mime_icons, mime);
    e_config_save_queue();
+   e_fm_mime_icon_cache_flush();
+   e_fm2_all_icons_update();
 
    _fill_data(cfdata);
    _fill_list(cfdata);



-------------------------------------------------------------------------
Using Tomcat but need to do more? Need to support web services, security?
Get stuff done quickly with pre-integrated technology to make your job easier
Download IBM WebSphere Application Server v.1.0.1 based on Apache Geronimo
http://sel.as-us.falkag.net/sel?cmd=lnk&kid=120709&bid=263057&dat=121642
_______________________________________________
enlightenment-cvs mailing list
enlightenment-cvs@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/enlightenment-cvs

Reply via email to