forked from enlightenment/enlightenment
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() SVN revision: 13348
This commit is contained in:
parent
68512d32c3
commit
fc6ae8b462
|
@ -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;
|
||||
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
||||
|
@ -68,6 +68,110 @@ e_manager_new(Ecore_X_Window root)
|
|||
return man;
|
||||
}
|
||||
|
||||
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)
|
||||
{
|
||||
|
@ -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);
|
||||
|
|
|
@ -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
|
||||
|
|
Loading…
Reference in New Issue