Move managing code from e_main.c to e_manager.c
authorsebastid <sebastid>
Sun, 13 Feb 2005 11:17:46 +0000 (11:17 +0000)
committersebastid <sebastid@7cbeb6ba-43b4-40fd-8cce-4c39aea84d33>
Sun, 13 Feb 2005 11:17:46 +0000 (11:17 +0000)
Check for the existence of E_ATOM_CONTAINER and E_ATOM_ZONE
Use e_object_del to delete objects.
Convenience functions:
- e_manager_container_current_get()
- e_manager_container_number_get()

SVN revision: 13348

src/bin/e_main.c
src/bin/e_manager.c
src/bin/e_manager.h

index e777341..8ef5b6a 100644 (file)
@@ -520,75 +520,7 @@ _e_main_screens_init(void)
        con = e_container_new(man);
        if (con)
          {
-            /* FIXME: move this to an actual function to start managing */
-            Ecore_X_Window *windows;
-            int wnum;
-            
-            windows = ecore_x_window_children_get(con->manager->root, &wnum);
-            if (windows)
-              {
-                 int i;
-                 
-                 for (i = 0; i < wnum; i++)
-                   {
-                      Ecore_X_Window_Attributes att;
-                      unsigned int ret_val, deskxy[2];
-                      int ret;
-                      
-                      ecore_x_window_attributes_get(windows[i], &att);
-                      ret = ecore_x_window_prop_card32_get(windows[i],
-                                                           E_ATOM_MANAGED,
-                                                           &ret_val, 1);
-                      
-                      /* we have seen this window before */
-                      if ((ret > -1) && (ret_val == 1))
-                        {
-                           E_Border *bd;
-                           
-                           /* get all information from window before it is 
-                            * reset by e_border_new */
-                           ret = ecore_x_window_prop_card32_get(windows[i],
-                                                                E_ATOM_DESK,
-                                                                deskxy, 2);
-                           bd = e_border_new(con, windows[i], 1);
-                           if (bd)
-                             {
-                                if (ret == 2)
-                                  {
-                                     E_Desk *target;
-                                     target = e_desk_at_xy_get(bd->zone,
-                                                               deskxy[0],
-                                                               deskxy[1]);
-                                     if (target)
-                                       e_border_desk_set(bd, target);
-                                     if (!target || target == e_desk_current_get(bd->zone))
-                                       {
-                                          ret = ecore_x_window_prop_card32_get(windows[i],
-                                                                               E_ATOM_MAPPED,
-                                                                               &ret_val, 1);
-                                          if ((ret > -1) && ret_val)
-                                            e_border_show(bd);
-                                       }
-                                  }
-                             }
-                           ret = ecore_x_window_prop_card32_get(windows[i],
-                                                                E_ATOM_ICONIC,
-                                                                &ret_val, 1);
-                           if ((ret > -1) && ret_val)
-                             e_border_iconify(bd);
-                        }
-                      else if ((att.visible) && (!att.override) &&
-                               (!att.input_only))
-                        {
-                           /* We have not seen this window, and X tells us it
-                            * should be seen */
-                           E_Border *bd;
-                           bd = e_border_new(con, windows[i], 1);
-                           if (bd)
-                             e_border_show(bd);
-                        }
-                   }
-              }
+            e_manager_manage_windows(man);
             ecore_x_netwm_desk_roots_set(man->root, 1, &(con->win));
             e_container_show(con);
          }
@@ -598,7 +530,8 @@ _e_main_screens_init(void)
                                  i);
             return 0;
          }
-       /*
+       /* FIXME
+        * This should be removed!
          {
             E_Gadman_Client *gmc;
             
index 84c37b4..7770cda 100644 (file)
@@ -37,7 +37,7 @@ int
 e_manager_shutdown(void)
 {
    while (managers)
-     _e_manager_free((E_Manager *)(managers->data));
+     e_object_del(E_OBJECT(managers->data));
    return 1;
 }
 
@@ -69,6 +69,110 @@ e_manager_new(Ecore_X_Window root)
 }
 
 void
+e_manager_manage_windows(E_Manager *man)
+{
+   /* FIXME: move this to an actual function to start managing */
+   Ecore_X_Window *windows;
+   int wnum;
+
+   windows = ecore_x_window_children_get(man->root, &wnum);
+   if (windows)
+     {
+       int i;
+
+       for (i = 0; i < wnum; i++)
+         {
+            Ecore_X_Window_Attributes att;
+            unsigned int ret_val, deskxy[2];
+            int ret;
+
+            ecore_x_window_attributes_get(windows[i], &att);
+            ret = ecore_x_window_prop_card32_get(windows[i],
+                                                 E_ATOM_MANAGED,
+                                                 &ret_val, 1);
+
+            /* we have seen this window before */
+            if ((ret > -1) && (ret_val == 1))
+              {
+                 E_Container *con = NULL;
+                 E_Zone      *zone = NULL;
+                 E_Border    *bd = NULL;
+                 int          id;
+
+                 /* get all information from window before it is 
+                  * reset by e_border_new */
+                 ret = ecore_x_window_prop_card32_get(windows[i],
+                                                      E_ATOM_CONTAINER,
+                                                      &id, 1);
+                 if (ret == 1)
+                   con = e_manager_container_number_get(man, id);
+                 else
+                   con = e_manager_container_current_get(man);
+
+                 ret = ecore_x_window_prop_card32_get(windows[i],
+                                                      E_ATOM_ZONE,
+                                                      &id, 1);
+                 if (ret == 1)
+                   zone = e_container_zone_number_get(con, id);
+                 /* FIXME
+                  * This is the default behaviour, should it be
+                  * done here?
+                 else
+                   zone = e_zone_current_get(con);
+                 */
+
+                 ret = ecore_x_window_prop_card32_get(windows[i],
+                                                      E_ATOM_DESK,
+                                                      deskxy, 2);
+
+                 bd = e_border_new(con, windows[i], 1);
+                 if (bd)
+                   {
+                      if (zone)
+                        e_border_zone_set(bd, zone);
+
+                      if (ret == 2)
+                        {
+                           E_Desk *target;
+                           target = e_desk_at_xy_get(bd->zone,
+                                                     deskxy[0],
+                                                     deskxy[1]);
+                           if (target)
+                             e_border_desk_set(bd, target);
+                           if (!target || target == e_desk_current_get(bd->zone))
+                             {
+                                ret = ecore_x_window_prop_card32_get(windows[i],
+                                                                     E_ATOM_MAPPED,
+                                                                     &ret_val, 1);
+                                if ((ret > -1) && ret_val)
+                                  e_border_show(bd);
+                             }
+                        }
+                   }
+                 /* FIXME: Shouldn't be here! */
+                 ret = ecore_x_window_prop_card32_get(windows[i],
+                                                      E_ATOM_ICONIC,
+                                                      &ret_val, 1);
+                 if ((ret > -1) && ret_val)
+                   e_border_iconify(bd);
+              }
+            else if ((att.visible) && (!att.override) &&
+                     (!att.input_only))
+              {
+                 /* We have not seen this window, and X tells us it
+                  * should be seen */
+                 E_Container *con;
+                 E_Border *bd;
+                 con = e_manager_container_current_get(man);
+                 bd = e_border_new(con, windows[i], 1);
+                 if (bd)
+                   e_border_show(bd);
+              }
+         }
+     }
+}
+
+void
 e_manager_show(E_Manager *man)
 {
    E_OBJECT_CHECK(man);
@@ -162,6 +266,36 @@ e_manager_lower(E_Manager *man)
    ecore_x_window_lower(man->win);
 }
 
+E_Container *
+e_manager_container_current_get(E_Manager *man)
+{
+   /* FIXME
+    * Currently only one container, but...
+    */
+   E_OBJECT_CHECK_RETURN(man, NULL);
+   E_OBJECT_TYPE_CHECK_RETURN(man, E_MANAGER_TYPE, NULL);
+
+   return (E_Container *)man->containers->data;
+}
+
+E_Container *
+e_manager_container_number_get(E_Manager *man, int num)
+{
+   Evas_List *l;
+
+   E_OBJECT_CHECK_RETURN(man, NULL);
+   E_OBJECT_TYPE_CHECK_RETURN(man, E_MANAGER_TYPE, NULL);
+   for (l = man->containers; l; l = l->next)
+     {
+       E_Container *con;
+       
+       con = l->data;
+       if (con->num == num)
+         return con;
+     }
+   return NULL;
+}
+
 /* local subsystem functions */
 static void
 _e_manager_free(E_Manager *man)
@@ -175,7 +309,7 @@ _e_manager_free(E_Manager *man)
        ecore_event_handler_del(h);
      }
    while (man->containers)
-     e_object_free(E_OBJECT(man->containers->data));
+     e_object_del(E_OBJECT(man->containers->data));
    ecore_x_window_del(man->win);
    managers = evas_list_remove(managers, man);   
    free(man);
index da6aed5..8b942d6 100644 (file)
@@ -36,5 +36,8 @@ EAPI void            e_manager_move_resize(E_Manager *man, int x, int y, int w,
 EAPI void            e_manager_raise(E_Manager *man);
 EAPI void            e_manager_lower(E_Manager *man);
 
+EAPI E_Container    *e_manager_container_current_get(E_Manager *man);
+EAPI E_Container    *e_manager_container_number_get(E_Manager *man, int num);
+
 #endif
 #endif