+
+struct _VimControlPrivate {
+ BonoboUIComponent *component;
+};
+
+static GObjectClass *vim_control_parent_class;
+
+static gboolean
+quit_vim(gpointer data)
+{
+ getout_preserve_modified(0);
+}
+
+static void
+vim_control_destroy (BonoboObject *control)
+{
+ BonoboUIComponent *uic;
+
+ g_return_if_fail (control != NULL);
+ g_return_if_fail (VIM_IS_CONTROL (control));
+
+ g_message ("Destroying VimControl...");
+
+ uic = bonobo_control_get_ui_component (BONOBO_CONTROL (control));
+ if( uic != CORBA_OBJECT_NIL )
+ bonobo_ui_component_unset_container (uic, NULL);
+
+ BONOBO_OBJECT_CLASS (vim_control_parent_class)->destroy (control);
+
+ /* we only support creating one vim control per process, so when this one
+ * is finished, we're done. */
+ g_timeout_add(50, &quit_vim, NULL);
+}
+
+static void
+vim_control_finalize (GObject *object)
+{
+ VimControl *control;
+
+ g_return_if_fail (object != NULL);
+ g_return_if_fail (VIM_IS_CONTROL (object));
+
+ control = VIM_CONTROL (object);
+
+ g_free (control->priv);
+
+ G_OBJECT_CLASS (vim_control_parent_class)->finalize (object);
+}
+
+static void
+vim_control_set_ui_container (VimControl *control,
+ Bonobo_UIContainer ui_container)
+{
+ BonoboUIComponent *uic;
+
+ g_return_if_fail (control != NULL);
+ g_return_if_fail (VIM_IS_CONTROL (control));
+ g_return_if_fail (ui_container != CORBA_OBJECT_NIL);
+
+ uic = bonobo_control_get_ui_component (BONOBO_CONTROL (control));
+ bonobo_ui_component_set_container (uic, ui_container, NULL);
+
+ /* schedule a UI update */
+ update_ui_later();
+}
+
+static void
+vim_control_unset_ui_container (VimControl *control)
+{
+ BonoboUIComponent *uic;
+
+ g_return_if_fail (control != NULL);
+ g_return_if_fail (VIM_IS_CONTROL (control));
+
+ uic = bonobo_control_get_ui_component (BONOBO_CONTROL (control));
+ bonobo_ui_component_unset_container (uic, NULL);
+}
+
+static grab_keys = 0;
+
+#if 0
+static GdkFilterReturn
+filter_key_events (GdkXEvent *gdk_xevent, GdkEvent *event, gpointer data)
+{
+ /* GdkScreen *screen = gdk_drawable_get_screen (event->any.window);
+ GdkDisplay *display = gdk_screen_get_display (screen);*/
+ XEvent *xevent = (XEvent *)gdk_xevent;
+
+ GdkFilterReturn return_val;
+
+ return_val = GDK_FILTER_CONTINUE;
+
+ switch (xevent->type)
+ {
+ case KeyPress:
+ g_warning("Key press!");
+ break;
+
+ case KeyRelease:
+ g_warning("Key release!");
+ break;
+
+ default:
+ break;
+ }
+ return return_val;
+}
+#endif
+
+static void
+set_frame_cb (BonoboControl *object, gpointer data)
+{
+ Bonobo_ControlFrame frame;
+ VimControl *control;
+
+ g_return_if_fail (object != NULL);
+ g_return_if_fail (VIM_IS_CONTROL (object));
+
+ frame = bonobo_control_get_control_frame (object, NULL);
+ if (frame == CORBA_OBJECT_NIL)
+ return;
+ CORBA_Object_release (frame, NULL);
+
+ control = VIM_CONTROL (object);
+
+ Bonobo_UIContainer ui_container;
+
+ ui_container = bonobo_control_get_remote_ui_container (BONOBO_CONTROL (control), NULL);
+ if (ui_container != CORBA_OBJECT_NIL) {
+ vim_control_set_ui_container (control, ui_container);
+ bonobo_object_release_unref (ui_container, NULL);
+ }
+
+}
+
+static void
+embedded_cb (GtkPlug *plug)
+{
+ Atom wm_class;
+ Atom actual_type;
+ int actual_format;
+ unsigned long actual_length;
+ unsigned long remaining_bytes;
+ unsigned char * wm_class_value;
+ Window win;
+ Window root;
+ Window parent;
+ Window * children = NULL;
+ unsigned int nchildren;
+ int result;
+
+ wm_class = gdk_x11_get_xatom_by_name("WM_CLASS");
+ win = GDK_WINDOW_XID(plug->socket_window);
+
+ while( TRUE ) {
+ /*g_warning("checking xid %d", win);*/
+ result = XGetWindowProperty (GDK_WINDOW_XDISPLAY (plug->socket_window),
+ win,
+ wm_class, 0, 120, False, XA_STRING,
+ &actual_type, &actual_format,
+ &actual_length, &remaining_bytes, &wm_class_value);
+ if( result == Success && actual_type != None) {
+ /*g_warning("WM_CLASS is %s", wm_class_value);*/
+ apply_autocmds(EVENT_EMBEDDED_COMPONENT, wm_class_value, NULL, FALSE, persistent_buffer);
+ Xfree(wm_class_value);
+ break;
+ }
+ gdk_error_trap_push ();
+ result = XQueryTree(GDK_WINDOW_XDISPLAY(plug->socket_window),
+ win,
+ &root, &parent, &children, &nchildren);
+ if (gdk_error_trap_pop () || !result) {
+ break;
+ }
+ if( children ) {
+ Xfree(children);
+ children = NULL;
+ }
+ if( root == parent) {
+ /* we've reached the root window */
+ break;
+ }
+ win = parent;
+ }
+}
+
+static void
+vim_control_class_init (VimControl *klass)
+{
+ GObjectClass *gobject_class = (GObjectClass *)klass;
+ BonoboObjectClass *bonobo_object_class = (BonoboObjectClass *)klass;
+ BonoboControlClass *control_class = (BonoboControlClass *)klass;
+
+ vim_control_parent_class= g_type_class_peek_parent (klass);
+
+ bonobo_object_class->destroy = vim_control_destroy;
+ gobject_class->finalize = vim_control_finalize;
+}
+
+static char_u * stream_buffer = NULL;
+static int stream_offset = 0;
+static CORBA_long stream_length = 0;
+static Bonobo_Stream current_stream;
+
+/* It seems like it is an error to attempt to read more data
+ * than is available from a bonobo stream. So we slurp in
+ * the entire file in one chunk, and then pass it back in
+ * pieces to the caller.
+ */
+int
+vim_control_persist_stream_read(char_u * buffer, int reqsize)
+{
+ int read_size;
+
+ if( stream_offset >= stream_length ) {
+ return 0;
+ }
+ read_size = stream_length - stream_offset >= reqsize ?
+ reqsize : stream_length - stream_offset;
+ mch_memmove(buffer, &stream_buffer[stream_offset], read_size);
+ stream_offset += read_size;
+ return read_size;
+}
+
+int
+vim_control_persist_stream_write(char_u * buffer, int reqsize)
+{
+ CORBA_Environment ev;
+
+ CORBA_exception_init(&ev);
+ bonobo_stream_client_write(current_stream, buffer, reqsize, &ev);
+ if (ev._major != CORBA_NO_EXCEPTION ) {
+ g_warning("Error writing to stream");
+ CORBA_exception_free (&ev);
+ return 0;
+ }
+ CORBA_exception_free (&ev);
+ return reqsize;
+}
+
+void
+component_set_dirty(gboolean dirty)
+{
+ bonobo_persist_set_dirty(BONOBO_PERSIST(gui.pstream), dirty);
+ bonobo_persist_set_dirty(BONOBO_PERSIST(gui.pfile), dirty);
+}
+
+static void load_buffer_from_stream( const Bonobo_Stream stream,
+ Bonobo_Persist_ContentType type,
+ CORBA_Environment *ev)
+{
+ exarg_T ea; /* Ex command arguments */
+
+ g_warning ("load_buffer_from_stream");
+
+ stream_buffer = bonobo_stream_client_read( stream, -1, &stream_length, ev);
+ if (ev->_major != CORBA_NO_EXCEPTION) {
+ g_warning("Error reading from stream");
+ return;
+ }
+ stream_offset = 0;
+
+ if( persistent_buffer ) {
+ /* make it possible to delete the existing buffer, so that it
+ * can be replaced with what we are about to load */
+ persistent_buffer->emb_buffer = FALSE;
+ }
+
+ vim_memset(&ea, 0, sizeof(ea));
+ ea.cmd = "e ++enc=utf-8";
+ ea.force_enc = 8; /* this is the offset of "utf-8" in the cmd */
+
+ read_from_container = PERSIST_STREAM_IO;
+ do_ecmd(0, NULL, NULL, &ea, 1, ECMD_OLDBUF|ECMD_FORCEIT);
+ read_from_container = NORMAL_IO;
+
+ /* we've set the fileencoding to utf-8; set encoding to utf-8 as * well.*/
+ do_cmdline_cmd("set encoding=utf-8");
+
+ /* remember this buffer */
+ persistent_buffer = curbuf;
+ ga_clear(&error_ga);
+ g_free(stream_buffer);
+
+
+ /* run a filter to obtain plain text from the html */
+ if( !strcmp( type, "text/html" )) {
+ vim_bonobo_call_begin();
+ /* Substitutions to recognize quoted text */
+ do_cmdline_cmd("%s//GtkHTML_QUOTE_ON<\\/pre>");
+ do_cmdline_cmd("%s//GtkHTML_QUOTE_OFF<\\/pre>");
+ do_cmdline_cmd("%s/<\\/i><\\/blockquote>/<\\/pre><\\/i><\\/blockquote>/");
+ do_cmdline_cmd("%!html2text -nobs");
+ do_cmdline_cmd("call EvoQuote()");
+ vim_bonobo_call_end();
+ }
+ do_cmdline_cmd("set nomodified");
+ component_set_dirty(FALSE);
+}
+
+static void load_buffer_from_stream_cb(BonoboPersistStream *ps,
+ const Bonobo_Stream stream,
+ Bonobo_Persist_ContentType type,
+ void *closure,
+ CORBA_Environment *ev)
+{
+ load_buffer_from_stream(stream, type, ev);
+}
+
+static void
+save_buffer_to_stream( const Bonobo_Stream stream,
+ Bonobo_Persist_ContentType type,
+ CORBA_Environment *ev)
+{
+ buf_T * buf;
+ exarg_T ea; /* Ex command arguments */
+
+ /*g_warning ("save_buffer_to_stream");*/
+
+ current_stream = stream;
+ write_to_container = PERSIST_STREAM_IO;
+
+ if( !strcmp(type, "text/html")) {
+ vim_control_persist_stream_write("", 5);
+ }
+
+ vim_memset(&ea, 0, sizeof(ea));
+ ea.cmd = "e ++enc=utf-8";
+ ea.force_enc = 8; /* this is the offset of "utf-8" in the cmd */
+
+ buf = persistent_buffer;
+ buf_write(buf, "dummy", "dummy", 1, buf->b_ml.ml_line_count,
+ &ea, FALSE, FALSE, TRUE, TRUE);
+ if( !strcmp(type, "text/html")) {
+ vim_control_persist_stream_write("
", 6);
+ }
+ write_to_container = NORMAL_IO;
+ ga_clear(&error_ga);
+}
+
+static void
+save_buffer_to_stream_cb(BonoboPersistStream *ps,
+ const Bonobo_Stream stream,
+ Bonobo_Persist_ContentType type,
+ void *closure,
+ CORBA_Environment *ev)
+{
+ save_buffer_to_stream(stream, type, ev);
+}
+
+static gint
+load_buffer_from_file (BonoboPersistFile *pf,
+ const CORBA_char *filename,
+ CORBA_Environment *ev,
+ void *closure)
+{
+ Bonobo_PersistStream ps = closure;
+ BonoboStream *stream;
+
+ /* FIXME!! */
+ stream = bonobo_get_object(filename, "IDL:Bonobo/Stream:1.0", ev);
+
+ if (!stream)
+ return 0;
+
+ load_buffer_from_stream (ps, "text/plain", ev);
+ return 0; /* Return 0 on success */
+}
+
+static gint
+save_to_file (BonoboPersistFile *pf,
+ const CORBA_char *filename,
+ CORBA_Environment *ev,
+ void *closure)
+{
+ Bonobo_PersistStream ps = closure;
+ BonoboStream *stream;
+
+
+ /*
+ stream = bonobo_stream_open (
+ BONOBO_IO_DRIVER_FS,
+ filename, Bonobo_STORAGE_WRITE | Bonobo_STORAGE_CREATE,
+ S_IRUSR | S_IWUSR | S_IRGRP);
+
+ if (!stream)
+ return 0;
+
+ save_buffer_to_stream (NULL, ps, "text/plain", ev);
+ */
+ return 0; /* Return 0 on success */
+}
+
+
+Bonobo_Persist_ContentTypeList *
+persist_stream_types( BonoboPersistStream * ps, void * closure, CORBA_Environment *ev )
+{
+ /*g_warning ("persist_stream_types");*/
+ return bonobo_persist_generate_content_types(2, "text/plain", "text/html");
+}
+
+
+#if 0
+static void
+nv_load_location_cb (NautilusView *view, const char *location, gpointer user_data)
+{
+ g_return_if_fail (NAUTILUS_IS_VIEW (view));
+ g_return_if_fail (location != NULL);
+
+ nautilus_view_report_load_underway (NAUTILUS_VIEW (view));
+
+ /* FIXME: load the file here (using gnome-vfs)! */
+ nautilus_view_report_load_complete (NAUTILUS_VIEW (view));
+}
+#endif
+
+static enum {
+ EDITOR_NEEDS_ESCAPE
+} EditorControlProps;
+
+editor_get_prop (BonoboPropertyBag *bag,
+ BonoboArg *arg,
+ guint arg_id,
+ CORBA_Environment *ev,
+ gpointer user_data)
+{
+ //GtkHTMLControlData *cd = user_data;
+
+ switch (arg_id) {
+ case EDITOR_NEEDS_ESCAPE:
+ BONOBO_ARG_SET_BOOLEAN (arg, TRUE);
+ break;
+ default:
+ bonobo_exception_set (ev, ex_Bonobo_PropertyBag_NotFound);
+ break;
+ }
+}
+
+static void
+editor_set_prop (BonoboPropertyBag *bag,
+ const BonoboArg *arg,
+ guint arg_id,
+ CORBA_Environment *ev,
+ gpointer user_data)
+{
+ //GtkHTMLControlData *cd = user_data;
+
+ switch (arg_id) {
+ case EDITOR_NEEDS_ESCAPE:
+ bonobo_exception_set (ev, ex_Bonobo_PropertyBag_ReadOnly);
+ break;
+ default:
+ bonobo_exception_set (ev, ex_Bonobo_PropertyBag_NotFound);
+ break;
+ }
+}
+
+static void
+vim_control_init (VimControl *control)
+{
+ control->priv = g_new0 (VimControlPrivate, 1);
+}
+
+BONOBO_TYPE_FUNC (VimControl, BONOBO_TYPE_CONTROL, vim_control);
+
+BonoboObject *
+vim_control_add_interfaces (VimControl *control,
+ BonoboObject *to_aggregate)
+{
+ BonoboPersistFile *file;
+ //NautilusView *nv;
+ BonoboPersistStream *stream;
+ EditorEngine *engine; /* GtkHTML editor engine interface */
+ //BonoboItemContainer *item_container;
+
+
+ g_return_val_if_fail (VIM_IS_CONTROL (control), NULL);
+ g_return_val_if_fail (BONOBO_IS_OBJECT (to_aggregate), NULL);
+
+ /* Interface Bonobo::PersistStream */
+ stream = bonobo_persist_stream_new (load_buffer_from_stream_cb,
+ save_buffer_to_stream_cb,
+ persist_stream_types,
+ VIM_OAFIID,
+ control);
+ if (!stream) {
+ bonobo_object_unref (BONOBO_OBJECT (to_aggregate));
+ return NULL;
+ }
+ bonobo_object_add_interface (BONOBO_OBJECT (to_aggregate),
+ BONOBO_OBJECT (stream));
+ gui.pstream = stream;
+
+ /* Interface Bonobo::PersistFile */
+ file = bonobo_persist_file_new (load_buffer_from_file,
+ save_buffer_to_stream, VIM_OAFIID, control);
+ if (!file) {
+ bonobo_object_unref (BONOBO_OBJECT (to_aggregate));
+ return NULL;
+ }
+ bonobo_object_add_interface (BONOBO_OBJECT (to_aggregate),
+ BONOBO_OBJECT (file));
+ gui.pfile = file;
+
+ /*
+ nv = nautilus_view_new_from_bonobo_control(BONOBO_CONTROL(control));
+ if( !nv ) {
+ bonobo_object_unref (BONOBO_OBJECT(to_aggregate));
+ return NULL;
+ }
+ bonobo_object_add_interface (BONOBO_OBJECT (to_aggregate),
+ BONOBO_OBJECT (nv));
+
+ g_signal_connect (G_OBJECT (nv), "load_location",
+ G_CALLBACK (nv_load_location_cb), NULL);
+ */
+
+ engine = editor_engine_new();
+ if( !engine ) {
+ bonobo_object_unref (BONOBO_OBJECT(to_aggregate));
+ return NULL;
+ }
+ bonobo_object_add_interface (BONOBO_OBJECT (to_aggregate),
+ BONOBO_OBJECT (engine));
+
+ return to_aggregate;
+}
+
+VimControl *
+vim_control_construct (VimControl *control)
+{
+ GtkWidget *button;
+ GtkWidget *label;
+ BonoboPlug *plug;
+ GtkAccelGroup *group;
+ GClosure *closure;
+ //VimControlPrivate *priv;
+ BonoboPropertyBag *pb;
+ BonoboArg *def;
+
+ g_return_val_if_fail (control != NULL, NULL);
+ g_return_val_if_fail (VIM_IS_CONTROL (control), NULL);
+
+
+ if (!vim_control_add_interfaces (control, BONOBO_OBJECT (control)))
+ return NULL;
+
+ gui.control = BONOBO_CONTROL(control);
+ gui.plug = (BonoboPlug *)bonobo_control_get_plug(control);
+ gui.mainwin = GTK_WIDGET(gui.plug);
+ gui_mch_init();
+
+ g_signal_connect (control, "set_frame", G_CALLBACK (set_frame_cb), NULL);
+ g_signal_connect (gui.plug, "embedded", G_CALLBACK (embedded_cb), NULL);
+
+ /* Create the vim-view */
+ //priv->image_view = vim_image_view_new (vim, FALSE);
+ //if (!priv->image_view) {
+ //bonobo_object_unref (BONOBO_OBJECT (control));
+ //return NULL;
+ //}
+
+ pb = bonobo_property_bag_new (editor_get_prop, editor_set_prop, NULL);
+ bonobo_control_set_properties (control, BONOBO_OBJREF (pb), NULL);
+
+ def = bonobo_arg_new (BONOBO_ARG_BOOLEAN);
+ BONOBO_ARG_SET_BOOLEAN (def, TRUE);
+
+ bonobo_property_bag_add (pb, "EditorNeedsEscape", EDITOR_NEEDS_ESCAPE,
+ BONOBO_ARG_BOOLEAN, def,
+ "Whether the editor requires Escape key events",
+ 0);
+
+ CORBA_free (def);
+
+ bonobo_object_unref (BONOBO_OBJECT (pb));
+
+ return control;
+}
+
+VimControl *
+vim_control_new (void)
+{
+ VimControl *control;
+
+ g_message ("Creating VimControl...");
+
+ control = g_object_new (VIM_CONTROL_TYPE, NULL);
+
+ return vim_control_construct (control);
+}
+
diff --new-file -u -r --exclude-from=excludelist vimcopy/src/vim_bonobo_control.h vim/src/vim_bonobo_control.h
--- vimcopy/src/vim_bonobo_control.h Wed Dec 31 18:00:00 1969
+++ vim/src/vim_bonobo_control.h Sat Jul 26 13:16:48 2003
@@ -0,0 +1,50 @@
+/*
+ * vim_bonobo_control.h
+ *
+ * Author:
+ * Jason Hildebrand (jason@peaceworks.ca)
+ *
+ */
+
+#ifndef _VIM_CONTROL_H_
+#define _VIM_CONTROL_H_
+
+#include
+#define VIM_OAFIID "OAFIID:Vim_Control"
+#define NORMAL_IO 0
+#define PERSIST_STREAM_IO 1
+#define PERSIST_FILE_IO 2
+
+G_BEGIN_DECLS
+
+#define VIM_CONTROL_TYPE (vim_control_get_type ())
+#define VIM_CONTROL(o) (G_TYPE_CHECK_INSTANCE_CAST ((o), VIM_CONTROL_TYPE, VimControl))
+#define VIM_CONTROL_CLASS(k) (G_TYPE_CHECK_CLASS_CAST((k), VIM_CONTROL_TYPE, VimControlClass))
+
+#define VIM_IS_CONTROL(o) (G_TYPE_CHECK_INSTANCE_TYPE ((o), VIM_CONTROL_TYPE))
+#define VIM_IS_CONTROL_CLASS(k) (G_TYPE_CHECK_CLASS_TYPE ((k), VIM_CONTROL_TYPE))
+#define VIM_CONTROL_GET_CLASS(o) (G_TYPE_INSTANCE_GET_CLASS ((o), VIM_CONTROL_TYPE, VimControlClass))
+
+typedef struct _VimControl VimControl;
+typedef struct _VimControlClass VimControlClass;
+typedef struct _VimControlPrivate VimControlPrivate;
+
+struct _VimControl {
+ BonoboControl control;
+
+ VimControlPrivate *priv;
+};
+
+struct _VimControlClass {
+ BonoboControlClass parent_class;
+};
+
+GType vim_control_get_type (void);
+VimControl *vim_control_new (void);
+VimControl *vim_control_construct (VimControl *control);
+
+void set_curbuf_persistent(void);
+
+G_END_DECLS
+
+#endif /* _VIM_CONTROL_H_*/
diff --new-file -u -r --exclude-from=excludelist vimcopy/src/vim_bonobo_factory.c vim/src/vim_bonobo_factory.c
--- vimcopy/src/vim_bonobo_factory.c Wed Dec 31 18:00:00 1969
+++ vim/src/vim_bonobo_factory.c Sun Oct 26 16:51:53 2003
@@ -0,0 +1,73 @@
+/*
+ * vim_bonobo_factory.c
+ *
+ * Author:
+ * Jason Hildebrand (jason@peaceworks.ca)
+ *
+ */
+
+#include "vim.h"
+#include "version.h"
+#include
+#include "vim_bonobo_control.h"
+
+static BonoboGenericFactory *factory = NULL;
+static int vim_instantiated = 0;
+
+static BonoboObject *
+vim_bonobo_factory(BonoboGenericFactory *this,
+ const char *oaf_iid,
+ void *data)
+{
+ VimControl *vim;
+ BonoboObject *retval;
+
+ g_return_val_if_fail (this != NULL, NULL);
+ g_return_val_if_fail (oaf_iid != NULL, NULL);
+
+ if( vim_instantiated ) {
+ /* we cannot instantiate more than one control from this process,
+ * because of all of vim's global variables */
+ return NULL;
+ }
+
+ g_message ("Trying to produce a '%s'...", oaf_iid);
+
+ if (strcmp (oaf_iid, VIM_OAFIID) == 0) {
+ vim = vim_control_new ();
+ if (vim == NULL)
+ return NULL;
+ retval = BONOBO_OBJECT (vim);
+ } else {
+ g_warning ("Unknown IID `%s' requested", oaf_iid);
+ return NULL;
+ }
+ vim_instantiated = 1;
+
+ return retval;
+}
+
+/* wait until this component is instantiated */
+int vim_bonobo_wait_for_instantiation()
+{
+ while( !vim_instantiated) {
+ MAIN_ITERATION_DO(TRUE);
+ }
+}
+
+
+int vim_bonobo_init(int *argc, char *argv[])
+{
+ if (!bonobo_ui_init ("gnome-vim", VIM_VERSION_SHORT, argc, argv))
+ g_error (_("Could not initialize Bonobo"));
+
+ factory = bonobo_generic_factory_new (
+ VIM_FACTORY_OAFIID, vim_bonobo_factory, NULL);
+
+ if (factory == NULL) {
+ g_error ("Couldn't create factory.\n");
+ return 0;
+ }
+ return 1;
+}
+
diff --new-file -u -r --exclude-from=excludelist vimcopy/src/vim_bonobo_factory.h vim/src/vim_bonobo_factory.h
--- vimcopy/src/vim_bonobo_factory.h Wed Dec 31 18:00:00 1969
+++ vim/src/vim_bonobo_factory.h Sun Oct 26 16:55:12 2003
@@ -0,0 +1,17 @@
+/*
+ * vim_bonobo_factory.h
+ *
+ * Author:
+ * Jason Hildebrand (jason@peaceworks.ca)
+ *
+ */
+
+#if !defined( _VIM_BONOBO_FACTORY_H)
+#define _VIM_BONOBO_FACTORY_H
+
+#define VIM_FACTORY_OAFIID "OAFIID:Vim_Control_Factory"
+
+void gui_component_init(int *argc, char *argv []);
+int gui_component_wait_for_instantiation(void);
+
+#endif
diff --new-file -u -r --exclude-from=excludelist vimcopy/src/vim_bonobo_main.c vim/src/vim_bonobo_main.c
--- vimcopy/src/vim_bonobo_main.c Wed Dec 31 18:00:00 1969
+++ vim/src/vim_bonobo_main.c Sun Oct 26 20:04:35 2003
@@ -0,0 +1,98 @@
+/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
+#include "vim.h"
+
+#include
+#include
+#include
+
+static guint bonobo_main_loop_level = 0;
+static GSList * bonobo_main_loops = NULL;
+
+static gboolean in_bonobo_call = FALSE;
+
+
+/**
+ * bonobo_main:
+ *
+ * Activates the Bonobo POA Manager and enters the main event loop.
+ */
+void
+vim_bonobo_main (void)
+{
+ GMainLoop *loop;
+
+ if( in_bonobo_call ) {
+ return;
+ }
+
+ bonobo_activate ();
+
+ bonobo_main_loop_level++;
+
+ loop = g_main_loop_new (NULL, TRUE);
+ bonobo_main_loops = g_slist_prepend (bonobo_main_loops, loop);
+
+ if (g_main_loop_is_running (bonobo_main_loops->data))
+ g_main_loop_run (loop);
+
+ bonobo_main_loops = g_slist_remove (bonobo_main_loops, loop);
+
+ g_main_loop_unref (loop);
+
+ bonobo_main_loop_level--;
+}
+
+/**
+ * bonobo_main_quit:
+ *
+ * Quits the main event loop.
+ */
+void
+vim_bonobo_main_quit (void)
+{
+ g_return_if_fail (bonobo_main_loops != NULL);
+
+ g_main_loop_quit (bonobo_main_loops->data);
+}
+
+int
+vim_bonobo_main_level(void)
+{
+ return bonobo_main_loop_level;
+}
+
+static long save_p_report;
+static int save_msg_silent;
+static int save_emsg_silent;
+
+void
+vim_bonobo_call_begin(void)
+{
+ in_bonobo_call = TRUE;
+ gui.processing_call = TRUE;
+ save_p_report = p_report;
+ p_report = 100000;
+ save_msg_silent = msg_silent;
+ msg_silent = TRUE;
+ save_emsg_silent = emsg_silent;
+ emsg_silent = TRUE;
+}
+
+void
+vim_bonobo_call_end(void)
+{
+ in_bonobo_call = FALSE;
+ gui.processing_call = FALSE;
+ msg_silent = save_msg_silent;
+ emsg_silent = save_emsg_silent;
+ p_report = save_p_report;
+}
+
+gboolean
+vim_bonobo_main_iteration_do(may_block)
+{
+ if( ! in_bonobo_call ) {
+ g_main_context_iteration(NULL, may_block);
+ }
+}
+
diff --new-file -u -r --exclude-from=excludelist vimcopy/src/vim_bonobo_main.h vim/src/vim_bonobo_main.h
--- vimcopy/src/vim_bonobo_main.h Wed Dec 31 18:00:00 1969
+++ vim/src/vim_bonobo_main.h Sat Oct 11 10:22:11 2003
@@ -0,0 +1,16 @@
+/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
+
+#ifndef __VIM_BONOBO_MAIN_H__
+#define __VIM_BONOBO_MAIN_H__
+
+#include
+#include
+
+void vim_bonobo_main (void);
+void vim_bonobo_main_quit (void);
+int vim_bonobo_level(void);
+gboolean vim_bonobo_main_iteration_do(int may_block);
+void vim_bonobo_call_begin(void);
+void vim_bonobo_call_end(void);
+
+#endif /* __VIM_BONOBO_MAIN_H__ */
diff --new-file -u -r --exclude-from=excludelist vimcopy/src/vim_proxy_factory.c vim/src/vim_proxy_factory.c
--- vimcopy/src/vim_proxy_factory.c Wed Dec 31 18:00:00 1969
+++ vim/src/vim_proxy_factory.c Sun Oct 26 19:34:07 2003
@@ -0,0 +1,66 @@
+/*
+ * vim_proxy_factory.c
+ *
+ * Author:
+ * Jason Hildebrand (jason@peaceworks.ca)
+ *
+ */
+
+#include "vim.h"
+#include "version.h"
+#include
+#include
+#include
+#include "vim_bonobo_control.h"
+#include "vim_bonobo_factory.h"
+
+#define VIM_PROXY_OAFIID "OAFIID:Vim_Proxy_Factory"
+
+static BonoboGenericFactory *factory = NULL;
+
+static BonoboObject *
+vim_proxy_factory(BonoboGenericFactory *this,
+ const char *oaf_iid,
+ void *data)
+{
+ CORBA_Object realfactory;
+ CORBA_Environment ev;
+ BonoboObject * vim_control = NULL;
+ CORBA_Object corba_control;
+
+ g_return_val_if_fail (this != NULL, NULL);
+ g_return_val_if_fail (oaf_iid != NULL, NULL);
+
+ g_message ("Trying to produce a '%s'...", oaf_iid);
+
+ if (strcmp (oaf_iid, VIM_OAFIID) == 0) {
+ CORBA_exception_init(&ev);
+
+ realfactory = bonobo_activation_activate_from_id (VIM_FACTORY_OAFIID,
+ Bonobo_ACTIVATION_FLAG_PRIVATE,
+ NULL,
+ &ev);
+ if (ev._major != CORBA_NO_EXCEPTION ) {
+ CORBA_exception_free (&ev);
+ return NULL;
+ }
+
+ corba_control = Bonobo_GenericFactory_createObject(realfactory, VIM_OAFIID, &ev);
+ if (ev._major != CORBA_NO_EXCEPTION ) {
+ CORBA_exception_free (&ev);
+ return NULL;
+ }
+ CORBA_exception_free (&ev);
+ vim_control = bonobo_foreign_object_new(corba_control);
+ } else {
+ g_warning ("Unknown IID `%s' requested", oaf_iid);
+ return NULL;
+ }
+ return vim_control;
+}
+
+
+BONOBO_ACTIVATION_FACTORY (VIM_PROXY_OAFIID,
+ "Vim Proxy Factory", "1.0",
+ vim_proxy_factory, NULL);
+