improvements to the tabbed e_fwin. changing tabs will not cause a reload, since each...
authorViktor Kojouharov <vkojouharov@gmail.com>
Tue, 28 Apr 2009 17:38:09 +0000 (17:38 +0000)
committerViktor Kojouharov <vkojouharov@gmail.com>
Tue, 28 Apr 2009 17:38:09 +0000 (17:38 +0000)
ctrl+w will close the current tab. if there are no more tabs, the window will be closed

SVN revision: 40447

src/bin/e_toolbar.c
src/bin/e_toolbar.h
src/bin/e_widget_toolbar.c
src/bin/e_widget_toolbar.h
src/modules/fileman/e_fwin.c

index f369360..0355ceb 100644 (file)
@@ -148,6 +148,15 @@ e_toolbar_show(E_Toolbar *tbar)
 }
 
 EAPI void 
+e_toolbar_hide(E_Toolbar *tbar) 
+{
+   E_OBJECT_CHECK(tbar);
+   E_OBJECT_TYPE_CHECK(tbar, E_TOOLBAR_TYPE);
+   evas_object_hide(tbar->o_event);
+   evas_object_hide(tbar->o_base);
+}
+
+EAPI void 
 e_toolbar_move(E_Toolbar *tbar, int x, int y) 
 {
    E_OBJECT_CHECK(tbar);
index ac09c71..055d1e5 100644 (file)
@@ -34,6 +34,7 @@ EAPI E_Win       *e_toolbar_fwin_get      (E_Toolbar *tbar);
 EAPI void         e_toolbar_fm2_set       (E_Toolbar *tbar, Evas_Object *fm2);
 EAPI Evas_Object *e_toolbar_fm2_get       (E_Toolbar *tbar);
 EAPI void         e_toolbar_show          (E_Toolbar *tbar);
+EAPI void         e_toolbar_hide          (E_Toolbar *tbar);
 EAPI void         e_toolbar_move          (E_Toolbar *tbar, int x, int y);
 EAPI void         e_toolbar_resize        (E_Toolbar *tbar, int w, int h);
 EAPI void         e_toolbar_move_resize   (E_Toolbar *tbar, int x, int y, int w, int h);
index f46896a..ac322e6 100644 (file)
@@ -135,6 +135,23 @@ e_widget_toolbar_item_append(Evas_Object *obj, Evas_Object *icon, const char *la
 }
 
 EAPI void
+e_widget_toolbar_item_remove(Evas_Object *obj, int num)
+{
+   E_Widget_Data *wd;
+   Item *it;
+
+   wd = e_widget_data_get(obj);
+   it = eina_list_nth(wd->items, num);
+   if (it)
+     {
+       evas_object_del(it->o_base);
+       evas_object_del(it->o_icon);
+       wd->items = eina_list_remove(wd->items, it);
+       free(it);
+     }
+}
+
+EAPI void
 e_widget_toolbar_item_select(Evas_Object *obj, int num)
 {
    E_Widget_Data *wd;
index 0455625..1dfc13d 100644 (file)
@@ -8,6 +8,7 @@
 
 EAPI Evas_Object *e_widget_toolbar_add(Evas *evas, int icon_w, int icon_h);
 EAPI void e_widget_toolbar_item_append(Evas_Object *obj, Evas_Object *icon, const char *label, void (*func) (void *data1, void *data2), const void *data1, const void *data2);
+EAPI void e_widget_toolbar_item_remove(Evas_Object *obj, int num);
 EAPI void e_widget_toolbar_item_select(Evas_Object *obj, int num);
 EAPI void e_widget_toolbar_item_label_set(Evas_Object *obj, int num, const char *label);
 EAPI void e_widget_toolbar_scrollable_set(Evas_Object *obj, Evas_Bool scrollable);
index 2e768f1..03f72d6 100644 (file)
@@ -15,7 +15,7 @@
  */
 
 typedef struct _E_Fwin E_Fwin;
-typedef struct _E_Fwin_Page_Info E_Fwin_Page_Info;
+typedef struct _E_Fwin_Page E_Fwin_Page;
 typedef struct _E_Fwin_Apps_Dialog E_Fwin_Apps_Dialog;
 
 #define E_FWIN_TYPE 0xE0b0101f
@@ -26,42 +26,40 @@ struct _E_Fwin
 
    E_Win               *win;
    E_Zone              *zone;
-   Evas_Object         *scrollframe_obj;
    Evas_Object        *tb_obj;
-   Evas_Object         *fm_obj;
    Evas_Object         *bg_obj;
    E_Fwin_Apps_Dialog  *fad;
 
-   Eina_List          *page_info;
-   int                 page_index;
+   Eina_List          *pages;
+   E_Fwin_Page        *cur_page;
+   int                  page_index;
 
    Evas_Object         *under_obj;
    Evas_Object         *over_obj;
-   struct {
-      Evas_Coord        x, y, max_x, max_y, w, h;
-   } fm_pan, fm_pan_last;
 
    const char         *wallpaper_file;
    const char         *overlay_file;
    const char         *scrollframe_file;
    const char         *theme_file;
 
-   E_Toolbar          *tbar;
    Ecore_Event_Handler *zone_handler;
    Ecore_Event_Handler *zone_del_handler;
-   Ecore_Event_Handler *fm_op_entry_add_handler;
 
    unsigned char        geom_save_ready : 1;
 };
 
-struct _E_Fwin_Page_Info
+struct _E_Fwin_Page
 {
-   const char *dev;
-   const char *path;
+   E_Fwin             *fwin;
+   Ecore_Event_Handler *fm_op_entry_add_handler;
+
+   Evas_Object         *scrollframe_obj;
+   Evas_Object         *fm_obj;
+   E_Toolbar           *tbar;
 
    struct {
-       Evas_Coord x, y;
-   } scroll;
+      Evas_Coord        x, y, max_x, max_y, w, h;
+   } fm_pan, fm_pan_last;
 
    int index;
 };
@@ -89,15 +87,16 @@ typedef enum
 /* local subsystem prototypes */
 static E_Fwin *_e_fwin_new(E_Container *con, const char *dev, const char *path);
 static void _e_fwin_free(E_Fwin *fwin);
+static E_Fwin_Page *_e_fwin_page_create(E_Fwin *fwin);
+static void _e_fwin_page_free(E_Fwin_Page *page);
 static void _e_fwin_page_new(E_Fwin *fwin);
-static E_Fwin_Page_Info *_e_fwin_page_info_new(E_Fwin *fwin);
 static void _e_fwin_cb_page_change(void *data1, void *data2);
 static void _e_fwin_cb_delete(E_Win *win);
 static void _e_fwin_cb_move(E_Win *win);
 static void _e_fwin_cb_resize(E_Win *win);
 static void _e_fwin_deleted(void *data, Evas_Object *obj, void *event_info);
 static const char *_e_fwin_custom_file_path_eval(E_Fwin *fwin, Efreet_Desktop *ef, const char *prev_path, const char *key);
-static void _e_fwin_desktop_run(Efreet_Desktop *desktop, E_Fwin *fwin);
+static void _e_fwin_desktop_run(Efreet_Desktop *desktop, E_Fwin_Page *page);
 static Eina_List *_e_fwin_suggested_apps_list_get(Eina_List *files, Eina_List **mime_list);
 static void _e_fwin_changed(void *data, Evas_Object *obj, void *event_info);
 static void _e_fwin_selected(void *data, Evas_Object *obj, void *event_info);
@@ -117,27 +116,28 @@ static void _e_fwin_cb_close(void *data, E_Dialog *dia);
 static void _e_fwin_cb_dialog_free(void *obj);
 static Eina_Bool _e_fwin_cb_hash_foreach(const Eina_Hash *hash __UNUSED__, const void *key, void *data __UNUSED__, void *fdata);
 static E_Fwin_Exec_Type _e_fwin_file_is_exec(E_Fm2_Icon_Info *ici);
-static void _e_fwin_file_exec(E_Fwin *fwin, E_Fm2_Icon_Info *ici, E_Fwin_Exec_Type ext);
-static void _e_fwin_file_open_dialog(E_Fwin *fwin, Eina_List *files, int always);
+static void _e_fwin_file_exec(E_Fwin_Page *page, E_Fm2_Icon_Info *ici, E_Fwin_Exec_Type ext);
+static void _e_fwin_file_open_dialog(E_Fwin_Page *page, Eina_List *files, int always);
 
 static void _e_fwin_pan_set(Evas_Object *obj, Evas_Coord x, Evas_Coord y);
 static void _e_fwin_pan_get(Evas_Object *obj, Evas_Coord *x, Evas_Coord *y);
 static void _e_fwin_pan_max_get(Evas_Object *obj, Evas_Coord *x, Evas_Coord *y);
 static void _e_fwin_pan_child_size_get(Evas_Object *obj, Evas_Coord *w, Evas_Coord *h);
-static void _e_fwin_pan_scroll_update(E_Fwin *fwin);
+static void _e_fwin_pan_scroll_update(E_Fwin_Page *page);
 
 static void _e_fwin_zone_cb_mouse_down(void *data, Evas *evas, Evas_Object *obj, void *event_info);
 static int  _e_fwin_zone_move_resize(void *data, int type, void *event);
 static int  _e_fwin_zone_del(void *data, int type, void *event);
-static void _e_fwin_config_set(E_Fwin *fwin);
-static void _e_fwin_window_title_set(E_Fwin *fwin);
-static void _e_fwin_toolbar_resize(E_Fwin *fwin);
+static void _e_fwin_config_set(E_Fwin_Page *page);
+static void _e_fwin_window_title_set(E_Fwin_Page *page);
+static void _e_fwin_page_resize(E_Fwin_Page *page);
+static void _e_fwin_toolbar_resize(E_Fwin_Page *page);
 static int _e_fwin_dlg_cb_desk_sort(const void *p1, const void *p2);
 static int _e_fwin_dlg_cb_desk_list_sort(const void *data1, const void *data2);
 
 static void _e_fwin_op_registry_listener_cb(void *data, const E_Fm2_Op_Registry_Entry *ere);
 static int _e_fwin_op_registry_entry_add_cb(void *data, int type, void *event);
-static void _e_fwin_op_registry_entry_iter(E_Fwin *fwin);
+static void _e_fwin_op_registry_entry_iter(E_Fwin_Page *page);
 
 /* local subsystem globals */
 static Eina_List *fwins = NULL;
@@ -179,7 +179,7 @@ e_fwin_new(E_Container *con, const char *dev, const char *path)
 
    if (!fwin) return;
 
-   snprintf(buf, sizeof(buf), "dir::%s", e_fm2_real_path_get(fwin->fm_obj));
+   snprintf(buf, sizeof(buf), "dir::%s", e_fm2_real_path_get(fwin->cur_page->fm_obj));
    cf = e_fm2_custom_file_get(buf);
    if ((cf) && (cf->geom.valid))
      {
@@ -225,12 +225,16 @@ EAPI void
 e_fwin_zone_new(E_Zone *zone, const char *dev, const char *path)
 {
    E_Fwin *fwin;
+   E_Fwin_Page *page;
    Evas_Object *o;
 
    fwin = E_OBJECT_ALLOC(E_Fwin, E_FWIN_TYPE, _e_fwin_free);
    if (!fwin) return;
    fwin->zone = zone;
 
+   page = E_NEW(E_Fwin_Page, 1);
+   page->fwin = fwin;
+
    /* Add Event Handler for zone move/resize & del */
    fwin->zone_handler = 
      ecore_event_handler_add(E_EVENT_ZONE_MOVE_RESIZE, 
@@ -247,21 +251,21 @@ e_fwin_zone_new(E_Zone *zone, const char *dev, const char *path)
    fwins = eina_list_append(fwins, fwin);
 
    o = e_fm2_add(zone->container->bg_evas);
-   fwin->fm_obj = o;
-   _e_fwin_config_set(fwin);
+   page->fm_obj = o;
+   _e_fwin_config_set(page);
 
    e_fm2_custom_theme_content_set(o, "desktop");
 
    evas_object_smart_callback_add(o, "dir_changed",
-                                 _e_fwin_changed, fwin);
+                                 _e_fwin_changed, page);
    evas_object_smart_callback_add(o, "dir_deleted",
-                                 _e_fwin_deleted, fwin);
+                                 _e_fwin_deleted, page);
    evas_object_smart_callback_add(o, "selected",
-                                 _e_fwin_selected, fwin);
+                                 _e_fwin_selected, page);
    evas_object_smart_callback_add(o, "selection_change",
-                                 _e_fwin_selection_change, fwin);
-   e_fm2_icon_menu_start_extend_callback_set(o, _e_fwin_cb_menu_extend_start, fwin);
-   e_fm2_icon_menu_end_extend_callback_set(o, _e_fwin_menu_extend, fwin);
+                                 _e_fwin_selection_change, page);
+   e_fm2_icon_menu_start_extend_callback_set(o, _e_fwin_cb_menu_extend_start, page);
+   e_fm2_icon_menu_end_extend_callback_set(o, _e_fwin_menu_extend, page);
    e_fm2_underlay_hide(o);
    evas_object_show(o);
 
@@ -285,23 +289,26 @@ e_fwin_zone_new(E_Zone *zone, const char *dev, const char *path)
     * same as currently done for bg & overlay. also add to fm2 the ability
     * to specify the .edj files to get the list and icon theme stuff from
     */
-   evas_object_data_set(fwin->fm_obj, "fwin", fwin);
-   e_scrollframe_extern_pan_set(o, fwin->fm_obj,
+   evas_object_data_set(page->fm_obj, "fm_page", page);
+   e_scrollframe_extern_pan_set(o, page->fm_obj,
                                _e_fwin_pan_set,
                                _e_fwin_pan_get,
                                _e_fwin_pan_max_get,
                                _e_fwin_pan_child_size_get);
-   evas_object_propagate_events_set(fwin->fm_obj, 0);
-   fwin->scrollframe_obj = o;
+   evas_object_propagate_events_set(page->fm_obj, 0);
+   page->scrollframe_obj = o;
    evas_object_move(o, fwin->zone->x, fwin->zone->y);
    evas_object_resize(o, fwin->zone->w, fwin->zone->h);
    evas_object_show(o);
 
-   e_fm2_window_object_set(fwin->fm_obj, E_OBJECT(fwin->zone));
+   e_fm2_window_object_set(page->fm_obj, E_OBJECT(fwin->zone));
+
+   evas_object_focus_set(page->fm_obj, 1);
 
-   evas_object_focus_set(fwin->fm_obj, 1);
+   e_fm2_path_set(page->fm_obj, dev, path);
 
-   e_fm2_path_set(fwin->fm_obj, dev, path);
+   fwin->pages = eina_list_append(fwin->pages, page);
+   fwin->cur_page = fwin->pages->data;
 }
 
 EAPI void
@@ -312,7 +319,7 @@ e_fwin_all_unsel(void *data)
    fwin = data;
    E_OBJECT_CHECK(fwin);
    E_OBJECT_TYPE_CHECK(fwin, E_FWIN_TYPE);
-   e_fm2_all_unsel(fwin->fm_obj);
+   e_fm2_all_unsel(fwin->cur_page->fm_obj);
 }
 
 EAPI void 
@@ -346,9 +353,15 @@ e_fwin_reload_all(void)
          e_fwin_zone_shutdown(fwin->zone);
        else 
          {
-            _e_fwin_config_set(fwin);
-            e_fm2_refresh(fwin->fm_obj);
-            _e_fwin_window_title_set(fwin);
+            Eina_List *l2;
+            E_Fwin_Page *page;
+
+            EINA_LIST_FOREACH(fwin->pages, l2, page)
+              {
+                 _e_fwin_config_set(page);
+                 e_fm2_refresh(page->fm_obj);
+                 _e_fwin_window_title_set(page);
+              }
          }
      }
 
@@ -392,6 +405,7 @@ static E_Fwin *
 _e_fwin_new(E_Container *con, const char *dev, const char *path) 
 {
    E_Fwin *fwin;
+   E_Fwin_Page *page;
    Evas_Object *o;
 
    fwin = E_OBJECT_ALLOC(E_Fwin, E_FWIN_TYPE, _e_fwin_free);
@@ -414,59 +428,9 @@ _e_fwin_new(E_Container *con, const char *dev, const char *path)
    evas_object_show(o);
    fwin->bg_obj = o;
 
-   o = e_fm2_add(e_win_evas_get(fwin->win));
-   fwin->fm_obj = o;
-   _e_fwin_config_set(fwin);
-   e_fm2_view_flags_set(o, E_FM2_VIEW_DIR_CUSTOM);
-   evas_object_event_callback_add(o, EVAS_CALLBACK_KEY_DOWN, _e_fwin_cb_key_down, fwin);
-
-   evas_object_smart_callback_add(o, "dir_changed",
-                                 _e_fwin_changed, fwin);
-   evas_object_smart_callback_add(o, "dir_deleted",
-                                 _e_fwin_deleted, fwin);
-   evas_object_smart_callback_add(o, "selected",
-                                 _e_fwin_selected, fwin);
-   evas_object_smart_callback_add(o, "selection_change",
-                                 _e_fwin_selection_change, fwin);
-   e_fm2_icon_menu_start_extend_callback_set(o, _e_fwin_cb_menu_extend_start, fwin);
-   e_fm2_icon_menu_end_extend_callback_set(o, _e_fwin_menu_extend, fwin);
-   evas_object_show(o);
-
-   o = e_scrollframe_add(e_win_evas_get(fwin->win));
-   /* FIXME: this theme object will have more versions and options later
-    * for things like swallowing widgets/buttons ot providing them - a
-    * gadcon for starters for fm widgets. need to register the owning 
-    * e_object of the gadcon so gadcon clients can get it and thus do
-    * things like find out what dirs/path the fwin is for etc. this will
-    * probably be how you add optional gadgets to fwin views like empty/full
-    * meters for disk usage, and other dir info/stats or controls. also it
-    * might be possible that we can have custom frames per dir later so need
-    * a way to set an edje file directly
-    */
-   /* FIXME: allow specialised scrollframe obj per dir - get from e config,
-    * then look in the dir itself for a magic dot-file, if not - use theme.
-    * same as currently done for bg & overlay. also add to fm2 the ability
-    * to specify the .edj files to get the list and icon theme stuff from
-    */
-   e_scrollframe_custom_theme_set(o, "base/theme/fileman",
-                                 "e/fileman/default/scrollframe");
-   evas_object_data_set(fwin->fm_obj, "fwin", fwin);
-   e_scrollframe_extern_pan_set(o, fwin->fm_obj,
-                               _e_fwin_pan_set,
-                               _e_fwin_pan_get,
-                               _e_fwin_pan_max_get,
-                               _e_fwin_pan_child_size_get);
-   evas_object_propagate_events_set(fwin->fm_obj, 0);
-   fwin->scrollframe_obj = o;
-   evas_object_move(o, 0, 0);
-   evas_object_show(o);
-
-   if (fileman_config->view.show_toolbar) 
-     {
-       fwin->tbar = e_toolbar_new(e_win_evas_get(fwin->win), "toolbar", 
-                                  fwin->win, fwin->fm_obj);
-       e_toolbar_show(fwin->tbar);
-     }
+   page = _e_fwin_page_create(fwin);
+   fwin->pages = eina_list_append(fwin->pages, page);
+   fwin->cur_page = page;
 
    o = edje_object_add(e_win_evas_get(fwin->win));
    edje_object_part_swallow(fwin->bg_obj, "e.swallow.bg", o);
@@ -474,19 +438,14 @@ _e_fwin_new(E_Container *con, const char *dev, const char *path)
    fwin->under_obj = o;
 
    o = edje_object_add(e_win_evas_get(fwin->win));
-   edje_object_part_swallow(e_scrollframe_edje_object_get(fwin->scrollframe_obj), "e.swallow.overlay", o);
+   edje_object_part_swallow(e_scrollframe_edje_object_get(page->scrollframe_obj), "e.swallow.overlay", o);
    evas_object_pass_events_set(o, 1);
    fwin->over_obj = o;
 
-   e_fm2_window_object_set(fwin->fm_obj, E_OBJECT(fwin->win));
-
-   evas_object_focus_set(fwin->fm_obj, 1);
-
-   e_fm2_path_set(fwin->fm_obj, dev, path);
-
    e_win_name_class_set(fwin->win, "E", "e_fwin");
 
-   _e_fwin_window_title_set(fwin);
+   e_fm2_path_set(page->fm_obj, dev, path);
+   _e_fwin_window_title_set(page);
 
    e_win_size_min_set(fwin->win, 24, 24);
    e_win_resize(fwin->win, 280 * e_scale, 200 * e_scale);
@@ -501,24 +460,20 @@ _e_fwin_new(E_Container *con, const char *dev, const char *path)
          eina_stringshare_add("system-file-manager");
      }
 
-   fwin->fm_op_entry_add_handler =
-      ecore_event_handler_add(E_EVENT_FM_OP_REGISTRY_ADD,
-                              _e_fwin_op_registry_entry_add_cb, fwin);
-   _e_fwin_op_registry_entry_iter(fwin);
-
    return fwin;
 }
 
 static void
 _e_fwin_free(E_Fwin *fwin)
 {
-   E_Fwin_Page_Info *info;
+   E_Fwin_Page *page;
+
 
    if (!fwin) return; //safety
 
-   if (fwin->fm_obj) evas_object_del(fwin->fm_obj);
-   if (fwin->tbar) e_object_del(E_OBJECT(fwin->tbar));
-   if (fwin->scrollframe_obj) evas_object_del(fwin->scrollframe_obj);
+   EINA_LIST_FREE(fwin->pages, page)
+      _e_fwin_page_free(page);
+
    if (fwin->zone)  
      {
        evas_object_event_callback_del(fwin->zone->bg_event_object, 
@@ -527,20 +482,11 @@ _e_fwin_free(E_Fwin *fwin)
      }
 
 
-   EINA_LIST_FREE(fwin->page_info, info)
-     {
-       eina_stringshare_del(info->dev);
-       eina_stringshare_del(info->path);
-       E_FREE(info);
-     }
    if (fwin->zone_handler) 
      ecore_event_handler_del(fwin->zone_handler);
    if (fwin->zone_del_handler) 
      ecore_event_handler_del(fwin->zone_del_handler);
 
-   if (fwin->fm_op_entry_add_handler) 
-     ecore_event_handler_del(fwin->fm_op_entry_add_handler);
-
    fwins = eina_list_remove(fwins, fwin);
    if (fwin->wallpaper_file) eina_stringshare_del(fwin->wallpaper_file);
    if (fwin->overlay_file) eina_stringshare_del(fwin->overlay_file);
@@ -555,6 +501,154 @@ _e_fwin_free(E_Fwin *fwin)
    free(fwin);
 }
 
+static E_Fwin_Page *
+_e_fwin_page_create(E_Fwin *fwin)
+{
+   Evas_Object *o;
+   E_Fwin_Page *page;
+
+   page = E_NEW(E_Fwin_Page, 1);
+   page->fwin = fwin;
+
+   o = e_fm2_add(e_win_evas_get(fwin->win));
+   page->fm_obj = o;
+   e_fm2_view_flags_set(o, E_FM2_VIEW_DIR_CUSTOM);
+   evas_object_event_callback_add(o, EVAS_CALLBACK_KEY_DOWN, _e_fwin_cb_key_down, page);
+   
+   evas_object_smart_callback_add(o, "dir_changed",
+                                 _e_fwin_changed, page);
+   evas_object_smart_callback_add(o, "dir_deleted",
+                                 _e_fwin_deleted, page);
+   evas_object_smart_callback_add(o, "selected",
+                                 _e_fwin_selected, page);
+   evas_object_smart_callback_add(o, "selection_change",
+                                 _e_fwin_selection_change, page);
+   e_fm2_icon_menu_start_extend_callback_set(o, _e_fwin_cb_menu_extend_start, page);
+   e_fm2_icon_menu_end_extend_callback_set(o, _e_fwin_menu_extend, page);
+   e_fm2_window_object_set(o, E_OBJECT(fwin->win));
+   evas_object_focus_set(o, 1);
+   
+   evas_object_show(o);
+   
+   o = e_scrollframe_add(e_win_evas_get(fwin->win));
+   /* FIXME: this theme object will have more versions and options later
+    * for things like swallowing widgets/buttons ot providing them - a
+    * gadcon for starters for fm widgets. need to register the owning 
+    * e_object of the gadcon so gadcon clients can get it and thus do
+    * things like find out what dirs/path the fwin is for etc. this will
+    * probably be how you add optional gadgets to fwin views like empty/full
+    * meters for disk usage, and other dir info/stats or controls. also it
+    * might be possible that we can have custom frames per dir later so need
+    * a way to set an edje file directly
+    */
+   /* FIXME: allow specialised scrollframe obj per dir - get from e config,
+    * then look in the dir itself for a magic dot-file, if not - use theme.
+    * same as currently done for bg & overlay. also add to fm2 the ability
+    * to specify the .edj files to get the list and icon theme stuff from
+    */
+   e_scrollframe_custom_theme_set(o, "base/theme/fileman",
+                                 "e/fileman/default/scrollframe");
+   evas_object_data_set(page->fm_obj, "fm_page", page);
+   e_scrollframe_extern_pan_set(o, page->fm_obj,
+                               _e_fwin_pan_set,
+                               _e_fwin_pan_get,
+                               _e_fwin_pan_max_get,
+                               _e_fwin_pan_child_size_get);
+   evas_object_propagate_events_set(page->fm_obj, 0);
+   page->scrollframe_obj = o;
+   evas_object_move(o, 0, 0);
+   evas_object_show(o);
+
+   if (fileman_config->view.show_toolbar) 
+     {
+       page->tbar = e_toolbar_new(e_win_evas_get(fwin->win), "toolbar", 
+                                  fwin->win, page->fm_obj);
+       e_toolbar_show(page->tbar);
+     }
+
+   page->index = eina_list_count(fwin->pages);
+
+   _e_fwin_config_set(page);
+
+   page->fm_op_entry_add_handler =
+      ecore_event_handler_add(E_EVENT_FM_OP_REGISTRY_ADD,
+                              _e_fwin_op_registry_entry_add_cb, page);
+   _e_fwin_op_registry_entry_iter(page);
+   return page;
+}
+
+static void
+_e_fwin_page_free(E_Fwin_Page *page)
+{
+   if (page->fm_obj) evas_object_del(page->fm_obj);
+   if (page->tbar) e_object_del(E_OBJECT(page->tbar));
+   if (page->scrollframe_obj) evas_object_del(page->scrollframe_obj);
+
+   if (page->fm_op_entry_add_handler) 
+     ecore_event_handler_del(page->fm_op_entry_add_handler);
+
+   E_FREE(page);
+}
+
+static void
+_e_fwin_page_new(E_Fwin *fwin)
+{
+   E_Fwin_Page *page;
+   const char *real;
+   const char *dev, *path;
+
+   if (!fwin->tb_obj)
+     {
+        page = fwin->pages->data;
+
+       /* There is no toolbar yet */
+       fwin->tb_obj = e_widget_toolbar_add(evas_object_evas_get(page->fm_obj),
+             48 * e_scale, 48 * e_scale);
+
+       e_widget_toolbar_focus_steal_set(fwin->tb_obj, 0);
+       real = ecore_file_file_get(e_fm2_real_path_get(page->fm_obj));
+       e_widget_toolbar_item_append(fwin->tb_obj, NULL, real,
+             _e_fwin_cb_page_change, fwin, page);
+
+       evas_object_move(fwin->tb_obj, 0, 0);
+       evas_object_show(fwin->tb_obj);
+     }
+
+   page = _e_fwin_page_create(fwin);
+   fwin->pages = eina_list_append(fwin->pages, page);
+   real = ecore_file_file_get(e_fm2_real_path_get(fwin->cur_page->fm_obj));
+   e_widget_toolbar_item_append(fwin->tb_obj, NULL, real,
+        _e_fwin_cb_page_change, fwin, page);
+   e_fm2_path_get(fwin->cur_page->fm_obj, &dev, &path);
+   e_fm2_path_set(page->fm_obj, dev, path);
+
+   e_widget_toolbar_item_select(fwin->tb_obj, page->index);
+   _e_fwin_cb_resize(fwin->win);
+}
+
+static void
+_e_fwin_cb_page_change(void *data1, void *data2)
+{
+   E_Fwin *fwin = data1;
+   E_Fwin_Page *page = data2, *prev;
+
+   if (!fwin || !page) return;
+   prev = eina_list_nth(fwin->pages, fwin->page_index);
+   fwin->page_index = page->index;
+
+   if (prev)
+     {
+        evas_object_hide(prev->scrollframe_obj);
+        e_toolbar_hide(prev->tbar);
+     }
+
+   evas_object_show(page->scrollframe_obj);
+   e_toolbar_show(page->tbar);
+
+   fwin->cur_page = page;
+   evas_object_focus_set(page->fm_obj, 1);
+}
+
 static const char *
 _e_fwin_custom_file_path_eval(E_Fwin *fwin, Efreet_Desktop *ef, const char *prev_path, const char *key)
 {
@@ -574,7 +668,7 @@ _e_fwin_custom_file_path_eval(E_Fwin *fwin, Efreet_Desktop *ef, const char *prev
    /* relative path to the dir */
    else
      {
-       snprintf(buf, sizeof(buf), "%s/%s", e_fm2_real_path_get(fwin->fm_obj), res);
+       snprintf(buf, sizeof(buf), "%s/%s", e_fm2_real_path_get(fwin->cur_page->fm_obj), res);
        ret = eina_stringshare_add(buf);
      }
    return ret;
@@ -631,18 +725,19 @@ _e_fwin_suggested_apps_list_get(Eina_List *files, Eina_List **mime_list)
 
 
 static void
-_e_fwin_desktop_run(Efreet_Desktop *desktop, E_Fwin *fwin)
+_e_fwin_desktop_run(Efreet_Desktop *desktop, E_Fwin_Page *page)
 {
    char pcwd[4096], buf[4096];
    Eina_List *selected, *l, *files = NULL;
+   E_Fwin *fwin = page->fwin;
    E_Fm2_Icon_Info *ici;
    char *file;
 
-   selected = e_fm2_selected_list_get(fwin->fm_obj);
+   selected = e_fm2_selected_list_get(page->fm_obj);
    if (!selected) return;
 
    getcwd(pcwd, sizeof(pcwd));
-   chdir(e_fm2_real_path_get(fwin->fm_obj));
+   chdir(e_fm2_real_path_get(page->fm_obj));
 
    EINA_LIST_FOREACH(selected, l, ici)
      {
@@ -660,7 +755,7 @@ _e_fwin_desktop_run(Efreet_Desktop *desktop, E_Fwin *fwin)
               ecore_strlcpy(buf, ici->file, sizeof(buf));
          }
        else
-         _e_fwin_file_exec(fwin, ici, ext);
+         _e_fwin_file_exec(page, ici, ext);
        if (buf[0] != 0)
          {
             if (ici->mime && desktop)
@@ -759,8 +854,9 @@ _e_fwin_file_is_exec(E_Fm2_Icon_Info *ici)
 }
 
 static void
-_e_fwin_file_exec(E_Fwin *fwin, E_Fm2_Icon_Info *ici, E_Fwin_Exec_Type ext)
+_e_fwin_file_exec(E_Fwin_Page *page, E_Fm2_Icon_Info *ici, E_Fwin_Exec_Type ext)
 {
+   E_Fwin *fwin = page->fwin;
    char buf[4096];
    Efreet_Desktop *desktop;
 
@@ -798,7 +894,7 @@ _e_fwin_file_exec(E_Fwin *fwin, E_Fm2_Icon_Info *ici, E_Fwin_Exec_Type ext)
          e_exec(fwin->zone, NULL, buf, NULL, NULL);
        break;
       case E_FWIN_EXEC_DESKTOP:
-       snprintf(buf, sizeof(buf), "%s/%s", e_fm2_real_path_get(fwin->fm_obj), ici->file);
+       snprintf(buf, sizeof(buf), "%s/%s", e_fm2_real_path_get(page->fm_obj), ici->file);
        desktop = efreet_desktop_new(buf);
        if (desktop)
          {
@@ -815,12 +911,12 @@ _e_fwin_file_exec(E_Fwin *fwin, E_Fm2_Icon_Info *ici, E_Fwin_Exec_Type ext)
 }
 
 static void 
-_e_fwin_config_set(E_Fwin *fwin
+_e_fwin_config_set(E_Fwin_Page *page
 {
    E_Fm2_Config fmc;
 
    memset(&fmc, 0, sizeof(E_Fm2_Config));
-   if (!fwin->zone) 
+   if (!page->fwin->zone) 
      {
 #if 0
        fmc.view.mode = E_FM2_VIEW_MODE_LIST;
@@ -866,41 +962,57 @@ _e_fwin_config_set(E_Fwin *fwin)
    fmc.list.sort.dirs.last = fileman_config->list.sort.dirs.last;
    fmc.selection.single = fileman_config->selection.single;
    fmc.selection.windows_modifiers = fileman_config->selection.windows_modifiers;
-   e_fm2_config_set(fwin->fm_obj, &fmc);
+   e_fm2_config_set(page->fm_obj, &fmc);
 }
 
 static void 
-_e_fwin_window_title_set(E_Fwin *fwin
+_e_fwin_window_title_set(E_Fwin_Page *page
 {
    char buf[4096];
    const char *file;
 
-   if (!fwin) return;
-   if (fwin->zone) return; //safety
+   if (!page) return;
+   if (page->fwin->zone) return; //safety
 
    if (fileman_config->view.show_full_path) 
-     file = e_fm2_real_path_get(fwin->fm_obj);
+     file = e_fm2_real_path_get(page->fm_obj);
    else
-     file = ecore_file_file_get(e_fm2_real_path_get(fwin->fm_obj));
+     file = ecore_file_file_get(e_fm2_real_path_get(page->fm_obj));
 
    if (file) 
      {
        ecore_strlcpy(buf, file, sizeof(buf));
-       e_win_title_set(fwin->win, buf);
+       e_win_title_set(page->fwin->win, buf);
+     }
+}
+
+static void
+_e_fwin_page_resize(E_Fwin_Page *page)
+{
+   if (page->tbar)
+     _e_fwin_toolbar_resize(page);
+   else 
+     {
+        int offset = 0;
+
+        if (page->fwin->tb_obj)
+          evas_object_geometry_get(page->fwin->tb_obj, NULL, NULL, NULL, &offset);
+        evas_object_move(page->scrollframe_obj, 0, offset);
+        evas_object_resize(page->scrollframe_obj, page->fwin->win->w, page->fwin->win->h - offset);
      }
 }
 
 static void 
-_e_fwin_toolbar_resize(E_Fwin *fwin
+_e_fwin_toolbar_resize(E_Fwin_Page *page
 {
    int tx, ty, tw, th, offset = 0;
    int x, y, w, h;
 
-   if (fwin->tb_obj)
-     evas_object_geometry_get(fwin->tb_obj, NULL, NULL, NULL, &offset);
-   w = fwin->win->w;
-   h = fwin->win->h;
-   switch (fwin->tbar->gadcon->orient) 
+   if (page->fwin->tb_obj)
+     evas_object_geometry_get(page->fwin->tb_obj, NULL, NULL, NULL, &offset);
+   w = page->fwin->win->w;
+   h = page->fwin->win->h;
+   switch (page->tbar->gadcon->orient) 
      {
       case E_GADCON_ORIENT_HORIZ:
       case E_GADCON_ORIENT_TOP:
@@ -947,79 +1059,14 @@ _e_fwin_toolbar_resize(E_Fwin *fwin)
       default:
         return;
      }
-   e_toolbar_move_resize(fwin->tbar, tx, ty, tw, th);
-   evas_object_move(fwin->scrollframe_obj, x, y);
-   evas_object_resize(fwin->scrollframe_obj, w, h);
+   e_toolbar_move_resize(page->tbar, tx, ty, tw, th);
+   evas_object_move(page->scrollframe_obj, x, y);
+   evas_object_resize(page->scrollframe_obj, w, h);
 }
 
 
 /* fwin callbacks */
 static void
-_e_fwin_page_new(E_Fwin *fwin)
-{
-   E_Fwin_Page_Info *info;
-   const char *real;
-
-   if (!fwin->tb_obj)
-     {
-       /* There is no toolbar yet */
-       fwin->tb_obj = e_widget_toolbar_add(evas_object_evas_get(fwin->fm_obj),
-             48 * e_scale, 48 * e_scale);
-
-       e_widget_toolbar_focus_steal_set(fwin->tb_obj, 0);
-       info = _e_fwin_page_info_new(fwin);
-       real = ecore_file_file_get(e_fm2_real_path_get(fwin->fm_obj));
-       e_widget_toolbar_item_append(fwin->tb_obj, NULL, real,
-             _e_fwin_cb_page_change, fwin, info);
-
-       evas_object_move(fwin->tb_obj, 0, 0);
-       evas_object_show(fwin->tb_obj);
-     }
-
-   info = _e_fwin_page_info_new(fwin);
-   real = ecore_file_file_get(e_fm2_real_path_get(fwin->fm_obj));
-   e_widget_toolbar_item_append(fwin->tb_obj, NULL, real,
-        _e_fwin_cb_page_change, fwin, info);
-   e_widget_toolbar_item_select(fwin->tb_obj, info->index);
-
-   _e_fwin_cb_resize(fwin->win);
-}
-
-static E_Fwin_Page_Info *
-_e_fwin_page_info_new(E_Fwin *fwin)
-{
-   E_Fwin_Page_Info *info;
-   const char *dev, *path;
-
-   e_fm2_path_get(fwin->fm_obj, &dev, &path);
-   info = E_NEW(E_Fwin_Page_Info, 1);
-   info->dev = eina_stringshare_add(dev);
-   info->path = eina_stringshare_add(path);
-   info->index = eina_list_count(fwin->page_info);
-
-   fwin->page_info = eina_list_append(fwin->page_info, info);
-
-   return info;
-}
-
-static void
-_e_fwin_cb_page_change(void *data1, void *data2)
-{
-   E_Fwin *fwin = data1;
-   E_Fwin_Page_Info *info = data2, *prev;
-   Evas_Coord x, y;
-
-   if (!fwin || !info) return;
-   prev = eina_list_nth(fwin->page_info, fwin->page_index);
-   e_scrollframe_child_pos_get(fwin->scrollframe_obj, &x, &y);
-   prev->scroll.x = x;
-   prev->scroll.y = y;
-   fwin->page_index = info->index;
-   e_fm2_path_set(fwin->fm_obj, info->dev, info->path);
-   e_scrollframe_child_pos_set(fwin->scrollframe_obj, x, y);
-}
-
-static void
 _e_fwin_cb_delete(E_Win *win)
 {
    E_Fwin *fwin;
@@ -1036,7 +1083,7 @@ _e_fwin_geom_save(E_Fwin *fwin)
    E_Fm2_Custom_File *cf;
 
    if (!fwin->geom_save_ready) return;
-   snprintf(buf, sizeof(buf), "dir::%s", e_fm2_real_path_get(fwin->fm_obj));
+   snprintf(buf, sizeof(buf), "dir::%s", e_fm2_real_path_get(fwin->cur_page->fm_obj));
    cf = e_fm2_custom_file_get(buf);
    if (!cf)
      {
@@ -1077,6 +1124,9 @@ _e_fwin_cb_resize(E_Win *win)
      }
    if (fwin->win) 
      {
+        E_Fwin_Page *page;
+        Eina_List *l;
+
        if (fwin->tb_obj)
          {
             int height;
@@ -1084,46 +1134,39 @@ _e_fwin_cb_resize(E_Win *win)
             e_widget_min_size_get(fwin->tb_obj, NULL, &height);
             evas_object_resize(fwin->tb_obj, fwin->win->w, height);
          }
-       if (fwin->tbar)
-         _e_fwin_toolbar_resize(fwin);
-       else 
-         {
-            int offset = 0;
-
-            if (fwin->tb_obj)
-              evas_object_geometry_get(fwin->tb_obj, NULL, NULL, NULL, &offset);
-            evas_object_move(fwin->scrollframe_obj, 0, offset);
-            evas_object_resize(fwin->scrollframe_obj, fwin->win->w, fwin->win->h - offset);
-         }
+        EINA_LIST_FOREACH(fwin->pages, l, page)
+           _e_fwin_page_resize(page);
      }
    else if (fwin->zone)
-     evas_object_resize(fwin->scrollframe_obj, fwin->zone->w, fwin->zone->h);
+     evas_object_resize(fwin->cur_page->scrollframe_obj, fwin->zone->w, fwin->zone->h);
    _e_fwin_geom_save(fwin);
 }
 
 static void
 _e_fwin_deleted(void *data, Evas_Object *obj, void *event_info)
 {
-   E_Fwin *fwin;
+   E_Fwin_Page *page;
 
-   fwin = data;
-   e_object_del(E_OBJECT(fwin));
+   page = data;
+   e_object_del(E_OBJECT(page->fwin));
 }
 
 static void
 _e_fwin_changed(void *data, Evas_Object *obj, void *event_info)
 {
    E_Fwin *fwin;
+   E_Fwin_Page *page;
    Efreet_Desktop *ef;
    char buf[PATH_MAX];
 
-   fwin = data;
+   page = data;
+   fwin = page->fwin;
    if (!fwin) return; //safety
 
    /* FIXME: first look in E config for a special override for this dir's bg
     * or overlay
     */
-   snprintf(buf, sizeof(buf), "%s/.directory.desktop", e_fm2_real_path_get(fwin->fm_obj));
+   snprintf(buf, sizeof(buf), "%s/.directory.desktop", e_fm2_real_path_get(page->fm_obj));
    ef = efreet_desktop_new(buf);
    if (ef)
      {
@@ -1151,39 +1194,31 @@ _e_fwin_changed(void *data, Evas_Object *obj, void *event_info)
          edje_object_file_set(fwin->over_obj, fwin->overlay_file, "e/desktop/background");
        evas_object_show(fwin->over_obj);
      }
-   if (fwin->scrollframe_obj)
+   if (page->scrollframe_obj)
      {
        if ((fwin->scrollframe_file) && 
            (e_util_edje_collection_exists(fwin->scrollframe_file, "e/fileman/default/scrollframe")))
-         e_scrollframe_custom_edje_file_set(fwin->scrollframe_obj, 
+         e_scrollframe_custom_edje_file_set(page->scrollframe_obj, 
                                             (char *)fwin->scrollframe_file,
                                             "e/fileman/default/scrollframe");
        else
          {
             if (fwin->zone)
-              e_scrollframe_custom_theme_set(fwin->scrollframe_obj,
+              e_scrollframe_custom_theme_set(page->scrollframe_obj,
                                              "base/theme/fileman",
                                              "e/fileman/desktop/scrollframe");
             else
-              e_scrollframe_custom_theme_set(fwin->scrollframe_obj,
+              e_scrollframe_custom_theme_set(page->scrollframe_obj,
                                              "base/theme/fileman",
                                              "e/fileman/default/scrollframe");
          }
-       e_scrollframe_child_pos_set(fwin->scrollframe_obj, 0, 0);
+       e_scrollframe_child_pos_set(page->scrollframe_obj, 0, 0);
      }
    if (fwin->tb_obj)
      {
-       E_Fwin_Page_Info *info;
-       const char *file, *dev, *path;
-
-       e_fm2_path_get(fwin->fm_obj, &dev, &path);
-       info = eina_list_nth(fwin->page_info, fwin->page_index);
-       eina_stringshare_del(info->dev);
-       eina_stringshare_del(info->path);
-       info->dev = eina_stringshare_add(dev);
-       info->path = eina_stringshare_add(path);
+       const char *file;
 
-       file = ecore_file_file_get(e_fm2_real_path_get(fwin->fm_obj));
+       file = ecore_file_file_get(e_fm2_real_path_get(page->fm_obj));
        e_widget_toolbar_item_label_set(fwin->tb_obj, fwin->page_index, file);
      }
    if ((fwin->theme_file) && (ecore_file_exists(fwin->theme_file)))
@@ -1192,19 +1227,19 @@ _e_fwin_changed(void *data, Evas_Object *obj, void *event_info)
      e_fm2_custom_theme_set(obj, NULL);
 
    if (fwin->zone) return;
-   _e_fwin_window_title_set(fwin);
+   _e_fwin_window_title_set(page);
 }
 
 static void
 _e_fwin_selected(void *data, Evas_Object *obj, void *event_info)
 {
-   E_Fwin *fwin;
+   E_Fwin_Page *page;
    Eina_List *selected;
 
-   fwin = data;
-   selected = e_fm2_selected_list_get(fwin->fm_obj);
+   page = data;
+   selected = e_fm2_selected_list_get(page->fm_obj);
    if (!selected) return;
-   _e_fwin_file_open_dialog(fwin, selected, 0);
+   _e_fwin_file_open_dialog(page, selected, 0);
    eina_list_free(selected);
 }
 
@@ -1212,12 +1247,12 @@ static void
 _e_fwin_selection_change(void *data, Evas_Object *obj, void *event_info)
 {
    Eina_List *l;
-   E_Fwin *fwin;
+   E_Fwin_Page *page;
 
-   fwin = data;
+   page = data;
    for (l = fwins; l; l = l->next)
      {
-       if (l->data != fwin)
+       if (l->data != page->fwin)
          e_fwin_all_unsel(l->data);
      }
 }
@@ -1239,8 +1274,10 @@ _e_fwin_cb_key_down(void *data, Evas *e, Evas_Object *obj, void *event_info)
 {
    Evas_Event_Key_Down *ev;
    E_Fwin *fwin;
+   E_Fwin_Page *page;
 
-   fwin = data;
+   page = data;
+   fwin = page->fwin;
    ev = event_info;
 
    if (evas_key_modifier_is_set(ev->modifiers, "Control"))
@@ -1251,18 +1288,50 @@ _e_fwin_cb_key_down(void *data, Evas *e, Evas_Object *obj, void *event_info)
             const char *dev, *path;
 
             con = e_container_current_get(e_manager_current_get());
-            e_fm2_path_get(fwin->fm_obj, &dev, &path);
+            e_fm2_path_get(page->fm_obj, &dev, &path);
             e_fwin_new(con, dev, path);
             return;
          }
        if (!strcmp(ev->key, "w"))
          {
-            e_object_del(E_OBJECT(fwin));
+             int count = eina_list_count(fwin->pages);
+             E_Fwin_Page *page;
+
+             if (count > 2)
+               {
+                  Eina_List *l;
+                  int i = 0;
+
+                  page = fwin->cur_page;
+                  if (fwin->page_index > 0)
+                    e_widget_toolbar_item_select(fwin->tb_obj, fwin->page_index - 1);
+                  else
+                    e_widget_toolbar_item_select(fwin->tb_obj, 1);
+                  e_widget_toolbar_item_remove(fwin->tb_obj, page->index);
+                  fwin->pages = eina_list_remove(fwin->pages, page);
+                  _e_fwin_page_free(page);
+                  EINA_LIST_FOREACH(fwin->pages, l, page)
+                     page->index = i++;
+               }
+             else if (count > 1)
+               {
+                  evas_object_del(fwin->tb_obj);
+                  fwin->tb_obj = NULL;
+                  fwin->page_index = 0;
+                  fwin->pages = eina_list_remove(fwin->pages, fwin->cur_page);
+                  _e_fwin_page_free(fwin->cur_page);
+                  page = fwin->pages->data;
+                  page->index = 0;
+                  _e_fwin_cb_page_change(fwin, page);
+                  _e_fwin_cb_resize(fwin->win);
+               }
+             else
+               e_object_del(E_OBJECT(fwin));
             return;
          }
        if (!strcmp(ev->key, "a"))
          {
-            e_fm2_all_sel(fwin->fm_obj);
+            e_fm2_all_sel(page->fm_obj);
             return;
          }
        if (!strcmp(ev->key, "t"))
@@ -1301,10 +1370,10 @@ _e_fwin_zone_move_resize(void *data, int type, void *event)
        evas_object_move(fwin->bg_obj, ev->zone->x, ev->zone->y);
        evas_object_resize(fwin->bg_obj, ev->zone->w, ev->zone->h);
      }
-   if (fwin->scrollframe_obj) 
+   if (fwin->cur_page->scrollframe_obj) 
      {
-       evas_object_move(fwin->scrollframe_obj, ev->zone->x, ev->zone->y);
-       evas_object_resize(fwin->scrollframe_obj, ev->zone->w, ev->zone->h);
+       evas_object_move(fwin->cur_page->scrollframe_obj, ev->zone->x, ev->zone->y);
+       evas_object_resize(fwin->cur_page->scrollframe_obj, ev->zone->w, ev->zone->h);
      }
    return 1;
 }
@@ -1329,10 +1398,10 @@ _e_fwin_zone_del(void *data, int type, void *event)
 static void
 _e_fwin_menu_extend(void *data, Evas_Object *obj, E_Menu *m, E_Fm2_Icon_Info *info)
 {
-   E_Fwin *fwin;
+   E_Fwin_Page *page;
    E_Menu_Item *mi;
 
-   fwin = data;
+   page = data;
    if (e_fm2_has_parent_get(obj))
      {
        mi = e_menu_item_new(m);
@@ -1360,14 +1429,14 @@ _e_fwin_parent(void *data, E_Menu *m, E_Menu_Item *mi)
 static void
 _e_fwin_cb_menu_open_fast(void *data, E_Menu *m, E_Menu_Item *mi)
 {
-   E_Fwin *fwin;
+   E_Fwin_Page *page;
    Efreet_Desktop *desk;
 
-   fwin = data;
+   page = data;
    desk = e_object_data_get(E_OBJECT(mi));
 
-   if (fwin && desk)
-      _e_fwin_desktop_run(desk, fwin);
+   if (page && desk)
+      _e_fwin_desktop_run(desk, page);
 }
 
 static void
@@ -1375,12 +1444,12 @@ _e_fwin_cb_menu_extend_open_with(void *data, E_Menu *m)
 {
    Eina_List *selected = NULL, *apps = NULL, *l;
    E_Menu_Item *mi;
-   E_Fwin *fwin;
+   E_Fwin_Page *page;
    Efreet_Desktop *desk = NULL;
 
-   fwin = data;
+   page = data;
 
-   selected = e_fm2_selected_list_get(fwin->fm_obj);
+   selected = e_fm2_selected_list_get(page->fm_obj);
    if (!selected) return;
 
    apps = _e_fwin_suggested_apps_list_get(selected, NULL);
@@ -1390,7 +1459,7 @@ _e_fwin_cb_menu_extend_open_with(void *data, E_Menu *m)
        mi = e_menu_item_new(m);
        e_menu_item_label_set(mi, desk->name);
        e_util_desktop_menu_item_icon_add(desk, 24, mi);
-       e_menu_item_callback_set(mi, _e_fwin_cb_menu_open_fast, fwin);
+       e_menu_item_callback_set(mi, _e_fwin_cb_menu_open_fast, page);
        e_object_data_set(E_OBJECT(mi), desk);
      }
 
@@ -1403,7 +1472,7 @@ _e_fwin_cb_menu_extend_open_with(void *data, E_Menu *m)
    mi = e_menu_item_new(m);
    e_menu_item_label_set(mi, _("Other application..."));
    e_util_menu_item_theme_icon_set(mi, "document-open");
-   e_menu_item_callback_set(mi, _e_fwin_cb_menu_open_with, fwin);
+   e_menu_item_callback_set(mi, _e_fwin_cb_menu_open_with, page);
 
    e_menu_pre_activate_callback_set(m, NULL, NULL);
 
@@ -1415,14 +1484,14 @@ static void
 _e_fwin_cb_menu_extend_start(void *data, Evas_Object *obj, E_Menu *m, E_Fm2_Icon_Info *info)
 {
    E_Menu_Item *mi;
-   E_Fwin *fwin;
+   E_Fwin_Page *page;
    E_Menu *subm;
 
-   fwin = data;
+   page = data;
    mi = e_menu_item_new(m);
    e_menu_item_label_set(mi, _("Open"));
    e_util_menu_item_theme_icon_set(mi, "document-open");
-   e_menu_item_callback_set(mi, _e_fwin_cb_menu_open, fwin);
+   e_menu_item_callback_set(mi, _e_fwin_cb_menu_open, page);
 
    mi = e_menu_item_new(m);
    e_menu_item_label_set(mi, _("Open with..."));
@@ -1430,41 +1499,41 @@ _e_fwin_cb_menu_extend_start(void *data, Evas_Object *obj, E_Menu *m, E_Fm2_Icon
 
    subm = e_menu_new();
    e_menu_item_submenu_set(mi, subm);
-   e_menu_pre_activate_callback_set(subm, _e_fwin_cb_menu_extend_open_with, fwin);
+   e_menu_pre_activate_callback_set(subm, _e_fwin_cb_menu_extend_open_with, page);
 }
 
 static void
 _e_fwin_cb_menu_open(void *data, E_Menu *m, E_Menu_Item *mi)
 {
-   E_Fwin *fwin;
+   E_Fwin_Page *page;
    Eina_List *selected;
 
-   fwin = data;
-   selected = e_fm2_selected_list_get(fwin->fm_obj);
+   page = data;
+   selected = e_fm2_selected_list_get(page->fm_obj);
    if (!selected) return;
-   _e_fwin_file_open_dialog(fwin, selected, 0);
+   _e_fwin_file_open_dialog(page, selected, 0);
    eina_list_free(selected);
 }
 
 static void
 _e_fwin_cb_menu_open_with(void *data, E_Menu *m, E_Menu_Item *mi)
 {
-   E_Fwin *fwin;
+   E_Fwin_Page *page;
    Eina_List *selected = NULL;
 
-   fwin = data;
-   selected = e_fm2_selected_list_get(fwin->fm_obj);
+   page = data;
+   selected = e_fm2_selected_list_get(page->fm_obj);
    if (!selected) return;
-   _e_fwin_file_open_dialog(fwin, selected, 1);
+   _e_fwin_file_open_dialog(page, selected, 1);
    eina_list_free(selected);
 }
 
 
 /* 'open with' dialog*/
 static void
-_e_fwin_file_open_dialog(E_Fwin *fwin, Eina_List *files, int always)
+_e_fwin_file_open_dialog(E_Fwin_Page *page, Eina_List *files, int always)
 {
-   E_Fwin *fwin2 = NULL;
+   E_Fwin *fwin = page->fwin, *fwin2 = NULL;
    E_Dialog *dia;
    Evas_Coord mw, mh;
    Evas_Object *o, *of, *ot;
@@ -1497,8 +1566,8 @@ _e_fwin_file_open_dialog(E_Fwin *fwin, Eina_List *files, int always)
                    }
                  else 
                    {
-                      e_fm2_path_set(fwin->fm_obj, ici->link, "/");
-                      _e_fwin_window_title_set(fwin);
+                      e_fm2_path_set(page->fm_obj, ici->link, "/");
+                      _e_fwin_window_title_set(page);
                    }
               }
             else if ((ici->link) && (ici->removable))
@@ -1513,8 +1582,8 @@ _e_fwin_file_open_dialog(E_Fwin *fwin, Eina_List *files, int always)
                    }
                  else 
                    {
-                      e_fm2_path_set(fwin->fm_obj, buf, "/");
-                      _e_fwin_window_title_set(fwin);
+                      e_fm2_path_set(page->fm_obj, buf, "/");
+                      _e_fwin_window_title_set(page);
                    }
               }
             else if (ici->real_link)
@@ -1530,8 +1599,8 @@ _e_fwin_file_open_dialog(E_Fwin *fwin, Eina_List *files, int always)
                         }
                       else 
                         {
-                           e_fm2_path_set(fwin->fm_obj, NULL, ici->real_link);
-                           _e_fwin_window_title_set(fwin);
+                           e_fm2_path_set(page->fm_obj, NULL, ici->real_link);
+                           _e_fwin_window_title_set(page);
                         }
                    }
                  else
@@ -1540,7 +1609,7 @@ _e_fwin_file_open_dialog(E_Fwin *fwin, Eina_List *files, int always)
             else
               {
                  snprintf(buf, sizeof(buf), "%s/%s", 
-                          e_fm2_real_path_get(fwin->fm_obj), ici->file);
+                          e_fm2_real_path_get(page->fm_obj), ici->file);
                  if (S_ISDIR(ici->statinfo.st_mode))
                    {
                       if ((!fileman_config->view.open_dirs_in_place) || (fwin->zone)) 
@@ -1552,8 +1621,8 @@ _e_fwin_file_open_dialog(E_Fwin *fwin, Eina_List *files, int always)
                         }
                       else 
                         {
-                           e_fm2_path_set(fwin->fm_obj, NULL, buf);
-                           _e_fwin_window_title_set(fwin);
+                           e_fm2_path_set(page->fm_obj, NULL, buf);
+                           _e_fwin_window_title_set(page);
                         }
                    }
                  else
@@ -1567,7 +1636,7 @@ _e_fwin_file_open_dialog(E_Fwin *fwin, Eina_List *files, int always)
                       const char *itype = NULL;
                       int ix, iy, iw, ih, nx, ny, nw, nh;
 
-                      oic = e_fm2_icon_get(evas_object_evas_get(fwin->fm_obj),
+                      oic = e_fm2_icon_get(evas_object_evas_get(page->fm_obj),
                                            ici->ic, NULL, NULL, 0, &itype);
                       if (oic)
                         {
@@ -1602,7 +1671,7 @@ _e_fwin_file_open_dialog(E_Fwin *fwin, Eina_List *files, int always)
                            evas_object_del(oic);
                            
                            snprintf(buf, sizeof(buf), "dir::%s",
-                                    e_fm2_real_path_get(fwin2->fm_obj));
+                                    e_fm2_real_path_get(fwin2->cur_page->fm_obj));
                            cf = e_fm2_custom_file_get(buf);
                            if ((cf) && (cf->geom.valid))
                              {
@@ -1696,7 +1765,7 @@ _e_fwin_file_open_dialog(E_Fwin *fwin, Eina_List *files, int always)
             need_dia = 1;
             if (mlist) desk = e_exehist_mime_desktop_get(mlist->data);
             getcwd(pcwd, sizeof(pcwd));
-            chdir(e_fm2_real_path_get(fwin->fm_obj));
+            chdir(e_fm2_real_path_get(page->fm_obj));
             
             files_list = NULL;
             EINA_LIST_FOREACH(files, l, ici)
@@ -1709,7 +1778,7 @@ _e_fwin_file_open_dialog(E_Fwin *fwin, Eina_List *files, int always)
                  ext = _e_fwin_file_is_exec(ici);
                  if (ext != E_FWIN_EXEC_NONE)
                    {
-                      _e_fwin_file_exec(fwin, ici, ext);
+                      _e_fwin_file_exec(page, ici, ext);
                       need_dia = 0;
                    }
               }
@@ -1904,7 +1973,7 @@ _e_fwin_cb_open(void *data, E_Dialog *dia)
       }
 
    if ((desktop) || (strcmp(fad->exec_cmd, "")))
-     _e_fwin_desktop_run(desktop,fad->fwin);
+     _e_fwin_desktop_run(desktop, fad->fwin->cur_page);
 
    // Free fake .desktop
    if (!strcmp(fad->exec_cmd, ""))
@@ -1941,90 +2010,90 @@ _e_fwin_cb_dialog_free(void *obj)
 static void
 _e_fwin_pan_set(Evas_Object *obj, Evas_Coord x, Evas_Coord y)
 {
-   E_Fwin *fwin;
+   E_Fwin_Page *page;
 
-   fwin = evas_object_data_get(obj, "fwin");
+   page = evas_object_data_get(obj, "fm_page");
    e_fm2_pan_set(obj, x, y);
-   if (x > fwin->fm_pan.max_x) x = fwin->fm_pan.max_x;
-   if (y > fwin->fm_pan.max_y) y = fwin->fm_pan.max_y;
+   if (x > page->fm_pan.max_x) x = page->fm_pan.max_x;
+   if (y > page->fm_pan.max_y) y = page->fm_pan.max_y;
    if (x < 0) x = 0;
    if (y < 0) y = 0;
-   fwin->fm_pan.x = x;
-   fwin->fm_pan.y = y;
-   _e_fwin_pan_scroll_update(fwin);
+   page->fm_pan.x = x;
+   page->fm_pan.y = y;
+   _e_fwin_pan_scroll_update(page);
 }
 
 static void
 _e_fwin_pan_get(Evas_Object *obj, Evas_Coord *x, Evas_Coord *y)
 {
-   E_Fwin *fwin;
+   E_Fwin_Page *page;
 
-   fwin = evas_object_data_get(obj, "fwin");
+   page = evas_object_data_get(obj, "fm_page");
    e_fm2_pan_get(obj, x, y);
-   fwin->fm_pan.x = *x;
-   fwin->fm_pan.y = *y;
+   page->fm_pan.x = *x;
+   page->fm_pan.y = *y;
 }
 
 static void
 _e_fwin_pan_max_get(Evas_Object *obj, Evas_Coord *x, Evas_Coord *y)
 {
-   E_Fwin *fwin;
+   E_Fwin_Page *page;
 
-   fwin = evas_object_data_get(obj, "fwin");
+   page = evas_object_data_get(obj, "fm_page");
    e_fm2_pan_max_get(obj, x, y);
-   fwin->fm_pan.max_x = *x;
-   fwin->fm_pan.max_y = *y;
-   _e_fwin_pan_scroll_update(fwin);
+   page->fm_pan.max_x = *x;
+   page->fm_pan.max_y = *y;
+   _e_fwin_pan_scroll_update(page);
 }
 
 static void
 _e_fwin_pan_child_size_get(Evas_Object *obj, Evas_Coord *w, Evas_Coord *h)
 {
-   E_Fwin *fwin;
-
-   fwin = evas_object_data_get(obj, "fwin");
+   E_Fwin_Page *page;
+    
+   page = evas_object_data_get(obj, "fm_page");
    e_fm2_pan_child_size_get(obj, w, h);
-   fwin->fm_pan.w = *w;
-   fwin->fm_pan.h = *h;
-   _e_fwin_pan_scroll_update(fwin);
+   page->fm_pan.w = *w;
+   page->fm_pan.h = *h;
+   _e_fwin_pan_scroll_update(page);
 }
 
 static void
-_e_fwin_pan_scroll_update(E_Fwin *fwin)
+_e_fwin_pan_scroll_update(E_Fwin_Page *page)
 {
    Edje_Message_Int_Set *msg;
 
-   if ((fwin->fm_pan.x == fwin->fm_pan_last.x) &&
-       (fwin->fm_pan.y == fwin->fm_pan_last.y) &&
-       (fwin->fm_pan.max_x == fwin->fm_pan_last.max_x) &&
-       (fwin->fm_pan.max_y == fwin->fm_pan_last.max_y) &&
-       (fwin->fm_pan.w == fwin->fm_pan_last.w) &&
-       (fwin->fm_pan.h == fwin->fm_pan_last.h)) return;
+   if ((page->fm_pan.x == page->fm_pan_last.x) &&
+       (page->fm_pan.y == page->fm_pan_last.y) &&
+       (page->fm_pan.max_x == page->fm_pan_last.max_x) &&
+       (page->fm_pan.max_y == page->fm_pan_last.max_y) &&
+       (page->fm_pan.w == page->fm_pan_last.w) &&
+       (page->fm_pan.h == page->fm_pan_last.h)) return;
    msg = alloca(sizeof(Edje_Message_Int_Set) -
                sizeof(int) + (6 * sizeof(int)));
    msg->count = 6;
-   msg->val[0] = fwin->fm_pan.x;
-   msg->val[1] = fwin->fm_pan.y;
-   msg->val[2] = fwin->fm_pan.max_x;
-   msg->val[3] = fwin->fm_pan.max_y;
-   msg->val[4] = fwin->fm_pan.w;
-   msg->val[5] = fwin->fm_pan.h;
+   msg->val[0] = page->fm_pan.x;
+   msg->val[1] = page->fm_pan.y;
+   msg->val[2] = page->fm_pan.max_x;
+   msg->val[3] = page->fm_pan.max_y;
+   msg->val[4] = page->fm_pan.w;
+   msg->val[5] = page->fm_pan.h;
 //   printf("SEND MSG %i %i | %i %i | %ix%i\n",
-//       fwin->fm_pan.x, fwin->fm_pan.y,
-//       fwin->fm_pan.max_x, fwin->fm_pan.max_y,
-//       fwin->fm_pan.w, fwin->fm_pan.h);
-   if (fwin->under_obj)
-     edje_object_message_send(fwin->under_obj, EDJE_MESSAGE_INT_SET, 1, msg);
-   if (fwin->over_obj)
-     edje_object_message_send(fwin->over_obj, EDJE_MESSAGE_INT_SET, 1, msg);
-   if (fwin->scrollframe_obj)
-     edje_object_message_send(e_scrollframe_edje_object_get(fwin->scrollframe_obj), EDJE_MESSAGE_INT_SET, 1, msg);
-   fwin->fm_pan_last.x = fwin->fm_pan.x;
-   fwin->fm_pan_last.y = fwin->fm_pan.y;
-   fwin->fm_pan_last.max_x = fwin->fm_pan.max_x;
-   fwin->fm_pan_last.max_y = fwin->fm_pan.max_y;
-   fwin->fm_pan_last.w = fwin->fm_pan.w;
-   fwin->fm_pan_last.h = fwin->fm_pan.h;
+//       page->fm_pan.x, page->fm_pan.y,
+//       page->fm_pan.max_x, page->fm_pan.max_y,
+//       page->fm_pan.w, page->fm_pan.h);
+   if (page->fwin->under_obj)
+     edje_object_message_send(page->fwin->under_obj, EDJE_MESSAGE_INT_SET, 1, msg);
+   if (page->fwin->over_obj)
+     edje_object_message_send(page->fwin->over_obj, EDJE_MESSAGE_INT_SET, 1, msg);
+   if (page->scrollframe_obj)
+     edje_object_message_send(e_scrollframe_edje_object_get(page->scrollframe_obj), EDJE_MESSAGE_INT_SET, 1, msg);
+   page->fm_pan_last.x = page->fm_pan.x;
+   page->fm_pan_last.y = page->fm_pan.y;
+   page->fm_pan_last.max_x = page->fm_pan.max_x;
+   page->fm_pan_last.max_y = page->fm_pan.max_y;
+   page->fm_pan_last.w = page->fm_pan.w;
+   page->fm_pan_last.h = page->fm_pan.h;
 }
 
 
@@ -2095,7 +2164,7 @@ static int
 _e_fwin_op_registry_entry_add_cb(void *data, int type, void *event)
 {
    E_Fm2_Op_Registry_Entry *ere = (E_Fm2_Op_Registry_Entry *)event;
-   E_Fwin *fwin = data;
+   E_Fwin_Page *page = data;
    Evas_Object *o;
    int mw, mh;
 
@@ -2103,7 +2172,7 @@ _e_fwin_op_registry_entry_add_cb(void *data, int type, void *event)
          ere->op == E_FM_OP_REMOVE))
       return ECORE_CALLBACK_RENEW;
 
-   o = edje_object_add(e_win_evas_get(fwin->win));
+   o = edje_object_add(evas_object_evas_get(page->scrollframe_obj));
    e_theme_edje_object_set(o, "base/theme/fileman",
                            "e/fileman/default/progress");
    edje_object_size_min_get(o, &mw, &mh);
@@ -2115,7 +2184,7 @@ _e_fwin_op_registry_entry_add_cb(void *data, int type, void *event)
    _e_fwin_op_registry_listener_cb(o, ere);
 
    // Append the element to the box
-   edje_object_part_box_append(e_scrollframe_edje_object_get(fwin->scrollframe_obj),
+   edje_object_part_box_append(e_scrollframe_edje_object_get(page->scrollframe_obj),
                                "e.box.operations", o);
    evas_object_size_hint_align_set(o, 1.0, 1.0); //FIXME this should be theme-configurable
    evas_object_show(o);
@@ -2128,13 +2197,13 @@ _e_fwin_op_registry_entry_add_cb(void *data, int type, void *event)
 }
 
 static void
-_e_fwin_op_registry_entry_iter(E_Fwin *fwin)
+_e_fwin_op_registry_entry_iter(E_Fwin_Page *page)
 {
    Eina_Iterator *itr;
    E_Fm2_Op_Registry_Entry *ere;
 
    itr = e_fm2_op_registry_iterator_new();
    EINA_ITERATOR_FOREACH(itr, ere)
-     _e_fwin_op_registry_entry_add_cb(fwin, 0, ere);
+     _e_fwin_op_registry_entry_add_cb(page, 0, ere);
    eina_iterator_free(itr);
 }