On 12/27/11 16:45, Cedric BAIL wrote: > On Tue, Dec 27, 2011 at 8:25 PM, Enlightenment SVN > <no-re...@enlightenment.org> wrote: >> Log: >> Ecore_Evas (Wayland_Shm): >> >> Add an actual 'frame' to ecore_evas_wayland. (just a boring rectangle >> frame w/ the title). > > Couldn't you reuse in some way what Gustavo did in the EWL backend ? > Are you referring to the old ewl toolkit here ?
dh >> Add support for size_min/max/base/step setting. >> Add support for title& name_class setting. >> Add support for setting a cursor. >> Add support for hiding an ecore_evas. >> >> >> >> Author: devilhorns >> Date: 2011-12-27 11:25:38 -0800 (Tue, 27 Dec 2011) >> New Revision: 66578 >> Trac: http://trac.enlightenment.org/e/changeset/66578 >> >> Modified: >> trunk/ecore/src/lib/ecore_evas/ecore_evas_wayland_shm.c >> >> Modified: trunk/ecore/src/lib/ecore_evas/ecore_evas_wayland_shm.c >> =================================================================== >> --- trunk/ecore/src/lib/ecore_evas/ecore_evas_wayland_shm.c 2011-12-27 >> 19:12:56 UTC (rev 66577) >> +++ trunk/ecore/src/lib/ecore_evas/ecore_evas_wayland_shm.c 2011-12-27 >> 19:25:38 UTC (rev 66578) >> @@ -31,6 +31,15 @@ >> # include<Evas_Engine_Wayland_Shm.h> >> # include<Ecore_Wayland.h> >> >> +/* local structures */ >> +typedef struct _EE_Wl_Smart_Data EE_Wl_Smart_Data; >> +struct _EE_Wl_Smart_Data >> +{ >> + Evas_Object *frame; >> + Evas_Object *text; >> + Evas_Coord x, y, w, h; >> +}; >> + >> /* local function prototypes */ >> static int _ecore_evas_wl_init(void); >> static int _ecore_evas_wl_shutdown(void); >> @@ -43,6 +52,15 @@ >> static void _ecore_evas_wl_callback_focus_out_set(Ecore_Evas *ee, void >> (*func)(Ecore_Evas *ee)); >> static void _ecore_evas_wl_resize(Ecore_Evas *ee, int w, int h); >> static void _ecore_evas_wl_show(Ecore_Evas *ee); >> +static void _ecore_evas_wl_hide(Ecore_Evas *ee); >> +static void _ecore_evas_wl_title_set(Ecore_Evas *ee, const char *t); >> +static void _ecore_evas_wl_name_class_set(Ecore_Evas *ee, const char *n, >> const char *c); >> +static void _ecore_evas_wl_size_min_set(Ecore_Evas *ee, int w, int h); >> +static void _ecore_evas_wl_size_max_set(Ecore_Evas *ee, int w, int h); >> +static void _ecore_evas_wl_size_base_set(Ecore_Evas *ee, int w, int h); >> +static void _ecore_evas_wl_size_step_set(Ecore_Evas *ee, int w, int h); >> +static void _ecore_evas_wl_object_cursor_set(Ecore_Evas *ee, Evas_Object >> *obj, int layer, int hot_x, int hot_y); >> +static void _ecore_evas_wl_object_cursor_del(void *data, Evas *evas >> __UNUSED__, Evas_Object *obj __UNUSED__, void *event __UNUSED__); >> static int _ecore_evas_wl_render(Ecore_Evas *ee); >> static void _ecore_evas_wl_screen_geometry_get(const Ecore_Evas *ee >> __UNUSED__, int *x, int *y, int *w, int *h); >> static void _ecore_evas_wl_buffer_new(Ecore_Evas *ee, void **dest); >> @@ -56,6 +74,18 @@ >> static Eina_Bool _ecore_evas_wl_event_focus_in(void *data __UNUSED__, int >> type __UNUSED__, void *event); >> static Eina_Bool _ecore_evas_wl_event_focus_out(void *data __UNUSED__, int >> type __UNUSED__, void *event); >> >> +/* SMART stuff for frame */ >> +static Evas_Smart *_ecore_evas_wl_smart = NULL; >> + >> +static void _ecore_evas_wl_smart_init(void); >> +static void _ecore_evas_wl_smart_add(Evas_Object *obj); >> +static void _ecore_evas_wl_smart_del(Evas_Object *obj); >> +static void _ecore_evas_wl_smart_resize(Evas_Object *obj, Evas_Coord w, >> Evas_Coord h); >> +static void _ecore_evas_wl_smart_show(Evas_Object *obj); >> +static void _ecore_evas_wl_smart_hide(Evas_Object *obj); >> + >> +static Evas_Object *_ecore_evas_wl_frame_add(Evas *evas); >> + >> /* local variables */ >> static int _ecore_evas_wl_init_count = 0; >> static Ecore_Event_Handler *_ecore_evas_wl_event_handlers[8]; >> @@ -84,17 +114,17 @@ >> NULL, // func rotation set >> NULL, // func shaped set >> _ecore_evas_wl_show, >> - NULL, // func hide >> + _ecore_evas_wl_hide, >> NULL, // func raise >> NULL, // func lower >> NULL, // func activate >> - NULL, // func title set >> - NULL, // func name_class set >> - NULL, // func size min set >> - NULL, // func size max set >> - NULL, // func size base set >> - NULL, // func size step set >> - NULL, // func object cursor set >> + _ecore_evas_wl_title_set, >> + _ecore_evas_wl_name_class_set, >> + _ecore_evas_wl_size_min_set, >> + _ecore_evas_wl_size_max_set, >> + _ecore_evas_wl_size_base_set, >> + _ecore_evas_wl_size_step_set, >> + _ecore_evas_wl_object_cursor_set, >> NULL, // func layer set >> NULL, // func focus set >> NULL, // func iconified set >> @@ -200,6 +230,13 @@ >> * engine destination */ >> ecore_evas_callback_pre_free_set(ee, _ecore_evas_wl_pre_free); >> >> + if (ee->prop.draw_frame) >> + { >> + ee->engine.wl.frame = _ecore_evas_wl_frame_add(ee->evas); >> + evas_object_is_frame_object_set(ee->engine.wl.frame, EINA_TRUE); >> + evas_object_move(ee->engine.wl.frame, 0, 0); >> + } >> + >> ecore_evas_input_event_register(ee); >> _ecore_evas_register(ee); >> >> @@ -281,6 +318,9 @@ >> >> LOGFN(__FILE__, __LINE__, __FUNCTION__); >> >> + /* destroy frame */ >> + if (ee->engine.wl.frame) evas_object_del(ee->engine.wl.frame); >> + >> /* get engine info */ >> einfo = (Evas_Engine_Info_Wayland_Shm *)evas_engine_info_get(ee->evas); >> if ((einfo)&& (einfo->info.dest)) >> @@ -398,6 +438,8 @@ >> /* change evas output& viewport sizes */ >> evas_output_size_set(ee->evas, ee->w, ee->h); >> evas_output_viewport_set(ee->evas, 0, 0, ee->w, ee->h); >> + if (ee->engine.wl.frame) >> + evas_object_resize(ee->engine.wl.frame, ee->w, ee->h); >> >> /* set new engine destination */ >> evas_engine_info_set(ee->evas, (Evas_Engine_Info *)einfo); >> @@ -448,6 +490,12 @@ >> /* create buffer @ new size (also mmaps the new destination) */ >> _ecore_evas_wl_buffer_new(ee,&einfo->info.dest); >> >> + if (ee->engine.wl.frame) >> + { >> + evas_object_show(ee->engine.wl.frame); >> + evas_object_resize(ee->engine.wl.frame, ee->w, ee->h); >> + } >> + >> /* set new engine destination */ >> evas_engine_info_set(ee->evas, (Evas_Engine_Info *)einfo); >> >> @@ -465,6 +513,179 @@ >> if (ee->func.fn_show) ee->func.fn_show(ee); >> } >> >> +static void >> +_ecore_evas_wl_hide(Ecore_Evas *ee) >> +{ >> + Evas_Engine_Info_Wayland_Shm *einfo; >> + >> + LOGFN(__FILE__, __LINE__, __FUNCTION__); >> + >> + if (!ee) return; >> + if (!ee->visible) return; >> + >> + /* get engine info */ >> + einfo = (Evas_Engine_Info_Wayland_Shm *)evas_engine_info_get(ee->evas); >> + if (einfo->info.dest) >> + { >> + int ret = 0; >> + >> + /* munmap previous engine destination */ >> + ret = munmap(einfo->info.dest, ((ee->w * sizeof(int)) * ee->h)); >> + einfo->info.dest = NULL; >> + } >> + >> + /* free old buffer */ >> + if (ee->engine.wl.buffer) wl_buffer_destroy(ee->engine.wl.buffer); >> + ee->engine.wl.buffer = NULL; >> + >> + /* set new engine destination */ >> + evas_engine_info_set(ee->evas, (Evas_Engine_Info *)einfo); >> + >> + /* destroy shell surface */ >> + if (ee->engine.wl.shell_surface) >> + wl_shell_surface_destroy(ee->engine.wl.shell_surface); >> + ee->engine.wl.shell_surface = NULL; >> + >> + /* destroy surface */ >> + if (ee->engine.wl.surface) wl_surface_destroy(ee->engine.wl.surface); >> + ee->engine.wl.surface = NULL; >> + >> + ee->visible = 0; >> + ee->should_be_visible = 0; >> + if (ee->func.fn_hide) ee->func.fn_hide(ee); >> +} >> + >> +static void >> +_ecore_evas_wl_title_set(Ecore_Evas *ee, const char *t) >> +{ >> + LOGFN(__FILE__, __LINE__, __FUNCTION__); >> + >> + if (!ee) return; >> + if (ee->prop.title) free(ee->prop.title); >> + ee->prop.title = NULL; >> + if (t) ee->prop.title = strdup(t); >> + >> + if ((ee->prop.draw_frame)&& (ee->engine.wl.frame)) >> + { >> + EE_Wl_Smart_Data *sd; >> + >> + if (!(sd = evas_object_smart_data_get(ee->engine.wl.frame))) return; >> + evas_object_text_text_set(sd->text, ee->prop.title); >> + } >> +} >> + >> +static void >> +_ecore_evas_wl_name_class_set(Ecore_Evas *ee, const char *n, const char *c) >> +{ >> + LOGFN(__FILE__, __LINE__, __FUNCTION__); >> + >> + if (!ee) return; >> + if (ee->prop.name) free(ee->prop.name); >> + if (ee->prop.clas) free(ee->prop.clas); >> + ee->prop.name = NULL; >> + ee->prop.clas = NULL; >> + if (n) ee->prop.name = strdup(n); >> + if (c) ee->prop.clas = strdup(c); >> + /* FIXME: Forward these changes to Wayland somehow */ >> +} >> + >> +static void >> +_ecore_evas_wl_size_min_set(Ecore_Evas *ee, int w, int h) >> +{ >> + LOGFN(__FILE__, __LINE__, __FUNCTION__); >> + >> + if (!ee) return; >> + if (w< 0) w = 0; >> + if (h< 0) h = 0; >> + if ((ee->prop.min.w == w)&& (ee->prop.min.h == h)) return; >> + ee->prop.min.w = w; >> + ee->prop.min.h = h; >> +} >> + >> +static void >> +_ecore_evas_wl_size_max_set(Ecore_Evas *ee, int w, int h) >> +{ >> + LOGFN(__FILE__, __LINE__, __FUNCTION__); >> + >> + if (!ee) return; >> + if (w< 0) w = 0; >> + if (h< 0) h = 0; >> + if ((ee->prop.max.w == w)&& (ee->prop.max.h == h)) return; >> + ee->prop.max.w = w; >> + ee->prop.max.h = h; >> +} >> + >> +static void >> +_ecore_evas_wl_size_base_set(Ecore_Evas *ee, int w, int h) >> +{ >> + LOGFN(__FILE__, __LINE__, __FUNCTION__); >> + >> + if (!ee) return; >> + if (w< 0) w = 0; >> + if (h< 0) h = 0; >> + if ((ee->prop.base.w == w)&& (ee->prop.base.h == h)) return; >> + ee->prop.base.w = w; >> + ee->prop.base.h = h; >> +} >> + >> +static void >> +_ecore_evas_wl_size_step_set(Ecore_Evas *ee, int w, int h) >> +{ >> + LOGFN(__FILE__, __LINE__, __FUNCTION__); >> + >> + if (!ee) return; >> + if (w< 0) w = 0; >> + if (h< 0) h = 0; >> + if ((ee->prop.step.w == w)&& (ee->prop.step.h == h)) return; >> + ee->prop.step.w = w; >> + ee->prop.step.h = h; >> +} >> + >> +static void >> +_ecore_evas_wl_object_cursor_set(Ecore_Evas *ee, Evas_Object *obj, int >> layer, int hot_x, int hot_y) >> +{ >> + int x = 0, y = 0; >> + >> + LOGFN(__FILE__, __LINE__, __FUNCTION__); >> + >> + if (!ee) return; >> + if (ee->prop.cursor.object) evas_object_del(ee->prop.cursor.object); >> + ee->prop.cursor.object = NULL; >> + >> + if (!obj) >> + { >> + ee->prop.cursor.layer = 0; >> + ee->prop.cursor.hot.x = 0; >> + ee->prop.cursor.hot.y = 0; >> + return; >> + } >> + >> + ee->prop.cursor.object = obj; >> + ee->prop.cursor.layer = layer; >> + ee->prop.cursor.hot.x = hot_x; >> + ee->prop.cursor.hot.y = hot_y; >> + >> + evas_pointer_output_xy_get(ee->evas,&x,&y); >> + evas_object_layer_set(ee->prop.cursor.object, ee->prop.cursor.layer); >> + evas_object_move(ee->prop.cursor.object, >> + x - ee->prop.cursor.hot.x, y - ee->prop.cursor.hot.y); >> + evas_object_pass_events_set(ee->prop.cursor.object, 1); >> + if (evas_pointer_inside_get(ee->evas)) >> + evas_object_show(ee->prop.cursor.object); >> + >> + evas_object_event_callback_add(obj, EVAS_CALLBACK_DEL, >> + _ecore_evas_wl_object_cursor_del, ee); >> +} >> + >> +static void >> +_ecore_evas_wl_object_cursor_del(void *data, Evas *evas __UNUSED__, >> Evas_Object *obj __UNUSED__, void *event __UNUSED__) >> +{ >> + Ecore_Evas *ee; >> + >> + if (!(ee = data)) return; >> + ee->prop.cursor.object = NULL; >> +} >> + >> static int >> _ecore_evas_wl_render(Ecore_Evas *ee) >> { >> @@ -537,8 +758,6 @@ >> ee = ecore_event_window_match(ev->window); >> if ((!ee) || (ee->ignore_events)) return ECORE_CALLBACK_PASS_ON; >> if (ev->window != ee->prop.window) return ECORE_CALLBACK_PASS_ON; >> - /* printf("Mouse Down: %d %d\t%d %d\n", */ >> - /* ev->x, ev->y, ev->root.x, ev->root.y); */ >> evas_event_feed_mouse_down(ee->evas, ev->buttons, ev->modifiers, >> ev->timestamp, NULL); >> return ECORE_CALLBACK_PASS_ON; >> @@ -718,6 +937,117 @@ >> close(fd); >> } >> >> +static void >> +_ecore_evas_wl_smart_init(void) >> +{ >> + if (_ecore_evas_wl_smart) return; >> + { >> + static const Evas_Smart_Class sc = >> + { >> + "ecore_evas_wl_frame", EVAS_SMART_CLASS_VERSION, >> + _ecore_evas_wl_smart_add, >> + _ecore_evas_wl_smart_del, >> + NULL, >> + _ecore_evas_wl_smart_resize, >> + _ecore_evas_wl_smart_show, >> + _ecore_evas_wl_smart_hide, >> + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL >> + }; >> + _ecore_evas_wl_smart = evas_smart_class_new(&sc); >> + } >> +} >> + >> +static void >> +_ecore_evas_wl_smart_add(Evas_Object *obj) >> +{ >> + EE_Wl_Smart_Data *sd; >> + Evas *evas; >> + >> + LOGFN(__FILE__, __LINE__, __FUNCTION__); >> + >> + if (!(sd = calloc(1, sizeof(EE_Wl_Smart_Data)))) return; >> + >> + evas = evas_object_evas_get(obj); >> + >> + sd->x = 0; >> + sd->y = 0; >> + sd->w = 1; >> + sd->h = 1; >> + >> + sd->frame = evas_object_rectangle_add(evas); >> + evas_object_is_frame_object_set(sd->frame, EINA_TRUE); >> + evas_object_color_set(sd->frame, 249, 249, 249, 255); >> + evas_object_smart_member_add(sd->frame, obj); >> + >> + sd->text = evas_object_text_add(evas); >> + evas_object_color_set(sd->text, 0, 0, 0, 255); >> + evas_object_text_style_set(sd->text, EVAS_TEXT_STYLE_PLAIN); >> + evas_object_text_font_set(sd->text, "Sans", 10); >> + evas_object_text_text_set(sd->text, "Smart Test"); >> + >> + evas_object_smart_data_set(obj, sd); >> +} >> + >> +static void >> +_ecore_evas_wl_smart_del(Evas_Object *obj) >> +{ >> + EE_Wl_Smart_Data *sd; >> + >> + LOGFN(__FILE__, __LINE__, __FUNCTION__); >> + >> + if (!(sd = evas_object_smart_data_get(obj))) return; >> + evas_object_del(sd->text); >> + evas_object_del(sd->frame); >> + free(sd); >> +} >> + >> +static void >> +_ecore_evas_wl_smart_resize(Evas_Object *obj, Evas_Coord w, Evas_Coord h) >> +{ >> + EE_Wl_Smart_Data *sd; >> + >> + LOGFN(__FILE__, __LINE__, __FUNCTION__); >> + >> + if (!(sd = evas_object_smart_data_get(obj))) return; >> + if ((sd->w == w)&& (sd->h == h)) return; >> + sd->w = w; >> + sd->h = h; >> + evas_object_resize(sd->frame, w, h); >> +} >> + >> +static void >> +_ecore_evas_wl_smart_show(Evas_Object *obj) >> +{ >> + EE_Wl_Smart_Data *sd; >> + >> + LOGFN(__FILE__, __LINE__, __FUNCTION__); >> + >> + if (!(sd = evas_object_smart_data_get(obj))) return; >> + evas_object_show(sd->frame); >> + evas_object_show(sd->text); >> +} >> + >> +static void >> +_ecore_evas_wl_smart_hide(Evas_Object *obj) >> +{ >> + EE_Wl_Smart_Data *sd; >> + >> + LOGFN(__FILE__, __LINE__, __FUNCTION__); >> + >> + if (!(sd = evas_object_smart_data_get(obj))) return; >> + evas_object_hide(sd->text); >> + evas_object_hide(sd->frame); >> +} >> + >> +static Evas_Object * >> +_ecore_evas_wl_frame_add(Evas *evas) >> +{ >> + LOGFN(__FILE__, __LINE__, __FUNCTION__); >> + >> + _ecore_evas_wl_smart_init(); >> + return evas_object_smart_add(evas, _ecore_evas_wl_smart); >> +} >> + >> #else >> EAPI Ecore_Evas * >> ecore_evas_wayland_shm_new(const char *disp_name __UNUSED__, int x >> __UNUSED__, int y __UNUSED__, int w __UNUSED__, int h __UNUSED__, int frame >> __UNUSED__) >> >> ------------------------------------------------------------------------------ Write once. Port to many. Get the SDK and tools to simplify cross-platform app development. Create new or port existing apps to sell to consumers worldwide. Explore the Intel AppUpSM program developer opportunity. appdeveloper.intel.com/join http://p.sf.net/sfu/intel-appdev _______________________________________________ enlightenment-devel mailing list enlightenment-devel@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/enlightenment-devel