pankaj.chikhale wrote:
> 
> 
> there is memory leak problem with your mymarqueetest code will u plz tell
> me how to remove that memory leak
> plz conact me or reply on pankaj.chikh...@euifone.com its urgent plz reply
> me as soon as possible
> 
> 
> Micah Carrick wrote:
>> 
>> In the book "Foundations of GTK+ Development", there is a chapter on 
>> creating custom widgets in which a marquee widget is created (which 
>> scrolls text across the widget).
>> 
>> You could take a look at the source code from the book available at 
>> www.gtkbook.com
>> 
>> - Micah Carrick
>> 
>>   Developer - http://www.micahcarrick.com
>>   GTK+ Forums - http://www.gtkforums.com
>> 
>> 
>> 
>> Tuvok wrote:
>>> Hi,
>>>
>>> What I need to do, is to make a bar with scrolling text inside it (like
>>> the bars with stock prices on tv).
>>>
>>> I've tried two methods, both of which are very slow. I've done it with
>>> Canvas and with Cairo. Below follows code.
>>>
>>> Did I do something wrong? Is there a way to make this code run faster?
>>> Should I use some different libraries for it?
>>>
>>>
>>> Rendering 4 such windows (1680x50) takes up 40-50% on both cores (AMD
>>> X2, 2.4GHz).
>>>
>>>
>>>
>>> Method I: Canvas
>>>
>>> The rendering part of code:
>>>
>>>    GtkWidget *canvasWdg;
>>>    GnomeCanvasItem *text;
>>>    GnomeCanvasGroup *rootGroup;
>>>
>>>    ifstream in(filename);
>>>    string textLine;
>>>    getline(in, textLine);
>>>
>>>    canvasWdg = gnome_canvas_new();
>>>
>>>    gtk_container_add(GTK_CONTAINER(window), canvasWdg);
>>>
>>>    gnome_canvas_set_scroll_region(GNOME_CANVAS(canvasWdg), 0.0, 0.0,
>>> width*1.0,
>>>                                   height*1.0);
>>>    rootGroup = gnome_canvas_root(GNOME_CANVAS(canvasWdg));
>>>
>>>    text = gnome_canvas_item_new(rootGroup, GNOME_TYPE_CANVAS_TEXT, "x",
>>>                             0.0, "y", 0.0, "text", textLine.c_str(),
>>>                                 "anchor", GTK_ANCHOR_NW,
>>>                                 "fill_color", "white", "size",
>>>                                 (int)((height*0.7)*1000),
>>>                                 "size-set", TRUE, NULL);
>>>
>>>    double x1, x2, y1, y2;
>>>    gnome_canvas_item_get_bounds(GNOME_CANVAS_ITEM(text), &x1, &y1, &x2,
>>> &y2);
>>> // align the text in window:
>>>    gnome_canvas_item_move(GNOME_CANVAS_ITEM(text), 1.0*width,
>>>                           ((height*1.0)/2-(y2-y1)/2));
>>>
>>>    g_timeout_add(40, moveText, text);
>>>
>>>    gtk_widget_show_all(window);
>>>
>>> and the timeout function:
>>>
>>> gboolean moveText(void *text)
>>> {
>>>
>>>    gnome_canvas_item_move(GNOME_CANVAS_ITEM((GnomeCanvasItem*)text),
>>> -2.0, 0.0);
>>>
>>>    return TRUE;
>>> }
>>>
>>>
>>>
>>> Method II: Cairo
>>>
>>> I've made a Gtk widget, which draws with cairo on expose event; I'll put
>>> here only the expose function:
>>>
>>> static gboolean mdk_text_scroller_expose(GtkWidget *textScroller,
>>> GdkEventExpose *event)
>>> {
>>>
>>>    MdkTextScroller *ts = MDK_TEXT_SCROLLER(textScroller);
>>>
>>>
>>>    cairo_t *cr;
>>>
>>>    cr = gdk_cairo_create(textScroller->window);
>>>                                                                             
>>>                                                    
>>>
>>>     gdk_cairo_region(cr,
>>> event->region);                                                             
>>>                                                                  
>>>
>>> cairo_clip(cr);                                                             
>>>                                                                             
>>>           
>>>
>>>
>>>    cairo_select_font_face(cr, "Sans", CAIRO_FONT_SLANT_NORMAL,
>>> CAIRO_FONT_WEIGHT_NORMAL);
>>>
>>>    cairo_set_font_size(cr, ts->size);
>>>    cairo_move_to(cr, ts->x+ts->xOffset, ts->y+ts->yOffset);
>>>    cairo_set_source_rgb(cr, 1.0, 1.0, 1.0);
>>>    cairo_show_text(cr, ts->text);
>>>
>>>    if (ts->width == 0 || ts->height == 0)
>>>    {
>>>       cairo_text_extents_t ext;
>>>       cairo_text_extents(cr, ts->text, &ext);
>>>       ts->width = ext.width;
>>>       ts->height = ext.height;
>>>    }
>>>
>>>    if (ts->width+ts->xOffset+100 < 0)
>>>    {
>>>       cairo_move_to(cr, ts->x+ts->xOffset+ts->width+100, ts->y
>>> +ts->yOffset);
>>>       cairo_show_text(cr, ts->text);
>>>    }
>>>
>>>    if (ts->x+ts->xOffset+ts->width < 0)
>>>    {
>>>       ts->xOffset=ts->xOffset+ts->width+100;
>>>    }
>>>
>>>
>>>    cairo_stroke(cr);
>>>
>>>    cairo_destroy(cr);
>>> }
>>>
>>> it's then redrawn with the same timeout call:
>>>
>>> gboolean moveText(void *text)
>>> {
>>>    mdk_change_text_position((GtkWidget*)text, -1, 0);
>>>    gtk_widget_queue_draw((GtkWidget*)text);
>>>
>>>    return TRUE;
>>> }
>>>
>>>
>>>   
>> _______________________________________________
>> gtk-app-devel-list mailing list
>> gtk-app-devel-list@gnome.org
>> http://mail.gnome.org/mailman/listinfo/gtk-app-devel-list
>> 
>> 
> 
> 

-- 
View this message in context: 
http://www.nabble.com/Scrolling-text-in-Gtk-tp17471895p25477596.html
Sent from the Gtk+ - Apps Dev mailing list archive at Nabble.com.

_______________________________________________
gtk-app-devel-list mailing list
gtk-app-devel-list@gnome.org
http://mail.gnome.org/mailman/listinfo/gtk-app-devel-list

Reply via email to