将SDL窗口嵌入GTKMM窗口

时间:2017-08-19 18:18:45

标签: c++ sdl-2 gtkmm3

请原谅一些代码。我担心这是必要的。我在SDKMM窗口中嵌入了一个SDL窗口,如下所示:

HelloWorld::HelloWorld()
: _button("Test") 
{
  set_border_width(10);
  add(_vbox);

  _button.signal_clicked().connect(sigc::mem_fun(*this, &HelloWorld::on_button_clicked));

  _vbox.add(_button);
  _vbox.add(_eventbox);
  _eventbox.add(_socket);

  _vbox.show_all();
}

void HelloWorld::on_button_clicked()
{
  int tx = 0, ty = 0, tw = 0, th = 0;
  _eventbox.get_window()->get_geometry(tx, ty, tw, th);

  SDL_Init(SDL_INIT_VIDEO);
  SDL_QuitSubSystem(SDL_INIT_EVENTS); // We need no events.

  // Plug SDL window inside GTKMM's socket.
  if ((_sdl_window = SDL_CreateWindowFrom((const void*)_socket.get_id())) == NULL) {
      std::cerr << "Window creation error.\n";
      exit(EXIT_FAILURE);
  }

  _renderer = SDL_CreateRenderer(_sdl_window, -1, SDL_RENDERER_SOFTWARE | SDL_RENDERER_TARGETTEXTURE);
  _texture  = SDL_CreateTexture(_renderer, SDL_PIXELFORMAT_RGB888, SDL_TEXTUREACCESS_TARGET, tw, th);

  // Draw red rectangle on texture.
  SDL_SetRenderTarget(_renderer, _texture);
  SDL_SetRenderDrawColor(_renderer, 255, 0, 0, 0);
  SDL_RenderClear(_renderer);

  // Blit it.
  SDL_SetRenderTarget(_renderer, NULL);
  SDL_RenderCopy(_renderer, _texture, NULL, NULL);
  SDL_UpdateWindowSurface(_sdl_window);
}

运行它会显示GTKMM窗口。按下按钮时,SDL窗口将显示在其下方,红色将填充纹理。

现在:如果鼠标没有在红色区域内移动,那么一切似乎都很好。但是如果我将鼠标移动到红色区域内,即在SDL窗口中移动,那么几秒钟后SDL窗口就会消失。

我看不出这种情况发生的明显原因。有人知道我的窗口嵌入可能是错误的,或者可能导致这种情况的原因吗?

0 个答案:

没有答案