Enlightenment CVS committal Author : sebastid Project : e17 Module : apps/e
Dir : e17/apps/e/src/bin Modified Files: e_main.c e_manager.h e_manager.c Log Message: Move managing code from e_main.c to e_manager.c 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() =================================================================== RCS file: /cvsroot/enlightenment/e17/apps/e/src/bin/e_main.c,v retrieving revision 1.46 retrieving revision 1.47 diff -u -3 -r1.46 -r1.47 --- e_main.c 9 Feb 2005 06:40:23 -0000 1.46 +++ e_main.c 13 Feb 2005 11:17:46 -0000 1.47 @@ -520,75 +520,7 @@ 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 @@ i); return 0; } - /* + /* FIXME + * This should be removed! { E_Gadman_Client *gmc; =================================================================== RCS file: /cvsroot/enlightenment/e17/apps/e/src/bin/e_manager.h,v retrieving revision 1.6 retrieving revision 1.7 diff -u -3 -r1.6 -r1.7 --- e_manager.h 7 Feb 2005 13:51:09 -0000 1.6 +++ e_manager.h 13 Feb 2005 11:17:46 -0000 1.7 @@ -36,5 +36,8 @@ 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 =================================================================== RCS file: /cvsroot/enlightenment/e17/apps/e/src/bin/e_manager.c,v retrieving revision 1.9 retrieving revision 1.10 diff -u -3 -r1.9 -r1.10 --- e_manager.c 22 Jan 2005 06:58:34 -0000 1.9 +++ e_manager.c 13 Feb 2005 11:17:46 -0000 1.10 @@ -37,7 +37,7 @@ 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 @@ } 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 @@ 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 @@ 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); ------------------------------------------------------- SF email is sponsored by - The IT Product Guide Read honest & candid reviews on hundreds of IT Products from real users. Discover which products truly live up to the hype. Start reading now. http://ads.osdn.com/?ad_id=6595&alloc_id=14396&op=click _______________________________________________ enlightenment-cvs mailing list enlightenment-cvs@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/enlightenment-cvs