Gtk2+SDL

Hi all.

Anyone knows how to do SDL to work with GTK2?

I’ve seen gtk1 triks used with the example done by Sam.
But this is a little tricky.

I’ve seen GtkGlExt and looks great. Is there anything similar?

Is there any other more elegant solution?

Thank you.

Gonzalo Aguilar

Gonzalo, I will apologize up front for the length of my reply. I’ve
been pretty consumed with this issue lately.

Conceptually there seems to be 2 approaches to this: 1) GTK window devoted
to hosting an SDL frame buffer surface where something is happening all
the time. The gtk-demo at libsdl.org is a good example of this approach.
2) SDL hosted as a widget within a larger GTK widget framework. There are
not too many good examples of this. While I am sure that there are good
reasons behind the first approach, I am not sure what they are exactly.
If you want a window with a lot of drawing going on all the time, why not
just use SDL without the overhead of GTK…? But if you want to take
advantage of GTK’s widget set to build tools or an application that could
also leverage SDL’s media integration- well, it sounds like you are in the
market for an SDL widget.

Anyway, so assuming that you want to take the widget approach, here are a
couple of things to keep in mind:

The most popular options for getting SDL into a GTK widget are: using a
widget like GtkDrawingArea as a container; building an SDL widget as
either a derived or scratch built widget. I believe that the container
and derived widget approaches have problems with the expose event, and I
prefer the scratch built approach. For references see:

http://www.gtk.org/tutorial/ch-writingyourownwidgets.html

http://sourceforge.net/projects/gtksdl/

The SF gtksdl project is 100% unencumbered by documentation and has not
been updated for some time. However, it is useful as an example of a
scratch built SDL widget and demonstrates the window hack. It does not
handle the expose event very well.

SDL Window hack: You can (and must) explicitly tell SDL which window to
draw in by setting the SDL_WINDOWID environment variable. See:
http://www.libsdl.org/pipermail/sdl/2000-August/029488.html

Expose Event: See Sam’s post here:
http://www.libsdl.org/pipermail/sdl/2003-January/051813.html What you’ll
see happen is: your widget (or other SDL implementation code) will handle
the expose event and flip the surface, update the rectangles, etc; and
then GTK will apparently repaint the exposed area with the default widget
color. This happens because GTK tells GDK to clear the exposed area to
the default widget color before the expose event is handled. The problem
is that SDL will finish its updates in the expose event handler before the
GDK clear area finishes. Unfortunately calling XSync did not work in my
case. A suggested solution: do not set GDK_EXPOSURE_MASK in the SDL
widget window’s attributes.event_mask member. This means that your window
will not receive expose events at all. You will need to put your SDL
widget in a container (a frame, for example) and wrap the frame’s expose
event with a function that calls your SDL widget’s expose event. It would
be nice if you could tell GTK to ignore certain portions of your widget
window, but not setting the GDK_EXPOSURE_MASK attribute is pretty much
doing just that. Owen Taylor talks about an anti-expose here:
http://www.gtk.org/~otaylor/gtk/2.0/gdk-drawing.html See `Expose
Queueing and Invalid regions’. This could be a cool solution.

Finally, I am sorry to be long in explanation and short on code. Its like
a regular undergrad CS class around here! All of the discussion that I
could find on the GTK SDL issue seems to stop at Here's how you give SDL a window ID'' and ''I think you just put it in a GtkDrawingArea'' andMy
expose handler doesn’t work’’. Hopefully my notes are helpful. Please
consider them (and me) open to correction. My code is a mess, but if you
want to look at it, I’ll happily tar it up and send it to you.

Take care,
shawnOn Thu Dec 11, 2003 at 03:08:58PM +0100, Gonzalo Aguilar Delgado wrote:

Anyone knows how to do SDL to work with GTK2?

Thank you a lot Shawn!!!

Sorry for my late answer… I’ve messed up my mail…

Your explanation really clarifies my situation. It helped me a lot.
This is the kind of answers (full of refs and posible solutions) that
really helps.

I think I’ll write a GTK2 widget when I get time. The In and Outs are
still hiden from my point of view. But I’ll try to do my bests. Don’t
know what I really need…

My program will be a full 3D-2D GPS Mapping suite built from gpsdrive
sources with SDL as backend (I tried with gtk alone and is really
slooooooow). But there are a lot of things I have to resolve first.

Thanks again.
Gonzalo Aguilar> On Thu Dec 11, 2003 at 03:08:58PM +0100, Gonzalo Aguilar Delgado wrote:

Anyone knows how to do SDL to work with GTK2?

Gonzalo, I will apologize up front for the length of my reply. I’ve
been pretty consumed with this issue lately.

Conceptually there seems to be 2 approaches to this: 1) GTK window devoted
to hosting an SDL frame buffer surface where something is happening all
the time. The gtk-demo at libsdl.org is a good example of this approach.
2) SDL hosted as a widget within a larger GTK widget framework. There are
not too many good examples of this. While I am sure that there are good
reasons behind the first approach, I am not sure what they are exactly.
If you want a window with a lot of drawing going on all the time, why not
just use SDL without the overhead of GTK…? But if you want to take
advantage of GTK’s widget set to build tools or an application that could
also leverage SDL’s media integration- well, it sounds like you are in the
market for an SDL widget.

Anyway, so assuming that you want to take the widget approach, here are a
couple of things to keep in mind:

The most popular options for getting SDL into a GTK widget are: using a
widget like GtkDrawingArea as a container; building an SDL widget as
either a derived or scratch built widget. I believe that the container
and derived widget approaches have problems with the expose event, and I
prefer the scratch built approach. For references see:

http://www.gtk.org/tutorial/ch-writingyourownwidgets.html

http://sourceforge.net/projects/gtksdl/

The SF gtksdl project is 100% unencumbered by documentation and has not
been updated for some time. However, it is useful as an example of a
scratch built SDL widget and demonstrates the window hack. It does not
handle the expose event very well.

SDL Window hack: You can (and must) explicitly tell SDL which window to
draw in by setting the SDL_WINDOWID environment variable. See:
http://www.libsdl.org/pipermail/sdl/2000-August/029488.html

Expose Event: See Sam’s post here:
http://www.libsdl.org/pipermail/sdl/2003-January/051813.html What you’ll
see happen is: your widget (or other SDL implementation code) will handle
the expose event and flip the surface, update the rectangles, etc; and
then GTK will apparently repaint the exposed area with the default widget
color. This happens because GTK tells GDK to clear the exposed area to
the default widget color before the expose event is handled. The problem
is that SDL will finish its updates in the expose event handler before the
GDK clear area finishes. Unfortunately calling XSync did not work in my
case. A suggested solution: do not set GDK_EXPOSURE_MASK in the SDL
widget window’s attributes.event_mask member. This means that your window
will not receive expose events at all. You will need to put your SDL
widget in a container (a frame, for example) and wrap the frame’s expose
event with a function that calls your SDL widget’s expose event. It would
be nice if you could tell GTK to ignore certain portions of your widget
window, but not setting the GDK_EXPOSURE_MASK attribute is pretty much
doing just that. Owen Taylor talks about an anti-expose here:
http://www.gtk.org/~otaylor/gtk/2.0/gdk-drawing.html See `Expose
Queueing and Invalid regions’. This could be a cool solution.

Finally, I am sorry to be long in explanation and short on code. Its like
a regular undergrad CS class around here! All of the discussion that I
could find on the GTK SDL issue seems to stop at Here's how you give SDL a window ID'' and ''I think you just put it in a GtkDrawingArea'' andMy
expose handler doesn’t work’’. Hopefully my notes are helpful. Please
consider them (and me) open to correction. My code is a mess, but if you
want to look at it, I’ll happily tar it up and send it to you.

Take care,
shawn


SDL mailing list
SDL at libsdl.org
http://www.libsdl.org/mailman/listinfo/sdl