forked from enlightenment/enlightenment
e_manager_new now creates compositors for new managers instead of creating them all at once
SVN revision: 83743
This commit is contained in:
parent
13a3f968ec
commit
7f35677bc0
105
src/bin/e_comp.c
105
src/bin/e_comp.c
|
@ -26,7 +26,7 @@
|
||||||
|
|
||||||
struct _E_Comp
|
struct _E_Comp
|
||||||
{
|
{
|
||||||
Ecore_X_Window win;
|
Ecore_X_Window win; // input overlay
|
||||||
Ecore_Evas *ee;
|
Ecore_Evas *ee;
|
||||||
Evas *evas;
|
Evas *evas;
|
||||||
Evas_Object *layout;
|
Evas_Object *layout;
|
||||||
|
@ -2028,7 +2028,12 @@ _e_comp_win_add(E_Comp *c,
|
||||||
cw->role = ecore_x_icccm_window_role_get(cw->win);
|
cw->role = ecore_x_icccm_window_role_get(cw->win);
|
||||||
if (!ecore_x_netwm_window_type_get(cw->win, &cw->primary_type))
|
if (!ecore_x_netwm_window_type_get(cw->win, &cw->primary_type))
|
||||||
cw->primary_type = ECORE_X_WINDOW_TYPE_UNKNOWN;
|
cw->primary_type = ECORE_X_WINDOW_TYPE_UNKNOWN;
|
||||||
cw->bg_win = (cw->win == e_util_container_current_get()->bg_win);
|
{
|
||||||
|
E_Container *con;
|
||||||
|
|
||||||
|
con = e_util_container_current_get();
|
||||||
|
cw->bg_win = (con && (cw->win == con->bg_win));
|
||||||
|
}
|
||||||
// setup on show
|
// setup on show
|
||||||
// _e_comp_win_sync_setup(cw, cw->win);
|
// _e_comp_win_sync_setup(cw, cw->win);
|
||||||
}
|
}
|
||||||
|
@ -3530,14 +3535,52 @@ _e_comp_signal_user(void *data __UNUSED__,
|
||||||
}
|
}
|
||||||
|
|
||||||
//////////////////////////////////////////////////////////////////////////
|
//////////////////////////////////////////////////////////////////////////
|
||||||
|
static void
|
||||||
|
_e_comp_populate(E_Comp *c)
|
||||||
|
{
|
||||||
|
Ecore_X_Window *wins;
|
||||||
|
int i, num;
|
||||||
|
|
||||||
|
wins = ecore_x_window_children_get(c->man->root, &num);
|
||||||
|
if (!wins) return;
|
||||||
|
for (i = 0; i < num; i++)
|
||||||
|
{
|
||||||
|
E_Comp_Win *cw;
|
||||||
|
int x, y, w, h, border;
|
||||||
|
char *wname = NULL, *wclass = NULL;
|
||||||
|
|
||||||
|
ecore_x_icccm_name_class_get(wins[i], &wname, &wclass);
|
||||||
|
if ((c->man->initwin == wins[i]) ||
|
||||||
|
((wname) && (wclass) && (!strcmp(wname, "E")) &&
|
||||||
|
(!strcmp(wclass, "Init_Window"))))
|
||||||
|
{
|
||||||
|
free(wname);
|
||||||
|
free(wclass);
|
||||||
|
ecore_x_window_reparent(wins[i], c->win, 0, 0);
|
||||||
|
ecore_x_sync();
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
free(wname);
|
||||||
|
free(wclass);
|
||||||
|
wname = wclass = NULL;
|
||||||
|
cw = _e_comp_win_add(c, wins[i]);
|
||||||
|
if (!cw) continue;
|
||||||
|
ecore_x_window_geometry_get(cw->win, &x, &y, &w, &h);
|
||||||
|
border = ecore_x_window_border_width_get(cw->win);
|
||||||
|
if (wins[i] == c->win) continue;
|
||||||
|
_e_comp_win_configure(cw, x, y, w, h, border);
|
||||||
|
if (ecore_x_window_visible_get(wins[i]))
|
||||||
|
_e_comp_win_show(cw);
|
||||||
|
}
|
||||||
|
free(wins);
|
||||||
|
}
|
||||||
|
|
||||||
static E_Comp *
|
static E_Comp *
|
||||||
_e_comp_add(E_Manager *man)
|
_e_comp_add(E_Manager *man)
|
||||||
{
|
{
|
||||||
E_Comp *c;
|
E_Comp *c;
|
||||||
Ecore_X_Window *wins;
|
|
||||||
Ecore_X_Window_Attributes att;
|
Ecore_X_Window_Attributes att;
|
||||||
Eina_Bool res;
|
Eina_Bool res;
|
||||||
int i, num;
|
|
||||||
|
|
||||||
c = calloc(1, sizeof(E_Comp));
|
c = calloc(1, sizeof(E_Comp));
|
||||||
if (!c) return NULL;
|
if (!c) return NULL;
|
||||||
|
@ -3667,40 +3710,8 @@ _e_comp_add(E_Manager *man)
|
||||||
ecore_x_composite_redirect_subwindows
|
ecore_x_composite_redirect_subwindows
|
||||||
(c->man->root, ECORE_X_COMPOSITE_UPDATE_MANUAL);
|
(c->man->root, ECORE_X_COMPOSITE_UPDATE_MANUAL);
|
||||||
|
|
||||||
wins = ecore_x_window_children_get(c->man->root, &num);
|
/* ensure we're in main loop so managers and containers have been set up */
|
||||||
if (wins)
|
ecore_job_add((Ecore_Cb)_e_comp_populate, c);
|
||||||
{
|
|
||||||
for (i = 0; i < num; i++)
|
|
||||||
{
|
|
||||||
E_Comp_Win *cw;
|
|
||||||
int x, y, w, h, border;
|
|
||||||
char *wname = NULL, *wclass = NULL;
|
|
||||||
|
|
||||||
ecore_x_icccm_name_class_get(wins[i], &wname, &wclass);
|
|
||||||
if ((man->initwin == wins[i]) ||
|
|
||||||
((wname) && (wclass) && (!strcmp(wname, "E")) &&
|
|
||||||
(!strcmp(wclass, "Init_Window"))))
|
|
||||||
{
|
|
||||||
free(wname);
|
|
||||||
free(wclass);
|
|
||||||
ecore_x_window_reparent(wins[i], c->win, 0, 0);
|
|
||||||
ecore_x_sync();
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
free(wname);
|
|
||||||
free(wclass);
|
|
||||||
wname = wclass = NULL;
|
|
||||||
cw = _e_comp_win_add(c, wins[i]);
|
|
||||||
if (!cw) continue;
|
|
||||||
ecore_x_window_geometry_get(cw->win, &x, &y, &w, &h);
|
|
||||||
border = ecore_x_window_border_width_get(cw->win);
|
|
||||||
if (wins[i] == c->win) continue;
|
|
||||||
_e_comp_win_configure(cw, x, y, w, h, border);
|
|
||||||
if (ecore_x_window_visible_get(wins[i]))
|
|
||||||
_e_comp_win_show(cw);
|
|
||||||
}
|
|
||||||
free(wins);
|
|
||||||
}
|
|
||||||
|
|
||||||
ecore_x_window_key_grab(c->man->root,
|
ecore_x_window_key_grab(c->man->root,
|
||||||
"Home",
|
"Home",
|
||||||
|
@ -4232,9 +4243,6 @@ _e_comp_cfg_init(void)
|
||||||
EINTERN Eina_Bool
|
EINTERN Eina_Bool
|
||||||
e_comp_init(void)
|
e_comp_init(void)
|
||||||
{
|
{
|
||||||
Eina_List *l;
|
|
||||||
E_Manager *man;
|
|
||||||
|
|
||||||
if (!ecore_x_composite_query())
|
if (!ecore_x_composite_query())
|
||||||
{
|
{
|
||||||
e_util_dialog_internal
|
e_util_dialog_internal
|
||||||
|
@ -4334,18 +4342,19 @@ e_comp_init(void)
|
||||||
EINA_LOG_ERR("Failed to initialize Wayland Client Support !!");
|
EINA_LOG_ERR("Failed to initialize Wayland Client Support !!");
|
||||||
#endif
|
#endif
|
||||||
_e_comp_cfg_init();
|
_e_comp_cfg_init();
|
||||||
EINA_LIST_FOREACH(e_manager_list(), l, man)
|
|
||||||
{
|
return EINA_TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
|
EINTERN Eina_Bool
|
||||||
|
e_comp_manager_init(E_Manager *man)
|
||||||
|
{
|
||||||
E_Comp *c;
|
E_Comp *c;
|
||||||
|
|
||||||
c = _e_comp_add(man);
|
c = _e_comp_add(man);
|
||||||
if (c)
|
if (c)
|
||||||
compositors = eina_list_append(compositors, c);
|
compositors = eina_list_append(compositors, c);
|
||||||
}
|
return !!c;
|
||||||
|
|
||||||
ecore_x_sync();
|
|
||||||
|
|
||||||
return EINA_TRUE;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
EAPI int
|
EAPI int
|
||||||
|
|
|
@ -30,6 +30,7 @@ typedef enum
|
||||||
|
|
||||||
EINTERN Eina_Bool e_comp_init(void);
|
EINTERN Eina_Bool e_comp_init(void);
|
||||||
EINTERN int e_comp_shutdown(void);
|
EINTERN int e_comp_shutdown(void);
|
||||||
|
EINTERN Eina_Bool e_comp_manager_init(E_Manager *man);
|
||||||
|
|
||||||
EAPI int e_comp_internal_save(void);
|
EAPI int e_comp_internal_save(void);
|
||||||
EAPI E_Comp_Config *e_comp_config_get(void);
|
EAPI E_Comp_Config *e_comp_config_get(void);
|
||||||
|
|
|
@ -1672,6 +1672,13 @@ _e_main_screens_init(void)
|
||||||
free(roots);
|
free(roots);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
TS("E_Comp Init");
|
||||||
|
e_comp_init();
|
||||||
|
TS("E_Comp Init Done");
|
||||||
|
_e_main_shutdown_push(e_comp_shutdown);
|
||||||
|
|
||||||
TS("\tscreens: manage roots");
|
TS("\tscreens: manage roots");
|
||||||
for (i = 0; i < num; i++)
|
for (i = 0; i < num; i++)
|
||||||
{
|
{
|
||||||
|
@ -1711,11 +1718,6 @@ _e_main_screens_init(void)
|
||||||
}
|
}
|
||||||
free(roots);
|
free(roots);
|
||||||
|
|
||||||
TS("E_Comp Init");
|
|
||||||
e_comp_init();
|
|
||||||
TS("E_Comp Init Done");
|
|
||||||
_e_main_shutdown_push(e_comp_shutdown);
|
|
||||||
|
|
||||||
TS("\tscreens: sync");
|
TS("\tscreens: sync");
|
||||||
ecore_x_sync();
|
ecore_x_sync();
|
||||||
|
|
||||||
|
|
|
@ -95,11 +95,16 @@ e_manager_new(Ecore_X_Window root, int num)
|
||||||
if (!ecore_x_window_manage(root)) return NULL;
|
if (!ecore_x_window_manage(root)) return NULL;
|
||||||
man = E_OBJECT_ALLOC(E_Manager, E_MANAGER_TYPE, _e_manager_free);
|
man = E_OBJECT_ALLOC(E_Manager, E_MANAGER_TYPE, _e_manager_free);
|
||||||
if (!man) return NULL;
|
if (!man) return NULL;
|
||||||
managers = eina_list_append(managers, man);
|
|
||||||
man->root = root;
|
man->root = root;
|
||||||
man->num = num;
|
man->num = num;
|
||||||
ecore_x_window_size_get(man->root, &(man->w), &(man->h));
|
ecore_x_window_size_get(man->root, &(man->w), &(man->h));
|
||||||
man->win = man->root;
|
man->win = man->root;
|
||||||
|
if (!e_comp_manager_init(man))
|
||||||
|
{
|
||||||
|
e_object_del(E_OBJECT(man));
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
managers = eina_list_append(managers, man);
|
||||||
|
|
||||||
E_LIST_HANDLER_APPEND(man->handlers, ECORE_X_EVENT_WINDOW_SHOW_REQUEST,
|
E_LIST_HANDLER_APPEND(man->handlers, ECORE_X_EVENT_WINDOW_SHOW_REQUEST,
|
||||||
_e_manager_cb_window_show_request, man);
|
_e_manager_cb_window_show_request, man);
|
||||||
|
|
Loading…
Reference in New Issue