X-Git-Url: https://www.fi.muni.cz/~kas/git//home/kas/public_html/git/?a=blobdiff_plain;f=pdf%2Fxpdf%2Fgpdf.cc;h=a06d604717461c1a67026f8cb3651ff62bb5ad02;hb=81ddcb9f5621eb2efe2194f6ca94468acc61da2e;hp=820dc0362f09d0f1359f208fdfe2babb7749abd0;hpb=fb8be3e5fde722e1dc3e4e09b73b33e7a1b72da1;p=evince.git diff --git a/pdf/xpdf/gpdf.cc b/pdf/xpdf/gpdf.cc index 820dc036..a06d6047 100644 --- a/pdf/xpdf/gpdf.cc +++ b/pdf/xpdf/gpdf.cc @@ -12,34 +12,20 @@ extern "C" { #define GString G_String #include + +#if USING_OAF +#include +#else #include +#endif + #include #include -#include +#include #undef GString } -#include -#include -#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 +41,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 +53,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 +108,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 +148,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 +235,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 +310,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 +324,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,124 +343,89 @@ 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; } -/* - * Use query_interface to see if `obj' has `interface'. - */ -static gboolean -gnome_object_has_interface (GnomeObject *obj, char *interface) -{ - CORBA_Environment ev; - CORBA_Object requested_interface; - - CORBA_exception_init (&ev); - - requested_interface = GNOME_Unknown_query_interface ( - gnome_object_corba_objref (obj), interface, &ev); - - CORBA_exception_free (&ev); - - if (!CORBA_Object_is_nil(requested_interface, &ev) && - ev._major == CORBA_NO_EXCEPTION) - { - /* Get rid of the interface we've been passed */ - CORBA_Object_release (requested_interface, &ev); - return TRUE; - } - - return FALSE; -} - extern "C" { static Component * 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); @@ -494,32 +482,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, "/", 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 * @@ -534,8 +523,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, @@ -544,40 +533,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; @@ -588,20 +582,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")); @@ -614,8 +617,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);