[SDL] SDL_WINDOWID: embedding SDL into gtkmm
Germán Diago
germandiago at gmail.com
Wed Oct 3 07:03:05 PDT 2007
2007/10/3, Daniel Ponsoda <armada3 at ono.com>:
>
>
> >>
> >>
> >> This code doesn't want to work, but don't know why. Can anyone see
> >> anything I can't?
> >>
>
>
> Your code is almost working, but you forget some things:
> (First of all, sorry to everyone for my bad english!, I'm spanish)
>
> 1. SDL_putenv seems not to work with the string returned by c_str().
> A new char* type string must be created. Then, c_str() string must be
> copied to it (ie with sprintf).
>
> 2. You don't call to do_sdl_stuff for refresh SDL. Graphics will not be
> dispayed.
> The black SDL screen will not show when it embeded into GTK window.
>
> 3. If you use the do_sdl_stuff function, you must put events in the SDL
> event queue to refresh graphics.
>
> 4. You not need to call g_assert in member "ejecutar". You can remove it.
>
> Here is my working code based on yours:
>
> #include <gtkmm.h>
> #include <gtkmm/socket.h>
> #include <glib.h>
> #include <SDL.h>
>
> #include <sstream>
> #include <iostream>
>
> using namespace std;
>
> class VentanaSDL {
> private:
> Gtk::Main main_;
> Gtk::Socket socket_;
> Gtk::Window window_;
> Gtk::VBox vbox_;
> SDL_Surface * superficie_;
>
> public:
>
> VentanaSDL(int argc, char ** argv) : main_(&argc, &argv), superficie_(0)
> {
> window_.set_title("Ventana SDL");
> socket_.set_size_request(320,200);
> window_.set_border_width(6);
> }
>
> bool bucleSDL(){
> SDL_Event event;
> SDL_Surface *display = this->superficie_;
> while ( SDL_PollEvent( &event ) ) {
> // Handle quit event, not sure if this will ever appear
> if ( event.type == SDL_QUIT ) return FALSE;
> // Handle clear userevent
> if ( event.type == SDL_USEREVENT && event.user.code == 0 ) {
> SDL_FillRect( display, NULL, 0 );
> SDL_Flip( display );
> }
>
> // Handle draw rect userevent
> if ( event.type == SDL_USEREVENT && event.user.code == 1 ) {
> SDL_Rect rect;
>
> rect.x = rand() % 320;
> rect.y = rand() % 200;
> rect.w = rand() % 100 + 10;
> rect.h = rand() % 100 + 10;
>
> SDL_FillRect( display, &rect, SDL_MapRGB( display->format,
> rand()%255, rand()%255, rand()%255 ) );
> SDL_Flip( display );
> }
> }
> // Forzar a que se dibuje un cuadrado nuevo
> event.type = SDL_USEREVENT;
> event.user.code = 1;
> SDL_PushEvent( &event );
>
> return true;
> }
>
> void clear(void) {
> /* Put clear userevent on queue */
> SDL_Event event;
> event.type = SDL_USEREVENT;
> event.user.code = 0;
> SDL_PushEvent( &event );
> }
>
> void ejecutar()
> {
> vbox_.pack_start(socket_, false, false);
>
> window_.add(vbox_);
> window_.show_all();
>
> std::stringstream sdlhack;
> sdlhack << "SDL_WINDOWID=" << socket_.get_id() << std::ends;
>
> char* winhack=new char[32];
> sprintf(winhack,sdlhack.str().c_str());
> SDL_putenv(winhack);
>
> if (SDL_Init(SDL_INIT_VIDEO))
> throw std::runtime_error("Error al inicializar la SDL");
> else{
> superficie_ = SDL_SetVideoMode(320, 200, 0, 0);
> clear();
> }
>
>
> Glib::signal_timeout().connect(sigc::mem_fun(*this,&VentanaSDL::bucleSDL),
> 5);
> // Use this for global (non class) functions:
> // Glib::signal_timeout().connect(sigc::ptr_fun(&bucleSDL), 100);
>
> main_.run(window_);
> }
>
>
> ~VentanaSDL()
> {
> if (superficie_) SDL_FreeSurface(superficie_);
> }
>
> SDL_Surface* obtSuperficie(){return superficie_;}
>
> };
>
>
>
> int main(int argc, char ** argv)
> {
> VentanaSDL app(argc, argv);
>
> app.ejecutar();
>
> }
> --
> View this message in context:
> http://www.nabble.com/SDL_WINDOWID%3A-embedding-SDL-into-gtkmm-tf4441255.html#a12938077
> Sent from the SDL mailing list archive at Nabble.com.
>
> _Thank you very much for your answer. Yo también soy español :-). Pleasant
> to see spanish people interested in programming.
>
______________________________________________
> SDL mailing list
> SDL at lists.libsdl.org
> http://lists.libsdl.org/listinfo.cgi/sdl-libsdl.org
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: http://lists.libsdl.org/pipermail/sdl-libsdl.org/attachments/20071003/08f6d7da/attachment.html
More information about the SDL
mailing list