efl/legacy/evas/src/lib/canvas/evas_main.c

1062 lines
29 KiB
C

#include "evas_common.h"
#include "evas_private.h"
#include "evas_cs.h"
static int _evas_init_count = 0;
int _evas_log_dom_global = -1;
/**
* Initialize Evas
*
* @return The init counter value.
*
* This function initialize evas, increments a counter of the number
* of calls to this function and returns this value.
*
* @see evas_shutdown().
*
*/
EAPI int
evas_init(void)
{
if (++_evas_init_count != 1)
return _evas_init_count;
if (!eina_init())
return 0;
_evas_log_dom_global = eina_log_domain_register("evas_main",EVAS_DEFAULT_LOG_COLOR);
if (_evas_log_dom_global < 0)
{
fprintf(stderr,"Error: Evas could not create a default log domain\n");
goto shutdown_eina;
}
evas_module_init();
#ifdef BUILD_ASYNC_EVENTS
if (!evas_async_events_init())
goto shutdown_module;
#endif
#ifdef EVAS_CSERVE
if (getenv("EVAS_CSERVE")) evas_cserve_init();
#endif
return _evas_init_count;
#ifdef BUILD_ASYNC_EVENTS
shutdown_module:
evas_module_shutdown();
eina_log_domain_unregister(_evas_log_dom_global);
#endif
shutdown_eina:
eina_shutdown();
return 0;
}
/**
* Shutdown Evas
*
* @return The init counter value.
*
* This function finalize evas, decrements the counter of the number
* of calls to the function evas_init() and returns this value.
*
* @see evas_init().
*
*/
EAPI int
evas_shutdown(void)
{
if (--_evas_init_count != 0)
return _evas_init_count;
#ifdef EVAS_CSERVE
if (getenv("EVAS_CSERVE")) evas_cserve_shutdown();
#endif
#ifdef BUILD_ASYNC_EVENTS
evas_async_events_shutdown();
#endif
evas_font_dir_cache_free();
evas_common_shutdown();
evas_module_shutdown();
eina_log_domain_unregister(_evas_log_dom_global);
eina_shutdown();
return _evas_init_count;
}
/**
* @defgroup Evas_Canvas Evas Canvas functions
*
* Functions that deal with the basic evas object. They are the
* functions you need to use at a minimum to get a working evas, and
* to destroy it.
*
*/
/**
* Creates a new empty evas.
*
* Note that before you can use the evas, you will to at a minimum:
* @li Set its render method with @ref evas_output_method_set .
* @li Set its viewport size with @ref evas_output_viewport_set .
* @li Set its size of the canvas with @ref evas_output_size_set .
* @li Ensure that the render engine is given the correct settings
* with @ref evas_engine_info_set .
*
* This function should only fail if the memory allocation fails.
*
* @return A new uninitialised Evas canvas on success. Otherwise, @c
* NULL.
* @ingroup Evas_Canvas
*/
EAPI Evas *
evas_new(void)
{
Evas *e;
e = calloc(1, sizeof(Evas));
if (!e) return NULL;
e->magic = MAGIC_EVAS;
e->output.render_method = RENDER_METHOD_INVALID;
e->viewport.w = 1;
e->viewport.h = 1;
e->hinting = EVAS_FONT_HINTING_BYTECODE;
e->name_hash = eina_hash_string_superfast_new(NULL);
eina_array_step_set(&e->delete_objects, 16);
eina_array_step_set(&e->active_objects, 16);
eina_array_step_set(&e->restack_objects, 16);
eina_array_step_set(&e->render_objects, 16);
eina_array_step_set(&e->pending_objects, 16);
eina_array_step_set(&e->obscuring_objects, 16);
eina_array_step_set(&e->temporary_objects, 16);
eina_array_step_set(&e->calculate_objects, 16);
eina_array_step_set(&e->clip_changes, 16);
return e;
}
/**
* Frees the given evas and any objects created on it.
*
* Any objects with 'free' callbacks will have those callbacks called
* in this function.
*
* @param e The given evas.
* @ingroup Evas_Canvas
*/
EAPI void
evas_free(Evas *e)
{
Eina_Rectangle *r;
Evas_Layer *lay;
int i;
int del;
MAGIC_CHECK(e, Evas, MAGIC_EVAS);
return;
MAGIC_CHECK_END();
if (e->walking_list == 0) evas_render_idle_flush(e);
if (e->walking_list > 0) return;
del = 1;
e->walking_list++;
e->cleanup = 1;
while (del)
{
del = 0;
EINA_INLIST_FOREACH(e->layers, lay)
{
Evas_Object *o;
evas_layer_pre_free(lay);
EINA_INLIST_FOREACH(lay->objects, o)
{
if ((o->callbacks) && (o->callbacks->walking_list))
{
/* Defer free */
e->delete_me = 1;
e->walking_list--;
return;
}
if (!o->delete_me)
del = 1;
}
}
}
EINA_INLIST_FOREACH(e->layers, lay)
evas_layer_free_objects(lay);
evas_layer_clean(e);
e->walking_list--;
evas_font_path_clear(e);
e->pointer.object.in = eina_list_free(e->pointer.object.in);
if (e->name_hash) eina_hash_free(e->name_hash);
e->name_hash = NULL;
EINA_LIST_FREE(e->damages, r)
eina_rectangle_free(r);
EINA_LIST_FREE(e->obscures, r)
eina_rectangle_free(r);
evas_fonts_zero_free(e);
if (e->engine.func)
{
e->engine.func->context_free(e->engine.data.output, e->engine.data.context);
e->engine.func->output_free(e->engine.data.output);
e->engine.func->info_free(e, e->engine.info);
}
for (i = 0; i < e->modifiers.mod.count; i++)
free(e->modifiers.mod.list[i]);
if (e->modifiers.mod.list) free(e->modifiers.mod.list);
for (i = 0; i < e->locks.lock.count; i++)
free(e->locks.lock.list[i]);
if (e->locks.lock.list) free(e->locks.lock.list);
if (e->engine.module) evas_module_unref(e->engine.module);
eina_array_flush(&e->delete_objects);
eina_array_flush(&e->active_objects);
eina_array_flush(&e->restack_objects);
eina_array_flush(&e->render_objects);
eina_array_flush(&e->pending_objects);
eina_array_flush(&e->obscuring_objects);
eina_array_flush(&e->temporary_objects);
eina_array_flush(&e->calculate_objects);
eina_array_flush(&e->clip_changes);
e->magic = 0;
free(e);
}
/**
* @defgroup Evas_Output_Method Evas Render Engine Functions
*
* Functions that are used to set the render engine for a given
* function, and then get that engine working.
*
* The following code snippet shows how they can be used to
* initialise an evas that uses the X11 software engine:
* @code
* Evas *evas;
* Evas_Engine_Info_Software_X11 *einfo;
* extern Display *display;
* extern Window win;
*
* evas = evas_new();
* evas_output_method_set(evas, evas_render_method_lookup("software_x11"));
* evas_output_size_set(evas, 640, 480);
* evas_output_viewport_set(evas, 0, 0, 640, 480);
* einfo = (Evas_Engine_Info_Software_X11 *)evas_engine_info_get(evas);
* einfo->info.display = display;
* einfo->info.visual = DefaultVisual(display, DefaultScreen(display));
* einfo->info.colormap = DefaultColormap(display, DefaultScreen(display));
* einfo->info.drawable = win;
* einfo->info.depth = DefaultDepth(display, DefaultScreen(display));
* evas_engine_info_set(evas, (Evas_Engine_Info *)einfo);
* @endcode
*/
/**
* Sets the output engine for the given evas.
*
* Once the output engine for an evas is set, any attempt to change it
* will be ignored. The value for @p render_method can be found using
* @ref evas_render_method_lookup .
*
* @param e The given evas.
* @param render_method The numeric engine value to use.
* @ingroup Evas_Output_Method
*/
EAPI void
evas_output_method_set(Evas *e, int render_method)
{
Evas_Module *em;
MAGIC_CHECK(e, Evas, MAGIC_EVAS);
return;
MAGIC_CHECK_END();
/* if our engine to set it to is invalid - abort */
if (render_method == RENDER_METHOD_INVALID) return;
/* if the engine is already set up - abort */
if (e->output.render_method != RENDER_METHOD_INVALID) return;
/* Request the right engine. */
em = evas_module_engine_get(render_method);
if (!em) return ;
if (em->id_engine != render_method) return;
if (!evas_module_load(em)) return;
/* set the correct render */
e->output.render_method = render_method;
e->engine.func = (em->functions);
evas_module_use(em);
if (e->engine.module) evas_module_unref(e->engine.module);
e->engine.module = em;
evas_module_ref(em);
/* get the engine info struct */
if (e->engine.func->info) e->engine.info = e->engine.func->info(e);
return;
}
/**
* Retrieves the number of the output engine used for the given evas.
* @param e The given evas.
* @return The ID number of the output engine being used. @c 0 is
* returned if there is an error.
* @ingroup Evas_Output_Method
*/
EAPI int
evas_output_method_get(const Evas *e)
{
MAGIC_CHECK(e, Evas, MAGIC_EVAS);
return RENDER_METHOD_INVALID;
MAGIC_CHECK_END();
return e->output.render_method;
}
/**
* Retrieves the current render engine info struct from the given evas.
*
* The returned structure is publicly modifiable. The contents are
* valid until either @ref evas_engine_info_set or @ref evas_render
* are called.
*
* This structure does not need to be freed by the caller.
*
* @param e The given evas.
* @return A pointer to the Engine Info structure. @c NULL is returned if
* an engine has not yet been assigned.
* @ingroup Evas_Output_Method
*/
EAPI Evas_Engine_Info *
evas_engine_info_get(const Evas *e)
{
Evas_Engine_Info *info;
MAGIC_CHECK(e, Evas, MAGIC_EVAS);
return NULL;
MAGIC_CHECK_END();
if (!e->engine.info) return NULL;
info = e->engine.info;
((Evas *)e)->engine.info_magic = info->magic;
return info;
}
/**
* Applies the engine settings for the given evas from the given @c
* Evas_Engine_Info structure.
*
* To get the Evas_Engine_Info structure to use, call @ref
* evas_engine_info_get . Do not try to obtain a pointer to an
* @c Evas_Engine_Info structure in any other way.
*
* You will need to call this function at least once before you can
* create objects on an evas or render that evas. Some engines allow
* their settings to be changed more than once.
*
* Once called, the @p info pointer should be considered invalid.
*
* Example:
*
* @param e The pointer to the Evas Canvas
* @param info The pointer to the Engine Info to use
* @return 1 if no error occured, 0 otherwise
* @ingroup Evas_Output_Method
*/
EAPI int
evas_engine_info_set(Evas *e, Evas_Engine_Info *info)
{
MAGIC_CHECK(e, Evas, MAGIC_EVAS);
return 0;
MAGIC_CHECK_END();
if (!info) return 0;
if (info != e->engine.info) return 0;
if (info->magic != e->engine.info_magic) return 0;
return e->engine.func->setup(e, info);
}
/**
* @defgroup Evas_Output_Size Evas Output and Viewport Resizing
* Functions
*
* Functions that set and retrieve the output and viewport size of an
* evas.
*/
/**
* Sets the output size of the render engine of the given evas.
*
* The evas will render to a rectangle of the given size once this
* function is called. The output size is independent of the viewport
* size. The viewport will be stretched to fill the given rectangle.
*
* The units used for @p w and @p h depend on the engine used by the
* evas.
*
* @param e The given evas.
* @param w The width in output units, usually pixels.
* @param h The height in output units, usually pixels.
* @ingroup Evas_Output_Size
*/
EAPI void
evas_output_size_set(Evas *e, int w, int h)
{
MAGIC_CHECK(e, Evas, MAGIC_EVAS);
return;
MAGIC_CHECK_END();
if ((w == e->output.w) && (h == e->output.h)) return;
if (w < 1) w = 1;
if (h < 1) h = 1;
e->output.w = w;
e->output.h = h;
e->output.changed = 1;
e->output_validity++;
e->changed = 1;
evas_render_invalidate(e);
}
/**
* Retrieve the output size of the render engine of the given evas.
*
* The output size is given in whatever the output units are for the
* engine.
*
* If either @p w or @p h is @c NULL, then it is ignored. If @p e is
* invalid, the returned results are undefined.
*
* @param e The given evas.
* @param w The pointer to an integer to store the width in.
* @param h The pointer to an integer to store the height in.
* @ingroup Evas_Output_Size
*/
EAPI void
evas_output_size_get(const Evas *e, int *w, int *h)
{
MAGIC_CHECK(e, Evas, MAGIC_EVAS);
if (w) *w = 0;
if (h) *h = 0;
return;
MAGIC_CHECK_END();
if (w) *w = e->output.w;
if (h) *h = e->output.h;
}
/**
* Sets the output viewport of the given evas in evas units.
*
* The output viewport is the area of the evas that will be visible to
* the viewer. The viewport will be stretched to fit the output
* target of the evas when rendering is performed.
*
* @note The coordinate values do not have to map 1-to-1 with the output
* target. However, it is generally advised that it is done for ease
* of use.
*
* @param e The given evas.
* @param x The top-left corner x value of the viewport.
* @param y The top-left corner y value of the viewport.
* @param w The width of the viewport. Must be greater than 0.
* @param h The height of the viewport. Must be greater than 0.
* @ingroup Evas_Output_Size
*/
EAPI void
evas_output_viewport_set(Evas *e, Evas_Coord x, Evas_Coord y, Evas_Coord w, Evas_Coord h)
{
MAGIC_CHECK(e, Evas, MAGIC_EVAS);
return;
MAGIC_CHECK_END();
if ((x == e->viewport.x) && (y == e->viewport.y) &&
(w == e->viewport.w) && (h == e->viewport.h)) return;
if (w <= 0) return;
if (h <= 0) return;
if ((x != 0) || (y != 0))
{
ERROR("EVAS: compat error. viewport x,y != 0,0 not supported");
x = 0;
y = 0;
}
e->viewport.x = x;
e->viewport.y = y;
e->viewport.w = w;
e->viewport.h = h;
e->viewport.changed = 1;
e->output_validity++;
e->changed = 1;
}
/**
* Get the render engine's output viewport co-ordinates in canvas units.
* @param e The pointer to the Evas Canvas
* @param x The pointer to a x variable to be filled in
* @param y The pointer to a y variable to be filled in
* @param w The pointer to a width variable to be filled in
* @param h The pointer to a height variable to be filled in
* @ingroup Evas_Output_Size
*
* Calling this function writes the current canvas output viewport
* size and location values into the variables pointed to by @p x, @p
* y, @p w and @p h. On success the variables have the output
* location and size values written to them in canvas units. Any of @p
* x, @p y, @p w or @p h that are NULL will not be written to. If @p e
* is invalid, the results are undefined.
*
* Example:
* @code
* extern Evas *evas;
* Evas_Coord x, y, width, height;
*
* evas_output_viewport_get(evas, &x, &y, &w, &h);
* @endcode
*/
EAPI void
evas_output_viewport_get(const Evas *e, Evas_Coord *x, Evas_Coord *y, Evas_Coord *w, Evas_Coord *h)
{
MAGIC_CHECK(e, Evas, MAGIC_EVAS);
if (x) *x = 0;
if (y) *y = 0;
if (w) *w = 0;
if (h) *h = 0;
return;
MAGIC_CHECK_END();
if (x) *x = e->viewport.x;
if (y) *y = e->viewport.y;
if (w) *w = e->viewport.w;
if (h) *h = e->viewport.h;
}
/**
* @defgroup Evas_Coord_Mapping_Group Evas Coordinate Mapping
* Functions
*
* Functions that are used to map coordinates from the canvas to the
* screen or the screen to the canvas.
*/
/**
* Convert/scale an ouput screen co-ordinate into canvas co-ordinates
*
* @param e The pointer to the Evas Canvas
* @param x The screen/output x co-ordinate
* @return The screen co-ordinate translated to canvas unit co-ordinates
* @ingroup Evas_Coord_Mapping_Group
*
* This function takes in a horizontal co-ordinate as the @p x
* parameter and converts it into canvas units, accounting for output
* size, viewport size and location, returning it as the function
* return value. If @p e is invalid, the results are undefined.
*
* Example:
* @code
* extern Evas *evas;
* extern int screen_x;
* Evas_Coord canvas_x;
*
* canvas_x = evas_coord_screen_x_to_world(evas, screen_x);
* @endcode
*/
EAPI Evas_Coord
evas_coord_screen_x_to_world(const Evas *e, int x)
{
MAGIC_CHECK(e, Evas, MAGIC_EVAS);
return 0;
MAGIC_CHECK_END();
if (e->output.w == e->viewport.w) return e->viewport.x + x;
return (long long)e->viewport.x + (((long long)x * (long long)e->viewport.w) / (long long)e->output.w);
}
/**
* Convert/scale an ouput screen co-ordinate into canvas co-ordinates
*
* @param e The pointer to the Evas Canvas
* @param y The screen/output y co-ordinate
* @return The screen co-ordinate translated to canvas unit co-ordinates
* @ingroup Evas_Coord_Mapping_Group
*
* This function takes in a vertical co-ordinate as the @p y parameter
* and converts it into canvas units, accounting for output size,
* viewport size and location, returning it as the function return
* value. If @p e is invalid, the results are undefined.
*
* Example:
* @code
* extern Evas *evas;
* extern int screen_y;
* Evas_Coord canvas_y;
*
* canvas_y = evas_coord_screen_y_to_world(evas, screen_y);
* @endcode
*/
EAPI Evas_Coord
evas_coord_screen_y_to_world(const Evas *e, int y)
{
MAGIC_CHECK(e, Evas, MAGIC_EVAS);
return 0;
MAGIC_CHECK_END();
if (e->output.h == e->viewport.h) return e->viewport.y + y;
return (long long)e->viewport.y + (((long long)y * (long long)e->viewport.h) / (long long)e->output.h);
}
/**
* Convert/scale a canvas co-ordinate into output screen co-ordinates
*
* @param e The pointer to the Evas Canvas
* @param x The canvas x co-ordinate
* @return The output/screen co-ordinate translated to output co-ordinates
* @ingroup Evas_Coord_Mapping_Group
*
* This function takes in a horizontal co-ordinate as the @p x
* parameter and converts it into output units, accounting for output
* size, viewport size and location, returning it as the function
* return value. If @p e is invalid, the results are undefined.
*
* Example:
* @code
* extern Evas *evas;
* int screen_x;
* extern Evas_Coord canvas_x;
*
* screen_x = evas_coord_world_x_to_screen(evas, canvas_x);
* @endcode
*/
EAPI int
evas_coord_world_x_to_screen(const Evas *e, Evas_Coord x)
{
MAGIC_CHECK(e, Evas, MAGIC_EVAS);
return 0;
MAGIC_CHECK_END();
if (e->output.w == e->viewport.w) return x - e->viewport.x;
return (int)((((long long)x - (long long)e->viewport.x) * (long long)e->output.w) / (long long)e->viewport.w);
}
/**
* Convert/scale a canvas co-ordinate into output screen co-ordinates
*
* @param e The pointer to the Evas Canvas
* @param y The canvas y co-ordinate
* @return The output/screen co-ordinate translated to output co-ordinates
* @ingroup Evas_Coord_Mapping_Group
*
* This function takes in a vertical co-ordinate as the @p x parameter
* and converts it into output units, accounting for output size,
* viewport size and location, returning it as the function return
* value. If @p e is invalid, the results are undefined.
*
* Example:
* @code
* extern Evas *evas;
* int screen_y;
* extern Evas_Coord canvas_y;
*
* screen_y = evas_coord_world_y_to_screen(evas, canvas_y);
* @endcode
*/
EAPI int
evas_coord_world_y_to_screen(const Evas *e, Evas_Coord y)
{
MAGIC_CHECK(e, Evas, MAGIC_EVAS);
return 0;
MAGIC_CHECK_END();
if (e->output.h == e->viewport.h) return y - e->viewport.y;
return (int)((((long long)y - (long long)e->viewport.y) * (long long)e->output.h) / (long long)e->viewport.h);
}
/**
* Look up a numeric ID from a string name of a rendering engine.
*
* @param name The string name of an engine
* @return A numeric (opaque) ID for the rendering engine
* @ingroup Evas_Output_Method
*
* This function looks up a numeric return value for the named engine
* in the string @p name. This is a normal C string, NUL byte
* terminated. The name is case sensitive. If the rendering engine is
* available, a numeric ID for that engine is returned that is not
* 0. If the engine is not available, 0 is returned, indicating an
* invalid engine.
*
* The programmer should NEVER rely on the numeric ID of an engine
* unless it is returned by this function. Programs should NOT be
* written accessing render method ID's directly, without first
* obtaining it from this function.
*
* Example:
* @code
* int engine_id;
* Evas *evas;
*
* evas = evas_new();
* if (!evas)
* {
* fprintf(stderr, "ERROR: Canvas creation failed. Fatal error.\n");
* exit(-1);
* }
* engine_id = evas_render_method_lookup("software_x11");
* if (!engine_id)
* {
* fprintf(stderr, "ERROR: Requested rendering engine is absent.\n");
* exit(-1);
* }
* evas_output_method_set(evas, engine_id);
* @endcode
*/
EAPI int
evas_render_method_lookup(const char *name)
{
Evas_Module *em;
if (!name) return RENDER_METHOD_INVALID;
/* search on the engines list for the name */
em = evas_module_find_type(EVAS_MODULE_TYPE_ENGINE, name);
if (!em) return RENDER_METHOD_INVALID;
return em->id_engine;
}
/**
* List all the rendering engines compiled into the copy of the Evas library
*
* @return A linked list whose data members are C strings of engine names
* @ingroup Evas_Output_Method
*
* Calling this will return a handle (pointer) to an Evas linked
* list. Each node in the linked list will have the data pointer be a
* (char *) pointer to the string name of the rendering engine
* available. The strings should never be modified, neither should the
* list be modified. This list should be cleaned up as soon as the
* program no longer needs it using evas_render_method_list_free(). If
* no engines are available from Evas, NULL will be returned.
*
* Example:
* @code
* Eina_List *engine_list, *l;
* char *engine_name;
*
* engine_list = evas_render_method_list();
* if (!engine_list)
* {
* fprintf(stderr, "ERROR: Evas supports no engines! Exit.\n");
* exit(-1);
* }
* printf("Availible Evas Engines:\n");
* EINA_LIST_FOREACH(engine_list, l, engine_name)
* printf("%s\n", engine_name);
* evas_render_method_list_free(engine_list);
* @endcode
*/
EAPI Eina_List *
evas_render_method_list(void)
{
Eina_List *methods = NULL;
/* FIXME: get from modules - this is currently coded-in */
#ifdef BUILD_ENGINE_SOFTWARE_GDI
methods = eina_list_append(methods, "software_gdi");
#endif
#ifdef BUILD_ENGINE_SOFTWARE_DDRAW
methods = eina_list_append(methods, "software_ddraw");
#endif
#ifdef BUILD_ENGINE_SOFTWARE_16_DDRAW
methods = eina_list_append(methods, "software_16_ddraw");
#endif
#ifdef BUILD_ENGINE_DIRECT3D
methods = eina_list_append(methods, "direct3d");
#endif
#ifdef BUILD_ENGINE_SOFTWARE_16_WINCE
methods = eina_list_append(methods, "software_16_wince");
#endif
#ifdef BUILD_ENGINE_SOFTWARE_X11
methods = eina_list_append(methods, "software_x11");
#endif
#ifdef BUILD_ENGINE_XRENDER_X11
methods = eina_list_append(methods, "xrender_x11");
#endif
#ifdef BUILD_ENGINE_XRENDER_XCB
methods = eina_list_append(methods, "xrender_xcb");
#endif
#ifdef BUILD_ENGINE_SOFTWARE_16_X11
methods = eina_list_append(methods, "software_16_x11");
#endif
#ifdef BUILD_ENGINE_GL_X11
methods = eina_list_append(methods, "gl_x11");
#endif
#ifdef BUILD_ENGINE_GL_GLEW
methods = eina_list_append(methods, "gl_glew");
#endif
#ifdef BUILD_ENGINE_CAIRO_X11
methods = eina_list_append(methods, "cairo_x11");
#endif
#ifdef BUILD_ENGINE_DIRECTFB
methods = eina_list_append(methods, "directfb");
#endif
#ifdef BUILD_ENGINE_FB
methods = eina_list_append(methods, "fb");
#endif
#ifdef BUILD_ENGINE_BUFFER
methods = eina_list_append(methods, "buffer");
#endif
#ifdef BUILD_ENGINE_SOFTWARE_WIN32_GDI
methods = eina_list_append(methods, "software_win32_gdi");
#endif
#ifdef BUILD_ENGINE_SOFTWARE_QTOPIA
methods = eina_list_append(methods, "software_qtopia");
#endif
#ifdef BUILD_ENGINE_SOFTWARE_SDL
methods = eina_list_append(methods, "software_sdl");
#endif
return methods;
}
/**
* This function should be called to free a list of engine names
*
* @param list The Eina_List base pointer for the engine list to be freed
* @ingroup Evas_Output_Method
*
* When this function is called it will free the engine list passed in
* as @p list. The list should only be a list of engines generated by
* calling evas_render_method_list(). If @p list is NULL, nothing will
* happen.
*
* Example:
* @code
* Eina_List *engine_list, *l;
* char *engine_name;
*
* engine_list = evas_render_method_list();
* if (!engine_list)
* {
* fprintf(stderr, "ERROR: Evas supports no engines! Exit.\n");
* exit(-1);
* }
* printf("Availible Evas Engines:\n");
* EINA_LIST_FOREACH(engine_list, l, engine_name)
* printf("%s\n", engine_name);
* evas_render_method_list_free(engine_list);
* @endcode
*/
EAPI void
evas_render_method_list_free(Eina_List *list)
{
eina_list_free(list);
}
/**
* @defgroup Evas_Pointer_Group Evas Pointer Functions
*
* Functions that deal with the status of the pointer.
*/
/**
* This function returns the current known pointer co-ordinates
*
* @param e The pointer to the Evas Canvas
* @param x The pointer to an integer to be filled in
* @param y The pointer to an integer to be filled in
* @ingroup Evas_Pointer_Group
*
* This function returns the current known screen/output co-ordinates
* of the mouse pointer and sets the contents of the integers pointed
* to by @p x and @p y to contain these co-ordinates. If @p e is not a
* valid canvas the results of this function are undefined.
*
* Example:
* @code
* extern Evas *evas;
* int mouse_x, mouse_y;
*
* evas_pointer_output_xy_get(evas, &mouse_x, &mouse_y);
* printf("Mouse is at screen position %i, %i\n", mouse_x, mouse_y);
* @endcode
*/
EAPI void
evas_pointer_output_xy_get(const Evas *e, int *x, int *y)
{
MAGIC_CHECK(e, Evas, MAGIC_EVAS);
if (x) *x = 0;
if (y) *y = 0;
return;
MAGIC_CHECK_END();
if (x) *x = e->pointer.x;
if (y) *y = e->pointer.y;
}
/**
* This function returns the current known pointer co-ordinates
*
* @param e The pointer to the Evas Canvas
* @param x The pointer to a Evas_Coord to be filled in
* @param y The pointer to a Evas_Coord to be filled in
* @ingroup Evas_Pointer_Group
*
* This function returns the current known canvas unit co-ordinates of
* the mouse pointer and sets the contents of the Evas_Coords pointed
* to by @p x and @p y to contain these co-ordinates. If @p e is not a
* valid canvas the results of this function are undefined.
*
* Example:
* @code
* extern Evas *evas;
* Evas_Coord mouse_x, mouse_y;
*
* evas_pointer_output_xy_get(evas, &mouse_x, &mouse_y);
* printf("Mouse is at canvas position %f, %f\n", mouse_x, mouse_y);
* @endcode
*/
EAPI void
evas_pointer_canvas_xy_get(const Evas *e, Evas_Coord *x, Evas_Coord *y)
{
MAGIC_CHECK(e, Evas, MAGIC_EVAS);
if (x) *x = 0;
if (y) *y = 0;
return;
MAGIC_CHECK_END();
if (x) *x = e->pointer.x;
if (y) *y = e->pointer.y;
}
/**
* Returns a bitmask with the mouse buttons currently pressed, set to 1
*
* @param e The pointer to the Evas Canvas
* @return A bitmask of the currently depressed buttons on the cavas
* @ingroup Evas_Pointer_Group
*
* Calling this function will return a 32-bit integer with the
* appropriate bits set to 1 that correspond to a mouse button being
* depressed. This limits Evas to a mouse devices with a maximum of 32
* buttons, but that is generally in excess of any host system's
* pointing device abilities.
*
* A canvas by default begins with no mouse buttons being pressed and
* only calls to evas_event_feed_mouse_down(),
* evas_event_feed_mouse_down_data(), evas_event_feed_mouse_up() and
* evas_event_feed_mouse_up_data() will alter that.
*
* The least significant bit corresponds to the first mouse button
* (button 1) and the most significant bit corresponds to the last
* mouse button (button 32).
*
* If @p e is not a valid canvas, the return value is undefined.
*
* Example:
* @code
* extern Evas *evas;
* int button_mask, i;
*
* button_mask = evas_pointer_button_down_mask_get(evas);
* printf("Buttons currently pressed:\n");
* for (i = 0; i < 32; i++)
* {
* if ((button_mask & (1 << i)) != 0) printf("Button %i\n", i + 1);
* }
* @endcode
*/
EAPI int
evas_pointer_button_down_mask_get(const Evas *e)
{
MAGIC_CHECK(e, Evas, MAGIC_EVAS);
return 0;
MAGIC_CHECK_END();
return (int)e->pointer.button;
}
/**
* Returns whether the mouse pointer is logically inside the canvas
*
* @param e The pointer to the Evas Canvas
* @return An integer that is 1 if the mouse is inside the canvas, 0 otherwise
* @ingroup Evas_Pointer_Group
*
* When this function is called it will return a value of either 0 or
* 1, depending on if evas_event_feed_mouse_in(),
* evas_event_feed_mouse_in_data(), or evas_event_feed_mouse_out(),
* evas_event_feed_mouse_out_data() have been called to feed in a
* mouse enter event into the canvas.
*
* A return value of 1 indicates the mouse is logically inside the
* canvas, and 0 implies it is logically outside the canvas.
*
* A canvas begins with the mouse being assumed outside (0).
*
* If @p e is not a valid canvas, the return value is undefined.
*
* Example:
* @code
* extern Evas *evas;
*
* if (evas_pointer_inside_get(evas)) printf("Mouse is in!\n");
* else printf("Mouse is out!\n");
* @endcode
*/
EAPI Eina_Bool
evas_pointer_inside_get(const Evas *e)
{
MAGIC_CHECK(e, Evas, MAGIC_EVAS);
return 0;
MAGIC_CHECK_END();
return (int)e->pointer.inside;
}
/**
* Attaches a specific pointer to the evas for fetching later
*
* @param e The canvas to attach the pointer to
* @param data The pointer to attach
*/
EAPI void
evas_data_attach_set(Evas *e, void *data)
{
MAGIC_CHECK(e, Evas, MAGIC_EVAS);
return;
MAGIC_CHECK_END();
e->attach_data = data;
}
/**
* Returns the pointer attached by evas_data_attach_set()
*
* @param e The canvas to attach the pointer to
* @return The pointer attached
*/
EAPI void *
evas_data_attach_get(const Evas *e)
{
MAGIC_CHECK(e, Evas, MAGIC_EVAS);
return NULL;
MAGIC_CHECK_END();
return e->attach_data;
}
void
_evas_walk(Evas *e)
{
e->walking_list++;
}
void
_evas_unwalk(Evas *e)
{
e->walking_list--;
if ((e->walking_list == 0) && (e->delete_me)) evas_free(e);
}