#include #define _(x) x static void fake_expose_widget (GtkWidget *widget, GdkPixmap *pixmap) { GdkWindow *tmp_window; GdkEventExpose event; event.type = GDK_EXPOSE; event.window = pixmap; event.send_event = FALSE; event.area = widget->allocation; event.region = NULL; event.count = 0; tmp_window = widget->window; widget->window = pixmap; gtk_widget_send_expose (widget, (GdkEvent *) &event); widget->window = tmp_window; } static GdkPixbuf * create_image (void) { GtkWidget *window; GtkWidget *vbox; GtkWidget *menubar; GtkWidget *file_menu_item; GtkWidget *edit_menu_item; GtkWidget *view_menu_item; GtkWidget *help_menu_item; GtkWidget *swindow; GtkWidget *text_view; GtkWidget *statusbar; GtkRequisition requisition; GtkAllocation allocation; GdkPixmap *pixmap; GdkPixbuf *pixbuf; GdkVisual *visual; window = gtk_window_new (GTK_WINDOW_TOPLEVEL); vbox = gtk_vbox_new (FALSE, 0); gtk_container_add (GTK_CONTAINER (window), vbox); menubar = gtk_menu_bar_new (); file_menu_item = gtk_menu_item_new_with_mnemonic (_("_File")); edit_menu_item = gtk_menu_item_new_with_mnemonic (_("_Edit")); view_menu_item = gtk_menu_item_new_with_mnemonic (_("_View")); help_menu_item = gtk_menu_item_new_with_mnemonic (_("_Help")); gtk_menu_shell_append (GTK_MENU_SHELL (menubar), file_menu_item); gtk_menu_shell_append (GTK_MENU_SHELL (menubar), edit_menu_item); gtk_menu_shell_append (GTK_MENU_SHELL (menubar), view_menu_item); gtk_menu_shell_append (GTK_MENU_SHELL (menubar), help_menu_item); gtk_box_pack_start (GTK_BOX (vbox), menubar, FALSE, FALSE, 0); swindow = gtk_scrolled_window_new (NULL, NULL); gtk_scrolled_window_set_shadow_type (GTK_SCROLLED_WINDOW (swindow), GTK_SHADOW_IN); gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (swindow), GTK_POLICY_ALWAYS, GTK_POLICY_ALWAYS); text_view = gtk_text_view_new (); gtk_container_add (GTK_CONTAINER (swindow), text_view); gtk_box_pack_start (GTK_BOX (vbox), swindow, TRUE, TRUE, 0); statusbar = gtk_statusbar_new (); gtk_box_pack_start (GTK_BOX (vbox), statusbar, FALSE, FALSE, 0); gtk_window_set_default_size (GTK_WINDOW (window), 300, 200); gtk_widget_show_all (window); gtk_widget_size_request (window, &requisition); allocation.x = 0; allocation.y = 0; allocation.width = 300; allocation.height = 200; gtk_widget_size_allocate (window, &allocation); gtk_widget_size_request (window, &requisition); g_print ("requisition: %d %d\n", requisition.width, requisition.height); /* Create a pixmap */ visual = gtk_widget_get_visual (window); pixmap = gdk_pixmap_new (NULL, 300, 200, gdk_visual_get_best_depth()); gdk_drawable_set_colormap (GDK_DRAWABLE (pixmap), gtk_widget_get_colormap (window)); /* Draw the window */ gtk_widget_ensure_style (window); fake_expose_widget (window, pixmap); fake_expose_widget (menubar, pixmap); fake_expose_widget (GTK_BIN (file_menu_item)->child, pixmap); fake_expose_widget (GTK_BIN (edit_menu_item)->child, pixmap); fake_expose_widget (GTK_BIN (view_menu_item)->child, pixmap); fake_expose_widget (GTK_BIN (help_menu_item)->child, pixmap); fake_expose_widget (swindow, pixmap); fake_expose_widget (GTK_SCROLLED_WINDOW (swindow)->hscrollbar, pixmap); fake_expose_widget (GTK_SCROLLED_WINDOW (swindow)->vscrollbar, pixmap); fake_expose_widget (text_view, pixmap); fake_expose_widget (statusbar, pixmap); pixbuf = gdk_pixbuf_get_from_drawable (NULL, pixmap, NULL, 0, 0, 0, 0, 300, 200); gdk_pixbuf_save (pixbuf, "out.png", "png", NULL, NULL); return pixbuf; } int main (int argc, char *argv[]) { GdkPixbuf *retval; gtk_init (&argc, &argv); retval = create_image (); return 0; }