[Gtk-sharp-list] Drawing area misses expose events (lengthy)
Oliver D. Battenfeld
odb at mathematik.uni-marburg.de
Tue Jul 4 12:26:27 EDT 2006
Hello,
I'm having a bit of trouble with a (simple?) GTK#-based GUI application
which is supposed to continously display a graphical animation of sorts.
The application consists of a Gtk.Window to which I'm adding a MenuBar, some
Buttons and a custom class which is derived from DrawingArea.
Let me state the problem first: The animation works but it sporadically
freezes. When this happens, the Gtk.Window as a whole seems to freeze, e.g.
button hover animations don't work anymore. If I click on any of the
buttons (most of them don't have any functionality yet anyway) the
animation (and the Window as a whole) are revived.
I'm not a computer graphics expert so please bear with me: The basic idea
was to continously redraw a Pixmap which gets drawn to the DrawingArea's
Gdk.Window.
There are basically 2 methods which do the graphics stuff:
OnTimerTick is called when another class (which provides data about the
objects to be drawn onscreen) emits a timer event:
public OnTimerTick(double timestamp) {
// draw stuff to Pixmap
QueueDraw();
}
The other one is my expose event handler which is registered by the
constructor of my custom class:
private void OnExpose(System.Object o, ExposeEventArgs args) {
EventExpose exposeEvent = args.Event;
Rectangle exposeArea = exposeEvent.Area;
exposeEvent.Window.DrawDrawable(graphicsContext, pixmap, exposeArea.X, \
exposeArea.Y, exposeArea.X, exposeArea.Y, exposeArea.Width, \
exposeArea.Height);
args.RetVal = true;
}
This approach was inspired by the Pixbuf demo application which is part of
the gtk-sharp source distribution.
Now, my patented Debug.WriteLine debugging method :-) has revealed that IF
the animation works there is an expose event after a timer tick (which is
exactly what QueueDraw is supposed to do, AFAIK). If however the whole
thing hangs, I still get my timer ticks but the expose event handler
doesn't get called.
I'm afraid I can't tell you more without any other debugging methods. Any
ideas what could be going wrong here? My first idea (sorry, I'm new to both
GTK and GTK# - and C#, oh boy) was that the application gets swamped by too
many expose events but using larger timer intervals (like 10 times per
second or even once per second) doesn't make the problem go away (it still
happens at some point). Also, if that were the case shouldn't GTK just skip
some events and thus some frames then? (and not freeze the GUI elements?)
I can provide you with more details if necessary (or even the whole source
code, it's supposed to be GPLed anyway).
Thanks very much for any kind of help!
Bye,
Oliver
More information about the Gtk-sharp-list
mailing list