comparison src/event.c @ 158:c1cdd3fcd28f

Postponing rdman_coord_free() and rdman_remove_shape(). rdman will access free memory if coords or shapes are free when it is dirty. The requests are postponed until rdman is clean.
author Thinker K.F. Li <thinker@branda.to>
date Fri, 03 Oct 2008 10:22:08 +0800
parents 1695a4b02b14
children b90abd31a281
comparison
equal deleted inserted replaced
157:5cd12609a5c7 158:c1cdd3fcd28f
21 *buf = new_buf; 21 *buf = new_buf;
22 22
23 return OK; 23 return OK;
24 } 24 }
25 25
26 DARRAY_DEFINE(geos, geo_t *);
27
26 /*! \brief Add a geo_t object to general geo list. 28 /*! \brief Add a geo_t object to general geo list.
27 * 29 *
28 * General geo list can use to temporary keep a list of geo_t 30 * General geo list can use to temporary keep a list of geo_t
29 * objects for any purpose. It supposed to be reused by 31 * objects for any purpose. It supposed to be reused by
30 * different modules that need to select part of geo_t objects 32 * different modules that need to select part of geo_t objects
31 * from a redraw manager. 33 * from a redraw manager.
32 */ 34 */
33 static int add_gen_geo(redraw_man_t *rdman, geo_t *geo) { 35 static int add_gen_geo(redraw_man_t *rdman, geo_t *geo) {
34 int max_gen_geos;
35 int r; 36 int r;
36 37
37 if(rdman->n_gen_geos >= rdman->max_gen_geos) { 38 r = geos_add(&rdman->gen_geos, geo);
38 max_gen_geos = rdman->max_gen_geos + ARRAY_EXT_SZ; 39 return r == 0? OK: ERR;
39 r = extend_memblk((void **)&rdman->gen_geos,
40 sizeof(geo_t *) * rdman->n_gen_geos,
41 sizeof(geo_t *) * max_gen_geos);
42 if(r != OK)
43 return ERR;
44 rdman->max_gen_geos = max_gen_geos;
45 }
46
47 rdman->gen_geos[rdman->n_gen_geos++] = geo;
48 return OK;
49 } 40 }
50 41
51 static int collect_shapes_at_point(redraw_man_t *rdman, 42 static int collect_shapes_at_point(redraw_man_t *rdman,
52 co_aix x, co_aix y) { 43 co_aix x, co_aix y) {
53 geo_t *geo; 44 geo_t *geo;
55 46
56 r = rdman_force_clean(rdman); 47 r = rdman_force_clean(rdman);
57 if(r != OK) 48 if(r != OK)
58 return ERR; 49 return ERR;
59 50
60 rdman->n_gen_geos = 0; 51 rdman->gen_geos.num = 0;
61 52
62 for(geo = rdman_geos(rdman, NULL); 53 for(geo = rdman_geos(rdman, NULL);
63 geo != NULL; 54 geo != NULL;
64 geo = rdman_geos(rdman, geo)) { 55 geo = rdman_geos(rdman, geo)) {
65 if(geo_pos_is_in(geo, x, y)) { 56 if(geo_pos_is_in(geo, x, y)) {
92 geo_t **geos; 83 geo_t **geos;
93 shape_t *shape; 84 shape_t *shape;
94 cairo_t *cr; 85 cairo_t *cr;
95 int i; 86 int i;
96 87
97 geos = rdman->gen_geos; 88 geos = rdman->gen_geos.ds;
98 cr = rdman->cr; 89 cr = rdman->cr;
99 for(i = rdman->n_gen_geos - 1; i >= 0; i--) { 90 for(i = rdman->gen_geos.num - 1; i >= 0; i--) {
100 geo = geos[i]; 91 geo = geos[i];
101 if(geo->flags & GEF_HIDDEN) 92 if(geo->flags & GEF_HIDDEN)
102 continue; 93 continue;
103 shape = geo->shape; 94 shape = geo->shape;
104 draw_shape_path(shape, cr); 95 draw_shape_path(shape, cr);