I think you can use clutter animation to do that

Mit freundlichen Grüßen / Best regards
BeQIK

Charles / Chen Kai
RBAC/CM/ESW1-CN


-----Original Message-----
From: clutter-app-devel-list-boun...@clutter-project.org 
[mailto:clutter-app-devel-list-boun...@clutter-project.org] On Behalf Of 
david.sale.75
Sent: Monday, May 14, 2012 2:12 PM
To: clutter-app-devel-list@clutter-project.org
Subject: Re: Can not get actor width in the thread ?

Thanks  Lionel,  Chen Kai   for reply,  I mean to create OSD scroll from
right
To left effect, that must often change X coordinate and the words .

If clutter API Is not thread safe,  with what method is better?
Now I modify the code, can let clutter_text moving to the left, but how to
Change the dynamic of thread safe text  and get actor width?

#include <glib.h>
#include <clutter/clutter.h>

ClutterActor *gStage, *acttext=NULL;
static gboolean osdtextchang=FALSE;
static gchar *vgaosdtext=NULL;
ClutterColor white = {255, 255, 255, 255};
ClutterColor black = {0, 0, 0, 0};

static gpointer vgaosd_left(gpointer data)
{
        gfloat wc, wx, ww;
        wx = wc = 650;

        while (1)
        {
                if (vgaosdtext==NULL)
                {
                        usleep(500);
                        continue;
                }

                if (g_strcmp0(vgaosdtext, "")==0)
                {
                        usleep(500);
                        continue;
                }

                osdtextchang = FALSE;
                clutter_text_set_text(CLUTTER_TEXT(acttext), vgaosdtext);

                //if use clutter_actor_get_width(acttext);

//Pango:ERROR:pango-layout.c:3743:pango_layout_check_lines: assertion
failed: (!layout->log_attrs)
                //ww = clutter_actor_get_width(acttext);

                while (1)
                {
                        clutter_actor_set_x(acttext, wx);
                        wx--;
                        //if (wx<=-ww)    //because can not get width, only
set constants
                        if (wx<=-1200)
                                wx = 650;

                        usleep(50000);
                        //if have changed text , reload
                        if (osdtextchang)
                                break;

                }
        }

}

void vga_osdtext(gchar *str)
{
        //dbg("vga osd: %s \n", str);
        if (vgaosdtext==NULL)
                g_free(vgaosdtext);

        vgaosdtext = g_strdup(str);
        osdtextchang = TRUE;  //change osd text

}

static gint num=0;
static gboolean auto_set_text(gpointer data)
{
        sprintf((gchar*)data, "TEST OSD SCROLL word %d ...", num++);
        vga_osdtext((gchar*)data);
        g_print("auto_set_text: %s \n", data);
        return TRUE;

}

int main(int argc, char* argv[])
{

        GThread *threadid;
        gchar text[128];

        g_thread_init(NULL);
        clutter_threads_init();
        clutter_init(&argc, &argv);

        gStage = clutter_stage_get_default();
        clutter_actor_set_size(gStage, 650, 300);

        clutter_stage_set_color(CLUTTER_STAGE(gStage), &black);
        sprintf(text, "TEST OSD SCROLL ... ... ");
        acttext = clutter_text_new_full("Monospace 20", text, &white);
        clutter_text_set_single_line_mode(CLUTTER_TEXT(acttext), TRUE);
        clutter_container_add_actor(CLUTTER_CONTAINER(gStage), acttext);

        clutter_actor_show(gStage);

        g_timeout_add_seconds(2, auto_set_text, text);
        threadid = g_thread_create(vgaosd_left, (gpointer)text, FALSE,
NULL);

        clutter_main();

}



> The clutter API is not thread safe. You just can't do stuff like that.
>
> --
> Lionel
>
> On Sat, 2012-05-12 at 13:28 +0800, david.sale.75 wrote:
> > Hi, all:
> >
> > I write a test demo, use clutter_actor_get_width() get actor width, it
> > is correct if in the main thread call, but incorrect in then new thread.
> > used  clutter-1.6.20 and pango-1.28.4 and glib2-2.28.6
> >
> > Pango:ERROR:pango-layout.c:3743:pango_layout_check_lines: assertion
> > failed: (!layout->log_attrs) The code is what problem? have any error?
Tks.
> >
> > #include <glib.h>
> > #include <clutter/clutter.h>
> > ClutterActor *gStage, *acttext=NULL;
> > ClutterColor white = {255, 255, 255, 255}; ClutterColor black = {0, 0,
> > 0, 0};
> >
> > static gpointer test(gpointer data)
> > {
> > gfloat ww;
> > if (acttext)
> > clutter_container_remove_actor(CLUTTER_CONTAINER(gStage), acttext);
> > acttext = clutter_text_new_full("Monospace 20", (gchar*)data ,
> > &white); clutter_text_set_single_line_mode(CLUTTER_TEXT(acttext),
> > TRUE); clutter_container_add_actor(CLUTTER_CONTAINER(gStage),
> > acttext); clutter_actor_set_position(acttext, 100, 100);
> >
> > //why not get width
> > //if use clutter_actor_get_width(acttext);
> > //Pango:ERROR:pango-layout.c:3743:pango_layout_check_lines: assertion
> > failed: (!layout->log_attrs) clutter_actor_get_width(acttext);
> > g_print("act width: %d \n", acttext);
> >
> > }
> >
> > int main(int argc, char* argv[])
> > {
> > GThread *threadid;
> > gchar text[128];
> > g_thread_init(NULL);
> > clutter_threads_init();
> > clutter_init(&argc, &argv);
> >
> > gStage = clutter_stage_get_default();
> > clutter_actor_set_size(gStage, 600, 400);
> > clutter_stage_set_color(CLUTTER_STAGE(gStage), &black);
> > clutter_actor_show(gStage); sprintf(text, "TEST TEST TEST TEST");
> > threadid = g_thread_create(test, (gpointer)text, FALSE, NULL);
> >
> > clutter_main();
> >
> > }
> >
> _______________________________________________
> clutter-app-devel-list mailing list
> clutter-app-devel-list@clutter-project.org
> http://lists.clutter-project.org/listinfo/clutter-app-devel-list

_______________________________________________
clutter-app-devel-list mailing list
clutter-app-devel-list@clutter-project.org
http://lists.clutter-project.org/listinfo/clutter-app-devel-list
_______________________________________________
clutter-app-devel-list mailing list
clutter-app-devel-list@clutter-project.org
http://lists.clutter-project.org/listinfo/clutter-app-devel-list

Reply via email to