* Library General Public License for more details.
*
* You should have received a copy of the GNU Library General Public
- * License along with this library; if not, write to the
- * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
- * Boston, MA 02111-1307, USA.
+ * License along with this library. If not, see <http://www.gnu.org/licenses/>.
*/
#include "config.h"
#include <string.h>
#include <gmodule.h>
-#include "gtktypeutils.h"
+#include <gio/gio.h>
#include "gtkbuilderprivate.h"
#include "gtkbuilder.h"
#include "gtkbuildable.h"
#include "gtkdebug.h"
#include "gtkversion.h"
-#include "gtktypeutils.h"
+#include "gtktypebuiltins.h"
#include "gtkintl.h"
-#include "gtkalias.h"
+
static void free_property_info (PropertyInfo *info);
static void free_object_info (ObjectInfo *info);
data->inside_requested_object = TRUE;
}
else
- return;
+ {
+ g_free (object_class);
+ g_free (object_id);
+ g_free (constructor);
+ return;
+ }
}
object_info = g_slice_new0 (ObjectInfo);
{
g_set_error (error, GTK_BUILDER_ERROR,
GTK_BUILDER_ERROR_DUPLICATE_ID,
- _("Duplicate object id '%s' on line %d (previously on line %d)"),
+ _("Duplicate object ID '%s' on line %d (previously on line %d)"),
object_id, line, line2);
return;
}
- g_hash_table_insert (data->object_ids, object_id, GINT_TO_POINTER (line));
+
+ g_hash_table_insert (data->object_ids, g_strdup (object_id), GINT_TO_POINTER (line));
}
static void
g_slice_free (ObjectInfo, info);
}
+static void
+free_menu_info (MenuInfo *info)
+{
+ g_free (info->id);
+ g_hash_table_unref (info->objects);
+ g_slice_free (MenuInfo, info);
+}
+
static void
parse_child (ParserData *data,
const gchar *element_name,
g_slice_free (SignalInfo, info);
}
-void
-_free_requires_info (RequiresInfo *info,
- gpointer user_data)
+static void
+free_requires_info (RequiresInfo *info,
+ gpointer user_data)
{
g_free (info->library);
g_slice_free (RequiresInfo, info);
ParserData *data = (ParserData*)user_data;
#ifdef GTK_ENABLE_DEBUG
- if (gtk_debug_flags & GTK_DEBUG_BUILDER)
+ if (gtk_get_debug_flags () & GTK_DEBUG_BUILDER)
{
GString *tags = g_string_new ("");
int i;
parse_signal (data, element_name, names, values, error);
else if (strcmp (element_name, "interface") == 0)
parse_interface (data, element_name, names, values, error);
+ else if (strcmp (element_name, "menu") == 0)
+ _gtk_builder_menu_start (data, element_name, names, values, error);
else if (strcmp (element_name, "placeholder") == 0)
{
/* placeholder has no special treatmeant, but it needs an
element_name);
}
-/* This function is taken from gettext.h
- * GNU gettext uses '\004' to separate context and msgid in .mo files.
- */
-static const char *
-_dpgettext (const char *domain,
- const char *msgctxt,
- const char *msgid)
-{
- size_t msgctxt_len = strlen (msgctxt) + 1;
- size_t msgid_len = strlen (msgid) + 1;
- const char *translation;
- char* msg_ctxt_id;
-
- msg_ctxt_id = g_alloca (msgctxt_len + msgid_len);
-
- memcpy (msg_ctxt_id, msgctxt, msgctxt_len - 1);
- msg_ctxt_id[msgctxt_len - 1] = '\004';
- memcpy (msg_ctxt_id + msgctxt_len, msgid, msgid_len);
-
- translation = g_dgettext (domain, msg_ctxt_id);
-
- if (translation == msg_ctxt_id)
- {
- /* try the old way of doing message contexts, too */
- msg_ctxt_id[msgctxt_len - 1] = '|';
- translation = g_dgettext (domain, msg_ctxt_id);
-
- if (translation == msg_ctxt_id)
- return msgid;
- }
-
- return translation;
-}
-
gchar *
_gtk_builder_parser_translate (const gchar *domain,
const gchar *context,
const char *s;
if (context)
- s = _dpgettext (domain, context, text);
+ s = g_dpgettext2 (domain, context, text);
else
s = g_dgettext (domain, text);
req_info->major, req_info->minor,
GTK_MAJOR_VERSION, GTK_MINOR_VERSION);
}
- _free_requires_info (req_info, NULL);
+ free_requires_info (req_info, NULL);
}
else if (strcmp (element_name, "interface") == 0)
{
/* If outside a requested object, simply ignore this tag */
return;
}
+ else if (strcmp (element_name, "menu") == 0)
+ {
+ _gtk_builder_menu_end (data);
+ }
else if (strcmp (element_name, "object") == 0)
{
ObjectInfo *object_info = state_pop_info (data, ObjectInfo);
static void
free_info (CommonInfo *info)
{
- if (strcmp (info->tag.name, "object") == 0)
+ if (strcmp (info->tag.name, "object") == 0)
free_object_info ((ObjectInfo *)info);
- else if (strcmp (info->tag.name, "child") == 0)
+ else if (strcmp (info->tag.name, "child") == 0)
free_child_info ((ChildInfo *)info);
- else if (strcmp (info->tag.name, "property") == 0)
+ else if (strcmp (info->tag.name, "property") == 0)
free_property_info ((PropertyInfo *)info);
- else if (strcmp (info->tag.name, "signal") == 0)
+ else if (strcmp (info->tag.name, "signal") == 0)
_free_signal_info ((SignalInfo *)info, NULL);
- else if (strcmp (info->tag.name, "requires") == 0)
- _free_requires_info ((RequiresInfo *)info, NULL);
- else
+ else if (strcmp (info->tag.name, "requires") == 0)
+ free_requires_info ((RequiresInfo *)info, NULL);
+ else if (strcmp (info->tag.name, "menu") == 0)
+ free_menu_info ((MenuInfo *)info);
+ else
g_assert_not_reached ();
}
end_element,
text,
NULL,
- NULL
};
void
data->builder = builder;
data->filename = filename;
data->domain = g_strdup (domain);
- data->object_ids = g_hash_table_new (g_str_hash, g_str_equal);
+ data->object_ids = g_hash_table_new_full (g_str_hash, g_str_equal,
+ (GDestroyNotify)g_free, NULL);
data->requested_objects = NULL;
if (requested_objs)