Filter:   InfoImg
download bonobo-ui-init-gtk.c
Language: C
LOC: 145
Project Info
libbonoboui
Server: Gnome
Type: cvs
...onoboui\libbonoboui\bonobo\
   .cvsignore
   bonobo-a11y.c
   bonobo-a11y.h
   bonobo-canvas-component.c
   bonobo-canvas-component.h
   bonobo-canvas-item.c
   bonobo-canvas-item.h
   bonobo-control-frame.c
   bonobo-control-frame.h
   bonobo-control-internal.h
   bonobo-control.c
   bonobo-control.h
   bonobo-dock-band.c
   bonobo-dock-band.h
   bonobo-dock-item-grip.c
   bonobo-dock-item-grip.h
   bonobo-dock-item.c
   bonobo-dock-item.h
   bonobo-dock-layout.c
   bonobo-dock-layout.h
   bonobo-dock.c
   bonobo-dock.h
   ...bo-embeddable-factory.h
   ...bo-file-selector-util.c
   ...bo-file-selector-util.h
   ...bo-insert-component.xpm
   bonobo-plug.c
   bonobo-plug.h
   bonobo-property-control.c
   bonobo-property-control.h
   bonobo-selector-widget.c
   bonobo-selector-widget.h
   bonobo-selector.c
   bonobo-selector.h
   bonobo-socket.c
   bonobo-socket.h
   bonobo-ui-component.c
   bonobo-ui-component.h
   bonobo-ui-config-widget.c
   bonobo-ui-config-widget.h
   bonobo-ui-container.c
   bonobo-ui-container.h
   bonobo-ui-engine-config.c
   bonobo-ui-engine-config.h
   bonobo-ui-engine-private.h
   bonobo-ui-engine.c
   bonobo-ui-engine.h
   bonobo-ui-init-gtk.c
   ...o-ui-internal-toolbar.c
   bonobo-ui-main.c
   bonobo-ui-main.h
   bonobo-ui-marshal-main.c
   bonobo-ui-marshal.list
   bonobo-ui-node-private.h
   bonobo-ui-node.c
   bonobo-ui-node.h
   bonobo-ui-preferences.c
   bonobo-ui-preferences.h
   bonobo-ui-private.h
   bonobo-ui-sync-keys.c
   bonobo-ui-sync-keys.h
   bonobo-ui-sync-menu.c
   bonobo-ui-sync-menu.h
   bonobo-ui-sync-status.c
   bonobo-ui-sync-status.h
   bonobo-ui-sync-toolbar.c
   bonobo-ui-sync-toolbar.h
   bonobo-ui-sync.c
   bonobo-ui-sync.h
   ...i-toolbar-button-item.c
   ...i-toolbar-button-item.h
   ...-toolbar-control-item.c
   ...-toolbar-control-item.h
   bonobo-ui-toolbar-item.c
   bonobo-ui-toolbar-item.h
   ...ui-toolbar-popup-item.c
   ...ui-toolbar-popup-item.h
   ...ar-toggle-button-item.c
   ...ar-toggle-button-item.h
   bonobo-ui-toolbar.c
   bonobo-ui-toolbar.h
   bonobo-ui-util.c
   bonobo-ui-util.h
   bonobo-ui-win32.c
   bonobo-ui-xml.c
   bonobo-ui-xml.h
   bonobo-widget.c
   bonobo-widget.h
   bonobo-window.c
   bonobo-window.h
   bonobo-wrapper.h
   bonobo-zoomable-frame.c
   bonobo-zoomable-frame.h
   bonobo-zoomable.c
   bonobo-zoomable.h
   ...i-2.0-uninstalled.pc.in
   libbonoboui-2.0.pc.in
   Makefile.am

#include <config.h>
#include <gtk/gtk.h>
#include <bonobo/bonobo-i18n.h>
#include <bonobo/bonobo-ui-main.h>
#include <libgnome/gnome-init.h>

typedef struct {
	GPtrArray *gtk_args;
} bonobo_ui_gtk_init_info_t;

static void
bonobo_ui_gtk_pre_args_parse (GnomeProgram    *program,
			      GnomeModuleInfo *mod_info)
{
	GOptionContext *context;
	bonobo_ui_gtk_init_info_t *init_info;

	/* Only do this for popt option parsing */
	g_object_get (G_OBJECT (program), GNOME_PARAM_GOPTION_CONTEXT,
		      &context, NULL);
	if (context) return;
	
	init_info = g_new0 (bonobo_ui_gtk_init_info_t, 1);
	init_info->gtk_args = g_ptr_array_new ();

	g_object_set_data (G_OBJECT (program),
			   "Libbonoboui-Gtk-Module-init-info",
			   init_info);
}

static void
bonobo_ui_gtk_post_args_parse (GnomeProgram    *program,
			       GnomeModuleInfo *mod_info)
{
	GOptionContext *context;
	bonobo_ui_gtk_init_info_t *init_info;
	int final_argc;
	char **final_argv;
	int i;

	/* Only do this for popt option parsing */
	g_object_get (G_OBJECT (program), GNOME_PARAM_GOPTION_CONTEXT,
		      &context, NULL);
	if (context) return;

	init_info = g_object_get_data (G_OBJECT (program),
				       "Libbonoboui-Gtk-Module-init-info");

	g_ptr_array_add (init_info->gtk_args, NULL);

	final_argc = init_info->gtk_args->len - 1;
	final_argv = g_memdup (init_info->gtk_args->pdata,
			       sizeof (char *) * init_info->gtk_args->len);

	gtk_init (&final_argc, &final_argv);

	g_free (final_argv);

	for (i = 0; g_ptr_array_index (init_info->gtk_args, i) != NULL; i++) {
		g_free (g_ptr_array_index (init_info->gtk_args, i));
		g_ptr_array_index (init_info->gtk_args, i) = NULL;
	}

	g_ptr_array_free (init_info->gtk_args, TRUE);
	init_info->gtk_args = NULL;
	g_free (init_info);

	g_object_set_data (G_OBJECT (program),
			   "Libbonoboui-Gtk-Module-init-info",
			   NULL);
}

static void
add_gtk_arg_callback (poptContext con, enum poptCallbackReason reason,
		      const struct poptOption * opt,
		      const char * arg, void * data)
{
	GnomeProgram *program;
	bonobo_ui_gtk_init_info_t *init_info;
	char *newstr;

	program = g_dataset_get_data (con, "GnomeProgram");
	g_assert (program != NULL);

	init_info = g_object_get_data (G_OBJECT (program),
				       "Libbonoboui-Gtk-Module-init-info");
	g_assert (init_info != NULL);


	switch (reason) {
	case POPT_CALLBACK_REASON_PRE:
		/* Note that the value of argv[0] passed to main() may be
		 * different from the value that this passes to gtk
		 */
		g_ptr_array_add (init_info->gtk_args,
				 (char *) g_strdup (poptGetInvocationName (con)));
		break;
		
	case POPT_CALLBACK_REASON_OPTION:
		switch (opt->argInfo) {
		case POPT_ARG_STRING:
		case POPT_ARG_INT:
		case POPT_ARG_LONG:
			newstr = g_strconcat ("--", opt->longName, "=", arg, NULL);
			break;
		default:
			newstr = g_strconcat ("--", opt->longName, NULL);
			break;
		}

		g_ptr_array_add (init_info->gtk_args, newstr);
		/* XXX bonobo-client tie-in */
		break;
	default:
		break;
	}
}

static struct poptOption bonobo_ui_gtk_options [] = {
	{ NULL, '\0', POPT_ARG_CALLBACK|POPT_CBFLAG_PRE,
	  &add_gtk_arg_callback, 0, NULL, NULL },

	{ NULL, '\0', POPT_ARG_INTL_DOMAIN, GETTEXT_PACKAGE, 0, NULL, NULL },

	{ "gdk-debug", '\0', POPT_ARG_STRING, NULL, 0,
	  N_("Gdk debugging flags to set"), N_("FLAGS")},

	{ "gdk-no-debug", '\0', POPT_ARG_STRING, NULL, 0,
	  N_("Gdk debugging flags to unset"), N_("FLAGS")},

	/* X11 only */
	{ "display", '\0', POPT_ARG_STRING, NULL, 0,
	  N_("X display to use"), N_("DISPLAY")},

	/* X11 & multi-head only */
	{ "screen", '\0', POPT_ARG_INT, NULL, 0,
	  N_("X screen to use"), N_("SCREEN")},

	/* X11 only */
	{ "sync", '\0', POPT_ARG_NONE, NULL, 0,
	  N_("Make X calls synchronous"), NULL},

	/* FIXME: this doesn't seem to exist */
#if 0
	/* X11 only */
	{ "no-xshm", '\0', POPT_ARG_NONE, NULL, 0,
	  N_("Don't use X shared memory extension"), NULL},
#endif

	{ "name", '\0', POPT_ARG_STRING, NULL, 0,
	  N_("Program name as used by the window manager"), N_("NAME")},

	{ "class", '\0', POPT_ARG_STRING, NULL, 0,
	  N_("Program class as used by the window manager"), N_("CLASS")},

	{ "gtk-debug", '\0', POPT_ARG_STRING, NULL, 0,
	  N_("Gtk+ debugging flags to set"), N_("FLAGS")},

	{ "gtk-no-debug", '\0', POPT_ARG_STRING, NULL, 0,
	  N_("Gtk+ debugging flags to unset"), N_("FLAGS")},

	{ "g-fatal-warnings", '\0', POPT_ARG_NONE, NULL, 0,
	  N_("Make all warnings fatal"), NULL},

	{ "gtk-module", '\0', POPT_ARG_STRING, NULL, 0,
	  N_("Load an additional Gtk module"), N_("MODULE")},

	{ NULL, '\0', 0, NULL, 0}
};

static GOptionGroup *
bonobo_ui_gtk_module_get_goption_group (void)
{
	/* FIXME: TRUE or FALSE (open default display)? */
	return gtk_get_option_group (TRUE);
}

const GnomeModuleInfo *
bonobo_ui_gtk_module_info_get (void)
{
	static GnomeModuleInfo module_info = {
		"gtk", NULL, N_("GTK+"),
		NULL, NULL,
		bonobo_ui_gtk_pre_args_parse, bonobo_ui_gtk_post_args_parse, bonobo_ui_gtk_options,
		NULL,
		NULL, NULL, NULL
	};
	
	module_info.get_goption_group_func = bonobo_ui_gtk_module_get_goption_group;

	if (module_info.version == NULL) {
		module_info.version = g_strdup_printf ("%d.%d.%d",
						       GTK_MAJOR_VERSION,
						       GTK_MINOR_VERSION,
						       GTK_MICRO_VERSION);
	}

	return &module_info;
}