]> www.fi.muni.cz Git - evince.git/blobdiff - pdf/xpdf/gpdf.cc
kill ghastly hack adding -lbonobo. (bonobo_application_x_pdf_LDADD): add
[evince.git] / pdf / xpdf / gpdf.cc
index e2d11548adb5093fd319ca5bc7a22c57c098a99a..e9a6f8410e8ab0f460cc90d22387bbccfcec204a 100644 (file)
@@ -3,7 +3,6 @@
  *
  * Author:
  *   Michael Meeks <michael@imaginator.com>
- *
  */
 #include <stdio.h>
 #include <stdlib.h>
 extern "C" {
 #define GString G_String
 #include <gnome.h>
+
+#if USING_OAF
+#include <liboaf/liboaf.h>
+#else
 #include <libgnorba/gnorba.h>
+#endif
+
 #include <gdk/gdkprivate.h>
 #include <gdk/gdkx.h>
-#include <bonobo/gnome-bonobo.h>
+#include <bonobo.h>
 #undef  GString 
 }
-#include <sys/stat.h>
-#include <unistd.h>
-#include "gtypes.h"
-#include "GString.h"
-#include "parseargs.h"
-#include "gfile.h"
-#include "gmem.h"
-#include "Object.h"
-#include "Stream.h"
-#include "Array.h"
-#include "Dict.h"
-#include "XRef.h"
-#include "Catalog.h"
-#include "Page.h"
-#include "Link.h"
-#include "PDFDoc.h"
-#include "GOutputDev.h"
-#include "PSOutputDev.h"
-#include "TextOutputDev.h"
-#include "Params.h"
-#include "Error.h"
 #include "config.h"
+#include "bonobo-application-x-pdf.h"
 
 poptContext ctx;
 gint  gpdf_debug=0;
@@ -55,13 +40,11 @@ typedef struct _Container Container;
 /* NB. there is a 1 to 1 Container -> Component mapping, this
    is due to how much MDI sucks; unutterably */
 struct _Container {
-  GnomeContainer    *container;
-  GnomeUIHandler    *uih;
-  
-  GnomeViewFrame    *active_view_frame;
+  BonoboContainer    *container;
+  BonoboUIHandler    *uih;
   
   GtkWidget        *app;
-  GtkScrolledWindow *scroll;
+  GtkWidget        *slot;
   GtkWidget        *view_widget;
   Component         *component;
 };
@@ -69,9 +52,9 @@ struct _Container {
 struct  _Component {
        Container         *container;
 
-       GnomeClientSite   *client_site;
-       GnomeViewFrame    *view_frame;
-       GnomeObjectClient *server;
+       BonoboClientSite   *client_site;
+       BonoboViewFrame   *view_frame;
+       BonoboObjectClient *server;
 };
 
 GList *containers = NULL;
@@ -124,33 +107,38 @@ extern "C" {
   static gboolean
   open_pdf (Container *container, const char *name)
   {
-    GnomeObjectClient *object;
-    GnomeStream *stream;
-    GNOME_PersistStream persist;
+    BonoboObjectClient *object;
+    BonoboStream *stream;
+    Bonobo_PersistStream persist;
     Component *comp;
     CORBA_Environment ev;
 
     g_return_val_if_fail (container != NULL, FALSE);
     g_return_val_if_fail (container->view_widget == NULL, FALSE);
 
+#if USING_OAF
+    comp = container_activate_component (container, "OAFIID:gpdf_component:892f2727-e2ec-423c-91ad-6f7b75fec6c8");
+
+#else
     comp = container_activate_component (container, "bonobo-object:application-x-pdf");
+#endif
     if (!comp || !(object = comp->server)) {
       gnome_error_dialog (_("Could not launch bonobo object."));
       return FALSE;
     }
     
     CORBA_exception_init (&ev);
-    persist = GNOME_Unknown_query_interface (
-      gnome_object_corba_objref (GNOME_OBJECT (object)),
-      "IDL:GNOME/PersistStream:1.0", &ev);
+    persist = Bonobo_Unknown_query_interface (
+      bonobo_object_corba_objref (BONOBO_OBJECT (object)),
+      "IDL:Bonobo/PersistStream:1.0", &ev);
     
     if (ev._major != CORBA_NO_EXCEPTION ||
        persist == CORBA_OBJECT_NIL) {
-      gnome_error_dialog ("Panic: component is well broken.");
+      gnome_error_dialog ("Panic: component doesn't implement PersistStream.");
       return FALSE;
     }
     
-    stream = gnome_stream_fs_open (name, GNOME_Storage_READ);
+    stream = bonobo_stream_fs_open (name, Bonobo_Storage_READ);
     
     if (stream == NULL) {
       char *err = g_strconcat (_("Could not open "), name, NULL);
@@ -159,14 +147,16 @@ extern "C" {
       return FALSE;
     }
     
-    GNOME_PersistStream_load (persist,
-                             (GNOME_Stream) gnome_object_corba_objref (GNOME_OBJECT (stream)), &ev);
+    Bonobo_PersistStream_load (persist,
+                             (Bonobo_Stream) bonobo_object_corba_objref (BONOBO_OBJECT (stream)),
+                              "application/pdf",
+                              &ev);
 
-    GNOME_Unknown_unref (persist, &ev);
+    Bonobo_Unknown_unref (persist, &ev);
     CORBA_Object_release (persist, &ev);
     CORBA_exception_free (&ev);
 
-/*    gnome_view_frame_view_do_verb (comp->view_frame, "ZoomFit"); */
+/*    bonobo_view_frame_view_do_verb (comp->view_frame, "ZoomFit"); */
     return TRUE;
   }
   
@@ -244,40 +234,72 @@ extern "C" {
   component_destroy (Component *component)
   {
     CORBA_Environment ev;
+    Container *container;
     g_return_if_fail (component != NULL);
 
     CORBA_exception_init (&ev);
-    
+
+    /* Kill merged menus et al. */
+    bonobo_view_frame_view_deactivate (component->view_frame);
+
+    container = component->container;
+    gtk_widget_destroy (container->view_widget);
+    container->view_widget = NULL;
+
     if (component->server)
-      GNOME_Unknown_unref (
-       gnome_object_corba_objref (GNOME_OBJECT (component->server)), &ev);
+      Bonobo_Unknown_unref (
+       bonobo_object_corba_objref (BONOBO_OBJECT (component->server)), &ev);
     component->server = NULL;
 
     CORBA_exception_free (&ev);
+
+    g_free (component);
   }
 
   static void
   container_destroy (Container *cont)
   {
+    g_return_if_fail (g_list_find (containers, cont) != NULL);
+
     containers = g_list_remove (containers, cont);
     if (cont->app)
       gtk_widget_destroy (cont->app);
+    cont->app = NULL;
     
     if (cont->component)
       component_destroy (cont->component);
     cont->component = NULL;
     
-    cont->app = NULL;
-    
     g_free (cont);
+
     if (!containers)
       gtk_main_quit ();
   }
+
+  static void
+  container_close (Container *cont)
+  {
+    g_return_if_fail (g_list_find (containers, cont) != NULL);
+    
+    if (cont->component) {
+      component_destroy (cont->component);
+      cont->component = NULL;
+    } else
+      container_destroy (cont);
+  }
+
   
   static void
   container_close_cmd (GtkWidget *widget, Container *cont)
+  {
+    container_close (cont);
+  }
+  
+  static int
+  container_destroy_cb (GtkWidget *widget, GdkEvent *event, Container *cont)
   {
     container_destroy (cont);
+    return 1;
   }
   
   static void
@@ -287,12 +309,10 @@ extern "C" {
       container_destroy ((Container *)containers->data);
   }
 
-
 static void
 container_about_cmd (GtkWidget *widget, Container *container)
 {
   GtkWidget *about;
-  int i;
 
   const gchar *authors[] = {
     N_("Derek B. Noonburg, main author"),
@@ -303,11 +323,13 @@ container_about_cmd (GtkWidget *widget, Container *container)
   };
   
 #ifdef ENABLE_NLS
+  int i;
+
   for (i = 0; authors[i] != NULL; i++)
     authors [i] = _(authors [i]);
 #endif
   
-  about = gnome_about_new (_("GPDF"), VERSION,
+  about = gnome_about_new (_("GPDF"), xpdfVersion,
                           _("(C) 1996-1999 Derek B. Noonburg."),
                           authors, NULL, NULL);
   
@@ -320,76 +342,68 @@ container_about_cmd (GtkWidget *widget, Container *container)
 static void
 container_set_view (Container *container, Component *component)
 {
-       GnomeViewFrame *view_frame;
+       BonoboViewFrame *view_frame;
        GtkWidget *view_widget;
 
        /*
         * Create the remote view and the local ViewFrame.
         */
-       view_frame = gnome_client_site_new_view (component->client_site);
+       view_frame = bonobo_client_site_new_view (component->client_site,
+                                                 bonobo_object_corba_objref (BONOBO_OBJECT (
+                                                         container->uih)));
        component->view_frame = view_frame;
 
-       /*
-        * Set the GnomeUIHandler for this ViewFrame.  That way, the
-        * embedded component can get access to our UIHandler server
-        * so that it can merge menu and toolbar items when it gets
-        * activated.
-        */
-       gnome_view_frame_set_ui_handler (view_frame, container->uih);
-
        /*
         * Embed the view frame into the application.
         */
-       view_widget = gnome_view_frame_get_wrapper (view_frame);
+       view_widget = bonobo_view_frame_get_wrapper (view_frame);
+       bonobo_wrapper_set_visibility (BONOBO_WRAPPER (view_widget), FALSE);
        container->view_widget = view_widget;
        container->component   = component;
 
-       /*
-        * Show the component.
-        */
-       gtk_scrolled_window_add_with_viewport (container->scroll, view_widget);
+       gtk_container_add (GTK_CONTAINER (container->slot), view_widget);
 
        /*
         * Activate it ( get it to merge menus etc. )
         */
-       gnome_view_frame_view_activate (view_frame);
+       bonobo_view_frame_view_activate (view_frame);
+       bonobo_view_frame_set_covered   (view_frame, FALSE);
 
-       gtk_widget_show_all (GTK_WIDGET (container->scroll));
+       gtk_widget_show_all (GTK_WIDGET (container->slot));
 }
 
-static GnomeObjectClient *
-container_launch_component (GnomeClientSite *client_site,
-                           GnomeContainer *container,
+static BonoboObjectClient *
+container_launch_component (BonoboClientSite *client_site,
+                           BonoboContainer *container,
                            char *component_goad_id)
 {
-       GnomeObjectClient *object_server;
+       BonoboObjectClient *object_server;
 
        /*
         * Launch the component.
         */
-       object_server = gnome_object_activate_with_goad_id (
-               NULL, component_goad_id, GOAD_ACTIVATE_SHLIB, NULL);
+       object_server = bonobo_object_activate (component_goad_id, 0);
 
        if (object_server == NULL)
                return NULL;
 
        /*
         * Bind it to the local ClientSite.  Every embedded component
-        * has a local GnomeClientSite object which serves as a
+        * has a local BonoboClientSite object which serves as a
         * container-side point of contact for the embeddable.  The
         * container talks to the embeddable through its ClientSite
         */
-       if (!gnome_client_site_bind_embeddable (client_site, object_server)) {
-               gnome_object_unref (GNOME_OBJECT (object_server));
+       if (!bonobo_client_site_bind_embeddable (client_site, object_server)) {
+               bonobo_object_unref (BONOBO_OBJECT (object_server));
                return NULL;
        }
 
        /*
-        * The GnomeContainer object maintains a list of the
+        * The BonoboContainer object maintains a list of the
         * ClientSites which it manages.  Here we add the new
         * ClientSite to that list.
         */
-       gnome_container_add (container, GNOME_OBJECT (client_site));
+       bonobo_container_add (container, BONOBO_OBJECT (client_site));
 
        return object_server;
 }
@@ -399,18 +413,18 @@ extern "C" {
   container_activate_component (Container *container, char *component_goad_id)
   {
     Component *component;
-    GnomeClientSite *client_site;
-    GnomeObjectClient *server;
+    BonoboClientSite *client_site;
+    BonoboObjectClient *server;
     
     /*
      * The ClientSite is the container-side point of contact for
      * the Embeddable.  So there is a one-to-one correspondence
-     * between GnomeClientSites and GnomeEmbeddables.  */
-    client_site = gnome_client_site_new (container->container);
+     * between BonoboClientSites and BonoboEmbeddables.  */
+    client_site = bonobo_client_site_new (container->container);
     
     /*
-     * A GnomeObjectClient is a simple wrapper for a remote
-     * GnomeObject (a server supporting GNOME::Unknown).
+     * A BonoboObjectClient is a simple wrapper for a remote
+     * BonoboObject (a server supporting Bonobo::Unknown).
      */
     server = container_launch_component (client_site, container->container,
                                         component_goad_id);
@@ -467,32 +481,33 @@ extern "C" {
       tmp_list = g_list_next (tmp_list);
     }
   }
-}
+
+}  
 
 static void
 container_create_menus (Container *container)
 {
-       GnomeUIHandlerMenuItem *menu_list;
+       BonoboUIHandlerMenuItem *menu_list;
 
-       gnome_ui_handler_create_menubar (container->uih);
+       bonobo_ui_handler_create_menubar (container->uih);
 
        /*
         * Create the basic menus out of UIInfo structures.
         */
-       menu_list = gnome_ui_handler_menu_parse_uiinfo_list_with_data (container_main_menu, container);
-       gnome_ui_handler_menu_add_list (container->uih, "/", menu_list);
-       gnome_ui_handler_menu_free_list (menu_list);
+       menu_list = bonobo_ui_handler_menu_parse_uiinfo_list_with_data (container_main_menu, container);
+       bonobo_ui_handler_menu_add_list (container->uih, "/", menu_list);
+       bonobo_ui_handler_menu_free_list (menu_list);
 }
 
 static void
 container_create_toolbar (Container *container)
 {
-       GnomeUIHandlerToolbarItem *toolbar;
+       BonoboUIHandlerToolbarItem *toolbar;
 
-       gnome_ui_handler_create_toolbar (container->uih, "pdf");
-       toolbar = gnome_ui_handler_toolbar_parse_uiinfo_list_with_data (container_toolbar, container);
-       gnome_ui_handler_toolbar_add_list (container->uih, "/pdf/", toolbar);
-       gnome_ui_handler_toolbar_free_list (toolbar);
+       bonobo_ui_handler_create_toolbar (container->uih, "pdf");
+       toolbar = bonobo_ui_handler_toolbar_parse_uiinfo_list_with_data (container_toolbar, container);
+       bonobo_ui_handler_toolbar_add_list (container->uih, "/pdf/", toolbar);
+       bonobo_ui_handler_toolbar_free_list (toolbar);
 }
 
 static Container *
@@ -507,8 +522,8 @@ container_new (const char *fname)
        
        container = g_new0 (Container, 1);
 
-       container->app  = gnome_app_new ("pdf-viewer",
-                                        "GNOME PDF viewer");
+       container->app = gnome_app_new ("pdf-viewer",
+                                       "GNOME PDF viewer");
 
        gtk_drag_dest_set (container->app,
                           GTK_DEST_DEFAULT_ALL,
@@ -517,40 +532,45 @@ container_new (const char *fname)
 
        gtk_signal_connect (GTK_OBJECT(container->app),
                            "drag_data_received",
-                           GTK_SIGNAL_FUNC(filenames_dropped), (gpointer)container);
+                           GTK_SIGNAL_FUNC(filenames_dropped),
+                           (gpointer)container);
 
        gtk_window_set_default_size (GTK_WINDOW (container->app), 600, 600);
        gtk_window_set_policy (GTK_WINDOW (container->app), TRUE, TRUE, FALSE);
 
-       container->container   = gnome_container_new ();
+       container->container   = bonobo_container_new ();
        container->view_widget = NULL;
-       container->scroll = GTK_SCROLLED_WINDOW (gtk_scrolled_window_new (NULL, NULL));
-       gtk_scrolled_window_set_policy (container->scroll, GTK_POLICY_AUTOMATIC,
-                                       GTK_POLICY_AUTOMATIC);
-       gnome_app_set_contents (GNOME_APP (container->app), GTK_WIDGET (container->scroll));
+       container->slot = gtk_event_box_new ();
+       gtk_widget_show (container->slot);
+
+       gnome_app_set_contents (GNOME_APP (container->app), GTK_WIDGET (container->slot));
+
+       gtk_object_set_data (GTK_OBJECT (container->app), "container_data", container);
+       gtk_signal_connect  (GTK_OBJECT (container->app), "delete_event",
+                            GTK_SIGNAL_FUNC (container_destroy_cb), container);
 
        /*
-        * Create the GnomeUIHandler object which will be used to
+        * Create the BonoboUIHandler object which will be used to
         * create the container's menus and toolbars.  The UIHandler
         * also creates a CORBA server which embedded components use
         * to do menu/toolbar merging.
         */
-       container->uih = gnome_ui_handler_new ();
-       gnome_ui_handler_set_app (container->uih, GNOME_APP (container->app));
+       container->uih = bonobo_ui_handler_new ();
+       bonobo_ui_handler_set_app (container->uih, GNOME_APP (container->app));
 
        container_create_menus   (container);
        container_create_toolbar (container);
 
        gtk_widget_show_all (container->app);
 
+       containers = g_list_append (containers, container);
+
        if (fname)
          if (!open_pdf (container, fname)) {
            container_destroy (container);
            return NULL;
          }
 
-       containers = g_list_append (containers, container);
-
        gtk_widget_show_all (container->app);
 
        return container;
@@ -561,20 +581,29 @@ main (int argc, char **argv)
 {
   CORBA_Environment ev;
   CORBA_ORB         orb;
-  char            **view_files = NULL;
+  const char      **view_files = NULL;
   gboolean          loaded;
   int               i;
   
   CORBA_exception_init (&ev);
   
+
+#if USING_OAF
+  gnomelib_register_popt_table (oaf_popt_options, "OAF");
+  gnome_init_with_popt_table("PDFViewer", "0.0.1",
+                            argc, argv,
+                            gpdf_popt_options, 0, &ctx); 
+  orb = oaf_init (argc, argv);
+#else
   gnome_CORBA_init_with_popt_table ("PDFViewer", "0.0.1",
                                    &argc, argv,
                                    gpdf_popt_options, 0, &ctx,
                                    GNORBA_INIT_SERVER_FUNC, &ev);
 
-  CORBA_exception_free (&ev);
-
   orb = gnome_CORBA_ORB ();
+#endif
+
+  CORBA_exception_free (&ev);
 
   if (bonobo_init (orb, NULL, NULL) == FALSE)
     g_error (_("Could not initialize Bonobo!\n"));
@@ -587,8 +616,11 @@ main (int argc, char **argv)
   loaded = FALSE;
   if (view_files) {
     for (i = 0; view_files[i]; i++)
-      if (container_new (view_files[i]))
+      if (container_new (view_files[i])) {
        loaded = TRUE;
+       while (gtk_events_pending ())
+         gtk_main_iteration ();
+      }
   }
   if ((i == 0) || !loaded)
     container_new (NULL);