]> www.fi.muni.cz Git - evince.git/blob - pdf/xpdf/bonobo-image-x-pdf.cc
Fixup pdfto* programs,
[evince.git] / pdf / xpdf / bonobo-image-x-pdf.cc
1 /*
2  * image/x-pdf BonoboObject.
3  *
4  * Author:
5  *   Michael Meeks <michael@imaginator.com>
6  *
7  */
8 #include <stdio.h>
9 #include <stdlib.h>
10 #include <stddef.h>
11 #include <string.h>
12 #include <config.h>
13 extern "C" {
14 #define GString G_String
15 #include <gnome.h>
16 #include <libgnorba/gnorba.h>
17 #include <bonobo/gnome-bonobo.h>
18 #undef  GString 
19 }
20 #include "gtypes.h"
21 #include "GString.h"
22 #include "parseargs.h"
23 #include "gfile.h"
24 #include "gmem.h"
25 #include "Object.h"
26 #include "Stream.h"
27 #include "Array.h"
28 #include "Dict.h"
29 #include "XRef.h"
30 #include "Catalog.h"
31 #include "Page.h"
32 #include "Link.h"
33 #include "PDFDoc.h"
34 #include "GOutputDev.h"
35 #include "PSOutputDev.h"
36 #include "TextOutputDev.h"
37 #include "Params.h"
38 #include "Error.h"
39 #include "config.h"
40 #include "BonoboStream.h"
41
42 #define PDF_DEBUG 0
43
44 GBool printCommands = gFalse;
45
46 CORBA_Environment ev;
47 CORBA_ORB orb;
48
49 /*
50  * Number of servers running on the system
51  * when the count reaches zero, we unregister from the
52  * Name Server and we shut down.
53  */
54 static int embeddable_servers = 0;
55
56 /*
57  * Our embeddable factory
58  */
59 static GnomeEmbeddableFactory *factory;
60         
61
62 /*
63  * BonoboObject data
64  */
65 typedef struct {
66   GnomeEmbeddable *embeddable;
67
68   PDFDoc       *pdf;
69   GNOME_Stream  stream; /* To free it later */
70
71   GList *views;
72 } bed_t;
73
74 /*
75  * View data
76  */
77 typedef struct {
78   GnomeView            *view;
79   bed_t *bed;
80
81   double                scale;
82   GtkWidget            *drawing_area;
83   GdkPixmap            *pixmap;
84   GdkWindow            *win;
85   GOutputDev           *out;
86   GdkColor              paper;
87   gint                  w, h;
88   gdouble               zoom;
89   gint                  page;
90 } view_data_t;
91
92 extern "C" {
93   static void realize_drawing_areas (bed_t *bed);
94   static void setup_pixmap (bed_t *doc, view_data_t *view, GdkWindow *window);
95 }
96
97 static void
98 redraw_view (view_data_t *view_data, GdkRectangle *rect)
99 {
100   gint width, height;
101   bed_t *bed = view_data->bed;
102
103   g_return_if_fail (view_data->pixmap != NULL);
104
105   /*
106    * Do not draw outside the region that we know how to display
107    */
108   if (rect->x > view_data->w)
109     return;
110   
111   if (rect->y > view_data->h)
112     return;
113
114   /*
115    * Clip the draw region
116    */
117   if (rect->x + rect->width > view_data->w)
118     rect->width = view_data->w - rect->x;
119   
120   if (rect->y + rect->height > view_data->h)
121     rect->height = view_data->h - rect->y;
122   
123   /*
124    * Draw the exposed region.
125    */
126   gdk_draw_pixmap (view_data->drawing_area->window,
127                    view_data->drawing_area->style->white_gc,
128                    view_data->pixmap,
129                    rect->x, rect->y,
130                    rect->x, rect->y,
131                    rect->width,
132                    rect->height);
133 }
134
135 static void
136 render_page (view_data_t *view_data)
137 {
138   setup_pixmap (view_data->bed, view_data,
139                 view_data->win);
140   view_data->bed->pdf->displayPage(view_data->out,
141                                    view_data->page, view_data->zoom,
142                                    0, gTrue);
143 }
144
145 static void
146 redraw_view_all (view_data_t *view_data)
147 {
148   GdkRectangle rect;
149   g_return_if_fail (view_data != NULL);
150
151 #if PDF_DEBUG > 0
152   printf ("Redraw view of page %d\n", view_data->page);
153 #endif
154   render_page (view_data);
155   rect.x = 0;
156   rect.y = 0;
157   rect.width  = view_data->w;
158   rect.height = view_data->h;
159   redraw_view (view_data, &rect);
160   gtk_widget_queue_draw (GTK_WIDGET (view_data->drawing_area));
161 }
162
163 static void
164 configure_size (view_data_t *view_data)
165 {
166   gtk_widget_set_usize (
167     view_data->drawing_area,
168     view_data->w,
169     view_data->h);
170 }
171
172 static void
173 redraw_all (bed_t *bed)
174 {
175         GList *l;
176         
177         for (l = bed->views; l; l = l->next) {
178           GdkRectangle rect;
179           view_data_t *view_data = (view_data_t *)l->data;
180           configure_size (view_data);
181           redraw_view_all (view_data);
182         }
183 }
184
185 static int
186 save_image (GnomePersistStream *ps, GNOME_Stream stream, void *data)
187 {
188   g_warning ("Unimplemented");
189   return -1;
190 }
191
192 /*
193  * different size ?
194  */
195 static gboolean
196 setup_size (bed_t *doc, view_data_t *view)
197 {
198   int      w, h;
199   gboolean same;
200
201   if (!doc || !view || !doc->pdf) {
202     view->w = 320;
203     view->h = 200;
204     return FALSE;
205   }
206   w = (int)((doc->pdf->getPageWidth  (view->page) * view->zoom) / 72.0);
207   h = (int)((doc->pdf->getPageHeight (view->page) * view->zoom) / 72.0);
208   if (view->w == w && view->h == h)
209     same = TRUE;
210   else
211     same = FALSE;
212   view->w = w;
213   view->h = h;
214
215   return same;
216 }
217
218 /*
219  * Loads a PDF from a GNOME_Stream
220  */
221 static int
222 load_image_from_stream (GnomePersistStream *ps, GNOME_Stream stream, void *data)
223 {
224         bed_t *bed = (bed_t *)data;
225         CORBA_long length;
226         GNOME_Stream_iobuf *buffer;
227         guint lp;
228         #define CHUNK 512
229         FILE *hack;
230         char *name;
231         Object obj;
232
233         if (bed->pdf ||
234             bed->stream) {
235           g_warning ("Won't overwrite pre-existing stream: you wierdo");
236           return 0;
237         }
238
239         /* We need this for later */
240         CORBA_Object_duplicate (stream, &ev);
241         g_return_val_if_fail (ev._major == CORBA_NO_EXCEPTION, 0);
242
243 #if PDF_DEBUG > 0
244         printf ("Loading PDF from persiststream\n");
245 #endif
246         bed->stream = stream;
247         obj.initNull();
248         BonoboStream *bs = new BonoboStream (stream, 0, -1, &obj);
249         bed->pdf = new PDFDoc (bs);
250                                               
251 #if PDF_DEBUG > 0
252         printf ("Done load\n");
253 #endif
254         if (!(bed->pdf->isOk())) {
255           g_warning ("Duff pdf data\n");
256           delete bed->pdf;
257           bed->pdf = NULL;
258         }
259         if (!bed->pdf->getCatalog()) {
260           g_warning ("Duff pdf catalog\n");
261           delete bed->pdf;
262           bed->pdf = NULL;
263         }
264
265         realize_drawing_areas (bed);
266         redraw_all (bed);
267         return 0;
268 }
269
270 extern "C" {
271
272   static void
273   destroy_view (GnomeView *view, view_data_t *view_data)
274   {
275     view_data->bed->views = g_list_remove (view_data->bed->views, view_data);
276     gtk_object_unref (GTK_OBJECT (view_data->drawing_area));
277     
278     g_free (view_data);
279   }
280
281   static void
282   destroy_embed (GnomeView *view, bed_t *bed)
283   {
284     while (bed->views)
285       destroy_view (NULL, (view_data_t *)bed->views->data);
286
287     delete bed->pdf;
288     bed->pdf = NULL;
289     gtk_object_unref (GTK_OBJECT (bed->stream));
290     bed->stream = NULL;
291     g_free (bed);
292
293     embeddable_servers--;
294
295     if (embeddable_servers == 0){
296       gnome_object_unref (GNOME_OBJECT (factory));
297       gtk_main_quit ();
298     }
299   }
300
301   static void
302   setup_pixmap (bed_t *doc, view_data_t *view_data, GdkWindow *window)
303   {
304     GdkGCValues  gcValues;
305     GdkGC       *strokeGC;
306     PDFDoc      *pdf;
307     int          w, h;
308     GdkPixmap   *pixmap = NULL;
309     
310     g_return_if_fail (doc != NULL);
311     g_return_if_fail (doc->pdf != NULL);
312     g_return_if_fail (view_data != NULL);
313     
314     pdf = doc->pdf;
315
316     if (setup_size (doc, view_data) &&
317         view_data->pixmap) {
318 #if PDF_DEBUG > 0
319       printf ("No need to re-init output device\n");
320 #endif
321       return;
322     }
323
324     w = view_data->w;
325     h = view_data->h;
326
327     pixmap = gdk_pixmap_new (window, w, h, -1);
328     
329     gdk_color_white (gtk_widget_get_default_colormap(), &view_data->paper);
330     view_data->out = new GOutputDev (pixmap, view_data->paper, window);
331     
332     gdk_color_white (gtk_widget_get_default_colormap (), &gcValues.foreground);
333     gdk_color_black (gtk_widget_get_default_colormap (), &gcValues.background);
334     gcValues.line_width = 1;
335     gcValues.line_style = GDK_LINE_SOLID;
336     strokeGC = gdk_gc_new_with_values (
337       pixmap, &gcValues, 
338       (enum GdkGCValuesMask)(GDK_GC_FOREGROUND | GDK_GC_BACKGROUND | GDK_GC_LINE_WIDTH | GDK_GC_LINE_STYLE));
339     
340     gdk_draw_rectangle (pixmap, strokeGC,
341                         TRUE, 0, 0,
342                         w, h);
343     
344     view_data->pixmap = pixmap;
345   }
346
347   static gboolean
348   view_is_good (view_data_t *view_data)
349   {
350     if (!view_data ||
351         !view_data->bed ||
352         !view_data->bed->pdf)
353       return FALSE;
354
355     return TRUE;
356   }
357
358   static gboolean
359   first_page (view_data_t *view_data)
360   {
361     g_return_val_if_fail (view_is_good (view_data), FALSE);
362     if (view_data->page != 1) {
363       view_data->page = 1;
364       return TRUE;
365     } else
366       return FALSE;
367   }
368
369   static gboolean
370   last_page (view_data_t *view_data)
371   {
372     g_return_val_if_fail (view_is_good (view_data), FALSE);
373     if (view_data->page < view_data->bed->pdf->getNumPages()) {
374       view_data->page = view_data->bed->pdf->getNumPages();
375       return TRUE;
376     } else
377       return FALSE;
378   }
379
380   static gboolean
381   next_page (view_data_t *view_data)
382   {
383     g_return_val_if_fail (view_is_good (view_data), FALSE);
384     if (view_data->page < view_data->bed->pdf->getNumPages()) {
385       view_data->page++;
386       return TRUE;
387     } else
388       return FALSE;
389   }
390
391   static gboolean
392   prev_page (view_data_t *view_data)
393   {
394     g_return_val_if_fail (view_is_good (view_data), FALSE);
395     if (view_data->page > 1) {
396       view_data->page--;
397       return TRUE;
398     } else
399       return FALSE;
400   }
401
402   static void
403   page_first_cb (GnomeUIHandler *uih, void *data, char *path)
404   {
405     first_page ((view_data_t *)data);
406     redraw_view_all ((view_data_t *)data);
407   }
408   
409   static void
410   page_next_cb  (GnomeUIHandler *uih, void *data, char *path)
411   {
412     next_page ((view_data_t *)data);
413     redraw_view_all ((view_data_t *)data);
414   }
415   
416   static void
417   page_prev_cb  (GnomeUIHandler *uih, void *data, char *path)
418   {
419     prev_page ((view_data_t *)data);
420     redraw_view_all ((view_data_t *)data);
421   }
422
423   static void
424   page_last_cb  (GnomeUIHandler *uih, void *data, char *path)
425   {
426     last_page ((view_data_t *)data);
427     redraw_view_all ((view_data_t *)data);
428   }
429 }
430
431 static void
432 view_create_menus (view_data_t *view_data)
433 {
434   GNOME_UIHandler remote_uih;
435   GnomeView *view = view_data->view;
436   GnomeUIHandler *uih;
437   
438   uih = gnome_view_get_ui_handler (view);
439   remote_uih = gnome_view_get_remote_ui_handler (view);
440   
441   if (remote_uih == CORBA_OBJECT_NIL) {
442     g_warning ("server has no UI hander");
443     return;
444   }
445   
446   gnome_ui_handler_set_container (uih, remote_uih);
447
448   gnome_ui_handler_menu_new_subtree (uih, "/Page",
449                                      N_("Page..."),
450                                      N_("Set the currently displayed page"),
451                                      1,
452                                      GNOME_UI_HANDLER_PIXMAP_NONE, NULL,
453                                      0, (GdkModifierType)0);
454
455   gnome_ui_handler_menu_new_item (uih, "/Page/First",
456                                   N_("First"), N_("View the first page"), -1,
457                                   GNOME_UI_HANDLER_PIXMAP_NONE, NULL, 0,
458                                   (GdkModifierType)0, page_first_cb, (gpointer)view_data);
459                                  
460   gnome_ui_handler_menu_new_item (uih, "/Page/Prev",
461                                   N_("Previous"), N_("View the previous page"), -1,
462                                   GNOME_UI_HANDLER_PIXMAP_NONE, NULL, 0,
463                                   (GdkModifierType)0, page_prev_cb, (gpointer)view_data);
464                                  
465   gnome_ui_handler_menu_new_item (uih, "/Page/Next",
466                                   N_("Next"), N_("View the next page"), -1,
467                                   GNOME_UI_HANDLER_PIXMAP_NONE, NULL, 0,
468                                   (GdkModifierType)0, page_next_cb, (gpointer)view_data);
469                                  
470   gnome_ui_handler_menu_new_item (uih, "/Page/Last",
471                                   N_("Last"), N_("View the last page"), -1,
472                                   GNOME_UI_HANDLER_PIXMAP_NONE, NULL, 0,
473                                   (GdkModifierType)0, page_last_cb, (gpointer)view_data);
474
475   gnome_ui_handler_toolbar_new_item (uih, "/First", 
476                                      N_("First"), N_("View the first page"), -1,
477                                      GNOME_UI_HANDLER_PIXMAP_STOCK, GNOME_STOCK_PIXMAP_FIRST,
478                                      0, (GdkModifierType)0, page_first_cb, (gpointer)view_data);
479   gnome_ui_handler_toolbar_new_item (uih, "/Prev",
480                                      N_("Previous"), N_("View the previous page"), -1,
481                                      GNOME_UI_HANDLER_PIXMAP_STOCK, GNOME_STOCK_PIXMAP_FIRST,
482                                      0, (GdkModifierType)0, page_prev_cb, (gpointer)view_data);
483   gnome_ui_handler_toolbar_new_item (uih, "/Next",
484                                      N_("Next"), N_("View the next page"), -1,
485                                      GNOME_UI_HANDLER_PIXMAP_STOCK, GNOME_STOCK_PIXMAP_FIRST,
486                                      0, (GdkModifierType)0, page_next_cb, (gpointer)view_data);
487   gnome_ui_handler_toolbar_new_item (uih, "/Last",
488                                      N_("Last"), N_("View the last page"), -1,
489                                      GNOME_UI_HANDLER_PIXMAP_STOCK, GNOME_STOCK_PIXMAP_FIRST,
490                                      0, (GdkModifierType)0, page_last_cb, (gpointer)view_data);
491 }
492
493 /*
494  * When this view is deactivated, we must remove our menu items.
495  */
496 static void
497 view_remove_menus (view_data_t *view_data)
498 {
499         GnomeView *view = view_data->view;
500         GnomeUIHandler *uih;
501
502         uih = gnome_view_get_ui_handler (view);
503
504         gnome_ui_handler_unset_container (uih);
505 }
506
507 extern "C" {
508
509   static void
510   drawing_area_realize (GtkWidget *drawing_area, view_data_t *view_data)
511   {
512     g_return_if_fail (view_data != NULL);
513     g_return_if_fail (drawing_area != NULL);
514
515     view_data->win = gtk_widget_get_parent_window (drawing_area);
516   }
517
518   static int
519   drawing_area_exposed (GtkWidget *widget, GdkEventExpose *event, view_data_t *view_data)
520   {
521     if (!view_data ||
522         !view_data->bed->pdf)
523       return TRUE;
524     
525     redraw_view (view_data, &event->area);
526     
527     return TRUE;
528   }
529
530   static void
531   view_activate (GnomeView *view, gboolean activate, gpointer data)
532   {
533     view_data_t *view_data = (view_data_t *) data;
534     g_return_if_fail (view != NULL);
535     g_return_if_fail (view_data != NULL);
536     
537     gnome_view_activate_notify (view, activate);
538     
539 #if PDF_DEBUG > 0
540     printf ("View change activation to %d\n", activate);
541 #endif
542     /*
543      * If we were just activated, we merge in our menu entries.
544      * If we were just deactivated, we remove them.
545      */
546     if (activate)
547       view_create_menus (view_data);
548     else
549       view_remove_menus (view_data);
550   }
551
552   static void
553   view_size_query (GnomeView *view, int *desired_width, int *desired_height,
554                    gpointer data)
555   {
556     view_data_t *view_data = (view_data_t *) data;
557     
558     g_return_if_fail (view_data != NULL);
559
560     *desired_width  = view_data->w;
561     *desired_height = view_data->h;
562   }
563
564   static void
565   view_zoom_query (GnomeView *view, gdouble new_zoom, gpointer data)
566   {
567     view_data_t *view_data = (view_data_t *) data;
568
569     g_return_if_fail (view_data != NULL);
570
571     view_data->zoom = new_zoom;
572
573     redraw_view_all (view_data);
574   }
575
576   static void
577   realize_drawing_areas (bed_t *bed)
578   {
579     GList *l;
580     
581     for (l = bed->views; l; l = l->next) {
582       view_data_t *view_data = (view_data_t *)l->data;
583       g_return_if_fail (view_data->win);
584       render_page (view_data);
585       configure_size (view_data);
586     }  
587   }
588
589   static void
590   view_switch_page (GnomeView *view, const char *verb_name, void *user_data)
591   {
592     view_data_t  *view_data = (view_data_t *) user_data;
593     GdkRectangle  rect;
594     gboolean      changed = FALSE;
595
596     if (!g_strcasecmp (verb_name, "firstpage")) {
597       changed = first_page (view_data);
598     } else if (!g_strcasecmp (verb_name, "prevpage")) {
599       changed = prev_page (view_data);
600     } else if (!g_strcasecmp (verb_name, "nextpage")) {
601       changed = next_page (view_data);
602     } else if (!g_strcasecmp (verb_name, "lastpage")) {
603       changed = last_page (view_data);
604     } else
605       g_warning ("Unknown verb");
606
607     if (changed) {
608       render_page (view_data);
609       redraw_view (view_data, &rect);
610       gtk_widget_queue_draw (GTK_WIDGET (view_data->drawing_area));
611     }
612   }
613 }
614
615 static GnomeView *
616 view_factory (GnomeEmbeddable *embeddable,
617               const GNOME_ViewFrame view_frame,
618               void *data)
619 {
620         GnomeView *view;
621         GnomeUIHandler *uih;
622         bed_t *bed = (bed_t *)data;
623         view_data_t *view_data = g_new (view_data_t, 1);
624
625 #if PDF_DEBUG > 0
626         printf ("Created new bonobo object view %p\n", view_data);
627 #endif
628         
629         view_data->scale  = 1.0;
630         view_data->bed    = bed;
631         view_data->drawing_area = gtk_drawing_area_new ();
632         view_data->pixmap = NULL;
633         view_data->win    = NULL;
634         view_data->out    = NULL;
635         view_data->w      = 320;
636         view_data->h      = 320;
637         view_data->zoom   = 43.0; /* 86.0; Must be small for demos :-) */
638         view_data->page   = 1;
639
640         gtk_signal_connect (
641                 GTK_OBJECT (view_data->drawing_area),
642                 "realize",
643                 GTK_SIGNAL_FUNC (drawing_area_realize), view_data);
644
645         gtk_signal_connect (
646                 GTK_OBJECT (view_data->drawing_area),
647                 "expose_event",
648                 GTK_SIGNAL_FUNC (drawing_area_exposed), view_data);
649
650         gtk_widget_show (view_data->drawing_area);
651
652         setup_size (bed, view_data);
653
654         view = gnome_view_new (view_data->drawing_area);
655         view_data->view = view;
656
657         gtk_signal_connect (
658                 GTK_OBJECT (view), "destroy",
659                 GTK_SIGNAL_FUNC (destroy_view), view_data);
660
661         /* UI handling */
662         uih = gnome_ui_handler_new ();
663         gnome_view_set_ui_handler (view, uih);
664
665         gtk_signal_connect (GTK_OBJECT (view), "view_activate",
666                             GTK_SIGNAL_FUNC (view_activate), view_data);
667
668         gtk_signal_connect (GTK_OBJECT (view), "size_query",
669                             GTK_SIGNAL_FUNC (view_size_query), view_data);
670
671         gtk_signal_connect (GTK_OBJECT (view), "set_zoom_factor",
672                             GTK_SIGNAL_FUNC (view_zoom_query), view_data);
673
674         bed->views = g_list_prepend (bed->views, view_data);
675
676         /* Verb handling */
677         gnome_view_register_verb (view, "FirstPage",
678                                   view_switch_page, view_data);
679         gnome_view_register_verb (view, "PrevPage",
680                                   view_switch_page, view_data);
681         gnome_view_register_verb (view, "NextPage",
682                                   view_switch_page, view_data);
683         gnome_view_register_verb (view, "LastPage",
684                                   view_switch_page, view_data);
685
686         return view;
687 }
688
689 static GnomeObject *
690 embeddable_factory (GnomeEmbeddableFactory *This, void *data)
691 {
692         GnomeEmbeddable *embeddable;
693         GnomePersistStream *stream;
694         bed_t *bed = (bed_t *)data;
695
696         bed = g_new0 (bed_t, 1);
697         if (!bed)
698                 return NULL;
699
700 #if PDF_DEBUG > 0
701         printf ("Created new bonobo object %p\n", bed);
702 #endif
703         /*
704          * Creates the BonoboObject server
705          */
706         embeddable = gnome_embeddable_new (view_factory, bed);
707         if (embeddable == NULL){
708                 g_free (bed);
709                 return NULL;
710         }
711
712         bed->pdf = NULL;
713
714         /*
715          * Interface GNOME::PersistStream 
716          */
717         stream = gnome_persist_stream_new ("bonobo-object:image-x-pdf",
718                                            load_image_from_stream,
719                                            save_image,
720                                            bed);
721         if (stream == NULL) {
722                 gtk_object_unref (GTK_OBJECT (embeddable));
723                 g_free (bed);
724                 return NULL;
725         }
726
727         bed->embeddable = embeddable;
728
729         /*
730          * Bind the interfaces
731          */
732         gnome_object_add_interface (GNOME_OBJECT (embeddable),
733                                     GNOME_OBJECT (stream));
734         gtk_signal_connect (
735           GTK_OBJECT (embeddable), "destroy",
736           GTK_SIGNAL_FUNC (destroy_embed), bed);
737
738         embeddable_servers++;
739
740         /* Setup some verbs */
741         gnome_embeddable_add_verb (embeddable,
742                                    "FirstPage",
743                                    _("_First page"),
744                                    _("goto the first page"));
745         gnome_embeddable_add_verb (embeddable,
746                                    "PrevPage",
747                                    _("_Previous page"),
748                                    _("goto the previous page"));
749         gnome_embeddable_add_verb (embeddable,
750                                    "NextPage",
751                                    _("_Next page"),
752                                    _("goto the next page"));
753         gnome_embeddable_add_verb (embeddable,
754                                    "LastPage",
755                                    _("_Last page"),
756                                    _("goto the last page"));
757         
758         return (GnomeObject *) embeddable;
759 }
760
761 static gboolean
762 init_bonobo_image_x_pdf_factory (void)
763 {
764         factory = gnome_embeddable_factory_new (
765                 "bonobo-object-factory:image-x-pdf",
766                 embeddable_factory, NULL);
767
768         if (factory == NULL)
769                 return FALSE;
770         else
771                 return TRUE;
772 }
773
774 static void
775 init_server_factory (int argc, char **argv)
776 {
777         gnome_CORBA_init_with_popt_table (
778                 "bonobo-image-x-pdf", "1.0",
779                 &argc, argv, NULL, 0, NULL, GNORBA_INIT_SERVER_FUNC, &ev);
780
781         if (bonobo_init (CORBA_OBJECT_NIL, CORBA_OBJECT_NIL, CORBA_OBJECT_NIL) == FALSE)
782                 g_error (_("I could not initialize Bonobo"));
783 }
784
785 int
786 main (int argc, char *argv [])
787 {
788   CORBA_exception_init (&ev);
789   
790   init_server_factory (argc, argv);
791   if (!init_bonobo_image_x_pdf_factory ()){
792     fprintf (stderr, "Could not initialize the Bonobo PDF factory\n"
793                      "probably a server is already running?");
794     exit (1);
795   }
796   
797   errorInit();
798   
799   initParams (xpdfConfigFile); /* Init font path */
800   
801   gtk_widget_set_default_colormap (gdk_rgb_get_cmap ());
802   gtk_widget_set_default_visual (gdk_rgb_get_visual ());
803
804   bonobo_main ();
805   
806   CORBA_exception_free (&ev);
807   
808   return 0;
809 }