move eval into 2 stages - much better for the illumes of this world.

SVN revision: 41835
This commit is contained in:
Carsten Haitzler 2009-08-17 07:54:02 +00:00
parent d58712dd80
commit 13ced8509f
2 changed files with 78 additions and 52 deletions

View File

@ -60,6 +60,9 @@ static int _e_border_cb_grab_replay(void *data, int type, void *event);
static void _e_border_cb_drag_finished(E_Drag *drag, int dropped);
static void _e_border_eval(E_Border *bd);
static void _e_border_eval0(E_Border *bd);
static void _e_border_container_layout_hook(E_Container *con);
static void _e_border_moveinfo_gather(E_Border *bd, const char *source);
static void _e_border_resize_handle(E_Border *bd);
@ -102,7 +105,7 @@ static void _e_border_pointer_resize_end(E_Border *bd);
static void _e_border_pointer_move_begin(E_Border *bd);
static void _e_border_pointer_move_end(E_Border *bd);
static void _e_border_hook_call(E_Border_Hook_Point hookpoint, E_Border *bd);
static void _e_border_hook_call(E_Border_Hook_Point hookpoint, void *bd);
/* local subsystem globals */
static Eina_List *handlers = NULL;
@ -2692,10 +2695,6 @@ e_border_idler_before(void)
if (!borders)
return;
/* We need to loop two times through the borders.
* 1. show windows
* 2. hide windows and evaluate rest
*/
for (ml = e_manager_list(); ml; ml = ml->next)
{
E_Manager *man;
@ -2708,6 +2707,21 @@ e_border_idler_before(void)
E_Border *bd;
con = cl->data;
// pass 1 - eval0. fetch properties on new or on change and
// call hooks to decide what to do - maybe move/resize
bl = e_container_border_list_last(con);
while ((bd = e_container_border_list_prev(bl)))
{
if (bd->changed) _e_border_eval0(bd);
}
e_container_border_list_free(bl);
// layout hook - this is where a hook gets to figure out what to
// do if anything.
_e_border_container_layout_hook(con);
// pass 2 - show windows needing show
bl = e_container_border_list_last(con);
while ((bd = e_container_border_list_prev(bl)))
{
@ -2731,21 +2745,8 @@ e_border_idler_before(void)
}
}
e_container_border_list_free(bl);
}
}
for (ml = e_manager_list(); ml; ml = ml->next)
{
E_Manager *man;
man = ml->data;
for (cl = man->containers; cl; cl = cl->next)
{
E_Container *con;
E_Border_List *bl;
E_Border *bd;
con = cl->data;
// pass 3 - hide windows needing hide and eval (main eval)
bl = e_container_border_list_first(con);
while ((bd = e_container_border_list_next(bl)))
{
@ -5660,14 +5661,18 @@ _e_border_post_move_resize_job(void *data)
}
static void
_e_border_eval(E_Border *bd)
{
E_Event_Border_Property *event;
_e_border_container_layout_hook(E_Container *con)
{
_e_border_hook_call(E_BORDER_HOOK_CONTAINER_LAYOUT, con);
}
static void
_e_border_eval0(E_Border *bd)
{
int change_urgent = 0;
int rem_change = 0;
int send_event = 1;
int zx, zy, zw, zh;
if (e_object_is_del(E_OBJECT(bd)))
{
fprintf(stderr, "ERROR: _e_border_eval(%p) with deleted border!\n", bd);
@ -6462,6 +6467,15 @@ _e_border_eval(E_Border *bd)
_e_border_hook_call(E_BORDER_HOOK_EVAL_POST_FETCH, bd);
_e_border_hook_call(E_BORDER_HOOK_EVAL_PRE_BORDER_ASSIGN, bd);
if (bd->need_reparent)
{
ecore_x_window_save_set_add(bd->client.win);
ecore_x_window_reparent(bd->client.win, bd->client.shell_win, 0, 0);
if (bd->visible)
ecore_x_window_show(bd->client.win);
bd->need_reparent = 0;
}
if ((bd->client.border.changed) && (!bd->shaded) &&
(!(((bd->maximized & E_MAXIMIZE_TYPE) == E_MAXIMIZE_FULLSCREEN))))
{
@ -6630,16 +6644,42 @@ _e_border_eval(E_Border *bd)
}
}
if (bd->need_reparent)
{
ecore_x_window_save_set_add(bd->client.win);
ecore_x_window_reparent(bd->client.win, bd->client.shell_win, 0, 0);
if (bd->visible)
ecore_x_window_show(bd->client.win);
bd->need_reparent = 0;
if ((bd->remember) && (rem_change))
e_remember_update(bd->remember, bd);
if (change_urgent)
{
if (bd->client.icccm.urgent)
edje_object_signal_emit(bd->bg_object, "e,state,urgent", "e");
else
edje_object_signal_emit(bd->bg_object, "e,state,not_urgent", "e");
E_Event_Border_Urgent_Change *ev;
ev = calloc(1, sizeof(E_Event_Border_Urgent_Change));
ev->border = bd;
e_object_ref(E_OBJECT(bd));
ecore_event_add(E_EVENT_BORDER_URGENT_CHANGE, ev,
_e_border_event_border_urgent_change_free, NULL);
}
_e_border_hook_call(E_BORDER_HOOK_EVAL_POST_BORDER_ASSIGN, bd);
}
static void
_e_border_eval(E_Border *bd)
{
E_Event_Border_Property *event;
int rem_change = 0;
int send_event = 1;
int zx, zy, zw, zh;
if (e_object_is_del(E_OBJECT(bd)))
{
fprintf(stderr, "ERROR: _e_border_eval(%p) with deleted border!\n", bd);
return;
}
if (bd->zone)
e_zone_useful_geometry_get(bd->zone, &zx, &zy, &zw, &zh);
_e_border_hook_call(E_BORDER_HOOK_EVAL_PRE_NEW_BORDER, bd);
if (bd->new_client)
@ -7042,7 +7082,7 @@ _e_border_eval(E_Border *bd)
bd->changes.pos = 0;
bd->changes.size = 0;
rem_change = 1;
}
}
else if (bd->changes.pos)
{
if (1)
@ -7430,21 +7470,6 @@ _e_border_eval(E_Border *bd)
bd->changes.icon = 0;
}
if (change_urgent)
{
if (bd->client.icccm.urgent)
edje_object_signal_emit(bd->bg_object, "e,state,urgent", "e");
else
edje_object_signal_emit(bd->bg_object, "e,state,not_urgent", "e");
E_Event_Border_Urgent_Change *ev;
ev = calloc(1, sizeof(E_Event_Border_Urgent_Change));
ev->border = bd;
e_object_ref(E_OBJECT(bd));
ecore_event_add(E_EVENT_BORDER_URGENT_CHANGE, ev,
_e_border_event_border_urgent_change_free, NULL);
}
bd->new_client = 0;
bd->changed = 0;
bd->changes.stack = 0;
@ -8277,7 +8302,7 @@ _e_border_hooks_clean(void)
}
static void
_e_border_hook_call(E_Border_Hook_Point hookpoint, E_Border *bd)
_e_border_hook_call(E_Border_Hook_Point hookpoint, void *bd)
{
Eina_List *l;
@ -8296,7 +8321,7 @@ _e_border_hook_call(E_Border_Hook_Point hookpoint, E_Border *bd)
}
EAPI E_Border_Hook *
e_border_hook_add(E_Border_Hook_Point hookpoint, void (*func) (void *data, E_Border *bd), void *data)
e_border_hook_add(E_Border_Hook_Point hookpoint, void (*func) (void *data, void *bd), void *data)
{
E_Border_Hook *bh;

View File

@ -88,6 +88,7 @@ typedef enum _E_Border_Hook_Point
E_BORDER_HOOK_EVAL_PRE_NEW_BORDER,
E_BORDER_HOOK_EVAL_POST_NEW_BORDER,
E_BORDER_HOOK_EVAL_END,
E_BORDER_HOOK_CONTAINER_LAYOUT
} E_Border_Hook_Point;
typedef struct _E_Border E_Border;
@ -521,7 +522,7 @@ struct _E_Border_Pending_Move_Resize
struct _E_Border_Hook
{
E_Border_Hook_Point hookpoint;
void (*func) (void *data, E_Border *bd);
void (*func) (void *data, void *bd);
void *data;
unsigned char delete_me : 1;
};
@ -638,7 +639,7 @@ EAPI void e_border_signal_resize_begin(E_Border *bd, const char *dir, const char
EAPI void e_border_signal_resize_end(E_Border *bd, const char *dir, const char *sig, const char *src);
EAPI void e_border_resize_limit(E_Border *bd, int *w, int *h);
EAPI E_Border_Hook *e_border_hook_add(E_Border_Hook_Point hookpoint, void (*func) (void *data, E_Border *bd), void *data);
EAPI E_Border_Hook *e_border_hook_add(E_Border_Hook_Point hookpoint, void (*func) (void *data, void *bd), void *data);
EAPI void e_border_hook_del(E_Border_Hook *bh);
EAPI void e_border_focus_track_freeze(void);
EAPI void e_border_focus_track_thaw(void);