You could put the Clear and Display code inside a "expose-event" window event and call gtk_widget_queue_draw on each frame.
I have tried it with "expose-event" too. First without gtk_widget_queue_draw(), but tried it now, too.
#include <gtk/gtk.h>
#include <gdk/gdkwin32.h>
#include <stdio.h>
#include <SFML/System.hpp>
#include <SFML/Window.hpp>
#include <SFML/Graphics.hpp>
sf::RenderWindow App;
void on_expose(GtkWidget *widget, GdkEventExpose *event, gpointer user)
{
printf("Expose\n");
App.Clear(sf::Color(0, 192, 255));
App.Display();
gtk_widget_queue_draw(widget);
}
void on_show(GtkWidget *widget, gpointer user)
{
printf("Show\n");
App.Clear(sf::Color(0, 192, 255));
App.Display();
}
int main(int argc, char **argv)
{
GtkWidget *window;
GtkWidget *area;
gtk_init(&argc, &argv);
window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
gtk_container_set_border_width(GTK_CONTAINER(window), 10);
area = gtk_drawing_area_new();
//gtk_drawing_area_size(GTK_DRAWING_AREA(area), 640, 480);
gtk_widget_set_size_request(area, 640, 480);
//gtk_widget_realize(area);
gtk_widget_set_double_buffered(area, false);
gtk_container_add(GTK_CONTAINER(window), area);
App.Create(GDK_WINDOW_HWND(area->window));
App.SetSize(640, 480);
g_signal_connect(window, "destroy", G_CALLBACK(gtk_main_quit), NULL);
//g_signal_connect(area, "frame-event", G_CALLBACK(on_frame), NULL);
g_signal_connect(area, "expose-event", G_CALLBACK(on_expose), NULL);
g_signal_connect(area, "show", G_CALLBACK(on_show), NULL);
gtk_widget_show_all(window);
gtk_main();
return 0;
}