forked from AuroraMiddleware/gtk
df455db2e3
One requirement of .ui files is that each object must have an ID, even if it is never referred to or directly loaded from the code. This makes editing .ui files much more onerous than it has to be, due to the frequent need to invent new IDs, while avoiding clashes. This commit makes IDs optional in the XML. They only need to be provided for objects which are referred to or explictly loaded from the code. Since GtkBuilder needs IDs for its own internal accounting, we create IDs of the form ___object_N___ if not specified in the XML. https://bugzilla.gnome.org/show_bug.cgi?id=712553
2832 lines
93 KiB
C
2832 lines
93 KiB
C
/* buildertest.c
|
|
* Copyright (C) 2006-2007 Async Open Source
|
|
* Authors: Johan Dahlin
|
|
* Henrique Romano
|
|
*
|
|
* 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, see <http://www.gnu.org/licenses/>.
|
|
*/
|
|
|
|
#include <string.h>
|
|
#include <libintl.h>
|
|
#include <locale.h>
|
|
#include <math.h>
|
|
|
|
#include <gtk/gtk.h>
|
|
#include <gdk/gdkkeysyms.h>
|
|
|
|
/* exported for GtkBuilder */
|
|
void signal_normal (GtkWindow *window, GParamSpec spec);
|
|
void signal_after (GtkWindow *window, GParamSpec spec);
|
|
void signal_object (GtkButton *button, GParamSpec spec);
|
|
void signal_object_after (GtkButton *button, GParamSpec spec);
|
|
void signal_first (GtkButton *button, GParamSpec spec);
|
|
void signal_second (GtkButton *button, GParamSpec spec);
|
|
void signal_extra (GtkButton *button, GParamSpec spec);
|
|
void signal_extra2 (GtkButton *button, GParamSpec spec);
|
|
|
|
/* Copied from gtkiconfactory.c; keep in sync! */
|
|
struct _GtkIconSet
|
|
{
|
|
guint ref_count;
|
|
GSList *sources;
|
|
GSList *cache;
|
|
guint cache_size;
|
|
guint cache_serial;
|
|
};
|
|
|
|
|
|
static GtkBuilder *
|
|
builder_new_from_string (const gchar *buffer,
|
|
gsize length,
|
|
const gchar *domain)
|
|
{
|
|
GtkBuilder *builder;
|
|
GError *error = NULL;
|
|
|
|
builder = gtk_builder_new ();
|
|
if (domain)
|
|
gtk_builder_set_translation_domain (builder, domain);
|
|
gtk_builder_add_from_string (builder, buffer, length, &error);
|
|
if (error)
|
|
{
|
|
g_print ("ERROR: %s", error->message);
|
|
g_error_free (error);
|
|
}
|
|
|
|
return builder;
|
|
}
|
|
|
|
static void
|
|
test_parser (void)
|
|
{
|
|
GtkBuilder *builder;
|
|
GError *error;
|
|
|
|
builder = gtk_builder_new ();
|
|
|
|
error = NULL;
|
|
gtk_builder_add_from_string (builder, "<xxx/>", -1, &error);
|
|
g_assert (g_error_matches (error,
|
|
GTK_BUILDER_ERROR,
|
|
GTK_BUILDER_ERROR_UNHANDLED_TAG));
|
|
g_error_free (error);
|
|
|
|
error = NULL;
|
|
gtk_builder_add_from_string (builder, "<interface invalid=\"X\"/>", -1, &error);
|
|
g_assert (g_error_matches (error,
|
|
GTK_BUILDER_ERROR,
|
|
GTK_BUILDER_ERROR_INVALID_ATTRIBUTE));
|
|
g_error_free (error);
|
|
|
|
error = NULL;
|
|
gtk_builder_add_from_string (builder, "<interface><child/></interface>", -1, &error);
|
|
g_assert (g_error_matches (error,
|
|
GTK_BUILDER_ERROR,
|
|
GTK_BUILDER_ERROR_INVALID_TAG));
|
|
g_error_free (error);
|
|
|
|
error = NULL;
|
|
gtk_builder_add_from_string (builder, "<interface><object class=\"GtkVBox\" id=\"a\"><object class=\"GtkHBox\" id=\"b\"/></object></interface>", -1, &error);
|
|
g_assert (g_error_matches (error,
|
|
GTK_BUILDER_ERROR,
|
|
GTK_BUILDER_ERROR_INVALID_TAG));
|
|
g_error_free (error);
|
|
|
|
error = NULL;
|
|
gtk_builder_add_from_string (builder, "<interface><object class=\"Unknown\" id=\"a\"></object></interface>", -1, &error);
|
|
g_assert (g_error_matches (error,
|
|
GTK_BUILDER_ERROR,
|
|
GTK_BUILDER_ERROR_INVALID_VALUE));
|
|
g_error_free (error);
|
|
|
|
error = NULL;
|
|
gtk_builder_add_from_string (builder, "<interface><object class=\"GtkWidget\" id=\"a\" constructor=\"none\"></object></interface>", -1, &error);
|
|
g_assert (g_error_matches (error,
|
|
GTK_BUILDER_ERROR,
|
|
GTK_BUILDER_ERROR_INVALID_VALUE));
|
|
g_error_free (error);
|
|
|
|
error = NULL;
|
|
gtk_builder_add_from_string (builder, "<interface><object class=\"GtkButton\" id=\"a\"><child internal-child=\"foobar\"><object class=\"GtkButton\" id=\"int\"/></child></object></interface>", -1, &error);
|
|
g_assert (g_error_matches (error,
|
|
GTK_BUILDER_ERROR,
|
|
GTK_BUILDER_ERROR_INVALID_VALUE));
|
|
g_error_free (error);
|
|
|
|
error = NULL;
|
|
gtk_builder_add_from_string (builder, "<interface><object class=\"GtkButton\" id=\"a\"></object><object class=\"GtkButton\" id=\"a\"/></object></interface>", -1, &error);
|
|
g_assert (g_error_matches (error,
|
|
GTK_BUILDER_ERROR,
|
|
GTK_BUILDER_ERROR_DUPLICATE_ID));
|
|
g_error_free (error);
|
|
|
|
g_object_unref (builder);
|
|
}
|
|
|
|
static int normal = 0;
|
|
static int after = 0;
|
|
static int object = 0;
|
|
static int object_after = 0;
|
|
|
|
void /* exported for GtkBuilder */
|
|
signal_normal (GtkWindow *window, GParamSpec spec)
|
|
{
|
|
g_assert (GTK_IS_WINDOW (window));
|
|
g_assert (normal == 0);
|
|
g_assert (after == 0);
|
|
|
|
normal++;
|
|
}
|
|
|
|
void /* exported for GtkBuilder */
|
|
signal_after (GtkWindow *window, GParamSpec spec)
|
|
{
|
|
g_assert (GTK_IS_WINDOW (window));
|
|
g_assert (normal == 1);
|
|
g_assert (after == 0);
|
|
|
|
after++;
|
|
}
|
|
|
|
void /* exported for GtkBuilder */
|
|
signal_object (GtkButton *button, GParamSpec spec)
|
|
{
|
|
g_assert (GTK_IS_BUTTON (button));
|
|
g_assert (object == 0);
|
|
g_assert (object_after == 0);
|
|
|
|
object++;
|
|
}
|
|
|
|
void /* exported for GtkBuilder */
|
|
signal_object_after (GtkButton *button, GParamSpec spec)
|
|
{
|
|
g_assert (GTK_IS_BUTTON (button));
|
|
g_assert (object == 1);
|
|
g_assert (object_after == 0);
|
|
|
|
object_after++;
|
|
}
|
|
|
|
void /* exported for GtkBuilder */
|
|
signal_first (GtkButton *button, GParamSpec spec)
|
|
{
|
|
g_assert (normal == 0);
|
|
normal = 10;
|
|
}
|
|
|
|
void /* exported for GtkBuilder */
|
|
signal_second (GtkButton *button, GParamSpec spec)
|
|
{
|
|
g_assert (normal == 10);
|
|
normal = 20;
|
|
}
|
|
|
|
void /* exported for GtkBuilder */
|
|
signal_extra (GtkButton *button, GParamSpec spec)
|
|
{
|
|
g_assert (normal == 20);
|
|
normal = 30;
|
|
}
|
|
|
|
void /* exported for GtkBuilder */
|
|
signal_extra2 (GtkButton *button, GParamSpec spec)
|
|
{
|
|
g_assert (normal == 30);
|
|
normal = 40;
|
|
}
|
|
|
|
static void
|
|
test_connect_signals (void)
|
|
{
|
|
GtkBuilder *builder;
|
|
GObject *window;
|
|
const gchar buffer[] =
|
|
"<interface>"
|
|
" <object class=\"GtkButton\" id=\"button\"/>"
|
|
" <object class=\"GtkWindow\" id=\"window1\">"
|
|
" <signal name=\"notify::title\" handler=\"signal_normal\"/>"
|
|
" <signal name=\"notify::title\" handler=\"signal_after\" after=\"yes\"/>"
|
|
" <signal name=\"notify::title\" handler=\"signal_object\""
|
|
" object=\"button\"/>"
|
|
" <signal name=\"notify::title\" handler=\"signal_object_after\""
|
|
" object=\"button\" after=\"yes\"/>"
|
|
" </object>"
|
|
"</interface>";
|
|
const gchar buffer_order[] =
|
|
"<interface>"
|
|
" <object class=\"GtkWindow\" id=\"window1\">"
|
|
" <signal name=\"notify::title\" handler=\"signal_first\"/>"
|
|
" <signal name=\"notify::title\" handler=\"signal_second\"/>"
|
|
" </object>"
|
|
"</interface>";
|
|
const gchar buffer_extra[] =
|
|
"<interface>"
|
|
" <object class=\"GtkWindow\" id=\"window2\">"
|
|
" <signal name=\"notify::title\" handler=\"signal_extra\"/>"
|
|
" </object>"
|
|
"</interface>";
|
|
const gchar buffer_extra2[] =
|
|
"<interface>"
|
|
" <object class=\"GtkWindow\" id=\"window3\">"
|
|
" <signal name=\"notify::title\" handler=\"signal_extra2\"/>"
|
|
" </object>"
|
|
"</interface>";
|
|
const gchar buffer_after_child[] =
|
|
"<interface>"
|
|
" <object class=\"GtkWindow\" id=\"window1\">"
|
|
" <child>"
|
|
" <object class=\"GtkButton\" id=\"button1\"/>"
|
|
" </child>"
|
|
" <signal name=\"notify::title\" handler=\"signal_normal\"/>"
|
|
" </object>"
|
|
"</interface>";
|
|
|
|
builder = builder_new_from_string (buffer, -1, NULL);
|
|
gtk_builder_connect_signals (builder, NULL);
|
|
|
|
window = gtk_builder_get_object (builder, "window1");
|
|
gtk_window_set_title (GTK_WINDOW (window), "test");
|
|
|
|
g_assert_cmpint (normal, ==, 1);
|
|
g_assert_cmpint (after, ==, 1);
|
|
g_assert_cmpint (object, ==, 1);
|
|
g_assert_cmpint (object_after, ==, 1);
|
|
|
|
gtk_widget_destroy (GTK_WIDGET (window));
|
|
g_object_unref (builder);
|
|
|
|
builder = builder_new_from_string (buffer_order, -1, NULL);
|
|
gtk_builder_connect_signals (builder, NULL);
|
|
window = gtk_builder_get_object (builder, "window1");
|
|
normal = 0;
|
|
gtk_window_set_title (GTK_WINDOW (window), "test");
|
|
g_assert (normal == 20);
|
|
|
|
gtk_widget_destroy (GTK_WIDGET (window));
|
|
|
|
gtk_builder_add_from_string (builder, buffer_extra,
|
|
strlen (buffer_extra), NULL);
|
|
gtk_builder_add_from_string (builder, buffer_extra2,
|
|
strlen (buffer_extra2), NULL);
|
|
gtk_builder_connect_signals (builder, NULL);
|
|
window = gtk_builder_get_object (builder, "window2");
|
|
gtk_window_set_title (GTK_WINDOW (window), "test");
|
|
g_assert (normal == 30);
|
|
|
|
gtk_widget_destroy (GTK_WIDGET (window));
|
|
window = gtk_builder_get_object (builder, "window3");
|
|
gtk_window_set_title (GTK_WINDOW (window), "test");
|
|
g_assert (normal == 40);
|
|
gtk_widget_destroy (GTK_WIDGET (window));
|
|
|
|
g_object_unref (builder);
|
|
|
|
/* new test, reset globals */
|
|
after = 0;
|
|
normal = 0;
|
|
|
|
builder = builder_new_from_string (buffer_after_child, -1, NULL);
|
|
window = gtk_builder_get_object (builder, "window1");
|
|
gtk_builder_connect_signals (builder, NULL);
|
|
gtk_window_set_title (GTK_WINDOW (window), "test");
|
|
|
|
g_assert (normal == 1);
|
|
gtk_widget_destroy (GTK_WIDGET (window));
|
|
g_object_unref (builder);
|
|
}
|
|
|
|
static void
|
|
test_uimanager_simple (void)
|
|
{
|
|
GtkBuilder *builder;
|
|
GObject *window, *uimgr, *menubar;
|
|
GObject *menu, *label;
|
|
GList *children;
|
|
const gchar buffer[] =
|
|
"<interface>"
|
|
" <object class=\"GtkUIManager\" id=\"uimgr1\"/>"
|
|
"</interface>";
|
|
|
|
const gchar buffer2[] =
|
|
"<interface>"
|
|
" <object class=\"GtkUIManager\" id=\"uimgr1\">"
|
|
" <child>"
|
|
" <object class=\"GtkActionGroup\" id=\"ag1\">"
|
|
" <child>"
|
|
" <object class=\"GtkAction\" id=\"file\">"
|
|
" <property name=\"label\">_File</property>"
|
|
" </object>"
|
|
" <accelerator key=\"n\" modifiers=\"GDK_CONTROL_MASK\"/>"
|
|
" </child>"
|
|
" </object>"
|
|
" </child>"
|
|
" <ui>"
|
|
" <menubar name=\"menubar1\">"
|
|
" <menu action=\"file\">"
|
|
" </menu>"
|
|
" </menubar>"
|
|
" </ui>"
|
|
" </object>"
|
|
" <object class=\"GtkWindow\" id=\"window1\">"
|
|
" <child>"
|
|
" <object class=\"GtkMenuBar\" id=\"menubar1\" constructor=\"uimgr1\"/>"
|
|
" </child>"
|
|
" </object>"
|
|
"</interface>";
|
|
|
|
builder = builder_new_from_string (buffer, -1, NULL);
|
|
|
|
uimgr = gtk_builder_get_object (builder, "uimgr1");
|
|
G_GNUC_BEGIN_IGNORE_DEPRECATIONS;
|
|
g_assert (GTK_IS_UI_MANAGER (uimgr));
|
|
G_GNUC_END_IGNORE_DEPRECATIONS;
|
|
g_object_unref (builder);
|
|
|
|
builder = builder_new_from_string (buffer2, -1, NULL);
|
|
|
|
menubar = gtk_builder_get_object (builder, "menubar1");
|
|
g_assert (GTK_IS_MENU_BAR (menubar));
|
|
|
|
children = gtk_container_get_children (GTK_CONTAINER (menubar));
|
|
menu = children->data;
|
|
g_assert (GTK_IS_MENU_ITEM (menu));
|
|
g_assert (strcmp (gtk_widget_get_name (GTK_WIDGET (menu)), "file") == 0);
|
|
g_list_free (children);
|
|
|
|
label = G_OBJECT (gtk_bin_get_child (GTK_BIN (menu)));
|
|
g_assert (GTK_IS_LABEL (label));
|
|
g_assert (strcmp (gtk_label_get_text (GTK_LABEL (label)), "File") == 0);
|
|
|
|
window = gtk_builder_get_object (builder, "window1");
|
|
gtk_widget_destroy (GTK_WIDGET (window));
|
|
g_object_unref (builder);
|
|
}
|
|
|
|
static void
|
|
test_domain (void)
|
|
{
|
|
GtkBuilder *builder;
|
|
const gchar buffer1[] = "<interface/>";
|
|
const gchar buffer2[] = "<interface domain=\"domain\"/>";
|
|
const gchar *domain;
|
|
|
|
builder = builder_new_from_string (buffer1, -1, NULL);
|
|
domain = gtk_builder_get_translation_domain (builder);
|
|
g_assert (domain == NULL);
|
|
g_object_unref (builder);
|
|
|
|
builder = builder_new_from_string (buffer1, -1, "domain-1");
|
|
domain = gtk_builder_get_translation_domain (builder);
|
|
g_assert (domain);
|
|
g_assert (strcmp (domain, "domain-1") == 0);
|
|
g_object_unref (builder);
|
|
|
|
builder = builder_new_from_string (buffer2, -1, NULL);
|
|
domain = gtk_builder_get_translation_domain (builder);
|
|
g_assert (domain == NULL);
|
|
g_object_unref (builder);
|
|
}
|
|
|
|
#if 0
|
|
static void
|
|
test_translation (void)
|
|
{
|
|
GtkBuilder *builder;
|
|
const gchar buffer[] =
|
|
"<interface>"
|
|
" <object class=\"GtkWindow\" id=\"window1\">"
|
|
" <child>"
|
|
" <object class=\"GtkLabel\" id=\"label\">"
|
|
" <property name=\"label\" translatable=\"yes\">File</property>"
|
|
" </object>"
|
|
" </child>"
|
|
" </object>"
|
|
"</interface>";
|
|
GtkLabel *window, *label;
|
|
|
|
setlocale (LC_ALL, "sv_SE");
|
|
textdomain ("builder");
|
|
bindtextdomain ("builder", "tests");
|
|
|
|
builder = builder_new_from_string (buffer, -1, NULL);
|
|
label = GTK_LABEL (gtk_builder_get_object (builder, "label"));
|
|
g_assert (strcmp (gtk_label_get_text (label), "Arkiv") == 0);
|
|
|
|
window = gtk_builder_get_object (builder, "window1");
|
|
gtk_widget_destroy (GTK_WIDGET (window));
|
|
g_object_unref (builder);
|
|
}
|
|
#endif
|
|
|
|
static void
|
|
test_sizegroup (void)
|
|
{
|
|
GtkBuilder * builder;
|
|
const gchar buffer1[] =
|
|
"<interface domain=\"test\">"
|
|
" <object class=\"GtkSizeGroup\" id=\"sizegroup1\">"
|
|
" <property name=\"mode\">GTK_SIZE_GROUP_HORIZONTAL</property>"
|
|
" <widgets>"
|
|
" <widget name=\"radio1\"/>"
|
|
" <widget name=\"radio2\"/>"
|
|
" </widgets>"
|
|
" </object>"
|
|
" <object class=\"GtkWindow\" id=\"window1\">"
|
|
" <child>"
|
|
" <object class=\"GtkVBox\" id=\"vbox1\">"
|
|
" <child>"
|
|
" <object class=\"GtkRadioButton\" id=\"radio1\"/>"
|
|
" </child>"
|
|
" <child>"
|
|
" <object class=\"GtkRadioButton\" id=\"radio2\"/>"
|
|
" </child>"
|
|
" </object>"
|
|
" </child>"
|
|
" </object>"
|
|
"</interface>";
|
|
const gchar buffer2[] =
|
|
"<interface domain=\"test\">"
|
|
" <object class=\"GtkSizeGroup\" id=\"sizegroup1\">"
|
|
" <property name=\"mode\">GTK_SIZE_GROUP_HORIZONTAL</property>"
|
|
" <widgets>"
|
|
" </widgets>"
|
|
" </object>"
|
|
"</interface>";
|
|
const gchar buffer3[] =
|
|
"<interface domain=\"test\">"
|
|
" <object class=\"GtkSizeGroup\" id=\"sizegroup1\">"
|
|
" <property name=\"mode\">GTK_SIZE_GROUP_HORIZONTAL</property>"
|
|
" <widgets>"
|
|
" <widget name=\"radio1\"/>"
|
|
" <widget name=\"radio2\"/>"
|
|
" </widgets>"
|
|
" </object>"
|
|
" <object class=\"GtkSizeGroup\" id=\"sizegroup2\">"
|
|
" <property name=\"mode\">GTK_SIZE_GROUP_HORIZONTAL</property>"
|
|
" <widgets>"
|
|
" <widget name=\"radio1\"/>"
|
|
" <widget name=\"radio2\"/>"
|
|
" </widgets>"
|
|
" </object>"
|
|
" <object class=\"GtkWindow\" id=\"window1\">"
|
|
" <child>"
|
|
" <object class=\"GtkVBox\" id=\"vbox1\">"
|
|
" <child>"
|
|
" <object class=\"GtkRadioButton\" id=\"radio1\"/>"
|
|
" </child>"
|
|
" <child>"
|
|
" <object class=\"GtkRadioButton\" id=\"radio2\"/>"
|
|
" </child>"
|
|
" </object>"
|
|
" </child>"
|
|
" </object>"
|
|
"</interface>";
|
|
GObject *sizegroup;
|
|
GSList *widgets;
|
|
|
|
builder = builder_new_from_string (buffer1, -1, NULL);
|
|
sizegroup = gtk_builder_get_object (builder, "sizegroup1");
|
|
widgets = gtk_size_group_get_widgets (GTK_SIZE_GROUP (sizegroup));
|
|
g_assert (g_slist_length (widgets) == 2);
|
|
g_slist_free (widgets);
|
|
g_object_unref (builder);
|
|
|
|
builder = builder_new_from_string (buffer2, -1, NULL);
|
|
sizegroup = gtk_builder_get_object (builder, "sizegroup1");
|
|
widgets = gtk_size_group_get_widgets (GTK_SIZE_GROUP (sizegroup));
|
|
g_assert (g_slist_length (widgets) == 0);
|
|
g_slist_free (widgets);
|
|
g_object_unref (builder);
|
|
|
|
builder = builder_new_from_string (buffer3, -1, NULL);
|
|
sizegroup = gtk_builder_get_object (builder, "sizegroup1");
|
|
widgets = gtk_size_group_get_widgets (GTK_SIZE_GROUP (sizegroup));
|
|
g_assert (g_slist_length (widgets) == 2);
|
|
g_slist_free (widgets);
|
|
sizegroup = gtk_builder_get_object (builder, "sizegroup2");
|
|
widgets = gtk_size_group_get_widgets (GTK_SIZE_GROUP (sizegroup));
|
|
g_assert (g_slist_length (widgets) == 2);
|
|
g_slist_free (widgets);
|
|
|
|
#if 0
|
|
{
|
|
GObject *window;
|
|
window = gtk_builder_get_object (builder, "window1");
|
|
gtk_widget_destroy (GTK_WIDGET (window));
|
|
}
|
|
#endif
|
|
g_object_unref (builder);
|
|
}
|
|
|
|
static void
|
|
test_list_store (void)
|
|
{
|
|
const gchar buffer1[] =
|
|
"<interface>"
|
|
" <object class=\"GtkListStore\" id=\"liststore1\">"
|
|
" <columns>"
|
|
" <column type=\"gchararray\"/>"
|
|
" <column type=\"guint\"/>"
|
|
" </columns>"
|
|
" </object>"
|
|
"</interface>";
|
|
const char buffer2[] =
|
|
"<interface>"
|
|
" <object class=\"GtkListStore\" id=\"liststore1\">"
|
|
" <columns>"
|
|
" <column type=\"gchararray\"/>"
|
|
" <column type=\"gchararray\"/>"
|
|
" <column type=\"gint\"/>"
|
|
" </columns>"
|
|
" <data>"
|
|
" <row>"
|
|
" <col id=\"0\" translatable=\"yes\">John</col>"
|
|
" <col id=\"1\" context=\"foo\">Doe</col>"
|
|
" <col id=\"2\" comment=\"foobar\">25</col>"
|
|
" </row>"
|
|
" <row>"
|
|
" <col id=\"0\">Johan</col>"
|
|
" <col id=\"1\">Dole</col>"
|
|
" <col id=\"2\">50</col>"
|
|
" </row>"
|
|
" </data>"
|
|
" </object>"
|
|
"</interface>";
|
|
const char buffer3[] =
|
|
"<interface>"
|
|
" <object class=\"GtkListStore\" id=\"liststore1\">"
|
|
" <columns>"
|
|
" <column type=\"gchararray\"/>"
|
|
" <column type=\"gchararray\"/>"
|
|
" <column type=\"gint\"/>"
|
|
" </columns>"
|
|
" <data>"
|
|
" <row>"
|
|
" <col id=\"1\" context=\"foo\">Doe</col>"
|
|
" <col id=\"0\" translatable=\"yes\">John</col>"
|
|
" <col id=\"2\" comment=\"foobar\">25</col>"
|
|
" </row>"
|
|
" <row>"
|
|
" <col id=\"2\">50</col>"
|
|
" <col id=\"1\">Dole</col>"
|
|
" <col id=\"0\">Johan</col>"
|
|
" </row>"
|
|
" <row>"
|
|
" <col id=\"2\">19</col>"
|
|
" </row>"
|
|
" </data>"
|
|
" </object>"
|
|
"</interface>";
|
|
GtkBuilder *builder;
|
|
GObject *store;
|
|
GtkTreeIter iter;
|
|
gchar *surname, *lastname;
|
|
int age;
|
|
|
|
builder = builder_new_from_string (buffer1, -1, NULL);
|
|
store = gtk_builder_get_object (builder, "liststore1");
|
|
g_assert (gtk_tree_model_get_n_columns (GTK_TREE_MODEL (store)) == 2);
|
|
g_assert (gtk_tree_model_get_column_type (GTK_TREE_MODEL (store), 0) == G_TYPE_STRING);
|
|
g_assert (gtk_tree_model_get_column_type (GTK_TREE_MODEL (store), 1) == G_TYPE_UINT);
|
|
g_object_unref (builder);
|
|
|
|
builder = builder_new_from_string (buffer2, -1, NULL);
|
|
store = gtk_builder_get_object (builder, "liststore1");
|
|
g_assert (gtk_tree_model_get_n_columns (GTK_TREE_MODEL (store)) == 3);
|
|
g_assert (gtk_tree_model_get_column_type (GTK_TREE_MODEL (store), 0) == G_TYPE_STRING);
|
|
g_assert (gtk_tree_model_get_column_type (GTK_TREE_MODEL (store), 1) == G_TYPE_STRING);
|
|
g_assert (gtk_tree_model_get_column_type (GTK_TREE_MODEL (store), 2) == G_TYPE_INT);
|
|
|
|
g_assert (gtk_tree_model_get_iter_first (GTK_TREE_MODEL (store), &iter) == TRUE);
|
|
gtk_tree_model_get (GTK_TREE_MODEL (store), &iter,
|
|
0, &surname,
|
|
1, &lastname,
|
|
2, &age,
|
|
-1);
|
|
g_assert (surname != NULL);
|
|
g_assert (strcmp (surname, "John") == 0);
|
|
g_free (surname);
|
|
g_assert (lastname != NULL);
|
|
g_assert (strcmp (lastname, "Doe") == 0);
|
|
g_free (lastname);
|
|
g_assert (age == 25);
|
|
g_assert (gtk_tree_model_iter_next (GTK_TREE_MODEL (store), &iter) == TRUE);
|
|
|
|
gtk_tree_model_get (GTK_TREE_MODEL (store), &iter,
|
|
0, &surname,
|
|
1, &lastname,
|
|
2, &age,
|
|
-1);
|
|
g_assert (surname != NULL);
|
|
g_assert (strcmp (surname, "Johan") == 0);
|
|
g_free (surname);
|
|
g_assert (lastname != NULL);
|
|
g_assert (strcmp (lastname, "Dole") == 0);
|
|
g_free (lastname);
|
|
g_assert (age == 50);
|
|
g_assert (gtk_tree_model_iter_next (GTK_TREE_MODEL (store), &iter) == FALSE);
|
|
|
|
g_object_unref (builder);
|
|
|
|
builder = builder_new_from_string (buffer3, -1, NULL);
|
|
store = gtk_builder_get_object (builder, "liststore1");
|
|
g_assert (gtk_tree_model_get_n_columns (GTK_TREE_MODEL (store)) == 3);
|
|
g_assert (gtk_tree_model_get_column_type (GTK_TREE_MODEL (store), 0) == G_TYPE_STRING);
|
|
g_assert (gtk_tree_model_get_column_type (GTK_TREE_MODEL (store), 1) == G_TYPE_STRING);
|
|
g_assert (gtk_tree_model_get_column_type (GTK_TREE_MODEL (store), 2) == G_TYPE_INT);
|
|
|
|
g_assert (gtk_tree_model_get_iter_first (GTK_TREE_MODEL (store), &iter) == TRUE);
|
|
gtk_tree_model_get (GTK_TREE_MODEL (store), &iter,
|
|
0, &surname,
|
|
1, &lastname,
|
|
2, &age,
|
|
-1);
|
|
g_assert (surname != NULL);
|
|
g_assert (strcmp (surname, "John") == 0);
|
|
g_free (surname);
|
|
g_assert (lastname != NULL);
|
|
g_assert (strcmp (lastname, "Doe") == 0);
|
|
g_free (lastname);
|
|
g_assert (age == 25);
|
|
g_assert (gtk_tree_model_iter_next (GTK_TREE_MODEL (store), &iter) == TRUE);
|
|
|
|
gtk_tree_model_get (GTK_TREE_MODEL (store), &iter,
|
|
0, &surname,
|
|
1, &lastname,
|
|
2, &age,
|
|
-1);
|
|
g_assert (surname != NULL);
|
|
g_assert (strcmp (surname, "Johan") == 0);
|
|
g_free (surname);
|
|
g_assert (lastname != NULL);
|
|
g_assert (strcmp (lastname, "Dole") == 0);
|
|
g_free (lastname);
|
|
g_assert (age == 50);
|
|
g_assert (gtk_tree_model_iter_next (GTK_TREE_MODEL (store), &iter) == TRUE);
|
|
|
|
gtk_tree_model_get (GTK_TREE_MODEL (store), &iter,
|
|
0, &surname,
|
|
1, &lastname,
|
|
2, &age,
|
|
-1);
|
|
g_assert (surname == NULL);
|
|
g_assert (lastname == NULL);
|
|
g_assert (age == 19);
|
|
g_assert (gtk_tree_model_iter_next (GTK_TREE_MODEL (store), &iter) == FALSE);
|
|
|
|
g_object_unref (builder);
|
|
}
|
|
|
|
static void
|
|
test_tree_store (void)
|
|
{
|
|
const gchar buffer[] =
|
|
"<interface domain=\"test\">"
|
|
" <object class=\"GtkTreeStore\" id=\"treestore1\">"
|
|
" <columns>"
|
|
" <column type=\"gchararray\"/>"
|
|
" <column type=\"guint\"/>"
|
|
" </columns>"
|
|
" </object>"
|
|
"</interface>";
|
|
GtkBuilder *builder;
|
|
GObject *store;
|
|
|
|
builder = builder_new_from_string (buffer, -1, NULL);
|
|
store = gtk_builder_get_object (builder, "treestore1");
|
|
g_assert (gtk_tree_model_get_n_columns (GTK_TREE_MODEL (store)) == 2);
|
|
g_assert (gtk_tree_model_get_column_type (GTK_TREE_MODEL (store), 0) == G_TYPE_STRING);
|
|
g_assert (gtk_tree_model_get_column_type (GTK_TREE_MODEL (store), 1) == G_TYPE_UINT);
|
|
|
|
g_object_unref (builder);
|
|
}
|
|
|
|
static void
|
|
test_types (void)
|
|
{
|
|
const gchar buffer[] =
|
|
"<interface>"
|
|
" <object class=\"GtkAction\" id=\"action\"/>"
|
|
" <object class=\"GtkActionGroup\" id=\"actiongroup\"/>"
|
|
" <object class=\"GtkAlignment\" id=\"alignment\"/>"
|
|
" <object class=\"GtkArrow\" id=\"arrow\"/>"
|
|
" <object class=\"GtkButton\" id=\"button\"/>"
|
|
" <object class=\"GtkCheckButton\" id=\"checkbutton\"/>"
|
|
" <object class=\"GtkDialog\" id=\"dialog\"/>"
|
|
" <object class=\"GtkDrawingArea\" id=\"drawingarea\"/>"
|
|
" <object class=\"GtkEventBox\" id=\"eventbox\"/>"
|
|
" <object class=\"GtkEntry\" id=\"entry\"/>"
|
|
" <object class=\"GtkFontButton\" id=\"fontbutton\"/>"
|
|
" <object class=\"GtkHButtonBox\" id=\"hbuttonbox\"/>"
|
|
" <object class=\"GtkHBox\" id=\"hbox\"/>"
|
|
" <object class=\"GtkHPaned\" id=\"hpaned\"/>"
|
|
" <object class=\"GtkHScale\" id=\"hscale\"/>"
|
|
" <object class=\"GtkHScrollbar\" id=\"hscrollbar\"/>"
|
|
" <object class=\"GtkHSeparator\" id=\"hseparator\"/>"
|
|
" <object class=\"GtkImage\" id=\"image\"/>"
|
|
" <object class=\"GtkLabel\" id=\"label\"/>"
|
|
" <object class=\"GtkListStore\" id=\"liststore\"/>"
|
|
" <object class=\"GtkMenuBar\" id=\"menubar\"/>"
|
|
" <object class=\"GtkNotebook\" id=\"notebook\"/>"
|
|
" <object class=\"GtkProgressBar\" id=\"progressbar\"/>"
|
|
" <object class=\"GtkRadioButton\" id=\"radiobutton\"/>"
|
|
" <object class=\"GtkSizeGroup\" id=\"sizegroup\"/>"
|
|
" <object class=\"GtkScrolledWindow\" id=\"scrolledwindow\"/>"
|
|
" <object class=\"GtkSpinButton\" id=\"spinbutton\"/>"
|
|
" <object class=\"GtkStatusbar\" id=\"statusbar\"/>"
|
|
" <object class=\"GtkTextView\" id=\"textview\"/>"
|
|
" <object class=\"GtkToggleAction\" id=\"toggleaction\"/>"
|
|
" <object class=\"GtkToggleButton\" id=\"togglebutton\"/>"
|
|
" <object class=\"GtkToolbar\" id=\"toolbar\"/>"
|
|
" <object class=\"GtkTreeStore\" id=\"treestore\"/>"
|
|
" <object class=\"GtkTreeView\" id=\"treeview\"/>"
|
|
" <object class=\"GtkTable\" id=\"table\"/>"
|
|
" <object class=\"GtkVBox\" id=\"vbox\"/>"
|
|
" <object class=\"GtkVButtonBox\" id=\"vbuttonbox\"/>"
|
|
" <object class=\"GtkVScrollbar\" id=\"vscrollbar\"/>"
|
|
" <object class=\"GtkVSeparator\" id=\"vseparator\"/>"
|
|
" <object class=\"GtkViewport\" id=\"viewport\"/>"
|
|
" <object class=\"GtkVPaned\" id=\"vpaned\"/>"
|
|
" <object class=\"GtkVScale\" id=\"vscale\"/>"
|
|
" <object class=\"GtkWindow\" id=\"window\"/>"
|
|
" <object class=\"GtkUIManager\" id=\"uimanager\"/>"
|
|
"</interface>";
|
|
const gchar buffer2[] =
|
|
"<interface>"
|
|
" <object type-func=\"gtk_window_get_type\" id=\"window\"/>"
|
|
"</interface>";
|
|
const gchar buffer3[] =
|
|
"<interface>"
|
|
" <object type-func=\"xxx_invalid_get_type_function\" id=\"window\"/>"
|
|
"</interface>";
|
|
GtkBuilder *builder;
|
|
GObject *window;
|
|
GError *error;
|
|
|
|
builder = builder_new_from_string (buffer, -1, NULL);
|
|
gtk_widget_destroy (GTK_WIDGET (gtk_builder_get_object (builder, "dialog")));
|
|
gtk_widget_destroy (GTK_WIDGET (gtk_builder_get_object (builder, "window")));
|
|
g_object_unref (builder);
|
|
|
|
builder = builder_new_from_string (buffer2, -1, NULL);
|
|
window = gtk_builder_get_object (builder, "window");
|
|
g_assert (GTK_IS_WINDOW (window));
|
|
gtk_widget_destroy (GTK_WIDGET (window));
|
|
g_object_unref (builder);
|
|
|
|
error = NULL;
|
|
builder = gtk_builder_new ();
|
|
gtk_builder_add_from_string (builder, buffer3, -1, &error);
|
|
g_assert (g_error_matches (error,
|
|
GTK_BUILDER_ERROR,
|
|
GTK_BUILDER_ERROR_INVALID_TYPE_FUNCTION));
|
|
g_error_free (error);
|
|
g_object_unref (builder);
|
|
}
|
|
|
|
static void
|
|
test_spin_button (void)
|
|
{
|
|
GtkBuilder *builder;
|
|
const gchar buffer[] =
|
|
"<interface>"
|
|
"<object class=\"GtkAdjustment\" id=\"adjustment1\">"
|
|
"<property name=\"lower\">0</property>"
|
|
"<property name=\"upper\">10</property>"
|
|
"<property name=\"step-increment\">2</property>"
|
|
"<property name=\"page-increment\">3</property>"
|
|
"<property name=\"page-size\">0</property>"
|
|
"<property name=\"value\">1</property>"
|
|
"</object>"
|
|
"<object class=\"GtkSpinButton\" id=\"spinbutton1\">"
|
|
"<property name=\"visible\">True</property>"
|
|
"<property name=\"adjustment\">adjustment1</property>"
|
|
"</object>"
|
|
"</interface>";
|
|
GObject *obj;
|
|
GtkAdjustment *adjustment;
|
|
gdouble value;
|
|
|
|
builder = builder_new_from_string (buffer, -1, NULL);
|
|
obj = gtk_builder_get_object (builder, "spinbutton1");
|
|
g_assert (GTK_IS_SPIN_BUTTON (obj));
|
|
adjustment = gtk_spin_button_get_adjustment (GTK_SPIN_BUTTON (obj));
|
|
g_assert (GTK_IS_ADJUSTMENT (adjustment));
|
|
g_object_get (adjustment, "value", &value, NULL);
|
|
g_assert (value == 1);
|
|
g_object_get (adjustment, "lower", &value, NULL);
|
|
g_assert (value == 0);
|
|
g_object_get (adjustment, "upper", &value, NULL);
|
|
g_assert (value == 10);
|
|
g_object_get (adjustment, "step-increment", &value, NULL);
|
|
g_assert (value == 2);
|
|
g_object_get (adjustment, "page-increment", &value, NULL);
|
|
g_assert (value == 3);
|
|
g_object_get (adjustment, "page-size", &value, NULL);
|
|
g_assert (value == 0);
|
|
|
|
g_object_unref (builder);
|
|
}
|
|
|
|
static void
|
|
test_notebook (void)
|
|
{
|
|
GtkBuilder *builder;
|
|
const gchar buffer[] =
|
|
"<interface>"
|
|
" <object class=\"GtkNotebook\" id=\"notebook1\">"
|
|
" <child>"
|
|
" <object class=\"GtkLabel\" id=\"label1\">"
|
|
" <property name=\"label\">label1</property>"
|
|
" </object>"
|
|
" </child>"
|
|
" <child type=\"tab\">"
|
|
" <object class=\"GtkLabel\" id=\"tablabel1\">"
|
|
" <property name=\"label\">tab_label1</property>"
|
|
" </object>"
|
|
" </child>"
|
|
" <child>"
|
|
" <object class=\"GtkLabel\" id=\"label2\">"
|
|
" <property name=\"label\">label2</property>"
|
|
" </object>"
|
|
" </child>"
|
|
" <child type=\"tab\">"
|
|
" <object class=\"GtkLabel\" id=\"tablabel2\">"
|
|
" <property name=\"label\">tab_label2</property>"
|
|
" </object>"
|
|
" </child>"
|
|
" </object>"
|
|
"</interface>";
|
|
GObject *notebook;
|
|
GtkWidget *label;
|
|
|
|
builder = builder_new_from_string (buffer, -1, NULL);
|
|
notebook = gtk_builder_get_object (builder, "notebook1");
|
|
g_assert (notebook != NULL);
|
|
g_assert (gtk_notebook_get_n_pages (GTK_NOTEBOOK (notebook)) == 2);
|
|
|
|
label = gtk_notebook_get_nth_page (GTK_NOTEBOOK (notebook), 0);
|
|
g_assert (GTK_IS_LABEL (label));
|
|
g_assert (strcmp (gtk_label_get_label (GTK_LABEL (label)), "label1") == 0);
|
|
label = gtk_notebook_get_tab_label (GTK_NOTEBOOK (notebook), label);
|
|
g_assert (GTK_IS_LABEL (label));
|
|
g_assert (strcmp (gtk_label_get_label (GTK_LABEL (label)), "tab_label1") == 0);
|
|
|
|
label = gtk_notebook_get_nth_page (GTK_NOTEBOOK (notebook), 1);
|
|
g_assert (GTK_IS_LABEL (label));
|
|
g_assert (strcmp (gtk_label_get_label (GTK_LABEL (label)), "label2") == 0);
|
|
label = gtk_notebook_get_tab_label (GTK_NOTEBOOK (notebook), label);
|
|
g_assert (GTK_IS_LABEL (label));
|
|
g_assert (strcmp (gtk_label_get_label (GTK_LABEL (label)), "tab_label2") == 0);
|
|
|
|
g_object_unref (builder);
|
|
}
|
|
|
|
static void
|
|
test_construct_only_property (void)
|
|
{
|
|
GtkBuilder *builder;
|
|
const gchar buffer[] =
|
|
"<interface>"
|
|
" <object class=\"GtkWindow\" id=\"window1\">"
|
|
" <property name=\"type\">GTK_WINDOW_POPUP</property>"
|
|
" </object>"
|
|
"</interface>";
|
|
const gchar buffer2[] =
|
|
"<interface>"
|
|
" <object class=\"GtkTextTagTable\" id=\"tagtable1\"/>"
|
|
" <object class=\"GtkTextBuffer\" id=\"textbuffer1\">"
|
|
" <property name=\"tag-table\">tagtable1</property>"
|
|
" </object>"
|
|
"</interface>";
|
|
GObject *widget, *tagtable, *textbuffer;
|
|
GtkWindowType type;
|
|
|
|
builder = builder_new_from_string (buffer, -1, NULL);
|
|
widget = gtk_builder_get_object (builder, "window1");
|
|
g_object_get (widget, "type", &type, NULL);
|
|
g_assert (type == GTK_WINDOW_POPUP);
|
|
|
|
gtk_widget_destroy (GTK_WIDGET (widget));
|
|
g_object_unref (builder);
|
|
|
|
builder = builder_new_from_string (buffer2, -1, NULL);
|
|
textbuffer = gtk_builder_get_object (builder, "textbuffer1");
|
|
g_assert (textbuffer != NULL);
|
|
g_object_get (textbuffer, "tag-table", &tagtable, NULL);
|
|
g_assert (tagtable == gtk_builder_get_object (builder, "tagtable1"));
|
|
g_object_unref (tagtable);
|
|
g_object_unref (builder);
|
|
}
|
|
|
|
static void
|
|
test_object_properties (void)
|
|
{
|
|
GtkBuilder *builder;
|
|
const gchar buffer[] =
|
|
"<interface>"
|
|
" <object class=\"GtkWindow\" id=\"window1\">"
|
|
" <child>"
|
|
" <object class=\"GtkVBox\" id=\"vbox\">"
|
|
" <property name=\"border-width\">10</property>"
|
|
" <child>"
|
|
" <object class=\"GtkLabel\" id=\"label1\">"
|
|
" <property name=\"mnemonic-widget\">spinbutton1</property>"
|
|
" </object>"
|
|
" </child>"
|
|
" <child>"
|
|
" <object class=\"GtkSpinButton\" id=\"spinbutton1\"/>"
|
|
" </child>"
|
|
" </object>"
|
|
" </child>"
|
|
" </object>"
|
|
"</interface>";
|
|
const gchar buffer2[] =
|
|
"<interface>"
|
|
" <object class=\"GtkWindow\" id=\"window2\"/>"
|
|
"</interface>";
|
|
GObject *label, *spinbutton, *window;
|
|
|
|
builder = builder_new_from_string (buffer, -1, NULL);
|
|
label = gtk_builder_get_object (builder, "label1");
|
|
g_assert (label != NULL);
|
|
spinbutton = gtk_builder_get_object (builder, "spinbutton1");
|
|
g_assert (spinbutton != NULL);
|
|
g_assert (spinbutton == (GObject*)gtk_label_get_mnemonic_widget (GTK_LABEL (label)));
|
|
|
|
gtk_builder_add_from_string (builder, buffer2, -1, NULL);
|
|
window = gtk_builder_get_object (builder, "window2");
|
|
g_assert (window != NULL);
|
|
gtk_widget_destroy (GTK_WIDGET (window));
|
|
|
|
g_object_unref (builder);
|
|
}
|
|
|
|
static void
|
|
test_children (void)
|
|
{
|
|
GtkBuilder * builder;
|
|
GtkWidget *content_area, *dialog_action_area;
|
|
GList *children;
|
|
const gchar buffer1[] =
|
|
"<interface>"
|
|
" <object class=\"GtkWindow\" id=\"window1\">"
|
|
" <child>"
|
|
" <object class=\"GtkButton\" id=\"button1\">"
|
|
" <property name=\"label\">Hello</property>"
|
|
" </object>"
|
|
" </child>"
|
|
" </object>"
|
|
"</interface>";
|
|
const gchar buffer2[] =
|
|
"<interface>"
|
|
" <object class=\"GtkDialog\" id=\"dialog1\">"
|
|
" <child internal-child=\"vbox\">"
|
|
" <object class=\"GtkVBox\" id=\"dialog1-vbox\">"
|
|
" <property name=\"border-width\">10</property>"
|
|
" <child internal-child=\"action_area\">"
|
|
" <object class=\"GtkHButtonBox\" id=\"dialog1-action_area\">"
|
|
" <property name=\"border-width\">20</property>"
|
|
" </object>"
|
|
" </child>"
|
|
" </object>"
|
|
" </child>"
|
|
" </object>"
|
|
"</interface>";
|
|
|
|
GObject *window, *button;
|
|
GObject *dialog, *vbox, *action_area;
|
|
|
|
builder = builder_new_from_string (buffer1, -1, NULL);
|
|
window = gtk_builder_get_object (builder, "window1");
|
|
g_assert (window != NULL);
|
|
g_assert (GTK_IS_WINDOW (window));
|
|
|
|
button = gtk_builder_get_object (builder, "button1");
|
|
g_assert (button != NULL);
|
|
g_assert (GTK_IS_BUTTON (button));
|
|
g_assert (gtk_widget_get_parent (GTK_WIDGET(button)) != NULL);
|
|
g_assert (strcmp (gtk_buildable_get_name (GTK_BUILDABLE (gtk_widget_get_parent (GTK_WIDGET (button)))), "window1") == 0);
|
|
|
|
gtk_widget_destroy (GTK_WIDGET (window));
|
|
g_object_unref (builder);
|
|
|
|
builder = builder_new_from_string (buffer2, -1, NULL);
|
|
dialog = gtk_builder_get_object (builder, "dialog1");
|
|
g_assert (dialog != NULL);
|
|
g_assert (GTK_IS_DIALOG (dialog));
|
|
children = gtk_container_get_children (GTK_CONTAINER (dialog));
|
|
g_assert (g_list_length (children) == 1);
|
|
g_list_free (children);
|
|
|
|
vbox = gtk_builder_get_object (builder, "dialog1-vbox");
|
|
content_area = gtk_dialog_get_content_area (GTK_DIALOG (dialog));
|
|
g_assert (vbox != NULL);
|
|
g_assert (GTK_IS_BOX (vbox));
|
|
g_assert (gtk_orientable_get_orientation (GTK_ORIENTABLE (vbox)) == GTK_ORIENTATION_VERTICAL);
|
|
g_assert (strcmp (gtk_buildable_get_name (GTK_BUILDABLE (gtk_widget_get_parent (GTK_WIDGET (vbox)))), "dialog1") == 0);
|
|
g_assert (gtk_container_get_border_width (GTK_CONTAINER (vbox)) == 10);
|
|
g_assert (strcmp (gtk_buildable_get_name (GTK_BUILDABLE (content_area)), "dialog1-vbox") == 0);
|
|
|
|
action_area = gtk_builder_get_object (builder, "dialog1-action_area");
|
|
dialog_action_area = gtk_dialog_get_action_area (GTK_DIALOG (dialog));
|
|
g_assert (action_area != NULL);
|
|
g_assert (GTK_IS_BUTTON_BOX (action_area));
|
|
g_assert (gtk_orientable_get_orientation (GTK_ORIENTABLE (action_area)) == GTK_ORIENTATION_HORIZONTAL);
|
|
g_assert (gtk_widget_get_parent (GTK_WIDGET (action_area)) != NULL);
|
|
g_assert (gtk_container_get_border_width (GTK_CONTAINER (action_area)) == 20);
|
|
g_assert (dialog_action_area != NULL);
|
|
g_assert (gtk_buildable_get_name (GTK_BUILDABLE (action_area)) != NULL);
|
|
g_assert (strcmp (gtk_buildable_get_name (GTK_BUILDABLE (dialog_action_area)), "dialog1-action_area") == 0);
|
|
gtk_widget_destroy (GTK_WIDGET (dialog));
|
|
g_object_unref (builder);
|
|
}
|
|
|
|
static void
|
|
test_child_properties (void)
|
|
{
|
|
GtkBuilder * builder;
|
|
const gchar buffer1[] =
|
|
"<interface>"
|
|
" <object class=\"GtkBox\" id=\"vbox1\">"
|
|
" <child>"
|
|
" <object class=\"GtkLabel\" id=\"label1\"/>"
|
|
" <packing>"
|
|
" <property name=\"pack-type\">start</property>"
|
|
" </packing>"
|
|
" </child>"
|
|
" <child>"
|
|
" <object class=\"GtkLabel\" id=\"label2\"/>"
|
|
" <packing>"
|
|
" <property name=\"pack-type\">end</property>"
|
|
" </packing>"
|
|
" </child>"
|
|
" </object>"
|
|
"</interface>";
|
|
|
|
GObject *label, *vbox;
|
|
GtkPackType pack_type;
|
|
|
|
builder = builder_new_from_string (buffer1, -1, NULL);
|
|
vbox = gtk_builder_get_object (builder, "vbox1");
|
|
g_assert (GTK_IS_BOX (vbox));
|
|
|
|
label = gtk_builder_get_object (builder, "label1");
|
|
g_assert (GTK_IS_LABEL (label));
|
|
gtk_container_child_get (GTK_CONTAINER (vbox),
|
|
GTK_WIDGET (label),
|
|
"pack-type",
|
|
&pack_type,
|
|
NULL);
|
|
g_assert (pack_type == GTK_PACK_START);
|
|
|
|
label = gtk_builder_get_object (builder, "label2");
|
|
g_assert (GTK_IS_LABEL (label));
|
|
gtk_container_child_get (GTK_CONTAINER (vbox),
|
|
GTK_WIDGET (label),
|
|
"pack-type",
|
|
&pack_type,
|
|
NULL);
|
|
g_assert (pack_type == GTK_PACK_END);
|
|
|
|
g_object_unref (builder);
|
|
}
|
|
|
|
static void
|
|
test_treeview_column (void)
|
|
{
|
|
GtkBuilder *builder;
|
|
const gchar buffer[] =
|
|
"<interface>"
|
|
"<object class=\"GtkListStore\" id=\"liststore1\">"
|
|
" <columns>"
|
|
" <column type=\"gchararray\"/>"
|
|
" <column type=\"guint\"/>"
|
|
" </columns>"
|
|
" <data>"
|
|
" <row>"
|
|
" <col id=\"0\">John</col>"
|
|
" <col id=\"1\">25</col>"
|
|
" </row>"
|
|
" </data>"
|
|
"</object>"
|
|
"<object class=\"GtkWindow\" id=\"window1\">"
|
|
" <child>"
|
|
" <object class=\"GtkTreeView\" id=\"treeview1\">"
|
|
" <property name=\"visible\">True</property>"
|
|
" <property name=\"model\">liststore1</property>"
|
|
" <child>"
|
|
" <object class=\"GtkTreeViewColumn\" id=\"column1\">"
|
|
" <property name=\"title\">Test</property>"
|
|
" <child>"
|
|
" <object class=\"GtkCellRendererText\" id=\"renderer1\"/>"
|
|
" <attributes>"
|
|
" <attribute name=\"text\">1</attribute>"
|
|
" </attributes>"
|
|
" </child>"
|
|
" </object>"
|
|
" </child>"
|
|
" <child>"
|
|
" <object class=\"GtkTreeViewColumn\" id=\"column2\">"
|
|
" <property name=\"title\">Number</property>"
|
|
" <child>"
|
|
" <object class=\"GtkCellRendererText\" id=\"renderer2\"/>"
|
|
" <attributes>"
|
|
" <attribute name=\"text\">0</attribute>"
|
|
" </attributes>"
|
|
" </child>"
|
|
" </object>"
|
|
" </child>"
|
|
" </object>"
|
|
" </child>"
|
|
"</object>"
|
|
"</interface>";
|
|
GObject *window, *treeview;
|
|
GtkTreeViewColumn *column;
|
|
GList *renderers;
|
|
GObject *renderer;
|
|
|
|
builder = builder_new_from_string (buffer, -1, NULL);
|
|
treeview = gtk_builder_get_object (builder, "treeview1");
|
|
g_assert (treeview);
|
|
g_assert (GTK_IS_TREE_VIEW (treeview));
|
|
column = gtk_tree_view_get_column (GTK_TREE_VIEW (treeview), 0);
|
|
g_assert (GTK_IS_TREE_VIEW_COLUMN (column));
|
|
g_assert (strcmp (gtk_tree_view_column_get_title (column), "Test") == 0);
|
|
|
|
renderers = gtk_cell_layout_get_cells (GTK_CELL_LAYOUT (column));
|
|
g_assert (g_list_length (renderers) == 1);
|
|
renderer = g_list_nth_data (renderers, 0);
|
|
g_assert (renderer);
|
|
g_assert (GTK_IS_CELL_RENDERER_TEXT (renderer));
|
|
g_list_free (renderers);
|
|
|
|
window = gtk_builder_get_object (builder, "window1");
|
|
gtk_widget_destroy (GTK_WIDGET (window));
|
|
|
|
g_object_unref (builder);
|
|
}
|
|
|
|
static void
|
|
test_icon_view (void)
|
|
{
|
|
GtkBuilder *builder;
|
|
const gchar buffer[] =
|
|
"<interface>"
|
|
" <object class=\"GtkListStore\" id=\"liststore1\">"
|
|
" <columns>"
|
|
" <column type=\"gchararray\"/>"
|
|
" <column type=\"GdkPixbuf\"/>"
|
|
" </columns>"
|
|
" <data>"
|
|
" <row>"
|
|
" <col id=\"0\">test</col>"
|
|
" </row>"
|
|
" </data>"
|
|
" </object>"
|
|
" <object class=\"GtkWindow\" id=\"window1\">"
|
|
" <child>"
|
|
" <object class=\"GtkIconView\" id=\"iconview1\">"
|
|
" <property name=\"model\">liststore1</property>"
|
|
" <property name=\"text-column\">0</property>"
|
|
" <property name=\"pixbuf-column\">1</property>"
|
|
" <property name=\"visible\">True</property>"
|
|
" <child>"
|
|
" <object class=\"GtkCellRendererText\" id=\"renderer1\"/>"
|
|
" <attributes>"
|
|
" <attribute name=\"text\">0</attribute>"
|
|
" </attributes>"
|
|
" </child>"
|
|
" </object>"
|
|
" </child>"
|
|
" </object>"
|
|
"</interface>";
|
|
GObject *window, *iconview;
|
|
|
|
builder = builder_new_from_string (buffer, -1, NULL);
|
|
iconview = gtk_builder_get_object (builder, "iconview1");
|
|
g_assert (iconview);
|
|
g_assert (GTK_IS_ICON_VIEW (iconview));
|
|
|
|
window = gtk_builder_get_object (builder, "window1");
|
|
gtk_widget_destroy (GTK_WIDGET (window));
|
|
g_object_unref (builder);
|
|
}
|
|
|
|
static void
|
|
test_combo_box (void)
|
|
{
|
|
GtkBuilder *builder;
|
|
const gchar buffer[] =
|
|
"<interface>"
|
|
" <object class=\"GtkListStore\" id=\"liststore1\">"
|
|
" <columns>"
|
|
" <column type=\"guint\"/>"
|
|
" <column type=\"gchararray\"/>"
|
|
" </columns>"
|
|
" <data>"
|
|
" <row>"
|
|
" <col id=\"0\">1</col>"
|
|
" <col id=\"1\">Foo</col>"
|
|
" </row>"
|
|
" <row>"
|
|
" <col id=\"0\">2</col>"
|
|
" <col id=\"1\">Bar</col>"
|
|
" </row>"
|
|
" </data>"
|
|
" </object>"
|
|
" <object class=\"GtkWindow\" id=\"window1\">"
|
|
" <child>"
|
|
" <object class=\"GtkComboBox\" id=\"combobox1\">"
|
|
" <property name=\"model\">liststore1</property>"
|
|
" <property name=\"visible\">True</property>"
|
|
" <child>"
|
|
" <object class=\"GtkCellRendererText\" id=\"renderer1\"/>"
|
|
" <attributes>"
|
|
" <attribute name=\"text\">0</attribute>"
|
|
" </attributes>"
|
|
" </child>"
|
|
" <child>"
|
|
" <object class=\"GtkCellRendererText\" id=\"renderer2\"/>"
|
|
" <attributes>"
|
|
" <attribute name=\"text\">1</attribute>"
|
|
" </attributes>"
|
|
" </child>"
|
|
" </object>"
|
|
" </child>"
|
|
" </object>"
|
|
"</interface>";
|
|
GObject *window, *combobox;
|
|
|
|
builder = builder_new_from_string (buffer, -1, NULL);
|
|
combobox = gtk_builder_get_object (builder, "combobox1");
|
|
g_assert (combobox);
|
|
|
|
window = gtk_builder_get_object (builder, "window1");
|
|
gtk_widget_destroy (GTK_WIDGET (window));
|
|
|
|
g_object_unref (builder);
|
|
}
|
|
|
|
#if 0
|
|
static void
|
|
test_combo_box_entry (void)
|
|
{
|
|
GtkBuilder *builder;
|
|
const gchar buffer[] =
|
|
"<interface>"
|
|
" <object class=\"GtkListStore\" id=\"liststore1\">"
|
|
" <columns>"
|
|
" <column type=\"guint\"/>"
|
|
" <column type=\"gchararray\"/>"
|
|
" </columns>"
|
|
" <data>"
|
|
" <row>"
|
|
" <col id=\"0\">1</col>"
|
|
" <col id=\"1\">Foo</col>"
|
|
" </row>"
|
|
" <row>"
|
|
" <col id=\"0\">2</col>"
|
|
" <col id=\"1\">Bar</col>"
|
|
" </row>"
|
|
" </data>"
|
|
" </object>"
|
|
" <object class=\"GtkWindow\" id=\"window1\">"
|
|
" <child>"
|
|
" <object class=\"GtkComboBox\" id=\"comboboxentry1\">"
|
|
" <property name=\"model\">liststore1</property>"
|
|
" <property name=\"has-entry\">True</property>"
|
|
" <property name=\"visible\">True</property>"
|
|
" <child>"
|
|
" <object class=\"GtkCellRendererText\" id=\"renderer1\"/>"
|
|
" <attributes>"
|
|
" <attribute name=\"text\">0</attribute>"
|
|
" </attributes>"
|
|
" </child>"
|
|
" <child>"
|
|
" <object class=\"GtkCellRendererText\" id=\"renderer2\"/>"
|
|
" <attributes>"
|
|
" <attribute name=\"text\">1</attribute>"
|
|
" </attributes>"
|
|
" </child>"
|
|
" </object>"
|
|
" </child>"
|
|
" </object>"
|
|
"</interface>";
|
|
GObject *window, *combobox, *renderer;
|
|
gchar *text;
|
|
|
|
builder = builder_new_from_string (buffer, -1, NULL);
|
|
combobox = gtk_builder_get_object (builder, "comboboxentry1");
|
|
g_assert (combobox);
|
|
|
|
renderer = gtk_builder_get_object (builder, "renderer2");
|
|
g_assert (renderer);
|
|
g_object_get (renderer, "text", &text, NULL);
|
|
g_assert (text);
|
|
g_assert (strcmp (text, "Bar") == 0);
|
|
g_free (text);
|
|
|
|
renderer = gtk_builder_get_object (builder, "renderer1");
|
|
g_assert (renderer);
|
|
g_object_get (renderer, "text", &text, NULL);
|
|
g_assert (text);
|
|
g_assert (strcmp (text, "2") == 0);
|
|
g_free (text);
|
|
|
|
window = gtk_builder_get_object (builder, "window1");
|
|
gtk_widget_destroy (GTK_WIDGET (window));
|
|
|
|
g_object_unref (builder);
|
|
}
|
|
#endif
|
|
|
|
static void
|
|
test_cell_view (void)
|
|
{
|
|
GtkBuilder *builder;
|
|
const gchar *buffer =
|
|
"<interface>"
|
|
" <object class=\"GtkListStore\" id=\"liststore1\">"
|
|
" <columns>"
|
|
" <column type=\"gchararray\"/>"
|
|
" </columns>"
|
|
" <data>"
|
|
" <row>"
|
|
" <col id=\"0\">test</col>"
|
|
" </row>"
|
|
" </data>"
|
|
" </object>"
|
|
" <object class=\"GtkWindow\" id=\"window1\">"
|
|
" <child>"
|
|
" <object class=\"GtkCellView\" id=\"cellview1\">"
|
|
" <property name=\"visible\">True</property>"
|
|
" <property name=\"model\">liststore1</property>"
|
|
" <accelerator key=\"f\" modifiers=\"GDK_CONTROL_MASK\" signal=\"grab_focus\"/>"
|
|
" <child>"
|
|
" <object class=\"GtkCellRendererText\" id=\"renderer1\"/>"
|
|
" <attributes>"
|
|
" <attribute name=\"text\">0</attribute>"
|
|
" </attributes>"
|
|
" </child>"
|
|
" </object>"
|
|
" </child>"
|
|
" </object>"
|
|
"</interface>";
|
|
GObject *cellview;
|
|
GObject *model, *window;
|
|
GtkTreePath *path;
|
|
GList *renderers;
|
|
|
|
builder = builder_new_from_string (buffer, -1, NULL);
|
|
cellview = gtk_builder_get_object (builder, "cellview1");
|
|
g_assert (builder);
|
|
g_assert (cellview);
|
|
g_assert (GTK_IS_CELL_VIEW (cellview));
|
|
g_object_get (cellview, "model", &model, NULL);
|
|
g_assert (model);
|
|
g_assert (GTK_IS_TREE_MODEL (model));
|
|
g_object_unref (model);
|
|
path = gtk_tree_path_new_first ();
|
|
gtk_cell_view_set_displayed_row (GTK_CELL_VIEW (cellview), path);
|
|
|
|
renderers = gtk_cell_layout_get_cells (GTK_CELL_LAYOUT (cellview));
|
|
g_assert (renderers);
|
|
g_assert (g_list_length (renderers) == 1);
|
|
|
|
window = gtk_builder_get_object (builder, "window1");
|
|
g_assert (window);
|
|
gtk_widget_destroy (GTK_WIDGET (window));
|
|
|
|
g_object_unref (builder);
|
|
}
|
|
|
|
static void
|
|
test_dialog (void)
|
|
{
|
|
GtkBuilder * builder;
|
|
const gchar buffer1[] =
|
|
"<interface>"
|
|
" <object class=\"GtkDialog\" id=\"dialog1\">"
|
|
" <child internal-child=\"vbox\">"
|
|
" <object class=\"GtkVBox\" id=\"dialog1-vbox\">"
|
|
" <child internal-child=\"action_area\">"
|
|
" <object class=\"GtkHButtonBox\" id=\"dialog1-action_area\">"
|
|
" <child>"
|
|
" <object class=\"GtkButton\" id=\"button_cancel\"/>"
|
|
" </child>"
|
|
" <child>"
|
|
" <object class=\"GtkButton\" id=\"button_ok\"/>"
|
|
" </child>"
|
|
" </object>"
|
|
" </child>"
|
|
" </object>"
|
|
" </child>"
|
|
" <action-widgets>"
|
|
" <action-widget response=\"3\">button_ok</action-widget>"
|
|
" <action-widget response=\"-5\">button_cancel</action-widget>"
|
|
" </action-widgets>"
|
|
" </object>"
|
|
"</interface>";
|
|
|
|
GObject *dialog1;
|
|
GObject *button_ok;
|
|
GObject *button_cancel;
|
|
|
|
builder = builder_new_from_string (buffer1, -1, NULL);
|
|
dialog1 = gtk_builder_get_object (builder, "dialog1");
|
|
button_ok = gtk_builder_get_object (builder, "button_ok");
|
|
g_assert (gtk_dialog_get_response_for_widget (GTK_DIALOG (dialog1), GTK_WIDGET (button_ok)) == 3);
|
|
button_cancel = gtk_builder_get_object (builder, "button_cancel");
|
|
g_assert (gtk_dialog_get_response_for_widget (GTK_DIALOG (dialog1), GTK_WIDGET (button_cancel)) == -5);
|
|
|
|
gtk_widget_destroy (GTK_WIDGET (dialog1));
|
|
g_object_unref (builder);
|
|
}
|
|
|
|
static void
|
|
test_message_dialog (void)
|
|
{
|
|
GtkBuilder * builder;
|
|
const gchar buffer1[] =
|
|
"<interface>"
|
|
" <object class=\"GtkMessageDialog\" id=\"dialog1\">"
|
|
" <child internal-child=\"message_area\">"
|
|
" <object class=\"GtkVBox\" id=\"dialog-message-area\">"
|
|
" <child>"
|
|
" <object class=\"GtkExpander\" id=\"expander\"/>"
|
|
" </child>"
|
|
" </object>"
|
|
" </child>"
|
|
" </object>"
|
|
"</interface>";
|
|
|
|
GObject *dialog1;
|
|
GObject *expander;
|
|
|
|
builder = builder_new_from_string (buffer1, -1, NULL);
|
|
dialog1 = gtk_builder_get_object (builder, "dialog1");
|
|
expander = gtk_builder_get_object (builder, "expander");
|
|
g_assert (GTK_IS_EXPANDER (expander));
|
|
g_assert (gtk_widget_get_parent (GTK_WIDGET (expander)) == gtk_message_dialog_get_message_area (GTK_MESSAGE_DIALOG (dialog1)));
|
|
|
|
gtk_widget_destroy (GTK_WIDGET (dialog1));
|
|
g_object_unref (builder);
|
|
}
|
|
|
|
static void
|
|
test_accelerators (void)
|
|
{
|
|
GtkBuilder *builder;
|
|
const gchar *buffer =
|
|
"<interface>"
|
|
" <object class=\"GtkWindow\" id=\"window1\">"
|
|
" <child>"
|
|
" <object class=\"GtkButton\" id=\"button1\">"
|
|
" <accelerator key=\"q\" modifiers=\"GDK_CONTROL_MASK\" signal=\"clicked\"/>"
|
|
" </object>"
|
|
" </child>"
|
|
" </object>"
|
|
"</interface>";
|
|
const gchar *buffer2 =
|
|
"<interface>"
|
|
" <object class=\"GtkWindow\" id=\"window1\">"
|
|
" <child>"
|
|
" <object class=\"GtkTreeView\" id=\"treeview1\">"
|
|
" <signal name=\"cursor-changed\" handler=\"gtk_main_quit\"/>"
|
|
" <accelerator key=\"f\" modifiers=\"GDK_CONTROL_MASK\" signal=\"grab_focus\"/>"
|
|
" </object>"
|
|
" </child>"
|
|
" </object>"
|
|
"</interface>";
|
|
GObject *window1;
|
|
GSList *accel_groups;
|
|
GObject *accel_group;
|
|
|
|
builder = builder_new_from_string (buffer, -1, NULL);
|
|
window1 = gtk_builder_get_object (builder, "window1");
|
|
g_assert (window1);
|
|
g_assert (GTK_IS_WINDOW (window1));
|
|
|
|
accel_groups = gtk_accel_groups_from_object (window1);
|
|
g_assert (g_slist_length (accel_groups) == 1);
|
|
accel_group = g_slist_nth_data (accel_groups, 0);
|
|
g_assert (accel_group);
|
|
|
|
gtk_widget_destroy (GTK_WIDGET (window1));
|
|
g_object_unref (builder);
|
|
|
|
builder = builder_new_from_string (buffer2, -1, NULL);
|
|
window1 = gtk_builder_get_object (builder, "window1");
|
|
g_assert (window1);
|
|
g_assert (GTK_IS_WINDOW (window1));
|
|
|
|
accel_groups = gtk_accel_groups_from_object (window1);
|
|
g_assert (g_slist_length (accel_groups) == 1);
|
|
accel_group = g_slist_nth_data (accel_groups, 0);
|
|
g_assert (accel_group);
|
|
|
|
gtk_widget_destroy (GTK_WIDGET (window1));
|
|
g_object_unref (builder);
|
|
}
|
|
|
|
static void
|
|
test_widget (void)
|
|
{
|
|
const gchar *buffer =
|
|
"<interface>"
|
|
" <object class=\"GtkWindow\" id=\"window1\">"
|
|
" <child>"
|
|
" <object class=\"GtkButton\" id=\"button1\">"
|
|
" <property name=\"can-focus\">True</property>"
|
|
" <property name=\"has-focus\">True</property>"
|
|
" </object>"
|
|
" </child>"
|
|
" </object>"
|
|
"</interface>";
|
|
const gchar *buffer2 =
|
|
"<interface>"
|
|
" <object class=\"GtkWindow\" id=\"window1\">"
|
|
" <child>"
|
|
" <object class=\"GtkButton\" id=\"button1\">"
|
|
" <property name=\"can-default\">True</property>"
|
|
" <property name=\"has-default\">True</property>"
|
|
" </object>"
|
|
" </child>"
|
|
" </object>"
|
|
"</interface>";
|
|
const gchar *buffer3 =
|
|
"<interface>"
|
|
" <object class=\"GtkWindow\" id=\"window1\">"
|
|
" <child>"
|
|
" <object class=\"GtkVBox\" id=\"vbox1\">"
|
|
" <child>"
|
|
" <object class=\"GtkLabel\" id=\"label1\">"
|
|
" <child internal-child=\"accessible\">"
|
|
" <object class=\"AtkObject\" id=\"a11y-label1\">"
|
|
" <property name=\"AtkObject::accessible-name\">A Label</property>"
|
|
" </object>"
|
|
" </child>"
|
|
" <accessibility>"
|
|
" <relation target=\"button1\" type=\"label-for\"/>"
|
|
" </accessibility>"
|
|
" </object>"
|
|
" </child>"
|
|
" <child>"
|
|
" <object class=\"GtkButton\" id=\"button1\">"
|
|
" <accessibility>"
|
|
" <action action_name=\"click\" description=\"Sliff\"/>"
|
|
" <action action_name=\"clack\" translatable=\"yes\">Sniff</action>"
|
|
" </accessibility>"
|
|
" </object>"
|
|
" </child>"
|
|
" </object>"
|
|
" </child>"
|
|
" </object>"
|
|
"</interface>";
|
|
GtkBuilder *builder;
|
|
GObject *window1, *button1, *label1;
|
|
AtkObject *accessible;
|
|
AtkRelationSet *relation_set;
|
|
AtkRelation *relation;
|
|
char *name;
|
|
|
|
builder = builder_new_from_string (buffer, -1, NULL);
|
|
button1 = gtk_builder_get_object (builder, "button1");
|
|
|
|
#if 0
|
|
g_assert (gtk_widget_has_focus (GTK_WIDGET (button1)));
|
|
#endif
|
|
window1 = gtk_builder_get_object (builder, "window1");
|
|
gtk_widget_destroy (GTK_WIDGET (window1));
|
|
|
|
g_object_unref (builder);
|
|
|
|
builder = builder_new_from_string (buffer2, -1, NULL);
|
|
button1 = gtk_builder_get_object (builder, "button1");
|
|
|
|
g_assert (gtk_widget_get_receives_default (GTK_WIDGET (button1)));
|
|
|
|
g_object_unref (builder);
|
|
|
|
builder = builder_new_from_string (buffer3, -1, NULL);
|
|
|
|
window1 = gtk_builder_get_object (builder, "window1");
|
|
label1 = gtk_builder_get_object (builder, "label1");
|
|
|
|
accessible = gtk_widget_get_accessible (GTK_WIDGET (label1));
|
|
relation_set = atk_object_ref_relation_set (accessible);
|
|
g_return_if_fail (atk_relation_set_get_n_relations (relation_set) == 1);
|
|
relation = atk_relation_set_get_relation (relation_set, 0);
|
|
g_return_if_fail (relation != NULL);
|
|
g_return_if_fail (ATK_IS_RELATION (relation));
|
|
g_return_if_fail (atk_relation_get_relation_type (relation) != ATK_RELATION_LABELLED_BY);
|
|
g_object_unref (relation_set);
|
|
|
|
g_object_get (G_OBJECT (accessible), "accessible-name", &name, NULL);
|
|
g_return_if_fail (strcmp (name, "A Label") == 0);
|
|
g_free (name);
|
|
|
|
gtk_widget_destroy (GTK_WIDGET (window1));
|
|
g_object_unref (builder);
|
|
}
|
|
|
|
static void
|
|
test_window (void)
|
|
{
|
|
const gchar *buffer1 =
|
|
"<interface>"
|
|
" <object class=\"GtkWindow\" id=\"window1\">"
|
|
" <property name=\"title\"></property>"
|
|
" </object>"
|
|
"</interface>";
|
|
const gchar *buffer2 =
|
|
"<interface>"
|
|
" <object class=\"GtkWindow\" id=\"window1\">"
|
|
" </object>"
|
|
"</interface>";
|
|
GtkBuilder *builder;
|
|
GObject *window1;
|
|
gchar *title;
|
|
|
|
builder = builder_new_from_string (buffer1, -1, NULL);
|
|
window1 = gtk_builder_get_object (builder, "window1");
|
|
g_object_get (window1, "title", &title, NULL);
|
|
g_assert (strcmp (title, "") == 0);
|
|
g_free (title);
|
|
gtk_widget_destroy (GTK_WIDGET (window1));
|
|
g_object_unref (builder);
|
|
|
|
builder = builder_new_from_string (buffer2, -1, NULL);
|
|
window1 = gtk_builder_get_object (builder, "window1");
|
|
gtk_widget_destroy (GTK_WIDGET (window1));
|
|
g_object_unref (builder);
|
|
}
|
|
|
|
static void
|
|
test_value_from_string (void)
|
|
{
|
|
GValue value = G_VALUE_INIT;
|
|
GError *error = NULL;
|
|
GtkBuilder *builder;
|
|
|
|
builder = gtk_builder_new ();
|
|
|
|
g_assert (gtk_builder_value_from_string_type (builder, G_TYPE_STRING, "test", &value, &error));
|
|
g_assert (G_VALUE_HOLDS_STRING (&value));
|
|
g_assert (strcmp (g_value_get_string (&value), "test") == 0);
|
|
g_value_unset (&value);
|
|
|
|
g_assert (gtk_builder_value_from_string_type (builder, G_TYPE_BOOLEAN, "true", &value, &error));
|
|
g_assert (G_VALUE_HOLDS_BOOLEAN (&value));
|
|
g_assert (g_value_get_boolean (&value) == TRUE);
|
|
g_value_unset (&value);
|
|
|
|
g_assert (gtk_builder_value_from_string_type (builder, G_TYPE_BOOLEAN, "false", &value, &error));
|
|
g_assert (G_VALUE_HOLDS_BOOLEAN (&value));
|
|
g_assert (g_value_get_boolean (&value) == FALSE);
|
|
g_value_unset (&value);
|
|
|
|
g_assert (gtk_builder_value_from_string_type (builder, G_TYPE_BOOLEAN, "yes", &value, &error));
|
|
g_assert (G_VALUE_HOLDS_BOOLEAN (&value));
|
|
g_assert (g_value_get_boolean (&value) == TRUE);
|
|
g_value_unset (&value);
|
|
|
|
g_assert (gtk_builder_value_from_string_type (builder, G_TYPE_BOOLEAN, "no", &value, &error));
|
|
g_assert (G_VALUE_HOLDS_BOOLEAN (&value));
|
|
g_assert (g_value_get_boolean (&value) == FALSE);
|
|
g_value_unset (&value);
|
|
|
|
g_assert (gtk_builder_value_from_string_type (builder, G_TYPE_BOOLEAN, "0", &value, &error));
|
|
g_assert (G_VALUE_HOLDS_BOOLEAN (&value));
|
|
g_assert (g_value_get_boolean (&value) == FALSE);
|
|
g_value_unset (&value);
|
|
|
|
g_assert (gtk_builder_value_from_string_type (builder, G_TYPE_BOOLEAN, "1", &value, &error));
|
|
g_assert (G_VALUE_HOLDS_BOOLEAN (&value));
|
|
g_assert (g_value_get_boolean (&value) == TRUE);
|
|
g_value_unset (&value);
|
|
|
|
g_assert (gtk_builder_value_from_string_type (builder, G_TYPE_BOOLEAN, "tRuE", &value, &error));
|
|
g_assert (G_VALUE_HOLDS_BOOLEAN (&value));
|
|
g_assert (g_value_get_boolean (&value) == TRUE);
|
|
g_value_unset (&value);
|
|
|
|
g_assert (gtk_builder_value_from_string_type (builder, G_TYPE_BOOLEAN, "blaurgh", &value, &error) == FALSE);
|
|
g_value_unset (&value);
|
|
g_assert (g_error_matches (error,
|
|
GTK_BUILDER_ERROR,
|
|
GTK_BUILDER_ERROR_INVALID_VALUE));
|
|
g_error_free (error);
|
|
error = NULL;
|
|
|
|
g_assert (gtk_builder_value_from_string_type (builder, G_TYPE_BOOLEAN, "yess", &value, &error) == FALSE);
|
|
g_value_unset (&value);
|
|
g_assert (g_error_matches (error,
|
|
GTK_BUILDER_ERROR,
|
|
GTK_BUILDER_ERROR_INVALID_VALUE));
|
|
g_error_free (error);
|
|
error = NULL;
|
|
|
|
g_assert (gtk_builder_value_from_string_type (builder, G_TYPE_BOOLEAN, "trueee", &value, &error) == FALSE);
|
|
g_value_unset (&value);
|
|
g_assert (g_error_matches (error,
|
|
GTK_BUILDER_ERROR,
|
|
GTK_BUILDER_ERROR_INVALID_VALUE));
|
|
g_error_free (error);
|
|
error = NULL;
|
|
|
|
g_assert (gtk_builder_value_from_string_type (builder, G_TYPE_BOOLEAN, "", &value, &error) == FALSE);
|
|
g_value_unset (&value);
|
|
g_assert (g_error_matches (error,
|
|
GTK_BUILDER_ERROR,
|
|
GTK_BUILDER_ERROR_INVALID_VALUE));
|
|
g_error_free (error);
|
|
error = NULL;
|
|
|
|
g_assert (gtk_builder_value_from_string_type (builder, G_TYPE_INT, "12345", &value, &error));
|
|
g_assert (G_VALUE_HOLDS_INT (&value));
|
|
g_assert (g_value_get_int (&value) == 12345);
|
|
g_value_unset (&value);
|
|
|
|
g_assert (gtk_builder_value_from_string_type (builder, G_TYPE_LONG, "9912345", &value, &error));
|
|
g_assert (G_VALUE_HOLDS_LONG (&value));
|
|
g_assert (g_value_get_long (&value) == 9912345);
|
|
g_value_unset (&value);
|
|
|
|
g_assert (gtk_builder_value_from_string_type (builder, G_TYPE_UINT, "2345", &value, &error));
|
|
g_assert (G_VALUE_HOLDS_UINT (&value));
|
|
g_assert (g_value_get_uint (&value) == 2345);
|
|
g_value_unset (&value);
|
|
|
|
g_assert (gtk_builder_value_from_string_type (builder, G_TYPE_FLOAT, "1.454", &value, &error));
|
|
g_assert (G_VALUE_HOLDS_FLOAT (&value));
|
|
g_assert (fabs (g_value_get_float (&value) - 1.454) < 0.00001);
|
|
g_value_unset (&value);
|
|
|
|
g_assert (gtk_builder_value_from_string_type (builder, G_TYPE_FLOAT, "abc", &value, &error) == FALSE);
|
|
g_value_unset (&value);
|
|
g_assert (g_error_matches (error,
|
|
GTK_BUILDER_ERROR,
|
|
GTK_BUILDER_ERROR_INVALID_VALUE));
|
|
g_error_free (error);
|
|
error = NULL;
|
|
|
|
g_assert (gtk_builder_value_from_string_type (builder, G_TYPE_INT, "/-+,abc", &value, &error) == FALSE);
|
|
g_value_unset (&value);
|
|
g_assert (g_error_matches (error,
|
|
GTK_BUILDER_ERROR,
|
|
GTK_BUILDER_ERROR_INVALID_VALUE));
|
|
g_error_free (error);
|
|
error = NULL;
|
|
|
|
g_assert (gtk_builder_value_from_string_type (builder, GTK_TYPE_WINDOW_TYPE, "toplevel", &value, &error) == TRUE);
|
|
g_assert (G_VALUE_HOLDS_ENUM (&value));
|
|
g_assert (g_value_get_enum (&value) == GTK_WINDOW_TOPLEVEL);
|
|
g_value_unset (&value);
|
|
|
|
g_assert (gtk_builder_value_from_string_type (builder, GTK_TYPE_WINDOW_TYPE, "sliff", &value, &error) == FALSE);
|
|
g_value_unset (&value);
|
|
g_assert (g_error_matches (error,
|
|
GTK_BUILDER_ERROR,
|
|
GTK_BUILDER_ERROR_INVALID_VALUE));
|
|
g_error_free (error);
|
|
error = NULL;
|
|
|
|
g_assert (gtk_builder_value_from_string_type (builder, GTK_TYPE_WINDOW_TYPE, "foobar", &value, &error) == FALSE);
|
|
g_value_unset (&value);
|
|
g_assert (g_error_matches (error,
|
|
GTK_BUILDER_ERROR,
|
|
GTK_BUILDER_ERROR_INVALID_VALUE));
|
|
g_error_free (error);
|
|
error = NULL;
|
|
|
|
g_object_unref (builder);
|
|
}
|
|
|
|
static gboolean model_freed = FALSE;
|
|
|
|
static void
|
|
model_weakref (gpointer data,
|
|
GObject *model)
|
|
{
|
|
model_freed = TRUE;
|
|
}
|
|
|
|
static void
|
|
test_reference_counting (void)
|
|
{
|
|
GtkBuilder *builder;
|
|
const gchar buffer1[] =
|
|
"<interface>"
|
|
" <object class=\"GtkListStore\" id=\"liststore1\"/>"
|
|
" <object class=\"GtkListStore\" id=\"liststore2\"/>"
|
|
" <object class=\"GtkWindow\" id=\"window1\">"
|
|
" <child>"
|
|
" <object class=\"GtkTreeView\" id=\"treeview1\">"
|
|
" <property name=\"model\">liststore1</property>"
|
|
" </object>"
|
|
" </child>"
|
|
" </object>"
|
|
"</interface>";
|
|
const gchar buffer2[] =
|
|
"<interface>"
|
|
" <object class=\"GtkVBox\" id=\"vbox1\">"
|
|
" <child>"
|
|
" <object class=\"GtkLabel\" id=\"label1\"/>"
|
|
" <packing>"
|
|
" <property name=\"pack-type\">start</property>"
|
|
" </packing>"
|
|
" </child>"
|
|
" </object>"
|
|
"</interface>";
|
|
GObject *window, *treeview, *model;
|
|
|
|
builder = builder_new_from_string (buffer1, -1, NULL);
|
|
window = gtk_builder_get_object (builder, "window1");
|
|
treeview = gtk_builder_get_object (builder, "treeview1");
|
|
model = gtk_builder_get_object (builder, "liststore1");
|
|
g_object_unref (builder);
|
|
|
|
g_object_weak_ref (model, (GWeakNotify)model_weakref, NULL);
|
|
|
|
g_assert (model_freed == FALSE);
|
|
gtk_tree_view_set_model (GTK_TREE_VIEW (treeview), NULL);
|
|
g_assert (model_freed == TRUE);
|
|
|
|
gtk_widget_destroy (GTK_WIDGET (window));
|
|
|
|
builder = builder_new_from_string (buffer2, -1, NULL);
|
|
g_object_unref (builder);
|
|
}
|
|
|
|
static void
|
|
test_icon_factory (void)
|
|
{
|
|
GtkBuilder *builder;
|
|
const gchar buffer1[] =
|
|
"<interface>"
|
|
" <object class=\"GtkIconFactory\" id=\"iconfactory1\">"
|
|
" <sources>"
|
|
" <source stock-id=\"apple-red\" filename=\"apple-red.png\"/>"
|
|
" </sources>"
|
|
" </object>"
|
|
"</interface>";
|
|
const gchar buffer2[] =
|
|
"<interface>"
|
|
" <object class=\"GtkIconFactory\" id=\"iconfactory1\">"
|
|
" <sources>"
|
|
" <source stock-id=\"sliff\" direction=\"rtl\" state=\"active\""
|
|
" size=\"menu\" filename=\"sloff.png\"/>"
|
|
" <source stock-id=\"sliff\" direction=\"ltr\" state=\"selected\""
|
|
" size=\"dnd\" filename=\"slurf.png\"/>"
|
|
" </sources>"
|
|
" </object>"
|
|
"</interface>";
|
|
#if 0
|
|
const gchar buffer3[] =
|
|
"<interface>"
|
|
" <object class=\"GtkIconFactory\" id=\"iconfactory1\">"
|
|
" <invalid/>"
|
|
" </object>"
|
|
"</interface>";
|
|
const gchar buffer4[] =
|
|
"<interface>"
|
|
" <object class=\"GtkIconFactory\" id=\"iconfactory1\">"
|
|
" <sources>"
|
|
" <invalid/>"
|
|
" </sources>"
|
|
" </object>"
|
|
"</interface>";
|
|
const gchar buffer5[] =
|
|
"<interface>"
|
|
" <object class=\"GtkIconFactory\" id=\"iconfactory1\">"
|
|
" <sources>"
|
|
" <source/>"
|
|
" </sources>"
|
|
" </object>"
|
|
"</interface>";
|
|
GError *error = NULL;
|
|
#endif
|
|
GObject *factory;
|
|
GtkIconSet *icon_set;
|
|
GtkIconSource *icon_source;
|
|
GtkWidget *image;
|
|
|
|
G_GNUC_BEGIN_IGNORE_DEPRECATIONS;
|
|
|
|
builder = builder_new_from_string (buffer1, -1, NULL);
|
|
factory = gtk_builder_get_object (builder, "iconfactory1");
|
|
g_assert (factory != NULL);
|
|
|
|
icon_set = gtk_icon_factory_lookup (GTK_ICON_FACTORY (factory), "apple-red");
|
|
g_assert (icon_set != NULL);
|
|
gtk_icon_factory_add_default (GTK_ICON_FACTORY (factory));
|
|
G_GNUC_BEGIN_IGNORE_DEPRECATIONS;
|
|
image = gtk_image_new_from_stock ("apple-red", GTK_ICON_SIZE_BUTTON);
|
|
G_GNUC_END_IGNORE_DEPRECATIONS;
|
|
g_assert (image != NULL);
|
|
g_object_ref_sink (image);
|
|
g_object_unref (image);
|
|
|
|
g_object_unref (builder);
|
|
|
|
builder = builder_new_from_string (buffer2, -1, NULL);
|
|
factory = gtk_builder_get_object (builder, "iconfactory1");
|
|
g_assert (factory != NULL);
|
|
|
|
icon_set = gtk_icon_factory_lookup (GTK_ICON_FACTORY (factory), "sliff");
|
|
g_assert (icon_set != NULL);
|
|
g_assert (g_slist_length (icon_set->sources) == 2);
|
|
|
|
icon_source = icon_set->sources->data;
|
|
g_assert (gtk_icon_source_get_direction (icon_source) == GTK_TEXT_DIR_RTL);
|
|
g_assert (gtk_icon_source_get_state (icon_source) == GTK_STATE_ACTIVE);
|
|
g_assert (gtk_icon_source_get_size (icon_source) == GTK_ICON_SIZE_MENU);
|
|
g_assert (g_str_has_suffix (gtk_icon_source_get_filename (icon_source), "sloff.png"));
|
|
|
|
icon_source = icon_set->sources->next->data;
|
|
g_assert (gtk_icon_source_get_direction (icon_source) == GTK_TEXT_DIR_LTR);
|
|
g_assert (gtk_icon_source_get_state (icon_source) == GTK_STATE_SELECTED);
|
|
g_assert (gtk_icon_source_get_size (icon_source) == GTK_ICON_SIZE_DND);
|
|
g_assert (g_str_has_suffix (gtk_icon_source_get_filename (icon_source), "slurf.png"));
|
|
|
|
g_object_unref (builder);
|
|
|
|
#if 0
|
|
error = NULL;
|
|
gtk_builder_add_from_string (builder, buffer3, -1, &error);
|
|
g_assert (g_error_matches (error,
|
|
GTK_BUILDER_ERROR,
|
|
GTK_BUILDER_ERROR_INVALID_TAG));
|
|
g_error_free (error);
|
|
|
|
error = NULL;
|
|
gtk_builder_add_from_string (builder, buffer4, -1, &error);
|
|
g_assert (g_error_matches (error,
|
|
GTK_BUILDER_ERROR,
|
|
GTK_BUILDER_ERROR_INVALID_TAG));
|
|
g_error_free (error);
|
|
|
|
error = NULL;
|
|
gtk_builder_add_from_string (builder, buffer5, -1, &error);
|
|
g_assert (g_error_matches (error,
|
|
GTK_BUILDER_ERROR,
|
|
GTK_BUILDER_ERROR_INVALID_ATTRIBUTE));
|
|
g_error_free (error);
|
|
#endif
|
|
G_GNUC_BEGIN_IGNORE_DEPRECATIONS;
|
|
|
|
}
|
|
|
|
typedef struct {
|
|
gboolean weight;
|
|
gboolean foreground;
|
|
gboolean underline;
|
|
gboolean size;
|
|
gboolean font_desc;
|
|
gboolean language;
|
|
} FoundAttrs;
|
|
|
|
static gboolean
|
|
filter_pango_attrs (PangoAttribute *attr,
|
|
gpointer data)
|
|
{
|
|
FoundAttrs *found = (FoundAttrs *)data;
|
|
|
|
if (attr->klass->type == PANGO_ATTR_WEIGHT)
|
|
found->weight = TRUE;
|
|
else if (attr->klass->type == PANGO_ATTR_FOREGROUND)
|
|
found->foreground = TRUE;
|
|
else if (attr->klass->type == PANGO_ATTR_UNDERLINE)
|
|
found->underline = TRUE;
|
|
/* Make sure optional start/end properties are working */
|
|
else if (attr->klass->type == PANGO_ATTR_SIZE &&
|
|
attr->start_index == 5 &&
|
|
attr->end_index == 10)
|
|
found->size = TRUE;
|
|
else if (attr->klass->type == PANGO_ATTR_FONT_DESC)
|
|
found->font_desc = TRUE;
|
|
else if (attr->klass->type == PANGO_ATTR_LANGUAGE)
|
|
found->language = TRUE;
|
|
|
|
return TRUE;
|
|
}
|
|
|
|
static void
|
|
test_pango_attributes (void)
|
|
{
|
|
GtkBuilder *builder;
|
|
FoundAttrs found = { 0, };
|
|
const gchar buffer[] =
|
|
"<interface>"
|
|
" <object class=\"GtkLabel\" id=\"label1\">"
|
|
" <attributes>"
|
|
" <attribute name=\"weight\" value=\"PANGO_WEIGHT_BOLD\"/>"
|
|
" <attribute name=\"foreground\" value=\"DarkSlateGray\"/>"
|
|
" <attribute name=\"underline\" value=\"True\"/>"
|
|
" <attribute name=\"size\" value=\"4\" start=\"5\" end=\"10\"/>"
|
|
" <attribute name=\"font-desc\" value=\"Sans Italic 22\"/>"
|
|
" <attribute name=\"language\" value=\"pt_BR\"/>"
|
|
" </attributes>"
|
|
" </object>"
|
|
"</interface>";
|
|
const gchar err_buffer1[] =
|
|
"<interface>"
|
|
" <object class=\"GtkLabel\" id=\"label1\">"
|
|
" <attributes>"
|
|
" <attribute name=\"weight\"/>"
|
|
" </attributes>"
|
|
" </object>"
|
|
"</interface>";
|
|
const gchar err_buffer2[] =
|
|
"<interface>"
|
|
" <object class=\"GtkLabel\" id=\"label1\">"
|
|
" <attributes>"
|
|
" <attribute name=\"weight\" value=\"PANGO_WEIGHT_BOLD\" unrecognized=\"True\"/>"
|
|
" </attributes>"
|
|
" </object>"
|
|
"</interface>";
|
|
|
|
GObject *label;
|
|
GError *error = NULL;
|
|
PangoAttrList *attrs, *filtered;
|
|
|
|
/* Test attributes are set */
|
|
builder = builder_new_from_string (buffer, -1, NULL);
|
|
label = gtk_builder_get_object (builder, "label1");
|
|
g_assert (label != NULL);
|
|
|
|
attrs = gtk_label_get_attributes (GTK_LABEL (label));
|
|
g_assert (attrs != NULL);
|
|
|
|
filtered = pango_attr_list_filter (attrs, filter_pango_attrs, &found);
|
|
g_assert (filtered);
|
|
pango_attr_list_unref (filtered);
|
|
|
|
g_assert (found.weight);
|
|
g_assert (found.foreground);
|
|
g_assert (found.underline);
|
|
g_assert (found.size);
|
|
g_assert (found.language);
|
|
g_assert (found.font_desc);
|
|
|
|
g_object_unref (builder);
|
|
|
|
/* Test errors are set */
|
|
builder = gtk_builder_new ();
|
|
gtk_builder_add_from_string (builder, err_buffer1, -1, &error);
|
|
label = gtk_builder_get_object (builder, "label1");
|
|
g_assert (g_error_matches (error,
|
|
GTK_BUILDER_ERROR,
|
|
GTK_BUILDER_ERROR_MISSING_ATTRIBUTE));
|
|
g_object_unref (builder);
|
|
g_error_free (error);
|
|
error = NULL;
|
|
|
|
builder = gtk_builder_new ();
|
|
gtk_builder_add_from_string (builder, err_buffer2, -1, &error);
|
|
label = gtk_builder_get_object (builder, "label1");
|
|
|
|
g_assert (g_error_matches (error,
|
|
GTK_BUILDER_ERROR,
|
|
GTK_BUILDER_ERROR_INVALID_ATTRIBUTE));
|
|
g_object_unref (builder);
|
|
g_error_free (error);
|
|
}
|
|
|
|
static void
|
|
test_requires (void)
|
|
{
|
|
GtkBuilder *builder;
|
|
GError *error = NULL;
|
|
gchar *buffer;
|
|
const gchar buffer_fmt[] =
|
|
"<interface>"
|
|
" <requires lib=\"gtk+\" version=\"%d.%d\"/>"
|
|
"</interface>";
|
|
|
|
buffer = g_strdup_printf (buffer_fmt, GTK_MAJOR_VERSION, GTK_MINOR_VERSION + 1);
|
|
builder = gtk_builder_new ();
|
|
gtk_builder_add_from_string (builder, buffer, -1, &error);
|
|
g_assert (g_error_matches (error,
|
|
GTK_BUILDER_ERROR,
|
|
GTK_BUILDER_ERROR_VERSION_MISMATCH));
|
|
g_object_unref (builder);
|
|
g_error_free (error);
|
|
g_free (buffer);
|
|
}
|
|
|
|
static void
|
|
test_add_objects (void)
|
|
{
|
|
GtkBuilder *builder;
|
|
GError *error;
|
|
gint ret;
|
|
GObject *obj;
|
|
GtkUIManager *manager;
|
|
GtkWidget *menubar;
|
|
GObject *menu, *label;
|
|
GList *children;
|
|
gchar *objects[2] = {"mainbox", NULL};
|
|
gchar *objects2[3] = {"mainbox", "window2", NULL};
|
|
gchar *objects3[3] = {"uimgr1", "menubar1"};
|
|
gchar *objects4[2] = {"uimgr1", NULL};
|
|
const gchar buffer[] =
|
|
"<interface>"
|
|
" <object class=\"GtkWindow\" id=\"window\">"
|
|
" <child>"
|
|
" <object class=\"GtkVBox\" id=\"mainbox\">"
|
|
" <property name=\"visible\">True</property>"
|
|
" <child>"
|
|
" <object class=\"GtkLabel\" id=\"label1\">"
|
|
" <property name=\"visible\">True</property>"
|
|
" <property name=\"label\" translatable=\"no\">first label</property>"
|
|
" </object>"
|
|
" </child>"
|
|
" <child>"
|
|
" <object class=\"GtkLabel\" id=\"label2\">"
|
|
" <property name=\"visible\">True</property>"
|
|
" <property name=\"label\" translatable=\"no\">second label</property>"
|
|
" </object>"
|
|
" <packing>"
|
|
" <property name=\"position\">1</property>"
|
|
" </packing>"
|
|
" </child>"
|
|
" </object>"
|
|
" </child>"
|
|
" </object>"
|
|
" <object class=\"GtkWindow\" id=\"window2\">"
|
|
" <child>"
|
|
" <object class=\"GtkLabel\" id=\"label3\">"
|
|
" <property name=\"label\" translatable=\"no\">second label</property>"
|
|
" </object>"
|
|
" </child>"
|
|
" </object>"
|
|
"<interface/>";
|
|
const gchar buffer2[] =
|
|
"<interface>"
|
|
" <object class=\"GtkUIManager\" id=\"uimgr1\">"
|
|
" <child>"
|
|
" <object class=\"GtkActionGroup\" id=\"ag1\">"
|
|
" <child>"
|
|
" <object class=\"GtkAction\" id=\"file\">"
|
|
" <property name=\"label\">_File</property>"
|
|
" </object>"
|
|
" <accelerator key=\"n\" modifiers=\"GDK_CONTROL_MASK\"/>"
|
|
" </child>"
|
|
" </object>"
|
|
" </child>"
|
|
" <ui>"
|
|
" <menubar name=\"menubar1\">"
|
|
" <menu action=\"file\">"
|
|
" </menu>"
|
|
" </menubar>"
|
|
" </ui>"
|
|
" </object>"
|
|
" <object class=\"GtkWindow\" id=\"window1\">"
|
|
" <child>"
|
|
" <object class=\"GtkMenuBar\" id=\"menubar1\" constructor=\"uimgr1\"/>"
|
|
" </child>"
|
|
" </object>"
|
|
"</interface>";
|
|
|
|
error = NULL;
|
|
builder = gtk_builder_new ();
|
|
ret = gtk_builder_add_objects_from_string (builder, buffer, -1, objects, &error);
|
|
g_assert (ret);
|
|
g_assert (error == NULL);
|
|
obj = gtk_builder_get_object (builder, "window");
|
|
g_assert (obj == NULL);
|
|
obj = gtk_builder_get_object (builder, "window2");
|
|
g_assert (obj == NULL);
|
|
obj = gtk_builder_get_object (builder, "mainbox");
|
|
g_assert (GTK_IS_WIDGET (obj));
|
|
g_object_unref (builder);
|
|
|
|
error = NULL;
|
|
builder = gtk_builder_new ();
|
|
ret = gtk_builder_add_objects_from_string (builder, buffer, -1, objects2, &error);
|
|
g_assert (ret);
|
|
g_assert (error == NULL);
|
|
obj = gtk_builder_get_object (builder, "window");
|
|
g_assert (obj == NULL);
|
|
obj = gtk_builder_get_object (builder, "window2");
|
|
g_assert (GTK_IS_WINDOW (obj));
|
|
gtk_widget_destroy (GTK_WIDGET (obj));
|
|
obj = gtk_builder_get_object (builder, "mainbox");
|
|
g_assert (GTK_IS_WIDGET (obj));
|
|
g_object_unref (builder);
|
|
|
|
/* test cherry picking a ui manager and menubar that depends on it */
|
|
error = NULL;
|
|
builder = gtk_builder_new ();
|
|
ret = gtk_builder_add_objects_from_string (builder, buffer2, -1, objects3, &error);
|
|
g_assert (ret);
|
|
obj = gtk_builder_get_object (builder, "uimgr1");
|
|
g_assert (GTK_IS_UI_MANAGER (obj));
|
|
obj = gtk_builder_get_object (builder, "file");
|
|
g_assert (GTK_IS_ACTION (obj));
|
|
obj = gtk_builder_get_object (builder, "menubar1");
|
|
g_assert (GTK_IS_MENU_BAR (obj));
|
|
menubar = GTK_WIDGET (obj);
|
|
|
|
children = gtk_container_get_children (GTK_CONTAINER (menubar));
|
|
menu = children->data;
|
|
g_assert (menu != NULL);
|
|
g_assert (GTK_IS_MENU_ITEM (menu));
|
|
g_assert (strcmp (gtk_widget_get_name (GTK_WIDGET (menu)), "file") == 0);
|
|
g_list_free (children);
|
|
|
|
label = G_OBJECT (gtk_bin_get_child (GTK_BIN (menu)));
|
|
g_assert (label != NULL);
|
|
g_assert (GTK_IS_LABEL (label));
|
|
g_assert (strcmp (gtk_label_get_text (GTK_LABEL (label)), "File") == 0);
|
|
|
|
g_object_unref (builder);
|
|
|
|
/* test cherry picking just the ui manager */
|
|
error = NULL;
|
|
builder = gtk_builder_new ();
|
|
ret = gtk_builder_add_objects_from_string (builder, buffer2, -1, objects4, &error);
|
|
g_assert (ret);
|
|
obj = gtk_builder_get_object (builder, "uimgr1");
|
|
g_assert (GTK_IS_UI_MANAGER (obj));
|
|
manager = GTK_UI_MANAGER (obj);
|
|
obj = gtk_builder_get_object (builder, "file");
|
|
g_assert (GTK_IS_ACTION (obj));
|
|
menubar = gtk_ui_manager_get_widget (manager, "/menubar1");
|
|
g_assert (GTK_IS_MENU_BAR (menubar));
|
|
|
|
children = gtk_container_get_children (GTK_CONTAINER (menubar));
|
|
menu = children->data;
|
|
g_assert (menu != NULL);
|
|
g_assert (GTK_IS_MENU_ITEM (menu));
|
|
g_assert (strcmp (gtk_widget_get_name (GTK_WIDGET (menu)), "file") == 0);
|
|
g_list_free (children);
|
|
|
|
label = G_OBJECT (gtk_bin_get_child (GTK_BIN (menu)));
|
|
g_assert (label != NULL);
|
|
g_assert (GTK_IS_LABEL (label));
|
|
g_assert (strcmp (gtk_label_get_text (GTK_LABEL (label)), "File") == 0);
|
|
|
|
g_object_unref (builder);
|
|
}
|
|
|
|
static GtkWidget *
|
|
get_parent_menubar (GtkWidget *menuitem)
|
|
{
|
|
GtkMenuShell *menu_shell;
|
|
GtkWidget *attach = NULL;
|
|
|
|
menu_shell = GTK_MENU_SHELL (gtk_widget_get_parent (menuitem));
|
|
|
|
g_assert (GTK_IS_MENU_SHELL (menu_shell));
|
|
|
|
while (menu_shell && !GTK_IS_MENU_BAR (menu_shell))
|
|
{
|
|
if (GTK_IS_MENU (menu_shell) &&
|
|
(attach = gtk_menu_get_attach_widget (GTK_MENU (menu_shell))) != NULL)
|
|
menu_shell = GTK_MENU_SHELL (gtk_widget_get_parent (attach));
|
|
else
|
|
menu_shell = NULL;
|
|
}
|
|
|
|
return menu_shell ? GTK_WIDGET (menu_shell) : NULL;
|
|
}
|
|
|
|
static void
|
|
test_menus (void)
|
|
{
|
|
const gchar *buffer =
|
|
"<interface>"
|
|
" <object class=\"GtkWindow\" id=\"window1\">"
|
|
" <accel-groups>"
|
|
" <group name=\"accelgroup1\"/>"
|
|
" </accel-groups>"
|
|
" <child>"
|
|
" <object class=\"GtkVBox\" id=\"vbox1\">"
|
|
" <property name=\"visible\">True</property>"
|
|
" <property name=\"orientation\">vertical</property>"
|
|
" <child>"
|
|
" <object class=\"GtkMenuBar\" id=\"menubar1\">"
|
|
" <property name=\"visible\">True</property>"
|
|
" <child>"
|
|
" <object class=\"GtkMenuItem\" id=\"menuitem1\">"
|
|
" <property name=\"visible\">True</property>"
|
|
" <property name=\"label\" translatable=\"yes\">_File</property>"
|
|
" <property name=\"use_underline\">True</property>"
|
|
" <child type=\"submenu\">"
|
|
" <object class=\"GtkMenu\" id=\"menu1\">"
|
|
" <property name=\"visible\">True</property>"
|
|
" <child>"
|
|
" <object class=\"GtkImageMenuItem\" id=\"imagemenuitem1\">"
|
|
" <property name=\"label\">gtk-new</property>"
|
|
" <property name=\"visible\">True</property>"
|
|
" <property name=\"use_stock\">True</property>"
|
|
" <property name=\"accel_group\">accelgroup1</property>"
|
|
" </object>"
|
|
" </child>"
|
|
" </object>"
|
|
" </child>"
|
|
" </object>"
|
|
" </child>"
|
|
" </object>"
|
|
" </child>"
|
|
" </object>"
|
|
" </child>"
|
|
" </object>"
|
|
"<object class=\"GtkAccelGroup\" id=\"accelgroup1\"/>"
|
|
"</interface>";
|
|
|
|
const gchar *buffer1 =
|
|
"<interface>"
|
|
" <object class=\"GtkWindow\" id=\"window1\">"
|
|
" <accel-groups>"
|
|
" <group name=\"accelgroup1\"/>"
|
|
" </accel-groups>"
|
|
" <child>"
|
|
" <object class=\"GtkVBox\" id=\"vbox1\">"
|
|
" <property name=\"visible\">True</property>"
|
|
" <property name=\"orientation\">vertical</property>"
|
|
" <child>"
|
|
" <object class=\"GtkMenuBar\" id=\"menubar1\">"
|
|
" <property name=\"visible\">True</property>"
|
|
" <child>"
|
|
" <object class=\"GtkImageMenuItem\" id=\"imagemenuitem1\">"
|
|
" <property name=\"visible\">True</property>"
|
|
" <child>"
|
|
" <object class=\"GtkLabel\" id=\"custom1\">"
|
|
" <property name=\"visible\">True</property>"
|
|
" <property name=\"label\">a label</property>"
|
|
" </object>"
|
|
" </child>"
|
|
" </object>"
|
|
" </child>"
|
|
" </object>"
|
|
" </child>"
|
|
" </object>"
|
|
" </child>"
|
|
" </object>"
|
|
"<object class=\"GtkAccelGroup\" id=\"accelgroup1\"/>"
|
|
"</interface>";
|
|
GtkBuilder *builder;
|
|
GtkWidget *child;
|
|
GtkWidget *window, *item;
|
|
GtkAccelGroup *accel_group;
|
|
GtkWidget *item_accel_label, *sample_accel_label, *sample_menu_item, *custom;
|
|
|
|
/* Check that the item has the correct accel label string set
|
|
*/
|
|
builder = builder_new_from_string (buffer, -1, NULL);
|
|
window = (GtkWidget *)gtk_builder_get_object (builder, "window1");
|
|
item = (GtkWidget *)gtk_builder_get_object (builder, "imagemenuitem1");
|
|
accel_group = (GtkAccelGroup *)gtk_builder_get_object (builder, "accelgroup1");
|
|
|
|
gtk_widget_show_all (window);
|
|
|
|
G_GNUC_BEGIN_IGNORE_DEPRECATIONS;
|
|
sample_menu_item = gtk_image_menu_item_new_from_stock (GTK_STOCK_NEW, accel_group);
|
|
G_GNUC_END_IGNORE_DEPRECATIONS;
|
|
|
|
child = gtk_bin_get_child (GTK_BIN (sample_menu_item));
|
|
g_assert (child);
|
|
g_assert (GTK_IS_ACCEL_LABEL (child));
|
|
sample_accel_label = child;
|
|
gtk_widget_show (sample_accel_label);
|
|
|
|
child = gtk_bin_get_child (GTK_BIN (item));
|
|
g_assert (child);
|
|
g_assert (GTK_IS_ACCEL_LABEL (child));
|
|
item_accel_label = child;
|
|
|
|
gtk_accel_label_refetch (GTK_ACCEL_LABEL (sample_accel_label));
|
|
gtk_accel_label_refetch (GTK_ACCEL_LABEL (item_accel_label));
|
|
|
|
g_assert (gtk_label_get_text (GTK_LABEL (sample_accel_label)) != NULL);
|
|
g_assert (gtk_label_get_text (GTK_LABEL (item_accel_label)) != NULL);
|
|
g_assert (strcmp (gtk_label_get_text (GTK_LABEL (item_accel_label)),
|
|
gtk_label_get_text (GTK_LABEL (sample_accel_label))) == 0);
|
|
|
|
/* Check the menu hierarchy worked here */
|
|
g_assert (get_parent_menubar (item));
|
|
|
|
gtk_widget_destroy (GTK_WIDGET (window));
|
|
gtk_widget_destroy (sample_menu_item);
|
|
g_object_unref (builder);
|
|
|
|
|
|
/* Check that we can add alien children to menu items via normal
|
|
* GtkContainer apis.
|
|
*/
|
|
builder = builder_new_from_string (buffer1, -1, NULL);
|
|
window = (GtkWidget *)gtk_builder_get_object (builder, "window1");
|
|
item = (GtkWidget *)gtk_builder_get_object (builder, "imagemenuitem1");
|
|
custom = (GtkWidget *)gtk_builder_get_object (builder, "custom1");
|
|
|
|
g_assert (gtk_widget_get_parent (custom) == item);
|
|
|
|
gtk_widget_destroy (GTK_WIDGET (window));
|
|
g_object_unref (builder);
|
|
}
|
|
|
|
static void
|
|
test_file (const gchar *filename)
|
|
{
|
|
GtkBuilder *builder;
|
|
GError *error = NULL;
|
|
GSList *l, *objects;
|
|
|
|
builder = gtk_builder_new ();
|
|
|
|
if (!gtk_builder_add_from_file (builder, filename, &error))
|
|
{
|
|
g_error ("%s", error->message);
|
|
g_error_free (error);
|
|
return;
|
|
}
|
|
|
|
objects = gtk_builder_get_objects (builder);
|
|
for (l = objects; l; l = l->next)
|
|
{
|
|
GObject *obj = (GObject*)l->data;
|
|
|
|
if (GTK_IS_DIALOG (obj))
|
|
{
|
|
g_print ("Running dialog %s.\n",
|
|
gtk_widget_get_name (GTK_WIDGET (obj)));
|
|
gtk_dialog_run (GTK_DIALOG (obj));
|
|
}
|
|
else if (GTK_IS_WINDOW (obj))
|
|
{
|
|
g_signal_connect (obj, "destroy", G_CALLBACK (gtk_main_quit), NULL);
|
|
g_print ("Showing %s.\n",
|
|
gtk_widget_get_name (GTK_WIDGET (obj)));
|
|
gtk_widget_show_all (GTK_WIDGET (obj));
|
|
}
|
|
}
|
|
|
|
gtk_main ();
|
|
|
|
g_object_unref (builder);
|
|
}
|
|
|
|
static void
|
|
test_message_area (void)
|
|
{
|
|
GtkBuilder *builder;
|
|
GObject *obj, *obj1;
|
|
const gchar buffer[] =
|
|
"<interface>"
|
|
" <object class=\"GtkInfoBar\" id=\"infobar1\">"
|
|
" <child internal-child=\"content_area\">"
|
|
" <object class=\"GtkHBox\" id=\"contentarea1\">"
|
|
" <child>"
|
|
" <object class=\"GtkLabel\" id=\"content\">"
|
|
" <property name=\"label\" translatable=\"yes\">Message</property>"
|
|
" </object>"
|
|
" <packing>"
|
|
" <property name='expand'>False</property>"
|
|
" </packing>"
|
|
" </child>"
|
|
" </object>"
|
|
" </child>"
|
|
" <child internal-child=\"action_area\">"
|
|
" <object class=\"GtkVButtonBox\" id=\"actionarea1\">"
|
|
" <child>"
|
|
" <object class=\"GtkButton\" id=\"button_ok\">"
|
|
" <property name=\"label\">gtk-ok</property>"
|
|
" <property name=\"use-stock\">yes</property>"
|
|
" </object>"
|
|
" </child>"
|
|
" </object>"
|
|
" </child>"
|
|
" <action-widgets>"
|
|
" <action-widget response=\"1\">button_ok</action-widget>"
|
|
" </action-widgets>"
|
|
" </object>"
|
|
"</interface>";
|
|
|
|
builder = builder_new_from_string (buffer, -1, NULL);
|
|
obj = gtk_builder_get_object (builder, "infobar1");
|
|
g_assert (GTK_IS_INFO_BAR (obj));
|
|
obj1 = gtk_builder_get_object (builder, "content");
|
|
g_assert (GTK_IS_LABEL (obj1));
|
|
|
|
obj1 = gtk_builder_get_object (builder, "button_ok");
|
|
g_assert (GTK_IS_BUTTON (obj1));
|
|
|
|
g_object_unref (builder);
|
|
}
|
|
|
|
static void
|
|
test_gmenu (void)
|
|
{
|
|
GtkBuilder *builder;
|
|
GObject *obj, *obj1;
|
|
const gchar buffer[] =
|
|
"<interface>"
|
|
" <object class=\"GtkWindow\" id=\"window\">"
|
|
" </object>"
|
|
" <menu id='edit-menu'>"
|
|
" <section>"
|
|
" <item>"
|
|
" <attribute name='label'>Undo</attribute>"
|
|
" <attribute name='action'>undo</attribute>"
|
|
" </item>"
|
|
" <item>"
|
|
" <attribute name='label'>Redo</attribute>"
|
|
" <attribute name='action'>redo</attribute>"
|
|
" </item>"
|
|
" </section>"
|
|
" <section></section>"
|
|
" <section>"
|
|
" <attribute name='label'>Copy & Paste</attribute>"
|
|
" <item>"
|
|
" <attribute name='label'>Cut</attribute>"
|
|
" <attribute name='action'>cut</attribute>"
|
|
" </item>"
|
|
" <item>"
|
|
" <attribute name='label'>Copy</attribute>"
|
|
" <attribute name='action'>copy</attribute>"
|
|
" </item>"
|
|
" <item>"
|
|
" <attribute name='label'>Paste</attribute>"
|
|
" <attribute name='action'>paste</attribute>"
|
|
" </item>"
|
|
" </section>"
|
|
" <item><link name='section' id='blargh'>"
|
|
" <item>"
|
|
" <attribute name='label'>Bold</attribute>"
|
|
" <attribute name='action'>bold</attribute>"
|
|
" </item>"
|
|
" <submenu>"
|
|
" <attribute name='label'>Language</attribute>"
|
|
" <item>"
|
|
" <attribute name='label'>Latin</attribute>"
|
|
" <attribute name='action'>lang</attribute>"
|
|
" <attribute name='target'>'latin'</attribute>"
|
|
" </item>"
|
|
" <item>"
|
|
" <attribute name='label'>Greek</attribute>"
|
|
" <attribute name='action'>lang</attribute>"
|
|
" <attribute name='target'>'greek'</attribute>"
|
|
" </item>"
|
|
" <item>"
|
|
" <attribute name='label'>Urdu</attribute>"
|
|
" <attribute name='action'>lang</attribute>"
|
|
" <attribute name='target'>'urdu'</attribute>"
|
|
" </item>"
|
|
" </submenu>"
|
|
" </link></item>"
|
|
" </menu>"
|
|
"</interface>";
|
|
|
|
builder = builder_new_from_string (buffer, -1, NULL);
|
|
obj = gtk_builder_get_object (builder, "window");
|
|
g_assert (GTK_IS_WINDOW (obj));
|
|
obj1 = gtk_builder_get_object (builder, "edit-menu");
|
|
g_assert (G_IS_MENU_MODEL (obj1));
|
|
obj1 = gtk_builder_get_object (builder, "blargh");
|
|
g_assert (G_IS_MENU_MODEL (obj1));
|
|
g_object_unref (builder);
|
|
}
|
|
|
|
static void
|
|
test_level_bar (void)
|
|
{
|
|
GtkBuilder *builder;
|
|
GError *error = NULL;
|
|
GObject *obj, *obj1;
|
|
const gchar buffer1[] =
|
|
"<interface>"
|
|
" <object class=\"GtkWindow\" id=\"window\">"
|
|
" <child>"
|
|
" <object class=\"GtkLevelBar\" id=\"levelbar\">"
|
|
" <property name=\"value\">4.70</property>"
|
|
" <property name=\"min-value\">2</property>"
|
|
" <property name=\"max-value\">5</property>"
|
|
" <offsets>"
|
|
" <offset name=\"low\" value=\"2.25\"/>"
|
|
" <offset name=\"custom\" value=\"3\"/>"
|
|
" <offset name=\"high\" value=\"3\"/>"
|
|
" </offsets>"
|
|
" </object>"
|
|
" </child>"
|
|
" </object>"
|
|
"</interface>";
|
|
const gchar buffer2[] =
|
|
"<interface>"
|
|
" <object class=\"GtkLevelBar\" id=\"levelbar\">"
|
|
" <offsets>"
|
|
" <offset name=\"low\" bogus_attr=\"foo\"/>"
|
|
" </offsets>"
|
|
" </object>"
|
|
"</interface>";
|
|
const gchar buffer3[] =
|
|
"<interface>"
|
|
" <object class=\"GtkLevelBar\" id=\"levelbar\">"
|
|
" <offsets>"
|
|
" <offset name=\"low\" value=\"1\"/>"
|
|
" </offsets>"
|
|
" <bogus_tag>"
|
|
" </bogus_tag>"
|
|
" </object>"
|
|
"</interface>";
|
|
|
|
builder = gtk_builder_new ();
|
|
gtk_builder_add_from_string (builder, buffer1, -1, &error);
|
|
g_assert (error == NULL);
|
|
|
|
obj = gtk_builder_get_object (builder, "window");
|
|
g_assert (GTK_IS_WINDOW (obj));
|
|
obj1 = gtk_builder_get_object (builder, "levelbar");
|
|
g_assert (GTK_IS_LEVEL_BAR (obj1));
|
|
g_object_unref (builder);
|
|
|
|
error = NULL;
|
|
builder = gtk_builder_new ();
|
|
gtk_builder_add_from_string (builder, buffer2, -1, &error);
|
|
g_assert (g_error_matches (error,
|
|
GTK_BUILDER_ERROR,
|
|
GTK_BUILDER_ERROR_INVALID_ATTRIBUTE));
|
|
g_error_free (error);
|
|
g_object_unref (builder);
|
|
|
|
error = NULL;
|
|
builder = gtk_builder_new ();
|
|
gtk_builder_add_from_string (builder, buffer3, -1, &error);
|
|
g_assert (g_error_matches (error,
|
|
GTK_BUILDER_ERROR,
|
|
GTK_BUILDER_ERROR_UNHANDLED_TAG));
|
|
g_error_free (error);
|
|
g_object_unref (builder);
|
|
}
|
|
|
|
static GObject *external_object = NULL, *external_object_swapped = NULL;
|
|
|
|
void
|
|
on_button_clicked (GtkButton *button, GObject *data)
|
|
{
|
|
external_object = data;
|
|
}
|
|
|
|
void
|
|
on_button_clicked_swapped (GObject *data, GtkButton *button)
|
|
{
|
|
external_object_swapped = data;
|
|
}
|
|
|
|
static void
|
|
test_expose_object (void)
|
|
{
|
|
GtkBuilder *builder;
|
|
GError *error = NULL;
|
|
GtkWidget *image;
|
|
GObject *obj;
|
|
const gchar buffer[] =
|
|
"<interface>"
|
|
" <object class=\"GtkButton\" id=\"button\">"
|
|
" <property name=\"image\">external_image</property>"
|
|
" <signal name=\"clicked\" handler=\"on_button_clicked\" object=\"builder\" swapped=\"no\"/>"
|
|
" <signal name=\"clicked\" handler=\"on_button_clicked_swapped\" object=\"builder\"/>"
|
|
" </object>"
|
|
"</interface>";
|
|
|
|
image = gtk_image_new ();
|
|
builder = gtk_builder_new ();
|
|
gtk_builder_expose_object (builder, "external_image", G_OBJECT (image));
|
|
gtk_builder_expose_object (builder, "builder", G_OBJECT (builder));
|
|
gtk_builder_add_from_string (builder, buffer, -1, &error);
|
|
g_assert (error == NULL);
|
|
|
|
obj = gtk_builder_get_object (builder, "button");
|
|
g_assert (GTK_IS_BUTTON (obj));
|
|
|
|
g_assert (gtk_button_get_image (GTK_BUTTON (obj)) == image);
|
|
|
|
/* Connect signals and fake clicked event */
|
|
gtk_builder_connect_signals (builder, NULL);
|
|
gtk_button_clicked (GTK_BUTTON (obj));
|
|
|
|
g_assert (external_object == G_OBJECT (builder));
|
|
g_assert (external_object_swapped == G_OBJECT (builder));
|
|
|
|
g_object_unref (builder);
|
|
g_object_unref (image);
|
|
}
|
|
|
|
static void
|
|
test_no_ids (void)
|
|
{
|
|
GtkBuilder *builder;
|
|
GError *error = NULL;
|
|
GObject *obj;
|
|
const gchar buffer[] =
|
|
"<interface>"
|
|
" <object class=\"GtkInfoBar\">"
|
|
" <child internal-child=\"content_area\">"
|
|
" <object class=\"GtkHBox\">"
|
|
" <child>"
|
|
" <object class=\"GtkLabel\">"
|
|
" <property name=\"label\" translatable=\"yes\">Message</property>"
|
|
" </object>"
|
|
" <packing>"
|
|
" <property name='expand'>False</property>"
|
|
" </packing>"
|
|
" </child>"
|
|
" </object>"
|
|
" </child>"
|
|
" <child internal-child=\"action_area\">"
|
|
" <object class=\"GtkVButtonBox\">"
|
|
" <child>"
|
|
" <object class=\"GtkButton\" id=\"button_ok\">"
|
|
" <property name=\"label\">gtk-ok</property>"
|
|
" <property name=\"use-stock\">yes</property>"
|
|
" </object>"
|
|
" </child>"
|
|
" </object>"
|
|
" </child>"
|
|
" <action-widgets>"
|
|
" <action-widget response=\"1\">button_ok</action-widget>"
|
|
" </action-widgets>"
|
|
" </object>"
|
|
"</interface>";
|
|
|
|
builder = gtk_builder_new ();
|
|
gtk_builder_add_from_string (builder, buffer, -1, &error);
|
|
g_assert (error == NULL);
|
|
|
|
obj = gtk_builder_get_object (builder, "button_ok");
|
|
g_assert (GTK_IS_BUTTON (obj));
|
|
|
|
g_object_unref (builder);
|
|
}
|
|
|
|
int
|
|
main (int argc, char **argv)
|
|
{
|
|
/* initialize test program */
|
|
gtk_test_init (&argc, &argv);
|
|
|
|
if (argc > 1)
|
|
{
|
|
test_file (argv[1]);
|
|
return 0;
|
|
}
|
|
|
|
g_test_add_func ("/Builder/Parser", test_parser);
|
|
g_test_add_func ("/Builder/Types", test_types);
|
|
g_test_add_func ("/Builder/Construct-Only Properties", test_construct_only_property);
|
|
g_test_add_func ("/Builder/Children", test_children);
|
|
g_test_add_func ("/Builder/Child Properties", test_child_properties);
|
|
g_test_add_func ("/Builder/Object Properties", test_object_properties);
|
|
g_test_add_func ("/Builder/Notebook", test_notebook);
|
|
g_test_add_func ("/Builder/Domain", test_domain);
|
|
g_test_add_func ("/Builder/Signal Autoconnect", test_connect_signals);
|
|
g_test_add_func ("/Builder/UIManager Simple", test_uimanager_simple);
|
|
g_test_add_func ("/Builder/Spin Button", test_spin_button);
|
|
g_test_add_func ("/Builder/SizeGroup", test_sizegroup);
|
|
g_test_add_func ("/Builder/ListStore", test_list_store);
|
|
g_test_add_func ("/Builder/TreeStore", test_tree_store);
|
|
g_test_add_func ("/Builder/TreeView Column", test_treeview_column);
|
|
g_test_add_func ("/Builder/IconView", test_icon_view);
|
|
g_test_add_func ("/Builder/ComboBox", test_combo_box);
|
|
#if 0
|
|
g_test_add_func ("/Builder/ComboBox Entry", test_combo_box_entry);
|
|
#endif
|
|
g_test_add_func ("/Builder/CellView", test_cell_view);
|
|
g_test_add_func ("/Builder/Dialog", test_dialog);
|
|
g_test_add_func ("/Builder/Accelerators", test_accelerators);
|
|
g_test_add_func ("/Builder/Widget", test_widget);
|
|
g_test_add_func ("/Builder/Value From String", test_value_from_string);
|
|
g_test_add_func ("/Builder/Reference Counting", test_reference_counting);
|
|
g_test_add_func ("/Builder/Window", test_window);
|
|
g_test_add_func ("/Builder/IconFactory", test_icon_factory);
|
|
g_test_add_func ("/Builder/PangoAttributes", test_pango_attributes);
|
|
g_test_add_func ("/Builder/Requires", test_requires);
|
|
g_test_add_func ("/Builder/AddObjects", test_add_objects);
|
|
g_test_add_func ("/Builder/Menus", test_menus);
|
|
g_test_add_func ("/Builder/MessageArea", test_message_area);
|
|
g_test_add_func ("/Builder/MessageDialog", test_message_dialog);
|
|
g_test_add_func ("/Builder/GMenu", test_gmenu);
|
|
g_test_add_func ("/Builder/LevelBar", test_level_bar);
|
|
g_test_add_func ("/Builder/Expose Object", test_expose_object);
|
|
g_test_add_func ("/Builder/No IDs", test_no_ids);
|
|
|
|
return g_test_run();
|
|
}
|
|
|