//////////////////////////////////////////////////////////// // Headers //////////////////////////////////////////////////////////// #include "wxSFMLCanvas.hpp" // Platform-specific includes #ifdef __WXGTK__ #include #include #include #endif //////////////////////////////////////////////////////////// // Event table //////////////////////////////////////////////////////////// BEGIN_EVENT_TABLE(wxSFMLCanvas, wxControl) EVT_IDLE(wxSFMLCanvas::OnIdle) EVT_PAINT(wxSFMLCanvas::OnPaint) EVT_ERASE_BACKGROUND(wxSFMLCanvas::OnEraseBackground) END_EVENT_TABLE() //////////////////////////////////////////////////////////// /// Construct the wxSFMLCanvas //////////////////////////////////////////////////////////// wxSFMLCanvas::wxSFMLCanvas(wxWindow* parent, wxWindowID id, const wxPoint& position, const wxSize& size, long style) : wxControl(parent, id, position, size, style) { #ifdef __WXGTK__ // GTK implementation requires to go deeper to find the low-level X11 identifier of the widget gtk_widget_realize(m_wxwindow); gtk_widget_set_double_buffered(m_wxwindow, false); GdkWindow* window = GTK_PIZZA(m_wxwindow)->bin_window; XFlush(GDK_WINDOW_XDISPLAY(window)); sf::RenderWindow::Create(GDK_WINDOW_XWINDOW(window)); #else // Tested under Windows XP only (should work with X11 and other Windows versions - no idea about MacOS) sf::RenderWindow::Create(GetHandle()); #endif } //////////////////////////////////////////////////////////// /// Destructor //////////////////////////////////////////////////////////// wxSFMLCanvas::~wxSFMLCanvas() { // Nothing to do... } //////////////////////////////////////////////////////////// /// Notification for the derived class that moment is good /// for doing its update and drawing stuff //////////////////////////////////////////////////////////// void wxSFMLCanvas::OnUpdate() { // Nothing to do by default... } //////////////////////////////////////////////////////////// /// Called when the control is idle - we can refresh our /// SFML window //////////////////////////////////////////////////////////// void wxSFMLCanvas::OnIdle(wxIdleEvent&) { // Send a paint message when the control is idle, to ensure maximum framerate Refresh(); } //////////////////////////////////////////////////////////// /// Called when the control is repainted - we can display our /// SFML window //////////////////////////////////////////////////////////// void wxSFMLCanvas::OnPaint(wxPaintEvent&) { // Make sure the control is able to be repainted wxPaintDC dc(this); // Let the derived class do its specific stuff OnUpdate(); // Display on screen Display(); } //////////////////////////////////////////////////////////// /// Called when the control needs to draw its background //////////////////////////////////////////////////////////// void wxSFMLCanvas::OnEraseBackground(wxEraseEvent&) { // Don't do anything. We intercept this event in order to prevent the // parent class to draw the background before repainting the window, // which would cause some flickering }