0

原谅一些代码。恐怕这是必要的。我在 GTKMM 窗口中嵌入了一个 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 窗口就会消失。

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

4

0 回答 0