Ecore_Evas (Wayland_Shm):

Add an actual 'frame' to ecore_evas_wayland. (just a boring rectangle frame w/ the title).
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.



SVN revision: 66578
This commit is contained in:
Christopher Michael 2011-12-27 19:25:38 +00:00
parent 70b7b55c42
commit 848bea2e3c
1 changed files with 340 additions and 10 deletions

View File

@ -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_in_set(Ecore_Evas *ee, void (*func)(Ec
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_mouse_out(void *data __UNUSED__, int type
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 @@ static Ecore_Evas_Engine_Func _ecore_wl_engine_func =
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 @@ ecore_evas_wayland_shm_new(const char *disp_name, int x, int y, int w, int h, in
* 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 @@ _ecore_evas_wl_pre_free(Ecore_Evas *ee)
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 @@ _ecore_evas_wl_resize(Ecore_Evas *ee, int w, int h)
/* 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 @@ _ecore_evas_wl_show(Ecore_Evas *ee)
/* 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 @@ _ecore_evas_wl_show(Ecore_Evas *ee)
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 @@ _ecore_evas_wl_event_mouse_down(void *data __UNUSED__, int type __UNUSED__, void
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 @@ _ecore_evas_wl_buffer_new(Ecore_Evas *ee, void **dest)
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__)