summaryrefslogtreecommitdiff
path: root/tests
diff options
context:
space:
mode:
authorAlexander Larsson <alexl@redhat.com>2011-02-11 15:27:54 +0100
committerAlexander Larsson <alexl@redhat.com>2011-02-11 15:27:54 +0100
commitd4add8cefa6fa5c29bdb50f18e31cbfbfb38cc2b (patch)
tree7525bacbda20d6801e2465b953528f8f59f0411e /tests
parenta3b227ff9e8af8fc6855ca99b837af08fc4e8494 (diff)
parentd847f489f04fc8343b364b9e66129f40b248f523 (diff)
downloadgtk+-d4add8cefa6fa5c29bdb50f18e31cbfbfb38cc2b.tar.gz
Merge branch 'master' into broadway
Diffstat (limited to 'tests')
-rw-r--r--tests/Makefile.am23
-rw-r--r--tests/makefile.msc3
-rw-r--r--tests/simple.c1
-rw-r--r--tests/testappchooser.c2
-rw-r--r--tests/testappchooserbutton.c1
-rw-r--r--tests/testclientmessage.c122
-rw-r--r--tests/testgtk.c26
-rw-r--r--tests/testgtk.css9
-rw-r--r--tests/testnoscreen.c47
-rw-r--r--tests/testsensitive.c111
-rw-r--r--tests/testsocket.c3
-rw-r--r--tests/testsocket_common.c2
-rw-r--r--tests/testtoolbar.c23
-rw-r--r--tests/testtreepos.c140
14 files changed, 329 insertions, 184 deletions
diff --git a/tests/Makefile.am b/tests/Makefile.am
index 5364298800..318bbfef40 100644
--- a/tests/Makefile.am
+++ b/tests/Makefile.am
@@ -12,12 +12,12 @@ INCLUDES = \
$(GDK_DEP_CFLAGS)
DEPS = \
- $(top_builddir)/gtk/libgtk-3.0.la
+ $(top_builddir)/gtk/libgtk-3.la
LDADDS = \
- $(top_builddir)/gtk/libgtk-3.0.la \
- $(top_builddir)/gdk/libgdk-3.0.la \
- $(GTK_DEP_LIBS) \
+ $(top_builddir)/gtk/libgtk-3.la \
+ $(top_builddir)/gdk/libgdk-3.la \
+ $(GTK_DEP_LIBS) \
-lm
if USE_X11
@@ -40,7 +40,6 @@ noinst_PROGRAMS = $(TEST_PROGS) \
testcombo \
testcombochange \
testcellrenderertext \
- testclientmessage \
testdnd \
testellipsise \
testentrycompletion \
@@ -104,7 +103,10 @@ noinst_PROGRAMS = $(TEST_PROGS) \
testswitch \
styleexamples \
testtreemenu \
- testtoplevelembed
+ testtoplevelembed \
+ testnoscreen \
+ testtreepos \
+ testsensitive
if USE_X11
noinst_PROGRAMS += testerrors
@@ -139,7 +141,6 @@ testcalendar_DEPENDENCIES = $(TEST_DEPS)
testcombo_DEPENDENCIES = $(TEST_DEPS)
testcombochange_DEPENDENCIES = $(TEST_DEPS)
testcellrenderertext_DEPENDENCIES = $(TEST_DEPS)
-testclientmessage_DEPENDENCIES = $(TEST_DEPS)
testdnd_DEPENDENCIES = $(TEST_DEPS)
testellipsise_DEPENDENCIES = $(TEST_DEPS)
testentrycompletion_DEPENDENCIES = $(TEST_DEPS)
@@ -201,6 +202,9 @@ testexpander_DEPENDENCIES = $(TEST_DEPS)
testswitch_DEPENDENCIES = $(TEST_DEPS)
styleexamples_DEPENDENCIES = $(TEST_DEPS)
testtoplevelembed_DEPENDENCIES = $(TEST_DEPS)
+testnoscreen_DEPENDENCIES = $(TEST_DEPS)
+testtreepos_DEPENDENCIES = $(TEST_DEPS)
+testsensitive_DEPENDENCIES = $(TEST_DEPS)
flicker_LDADD = $(LDADDS)
simple_LDADD = $(LDADDS)
@@ -215,7 +219,6 @@ testcalendar_LDADD = $(LDADDS)
testcombo_LDADD = $(LDADDS)
testcombochange_LDADD = $(LDADDS)
testcellrenderertext_LDADD = $(LDADDS)
-testclientmessage_LDADD = $(LDADDS)
testdnd_LDADD = $(LDADDS)
testellipsise_LDADD = $(LDADDS)
testentrycompletion_LDADD = $(LDADDS)
@@ -283,6 +286,10 @@ testexpander_LDADD = $(LDADDS)
testswitch_LDADD = $(LDADDS)
styleexamples_LDADD = $(LDADDS)
testtoplevelembed_LDADD = $(LDADDS)
+testnoscreen_LDADD = $(LDADDS)
+testtreepos_LDADD = $(LDADDS)
+testsensitive_LDADD = $(LDADDS)
+
testentrycompletion_SOURCES = \
prop-editor.c \
diff --git a/tests/makefile.msc b/tests/makefile.msc
index 8d0532e401..2e7feb3c83 100644
--- a/tests/makefile.msc
+++ b/tests/makefile.msc
@@ -27,7 +27,6 @@ TOUCH = copy makefile.msc+nul
all : \
..\config.h \
prop-editor.obj \
- testsocket_common.obj \
all-test-apps
..\config.h : ..\config.h.win32
@@ -59,7 +58,7 @@ TESTAPPS = \
testtoolbar testtooltips \
testtreecolumns testtreecolumnsizing testtreeedit testtreeflow testtreefocus \
testtreemodel testtreesort testtreeview treestoretest \
- testsocket testsocket_child teststatusicon \
+ teststatusicon \
testthreads testvolumebutton testwindows testxinerama \
simple
diff --git a/tests/simple.c b/tests/simple.c
index 9a017d269c..6c2b5e9846 100644
--- a/tests/simple.c
+++ b/tests/simple.c
@@ -38,7 +38,6 @@ main (int argc, char *argv[])
gtk_init (&argc, &argv);
window = g_object_connect (g_object_new (gtk_window_get_type (),
- "user_data", NULL,
"type", GTK_WINDOW_TOPLEVEL,
"title", "hello world",
"resizable", FALSE,
diff --git a/tests/testappchooser.c b/tests/testappchooser.c
index a50f1b4e4c..6bf121a685 100644
--- a/tests/testappchooser.c
+++ b/tests/testappchooser.c
@@ -98,6 +98,8 @@ prepare_dialog (void)
0, content_type);
}
+ gtk_app_chooser_dialog_set_heading (GTK_APP_CHOOSER_DIALOG (dialog), "Select one already, you <i>fool</i>");
+
g_signal_connect (dialog, "response",
G_CALLBACK (dialog_response), NULL);
diff --git a/tests/testappchooserbutton.c b/tests/testappchooserbutton.c
index 0416af72c5..664a3291d2 100644
--- a/tests/testappchooserbutton.c
+++ b/tests/testappchooserbutton.c
@@ -96,6 +96,7 @@ main (int argc,
sel_name = gtk_label_new (NULL);
gtk_box_pack_start (GTK_BOX (w), sel_name, TRUE, TRUE, 0);
+ gtk_app_chooser_button_set_heading (GTK_APP_CHOOSER_BUTTON (combobox), "Choose one, <i>not</i> two");
gtk_app_chooser_button_append_separator (GTK_APP_CHOOSER_BUTTON (combobox));
gtk_app_chooser_button_append_custom_item (GTK_APP_CHOOSER_BUTTON (combobox),
CUSTOM_ITEM,
diff --git a/tests/testclientmessage.c b/tests/testclientmessage.c
deleted file mode 100644
index bd1a097108..0000000000
--- a/tests/testclientmessage.c
+++ /dev/null
@@ -1,122 +0,0 @@
-/* testclientmessage.c
- * Copyright (C) 2008 Novell, Inc.
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Library General Public
- * License as published by the Free Software Foundation; either
- * version 2 of the License, or (at your option) any later version.
- *
- * This library is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Library General Public License for more details.
- *
- * You should have received a copy of the GNU Library General Public
- * License along with this library; if not, write to the
- * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
- * Boston, MA 02111-1307, USA.
- */
-
-#include <gtk/gtk.h>
-
-static GdkAtom my_type;
-static GdkAtom random_type;
-
-static void
-send_known (void)
-{
- GdkEvent *event = gdk_event_new (GDK_CLIENT_EVENT);
- static int counter = 42;
- int i;
-
- event->client.window = NULL;
- event->client.message_type = my_type;
- event->client.data_format = 32;
- event->client.data.l[0] = counter++;
- for (i = 1; i < 5; i++)
- event->client.data.l[i] = 0;
-
- gdk_screen_broadcast_client_message (gdk_display_get_default_screen (gdk_display_get_default ()), event);
-
- gdk_event_free (event);
-}
-
-void
-send_random (void)
-{
- GdkEvent *event = gdk_event_new (GDK_CLIENT_EVENT);
- static int counter = 1;
- int i;
-
- event->client.window = NULL;
- event->client.message_type = random_type;
- event->client.data_format = 32;
- event->client.data.l[0] = counter++;
- for (i = 1; i < 5; i++)
- event->client.data.l[i] = 0;
-
- gdk_screen_broadcast_client_message (gdk_display_get_default_screen (gdk_display_get_default ()), event);
-
- gdk_event_free (event);
-}
-
-static GdkFilterReturn
-filter_func (GdkXEvent *xevent,
- GdkEvent *event,
- gpointer data)
-{
- g_print ("Got matching client message!\n");
- return GDK_FILTER_REMOVE;
-}
-
-int
-main (int argc, char **argv)
-{
- GtkWidget *window;
- GtkWidget *vbox;
- GtkWidget *button;
-
- gtk_init (&argc, &argv);
-
- my_type = gdk_atom_intern ("GtkTestClientMessage", FALSE);
- random_type = gdk_atom_intern (g_strdup_printf ("GtkTestClientMessage-%d",
- g_rand_int_range (g_rand_new (), 1, 99)),
- FALSE);
-
- g_print ("using random client message type %s\n", gdk_atom_name (random_type));
-
- window = g_object_connect (g_object_new (gtk_window_get_type (),
- "type", GTK_WINDOW_TOPLEVEL,
- "title", "testclientmessage",
- "border_width", 10,
- NULL),
- "signal::destroy", gtk_main_quit, NULL,
- NULL);
- vbox = g_object_new (gtk_vbox_get_type (),
- "GtkWidget::parent", window,
- "GtkWidget::visible", TRUE,
- NULL);
- button = g_object_connect (g_object_new (gtk_button_get_type (),
- "GtkButton::label", "send known client message",
- "GtkWidget::parent", vbox,
- "GtkWidget::visible", TRUE,
- NULL),
- "signal::clicked", send_known, NULL,
- NULL);
- button = g_object_connect (g_object_new (gtk_button_get_type (),
- "GtkButton::label", "send random client message",
- "GtkWidget::parent", vbox,
- "GtkWidget::visible", TRUE,
- NULL),
- "signal::clicked", send_random, NULL,
- NULL);
- gdk_display_add_client_message_filter (gdk_display_get_default (),
- my_type,
- filter_func,
- NULL);
- gtk_widget_show (window);
-
- gtk_main ();
-
- return 0;
-}
diff --git a/tests/testgtk.c b/tests/testgtk.c
index 7b90a4242e..def6ded012 100644
--- a/tests/testgtk.c
+++ b/tests/testgtk.c
@@ -9532,26 +9532,6 @@ create_idle_test (GtkWidget *widget)
*/
void
-reload_all_rc_files (void)
-{
- static GdkAtom atom_rcfiles = GDK_NONE;
-
- GdkEvent *send_event = gdk_event_new (GDK_CLIENT_EVENT);
- int i;
-
- if (!atom_rcfiles)
- atom_rcfiles = gdk_atom_intern("_GTK_READ_RCFILES", FALSE);
-
- for(i = 0; i < 5; i++)
- send_event->client.data.l[i] = 0;
- send_event->client.data_format = 32;
- send_event->client.message_type = atom_rcfiles;
- gdk_event_send_clientmessage_toall (send_event);
-
- gdk_event_free (send_event);
-}
-
-void
create_rc_file (GtkWidget *widget)
{
static GtkWidget *window = NULL;
@@ -9604,12 +9584,6 @@ create_rc_file (GtkWidget *widget)
gtk_box_pack_start (GTK_BOX (action_area), button, TRUE, TRUE, 0);
gtk_widget_grab_default (button);
- button = gtk_button_new_with_label ("Reload All");
- g_signal_connect (button, "clicked",
- G_CALLBACK (reload_all_rc_files), NULL);
- gtk_widget_set_can_default (button, TRUE);
- gtk_box_pack_start (GTK_BOX (action_area), button, TRUE, TRUE, 0);
-
button = gtk_button_new_with_label ("Close");
g_signal_connect_swapped (button, "clicked",
G_CALLBACK (gtk_widget_destroy),
diff --git a/tests/testgtk.css b/tests/testgtk.css
index 24ed65547c..f1207f72a1 100644
--- a/tests/testgtk.css
+++ b/tests/testgtk.css
@@ -1,6 +1,11 @@
/* testgtk2.css sets all the buttons in the main window to blue by default */
@import url("testgtk2.css");
+@binding-set entry-bindings {
+ bind "<alt>s" { "move-cursor" (visual-positions, 3, 0) };
+ bind "<alt>a" { "move-cursor" (visual-positions, -3, 0) };
+};
+
* {
-GtkButton-child-displacement-x: 1;
-GtkButton-child-displacement-y: 1;
@@ -31,3 +36,7 @@ GtkLabel:prelight {
#main_window GtkScrolledWindow GtkButton:prelight {
background-color: rgb (0%, 75%, 0);
}
+
+GtkEntry {
+ gtk-key-bindings: entry-bindings;
+}
diff --git a/tests/testnoscreen.c b/tests/testnoscreen.c
new file mode 100644
index 0000000000..cce8a5a3af
--- /dev/null
+++ b/tests/testnoscreen.c
@@ -0,0 +1,47 @@
+/* testnoscreen.c
+ * Copyright (C) 2011 Red Hat, Inc.
+ * Authors: Matthias Clasen
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public
+ * License along with this library; if not, write to the
+ * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+ * Boston, MA 02111-1307, USA.
+ */
+
+#include <gtk/gtk.h>
+
+/* Very limited test to ensure that creating widgets works
+ * before opening a display connection
+ */
+int main (int argc, char *argv[])
+{
+ GtkWidget *window;
+ GtkWidget *button;
+ GdkDisplay *display;
+
+ gtk_parse_args (&argc, &argv);
+
+ window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
+ button = gtk_button_new ();
+ gtk_container_add (GTK_CONTAINER (window), button);
+
+ display = gdk_display_open (NULL);
+
+ gtk_window_set_screen (GTK_WINDOW (window), gdk_display_get_default_screen (display));
+
+ gtk_widget_show_all (window);
+
+ gtk_main ();
+
+ return 0;
+}
diff --git a/tests/testsensitive.c b/tests/testsensitive.c
new file mode 100644
index 0000000000..52ed27e7cb
--- /dev/null
+++ b/tests/testsensitive.c
@@ -0,0 +1,111 @@
+#include <gtk/gtk.h>
+
+static void
+set_insensitive (GtkButton *b, GtkWidget *w)
+{
+ gtk_widget_set_sensitive (w, FALSE);
+}
+
+static void
+state_changed (GtkWidget *widget)
+{
+ GtkStateFlags flags;
+ const gchar *sep;
+
+ g_print ("state changed: \n");
+ switch (gtk_widget_get_state (widget))
+ {
+ case GTK_STATE_ACTIVE:
+ g_print ("active, ");
+ break;
+ case GTK_STATE_PRELIGHT:
+ g_print ("prelight, ");
+ break;
+ case GTK_STATE_SELECTED:
+ g_print ("selected, ");
+ break;
+ case GTK_STATE_INSENSITIVE:
+ g_print ("insensitive, ");
+ break;
+ case GTK_STATE_INCONSISTENT:
+ g_print ("inconsistent, ");
+ break;
+ case GTK_STATE_FOCUSED:
+ g_print ("focused, ");
+ break;
+ case GTK_STATE_NORMAL:
+ g_print ("normal, ");
+ break;
+ }
+
+ flags = gtk_widget_get_state_flags (widget);
+ sep = "";
+ if (flags & GTK_STATE_FLAG_ACTIVE)
+ {
+ g_print ("%sactive", sep);
+ sep = "|";
+ }
+ if (flags & GTK_STATE_FLAG_PRELIGHT)
+ {
+ g_print ("%sprelight", sep);
+ sep = "|";
+ }
+ if (flags & GTK_STATE_FLAG_SELECTED)
+ {
+ g_print ("%sselected", sep);
+ sep = "|";
+ }
+ if (flags & GTK_STATE_FLAG_INSENSITIVE)
+ {
+ g_print ("%sinsensitive", sep);
+ sep = "|";
+ }
+ if (flags & GTK_STATE_FLAG_INCONSISTENT)
+ {
+ g_print ("%sinconsistent", sep);
+ sep = "|";
+ }
+ if (flags & GTK_STATE_FLAG_FOCUSED)
+ {
+ g_print ("%sfocused", sep);
+ sep = "|";
+ }
+ if (sep[0] == 0)
+ g_print ("normal");
+ g_print ("\n");
+}
+
+int main (int argc, char *argv[])
+{
+ GtkWidget *window;
+ GtkWidget *box;
+ GtkWidget *bu;
+ GtkWidget *w, *c;
+
+ gtk_init (&argc, &argv);
+
+ window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
+ box = gtk_box_new (GTK_ORIENTATION_VERTICAL, 5);
+ gtk_container_add (GTK_CONTAINER (window), box);
+
+ w = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 15);
+ gtk_box_pack_start (GTK_BOX (box), w, TRUE, TRUE, 0);
+ gtk_box_pack_start (GTK_BOX (w), gtk_entry_new (), TRUE, TRUE, 0);
+ bu = gtk_button_new_with_label ("Bu");
+ gtk_box_pack_start (GTK_BOX (w), bu, TRUE, TRUE, 0);
+ c = gtk_switch_new ();
+ gtk_switch_set_active (GTK_SWITCH (c), TRUE);
+ gtk_widget_set_halign (c, GTK_ALIGN_CENTER);
+ gtk_widget_set_valign (c, GTK_ALIGN_CENTER);
+ gtk_box_pack_start (GTK_BOX (box), c, TRUE, TRUE, 0);
+ g_signal_connect (bu, "clicked", G_CALLBACK (set_insensitive), w);
+ g_signal_connect (bu, "state-changed", G_CALLBACK (state_changed), NULL);
+
+ g_object_bind_property (c, "active", w, "sensitive", G_BINDING_BIDIRECTIONAL);
+
+ gtk_widget_show_all (window);
+
+ gtk_main ();
+
+ return 0;
+}
diff --git a/tests/testsocket.c b/tests/testsocket.c
index a17a74970e..f936ae520f 100644
--- a/tests/testsocket.c
+++ b/tests/testsocket.c
@@ -21,6 +21,7 @@
#include "config.h"
#include <gtk/gtk.h>
+#include <gtk/gtkx.h>
#include <string.h>
#include <stdlib.h>
@@ -249,7 +250,7 @@ void
add_local_passive_child (GtkWidget *window)
{
Socket *socket;
- GdkNativeWindow xid;
+ Window xid;
socket = create_socket ();
gtk_box_pack_start (GTK_BOX (box), socket->box, TRUE, TRUE, 0);
diff --git a/tests/testsocket_common.c b/tests/testsocket_common.c
index 6dcabb35df..84faa14672 100644
--- a/tests/testsocket_common.c
+++ b/tests/testsocket_common.c
@@ -21,7 +21,7 @@
#include "config.h"
#include <gtk/gtk.h>
#if defined (GDK_WINDOWING_X11)
-#include "x11/gdkx.h"
+#include <gtk/gtkx.h>
#elif defined (GDK_WINDOWING_WIN32)
#include "win32/gdkwin32.h"
#endif
diff --git a/tests/testtoolbar.c b/tests/testtoolbar.c
index f45da9ccda..38056cd1cd 100644
--- a/tests/testtoolbar.c
+++ b/tests/testtoolbar.c
@@ -24,24 +24,6 @@
#include "prop-editor.h"
static void
-reload_clicked (GtkWidget *widget)
-{
- static GdkAtom atom_rcfiles = GDK_NONE;
-
- GdkEventClient sev;
- int i;
-
- if (!atom_rcfiles)
- atom_rcfiles = gdk_atom_intern("_GTK_READ_RCFILES", FALSE);
-
- for(i = 0; i < 5; i++)
- sev.data.l[i] = 0;
- sev.data_format = 32;
- sev.message_type = atom_rcfiles;
- gdk_event_send_clientmessage_toall ((GdkEvent *) &sev);
-}
-
-static void
change_orientation (GtkWidget *button, GtkWidget *toolbar)
{
GtkWidget *table;
@@ -635,11 +617,6 @@ main (gint argc, gchar **argv)
add_item_to_list (store, item, "-----");
gtk_toolbar_insert (GTK_TOOLBAR (toolbar), item, -1);
- item = gtk_tool_button_new_from_stock (GTK_STOCK_REFRESH);
- add_item_to_list (store, item, "Refresh");
- g_signal_connect (item, "clicked", G_CALLBACK (reload_clicked), NULL);
- gtk_toolbar_insert (GTK_TOOLBAR (toolbar), item, -1);
-
image = gtk_image_new_from_stock (GTK_STOCK_DIALOG_WARNING, GTK_ICON_SIZE_DIALOG);
item = gtk_tool_item_new ();
gtk_widget_show (image);
diff --git a/tests/testtreepos.c b/tests/testtreepos.c
new file mode 100644
index 0000000000..20db78f7e0
--- /dev/null
+++ b/tests/testtreepos.c
@@ -0,0 +1,140 @@
+#include <gtk/gtk.h>
+
+static gboolean
+clicked_icon (GtkTreeView *tv,
+ gint x,
+ gint y,
+ GtkTreePath **path)
+{
+ GtkTreeViewColumn *col;
+ gint cell_x, cell_y;
+ gint cell_pos, cell_width;
+ GList *cells, *l;
+ gint depth;
+ gint level_indentation;
+ gint expander_size;
+ gint indent;
+
+ if (gtk_tree_view_get_path_at_pos (tv, x, y, path, &col, &cell_x, &cell_y))
+ {
+ cells = gtk_cell_layout_get_cells (GTK_CELL_LAYOUT (col));
+
+#if 1
+ /* ugly workaround to fix the problem:
+ * manually calculate the indent for the row
+ */
+ depth = gtk_tree_path_get_depth (*path);
+ level_indentation = gtk_tree_view_get_level_indentation (tv);
+ gtk_widget_style_get (GTK_WIDGET (tv), "expander-size", &expander_size, NULL);
+ expander_size += 4;
+ indent = (depth - 1) * level_indentation + depth * expander_size;
+#else
+ indent = 0;
+#endif
+
+ for (l = cells; l; l = l->next)
+ {
+ gtk_tree_view_column_cell_get_position (col, l->data, &cell_pos, &cell_width);
+ if (cell_pos + indent <= cell_x && cell_x <= cell_pos + indent + cell_width)
+ {
+ g_print ("clicked in %s\n", g_type_name_from_instance (l->data));
+ if (GTK_IS_CELL_RENDERER_PIXBUF (l->data))
+ {
+ g_list_free (cells);
+ return TRUE;
+ }
+ }
+ }
+
+ g_list_free (cells);
+ }
+
+ return FALSE;
+}
+
+static gboolean
+release_event (GtkTreeView *tv,
+ GdkEventButton *event)
+{
+ GtkTreePath *path;
+
+ if (event->type != GDK_BUTTON_RELEASE)
+ return TRUE;
+
+ if (clicked_icon (tv, event->x, event->y, &path))
+ {
+ GtkTreeModel *model;
+ GtkTreeIter iter;
+ gchar *text;
+
+ model = gtk_tree_view_get_model (tv);
+ gtk_tree_model_get_iter (model, &iter, path);
+ gtk_tree_model_get (model, &iter, 0, &text, -1);
+
+ g_print ("text was: %s\n", text);
+ g_free (text);
+ gtk_tree_path_free (path);
+
+ return TRUE;
+ }
+
+ return FALSE;
+}
+
+int main (int argc, char *argv[])
+{
+ GtkWidget *window;
+ GtkWidget *sw;
+ GtkWidget *tv;
+ GtkTreeViewColumn *col;
+ GtkCellRenderer *cell;
+ GtkTreeStore *store;
+ GtkTreeIter iter;
+
+ gtk_init (&argc, &argv);
+
+ window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
+ sw = gtk_scrolled_window_new (NULL, NULL);
+ gtk_container_add (GTK_CONTAINER (window), sw);
+ tv = gtk_tree_view_new ();
+ gtk_container_add (GTK_CONTAINER (sw), tv);
+
+ col = gtk_tree_view_column_new ();
+ cell = gtk_cell_renderer_text_new ();
+ gtk_tree_view_column_pack_start (col, cell, TRUE);
+ gtk_tree_view_column_add_attribute (col, cell, "text", 0);
+
+ cell = gtk_cell_renderer_toggle_new ();
+ gtk_tree_view_column_pack_start (col, cell, FALSE);
+ gtk_tree_view_column_add_attribute (col, cell, "active", 1);
+
+ cell = gtk_cell_renderer_text_new ();
+ gtk_tree_view_column_pack_start (col, cell, TRUE);
+ gtk_tree_view_column_add_attribute (col, cell, "text", 0);
+
+ cell = gtk_cell_renderer_pixbuf_new ();
+ gtk_tree_view_column_pack_start (col, cell, FALSE);
+ gtk_tree_view_column_add_attribute (col, cell, "stock-id", 2);
+
+ cell = gtk_cell_renderer_toggle_new ();
+ gtk_tree_view_column_pack_start (col, cell, FALSE);
+ gtk_tree_view_column_add_attribute (col, cell, "active", 1);
+
+ gtk_tree_view_append_column (GTK_TREE_VIEW (tv), col);
+
+ store = gtk_tree_store_new (3, G_TYPE_STRING, G_TYPE_BOOLEAN, G_TYPE_STRING);
+ gtk_tree_store_insert_with_values (store, NULL, NULL, 0, 0, "One row", 1, FALSE, 2, "gtk-open", -1);
+ gtk_tree_store_insert_with_values (store, &iter, NULL, 1, 0, "Two row", 1, FALSE, 2, "gtk-file", -1);
+ gtk_tree_store_insert_with_values (store, NULL, &iter, 0, 0, "Three row", 1, FALSE, 2, "gtk-file", -1);
+
+ gtk_tree_view_set_model (GTK_TREE_VIEW (tv), GTK_TREE_MODEL (store));
+
+ g_signal_connect (tv, "button-release-event",
+ G_CALLBACK (release_event), NULL);
+
+ gtk_widget_show_all (window);
+
+ gtk_main ();
+
+ return 0;
+}