]> Pileus Git - ~andy/gtk/blobdiff - tests/testgtk.c
Add a separate keybinding signal for activating links
[~andy/gtk] / tests / testgtk.c
index 1c0dde58e0e5edb7be3121199e31664f7e9aaef6..075bb8eb10c4e2c30f339f8353f37628005b04a3 100644 (file)
@@ -26,7 +26,7 @@
 
 #undef GTK_DISABLE_DEPRECATED
 
-#include <config.h>
+#include "config.h"
 
 #undef G_LOG_DOMAIN
 
@@ -1739,7 +1739,7 @@ create_statusbar (GtkWidget *widget)
                        G_CALLBACK (statusbar_popped),
                        NULL);
 
-      button = gtk_widget_new (gtk_button_get_type (),
+      button = g_object_new (gtk_button_get_type (),
                               "label", "push something",
                               "visible", TRUE,
                               "parent", box2,
@@ -1748,7 +1748,7 @@ create_statusbar (GtkWidget *widget)
                        "signal::clicked", statusbar_push, statusbar,
                        NULL);
 
-      button = g_object_connect (gtk_widget_new (gtk_button_get_type (),
+      button = g_object_connect (g_object_new (gtk_button_get_type (),
                                                 "label", "pop",
                                                 "visible", TRUE,
                                                 "parent", box2,
@@ -1756,7 +1756,7 @@ create_statusbar (GtkWidget *widget)
                                 "signal_after::clicked", statusbar_pop, statusbar,
                                 NULL);
 
-      button = g_object_connect (gtk_widget_new (gtk_button_get_type (),
+      button = g_object_connect (g_object_new (gtk_button_get_type (),
                                                 "label", "steal #4",
                                                 "visible", TRUE,
                                                 "parent", box2,
@@ -1764,7 +1764,7 @@ create_statusbar (GtkWidget *widget)
                                 "signal_after::clicked", statusbar_steal, statusbar,
                                 NULL);
 
-      button = g_object_connect (gtk_widget_new (gtk_button_get_type (),
+      button = g_object_connect (g_object_new (gtk_button_get_type (),
                                                 "label", "test contexts",
                                                 "visible", TRUE,
                                                 "parent", box2,
@@ -1772,7 +1772,7 @@ create_statusbar (GtkWidget *widget)
                                 "swapped_signal_after::clicked", statusbar_contexts, statusbar,
                                 NULL);
 
-      button = g_object_connect (gtk_widget_new (gtk_button_get_type (),
+      button = g_object_connect (g_object_new (gtk_button_get_type (),
                                                 "label", "push something long",
                                                 "visible", TRUE,
                                                 "parent", box2,
@@ -2401,6 +2401,7 @@ static void
 create_gridded_geometry (GtkWidget *widget)
 {
   static GtkWidget *window = NULL;
+  gpointer window_ptr;
   GtkWidget *entry;
   GtkWidget *label;
 
@@ -2424,7 +2425,8 @@ create_gridded_geometry (GtkWidget *widget)
 
       g_signal_connect (window, "response",
                        G_CALLBACK (gridded_geometry_response), entry);
-      g_object_add_weak_pointer (G_OBJECT (window), (gpointer) &window);
+      window_ptr = &window;
+      g_object_add_weak_pointer (G_OBJECT (window), window_ptr);
 
       gtk_widget_show_all (window);
     }
@@ -2847,7 +2849,7 @@ create_get_image (GtkWidget *widget)
 
       vbox = gtk_vbox_new (FALSE, 3);
 
-      snap = gtk_widget_new (GTK_TYPE_IMAGE, NULL);
+      snap = g_object_new (GTK_TYPE_IMAGE, NULL);
 
       gid->snap = snap;
 
@@ -2959,6 +2961,45 @@ create_selectable_control (GtkWidget *widget)
   return button;
 }
 
+static void
+dialog_response (GtkWidget *dialog, gint response_id, GtkLabel *label)
+{
+  const gchar *text;
+
+  gtk_widget_destroy (dialog);
+
+  text = "Some <a href=\"http://en.wikipedia.org/wiki/Text\" title=\"plain text\">text</a> may be marked up\n"
+         "as hyperlinks, which can be clicked\n"
+         "or activated via <a href=\"keynav\">keynav</a>.\n"
+         "The links remain the same.";
+  gtk_label_set_markup (label, text);
+}
+
+static gboolean
+activate_link (GtkWidget *label, const gchar *uri, gpointer data)
+{
+  if (g_strcmp0 (uri, "keynav") == 0)
+    {
+      GtkWidget *dialog;
+
+      dialog = gtk_message_dialog_new_with_markup (GTK_WINDOW (gtk_widget_get_toplevel (label)),
+                                       GTK_DIALOG_DESTROY_WITH_PARENT,
+                                       GTK_MESSAGE_INFO,
+                                       GTK_BUTTONS_OK,
+                                       "The term <i>keynav</i> is a shorthand for "
+                                       "keyboard navigation and refers to the process of using a program "
+                                       "(exclusively) via keyboard input.");
+
+      gtk_window_present (GTK_WINDOW (dialog));
+
+      g_signal_connect (dialog, "response", G_CALLBACK (dialog_response), label);
+
+      return TRUE;
+    }
+
+  return FALSE;
+}
+
 void create_labels (GtkWidget *widget)
 {
   static GtkWidget *window = NULL;
@@ -3046,6 +3087,15 @@ void create_labels (GtkWidget *widget)
       gtk_container_add (GTK_CONTAINER (frame), label);
       gtk_box_pack_start (GTK_BOX (vbox), frame, FALSE, FALSE, 0);
 
+      frame = gtk_frame_new ("Links in a label");
+      label = gtk_label_new ("Some <a href=\"http://en.wikipedia.org/wiki/Text\" title=\"plain text\">text</a> may be marked up\n"
+                             "as hyperlinks, which can be clicked\n"
+                             "or activated via <a href=\"keynav\">keynav</a>");
+      gtk_label_set_use_markup (GTK_LABEL (label), TRUE);
+      gtk_container_add (GTK_CONTAINER (frame), label);
+      gtk_box_pack_start (GTK_BOX (vbox), frame, FALSE, FALSE, 0);
+      g_signal_connect (label, "activate-link", G_CALLBACK (activate_link), NULL);
+
       vbox = gtk_vbox_new (FALSE, 5);
       gtk_box_pack_start (GTK_BOX (hbox), vbox, FALSE, FALSE, 0);
       frame = gtk_frame_new ("Line wrapped label");
@@ -3656,7 +3706,7 @@ create_saved_position (GtkWidget *widget)
       GtkWidget *label;
       GtkWidget *any;
 
-      window = g_object_connect (gtk_widget_new (GTK_TYPE_WINDOW,
+      window = g_object_connect (g_object_new (GTK_TYPE_WINDOW,
                                                 "type", GTK_WINDOW_TOPLEVEL,
                                                 "title", "Saved Position",
                                                 NULL),
@@ -3678,13 +3728,13 @@ create_saved_position (GtkWidget *widget)
       gtk_container_add (GTK_CONTAINER (window), main_vbox);
 
       vbox =
-       gtk_widget_new (gtk_vbox_get_type (),
+       g_object_new (gtk_vbox_get_type (),
                        "GtkBox::homogeneous", FALSE,
                        "GtkBox::spacing", 5,
                        "GtkContainer::border_width", 10,
                        "GtkWidget::parent", main_vbox,
                        "GtkWidget::visible", TRUE,
-                       "child", g_object_connect (gtk_widget_new (GTK_TYPE_TOGGLE_BUTTON,
+                       "child", g_object_connect (g_object_new (GTK_TYPE_TOGGLE_BUTTON,
                                                                   "label", "Stop Events",
                                                                   "active", FALSE,
                                                                   "visible", TRUE,
@@ -3718,7 +3768,7 @@ create_saved_position (GtkWidget *widget)
       g_object_set_data (G_OBJECT (window), "y", y_label);
 
       any =
-       gtk_widget_new (gtk_hseparator_get_type (),
+       g_object_new (gtk_hseparator_get_type (),
                        "GtkWidget::visible", TRUE,
                        NULL);
       gtk_box_pack_start (GTK_BOX (main_vbox), any, FALSE, TRUE, 0);
@@ -3874,7 +3924,7 @@ create_tooltips (GtkWidget *widget)
   if (!window)
     {
       window =
-       gtk_widget_new (gtk_window_get_type (),
+       g_object_new (gtk_window_get_type (),
                        "GtkWindow::type", GTK_WINDOW_TOPLEVEL,
                        "GtkContainer::border_width", 0,
                        "GtkWindow::title", "Tooltips",
@@ -3926,7 +3976,7 @@ create_tooltips (GtkWidget *widget)
                            "Hi msw! ;)");
 
       box3 =
-       gtk_widget_new (gtk_vbox_get_type (),
+       g_object_new (gtk_vbox_get_type (),
                        "homogeneous", FALSE,
                        "spacing", 5,
                        "border_width", 5,
@@ -3936,7 +3986,7 @@ create_tooltips (GtkWidget *widget)
       tips_query = gtk_tips_query_new ();
 
       button =
-       gtk_widget_new (gtk_button_get_type (),
+       g_object_new (gtk_button_get_type (),
                        "label", "[?]",
                        "visible", TRUE,
                        "parent", box3,
@@ -3960,7 +4010,7 @@ create_tooltips (GtkWidget *widget)
                    "caller", button,
                    NULL);
       
-      frame = gtk_widget_new (gtk_frame_get_type (),
+      frame = g_object_new (gtk_frame_get_type (),
                              "label", "ToolTips Inspector",
                              "label_xalign", (double) 0.5,
                              "border_width", 0,
@@ -4779,6 +4829,7 @@ static void
 create_key_lookup (GtkWidget *widget)
 {
   static GtkWidget *window = NULL;
+  gpointer window_ptr;
 
   if (!window)
     {
@@ -4826,8 +4877,9 @@ create_key_lookup (GtkWidget *widget)
       gtk_box_pack_start (GTK_BOX (GTK_DIALOG (window)->vbox), button, FALSE, FALSE, 0);
       button = accel_button_new (accel_group, "Button 15", "<Shift><Mod4>b");
       gtk_box_pack_start (GTK_BOX (GTK_DIALOG (window)->vbox), button, FALSE, FALSE, 0);
-      
-      g_object_add_weak_pointer (G_OBJECT (window), (gpointer) &window);
+
+      window_ptr = &window;
+      g_object_add_weak_pointer (G_OBJECT (window), window_ptr);
       g_signal_connect (window, "response", G_CALLBACK (gtk_object_destroy), NULL);
 
       gtk_widget_show_all (window);
@@ -5189,6 +5241,65 @@ entry_toggle_sensitive (GtkWidget *checkbutton,
    gtk_widget_set_sensitive (entry, GTK_TOGGLE_BUTTON(checkbutton)->active);
 }
 
+static gboolean
+entry_progress_timeout (gpointer data)
+{
+  if (GPOINTER_TO_INT (g_object_get_data (G_OBJECT (data), "progress-pulse")))
+    {
+      gtk_entry_progress_pulse (GTK_ENTRY (data));
+    }
+  else
+    {
+      gdouble fraction;
+
+      fraction = gtk_entry_get_progress_fraction (GTK_ENTRY (data));
+
+      fraction += 0.05;
+      if (fraction > 1.0001)
+        fraction = 0.0;
+
+      gtk_entry_set_progress_fraction (GTK_ENTRY (data), fraction);
+    }
+
+  return TRUE;
+}
+
+static void
+entry_remove_timeout (gpointer data)
+{
+  g_source_remove (GPOINTER_TO_UINT (data));
+}
+
+static void
+entry_toggle_progress (GtkWidget *checkbutton,
+                       GtkWidget *entry)
+{
+  if (GTK_TOGGLE_BUTTON (checkbutton)->active)
+    {
+      guint timeout = gdk_threads_add_timeout (100,
+                                               entry_progress_timeout,
+                                               entry);
+      g_object_set_data_full (G_OBJECT (entry), "timeout-id",
+                              GUINT_TO_POINTER (timeout),
+                              entry_remove_timeout);
+    }
+  else
+    {
+      g_object_set_data (G_OBJECT (entry), "timeout-id",
+                         GUINT_TO_POINTER (0));
+
+      gtk_entry_set_progress_fraction (GTK_ENTRY (entry), 0.0);
+    }
+}
+
+static void
+entry_toggle_pulse (GtkWidget *checkbutton,
+                    GtkWidget *entry)
+{
+  g_object_set_data (G_OBJECT (entry), "progress-pulse",
+                     GINT_TO_POINTER (GTK_TOGGLE_BUTTON (checkbutton)->active));
+}
+
 static void
 entry_props_clicked (GtkWidget *button,
                     GObject   *entry)
@@ -5207,6 +5318,7 @@ create_entry (GtkWidget *widget)
   GtkWidget *hbox;
   GtkWidget *has_frame_check;
   GtkWidget *sensitive_check;
+  GtkWidget *progress_check;
   GtkWidget *entry, *cb;
   GtkWidget *button;
   GtkWidget *separator;
@@ -5277,7 +5389,17 @@ create_entry (GtkWidget *widget)
       g_signal_connect (has_frame_check, "toggled",
                        G_CALLBACK (entry_toggle_frame), entry);
       gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (has_frame_check), TRUE);
-      
+
+      progress_check = gtk_check_button_new_with_label("Show Progress");
+      gtk_box_pack_start (GTK_BOX (box2), progress_check, FALSE, TRUE, 0);
+      g_signal_connect (progress_check, "toggled",
+                       G_CALLBACK (entry_toggle_progress), entry);
+
+      progress_check = gtk_check_button_new_with_label("Pulse Progress");
+      gtk_box_pack_start (GTK_BOX (box2), progress_check, FALSE, TRUE, 0);
+      g_signal_connect (progress_check, "toggled",
+                       G_CALLBACK (entry_toggle_pulse), entry);
+
       separator = gtk_hseparator_new ();
       gtk_box_pack_start (GTK_BOX (box1), separator, FALSE, TRUE, 0);
 
@@ -6077,7 +6199,7 @@ set_cursor (GtkWidget *spinner,
 
   label = g_object_get_data (G_OBJECT (spinner), "user_data");
   
-  class = gtk_type_class (GDK_TYPE_CURSOR_TYPE);
+  class = g_type_class_ref (GDK_TYPE_CURSOR_TYPE);
   vals = class->values;
 
   while (vals && vals->value != c)
@@ -6087,6 +6209,8 @@ set_cursor (GtkWidget *spinner,
   else
     gtk_label_set_text (GTK_LABEL (label), "<unknown>");
 
+  g_type_class_unref (class);
+
   cursor = gdk_cursor_new_for_display (gtk_widget_get_display (widget), c);
   gdk_window_set_cursor (widget->window, cursor);
   gdk_cursor_unref (cursor);
@@ -6167,7 +6291,7 @@ create_cursors (GtkWidget *widget)
       gtk_container_add (GTK_CONTAINER (window), main_vbox);
 
       vbox =
-       gtk_widget_new (gtk_vbox_get_type (),
+       g_object_new (gtk_vbox_get_type (),
                        "GtkBox::homogeneous", FALSE,
                        "GtkBox::spacing", 5,
                        "GtkContainer::border_width", 10,
@@ -6214,7 +6338,7 @@ create_cursors (GtkWidget *widget)
       gtk_box_pack_start (GTK_BOX (hbox), spinner, TRUE, TRUE, 0);
 
       frame =
-       gtk_widget_new (gtk_frame_get_type (),
+       g_object_new (gtk_frame_get_type (),
                        "GtkFrame::shadow", GTK_SHADOW_ETCHED_IN,
                        "GtkFrame::label_xalign", 0.5,
                        "GtkFrame::label", "Cursor Area",
@@ -6241,7 +6365,7 @@ create_cursors (GtkWidget *widget)
                        G_CALLBACK (set_cursor),
                        darea);
 
-      label = gtk_widget_new (GTK_TYPE_LABEL,
+      label = g_object_new (GTK_TYPE_LABEL,
                              "visible", TRUE,
                              "label", "XXX",
                              "parent", vbox,
@@ -6252,7 +6376,7 @@ create_cursors (GtkWidget *widget)
       g_object_set_data (G_OBJECT (spinner), "user_data", label);
 
       any =
-       gtk_widget_new (gtk_hseparator_get_type (),
+       g_object_new (gtk_hseparator_get_type (),
                        "GtkWidget::visible", TRUE,
                        NULL);
       gtk_box_pack_start (GTK_BOX (main_vbox), any, FALSE, TRUE, 0);
@@ -6761,15 +6885,8 @@ insert_row_clist (GtkWidget *widget, gpointer data)
 
   if (!style1)
     {
-      GdkColor col1 = { 0, };
-      GdkColor col2 = { 0, };
-
-      col1.red   = 0;
-      col1.green = 56000;
-      col1.blue  = 0;
-      col2.red   = 32000;
-      col2.green = 0;
-      col2.blue  = 56000;
+      GdkColor col1 = { 0, 0, 56000, 0};
+      GdkColor col2 = { 0, 32000, 0, 56000};
 
       style1 = gtk_style_copy (GTK_WIDGET (data)->style);
       style1->base[GTK_STATE_NORMAL] = col1;
@@ -6816,7 +6933,7 @@ clist_warning_test (GtkWidget *button,
     }
 
   gtk_widget_destroy (child);
-  gtk_widget_unref (child);
+  g_object_unref (child);
 }
 
 static void
@@ -6887,8 +7004,8 @@ create_clist (GtkWidget *widget)
   GtkWidget *label;
 
   GtkStyle *style;
-  GdkColor col1 = { 0, };
-  GdkColor col2 = { 0, };
+  GdkColor red_col = { 0, 56000, 0, 0};
+  GdkColor light_green_col = { 0, 0, 56000, 32000};
 
   if (!window)
     {
@@ -7019,16 +7136,9 @@ create_clist (GtkWidget *widget)
       sprintf (text[1], "Right");
       sprintf (text[2], "Center");
 
-      col1.red   = 56000;
-      col1.green = 0;
-      col1.blue  = 0;
-      col2.red   = 0;
-      col2.green = 56000;
-      col2.blue  = 32000;
-
       style = gtk_style_new ();
-      style->fg[GTK_STATE_NORMAL] = col1;
-      style->base[GTK_STATE_NORMAL] = col2;
+      style->fg[GTK_STATE_NORMAL] = red_col;
+      style->base[GTK_STATE_NORMAL] = light_green_col;
 
       pango_font_description_set_size (style->font_desc, 14 * PANGO_SCALE);
       pango_font_description_set_weight (style->font_desc, PANGO_WEIGHT_BOLD);
@@ -7049,7 +7159,7 @@ create_clist (GtkWidget *widget)
            }
        }
 
-      gtk_style_unref (style);
+      g_object_unref (style);
       
       separator = gtk_hseparator_new ();
       gtk_box_pack_start (GTK_BOX (vbox), separator, FALSE, TRUE, 0);
@@ -7204,8 +7314,8 @@ void change_style (GtkWidget *widget, GtkCTree *ctree)
   static GtkStyle *style2 = NULL;
 
   GtkCTreeNode *node;
-  GdkColor col1 = { 0, };
-  GdkColor col2 = { 0, };
+  GdkColor green_col = { 0, 0, 56000, 0};
+  GdkColor purple_col = { 0, 32000, 0, 56000};
 
   if (GTK_CLIST (ctree)->focus_row >= 0)
     node = GTK_CTREE_NODE
@@ -7218,21 +7328,14 @@ void change_style (GtkWidget *widget, GtkCTree *ctree)
 
   if (!style1)
     {
-      col1.red   = 0;
-      col1.green = 56000;
-      col1.blue  = 0;
-      col2.red   = 32000;
-      col2.green = 0;
-      col2.blue  = 56000;
-
       style1 = gtk_style_new ();
-      style1->base[GTK_STATE_NORMAL] = col1;
-      style1->fg[GTK_STATE_SELECTED] = col2;
+      style1->base[GTK_STATE_NORMAL] = green_col;
+      style1->fg[GTK_STATE_SELECTED] = purple_col;
 
       style2 = gtk_style_new ();
-      style2->base[GTK_STATE_SELECTED] = col2;
-      style2->fg[GTK_STATE_NORMAL] = col1;
-      style2->base[GTK_STATE_NORMAL] = col2;
+      style2->base[GTK_STATE_SELECTED] = purple_col;
+      style2->fg[GTK_STATE_NORMAL] = green_col;
+      style2->base[GTK_STATE_NORMAL] = purple_col;
       pango_font_description_free (style2->font_desc);
       style2->font_desc = pango_font_description_from_string ("courier 30");
     }
@@ -7606,7 +7709,7 @@ void build_recursive (GtkCTree *ctree, gint cur_depth, gint depth,
          break;
        }
       gtk_ctree_node_set_row_data_full (ctree, sibling, style,
-                                       (GtkDestroyNotify) gtk_style_unref);
+                                       (GDestroyNotify) g_object_unref);
 
       if (ctree->line_style == GTK_CTREE_LINES_TABBED)
        gtk_ctree_node_set_row_style (ctree, sibling, style);
@@ -7657,7 +7760,7 @@ void rebuild_tree (GtkWidget *widget, GtkCTree *ctree)
   style->base[GTK_STATE_NORMAL].green = 45000;
   style->base[GTK_STATE_NORMAL].blue  = 55000;
   gtk_ctree_node_set_row_data_full (ctree, parent, style,
-                                   (GtkDestroyNotify) gtk_style_unref);
+                                   (GDestroyNotify) g_object_unref);
 
   if (ctree->line_style == GTK_CTREE_LINES_TABBED)
     gtk_ctree_node_set_row_style (ctree, parent, style);
@@ -8227,6 +8330,40 @@ flipping_toggled_cb (GtkWidget *widget, gpointer data)
   gtk_widget_set_default_direction (new_direction);
 }
 
+static void
+orientable_toggle_orientation (GtkOrientable *orientable)
+{
+  GtkOrientation orientation;
+
+  orientation = gtk_orientable_get_orientation (orientable);
+  gtk_orientable_set_orientation (orientable,
+                                  orientation == GTK_ORIENTATION_HORIZONTAL ?
+                                  GTK_ORIENTATION_VERTICAL :
+                                  GTK_ORIENTATION_HORIZONTAL);
+
+  if (GTK_IS_CONTAINER (orientable))
+    {
+      GList *children;
+      GList *child;
+
+      children = gtk_container_get_children (GTK_CONTAINER (orientable));
+
+      for (child = children; child; child = child->next)
+        {
+          if (GTK_IS_ORIENTABLE (child->data))
+            orientable_toggle_orientation (child->data);
+        }
+
+      g_list_free (children);
+    }
+}
+
+void
+flipping_orientation_toggled_cb (GtkWidget *widget, gpointer data)
+{
+  orientable_toggle_orientation (GTK_ORIENTABLE (GTK_DIALOG (gtk_widget_get_toplevel (widget))->vbox));
+}
+
 static void
 set_direction_recurse (GtkWidget *widget,
                       gpointer   data)
@@ -8280,9 +8417,24 @@ create_flipping (GtkWidget *widget)
       gtk_window_set_title (GTK_WINDOW (window), "Bidirectional Flipping");
 
       check_button = gtk_check_button_new_with_label ("Right-to-left global direction");
+      gtk_container_set_border_width (GTK_CONTAINER (check_button), 10);
+      gtk_box_pack_start (GTK_BOX (GTK_DIALOG (window)->vbox),
+                         check_button, TRUE, TRUE, 0);
+
+      if (gtk_widget_get_default_direction () == GTK_TEXT_DIR_RTL)
+       gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (check_button), TRUE);
+
+      g_signal_connect (check_button, "toggled",
+                       G_CALLBACK (flipping_toggled_cb), NULL);
+
+      check_button = gtk_check_button_new_with_label ("Toggle orientation of all boxes");
+      gtk_container_set_border_width (GTK_CONTAINER (check_button), 10);
       gtk_box_pack_start (GTK_BOX (GTK_DIALOG (window)->vbox), 
                          check_button, TRUE, TRUE, 0);
 
+      g_signal_connect (check_button, "toggled",
+                       G_CALLBACK (flipping_orientation_toggled_cb), NULL);
+
       gtk_box_pack_start (GTK_BOX (GTK_DIALOG (window)->vbox), 
                          create_forward_back ("Default", GTK_TEXT_DIR_NONE),
                          TRUE, TRUE, 0);
@@ -8295,14 +8447,6 @@ create_flipping (GtkWidget *widget)
                          create_forward_back ("Right-to-Left", GTK_TEXT_DIR_RTL),
                          TRUE, TRUE, 0);
 
-      if (gtk_widget_get_default_direction () == GTK_TEXT_DIR_RTL)
-       gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (check_button), TRUE);
-
-      g_signal_connect (check_button, "toggled",
-                       G_CALLBACK (flipping_toggled_cb), NULL);
-
-      gtk_container_set_border_width (GTK_CONTAINER (check_button), 10);
-      
       button = gtk_button_new_with_label ("Close");
       g_signal_connect_swapped (button, "clicked",
                                G_CALLBACK (gtk_widget_destroy), window);
@@ -8680,7 +8824,7 @@ create_display_screen (GtkWidget *widget)
   
   GdkDisplay *display = gdk_screen_get_display (screen);
 
-  window = gtk_widget_new (gtk_window_get_type (),
+  window = g_object_new (gtk_window_get_type (),
                           "screen", screen,
                           "user_data", NULL,
                           "type", GTK_WINDOW_TOPLEVEL,
@@ -10448,7 +10592,7 @@ create_wmhints (GtkWidget *widget)
       gtk_widget_realize (window);
       
       circles = gdk_bitmap_create_from_data (window->window,
-                                            circles_bits,
+                                            (gchar *) circles_bits,
                                             circles_width,
                                             circles_height);
       gdk_window_set_icon (window->window, NULL,
@@ -11735,7 +11879,7 @@ create_progress_bar (GtkWidget *widget)
       g_signal_connect (adj, "value_changed",
                        G_CALLBACK (progress_value_changed), pdata);
 
-      pdata->pbar = gtk_widget_new (GTK_TYPE_PROGRESS_BAR,
+      pdata->pbar = g_object_new (GTK_TYPE_PROGRESS_BAR,
                                    "adjustment", adj,
                                    "ellipsize", PANGO_ELLIPSIZE_MIDDLE,
                                    NULL);
@@ -12049,7 +12193,12 @@ find_widget_at_pointer (GdkDisplay *display)
  pointer_window = gdk_display_get_window_at_pointer (display, NULL, NULL);
  
  if (pointer_window)
-   gdk_window_get_user_data (pointer_window, (gpointer) &widget);
+   {
+     gpointer widget_ptr;
+
+     gdk_window_get_user_data (pointer_window, &widget_ptr);
+     widget = widget_ptr;
+   }
 
  if (widget)
    {
@@ -12206,6 +12355,171 @@ create_properties (GtkWidget *widget)
   
 }
 
+struct SnapshotData {
+  GtkWidget *toplevel_button;
+  GtkWidget **window;
+  GdkCursor *cursor;
+  gboolean in_query;
+  gboolean is_toplevel;
+  gint handler;
+};
+
+static void
+destroy_snapshot_data (GtkWidget             *widget,
+                      struct SnapshotData *data)
+{
+  if (*data->window)
+    *data->window = NULL;
+  
+  if (data->cursor)
+    {
+      gdk_cursor_unref (data->cursor);
+      data->cursor = NULL;
+    }
+
+  if (data->handler)
+    {
+      g_signal_handler_disconnect (widget, data->handler);
+      data->handler = 0;
+    }
+
+  g_free (data);
+}
+
+static gint
+snapshot_widget_event (GtkWidget              *widget,
+                      GdkEvent        *event,
+                      struct SnapshotData *data)
+{
+  GtkWidget *res_widget = NULL;
+
+  if (!data->in_query)
+    return FALSE;
+  
+  if (event->type == GDK_BUTTON_RELEASE)
+    {
+      gtk_grab_remove (widget);
+      gdk_display_pointer_ungrab (gtk_widget_get_display (widget),
+                                 GDK_CURRENT_TIME);
+      
+      res_widget = find_widget_at_pointer (gtk_widget_get_display (widget));
+      if (data->is_toplevel && res_widget)
+       res_widget = gtk_widget_get_toplevel (res_widget);
+      if (res_widget)
+       {
+         GdkPixmap *pixmap;
+         GtkWidget *window, *image;
+
+         window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
+         pixmap = gtk_widget_get_snapshot (res_widget, NULL);
+          gtk_widget_realize (window);
+          if (gdk_drawable_get_depth (window->window) != gdk_drawable_get_depth (pixmap))
+            {
+              /* this branch is needed to convert ARGB -> RGB */
+              int width, height;
+              GdkPixbuf *pixbuf;
+              gdk_drawable_get_size (pixmap, &width, &height);
+              pixbuf = gdk_pixbuf_get_from_drawable (NULL, pixmap,
+                                                     gtk_widget_get_colormap (res_widget),
+                                                     0, 0,
+                                                     0, 0,
+                                                     width, height);
+              image = gtk_image_new_from_pixbuf (pixbuf);
+              g_object_unref (pixbuf);
+            }
+          else
+            image = gtk_image_new_from_pixmap (pixmap, NULL);
+         gtk_container_add (GTK_CONTAINER (window), image);
+          g_object_unref (pixmap);
+         gtk_widget_show_all (window);
+       }
+
+      data->in_query = FALSE;
+    }
+  return FALSE;
+}
+
+
+static void
+snapshot_widget (GtkButton *button,
+                struct SnapshotData *data)
+{
+  gint failure;
+
+  g_signal_connect (button, "event",
+                   G_CALLBACK (snapshot_widget_event), data);
+
+  data->is_toplevel = GTK_WIDGET (button) == data->toplevel_button;
+  
+  if (!data->cursor)
+    data->cursor = gdk_cursor_new_for_display (gtk_widget_get_display (GTK_WIDGET (button)),
+                                              GDK_TARGET);
+  
+  failure = gdk_pointer_grab (GTK_WIDGET (button)->window,
+                             TRUE,
+                             GDK_BUTTON_RELEASE_MASK,
+                             NULL,
+                             data->cursor,
+                             GDK_CURRENT_TIME);
+
+  gtk_grab_add (GTK_WIDGET (button));
+
+  data->in_query = TRUE;
+}
+
+static void
+create_snapshot (GtkWidget *widget)
+{
+  static GtkWidget *window = NULL;
+  GtkWidget *button;
+  GtkWidget *vbox;
+  struct SnapshotData *data;
+
+  data = g_new (struct SnapshotData, 1);
+  data->window = &window;
+  data->in_query = FALSE;
+  data->cursor = NULL;
+  data->handler = 0;
+
+  if (!window)
+    {
+      window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
+
+      gtk_window_set_screen (GTK_WINDOW (window),
+                            gtk_widget_get_screen (widget));      
+
+      data->handler = g_signal_connect (window, "destroy",
+                                       G_CALLBACK (destroy_snapshot_data),
+                                       data);
+
+      gtk_window_set_title (GTK_WINDOW (window), "test snapshot");
+      gtk_container_set_border_width (GTK_CONTAINER (window), 10);
+
+      vbox = gtk_vbox_new (FALSE, 1);
+      gtk_container_add (GTK_CONTAINER (window), vbox);
+            
+      button = gtk_button_new_with_label ("Snapshot widget");
+      gtk_box_pack_start (GTK_BOX (vbox), button, TRUE, TRUE, 0);
+      g_signal_connect (button, "clicked",
+                       G_CALLBACK (snapshot_widget),
+                       data);
+      
+      button = gtk_button_new_with_label ("Snapshot toplevel");
+      data->toplevel_button = button;
+      gtk_box_pack_start (GTK_BOX (vbox), button, TRUE, TRUE, 0);
+      g_signal_connect (button, "clicked",
+                       G_CALLBACK (snapshot_widget),
+                       data);
+    }
+
+  if (!GTK_WIDGET_VISIBLE (window))
+    gtk_widget_show_all (window);
+  else
+    gtk_widget_destroy (window);
+  
+}
+
+
 
 /*
  * Color Preview
@@ -12926,9 +13240,9 @@ create_idle_test (GtkWidget *widget)
       gtk_widget_show (label);
       
       container =
-       gtk_widget_new (GTK_TYPE_HBOX,
+       g_object_new (GTK_TYPE_HBOX,
                        "visible", TRUE,
-                       /* "GtkContainer::child", gtk_widget_new (GTK_TYPE_HBOX,
+                       /* "GtkContainer::child", g_object_new (GTK_TYPE_HBOX,
                         * "GtkWidget::visible", TRUE,
                         */
                         "child", label,
@@ -12938,19 +13252,19 @@ create_idle_test (GtkWidget *widget)
                          container, TRUE, TRUE, 0);
 
       frame =
-       gtk_widget_new (GTK_TYPE_FRAME,
+       g_object_new (GTK_TYPE_FRAME,
                        "border_width", 5,
                        "label", "Label Container",
                        "visible", TRUE,
                        "parent", GTK_DIALOG (window)->vbox,
                        NULL);
       box =
-       gtk_widget_new (GTK_TYPE_VBOX,
+       g_object_new (GTK_TYPE_VBOX,
                        "visible", TRUE,
                        "parent", frame,
                        NULL);
       button =
-       g_object_connect (gtk_widget_new (GTK_TYPE_RADIO_BUTTON,
+       g_object_connect (g_object_new (GTK_TYPE_RADIO_BUTTON,
                                          "label", "Resize-Parent",
                                          "user_data", (void*)GTK_RESIZE_PARENT,
                                          "visible", TRUE,
@@ -12958,7 +13272,7 @@ create_idle_test (GtkWidget *widget)
                                          NULL),
                          "signal::clicked", toggle_idle_container, container,
                          NULL);
-      button = gtk_widget_new (GTK_TYPE_RADIO_BUTTON,
+      button = g_object_new (GTK_TYPE_RADIO_BUTTON,
                               "label", "Resize-Queue",
                               "user_data", (void*)GTK_RESIZE_QUEUE,
                               "group", button,
@@ -12968,7 +13282,7 @@ create_idle_test (GtkWidget *widget)
       g_object_connect (button,
                        "signal::clicked", toggle_idle_container, container,
                        NULL);
-      button2 = gtk_widget_new (GTK_TYPE_RADIO_BUTTON,
+      button2 = g_object_new (GTK_TYPE_RADIO_BUTTON,
                                "label", "Resize-Immediate",
                                "user_data", (void*)GTK_RESIZE_IMMEDIATE,
                                NULL);
@@ -13489,6 +13803,7 @@ struct {
   { "scrolled windows", create_scrolled_windows },
   { "shapes", create_shapes },
   { "size groups", create_size_groups },
+  { "snapshot", create_snapshot },
   { "spinbutton", create_spins },
   { "statusbar", create_statusbar },
   { "styles", create_styles },
@@ -13524,7 +13839,7 @@ create_main_window (void)
 
   window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
   gtk_widget_set_name (window, "main window");
-  gtk_widget_set_uposition (window, 20, 20);
+  gtk_widget_set_uposition (window, 50, 20);
   gtk_window_set_default_size (GTK_WINDOW (window), -1, 400);
 
   geometry.min_width = -1;
@@ -13739,6 +14054,10 @@ main (int argc, char *argv[])
    */
   if (file_exists ("testgtkrc"))
     gtk_rc_add_default_file ("testgtkrc");
+  else if (file_exists ("tests/testgtkrc"))
+    gtk_rc_add_default_file ("tests/testgtkrc");
+  else
+    g_warning ("Couldn't find file \"testgtkrc\".");
 
   g_set_application_name ("GTK+ Test Program");
 
@@ -13796,7 +14115,7 @@ main (int argc, char *argv[])
 
   /* bindings test
    */
-  binding_set = gtk_binding_set_by_class (gtk_type_class (GTK_TYPE_WIDGET));
+  binding_set = gtk_binding_set_by_class (g_type_class_ref (GTK_TYPE_WIDGET));
   gtk_binding_entry_add_signal (binding_set,
                                '9', GDK_CONTROL_MASK | GDK_RELEASE_MASK,
                                "debug_msg",