Index: e.h
===================================================================
RCS file: /cvsroot/enlightenment/e17/apps/e/src/bin/e.h,v
retrieving revision 1.7
diff -u -3 -p -r1.7 e.h
--- e.h	24 Dec 2004 04:30:58 -0000	1.7
+++ e.h	3 Jan 2005 05:24:15 -0000
@@ -69,6 +69,7 @@
 #include "e_resist.h"
 #include "e_startup.h"
 #include "e_iconify.h"
+#include "e_hints.h"
 
 typedef struct _E_Before_Idler E_Before_Idler;
 
Index: e_desk.c
===================================================================
RCS file: /cvsroot/enlightenment/e17/apps/e/src/bin/e_desk.c,v
retrieving revision 1.1
diff -u -3 -p -r1.1 e_desk.c
--- e_desk.c	25 Nov 2004 03:37:44 -0000	1.1
+++ e_desk.c	3 Jan 2005 05:24:15 -0000
@@ -1 +1,154 @@
+/*
+ * vim:ts=8:sw=3:sts=8:noexpandtab:cino=>5n-3f0^-2{2
+ */
 #include "e.h"
+
+/* E_Desk is a child object of E_Container. Many of the functions here are
+ * higher-level wrappers for the container functions. There is one desktop per
+ * container -- think of E_Desk as a "shell" object for E_Container.
+ */
+
+static void _e_desk_free(E_Desk *desk);
+
+E_Desk *
+e_desk_new(E_Manager *man)
+{
+   E_Desk      *desk;
+   
+   desk = E_OBJECT_ALLOC(E_Desk, _e_desk_free);
+   if (!desk) return NULL;
+
+   desk->container = e_container_new(man);
+   desk->name = NULL;
+   if (!(desk->container))
+   {
+      free(desk);
+      return NULL;
+   }
+   
+   e_object_ref(E_OBJECT(desk->container));
+   e_hints_desktop_config_set();
+   man->desks = evas_list_append(man->desks, desk);
+
+   return desk;
+}
+
+void
+e_desk_name_set(E_Desk *desk, const char *name)
+{
+   E_OBJECT_CHECK(desk);
+   if (desk->name)
+      free(desk->name);
+   desk->name = strdup(name);
+   e_hints_desktop_config_set();
+}
+
+char *
+e_desk_name_get(E_Desk *desk)
+{
+   E_OBJECT_CHECK(desk);
+   if (desk->name)
+      return desk->name;
+   else
+      return NULL;
+}
+
+void
+e_desk_show(E_Desk *desk)
+{
+   Evas_List   *l;
+   E_Manager   *m;
+   E_Container *c;
+   
+   E_OBJECT_CHECK(desk);
+   if (desk->container->visible) return;
+
+   m = desk->container->manager;
+   for (l = m->containers; l; l = l->next)
+   {
+      c = (E_Container *)l->data;
+      e_container_hide(c);
+   }
+   
+   e_container_show(desk->container);
+   e_hints_desktop_current_set();
+   e_hints_desktop_size_set();
+}
+
+E_Desk *
+e_desk_current_get(E_Manager *man)
+{
+   Evas_List *l;
+   
+   E_OBJECT_CHECK(man);
+   
+   for (l = man->desks; l; l = l->next)
+     {
+	E_Desk *desk = l->data;
+	if (desk->container->visible)
+	  return desk;
+     }
+
+   return NULL;   
+}
+
+/* FIXME: Do desktop order the right way */
+void
+e_desk_next(E_Manager *man)
+{
+   Evas_List   *l;
+   E_Desk      *desk;
+
+   E_OBJECT_CHECK(man);
+   
+   if (evas_list_count(man->desks) < 2)
+      return;
+   
+   /* Locate the position of the current desktop in the list */
+   desk = e_desk_current_get(man);
+   l = evas_list_find_list(man->desks, desk);
+   if (!l) return; /* Couldn't help putting this here */
+   
+   l = l->next;
+   if (!l) l = man->desks; /* Wraparound */
+
+   /* Show the desktop */
+   desk = l->data;
+   e_desk_show(desk);
+}
+
+void
+e_desk_prev(E_Manager *man)
+{
+   Evas_List   *l;
+   E_Desk      *desk;
+
+   E_OBJECT_CHECK(man);
+   
+   if (evas_list_count(man->desks) < 2)
+      return;
+   
+   /* Locate the position of the current desktop in the list */
+   desk = e_desk_current_get(man);
+   l = evas_list_find_list(man->desks, desk);
+   if (!l) return; /* Couldn't help putting this here */
+   
+   l = l->prev;
+   if (!l) l = evas_list_last(man->desks); /* Wraparound */
+
+   /* Show the desktop */
+   desk = l->data;
+   e_desk_show(desk);
+}
+
+static void
+_e_desk_free(E_Desk *desk)
+{
+   E_Manager *man = desk->container->manager;
+   if (desk->name)
+     free(desk->name);
+   man->desks = evas_list_remove(man->desks, desk);
+   e_object_unref(E_OBJECT(desk->container));
+   free(desk);
+}
+
Index: e_desk.h
===================================================================
RCS file: /cvsroot/enlightenment/e17/apps/e/src/bin/e_desk.h,v
retrieving revision 1.1
diff -u -3 -p -r1.1 e_desk.h
--- e_desk.h	25 Nov 2004 03:37:44 -0000	1.1
+++ e_desk.h	3 Jan 2005 05:24:15 -0000
@@ -1,4 +1,15 @@
 #ifndef E_DESK_H
 #define E_DESK_H
 
+typedef struct _E_Desk E_Desk;
+
+struct _E_Desk
+{
+   E_Object             e_obj_inherit;
+
+   E_Container         *container;
+   char                *name;
+};
+
 #endif
+
Index: e_hints.c
===================================================================
RCS file: /cvsroot/enlightenment/e17/apps/e/src/bin/e_hints.c,v
retrieving revision 1.4
diff -u -3 -p -r1.4 e_hints.c
--- e_hints.c	3 Jan 2005 03:14:45 -0000	1.4
+++ e_hints.c	3 Jan 2005 05:24:15 -0000
@@ -3,6 +3,8 @@
  */
 #include "e.h"
 
+Ecore_X_Window root = 0;
+
 void
 e_hints_init(void)
 {
@@ -21,6 +23,7 @@ e_hints_init(void)
 	     win = ecore_x_window_new(roots[i], -200, -200, 5, 5);
 	     ecore_x_netwm_wm_identify(roots[i], win, "Enlightenment");
 	  }
+	root = roots[0];
         free(roots);
      }
 }
@@ -223,6 +226,36 @@ e_hints_desktop_config_set(void)
 }
 
 void
+e_hints_desktop_current_set(void)
+{
+   E_Manager		*man;
+   E_Desk		*desk;
+   Evas_List		*ml;
+   unsigned int		n;
+
+   /* FIXME: desktop ordering */
+   /*ml = e_manager_list();
+   man = (E_Manager *)ml->data;
+   desk = e_desk_current_get(man);
+   n = evas_list_*/
+}
+
+void
+e_hints_desktop_size_set(void)
+{
+   E_Manager		*man;
+   E_Desk		*desk;
+   Evas_List		*ml;
+   
+   ml = e_manager_list();
+   man = (E_Manager *)ml->data;
+   desk = e_desk_current_get(man);
+
+   ecore_x_netwm_desk_size_set(root, (unsigned int)desk->container->w, 
+                                     (unsigned int)desk->container->h);
+}   
+
+void
 e_hints_window_state_set(Ecore_X_Window win)
 {
    E_Border	*bd;
@@ -293,4 +326,3 @@ e_hints_window_icon_name_get(Ecore_X_Win
 
 
 
-
Index: e_int_menus.c
===================================================================
RCS file: /cvsroot/enlightenment/e17/apps/e/src/bin/e_int_menus.c,v
retrieving revision 1.13
diff -u -3 -p -r1.13 e_int_menus.c
--- e_int_menus.c	27 Dec 2004 07:50:03 -0000	1.13
+++ e_int_menus.c	3 Jan 2005 05:24:15 -0000
@@ -24,6 +24,8 @@ static void _e_int_menus_apps_free_hook 
 static void _e_int_menus_apps_run        (void *data, E_Menu *m, E_Menu_Item *mi);
 static void _e_int_menus_clients_pre_cb  (void *data, E_Menu *m);
 static void _e_int_menus_clients_item_cb (void *data, E_Menu *m, E_Menu_Item *mi);
+static void _e_int_menus_desktops_pre_cb (void *data, E_Menu *m);
+static void _e_int_menus_desktops_item_cb(void *data, E_Menu *m, E_Menu_Item *mi);
 
 /* externally accessible functions */
 E_Menu *
@@ -57,6 +59,13 @@ e_int_menus_main_new(void)
    e_menu_item_icon_edje_set(mi, e_path_find(path_icons, "default.eet"),
 			     "module");
    e_menu_item_submenu_set(mi, subm);
+
+   subm = e_int_menus_desktops_new();
+   mi = e_menu_item_new(m);
+   e_menu_item_label_set(mi, "Desktops");
+   e_menu_item_icon_edje_set(mi, e_path_find(path_icons, "default.eet"),
+			     "windows");
+   e_menu_item_submenu_set(mi, subm);
   
    subm = e_int_menus_clients_new();
    mi = e_menu_item_new(m);
@@ -110,6 +119,19 @@ e_int_menus_apps_new(char *dir, int top)
 }
 
 E_Menu *
+e_int_menus_desktops_new(void)
+{
+   E_Menu *m;
+   E_Menu_Item *mi;
+
+   m = e_menu_new();
+   e_menu_pre_activate_callback_set(m, _e_int_menus_desktops_pre_cb, NULL);
+
+   return m;
+}
+   
+
+E_Menu *
 e_int_menus_favorite_apps_new(int top)
 {
    E_Menu *m;
@@ -260,6 +282,61 @@ _e_int_menus_apps_run(void *data, E_Menu
 }
 
 static void
+_e_int_menus_desktops_pre_cb(void *data, E_Menu *m)
+{
+   E_Menu_Item *mi;
+   Evas_List *l, *desks = NULL;
+   E_Menu *root;
+
+   if (m->realized) return;
+
+   /* clear list */
+   if (m->items)
+     {
+	Evas_List *l;
+	for (l = m->items; l; l = l->next)
+	  {
+	     E_Menu_Item *mi = l->data;
+	     e_object_free(E_OBJECT(mi));
+	  }
+     }
+
+   root = e_menu_root_get(m);
+   /* Get the desktop list for this manager */
+   if (root && root->con)
+     {
+	for (l = root->con->manager->desks; l; l = l->next)
+	  {
+	     E_Desk *desk = l->data;
+	     desks = evas_list_append(desks, desk);
+	  }
+	
+	for (l = desks; l; l = l->next)
+	  {
+	     E_Desk *desk = l->data;
+	     mi = e_menu_item_new(m);
+	     e_menu_item_check_set(mi, 1);
+	     e_menu_item_label_set(mi, desk->name);
+	     e_menu_item_callback_set(mi, _e_int_menus_desktops_item_cb, desk);
+	     if (desk == e_desk_current_get(root->con->manager))
+	       e_menu_item_toggle_set(mi, 1);
+	     e_menu_item_icon_edje_set(mi, e_path_find(path_icons, "default.eet"),
+		                       "desktop");
+	  }
+     }
+
+   evas_list_free(desks);
+}
+
+static void
+_e_int_menus_desktops_item_cb(void *data, E_Menu *m, E_Menu_Item *mi)
+{
+   E_Desk *desk = data;
+
+   e_desk_show(desk);
+}
+
+static void
 _e_int_menus_clients_pre_cb(void *data, E_Menu *m)
 {
    E_Menu_Item *mi;
Index: e_int_menus.h
===================================================================
RCS file: /cvsroot/enlightenment/e17/apps/e/src/bin/e_int_menus.h,v
retrieving revision 1.5
diff -u -3 -p -r1.5 e_int_menus.h
--- e_int_menus.h	23 Dec 2004 15:31:47 -0000	1.5
+++ e_int_menus.h	3 Jan 2005 05:24:15 -0000
@@ -2,6 +2,7 @@
 #define E_INT_MENUS_H
 
 EAPI E_Menu *e_int_menus_main_new(void);    
+EAPI E_Menu *e_int_menus_desktops_new(void);
 EAPI E_Menu *e_int_menus_clients_new(void);
 EAPI E_Menu *e_int_menus_apps_new(char *dir, int top);
 EAPI E_Menu *e_int_menus_favorite_apps_new(int top);
Index: e_main.c
===================================================================
RCS file: /cvsroot/enlightenment/e17/apps/e/src/bin/e_main.c,v
retrieving revision 1.18
diff -u -3 -p -r1.18 e_main.c
--- e_main.c	30 Dec 2004 05:37:53 -0000	1.18
+++ e_main.c	3 Jan 2005 05:24:15 -0000
@@ -477,6 +477,7 @@ _e_main_screens_init(void)
      {
 	E_Manager *man;
 	E_Container *con;
+	E_Desk *desk;
 	
 	man = e_manager_new(roots[i]);
 	e_init_show();
@@ -487,13 +488,14 @@ _e_main_screens_init(void)
 				  i);
 	     return 0;
 	  }
-	con = e_container_new(man);
-	if (con)
+	desk = e_desk_new(man);
+	if (desk)
 	  {
 	     /* FIXME: move this to an actual function to start managing */
 	     Ecore_X_Window *windows;
 	     int num;
 	     
+	     con = desk->container;
 	     windows = ecore_x_window_children_get(con->manager->root, &num);
 	     if (windows)
 	       {
@@ -513,11 +515,20 @@ _e_main_screens_init(void)
 			 }
 		    }
 	       }
-	     e_container_show(con);
+	     e_desk_name_set(desk, "Desktop 1");
+	     e_desk_show(desk);
+	     /* Create 3 more desktops.
+	      * FIXME: Test purposes only, extra desktops should be in config */
+	     desk = e_desk_new(man);
+	     e_desk_name_set(desk, "Desktop 2");
+	     desk = e_desk_new(man);
+	     e_desk_name_set(desk, "Desktop 3");
+	     desk = e_desk_new(man);
+	     e_desk_name_set(desk, "Desktop 4");
 	  }
 	else
 	  {
-	     e_error_message_show("Cannot create container object for manager on screen %i\n", 
+	     e_error_message_show("Cannot create desktop object for manager on screen %i\n", 
 				  i);
 	     return 0;
 	  }
Index: e_manager.c
===================================================================
RCS file: /cvsroot/enlightenment/e17/apps/e/src/bin/e_manager.c,v
retrieving revision 1.3
diff -u -3 -p -r1.3 e_manager.c
--- e_manager.c	25 Dec 2004 15:33:48 -0000	1.3
+++ e_manager.c	3 Jan 2005 05:24:15 -0000
@@ -187,9 +187,11 @@ _e_manager_cb_window_show_request(void *
    /*ecore_x_window_show(e->win); */
      {
 	E_Container *con;
+   E_Desk *desk;
 	E_Border *bd;
 	
-	con = man->containers->data;
+	desk = e_desk_current_get(man);
+   con = desk->container;
 	if (!e_border_find_by_client_window(e->win))
 	  {
 	     bd = e_border_new(con, e->win, 0);
Index: e_manager.h
===================================================================
RCS file: /cvsroot/enlightenment/e17/apps/e/src/bin/e_manager.h,v
retrieving revision 1.2
diff -u -3 -p -r1.2 e_manager.h
--- e_manager.h	25 Nov 2004 05:31:20 -0000	1.2
+++ e_manager.h	3 Jan 2005 05:24:15 -0000
@@ -13,6 +13,7 @@ struct _E_Manager
    Ecore_X_Window       root;
    Evas_List           *handlers;
    Evas_List           *containers;
+   Evas_List           *desks;
 };
 
 EAPI int        e_manager_init(void);
