#include #include #include #include #include /* 1 == Put everything inside its own X window. */ static int use_fixed = 1; /* 0 == Shut off GTK+ double buffering on every widget. */ static int dbuffer = 1; /* 0 == Shut off redraw_on_allocate on every widget. */ static int roa = 0; static void fillGrid (GtkWidget *toFill, int rows, int cols, int depth) { GtkWidget *frame; GtkWidget *vbox; int row, col; vbox = gtk_vbox_new (FALSE, 0); if (!dbuffer) gtk_widget_set_double_buffered (vbox, FALSE); if (!roa) gtk_widget_set_redraw_on_allocate (vbox, FALSE); gtk_container_add (GTK_CONTAINER (toFill), vbox); for (row = 0; row < rows; row++) { GtkWidget *hbox = gtk_hbox_new (FALSE, 0); if (!dbuffer) gtk_widget_set_double_buffered (hbox, FALSE); if (!roa) gtk_widget_set_redraw_on_allocate (hbox, FALSE); gtk_container_add (GTK_CONTAINER (vbox), hbox); for (col = 0; col < cols; col++) { frame = gtk_frame_new (0); if (!dbuffer) gtk_widget_set_double_buffered (frame, FALSE); if (!roa) gtk_widget_set_redraw_on_allocate (frame, FALSE); if (use_fixed) { GtkWidget *fixed = gtk_fixed_new (); if (!dbuffer) gtk_widget_set_double_buffered (fixed, FALSE); if (!roa) gtk_widget_set_redraw_on_allocate (fixed, FALSE); gtk_fixed_set_has_window (GTK_FIXED (fixed), TRUE); gtk_fixed_put (GTK_FIXED (fixed), frame, 0, 0); gtk_container_add (GTK_CONTAINER (hbox), fixed); } else { gtk_container_add (GTK_CONTAINER (hbox), frame); } gtk_frame_set_shadow_type (GTK_FRAME (frame), GTK_SHADOW_ETCHED_IN); if (depth == 0) { GtkWidget *label = gtk_label_new ("tx"); if (!dbuffer) gtk_widget_set_double_buffered (label, FALSE); if (!roa) gtk_widget_set_redraw_on_allocate (label, FALSE); if (use_fixed) { GtkWidget *fixed = gtk_fixed_new (); if (!dbuffer) gtk_widget_set_double_buffered (fixed, FALSE); if (!roa) gtk_widget_set_redraw_on_allocate (fixed, FALSE); gtk_fixed_set_has_window (GTK_FIXED (fixed), TRUE); gtk_fixed_put (GTK_FIXED (fixed), label, 0, 0); gtk_container_add (GTK_CONTAINER (frame), fixed); } else { gtk_container_add (GTK_CONTAINER (frame), label); } } else { fillGrid (frame, rows, cols, depth - 1); } } } } int main (int argc, char **argv) { GtkWidget *window; GtkWidget *fixed; GtkWidget *vbox; gtk_init (&argc, &argv); // gdk_window_set_debug_updates (TRUE); window = gtk_window_new (GTK_WINDOW_TOPLEVEL); if (!dbuffer) gtk_widget_set_double_buffered (window, FALSE); if (!roa) gtk_widget_set_redraw_on_allocate (window, FALSE); fixed = gtk_fixed_new (); if (!dbuffer) gtk_widget_set_double_buffered (fixed, FALSE); if (!roa) gtk_widget_set_redraw_on_allocate (fixed, FALSE); vbox = gtk_vbox_new (FALSE, 0); if (!dbuffer) gtk_widget_set_double_buffered (vbox, FALSE); if (!roa) gtk_widget_set_redraw_on_allocate (vbox, FALSE); fillGrid (vbox, 2, 2, 4); gtk_fixed_put (GTK_FIXED (fixed), vbox, 0, 0); gtk_container_add (GTK_CONTAINER (window), fixed); g_signal_connect (G_OBJECT (window), "destroy", G_CALLBACK (gtk_main_quit), NULL); gtk_widget_show_all (window); gtk_widget_set_size_request (fixed, 1, 1); while (gtk_events_pending ()) gtk_main_iteration (); // or do gtk_main here... return 0; }