Tab grouping extension.



Well, after missing the tab grouping for a few releases, I finally got
off my butt and rewrote it, first as a patch for 1.3.3/1.3.5 and then,
this afternoon, as a proper extension.

It works much as Epiphany itself did, as at around 1.3.0, with the
exception that default new tabs (created by Ctrl-T, for example) are
treated the same way as middle-clicked links in terms of tab
positioning, primarily because I couldn't see any simple way of letting
the extension know that this tab needed to be at the end of the list. It
works, anyhow.

Thanks to Marco and Christian for the various extensions I pored over to
understand the extension system (namely, the sample and the tabs menu
extensions) - it was actually easier than I thought it would be, once I
figured out GTK+ (it's my first C GTK+ work).

Minor caveat: a one-line patch against Epiphany itself needs to be made,
for consistent tab handling. In src/ephy-notebook.c, in the
ephy_notebook_add_tab routine, epiphany calls the tab_added signal
handler then (if jump_to is set) jumps to the saved position of the
newly created tab, not taking into account the possibility that the
signal handler may (and in this case, does) reorder the tab, thus
invalidating the position variable. The patch simply recomputes position
after the signal is emitted, in the event that it's been reordered out
from under us.

Included are the patch against epiphany CVS, a patch against epiphany-
extensions to add the extensions/tab-groups directory for consideration,
and the source files themselves (which should be placed into epiphany-
extensions/extensions/tab-groups).

Enjoy!

-- 
Justin Wake

Index: src/ephy-notebook.c
===================================================================
RCS file: /cvs/gnome/epiphany/src/ephy-notebook.c,v
retrieving revision 1.37
diff -u -r1.37 ephy-notebook.c
--- src/ephy-notebook.c	19 Jun 2004 23:32:07 -0000	1.37
+++ src/ephy-notebook.c	25 Aug 2004 14:06:23 -0000
@@ -1004,6 +1004,9 @@
 
 	if (jump_to)
 	{
+		/* The signal handler may have reordered the tabs */
+		position = gtk_notebook_page_num (GTK_NOTEBOOK (nb), GTK_WIDGET(tab));
+
 		gtk_notebook_set_current_page (GTK_NOTEBOOK (nb),
 					       position);
 		g_object_set_data (G_OBJECT (tab), "jump_to",
Index: configure.ac
===================================================================
RCS file: /cvs/gnome/epiphany-extensions/configure.ac,v
retrieving revision 1.68
diff -u -r1.68 configure.ac
--- configure.ac	16 Aug 2004 10:59:18 -0000	1.68
+++ configure.ac	25 Aug 2004 14:09:55 -0000
@@ -135,8 +135,8 @@
 
 AC_MSG_CHECKING([extensions to build])
 
-all_extensions="certificates,dashboard,error-viewer,gestures,sample,sample-mozilla,tabsmenu"
-all_useful_extensions="certificates,dashboard,error-viewer,gestures,tabsmenu"
+all_extensions="certificates,dashboard,error-viewer,gestures,sample,sample-mozilla,tabsmenu,tab-groups"
+all_useful_extensions="certificates,dashboard,error-viewer,gestures,tabsmenu,tab-groups"
 default_extensions="certificates,error-viewer,gestures,tabsmenu"
 mozilla_dependent_extensions="certificates,error-viewer,sample-mozilla"
 
@@ -147,7 +147,7 @@
 AC_ARG_WITH([extensions],
 [  --with-extensions=extension1,extension2,...
 			  build the specified extensions. Available:
-			  gestures, sample, tabsmenu, all])
+			  gestures, sample, tabsmenu, tab-groups, all])
 
 dnl If no extensions specified, build the default set
 if test "x$with_extensions" = xyes; then
@@ -187,6 +187,7 @@
 AM_CONDITIONAL(ENABLE_SAMPLE_EXTENSION, echo "$extensions" | egrep '(^|,)sample($|,)' > /dev/null)
 AM_CONDITIONAL(ENABLE_SAMPLE_MOZILLA_EXTENSION, echo "$extensions" | egrep '(^|,)sample-mozilla($|,)' > /dev/null)
 AM_CONDITIONAL(ENABLE_TABSMENU_EXTENSION, echo "$extensions" | egrep '(^|,)tabsmenu($|,)' > /dev/null)
+AM_CONDITIONAL(ENABLE_TAB_GROUPS_EXTENSION, echo "$extensions" | egrep '(^|,)tab-groups($|,)' > /dev/null)
 dnl AM_CONDITIONAL(ENABLE_TOOLBAR_EXTRAS_EXTENSION, echo "$extensions" | egrep '(^|,)toolbar-extras($|,)' > /dev/null)
 
 dnl *******************************************
@@ -380,6 +381,7 @@
 extensions/sample-mozilla/Makefile
 extensions/sample-mozilla/mozilla/Makefile
 extensions/tabsmenu/Makefile
+extensions/tab-groups/Makefile
 po/Makefile.in
 ])
 
Index: extensions/Makefile.am
===================================================================
RCS file: /cvs/gnome/epiphany-extensions/extensions/Makefile.am,v
retrieving revision 1.13
diff -u -r1.13 Makefile.am
--- extensions/Makefile.am	6 Jul 2004 15:06:51 -0000	1.13
+++ extensions/Makefile.am	25 Aug 2004 14:10:13 -0000
@@ -28,10 +28,14 @@
 SUBDIRS += tabsmenu
 endif
 
+if ENABLE_TAB_GROUPS_EXTENSION
+SUBDIRS += tab-groups
+endif
+
 #if ENABLE_TOOLBAR_EXTRAS_EXTENSION
 #SUBDIRS += toolbar-extras
 #endif
 
-DIST_SUBDIRS = certificates dashboard error-viewer gestures sample sample-mozilla tabsmenu
+DIST_SUBDIRS = certificates dashboard error-viewer gestures sample sample-mozilla tabsmenu tab-groups
 
 EXTRA_DIST =
extensiondir = $(libdir)/epiphany/extensions

INCLUDES = \
	-I$(top_srcdir)/include 			\
	$(EPIPHANY_DEPENDENCY_CFLAGS)			\
	-DSHARE_DIR=\"$(pkgdatadir)\"			\
	-DEPHY_PLUGINS_LOCALEDIR=\"$(datadir)/locale\"	\
	-DG_DISABLE_DEPRECATED				\
	-DGDK_DISABLE_DEPRECATED			\
	-DGTK_DISABLE_DEPRECATED			\
	-DGDK_PIXBUF_DISABLE_DEPRECATED			\
	-DGNOME_DISABLE_DEPRECATED

extension_LTLIBRARIES = libtabgroupsextension.la

libtabgroupsextension_la_SOURCES = \
	ephy-tab-groups-extension.c	\
	ephy-tab-groups-extension.h	\
	ephy-tab-grouper.c		\
	ephy-tab-grouper.h		\
	tab-groups.c
/*
 *  Copyright (C) 2003 Marco Pesenti Gritti
 *  Copyright (C) 2003, 2004 Christian Persch
 *  Copyright (C) 2004 Justin Wake
 *
 *  This program is free software; you can redistribute it and/or modify
 *  it under the terms of the GNU General Public License as published by
 *  the Free Software Foundation; either version 2, or (at your option)
 *  any later version.
 *
 *  This program 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 General Public License for more details.
 *
 *  You should have received a copy of the GNU General Public License
 *  along with this program; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
 *
 */

#ifdef HAVE_CONFIG_H
#include "config.h"
#endif

#include "ephy-tab-grouper.h"
#include "ephy-debug.h"

#include <epiphany/ephy-session.h>
#include <epiphany/ephy-shell.h>

#include <gmodule.h>

#define EPHY_TAB_GROUPER_GET_PRIVATE(object)	(G_TYPE_INSTANCE_GET_PRIVATE ((object), EPHY_TYPE_TAB_GROUPER, EphyTabGrouperPrivate))

struct _EphyTabGrouperPrivate
{
	EphyWindow *window;
	GList	*opened_tabs;
};

static void ephy_tab_grouper_class_init (EphyTabGrouperClass *klass);
static void ephy_tab_grouper_init   (EphyTabGrouper *grouper);

enum
{
	PROP_0,
	PROP_WINDOW
};

GObjectClass *tab_grouper_parent_class = NULL;

GType tab_grouper_type = 0;

GType
ephy_tab_grouper_get_type (void)
{
	return tab_grouper_type;
}

GType
ephy_tab_grouper_register_type (GTypeModule *module)
{
	static const GTypeInfo our_info =
	{
		sizeof (EphyTabGrouperClass),
		NULL, /* base_init */
		NULL, /* base_finalize */
		(GClassInitFunc) ephy_tab_grouper_class_init,
		NULL,
		NULL, /* class_data */
		sizeof (EphyTabGrouper),
		0, /* n_preallocs */
		(GInstanceInitFunc) ephy_tab_grouper_init
	};

	tab_grouper_type =
		g_type_module_register_type (module,
						G_TYPE_OBJECT,
						"EphyTabGrouper",
						&our_info, 0);
	
	return tab_grouper_type;
}

static void
tab_added_cb (GtkWidget *notebook,
		EphyTab *tab,
		EphyTabGrouper *grouper)
{
	GtkWidget *cur_tab;
	guint cur_page_num;
	guint position = -1;
	
	g_return_if_fail (EPHY_IS_TAB (tab));

	if (grouper->priv->opened_tabs != NULL)
	{
		GList *last = g_list_last (grouper->priv->opened_tabs);
		GtkWidget *last_tab = last->data;
		position = gtk_notebook_page_num
				(GTK_NOTEBOOK (notebook), last_tab) + 1;
	}
	else
	{
		position = gtk_notebook_get_current_page
				(GTK_NOTEBOOK (notebook)) + 1;
	}
	
	gtk_notebook_reorder_child
		(GTK_NOTEBOOK (notebook), GTK_WIDGET (tab), position);

	grouper->priv->opened_tabs =
		g_list_append (grouper->priv->opened_tabs, tab);
}

/** 
 * Doing just about anything related to tabs will clear
 * the recently opened tabs list.
 */
static void
reset_tabs_cb (GtkWidget *dummy,
		EphyTab *tab,
		EphyTabGrouper *grouper)
{
	if (grouper->priv->opened_tabs != NULL)
	{
		g_list_free (grouper->priv->opened_tabs);
		grouper->priv->opened_tabs = NULL;
	}
}

static void
switch_page_cb (GtkNotebook *nb,
		GtkNotebookPage *page,
		guint new_page,
		EphyTabGrouper *grouper)
{
	if (grouper->priv->opened_tabs != NULL)
	{
		g_list_free (grouper->priv->opened_tabs);
		grouper->priv->opened_tabs = NULL;
	}
}

static void
tab_deleted_cb (EphyTab *tab,
		gboolean *inhibited,
		EphyTabGrouper *grouper)
{
	if (grouper->priv->opened_tabs != NULL)
	{
		g_list_free (grouper->priv->opened_tabs);
		grouper->priv->opened_tabs = NULL;
	}
}

static void
tabs_reordered_cb (GtkWidget *notebook,
		EphyTabGrouper *grouper)
{
	if (grouper->priv->opened_tabs != NULL)
	{
		g_list_free (grouper->priv->opened_tabs);
		grouper->priv->opened_tabs = NULL;
	}
}

static void
ephy_tab_grouper_set_window (EphyTabGrouper *grouper,
				EphyWindow *window)
{
	GtkWidget *nb;
	
	g_return_if_fail (EPHY_IS_WINDOW (window));

	grouper->priv->window = window;

	nb = ephy_window_get_notebook (window);

	/* Hook up the signals */
	g_signal_connect (nb, "tab_added", G_CALLBACK (tab_added_cb), grouper);
	g_signal_connect (nb, "tab_removed", G_CALLBACK (reset_tabs_cb), grouper);
	g_signal_connect (nb, "tab_detached", G_CALLBACK (reset_tabs_cb), grouper);
	g_signal_connect (nb, "switch_page", G_CALLBACK (switch_page_cb), grouper);
	g_signal_connect (nb, "tabs_reordered", G_CALLBACK (tabs_reordered_cb), grouper);	
	g_signal_connect (nb, "tab_delete", G_CALLBACK (tab_deleted_cb), grouper);
}

static void
ephy_tab_grouper_set_property (GObject *object,
			guint prop_id,
			const GValue *value,
			GParamSpec *pspec)
{
	EphyTabGrouper *grouper = EPHY_TAB_GROUPER (object);

	switch (prop_id)
	{
		case PROP_WINDOW:
			ephy_tab_grouper_set_window (grouper, g_value_get_object (value));
			break;
	}
}

static void
ephy_tab_grouper_get_property (GObject *object,
			guint prop_id,
			GValue *value,
			GParamSpec *pspec)
{
	EphyTabGrouper *grouper = EPHY_TAB_GROUPER (object);

	switch (prop_id)
	{
		case PROP_WINDOW:
			g_value_set_object (value, grouper->priv->window);
			break;
	}
}

static void
ephy_tab_grouper_finalize (GObject *object)
{
	EphyTabGrouper *grouper = EPHY_TAB_GROUPER (object);

	if (grouper->priv->opened_tabs != NULL)
	{
		g_list_free (grouper->priv->opened_tabs);
	}

	G_OBJECT_CLASS (tab_grouper_parent_class)->finalize (object);
}

static void
ephy_tab_grouper_init (EphyTabGrouper *grouper)
{
	grouper->priv = EPHY_TAB_GROUPER_GET_PRIVATE (grouper);

	grouper->priv->window = NULL;
	grouper->priv->opened_tabs = NULL;
}

static void
ephy_tab_grouper_class_init (EphyTabGrouperClass *klass)
{
	GObjectClass *object_class = G_OBJECT_CLASS (klass);

	tab_grouper_parent_class = g_type_class_peek_parent (klass);

	object_class->finalize = ephy_tab_grouper_finalize;
	object_class->set_property = ephy_tab_grouper_set_property;
	object_class->get_property = ephy_tab_grouper_get_property;

	g_object_class_install_property (object_class,
					PROP_WINDOW,
					g_param_spec_object ("window",
								"Window",
								"Parent window",
								EPHY_TYPE_WINDOW,
								G_PARAM_READWRITE |
								G_PARAM_CONSTRUCT_ONLY));
	
	g_type_class_add_private (object_class, sizeof (EphyTabGrouperPrivate));
}

EphyTabGrouper *
ephy_tab_grouper_new (EphyWindow *window)
{
	return g_object_new (EPHY_TYPE_TAB_GROUPER,
				"window", window,
				NULL);
}



/*
 *  Copyright (C) 2003 Marco Pesenti Gritti
 *  Copyright (C) 2003, 2004 Christian Persch
 *  Copyright (C) 2004 Justin Wake
 *
 *  This program is free software; you can redistribute it and/or modify
 *  it under the terms of the GNU General Public License as published by
 *  the Free Software Foundation; either version 2, or (at your option)
 *  any later version.
 *
 *  This program 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 General Public License for more details.
 *
 *  You should have received a copy of the GNU General Public License
 *  along with this program; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
 *
 */

#ifndef EPHY_TAB_GROUPER_H
#define EPHY_TAB_GROUPER_H

#include <glib-object.h>
#include <epiphany/ephy-window.h>
#include <gmodule.h>

G_BEGIN_DECLS

#define EPHY_TYPE_TAB_GROUPER		(ephy_tab_grouper_get_type())
#define EPHY_TAB_GROUPER(object)	(G_TYPE_CHECK_INSTANCE_CAST((object), EPHY_TYPE_TAB_GROUPER, EphyTabGrouper))
#define EPHY_TAB_GROUPER_CLASS(klass)	(G_TYPE_CHECK_CLASS_CAST((klass), EPHY_TYPE_TAB_GROUPER, EphyTabGrouperClass))
#define EPHY_IS_TAB_GROUPER(object)		(G_TYPE_CHECK_INSTANCE_TYPE((object), EPHY_TYPE_TAB_GROUPER))
#define EPHY_IS_TAB_GROUPER_CLASS(klass)	(G_TYPE_CHECK_CLASS_TYPE((klass), EPHY_TYPE_TAB_GROUPER))
#define EPHY_TAB_GROUPER_GET_CLASS(obj)	(G_TYPE_INSTANCE_GET_CLASS((obj), EPHY_TYPE_TAB_GROUPER, EphyTabGrouperClass))

typedef struct _EphyTabGrouper				EphyTabGrouper;
typedef struct _EphyTabGrouperClass		EphyTabGrouperClass;
typedef struct _EphyTabGrouperPrivate	EphyTabGrouperPrivate;

struct _EphyTabGrouperClass
{
	GObjectClass	parent_class;
};

struct _EphyTabGrouper
{
	GObject	parent_object;

	/* Private */
	EphyTabGrouperPrivate *priv;
};

GType ephy_tab_grouper_get_type (void);

GType ephy_tab_grouper_register_type (GTypeModule *module);

EphyTabGrouper *ephy_tab_grouper_new	(EphyWindow *window);

G_END_DECLS

#endif

/*
 *  Copyright (C) 2003 Marco Pesenti Gritti
 *  Copyright (C) 2003, 2004 Christian Persch
 *  Copyright (C) 2004 Justin Wake
 *
 *  This program is free software; you can redistribute it and/or modify
 *  it under the terms of the GNU General Public License as published by
 *  the Free Software Foundation; either version 2, or (at your option)
 *  any later version.
 *
 *  This program 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 General Public License for more details.
 *
 *  You should have received a copy of the GNU General Public License
 *  along with this program; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
 *
 */

#ifdef HAVE_CONFIG_H
#include "config.h"
#endif

#include "ephy-tab-groups-extension.h"
#include "ephy-tab-grouper.h"
#include "ephy-debug.h"

#include <epiphany/ephy-extension.h>

static void ephy_tab_groups_extension_class_init (EphyTabGroupsExtensionClass *class);
static void ephy_tab_groups_extension_iface_init (EphyExtensionIface *iface);
static void ephy_tab_groups_extension_init (EphyTabGroupsExtension *ext);

GObjectClass *tab_groups_extension_parent_class = NULL;

GType tab_groups_extension_type = 0;

GType
ephy_tab_groups_extension_get_type (void)
{
	return tab_groups_extension_type;
}

GType
ephy_tab_groups_extension_register_type (GTypeModule *module)
{
	static const GTypeInfo our_info =
	{
		sizeof (EphyTabGroupsExtensionClass),
		NULL,	/* base_init */
		NULL, /* base_finalize */
		(GClassInitFunc) ephy_tab_groups_extension_init,
		NULL,
		NULL, /* class_data */
		sizeof (EphyTab),
		0,	/* n_preallocs */
		(GInstanceInitFunc) ephy_tab_groups_extension_init
	};

	static const GInterfaceInfo extension_info =
	{
		(GInterfaceInitFunc) ephy_tab_groups_extension_iface_init,
		NULL,
		NULL
	};

	tab_groups_extension_type =
		g_type_module_register_type (module,
							G_TYPE_OBJECT,
							"EphyTabGroupsExtension",
							&our_info, 0);
	
	g_type_module_add_interface (module,
					tab_groups_extension_type,
					EPHY_TYPE_EXTENSION,
					&extension_info);
	
	return tab_groups_extension_type;
}

static void
impl_attach_window (EphyExtension *extension,
			EphyWindow *window)
{
	EphyTabGrouper *grouper;

	grouper = ephy_tab_grouper_new (window);
	g_object_set_data_full (G_OBJECT (window), "ephy-tab-grouper", grouper,
				(GDestroyNotify) g_object_unref);
}

static void
impl_detach_window (EphyExtension *ext,
			EphyWindow *window)
{
	/* Nothing to do */
}

static void
ephy_tab_groups_extension_init (EphyTabGroupsExtension *extension)
{
	LOG ("EphyTabGroupsExtension initialising")
}

static void
ephy_tab_groups_extension_finalize (GObject *object)
{
	EphyTabGroupsExtension *extension = EPHY_TAB_GROUPS_EXTENSION (object);

	LOG ("EphyTabGroupsExtension finalising")

	G_OBJECT_CLASS (tab_groups_extension_parent_class)->finalize (object);
}

static void
ephy_tab_groups_extension_iface_init (EphyExtensionIface *iface)
{
	iface->attach_window = impl_attach_window;
	iface->detach_window = impl_detach_window;
}

static void
ephy_tab_groups_extension_class_init (EphyTabGroupsExtensionClass *class)
{
	GObjectClass *object_class = G_OBJECT_CLASS (class);

	tab_groups_extension_parent_class = (GObjectClass *) g_type_class_peek_parent (class);

	object_class->finalize = ephy_tab_groups_extension_finalize;
}


/*
 *  Copyright (C) 2003 Marco Pesenti Gritti
 *  Copyright (C) 2003, 2004 Christian Persch
 *  Copyright (C) 2004 Justin Wake
 *
 *  This program is free software; you can redistribute it and/or modify
 *  it under the terms of the GNU General Public License as published by
 *  the Free Software Foundation; either version 2, or (at your option)
 *  any later version.
 *
 *  This program 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 General Public License for more details.
 *
 *  You should have received a copy of the GNU General Public License
 *  along with this program; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
 *
 */

#ifndef EPHY_TAB_GROUPS_EXTENSION_H
#define EPHY_TAB_GROUPS_EXTENSION_H

#include <glib-object.h>
#include <gmodule.h>

G_BEGIN_DECLS

#define EPHY_TYPE_TAB_GROUPS_EXTENSION		(ephy_tab_groups_extension_get_type())
#define EPHY_TAB_GROUPS_EXTENSION(object)	(G_TYPE_CHECK_INSTANCE_CAST((object), EPHY_TYPE_TAB_GROUPS_EXTENSION, EphyTabGroupsExtension))
#define EPHY_TAB_GROUPS_EXTENSION_CLASS(klass)	(G_TYPE_CHECK_CLASS_CAST((klass), EPHY_TYPE_TAB_GROUPS_EXTENSION, EphyTabGroupsExtensionClass))
#define EPHY_IS_TAB_GROUPS_EXTENSION(object)		(G_TYPE_CHECK_INSTANCE_TYPE((object), EPHY_TYPE_TAB_GROUPS_EXTENSION))
#define EPHY_IS_TAB_GROUPS_EXTENSION_CLASS(klass)	(G_TYPE_CHECK_CLASS_TYPE((klass), EPHY_TYPE_TAB_GROUPS_EXTENSION))
#define EPHY_TAB_GROUPS_EXTENSION_GET_CLASS(obj)	(G_TYPE_INSTANCE_GET_CLASS((obj), EPHY_TYPE_TAB_GROUPS_EXTENSION, EphyTabGroupsExtensionClass))

typedef struct _EphyTabGroupsExtension				EphyTabGroupsExtension;
typedef struct _EphyTabGroupsExtensionClass		EphyTabGroupsExtensionClass;
typedef struct _EphyTabGroupsExtensionPrivate	EphyTabGroupsExtensionPrivate;

struct _EphyTabGroupsExtensionClass
{
	GObjectClass	parent_class;
};

struct _EphyTabGroupsExtension
{
	GObject	parent_object;
};

GType ephy_tab_groups_extension_get_type (void);

GType ephy_tab_groups_extension_register_type (GTypeModule *module);

G_END_DECLS

#endif

/*
 *  Copyright (C) 2003 Marco Pesenti Gritti
 *  Copyright (C) 2003, 2004 Christian Persch
 *  Copyright (C) 2004 Justin Wake
 *
 *  This program is free software; you can redistribute it and/or modify
 *  it under the terms of the GNU General Public License as published by
 *  the Free Software Foundation; either version 2, or (at your option)
 *  any later version.
 *
 *  This program 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 General Public License for more details.
 *
 *  You should have received a copy of the GNU General Public License
 *  along with this program; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
 *
 */

#ifdef HAVE_CONFIG_H
#include "config.h"
#endif

#include "ephy-tab-groups-extension.h"
#include "ephy-tab-grouper.h"

#include <gmodule.h>
#include <glib/gi18n-lib.h>

G_MODULE_EXPORT GType
register_module (GTypeModule *module)
{
	GType extension_type;
	
	ephy_tab_grouper_register_type (module);

	extension_type = ephy_tab_groups_extension_register_type (module);

#ifdef ENABLE_NLS
	/* Initialise i18n */
	bindtextdomain (GETTEXT_PACKAGE, EPHY_PLUGINS_LOCALEDIR);
	bind_textdomain_codeset (GETTEXT_PACKAGE, "UTF-8");
#endif

	return extension_type;
}



[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]