Mercurial > MadButterfly
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); |