Blame telepathy-account-widgets/tp-account-widgets/tpaw-builder.c

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
}