#include #include #include #include #include GtkWidget *embed = NULL; static ClutterActor * create_gtk_actor (GtkWidget *vbox) { GtkWidget *bin, *box; ClutterActor *gtk_actor; gtk_actor = gtk_clutter_actor_new (); bin = gtk_clutter_actor_get_widget (GTK_CLUTTER_ACTOR (gtk_actor)); box = gtk_vbox_new (FALSE, 0); gtk_box_pack_start (box, vbox, TRUE, TRUE, 0); gtk_widget_show_all (box); gtk_container_add (GTK_CONTAINER (bin), box); gtk_widget_show (bin); gtk_widget_show(vbox); return gtk_actor; } static void mmv_stage_size_notify_cb (ClutterActor *stage, GParamSpec *pspec, GtkWidget *embed) { gfloat width, height; clutter_actor_get_size (stage, &width, &height); gtk_widget_set_size_request (embed, width, height+10); } static void finished_loading_webkit (WebKitWebView *webkitwebview, WebKitWebFrame *arg1, ClutterActor *actor) { int h, w; gtk_widget_get_size_request (webkitwebview, &h, &w); printf("Finished %d %d\n", h, w); } static void add_clutter_embed (GtkWidget *box, char *url) { ClutterActor *stage; ClutterActor *expander; ClutterActor *glbody; GtkWidget *web_view; embed = gtk_clutter_embed_new (); gtk_widget_show (embed); gtk_box_pack_start (box, embed, TRUE, TRUE, 0); stage = gtk_clutter_embed_get_stage ((GtkClutterEmbed *)embed); expander = clutter_box_new (clutter_fixed_layout_new ()); clutter_container_add_actor ((ClutterContainer *)stage, expander); g_signal_connect (expander, "notify::height", G_CALLBACK (mmv_stage_size_notify_cb), embed); g_signal_connect (expander, "notify::width", G_CALLBACK (mmv_stage_size_notify_cb), embed); clutter_actor_set_position (expander, 1, 0); clutter_actor_show_all (expander); web_view = webkit_web_view_new(); g_signal_connect (web_view, "load-finished", G_CALLBACK(finished_loading_webkit), expander); //gtk_widget_set_size_request (web_view, 1024, 450); gtk_widget_show (web_view); glbody = create_gtk_actor (web_view); clutter_actor_set_position (glbody, 0, 0); //clutter_container_add_actor ((ClutterContainer *)expander, glbody); clutter_box_pack (CLUTTER_BOX (expander), glbody, "x-align", CLUTTER_BIN_ALIGNMENT_FILL, "y-align", CLUTTER_BIN_ALIGNMENT_FILL, NULL); webkit_web_view_load_uri(WEBKIT_WEB_VIEW(web_view), url); } static void button_click (GtkButton *button, GtkWidget *box) { if (embed!= NULL) gtk_widget_destroy (embed); add_clutter_embed (box, "http://debian.org"); } int main(int argc, char** argv) { GtkWidget* window; GtkWidget *box, *button, *scroll; g_thread_init(NULL); gtk_clutter_init(&argc, &argv); window = gtk_window_new(GTK_WINDOW_TOPLEVEL); scroll = gtk_scrolled_window_new (NULL, NULL); gtk_scrolled_window_set_policy (scroll, GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC); gtk_container_add(GTK_CONTAINER(window), scroll); box = gtk_vbox_new (FALSE, 0); gtk_scrolled_window_add_with_viewport (scroll, box); button = gtk_button_new_with_label ("Create/Destroy new widgets"); g_signal_connect (button, "clicked", G_CALLBACK(button_click), box); gtk_box_pack_start (box, button, FALSE, FALSE, 2); gtk_widget_show_all (box); add_clutter_embed (box, "http://debian.org/"); gtk_widget_show_all(window); gtk_widget_set_size_request (window, 1024, 500); gtk_main(); return 0; }