Hi, The attached very clumsy source causes a rather nasty stack error and then segvs when you right click in the evas. Basically it seems here atleast that doing a evas_free() on a evas which has fonts in it and then recreating it will cause very nasty things to happen.
Doing evas_object_del() on the font object before deleting the canvas doesn't help either :( It seems that once the font object is not made for a canvas you can delete/create the canvas+window as many times as you like. you'll need an image in ./data/backdrop.png & setup the font correctly to run the demo.
#include <stdio.h>
#include <stdlib.h>
#include <sys/time.h>
#include <unistd.h>
#include <X11/Xlib.h>
#include <X11/Xutil.h>
#include "Evas.h"
#include "Evas_Engine_Software_X11.h"
/********************************************************************************/
/********************************************************************************/
/********************************************************************************/
int frames = 0;
int win_w = 480;
int win_h = 640;
Evas *evas;
Display *disp;
Window win;
XSetWindowAttributes attr;
XClassHint chint;
XSizeHints szhints;
int main( int argc, char** argv )
{
RESTART:
disp = XOpenDisplay(NULL);
if (!disp)
{
printf("Error: cannot open display.\n");
return(-1);
}
attr.backing_store = NotUseful;
attr.colormap = DefaultColormap(disp, DefaultScreen(disp));
attr.border_pixel = 0;
attr.background_pixmap = None;
attr.event_mask =
ExposureMask | ButtonPressMask | ButtonReleaseMask | PointerMotionMask |
StructureNotifyMask;
attr.bit_gravity = ForgetGravity;
win = XCreateWindow(disp, DefaultRootWindow(disp), 0, 0, win_w, win_h, 0,
DefaultDepth(disp, DefaultScreen(disp)), InputOutput,
DefaultVisual(disp, DefaultScreen(disp)),
CWBackingStore | CWColormap |
CWBackPixmap | CWBorderPixel |
CWBitGravity | CWEventMask, &attr);
XStoreName(disp, win, "Evas Software X11 Test");
chint.res_name = "Evas_Software_X11_Test";
chint.res_class = "Main";
XSetClassHint(disp, win, &chint);
XMapWindow(disp, win);
XSync(disp, False);
evas = evas_new();
evas_output_method_set(evas, evas_render_method_lookup("software_x11"));
evas_output_size_set(evas, win_w, win_h);
evas_output_viewport_set(evas, 0, 0, win_w, win_h);
{
Evas_Engine_Info_Software_X11 *einfo;
einfo = (Evas_Engine_Info_Software_X11 *) evas_engine_info_get(evas);
/* the following is specific to the engine */
einfo->info.display = disp;
einfo->info.visual = DefaultVisual(disp, DefaultScreen(disp));
einfo->info.colormap = DefaultColormap(disp, DefaultScreen(disp));
einfo->info.drawable = win;
einfo->info.depth = DefaultDepth(disp, DefaultScreen(disp));
einfo->info.rotation = 0;
einfo->info.debug = 0;
evas_engine_info_set(evas, (Evas_Engine_Info *) einfo);
}
////////////////////////////////////////
// setup scene
// make backgroound
{
Evas_Object *ob;
ob = evas_object_image_add(evas);
evas_object_image_file_set(ob, "data/backdrop.png", NULL);
evas_object_layer_set(ob, 0);
int w=0, h=0;
evas_object_image_size_get( ob, &w, &h );
evas_object_image_fill_set( ob, 0, 0, w, h );
evas_object_resize( ob, w, h );
evas_object_move( ob, 0, 0 );
evas_object_show(ob);
}
{
Evas_Object *ob;
ob = evas_object_image_add(evas);
evas_object_image_file_set(ob, "data/backdrop.png", NULL);
evas_object_layer_set(ob, 0);
int w=0, h=0;
evas_object_image_size_get( ob, &w, &h );
evas_object_image_fill_set( ob, 0, 0, w, h );
evas_object_resize( ob, w, h );
evas_object_move( ob, w, 0 );
evas_object_show(ob);
}
{
Evas_Object *ob;
ob = evas_object_image_add(evas);
evas_object_image_file_set(ob, "data/backdrop.png", NULL);
evas_object_layer_set(ob, 0);
int w=0, h=0;
evas_object_image_size_get( ob, &w, &h );
evas_object_image_fill_set( ob, 0, 0, w, h );
evas_object_resize( ob, w, h );
evas_object_move( ob, 0, h );
evas_object_show(ob);
}
{
Evas_Object *ob;
ob = evas_object_image_add(evas);
evas_object_image_file_set(ob, "data/backdrop.png", NULL);
evas_object_layer_set(ob, 0);
int w=0, h=0;
evas_object_image_size_get( ob, &w, &h );
evas_object_image_fill_set( ob, 0, 0, w, h );
evas_object_resize( ob, w, h );
evas_object_move( ob, w, h );
evas_object_show(ob);
}
{
evas_font_path_append( evas, "/usr/ego/themes/default" );
Evas_Object *ob;
ob = evas_object_text_add( evas );
evas_object_text_text_set( ob, "foo bar" );
evas_object_layer_set(ob, 1000);
evas_object_text_font_set( ob, "verdana", 24);
// int w=20, h=20;
// evas_object_image_size_get( ob, &w, &h );
// evas_object_image_fill_set( ob, 0, 0, w, h );
// evas_object_resize( ob, w, h );
evas_object_color_set( ob, 0, 0, 0, 255 );
evas_object_move( ob, 20, 20 );
evas_object_show(ob);
}
int WantToQuit = 0;
while( !WantToQuit )
{
XEvent ev;
while (XCheckMaskEvent(disp,
ExposureMask |
StructureNotifyMask |
KeyPressMask |
KeyReleaseMask |
ButtonPressMask |
ButtonReleaseMask | PointerMotionMask, &ev))
{
switch (ev.type)
{
case ButtonPress:
if (ev.xbutton.button == 3)
{
XDestroyWindow(disp,win);
evas_free( evas );
goto RESTART;
// WantToQuit = 1;
break;
}
#if 0
if (!pause_me)
pause_me = 1;
else if (pause_me == 1)
pause_me = 2;
else
pause_me = 1;
#endif
/* evas_event_feed_mouse_move(evas, ev.xbutton.x, ev.xbutton.y,
NULL); */
/* evas_event_feed_mouse_down(evas, ev.xbutton.button,
EVAS_BUTTON_NONE, NULL); */
break;
case ButtonRelease:
/* evas_event_feed_mouse_move(evas, ev.xbutton.x, ev.xbutton.y,
NULL); */
/* evas_event_feed_mouse_up(evas, ev.xbutton.button,
EVAS_BUTTON_NONE, NULL); */
break;
case MotionNotify:
/* evas_event_feed_mouse_move(evas, ev.xmotion.x, ev.xmotion.y,
NULL); */
break;
case Expose:
evas_damage_rectangle_add(evas,
ev.xexpose.x,
ev.xexpose.y,
ev.xexpose.width,
ev.xexpose.height);
break;
case ConfigureNotify:
evas_output_size_set(evas,
ev.xconfigure.width,
ev.xconfigure.height);
break;
default:
break;
}
}
evas_render(evas);
XFlush(disp);
frames++;
}
return 0;
}
signature.asc
Description: This is a digitally signed message part
