Allow gadgets to either be 1 per container (default) or 1 per zone (like the pager).
authorrephorm <rephorm>
Sun, 18 Dec 2005 21:06:37 +0000 (21:06 +0000)
committerrephorm <rephorm@7cbeb6ba-43b4-40fd-8cce-4c39aea84d33>
Sun, 18 Dec 2005 21:06:37 +0000 (21:06 +0000)
SVN revision: 19120

src/bin/e_gadget.c
src/bin/e_gadget.h
src/modules/gadget_test/e_mod_main.c

index af9364c..39d65fb 100644 (file)
@@ -3,6 +3,7 @@
  */
 #include "e.h"
 
+E_Gadget_Face *_e_gadget_face_new(E_Gadget *gad, E_Container *con, E_Zone *zone);
 static void _e_gadget_menu_init(E_Gadget *gad);
 static void _e_gadget_cb_menu_edit(void *data, E_Menu *m, E_Menu_Item *mi);
 static void _e_gadget_free(E_Gadget *gad);
@@ -39,9 +40,7 @@ E_Gadget *
 e_gadget_new(E_Gadget_Api *api)
 {
    E_Gadget *gad;
-   Evas_List *managers, *l = NULL, *l2 = NULL;
-   char buf[1024];
-   int gadget_count = 0;
+   Evas_List *managers, *l = NULL, *l2 = NULL, *l3 = NULL;
 
    if (!api || !api->module || !api->name) return NULL;
 
@@ -72,66 +71,23 @@ e_gadget_new(E_Gadget_Api *api)
        for(l2 = man->containers; l2; l2 = l2->next)
          {
             E_Container *con;
-            E_Gadget_Face *face;
-            E_Gadget_Change *change;
-            Evas_Object *o;
 
             con = l2->data;
-            face = E_NEW(E_Gadget_Face, 1);
-            if (!face) continue;
-
-            face->gad = gad;
-            face->con = con;
-            e_object_ref(E_OBJECT(con));
-            face->evas = con->bg_evas;
-            
-            evas_event_freeze(face->evas);
-
-            /* create an event object */
-            
-            o = evas_object_rectangle_add(con->bg_evas);
-            face->event_obj = o;
-            evas_object_layer_set(o, 2);
-            evas_object_repeat_events_set(o, 1);
-            evas_object_color_set(o, 0, 0, 0, 0);
-            evas_object_event_callback_add(o, EVAS_CALLBACK_MOUSE_DOWN, _e_gadget_cb_mouse_down, face);
-            evas_object_show(o);
        
-            /* create a gadman client */
-            snprintf(buf, sizeof(buf), "module.%s", gad->name);
-            face->gmc = e_gadman_client_new(con->gadman);
-            e_gadman_client_domain_set(face->gmc, buf, gadget_count++);
-
-            /* call the user init */
-            if (gad->funcs.face_init) (gad->funcs.face_init)(gad->data, face);
-
-            _e_gadget_face_menu_init(face);
-
-            change = E_NEW(E_Gadget_Change, 1);
-            if (change)
+            if (api->per_zone) 
               {
-                 printf("set change func\n");
-                 change->gadget = gad;
-                 change->face = face;
+                 for(l3 = con->zones; l3; l3 = l3->next)
+                   {
+                      E_Zone *zone;
+
+                      zone = l3->data;
+                      _e_gadget_face_new(gad, con, zone);
+                   }
+              } 
+            else 
+              {
+                 _e_gadget_face_new(gad, con, NULL);
               }
-
-            /* set up some gadman defaults */
-            e_gadman_client_policy_set(face->gmc,
-                                       E_GADMAN_POLICY_ANYWHERE |
-                                       E_GADMAN_POLICY_HMOVE |
-                                       E_GADMAN_POLICY_VMOVE |
-                                       E_GADMAN_POLICY_HSIZE |
-                                       E_GADMAN_POLICY_VSIZE );
-            e_gadman_client_min_size_set(face->gmc, 4, 4);
-            e_gadman_client_max_size_set(face->gmc, 128, 128);
-            e_gadman_client_auto_size_set(face->gmc, 40, 40);
-            e_gadman_client_align_set(face->gmc, 1.0, 1.0);
-            e_gadman_client_resize(face->gmc, 40, 40);
-            e_gadman_client_change_func_set(face->gmc, _e_gadget_face_cb_gmc_change, change);
-            e_gadman_client_load(face->gmc);
-            evas_event_thaw(face->evas);
-
-            gad->faces = evas_list_append(gad->faces, face);
          }
      }
    _e_gadget_menu_init(gad);
@@ -139,6 +95,76 @@ e_gadget_new(E_Gadget_Api *api)
    return gad;
 }
 
+E_Gadget_Face *
+_e_gadget_face_new(E_Gadget *gad, E_Container *con, E_Zone *zone)
+{
+   E_Gadget_Face *face;
+   E_Gadget_Change *change;
+   Evas_Object *o;
+   char buf[1024];
+
+   face = E_NEW(E_Gadget_Face, 1);
+   if (!face) return NULL; 
+
+   face->gad = gad;
+   face->con = con;
+   if (zone) face->zone = zone;
+   else face->zone = (E_Zone *)evas_list_data(con->zones);
+   e_object_ref(E_OBJECT(con));
+   face->evas = con->bg_evas;
+
+   evas_event_freeze(face->evas);
+
+   /* create an event object */
+
+   o = evas_object_rectangle_add(con->bg_evas);
+   face->event_obj = o;
+   evas_object_layer_set(o, 2);
+   evas_object_repeat_events_set(o, 1);
+   evas_object_color_set(o, 0, 0, 0, 0);
+   evas_object_event_callback_add(o, EVAS_CALLBACK_MOUSE_DOWN, _e_gadget_cb_mouse_down, face);
+   evas_object_show(o);
+
+   /* create a gadman client */
+   snprintf(buf, sizeof(buf), "module.%s", gad->name);
+   face->gmc = e_gadman_client_new(con->gadman);
+   e_gadman_client_zone_set(face->gmc, face->zone);
+   e_gadman_client_domain_set(face->gmc, buf, evas_list_count(gad->faces));
+
+   /* call the user init */
+   if (gad->funcs.face_init) (gad->funcs.face_init)(gad->data, face);
+
+   _e_gadget_face_menu_init(face);
+
+   change = E_NEW(E_Gadget_Change, 1);
+   if (change)
+     {
+       printf("set change func\n");
+       change->gadget = gad;
+       change->face = face;
+     }
+
+   /* set up some gadman defaults */
+   e_gadman_client_policy_set(face->gmc,
+        E_GADMAN_POLICY_ANYWHERE |
+        E_GADMAN_POLICY_HMOVE |
+        E_GADMAN_POLICY_VMOVE |
+        E_GADMAN_POLICY_HSIZE |
+        E_GADMAN_POLICY_VSIZE );
+   e_gadman_client_min_size_set(face->gmc, 4, 4);
+   e_gadman_client_max_size_set(face->gmc, 128, 128);
+   e_gadman_client_auto_size_set(face->gmc, 40, 40);
+   e_gadman_client_align_set(face->gmc, 1.0, 1.0);
+   e_gadman_client_resize(face->gmc, 40, 40);
+   e_gadman_client_change_func_set(face->gmc, _e_gadget_face_cb_gmc_change, change);
+   e_gadman_client_load(face->gmc);
+   evas_event_thaw(face->evas);
+
+   gad->faces = evas_list_append(gad->faces, face);
+
+   return face;
+}
+
 void
 e_gadget_face_theme_set(E_Gadget_Face *face, char *category, char *group)
 {
index 9c71820..e276152 100644 (file)
@@ -15,6 +15,7 @@ struct _E_Gadget_Api
 {
   E_Module *module;
   const char *name;
+  int per_zone; /* 1 - one face per zone, 0 - one per container */
   void (*func_face_init) (void *data, E_Gadget_Face *gadget_face);
   void (*func_face_free) (void *data, E_Gadget_Face *gadget_face);
   void (*func_change) (void *data, E_Gadget_Face *gadget_face, E_Gadman_Client *gmc, E_Gadman_Change change);
@@ -29,7 +30,7 @@ struct _E_Gadget
   Evas_List *faces;
 
   E_Module *module;
-  char *name;
+  const char *name;
   E_Menu *menu;
 
   struct {
@@ -47,6 +48,7 @@ struct _E_Gadget_Face
 {
   E_Gadget *gad;
   E_Container *con;
+  E_Zone *zone;
   Evas *evas;
 
   E_Menu *menu;
index 175978d..96cbf06 100644 (file)
@@ -35,6 +35,7 @@ e_modapi_init(E_Module *m)
    
    api->module = m;
    api->name = "test_gadget";
+   api->per_zone = 1;
    api->func_face_init = _test_face_init;
    api->func_face_free = _test_face_free;
    api->func_change = _test_face_change;
@@ -88,9 +89,11 @@ _test_face_init(void *data, E_Gadget_Face *face)
 static void
 _test_face_free(void *data, E_Gadget_Face *face)
 {
+   /* really, this should be done in a gadget_free callback, but that doesn't exist yet... */ 
    Test *t;
    t = data;
    if (t) free(t);
+   face->gad->data = NULL;
 }
 
 static void