|
Packit |
79f644 |
/*
|
|
Packit |
79f644 |
* Copyright (C) 2013 Collabora Ltd.
|
|
Packit |
79f644 |
*
|
|
Packit |
79f644 |
* Authors: Marco Barisione <marco.barisione@collabora.co.uk>
|
|
Packit |
79f644 |
* Guillaume Desmottes <guillaume.desmottes@collabora.co.uk>
|
|
Packit |
79f644 |
* Xavier Claessens <xavier.claessens@collabora.co.uk>
|
|
Packit |
79f644 |
* Mikael Hallendal <micke@imendio.com>
|
|
Packit |
79f644 |
* Richard Hult <richard@imendio.com>
|
|
Packit |
79f644 |
* Martyn Russell <martyn@imendio.com>
|
|
Packit |
79f644 |
*
|
|
Packit |
79f644 |
* This library is free software; you can redistribute it and/or
|
|
Packit |
79f644 |
* modify it under the terms of the GNU Lesser General Public
|
|
Packit |
79f644 |
* License as published by the Free Software Foundation; either
|
|
Packit |
79f644 |
* version 2.1 of the License, or (at your option) any later version.
|
|
Packit |
79f644 |
*
|
|
Packit |
79f644 |
* This library is distributed in the hope that it will be useful,
|
|
Packit |
79f644 |
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
Packit |
79f644 |
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
|
Packit |
79f644 |
* Lesser General Public License for more details.
|
|
Packit |
79f644 |
*
|
|
Packit |
79f644 |
* You should have received a copy of the GNU Lesser General Public
|
|
Packit |
79f644 |
* License along with this library; if not, write to the Free Software
|
|
Packit |
79f644 |
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
|
|
Packit |
79f644 |
*/
|
|
Packit |
79f644 |
|
|
Packit |
79f644 |
#include "config.h"
|
|
Packit |
79f644 |
#include "tpaw-builder.h"
|
|
Packit |
79f644 |
|
|
Packit |
79f644 |
#define DEBUG_FLAG TPAW_DEBUG_OTHER
|
|
Packit |
79f644 |
#include "tpaw-debug.h"
|
|
Packit |
79f644 |
|
|
Packit |
79f644 |
enum _BuilderSource
|
|
Packit |
79f644 |
{
|
|
Packit |
79f644 |
BUILDER_SOURCE_FILE,
|
|
Packit |
79f644 |
BUILDER_SOURCE_RESOURCE
|
|
Packit |
79f644 |
};
|
|
Packit |
79f644 |
|
|
Packit |
79f644 |
static GtkBuilder *
|
|
Packit |
79f644 |
builder_get_valist (const gchar *sourcename,
|
|
Packit |
79f644 |
enum _BuilderSource source,
|
|
Packit |
79f644 |
const gchar *translation_domain,
|
|
Packit |
79f644 |
const gchar *first_object,
|
|
Packit |
79f644 |
va_list args)
|
|
Packit |
79f644 |
{
|
|
Packit |
79f644 |
GtkBuilder *gui;
|
|
Packit |
79f644 |
const gchar *name;
|
|
Packit |
79f644 |
GObject **object_ptr;
|
|
Packit |
79f644 |
GError *error = NULL;
|
|
Packit |
79f644 |
gboolean success;
|
|
Packit |
79f644 |
|
|
Packit |
79f644 |
DEBUG ("Loading %s '%s'", source == BUILDER_SOURCE_FILE ? "file" : "resource", sourcename);
|
|
Packit |
79f644 |
|
|
Packit |
79f644 |
gui = gtk_builder_new ();
|
|
Packit |
79f644 |
gtk_builder_set_translation_domain (gui, translation_domain);
|
|
Packit |
79f644 |
|
|
Packit |
79f644 |
switch (source)
|
|
Packit |
79f644 |
{
|
|
Packit |
79f644 |
case BUILDER_SOURCE_FILE:
|
|
Packit |
79f644 |
success = gtk_builder_add_from_file (gui, sourcename, &error);
|
|
Packit |
79f644 |
break;
|
|
Packit |
79f644 |
case BUILDER_SOURCE_RESOURCE:
|
|
Packit |
79f644 |
success = gtk_builder_add_from_resource (gui, sourcename, &error);
|
|
Packit |
79f644 |
break;
|
|
Packit |
79f644 |
default:
|
|
Packit |
79f644 |
g_assert_not_reached ();
|
|
Packit |
79f644 |
}
|
|
Packit |
79f644 |
|
|
Packit |
79f644 |
if (!success)
|
|
Packit |
79f644 |
{
|
|
Packit |
79f644 |
g_critical ("GtkBuilder Error (%s): %s",
|
|
Packit |
79f644 |
sourcename, error->message);
|
|
Packit |
79f644 |
|
|
Packit |
79f644 |
g_clear_error (&error);
|
|
Packit |
79f644 |
g_object_unref (gui);
|
|
Packit |
79f644 |
|
|
Packit |
79f644 |
/* we need to iterate and set all of the pointers to NULL */
|
|
Packit |
79f644 |
for (name = first_object; name; name = va_arg (args, const gchar *))
|
|
Packit |
79f644 |
{
|
|
Packit |
79f644 |
object_ptr = va_arg (args, GObject**);
|
|
Packit |
79f644 |
|
|
Packit |
79f644 |
*object_ptr = NULL;
|
|
Packit |
79f644 |
}
|
|
Packit |
79f644 |
|
|
Packit |
79f644 |
return NULL;
|
|
Packit |
79f644 |
}
|
|
Packit |
79f644 |
|
|
Packit |
79f644 |
for (name = first_object; name; name = va_arg (args, const gchar *))
|
|
Packit |
79f644 |
{
|
|
Packit |
79f644 |
object_ptr = va_arg (args, GObject**);
|
|
Packit |
79f644 |
|
|
Packit |
79f644 |
*object_ptr = gtk_builder_get_object (gui, name);
|
|
Packit |
79f644 |
|
|
Packit |
79f644 |
if (!*object_ptr)
|
|
Packit |
79f644 |
{
|
|
Packit |
79f644 |
g_warning ("File is missing object '%s'.", name);
|
|
Packit |
79f644 |
continue;
|
|
Packit |
79f644 |
}
|
|
Packit |
79f644 |
}
|
|
Packit |
79f644 |
|
|
Packit |
79f644 |
return gui;
|
|
Packit |
79f644 |
}
|
|
Packit |
79f644 |
|
|
Packit |
79f644 |
GtkBuilder *
|
|
Packit |
79f644 |
tpaw_builder_get_file_with_domain (const gchar *filename,
|
|
Packit |
79f644 |
const gchar *translation_domain,
|
|
Packit |
79f644 |
const gchar *first_object,
|
|
Packit |
79f644 |
...)
|
|
Packit |
79f644 |
{
|
|
Packit |
79f644 |
GtkBuilder *gui;
|
|
Packit |
79f644 |
va_list args;
|
|
Packit |
79f644 |
|
|
Packit |
79f644 |
va_start (args, first_object);
|
|
Packit |
79f644 |
gui = builder_get_valist (filename, BUILDER_SOURCE_FILE,
|
|
Packit |
79f644 |
translation_domain, first_object, args);
|
|
Packit |
79f644 |
va_end (args);
|
|
Packit |
79f644 |
|
|
Packit |
79f644 |
return gui;
|
|
Packit |
79f644 |
}
|
|
Packit |
79f644 |
|
|
Packit |
79f644 |
GtkBuilder *
|
|
Packit |
79f644 |
tpaw_builder_get_resource_with_domain (const gchar *resourcename,
|
|
Packit |
79f644 |
const gchar *translation_domain,
|
|
Packit |
79f644 |
const gchar *first_object,
|
|
Packit |
79f644 |
...)
|
|
Packit |
79f644 |
{
|
|
Packit |
79f644 |
GtkBuilder *gui;
|
|
Packit |
79f644 |
va_list args;
|
|
Packit |
79f644 |
|
|
Packit |
79f644 |
va_start (args, first_object);
|
|
Packit |
79f644 |
gui = builder_get_valist (resourcename, BUILDER_SOURCE_RESOURCE,
|
|
Packit |
79f644 |
translation_domain, first_object, args);
|
|
Packit |
79f644 |
va_end (args);
|
|
Packit |
79f644 |
|
|
Packit |
79f644 |
return gui;
|
|
Packit |
79f644 |
}
|
|
Packit |
79f644 |
|
|
Packit |
79f644 |
void
|
|
Packit |
79f644 |
tpaw_builder_connect (GtkBuilder *gui,
|
|
Packit |
79f644 |
gpointer user_data,
|
|
Packit |
79f644 |
const gchar *first_object,
|
|
Packit |
79f644 |
...)
|
|
Packit |
79f644 |
{
|
|
Packit |
79f644 |
va_list args;
|
|
Packit |
79f644 |
const gchar *name;
|
|
Packit |
79f644 |
const gchar *sig;
|
|
Packit |
79f644 |
GObject *object;
|
|
Packit |
79f644 |
GCallback callback;
|
|
Packit |
79f644 |
|
|
Packit |
79f644 |
va_start (args, first_object);
|
|
Packit |
79f644 |
for (name = first_object; name; name = va_arg (args, const gchar *))
|
|
Packit |
79f644 |
{
|
|
Packit |
79f644 |
sig = va_arg (args, const gchar *);
|
|
Packit |
79f644 |
callback = va_arg (args, GCallback);
|
|
Packit |
79f644 |
|
|
Packit |
79f644 |
object = gtk_builder_get_object (gui, name);
|
|
Packit |
79f644 |
if (!object)
|
|
Packit |
79f644 |
{
|
|
Packit |
79f644 |
g_warning ("File is missing object '%s'.", name);
|
|
Packit |
79f644 |
continue;
|
|
Packit |
79f644 |
}
|
|
Packit |
79f644 |
|
|
Packit |
79f644 |
g_signal_connect (object, sig, callback, user_data);
|
|
Packit |
79f644 |
}
|
|
Packit |
79f644 |
|
|
Packit |
79f644 |
va_end (args);
|
|
Packit |
79f644 |
}
|
|
Packit |
79f644 |
|
|
Packit |
79f644 |
GtkWidget *
|
|
Packit |
79f644 |
tpaw_builder_unref_and_keep_widget (GtkBuilder *gui,
|
|
Packit |
79f644 |
GtkWidget *widget)
|
|
Packit |
79f644 |
{
|
|
Packit |
79f644 |
/* On construction gui sinks the initial reference to widget. When gui
|
|
Packit |
79f644 |
* is finalized it will drop its ref to widget. We take our own ref to
|
|
Packit |
79f644 |
* prevent widget being finalised. The widget is forced to have a
|
|
Packit |
79f644 |
* floating reference, like when it was initially unowned so that it can
|
|
Packit |
79f644 |
* be used like any other GtkWidget. */
|
|
Packit |
79f644 |
|
|
Packit |
79f644 |
g_object_ref (widget);
|
|
Packit |
79f644 |
g_object_force_floating (G_OBJECT (widget));
|
|
Packit |
79f644 |
g_object_unref (gui);
|
|
Packit |
79f644 |
|
|
Packit |
79f644 |
return widget;
|
|
Packit |
79f644 |
}
|