minimise cpu hape use if shape hasnt changed

SVN revision: 15542
This commit is contained in:
Carsten Haitzler 2005-06-27 10:08:53 +00:00
parent fd579dec05
commit a6ec307a80
9 changed files with 184 additions and 44 deletions

View File

@ -647,7 +647,7 @@ e_border_move(E_Border *bd, int x, int y)
ev = calloc(1, sizeof(E_Event_Border_Move));
ev->border = bd;
e_object_ref(E_OBJECT(bd));
e_object_breadcrumb_add(E_OBJECT(bd), "border_move_event");
e_object_breadcrumb_add(E_OBJECT(bd), "border_move_event");
ecore_event_add(E_EVENT_BORDER_MOVE, ev, _e_border_event_border_move_free, NULL);
}
@ -1877,6 +1877,8 @@ _e_border_free(E_Border *bd)
_e_border_move_end(bd);
/* TODO: Other states to end before dying? */
IF_FREE(bd->shape_rects);
bd->shape_rects_num = 0;
if (bd->dangling_ref_check)
{
ecore_timer_del(bd->dangling_ref_check);
@ -4353,18 +4355,53 @@ _e_border_eval(E_Border *bd)
if (bd->need_shape_export)
{
Ecore_X_Rectangle *rects;
Ecore_X_Rectangle *rects, *orects;
int num;
rects = ecore_x_window_shape_rectangles_get(bd->win, &num);
if (rects)
{
if (bd->client.shaped)
e_container_shape_solid_rect_set(bd->shape, 0, 0, 0, 0);
int changed;
changed = 1;
if ((num == bd->shape_rects_num) && (bd->shape_rects))
{
int i;
orects = bd->shape_rects;
for (i = 0; i < num; i++)
{
if ((orects[i].x != rects[i].x) ||
(orects[i].y != rects[i].y) ||
(orects[i].width != rects[i].width) ||
(orects[i].height != rects[i].height))
{
changed = 1;
break;
}
}
changed = 0;
}
if (changed)
{
if (bd->client.shaped)
e_container_shape_solid_rect_set(bd->shape, 0, 0, 0, 0);
else
e_container_shape_solid_rect_set(bd->shape, bd->client_inset.l, bd->client_inset.t, bd->client.w, bd->client.h);
IF_FREE(bd->shape_rects);
bd->shape_rects = rects;
bd->shape_rects_num = num;
e_container_shape_rects_set(bd->shape, rects, num);
}
else
e_container_shape_solid_rect_set(bd->shape, bd->client_inset.l, bd->client_inset.t, bd->client.w, bd->client.h);
e_container_shape_rects_set(bd->shape, rects, num);
free(rects);
free(rects);
}
else
{
IF_FREE(bd->shape_rects);
bd->shape_rects = NULL;
bd->shape_rects_num = 0;
e_container_shape_rects_set(bd->shape, NULL, 0);
}
bd->need_shape_export = 0;
}

View File

@ -324,6 +324,8 @@ struct _E_Border
Ecore_Timer *raise_timer;
Ecore_Timer *ping_timer;
Ecore_Timer *kill_timer;
int shape_rects_num;
Ecore_X_Rectangle *shape_rects;
Ecore_Timer *dangling_ref_check;
};

View File

@ -465,30 +465,10 @@ e_container_shape_rects_set(E_Container_Shape *es, Ecore_X_Rectangle *rects, int
{
Evas_List *l;
int i;
int changed = 1;
E_Rect *r;
E_OBJECT_CHECK(es);
E_OBJECT_TYPE_CHECK(es, E_CONTAINER_SHAPE_TYPE);
if (num == evas_list_count(es->shape))
{
for (i = 0, l = es->shape; (i < num) && (l); i++, l = l->next)
{
r = l->data;
if ((r->x != rects[i].x) || (r->y != rects[i].y) ||
(r->w != rects[i].width) || (r->h != rects[i].height))
{
changed = 1;
break;
}
}
changed = 0;
}
if (!changed)
{
return;
}
if (es->shape)
{
for (l = es->shape; l; l = l->next)

View File

@ -23,11 +23,14 @@ static int _e_dnd_cb_event_dnd_selection(void *data, int type, void *event);
/* local subsystem globals */
typedef struct _XDnd {
int x, y;
char *type;
void *data;
} XDnd;
typedef struct _XDnd XDnd;
struct _XDnd
{
int x, y;
char *type;
void *data;
};
static Evas_List *_event_handlers = NULL;
static Evas_List *_drop_handlers = NULL;
@ -495,14 +498,49 @@ e_drag_idler_before(void)
drag = l->data;
if (drag->need_shape_export)
{
Ecore_X_Rectangle *rects;
Ecore_X_Rectangle *rects, *orects;
int num;
rects = ecore_x_window_shape_rectangles_get(drag->evas_win, &num);
if (rects)
{
e_container_shape_rects_set(drag->shape, rects, num);
free(rects);
int changed;
changed = 1;
if ((num == drag->shape_rects_num) && (drag->shape_rects))
{
int i;
orects = drag->shape_rects;
for (i = 0; i < num; i++)
{
if ((orects[i].x != rects[i].x) ||
(orects[i].y != rects[i].y) ||
(orects[i].width != rects[i].width) ||
(orects[i].height != rects[i].height))
{
changed = 1;
break;
}
}
changed = 0;
}
if (changed)
{
IF_FREE(drag->shape_rects);
drag->shape_rects = rects;
drag->shape_rects_num = num;
e_container_shape_rects_set(drag->shape, rects, num);
}
else
free(rects);
}
else
{
IF_FREE(drag->shape_rects);
drag->shape_rects = NULL;
drag->shape_rects_num = 0;
e_container_shape_rects_set(drag->shape, NULL, 0);
}
drag->need_shape_export = 0;
if (drag->visible)
@ -518,6 +556,8 @@ _e_drag_free(E_Drag *drag)
{
_drag_list = evas_list_remove(_drag_list, drag);
IF_FREE(drag->shape_rects);
drag->shape_rects_num = 0;
e_object_unref(E_OBJECT(drag->container));
e_container_shape_hide(drag->shape);
e_object_del(E_OBJECT(drag->shape));

View File

@ -36,6 +36,9 @@ struct _E_Drag
int x, y, w, h;
int dx, dy;
int shape_rects_num;
Ecore_X_Rectangle *shape_rects;
unsigned int layer;
unsigned char visible : 1;
unsigned char need_shape_export : 1;

View File

@ -770,14 +770,49 @@ e_menu_idler_before(void)
m = l->data;
if (m->need_shape_export)
{
Ecore_X_Rectangle *rects;
Ecore_X_Rectangle *rects, *orects;
int num;
rects = ecore_x_window_shape_rectangles_get(m->evas_win, &num);
if (rects)
{
e_container_shape_rects_set(m->shape, rects, num);
free(rects);
int changed;
changed = 1;
if ((num == m->shape_rects_num) && (m->shape_rects))
{
int i;
orects = m->shape_rects;
for (i = 0; i < num; i++)
{
if ((orects[i].x != rects[i].x) ||
(orects[i].y != rects[i].y) ||
(orects[i].width != rects[i].width) ||
(orects[i].height != rects[i].height))
{
changed = 1;
break;
}
}
changed = 0;
}
if (changed)
{
IF_FREE(m->shape_rects);
m->shape_rects = rects;
m->shape_rects_num = num;
e_container_shape_rects_set(m->shape, rects, num);
}
else
free(rects);
}
else
{
IF_FREE(m->shape_rects);
m->shape_rects = NULL;
m->shape_rects_num = 0;
e_container_shape_rects_set(m->shape, NULL, 0);
}
m->need_shape_export = 0;
if (m->cur.visible)
@ -814,6 +849,8 @@ _e_menu_free(E_Menu *m)
Evas_List *l, *tmp;
_e_menu_unrealize(m);
IF_FREE(m->shape_rects);
m->shape_rects_num = 0;
for (l = m->items; l;)
{
tmp = l;

View File

@ -55,7 +55,9 @@ struct _E_Menu
Evas_Object *container_object;
Evas_Coord container_x, container_y, container_w, container_h;
E_Container_Shape *shape;
int shape_rects_num;
Ecore_X_Rectangle *shape_rects;
struct {
void *data;
void (*func) (void *data, E_Menu *m);

View File

@ -173,19 +173,54 @@ e_popup_idler_before(void)
pop = l->data;
if (pop->need_shape_export)
{
Ecore_X_Rectangle *rects;
Ecore_X_Rectangle *rects, *orects;
int num;
rects = ecore_x_window_shape_rectangles_get(pop->evas_win, &num);
if (rects)
{
e_container_shape_rects_set(pop->shape, rects, num);
free(rects);
int changed;
changed = 1;
if ((num == pop->shape_rects_num) && (pop->shape_rects))
{
int i;
orects = pop->shape_rects;
for (i = 0; i < num; i++)
{
if ((orects[i].x != rects[i].x) ||
(orects[i].y != rects[i].y) ||
(orects[i].width != rects[i].width) ||
(orects[i].height != rects[i].height))
{
changed = 1;
break;
}
}
changed = 0;
}
if (changed)
{
IF_FREE(pop->shape_rects);
pop->shape_rects = rects;
pop->shape_rects_num = num;
e_container_shape_rects_set(pop->shape, rects, num);
}
else
free(rects);
}
else
{
IF_FREE(pop->shape_rects);
pop->shape_rects = NULL;
pop->shape_rects_num = 0;
e_container_shape_rects_set(pop->shape, NULL, 0);
}
pop->need_shape_export = 0;
if (pop->visible)
e_container_shape_show(pop->shape);
}
if (pop->visible)
e_container_shape_show(pop->shape);
}
}
@ -194,6 +229,8 @@ e_popup_idler_before(void)
static void
_e_popup_free(E_Popup *pop)
{
IF_FREE(pop->shape_rects);
pop->shape_rects_num = 0;
e_container_shape_hide(pop->shape);
e_object_del(E_OBJECT(pop->shape));
e_canvas_del(pop->ecore_evas);

View File

@ -26,6 +26,8 @@ struct _E_Popup
Ecore_X_Window evas_win;
E_Container_Shape *shape;
E_Zone *zone;
int shape_rects_num;
Ecore_X_Rectangle *shape_rects;
};
EAPI int e_popup_init(void);