shell output plugin
- From: Roberto Majadas <phoenix nova es>
- To: gnome-devtools gnome org
- Subject: shell output plugin
- Date: 20 Jul 2001 06:38:07 +0200
Hi everyone :
With this plugin we can use command like in a shell . And pipe it with
the current documents of gide . This only run if you are using
scintillia component at the moment .
regards
telemaco
Index: ChangeLog
===================================================================
RCS file: /cvs/gnome/gIDE/ChangeLog,v
retrieving revision 1.123
diff -u -5 -r1.123 ChangeLog
--- ChangeLog 2001/07/18 21:07:15 1.123
+++ ChangeLog 2001/07/20 04:23:16
@@ -1,5 +1,12 @@
+2001-07-20 Roberto Majadas <phoenix nova es>
+
+ * configure.in: add /plugins/shell-output/Makefile
+ * /plugins/shell-output: add shell-output plugin , with this
+ plugin we can run command in gide
+ * /plugins/Makefile.am: add shell-output directory
+
2001-07-18 JP Rosevear <jpr ximian com>
* src/Makefile.am: xml-i18n-toolize the moniker oaf file
2001-07-18 JP Rosevear <jpr ximian com>
Index: configure.in
===================================================================
RCS file: /cvs/gnome/gIDE/configure.in,v
retrieving revision 1.45
diff -u -5 -r1.45 configure.in
--- configure.in 2001/07/16 04:25:36 1.45
+++ configure.in 2001/07/20 04:23:16
@@ -113,10 +113,11 @@
plugins/swapch/Makefile
plugins/text/Makefile
plugins/project-manager/Makefile
plugins/document-manager/Makefile
plugins/debugger/Makefile
+plugins/shell-output/Makefile
src/Makefile
libgide/Makefile
idl/Makefile
intl/Makefile
po/Makefile.in
Index: plugins/Makefile.am
===================================================================
RCS file: /cvs/gnome/gIDE/plugins/Makefile.am,v
retrieving revision 1.14
diff -u -5 -r1.14 Makefile.am
--- plugins/Makefile.am 2001/07/01 21:58:42 1.14
+++ plugins/Makefile.am 2001/07/20 04:23:16
@@ -5,8 +5,8 @@
else
MAIL=mail
endif
SUBDIRS = debugger document-manager project-manager sample asciitable \
- calculator docstat files functions help swapch text $(MAIL)
+ shell-output calculator docstat files functions help swapch text $(MAIL)
-EXTRA_DIST = evo-mail mail
\ No newline at end of file
+EXTRA_DIST = evo-mail mail
Index: plugins/shell-output/GNOME_Development_Plugin_shelloutput.oaf.in
===================================================================
RCS file: GNOME_Development_Plugin_shelloutput.oaf.in
diff -N GNOME_Development_Plugin_shelloutput.oaf.in
--- /dev/null Tue May 5 16:32:27 1998
+++ GNOME_Development_Plugin_shelloutput.oaf.in Fri Jul 20 00:23:17 2001
@@ -0,0 +1,12 @@
+<oaf_info>
+<oaf_server iid="OAFIID:GNOME_Development_Plugin:shelloutput"
+ type="shlib" location="libgide-shelloutput.so">
+
+ <oaf_attribute name="repo_ids" type="stringv">
+ <item value="IDL:Bonobo/PropertyBag:1.0"/>
+ </oaf_attribute>
+
+ <oaf_attribute name="name" type="string" value="gIDE shell output plugin"/>
+ <oaf_attribute name="gide:shell_component" type="boolean" value="true"/>
+</oaf_server>
+</oaf_info>
Index: plugins/shell-output/Makefile.am
===================================================================
RCS file: Makefile.am
diff -N Makefile.am
--- /dev/null Tue May 5 16:32:27 1998
+++ Makefile.am Fri Jul 20 00:23:17 2001
@@ -0,0 +1,27 @@
+INCLUDES = \
+ -I$(top_srcdir) \
+ -DGNOMELOCALEDIR=\""$(datadir)/locale"\"\
+ -DGIDE_DATADIR=\""$(datadir)"\" \
+ $(EXTRA_GNOME_CFLAGS)
+
+
+lib_LTLIBRARIES = \
+ libgide-shelloutput.la
+
+libgide_shelloutput_la_SOURCES = \
+ shell-output-tool.c
+
+libgide_shelloutput_la_LIBADD = \
+ $(EXTRA_GNOME_LIBS)
+
+oafdir = $(datadir)/oaf
+oaf_in_files=GNOME_Development_Plugin_shelloutput.oaf.in
+oaf_DATA = $(oaf_in_files:.oaf.in=.oaf)
+
+ XML_I18N_MERGE_OAF_RULE@
+
+uidir = $(datadir)/gnome/ui
+ui_DATA = gide-shelloutput-plugin.xml
+
+
+EXTRA_DIST = $(oaf_DATA) $(ui_DATA)
Index: plugins/shell-output/gide-shelloutput-plugin.xml
===================================================================
RCS file: gide-shelloutput-plugin.xml
diff -N gide-shelloutput-plugin.xml
--- /dev/null Tue May 5 16:32:27 1998
+++ gide-shelloutput-plugin.xml Fri Jul 20 00:23:17 2001
@@ -0,0 +1,12 @@
+<Root>
+ <commands>
+ <cmd name="ShellOutput" _label="Shell Output"
+ _tip="Run command into the current text"/>
+ </commands>
+
+ <menu>
+ <submenu name="Tools">
+ <menuitem name="ShellOutput" verb=""/>
+ </submenu>
+ </menu>
+</Root>
Index: plugins/shell-output/shell-output-tool.c
===================================================================
RCS file: shell-output-tool.c
diff -N shell-output-tool.c
--- /dev/null Tue May 5 16:32:27 1998
+++ shell-output-tool.c Fri Jul 20 00:23:18 2001
@@ -0,0 +1,564 @@
+/*
+ * gIDE Shell Output plugin
+ *
+ * With this plugin yo can run command like in a shell .
+ * An you can use pipes and pipe gide's documents .
+ *
+ * Roberto Majadas "telemaco" <phoenix nova es>
+ */
+
+#include <config.h>
+
+#include <liboaf/liboaf.h>
+#include <libgide/libgide.h>
+#include <unistd.h>
+#include <sys/stat.h>
+#include <sys/types.h>
+#include <sys/wait.h>
+#include <fcntl.h>
+#include <gdl/GDL.h>
+
+#define SHELL_OUTPUT_COMPONENT_IID "OAFIID:GNOME_Development_Plugin:shelloutput"
+
+#define SHELL_OUTPUT_BUFFER_SIZE 1024
+#define SHELL_OUTPUT_SH_NAME "sh"
+#define SHELL_OUTPUT_SH_PATH "/bin/sh"
+
+typedef struct _shell_output_dialog shell_output_dialog ;
+typedef struct _shell_output_info shell_output_info ;
+
+struct _shell_output_dialog {
+ GtkWidget *dialog;
+ GtkWidget *dialog_vbox;
+ GtkWidget *vbox;
+ GtkWidget *label1;
+ GtkWidget *table;
+ GtkWidget *label2;
+ GtkWidget *label3;
+ GtkWidget *optionmenu;
+ GtkWidget *optionmenu_menu;
+ GtkWidget *entry;
+ GtkWidget *fileentry1;
+ GtkWidget *combo_entry1;
+ GtkWidget *fileentry2;
+ GtkWidget *combo_entry2;
+ GtkWidget *dialog_action_area;
+ GtkWidget *ok_button;
+ GtkWidget *cancel_button;
+};
+
+struct _shell_output_info {
+ GNOME_Development_Environment_DocumentManager_DocumentList *doclist ;
+ GNOME_Development_Environment_Document doc ;
+ gchar *work_directory;
+ gchar *temp_file_name;
+};
+
+static shell_output_dialog *sod ;
+static shell_output_info *soi ;
+static GideTool* shell_output_tool ;
+
+
+/* Shell Output prototipes */
+
+static void shell_output (GtkWidget *widget, gpointer data);
+static void shell_output_create_dialog_table ();
+static void shell_output_create_dialog ();
+static void shell_output_add_dialog_options ();
+static void shell_output_activate_option (GtkWidget *widget, gpointer data);
+static void shell_output_close_dialog (GtkWidget *widget, gpointer data);
+static void shell_output_popen (GString *buffer_to_pipe, gchar *command);
+GString * shell_output_data_for_pipe () ;
+static void shell_output_command_run (GtkWidget *widget, gpointer data);
+static void shell_output_open_output_file (gchar *file);
+static void shell_output_error_box (gchar *message);
+gboolean command_out_cb (GIOChannel *chan, GIOCondition cond, gpointer data);
+
+static void
+shell_output_create_dialog_table ()
+{
+ gchar *temp_file_name = NULL ;
+
+ sod->table = gtk_table_new (3, 2, FALSE);
+ gtk_box_pack_end (GTK_BOX (sod->vbox), sod->table, FALSE, FALSE, 0);
+ gtk_table_set_col_spacings (GTK_TABLE (sod->table), 5);
+ sod->label2 = gtk_label_new (_("Work directory"));
+ gtk_table_attach (GTK_TABLE (sod->table), sod->label2, 0, 1, 1, 2,
+ (GtkAttachOptions) (GTK_FILL),
+ (GtkAttachOptions) (0), 0, 0);
+ gtk_widget_set_usize (sod->label2, 175, -2);
+ gtk_misc_set_alignment (GTK_MISC (sod->label2), 0, 0.5);
+ sod->label3 = gtk_label_new (_("Temporal output file"));
+ gtk_table_attach (GTK_TABLE (sod->table), sod->label3, 0, 1, 2, 3,
+ (GtkAttachOptions) (GTK_FILL),
+ (GtkAttachOptions) (0), 0, 0);
+ gtk_widget_set_usize (sod->label3, 175, -2);
+ gtk_misc_set_alignment (GTK_MISC (sod->label3), 0, 0.5);
+ sod->optionmenu = gtk_option_menu_new ();
+ gtk_table_attach (GTK_TABLE (sod->table), sod->optionmenu, 0, 1, 0, 1,
+ (GtkAttachOptions) (GTK_FILL),
+ (GtkAttachOptions) (0), 0, 0);
+ gtk_widget_set_usize (sod->optionmenu, 175, 25);
+ sod->optionmenu_menu = gtk_menu_new ();
+ gtk_option_menu_set_menu (GTK_OPTION_MENU (sod->optionmenu), sod->optionmenu_menu);
+ sod->entry = gtk_entry_new ();
+ gtk_table_attach (GTK_TABLE (sod->table), sod->entry, 1, 2, 0, 1,
+ (GtkAttachOptions) (GTK_EXPAND | GTK_FILL),
+ (GtkAttachOptions) (0), 0, 0);
+ sod->fileentry1 = gnome_file_entry_new (NULL, NULL);
+ gtk_table_attach (GTK_TABLE (sod->table), sod->fileentry1, 1, 2, 1, 2,
+ (GtkAttachOptions) (GTK_EXPAND | GTK_FILL),
+ (GtkAttachOptions) (0), 0, 0);
+ gnome_file_entry_set_directory (GNOME_FILE_ENTRY (sod->fileentry1), TRUE);
+ gnome_file_entry_set_default_path (GNOME_FILE_ENTRY (sod->fileentry1),
+ g_get_home_dir ());
+ sod->combo_entry1 = gnome_file_entry_gtk_entry (GNOME_FILE_ENTRY (sod->fileentry1));
+ gtk_entry_set_text (GTK_ENTRY(sod->combo_entry1),g_get_home_dir ());
+ sod->fileentry2 = gnome_file_entry_new (NULL, NULL);
+ gtk_table_attach (GTK_TABLE (sod->table), sod->fileentry2, 1, 2, 2, 3,
+ (GtkAttachOptions) (GTK_EXPAND | GTK_FILL),
+ (GtkAttachOptions) (0), 0, 0);
+ gnome_file_entry_set_default_path (GNOME_FILE_ENTRY (sod->fileentry2),
+ g_get_tmp_dir ());
+ sod->combo_entry2 = gnome_file_entry_gtk_entry (GNOME_FILE_ENTRY (sod->fileentry2));
+
+ gnome_file_entry_set_default_path (GNOME_FILE_ENTRY (sod->fileentry2),
+ g_get_tmp_dir ());
+ gtk_entry_set_text (GTK_ENTRY(sod->combo_entry2), tempnam (g_get_tmp_dir (),"gide-"));
+
+ g_free (temp_file_name);
+}
+
+static void
+shell_output_add_dialog_options ()
+{
+
+ GNOME_Development_Environment_DocumentManager docman;
+ GNOME_Development_Environment_Document var_doc ;
+ CORBA_Environment ev;
+ GtkWidget *optionmenu_menu_item ;
+ gchar *moniker;
+ gchar *cat_option;
+ gchar *filename;
+ gint i ;
+
+ soi->doc = NULL ; /* inicialization of this */
+
+ optionmenu_menu_item = gtk_menu_item_new_with_label (_("run command"));
+ gtk_menu_append (GTK_MENU (sod->optionmenu_menu), optionmenu_menu_item);
+ gtk_signal_connect (GTK_OBJECT (optionmenu_menu_item), "activate",
+ GTK_SIGNAL_FUNC (shell_output_activate_option),NULL);
+
+ CORBA_exception_init (&ev);
+ moniker = g_strdup_printf ("gide:%s!DocumentManager", shell_output_tool->shell_id);
+ docman = bonobo_get_object (moniker,
+ "IDL:GNOME/Development/Environment/DocumentManager:1.0",
+ &ev);
+ g_free (moniker);
+ if (ev._major != CORBA_NO_EXCEPTION && !CORBA_Object_is_nil (soi->doc, &ev))
+ return ;
+
+ soi->doclist = GNOME_Development_Environment_DocumentManager_getOpenFiles (docman,&ev);
+ if (ev._major != CORBA_NO_EXCEPTION)
+ return ;
+
+
+ for (i=0 ; i< soi->doclist->_length ; i++)
+ {
+ var_doc = soi->doclist->_buffer[i] ;
+
+ filename = g_strdup (GNOME_Development_Environment_Document_getFilename (var_doc,&ev));
+ if (ev._major != CORBA_NO_EXCEPTION)
+ return ;
+
+ cat_option = g_strdup_printf ("cat %s |", g_basename(filename));
+
+ optionmenu_menu_item = gtk_menu_item_new_with_label (cat_option);
+ gtk_menu_append (GTK_MENU (sod->optionmenu_menu), optionmenu_menu_item);
+ gtk_signal_connect (GTK_OBJECT (optionmenu_menu_item), "activate",
+ GTK_SIGNAL_FUNC (shell_output_activate_option),
+ soi->doclist->_buffer[i]);
+ g_free(filename);
+ g_free(cat_option);
+ }
+
+ gtk_option_menu_set_history (GTK_OPTION_MENU(sod->optionmenu), 0);
+
+ bonobo_object_release_unref(docman, &ev);
+
+ CORBA_exception_free(&ev);
+}
+
+
+static void
+shell_output_create_dialog ()
+{
+ sod->dialog = gnome_dialog_new (NULL, NULL);
+ gtk_widget_set_usize (sod->dialog, 450, 200);
+ sod->dialog_vbox = GNOME_DIALOG (sod->dialog)->vbox;
+ sod->vbox = gtk_vbox_new (FALSE, 0);
+ gtk_box_pack_start (GTK_BOX (sod->dialog_vbox), sod->vbox, TRUE, FALSE, 0);
+ sod->label1 = gtk_label_new (_("Please , insert command that you want to run\nRemember , you can pipe documents and commands like in a shell\n"));
+ gtk_label_set_justify (GTK_LABEL(sod->label1), GTK_JUSTIFY_LEFT);
+ gtk_box_pack_start (GTK_BOX (sod->vbox), sod->label1, FALSE, FALSE, 0);
+
+ shell_output_create_dialog_table ();
+
+ sod->dialog_action_area = GNOME_DIALOG (sod->dialog)->action_area;
+ gtk_button_box_set_layout (GTK_BUTTON_BOX (sod->dialog_action_area), GTK_BUTTONBOX_END);
+ gtk_button_box_set_spacing (GTK_BUTTON_BOX (sod->dialog_action_area), 8);
+ gnome_dialog_append_button (GNOME_DIALOG (sod->dialog), GNOME_STOCK_BUTTON_OK);
+ sod->ok_button = GTK_WIDGET (g_list_last (GNOME_DIALOG (sod->dialog)->buttons)->data);
+ GTK_WIDGET_SET_FLAGS (sod->ok_button, GTK_CAN_DEFAULT);
+ gnome_dialog_append_button (GNOME_DIALOG (sod->dialog), GNOME_STOCK_BUTTON_CANCEL);
+ sod->cancel_button = GTK_WIDGET (g_list_last (GNOME_DIALOG (sod->dialog)->buttons)->data);
+ GTK_WIDGET_SET_FLAGS (sod->cancel_button, GTK_CAN_DEFAULT);
+
+ gtk_signal_connect (GTK_OBJECT (sod->dialog), "delete_event",
+ GTK_SIGNAL_FUNC (shell_output_close_dialog), NULL);
+ gtk_signal_connect (GTK_OBJECT (sod->cancel_button), "pressed",
+ GTK_SIGNAL_FUNC (shell_output_close_dialog), NULL);
+ gtk_signal_connect (GTK_OBJECT (sod->ok_button), "pressed",
+ GTK_SIGNAL_FUNC (shell_output_command_run), NULL);
+
+ shell_output_add_dialog_options ();
+ gtk_widget_show_all (sod->dialog);
+}
+
+
+static void
+shell_output_activate_option (GtkWidget *widget, gpointer data)
+{
+ soi->doc = data ;
+}
+
+gboolean
+command_out_cb (GIOChannel *chan, GIOCondition cond, gpointer data)
+{
+
+ FILE *temp_file;
+ gchar c;
+ gint read = 1;
+
+ temp_file = fopen (soi->temp_file_name, "w");
+
+ while (read > 0)
+ {
+ g_io_channel_read (chan, &c, 1, &read);
+ if (read > 0)
+ {
+ fputc (c, temp_file);
+ }
+ }
+
+ fclose (temp_file);
+
+ shell_output_open_output_file (soi->temp_file_name);
+ g_free (soi);
+
+ return TRUE;
+}
+
+GString *
+shell_output_data_for_pipe ()
+{
+ GNOME_Development_EditorBuffer buffer;
+ GNOME_Development_EditorBuffer_iobuf *iobuf;
+ CORBA_Environment ev;
+ glong length;
+ GString *result = g_string_new (NULL);
+
+
+ if (soi->doc == NULL)
+ {
+ return result;
+ }
+ else
+ {
+ CORBA_exception_init(&ev);
+
+ buffer = GNOME_Development_Environment_Document_getEditorInterface(
+ soi->doc, "IDL:GNOME/Development/EditorBuffer:1.0", &ev);
+ if(CORBA_Object_is_nil(buffer, &ev))
+ {
+ g_print("not an editor buffer\n");
+ CORBA_exception_free(&ev);
+ return NULL;
+ }
+ length = GNOME_Development_EditorBuffer_getLength (buffer, &ev);
+ if (length == 0)
+ return result ;
+ GNOME_Development_EditorBuffer_getChars (buffer, 0, length, &iobuf, &ev);
+ result = g_string_append (result, g_strndup (iobuf->_buffer, iobuf->_length));
+ CORBA_free (iobuf);
+ bonobo_object_release_unref (buffer, &ev);
+
+ CORBA_exception_free (&ev);
+
+ return result;
+ }
+}
+
+static void
+shell_output_command_run (GtkWidget *widget, gpointer data)
+{
+
+ gchar *command_string = NULL;
+ GString *buffer_to_pipe = NULL;
+
+ command_string = gtk_entry_get_text (GTK_ENTRY (sod->entry));
+
+ soi->work_directory = g_strdup (gnome_file_entry_get_full_path
+ (GNOME_FILE_ENTRY (sod->fileentry1),
+ TRUE));
+ soi->temp_file_name = g_strdup (gnome_file_entry_get_full_path
+ (GNOME_FILE_ENTRY (sod->fileentry2),
+ FALSE));
+ if (soi->work_directory == NULL)
+ {
+ shell_output_error_box (_("There aren't any work directory"));
+ return;
+ }
+
+ if (soi->temp_file_name == NULL)
+ {
+ shell_output_error_box (_("There aren't any temporal file"));
+ return;
+ }
+
+ if (command_string == NULL || (strlen (command_string) == 0))
+ {
+ shell_output_error_box (_("There aren't any command"));
+ return;
+ }
+
+ buffer_to_pipe = shell_output_data_for_pipe ();
+ chdir (soi->work_directory);
+
+ shell_output_popen (buffer_to_pipe, command_string);
+
+ gnome_dialog_close (GNOME_DIALOG (sod->dialog));
+ g_free (sod);
+
+}
+
+static void
+shell_output_popen (GString *buffer_to_pipe, gchar *command)
+{
+ FILE *stream ;
+ GIOChannel *chan_out;
+ gint fdpipe [2];
+ gint fdpipe2 [2];
+ gchar *arg[4] ;
+ gchar *command_to_run;
+ gint pid;
+
+ if (pipe (fdpipe) == -1)
+ return;
+
+ if (pipe (fdpipe2) == -1)
+ return;
+
+ if (buffer_to_pipe->len > 0)
+ command_to_run = g_strdup_printf ("cat | %s", command);
+ else
+ command_to_run = g_strdup_printf (" %s ", command);
+
+ pid = fork();
+ if (pid == 0)
+ {
+ dup2(fdpipe[0], 0);
+ close (fdpipe[0]);
+ close (fdpipe[1]);
+ dup2(fdpipe2[1], 1);
+ close (fdpipe2[0]);
+ close (fdpipe2[1]);
+
+ chan_out = g_io_channel_unix_new (fdpipe2[0]);
+ g_io_add_watch (chan_out, G_IO_IN, command_out_cb, NULL);
+
+ arg[0]=SHELL_OUTPUT_SH_NAME;
+ arg[1]="-c";
+ arg[2]=command_to_run;
+ arg[3]=NULL;
+
+ execvp (SHELL_OUTPUT_SH_PATH, arg);
+
+ g_warning ("A undetermined PIPE problem occurred");
+ _exit (1);
+ }
+ else
+ {
+ close (fdpipe[0]);
+ close (fdpipe2[1]);
+
+ chan_out = g_io_channel_unix_new (fdpipe2[0]);
+ g_io_add_watch (chan_out, G_IO_IN, command_out_cb, NULL);
+
+ if (buffer_to_pipe->len > 0)
+ {
+ fcntl (fdpipe[1], F_SETFD, FD_CLOEXEC);
+ stream = fdopen (fdpipe[1], "w");
+ fprintf (stream, buffer_to_pipe->str);
+ fclose (stream);
+ }
+ g_string_free ( buffer_to_pipe, TRUE ) ;
+ }
+}
+
+static void
+shell_output_open_output_file (gchar *file)
+{
+ GNOME_Development_Environment_DocumentManager docman;
+ GNOME_Development_Environment_Document var_doc ;
+ CORBA_Environment ev;
+ gchar *moniker = NULL ;
+
+ CORBA_exception_init (&ev);
+
+ moniker = g_strdup_printf ("gide:%s!DocumentManager", shell_output_tool->shell_id);
+ docman = bonobo_get_object (moniker,
+ "IDL:GNOME/Development/Environment/DocumentManager:1.0",
+ &ev);
+ g_free (moniker);
+ var_doc = GNOME_Development_Environment_DocumentManager_openFile (docman, file, &ev);
+ bonobo_object_release_unref (docman, &ev);
+
+ CORBA_exception_free (&ev);
+
+}
+
+static void
+shell_output_error_box (gchar *message)
+{
+ GtkWidget *messagebox;
+ GtkWidget *dialog_vbox;
+ GtkWidget *ok_button;
+ GtkWidget *dialog_action_area;
+
+ messagebox = gnome_message_box_new (message, GNOME_MESSAGE_BOX_WARNING,
+ GNOME_STOCK_BUTTON_OK, NULL);
+ gtk_container_remove (GTK_CONTAINER (GNOME_DIALOG (messagebox)->action_area),
+ GNOME_DIALOG (messagebox)->buttons->data);
+ GNOME_DIALOG (messagebox)->buttons = NULL;
+ gtk_window_set_policy (GTK_WINDOW (messagebox), FALSE, FALSE, FALSE);
+ dialog_vbox = GNOME_DIALOG (messagebox)->vbox;
+ gnome_dialog_append_button (GNOME_DIALOG (messagebox), GNOME_STOCK_BUTTON_OK);
+ ok_button = GTK_WIDGET (g_list_last (GNOME_DIALOG (messagebox)->buttons)->data);
+ GTK_WIDGET_SET_FLAGS (ok_button, GTK_CAN_DEFAULT);
+ dialog_action_area = GNOME_DIALOG (messagebox)->action_area;
+ gtk_widget_show_all (messagebox);
+}
+
+static void
+shell_output_close_dialog (GtkWidget *widget, gpointer data)
+{
+ gnome_dialog_close (GNOME_DIALOG (sod->dialog));
+ g_free (sod);
+ g_free (soi);
+}
+
+static void
+shell_output(
+ GtkWidget* widget,
+ gpointer data
+)
+{
+ shell_output_tool = GIDE_TOOL(data);
+
+ sod = g_new (shell_output_dialog, 1);
+ soi = g_new (shell_output_info, 1);
+
+ shell_output_create_dialog ();
+
+}
+
+/*
+ * Define the verbs in this plugin
+ */
+static BonoboUIVerb verbs[] = {
+ BONOBO_UI_UNSAFE_VERB("ShellOutput", shell_output),
+ BONOBO_UI_VERB_END
+};
+
+/*
+ * Boilerplate initialization function
+ */
+static gboolean
+impl_init(
+ GideTool* tool,
+ gpointer closure
+)
+{
+ BonoboUIComponent* uic;
+ CORBA_Environment ev;
+
+ g_return_val_if_fail(tool != NULL, FALSE);
+ g_return_val_if_fail(GIDE_IS_TOOL(tool), FALSE);
+
+ CORBA_exception_init(&ev);
+
+ uic = bonobo_ui_component_new("gide-shelloutput-plugin");
+ bonobo_ui_component_set_container(uic, tool->ui_container);
+ bonobo_ui_util_set_ui(uic, GIDE_DATADIR, "gide-shelloutput-plugin.xml",
+ "gide-shelloutput-plugin");
+
+ bonobo_ui_component_add_verb_list_with_data(uic, verbs, tool);
+
+ CORBA_exception_free(&ev);
+
+ return TRUE;
+}
+
+/*
+ * Boilerplace cleanup function
+ */
+static void
+impl_cleanup(
+ GideTool* tool,
+ gpointer closure
+)
+{
+}
+
+/*
+ * Boilerplate creation function
+ */
+static CORBA_Object
+make_object(
+ PortableServer_POA poa,
+ const char* iid,
+ gpointer impl_ptr,
+ CORBA_Environment* ev
+)
+{
+ GideTool* tool;
+
+ tool = gide_tool_new(impl_init, impl_cleanup, NULL);
+
+ oaf_plugin_use(poa, impl_ptr);
+
+ return bonobo_object_corba_objref(BONOBO_OBJECT(tool->props));
+}
+
+/*
+ * List of plugins
+ */
+static const OAFPluginObject plugin_list[] =
+{
+ {
+ SHELL_OUTPUT_COMPONENT_IID,
+ make_object
+ },
+ {
+ NULL
+ }
+};
+
+/*
+ * Plugin description
+ */
+const OAFPlugin OAF_Plugin_info = {
+ plugin_list,
+ "gIDE Shell Output Plugin"
+};
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]