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;
}

Attachment: signature.asc
Description: This is a digitally signed message part

Reply via email to