In Gtk3, "draw" is used instead of the expose signal and gives you a cairo
context (at least for external api users). This document may
also answer some of the questions:
http://developer.gnome.org/gtk3/3.4/chap-drawing-model.html

I wouldn't expect being able to use the cairo context you are passed after
you give control back to the system. As John mentioned, use event queuing
(gtk_widget_queue_draw or gtk_widget_queue_draw_area) after your data model
(or offscreen image) is changed. This will essentially cause your draw to
be called.

You may be able to force an immediate redraw after you queue a draw event,
but I doubt this would be necessarily, see:
http://developer.gnome.org/gtk3/3.4/gtk3-General.html#gtk-events-pending
gtk_widget_queue_draw(widget);
while (gtk_events_pending ())
  gtk_main_iteration ();

Try using cairo->get_clip to retrieve the current clipping area of the
context in your draw callback, but I'm unsure about this.

If you are doing a lot of user interaction with annotations and what not,
another route might be to look into using the clutter api along with gtk:
http://www.clutter-project.org
I've recently started porting my app from being pure gtk/cairo based with
lots of viewport interaction to using clutter and I've been able to delete
a significant amount of code.

-Simon

On Fri, Apr 6, 2012 at 8:14 PM, <jcup...@gmail.com> wrote:

> Hi Roger,
>
> You should do all drawing in the expose handler and nowhere else.
> Don't do any direct drawing in your data hander, instead update your
> model and queue an expose event.
>
> On 7 April 2012 02:16, Roger Davis <r...@soest.hawaii.edu> wrote:
> > presumably this includes the GtkDrawingArea widget as well. If there is
> > documentation on exactly how this double-buffering works with regard to
> > GtkDrawingArea I would be greatly interested in seeing it to figure out
> if
>
> Here's how it works in gtk2, I think this bit hasn't changed much for gtk3:
>
> * an expose event comes in from X11
> * it gets added to the set of pending expose events on your drawing
> area -- gtk computes the minimal set of non-overlapping damage
> rectangles
> * when gtk feels the time is right to update your window, it allocates
> a backing pixmap just large enough to hold all damage
> * the backing pixmap is filled with the background colour for your widget
> * the expose handler is triggered, passing in the backing pixmap as the
> drawable
> * your expose handler draws to that --- you can fill the whole thing,
> or you can loop over the (possibly smaller) list of damage rects that
> make it up
> * gtk clips against the damage outline and writes the new pixels to the
> display
> * the temporary pixmap is deleted
>
> As a former xlib programmer I was slightly horrified when I head about
> all this, but it actually works pretty well on non-ancient machines.
> My program disables the double buffering and does its own thing for my
> main data display, since I don't want the "clear to background"
> behaviour, but I use it everywhere else.
>
> The discipline of only drawing in the expose handler is also helpful.
> It forces you to decouple drawing from updating which will make your
> performance degrade much more gracefully under load. Instead of
> suddenly getting lag when you run out of cycles, you'll just see a
> drop in the frame rate.
>
> John
> _______________________________________________
> gtk-app-devel-list mailing list
> gtk-app-devel-list@gnome.org
> http://mail.gnome.org/mailman/listinfo/gtk-app-devel-list
>
_______________________________________________
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