diff --git a/legacy/evas/src/Evas.h b/legacy/evas/src/Evas.h index cd030328b7..f90de75e59 100644 --- a/legacy/evas/src/Evas.h +++ b/legacy/evas/src/Evas.h @@ -34,7 +34,8 @@ typedef struct _Evas_Object_Gradient_Box * Evas_Object_Gradient_Box; #define CALLBACK_MOUSE_OUT 1 #define CALLBACK_MOUSE_DOWN 2 #define CALLBACK_MOUSE_UP 3 -#define CALLBACK_FREE 4 +#define CALLBACK_MOUSE_MOVE 4 +#define CALLBACK_FREE 5 #define IMAGE_FORMAT_BGRA 0 #define IMAGE_FORMAT_ARGB 1 @@ -331,7 +332,8 @@ Evas_Object evas_get_object_at_pos(Evas e, double x, double y); /* data attachment ops */ void evas_put_data(Evas e, Evas_Object o, char *key, void *data); void *evas_get_data(Evas e, Evas_Object o, char *key); - +void *evas_remove_data(Evas e, Evas_Object o, char *key); + /* events */ void evas_event_button_down(Evas e, int x, int y, int b); void evas_event_button_up(Evas e, int x, int y, int b); diff --git a/legacy/evas/src/evas_callbacks.c b/legacy/evas/src/evas_callbacks.c index 14823cb4e5..3cfbf7b9e2 100644 --- a/legacy/evas/src/evas_callbacks.c +++ b/legacy/evas/src/evas_callbacks.c @@ -9,7 +9,10 @@ _evas_callback_call(Evas e, Evas_Object o, Evas_Callback_Type callback, int b, int x, int y) { Evas_List l; + static in_cb = 0; + if (in_cb) return; + in_cb = 1; if (o->callbacks) { for (l = o->callbacks; l; l = l->next) @@ -20,8 +23,8 @@ _evas_callback_call(Evas e, Evas_Object o, Evas_Callback_Type callback, if (cb->type == callback) cb->callback(cb->data, e, o, b, x, y); } - evas_list_free(o->callbacks); } + in_cb = 0; } /* callbacks */ diff --git a/legacy/evas/src/evas_events.c b/legacy/evas/src/evas_events.c index f2c2a24de7..7a84c0c6fa 100644 --- a/legacy/evas/src/evas_events.c +++ b/legacy/evas/src/evas_events.c @@ -34,7 +34,8 @@ _evas_highest_object_at_point(Evas e, int x, int y) ob = ll->data; if (ob->current.visible) { - if (_evas_point_in_object(e, ll->data, x, y)) o = ll->data; + if (_evas_point_in_object(e, ob, x, y)) + o = ob; } } } @@ -73,12 +74,18 @@ evas_event_button_down(Evas e, int x, int y, int b) { Evas_Object o; - if ((b > 1) || (b < 32)) return; - if (!e->mouse.buttons) e->mouse.button_object = o; + if ((b < 1) || (b > 32)) return; + if (!e->mouse.buttons) + { + o = _evas_highest_object_at_point(e, e->mouse.x, e->mouse.y); + e->mouse.button_object = o; + } e->mouse.buttons |= (1 << (b - 1)); e->mouse.x = x; e->mouse.y = y; - _evas_callback_call(e, e->mouse.object, CALLBACK_MOUSE_DOWN, b, x, y); + if (e->mouse.button_object) + _evas_callback_call(e, e->mouse.button_object, CALLBACK_MOUSE_DOWN, + b, x, y); } void @@ -86,28 +93,57 @@ evas_event_button_up(Evas e, int x, int y, int b) { Evas_Object o; - if ((b > 1) || (b < 32)) return; + if ((b < 1) || (b > 32)) return; e->mouse.buttons &= ~(1 << (b - 1)); - if (!e->mouse.buttons) e->mouse.button_object = NULL; e->mouse.x = x; e->mouse.y = y; - _evas_callback_call(e, e->mouse.object, CALLBACK_MOUSE_UP, b, x, y); + if (e->mouse.button_object) + _evas_callback_call(e, e->mouse.button_object, CALLBACK_MOUSE_UP, + b, x, y); + if (!e->mouse.buttons) e->mouse.button_object = NULL; } void evas_event_move(Evas e, int x, int y) { Evas_Object o; - + + if (!e->mouse.button_object) + { + o = _evas_highest_object_at_point(e, e->mouse.x, e->mouse.y); + if (o != e->mouse.object) + { + if (e->mouse.object) + { + _evas_callback_call(e, e->mouse.object, CALLBACK_MOUSE_MOVE, + e->mouse.buttons, e->mouse.x, e->mouse.y); + _evas_callback_call(e, e->mouse.object, CALLBACK_MOUSE_OUT, + e->mouse.buttons, e->mouse.x, e->mouse.y); + } + e->mouse.x = x; + e->mouse.y = y; + e->mouse.object = o; + if (e->mouse.object) + { + _evas_callback_call(e, e->mouse.object, CALLBACK_MOUSE_IN, + e->mouse.buttons, e->mouse.x, e->mouse.y); + _evas_callback_call(e, e->mouse.object, CALLBACK_MOUSE_MOVE, + e->mouse.buttons, e->mouse.x, e->mouse.y); + } + return; + } + e->mouse.x = x; + e->mouse.y = y; + if (e->mouse.object) + _evas_callback_call(e, e->mouse.object, CALLBACK_MOUSE_MOVE, + e->mouse.buttons, e->mouse.x, e->mouse.y); + return; + } e->mouse.x = x; e->mouse.y = y; - o = _evas_highest_object_at_point(e, e->mouse.x, e->mouse.y); - if (o != e->mouse.object) - { - _evas_callback_call(e, e->mouse.object, CALLBACK_MOUSE_OUT, e->mouse.buttons, x, y); - e->mouse.object = o; - _evas_callback_call(e, e->mouse.object, CALLBACK_MOUSE_IN, e->mouse.buttons, x, y); - } + if (e->mouse.button_object) + _evas_callback_call(e, e->mouse.button_object, CALLBACK_MOUSE_MOVE, + e->mouse.buttons, e->mouse.x, e->mouse.y); } void diff --git a/legacy/evas/src/evas_misc.c b/legacy/evas/src/evas_misc.c index dc203c35ec..664ae25e64 100644 --- a/legacy/evas/src/evas_misc.c +++ b/legacy/evas/src/evas_misc.c @@ -312,12 +312,24 @@ void evas_put_data(Evas e, Evas_Object o, char *key, void *data) { Evas_Data d; + Evas_List l; if (!key) return; + for (l = o->data; l; l = l->next) + { + Evas_Data d; + + d = l->data; + if (!strcmp(d->key, key)) + { + d->data = data; + return; + } + } d = malloc(sizeof(struct _Evas_Data)); d->key = strdup(key); d->data = data; - o->data = evas_list_append(o->data, d); + o->data = evas_list_prepend(o->data, d); } void * @@ -325,6 +337,7 @@ evas_get_data(Evas e, Evas_Object o, char *key) { Evas_List l; + if (!key) return NULL; for (l = o->data; l; l = l->next) { Evas_Data d; @@ -335,6 +348,31 @@ evas_get_data(Evas e, Evas_Object o, char *key) return NULL; } +void * +evas_remove_data(Evas e, Evas_Object o, char *key) +{ + Evas_List l; + + if (!key) return NULL; + for (l = o->data; l; l = l->next) + { + Evas_Data d; + + d = l->data; + if (!strcmp(d->key, key)) + { + void *data; + + o->data = evas_list_remove(o->data, l->data); + data = d->data; + free(d->key); + free(d); + return data; + } + } + return NULL; +} + int evas_world_x_to_screen(Evas e, double x) { diff --git a/legacy/evas/src/evas_object.c b/legacy/evas/src/evas_object.c index 3c11eb42de..a3abb54c7c 100644 --- a/legacy/evas/src/evas_object.c +++ b/legacy/evas/src/evas_object.c @@ -113,17 +113,17 @@ evas_set_layer(Evas e, Evas_Object o, int layer_num) { Evas_Layer layer; Evas_List l; + int removed; if (layer_num == o->current.layer) return; - - o->changed = 1; - e->changed = 1; + removed = 0; for (l = e->layers; l; l = l->next) { layer = l->data; if (layer->layer == o->current.layer) { layer->objects = evas_list_remove(layer->objects, o); + removed = 1; if (!layer->objects) { e->layers = evas_list_remove(e->layers, layer); @@ -132,6 +132,9 @@ evas_set_layer(Evas e, Evas_Object o, int layer_num) break; } } + if (!removed) return; + o->changed = 1; + e->changed = 1; o->current.layer = layer_num; for (l = e->layers; l; l = l->next) { @@ -139,7 +142,7 @@ evas_set_layer(Evas e, Evas_Object o, int layer_num) if (layer->layer == o->current.layer) { layer->objects = evas_list_append(layer->objects, o); - break; + return; } if (layer->layer > o->current.layer) { @@ -150,6 +153,9 @@ evas_set_layer(Evas e, Evas_Object o, int layer_num) e->layers = evas_list_prepend_relative(e->layers, layer_new, layer); layer_new->objects = evas_list_append(layer_new->objects, o); layer_new->layer = o->current.layer; + if ((o->current.visible) && + (_evas_point_in_object(e, o, e->mouse.x, e->mouse.y))) + evas_event_move(e, e->mouse.x, e->mouse.y); return; } } @@ -159,6 +165,9 @@ evas_set_layer(Evas e, Evas_Object o, int layer_num) e->layers = evas_list_append(e->layers, layer); layer->objects = evas_list_append(layer->objects, o); layer->layer = o->current.layer; + if ((o->current.visible) && + (_evas_point_in_object(e, o, e->mouse.x, e->mouse.y))) + evas_event_move(e, e->mouse.x, e->mouse.y); } void @@ -182,6 +191,9 @@ evas_raise(Evas e, Evas_Object o) layer->objects = evas_list_append(layer->objects, o); o->changed = 1; e->changed = 1; + if ((o->current.visible) && + (_evas_point_in_object(e, o, e->mouse.x, e->mouse.y))) + evas_event_move(e, e->mouse.x, e->mouse.y); } } @@ -198,6 +210,9 @@ evas_lower(Evas e, Evas_Object o) layer->objects = evas_list_prepend(layer->objects, o); o->changed = 1; e->changed = 1; + if ((o->current.visible) && + (_evas_point_in_object(e, o, e->mouse.x, e->mouse.y))) + evas_event_move(e, e->mouse.x, e->mouse.y); } } @@ -214,6 +229,9 @@ evas_stack_above(Evas e, Evas_Object o, Evas_Object above) layer->objects = evas_list_append_relative(layer->objects, o, above); o->changed = 1; e->changed = 1; + if ((o->current.visible) && + (_evas_point_in_object(e, o, e->mouse.x, e->mouse.y))) + evas_event_move(e, e->mouse.x, e->mouse.y); } } @@ -230,6 +248,9 @@ evas_stack_below(Evas e, Evas_Object o, Evas_Object above) layer->objects = evas_list_prepend_relative(layer->objects, o, above); o->changed = 1; e->changed = 1; + if ((o->current.visible) && + (_evas_point_in_object(e, o, e->mouse.x, e->mouse.y))) + evas_event_move(e, e->mouse.x, e->mouse.y); } } @@ -237,21 +258,33 @@ evas_stack_below(Evas e, Evas_Object o, Evas_Object above) void evas_move(Evas e, Evas_Object o, double x, double y) { + int event_update = 0; + if ((o->type == OBJECT_LINE)) return; + if (_evas_point_in_object(e, o, e->mouse.x, e->mouse.y)) + event_update = 1; o->current.x = x; o->current.y = y; o->changed = 1; e->changed = 1; + if ((_evas_point_in_object(e, o, e->mouse.x, e->mouse.y)) || event_update) + evas_event_move(e, e->mouse.x, e->mouse.y); } void evas_resize(Evas e, Evas_Object o, double w, double h) { + int event_update = 0; + if ((o->type == OBJECT_TEXT) || (o->type == OBJECT_LINE)) return; + if (_evas_point_in_object(e, o, e->mouse.x, e->mouse.y)) + event_update = 1; o->current.w = w; o->current.h = h; o->changed = 1; e->changed = 1; + if ((_evas_point_in_object(e, o, e->mouse.x, e->mouse.y)) || event_update) + evas_event_move(e, e->mouse.x, e->mouse.y); } void @@ -271,6 +304,8 @@ evas_show(Evas e, Evas_Object o) o->current.visible = 1; o->changed = 1; e->changed = 1; + if (_evas_point_in_object(e, o, e->mouse.x, e->mouse.y)) + evas_event_move(e, e->mouse.x, e->mouse.y); } void @@ -279,4 +314,6 @@ evas_hide(Evas e, Evas_Object o) o->current.visible = 0; o->changed = 1; e->changed = 1; + if (_evas_point_in_object(e, o, e->mouse.x, e->mouse.y)) + evas_event_move(e, e->mouse.x, e->mouse.y); } diff --git a/legacy/evas/src/evas_render.c b/legacy/evas/src/evas_render.c index 5d352cad06..2c97f09442 100644 --- a/legacy/evas/src/evas_render.c +++ b/legacy/evas/src/evas_render.c @@ -6,7 +6,7 @@ #include #include -static void +void _evas_object_get_current_translated_coords(Evas e, Evas_Object o, int *x, int *y, int *w, int *h) { @@ -26,7 +26,7 @@ _evas_object_get_current_translated_coords(Evas e, Evas_Object o, e->current.viewport.h); } -static void +void _evas_object_get_previous_translated_coords(Evas e, Evas_Object o, int *x, int *y, int *w, int *h) { @@ -522,18 +522,19 @@ evas_render(Evas e) Evas_Object_Rectangle oo; oo = o; - func_rectangle_draw(e->current.display, - e->current.drawable, - e->current.drawable_width, - e->current.drawable_height, - o->current.x, - o->current.y, - o->current.w, - o->current.h, - oo->current.r, - oo->current.g, - oo->current.b, - oo->current.a); + if (oo->current.a != 0) + func_rectangle_draw(e->current.display, + e->current.drawable, + e->current.drawable_width, + e->current.drawable_height, + o->current.x, + o->current.y, + o->current.w, + o->current.h, + oo->current.r, + oo->current.g, + oo->current.b, + oo->current.a); } break; case OBJECT_LINE: diff --git a/legacy/evas/test/evas_test.c b/legacy/evas/test/evas_test.c index eb82f2145e..5b23162a98 100644 --- a/legacy/evas/test/evas_test.c +++ b/legacy/evas/test/evas_test.c @@ -16,6 +16,55 @@ get_time(void) return (double)timev.tv_sec + (((double)timev.tv_usec) / 1000000); } + +/* callbacks for logo object */ + +void +mouse_down (void *_data, Evas _e, Evas_Object _o, int _b, int _x, int _y) +{ + evas_put_data(_e, _o, "clicked", (void *)1); + evas_put_data(_e, _o, "x", (void *)_x); + evas_put_data(_e, _o, "y", (void *)_y); + evas_set_layer(_e, _o, 200); +} + +void +mouse_up (void *_data, Evas _e, Evas_Object _o, int _b, int _x, int _y) +{ + evas_remove_data(_e, _o, "clicked"); + evas_set_layer(_e, _o, 50); +} + +void +mouse_move (void *_data, Evas _e, Evas_Object _o, int _b, int _x, int _y) +{ + if (evas_get_data(_e, _o, "clicked")) + { + double ox, oy; + int x, y; + + evas_get_geometry(_e, _o, &ox, &oy, NULL, NULL); + x = evas_get_data(_e, _o, "x"); + y = evas_get_data(_e, _o, "y"); + evas_put_data(_e, _o, "x", (void *)_x); + evas_put_data(_e, _o, "y", (void *)_y); + evas_move(_e, _o, ox + _x - x, oy + _y - y); + } +} + +void +mouse_in (void *_data, Evas _e, Evas_Object _o, int _b, int _x, int _y) +{ +} + +void +mouse_out (void *_data, Evas _e, Evas_Object _o, int _b, int _x, int _y) +{ +} + +/* done with callbacks */ + + int main(int argc, char **argv) { @@ -88,6 +137,11 @@ main(int argc, char **argv) evas_show(e, o[0]); o[1] = evas_add_image_from_file(e, "img/logo001.png"); evas_get_image_size(e, o[1], &w, &h); + evas_callback_add(e, o[1], CALLBACK_MOUSE_DOWN, mouse_down, NULL); + evas_callback_add(e, o[1], CALLBACK_MOUSE_UP, mouse_up, NULL); + evas_callback_add(e, o[1], CALLBACK_MOUSE_MOVE, mouse_move, NULL); + evas_callback_add(e, o[1], CALLBACK_MOUSE_IN, mouse_in, NULL); + evas_callback_add(e, o[1], CALLBACK_MOUSE_OUT, mouse_out, NULL); w /= 2; h /= 2; evas_show(e, o[1]); @@ -111,12 +165,22 @@ main(int argc, char **argv) evas_resize(e, o_rect, 200, 100); evas_set_color(e, o_rect, rand()&0xff, rand()&0xff, rand()&0xff, 120); evas_set_layer(e, o_rect, 150); + evas_callback_add(e, o_rect, CALLBACK_MOUSE_DOWN, mouse_down, NULL); + evas_callback_add(e, o_rect, CALLBACK_MOUSE_UP, mouse_up, NULL); + evas_callback_add(e, o_rect, CALLBACK_MOUSE_MOVE, mouse_move, NULL); + evas_callback_add(e, o_rect, CALLBACK_MOUSE_IN, mouse_in, NULL); + evas_callback_add(e, o_rect, CALLBACK_MOUSE_OUT, mouse_out, NULL); o_line = evas_add_line(e); evas_show(e, o_line); evas_set_line_xy(e, o_line, 10, 20, 100, 50); evas_set_color(e, o_line, rand()&0xff, rand()&0xff, rand()&0xff, 120); evas_set_layer(e, o_rect, 150); + evas_callback_add(e, o_line, CALLBACK_MOUSE_DOWN, mouse_down, NULL); + evas_callback_add(e, o_line, CALLBACK_MOUSE_UP, mouse_up, NULL); + evas_callback_add(e, o_line, CALLBACK_MOUSE_MOVE, mouse_move, NULL); + evas_callback_add(e, o_line, CALLBACK_MOUSE_IN, mouse_in, NULL); + evas_callback_add(e, o_line, CALLBACK_MOUSE_OUT, mouse_out, NULL); o_grad = evas_add_gradient_box(e); evas_show(e, o_grad); @@ -129,6 +193,11 @@ main(int argc, char **argv) evas_gradient_add_color(grad, 255, 0 , 0, 150, 8); evas_gradient_add_color(grad, 0 , 0 , 0, 0, 8); evas_set_gradient(e, o_grad, grad); + evas_callback_add(e, o_grad, CALLBACK_MOUSE_DOWN, mouse_down, NULL); + evas_callback_add(e, o_grad, CALLBACK_MOUSE_UP, mouse_up, NULL); + evas_callback_add(e, o_grad, CALLBACK_MOUSE_MOVE, mouse_move, NULL); + evas_callback_add(e, o_grad, CALLBACK_MOUSE_IN, mouse_in, NULL); + evas_callback_add(e, o_grad, CALLBACK_MOUSE_OUT, mouse_out, NULL); o_fps = evas_add_text(e, "morpheus", 16, "FPS..."); evas_set_color(e, o_fps, 255, 255, 255, 120); @@ -162,8 +231,7 @@ main(int argc, char **argv) button = ev.xbutton.button; mouse_x = ev.xbutton.x; mouse_y = ev.xbutton.y; - evas_move(e, o[1], mouse_x - w, mouse_y - h); - evas_set_layer(e, o[1], 200); + evas_event_button_down(e, mouse_x, mouse_y, button); } break; case ButtonRelease: @@ -174,8 +242,7 @@ main(int argc, char **argv) button = ev.xbutton.button; mouse_x = ev.xbutton.x; mouse_y = ev.xbutton.y; - evas_move(e, o[1], mouse_x - w, mouse_y - h); - evas_set_layer(e, o[1], 1); + evas_event_button_up(e, mouse_x, mouse_y, button); } break; case MotionNotify: @@ -184,8 +251,7 @@ main(int argc, char **argv) mouse_x = ev.xmotion.x; mouse_y = ev.xmotion.y; - if (down) - evas_move(e, o[1], mouse_x - w, mouse_y - h); + evas_event_move(e, mouse_x, mouse_y); } break; case Expose: