Started to write a new EogImageViewer Control which uses the core EOG code

2000-10-14  Martin Baulig  <baulig@suse.de>

	Started to write a new EogImageViewer Control which uses
	the core EOG code to display images.

	* eog-image-viewer.[ch]: New files.
	* image-viewer-component.c: New file.
	* image-viewer-component.oafinfo: New file.
This commit is contained in:
Martin Baulig 2000-10-14 10:23:15 +00:00 committed by Martin Baulig
parent 81d55e6136
commit 3868dfd3bb
5 changed files with 673 additions and 0 deletions

9
bonobo/ChangeLog Normal file
View file

@ -0,0 +1,9 @@
2000-10-14 Martin Baulig <baulig@suse.de>
Started to write a new EogImageViewer Control which uses
the core EOG code to display images.
* eog-image-viewer.[ch]: New files.
* image-viewer-component.c: New file.
* image-viewer-component.oafinfo: New file.

445
bonobo/eog-image-viewer.c Normal file
View file

@ -0,0 +1,445 @@
/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*-
*
* EOG image viewer control the core eog code.
*
* Authors:
* Michael Meeks (mmeeks@gnu.org)
* Martin Baulig (baulig@suse.de)
*
* Copyright 2000, Helixcode Inc.
* Copyright 2000, Eazel, Inc.
* Copyright 2000, SuSE GmbH.
*/
#include <ui-image.h>
#include <image-view.h>
#include <gdk-pixbuf/gdk-pixbuf.h>
#include <gdk-pixbuf/gdk-pixbuf-loader.h>
#include <liboaf/liboaf.h>
#include <liboaf/oaf-mainloop.h>
#include "eog-image-viewer.h"
struct _EogImageViewerPrivate
{
BonoboControl *control;
BonoboZoomable *zoomable;
float zoom_level;
GtkWidget *ui_image;
GtkWidget *image_view;
GdkPixbuf *pixbuf;
};
/* Parent object class in GTK hierarchy */
static BonoboControlClass *eog_image_viewer_parent_class;
static void
eog_image_viewer_destroy (GtkObject *object)
{
EogImageViewer *image_viewer;
g_return_if_fail (object != NULL);
g_return_if_fail (EOG_IS_IMAGE_VIEWER (object));
image_viewer = EOG_IMAGE_VIEWER (object);
g_message ("eog_image_viewer_destroy: %p", image_viewer);
if (image_viewer->priv) {
if (image_viewer->priv->image_view)
gtk_widget_unref (image_viewer->priv->image_view);
image_viewer->priv->image_view = NULL;
if (image_viewer->priv->pixbuf)
gdk_pixbuf_unref (image_viewer->priv->pixbuf);
image_viewer->priv->pixbuf = NULL;
}
g_free (image_viewer->priv);
image_viewer->priv = NULL;
GTK_OBJECT_CLASS (eog_image_viewer_parent_class)->destroy (object);
}
static void
eog_image_viewer_class_init (EogImageViewerClass *klass)
{
GtkObjectClass *object_class = (GtkObjectClass *) klass;
eog_image_viewer_parent_class = gtk_type_class (bonobo_control_get_type ());
object_class->destroy = eog_image_viewer_destroy;
}
static void
eog_image_viewer_init (EogImageViewer *image_viewer)
{
image_viewer->priv = g_new0 (EogImageViewerPrivate, 1);
}
static void
zoomable_set_zoom_level_cb (BonoboZoomable *zoomable, float new_zoom_level,
EogImageViewer *image_viewer)
{
ImageView *view;
g_return_if_fail (image_viewer != NULL);
g_return_if_fail (EOG_IS_IMAGE_VIEWER (image_viewer));
g_message ("New zoom level: %5.2f", new_zoom_level);
view = IMAGE_VIEW (image_viewer->priv->image_view);
image_view_set_zoom (view, (double) new_zoom_level);
image_viewer->priv->zoom_level = image_view_get_zoom (view);
bonobo_zoomable_report_zoom_level_changed (zoomable,
image_viewer->priv->zoom_level);
g_message ("Done zooming to %5.2f", image_viewer->priv->zoom_level);
}
static float preferred_zoom_levels[] = {
1.0 / 10.0, 1.0 / 9.0, 1.0 / 8.0, 1.0 / 7.0, 1.0 / 6.0,
1.0 / 5.0, 1.0 / 4.0, 1.0 / 3.0, 1.0 / 2.0,
1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0, 9.0, 10.0
};
static const int max_preferred_zoom_levels = (sizeof (preferred_zoom_levels) / sizeof (float)) - 1;
static int
zoom_index_from_float (float zoom_level)
{
int i;
for (i = 0; i < max_preferred_zoom_levels; i++)
if (zoom_level < preferred_zoom_levels [i])
return i;
return max_preferred_zoom_levels;
}
static float
zoom_level_from_index (int index)
{
if (index > max_preferred_zoom_levels)
index = max_preferred_zoom_levels;
return preferred_zoom_levels [index];
}
static void
zoomable_zoom_in_cb (BonoboZoomable *zoomable, EogImageViewer *image_viewer)
{
float new_zoom_level;
int index;
g_return_if_fail (image_viewer != NULL);
g_return_if_fail (EOG_IS_IMAGE_VIEWER (image_viewer));
index = zoom_index_from_float (image_viewer->priv->zoom_level);
if (index == max_preferred_zoom_levels)
return;
index++;
new_zoom_level = zoom_level_from_index (index);
gtk_signal_emit_by_name (GTK_OBJECT (zoomable), "set_zoom_level", new_zoom_level);
}
static void
zoomable_zoom_out_cb (BonoboZoomable *zoomable, EogImageViewer *image_viewer)
{
float new_zoom_level;
int index;
g_return_if_fail (image_viewer != NULL);
g_return_if_fail (EOG_IS_IMAGE_VIEWER (image_viewer));
index = zoom_index_from_float (image_viewer->priv->zoom_level);
if (index == 0)
return;
index--;
new_zoom_level = zoom_level_from_index (index);
gtk_signal_emit_by_name (GTK_OBJECT (zoomable), "set_zoom_level", new_zoom_level);
}
static void
zoomable_zoom_to_fit_cb (BonoboZoomable *zoomable, EogImageViewer *image_viewer)
{
g_return_if_fail (image_viewer != NULL);
g_return_if_fail (EOG_IS_IMAGE_VIEWER (image_viewer));
}
static void
zoomable_zoom_to_default_cb (BonoboZoomable *zoomable, EogImageViewer *image_viewer)
{
g_return_if_fail (image_viewer != NULL);
g_return_if_fail (EOG_IS_IMAGE_VIEWER (image_viewer));
gtk_signal_emit_by_name (GTK_OBJECT (zoomable), "set_zoom_level", 1.0);
}
/**
* eog_image_viewer_get_type:
*
* Returns: The GtkType corresponding to the EogImageViewer class.
*/
GtkType
eog_image_viewer_get_type (void)
{
static GtkType type = 0;
if (!type){
GtkTypeInfo info = {
"EogImageViewer",
sizeof (EogImageViewer),
sizeof (EogImageViewerClass),
(GtkClassInitFunc) eog_image_viewer_class_init,
(GtkObjectInitFunc) eog_image_viewer_init,
NULL, /* reserved 1 */
NULL, /* reserved 2 */
(GtkClassInitFunc) NULL
};
type = gtk_type_unique (bonobo_control_get_type (), &info);
}
return type;
}
/*
* Loads an Image from a Bonobo_Stream
*/
static void
load_image_from_stream (BonoboPersistStream *ps, Bonobo_Stream stream,
Bonobo_Persist_ContentType type, void *data,
CORBA_Environment *ev)
{
EogImageViewer *image_viewer;
GdkPixbufLoader *loader = gdk_pixbuf_loader_new ();
Image *image;
Bonobo_Stream_iobuf *buffer;
CORBA_long len;
g_return_if_fail (data != NULL);
g_return_if_fail (EOG_IS_IMAGE_VIEWER (data));
image_viewer = EOG_IMAGE_VIEWER (data);
if (image_viewer->priv->pixbuf)
gdk_pixbuf_unref (image_viewer->priv->pixbuf);
image_viewer->priv->pixbuf = NULL;
do {
Bonobo_Stream_read (stream, 4096, &buffer, ev);
if (ev->_major != CORBA_NO_EXCEPTION)
goto exit_clean;
if (buffer->_buffer &&
!gdk_pixbuf_loader_write (loader,
buffer->_buffer,
buffer->_length)) {
CORBA_free (buffer);
if (ev->_major == CORBA_NO_EXCEPTION)
goto exit_clean;
else
goto exit_wrong_type;
}
len = buffer->_length;
CORBA_free (buffer);
} while (len > 0);
image_viewer->priv->pixbuf = gdk_pixbuf_loader_get_pixbuf (loader);
if (!image_viewer->priv->pixbuf)
goto exit_wrong_type;
gdk_pixbuf_ref (image_viewer->priv->pixbuf);
image = image_new ();
image_load_pixbuf (image, image_viewer->priv->pixbuf);
image_view_set_image (IMAGE_VIEW (image_viewer->priv->image_view), image);
goto exit_clean;
exit_wrong_type:
CORBA_exception_set (ev, CORBA_USER_EXCEPTION,
ex_Bonobo_Persist_WrongDataType, NULL);
exit_clean:
gdk_pixbuf_loader_close (loader);
gtk_object_unref (GTK_OBJECT (loader));
return;
}
/*
* Loads an Image from a Bonobo_File
*/
static gint
load_image_from_file (BonoboPersistFile *pf, const CORBA_char *filename, void *data)
{
EogImageViewer *image_viewer;
Image *image;
g_return_val_if_fail (data != NULL, -1);
g_return_val_if_fail (EOG_IS_IMAGE_VIEWER (data), -1);
image_viewer = EOG_IMAGE_VIEWER (data);
g_message ("load_image_from_file: `%s'", filename);
if (image_viewer->priv->pixbuf)
gdk_pixbuf_unref (image_viewer->priv->pixbuf);
image_viewer->priv->pixbuf = gdk_pixbuf_new_from_file (filename);
if (!image_viewer->priv->pixbuf)
return -1;
gdk_pixbuf_ref (image_viewer->priv->pixbuf);
image = image_new ();
image_load_pixbuf (image, image_viewer->priv->pixbuf);
image_view_set_image (IMAGE_VIEW (image_viewer->priv->image_view), image);
bonobo_zoomable_report_zoom_level_changed (image_viewer->priv->zoomable, 1.0);
return 0;
}
EogImageViewer *
eog_image_viewer_construct (EogImageViewer *image_viewer, Bonobo_Control corba_control)
{
CORBA_Environment ev;
BonoboControl *retval;
BonoboPersistStream *stream;
BonoboPersistFile *file;
gchar *ior;
g_return_val_if_fail (image_viewer != NULL, NULL);
g_return_val_if_fail (EOG_IS_IMAGE_VIEWER (image_viewer), NULL);
image_viewer->priv->ui_image = ui_image_new ();
image_viewer->priv->image_view = ui_image_get_image_view (UI_IMAGE (image_viewer->priv->ui_image));
gtk_widget_ref (image_viewer->priv->image_view);
gtk_widget_show (image_viewer->priv->ui_image);
CORBA_exception_init (&ev);
ior = CORBA_ORB_object_to_string (oaf_orb_get (), corba_control, &ev);
g_message ("Control IOR is `%s'", ior);
CORBA_exception_free (&ev);
/*
* Interface Bonobo::Zoomable
*/
image_viewer->priv->zoomable = bonobo_zoomable_new ();
if (image_viewer->priv->zoomable == NULL) {
gtk_object_unref (GTK_OBJECT (image_viewer));
return NULL;
}
gtk_signal_connect (GTK_OBJECT (image_viewer->priv->zoomable), "set_zoom_level",
GTK_SIGNAL_FUNC (zoomable_set_zoom_level_cb), image_viewer);
gtk_signal_connect (GTK_OBJECT (image_viewer->priv->zoomable), "zoom_in",
GTK_SIGNAL_FUNC (zoomable_zoom_in_cb), image_viewer);
gtk_signal_connect (GTK_OBJECT (image_viewer->priv->zoomable), "zoom_out",
GTK_SIGNAL_FUNC (zoomable_zoom_out_cb), image_viewer);
gtk_signal_connect (GTK_OBJECT (image_viewer->priv->zoomable), "zoom_to_fit",
GTK_SIGNAL_FUNC (zoomable_zoom_to_fit_cb), image_viewer);
gtk_signal_connect (GTK_OBJECT (image_viewer->priv->zoomable), "zoom_to_default",
GTK_SIGNAL_FUNC (zoomable_zoom_to_default_cb), image_viewer);
CORBA_exception_init (&ev);
ior = CORBA_ORB_object_to_string (oaf_orb_get (),
bonobo_object_corba_objref (BONOBO_OBJECT (image_viewer->priv->zoomable)), &ev);
g_message ("Zoomable IOR is `%s'", ior);
CORBA_exception_free (&ev);
image_viewer->priv->zoom_level = 1.0;
bonobo_zoomable_set_parameters (image_viewer->priv->zoomable,
image_viewer->priv->zoom_level,
preferred_zoom_levels [0],
preferred_zoom_levels [max_preferred_zoom_levels],
FALSE, FALSE, TRUE,
preferred_zoom_levels, max_preferred_zoom_levels + 1);
bonobo_object_add_interface (BONOBO_OBJECT (image_viewer),
BONOBO_OBJECT (image_viewer->priv->zoomable));
g_message ("Added zoomable interface");
/*
* Interface Bonobo::PersistStream
*/
stream = bonobo_persist_stream_new (load_image_from_stream,
NULL, NULL, NULL, image_viewer);
if (stream == NULL) {
gtk_object_unref (GTK_OBJECT (image_viewer));
return NULL;
}
bonobo_object_add_interface (BONOBO_OBJECT (image_viewer),
BONOBO_OBJECT (stream));
/*
* Interface Bonobo::PersistFile
*/
file = bonobo_persist_file_new (load_image_from_file, NULL, image_viewer);
if (file == NULL) {
gtk_object_unref (GTK_OBJECT (image_viewer));
return NULL;
}
bonobo_object_add_interface (BONOBO_OBJECT (image_viewer),
BONOBO_OBJECT (file));
/*
* Construct the BonoboControl.
*/
retval = bonobo_control_construct (BONOBO_CONTROL (image_viewer),
corba_control,
image_viewer->priv->ui_image);
g_message ("Successfully constructed the EogImageViewer %p", retval);
return EOG_IMAGE_VIEWER (retval);
}
/**
* eog_image_viewer_new:
*
* This function creates a new EogImageViewer.
*
* Returns: the newly created EogImageViewer.
*/
EogImageViewer *
eog_image_viewer_new (void)
{
Bonobo_Control corba_control;
EogImageViewer *image_viewer;
image_viewer = gtk_type_new (eog_image_viewer_get_type ());
corba_control = bonobo_control_corba_object_create (BONOBO_OBJECT (image_viewer));
if (corba_control == CORBA_OBJECT_NIL) {
bonobo_object_unref (BONOBO_OBJECT (image_viewer));
return NULL;
}
eog_image_viewer_construct (image_viewer, corba_control);
return image_viewer;
}

49
bonobo/eog-image-viewer.h Normal file
View file

@ -0,0 +1,49 @@
/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*-
*
* EOG image viewer control.
*
* Authors:
* Michael Meeks (mmeeks@gnu.org)
* Martin Baulig (baulig@suse.de)
*
* Copyright 2000, Helixcode Inc.
* Copyright 2000, Eazel, Inc.
* Copyright 2000, SuSE GmbH.
*/
#ifndef _EOG_IMAGE_VIEWER_H_
#define _EOG_IMAGE_VIEWER_H
#include <bonobo.h>
BEGIN_GNOME_DECLS
#define EOG_IMAGE_VIEWER_TYPE (eog_image_viewer_get_type ())
#define EOG_IMAGE_VIEWER(o) (GTK_CHECK_CAST ((o), EOG_IMAGE_VIEWER_TYPE, EogImageViewer))
#define EOG_IMAGE_VIEWER_CLASS(k) (GTK_CHECK_CLASS_CAST((k), EOG_IMAGE_VIEWER_TYPE, EogImageViewerClass))
#define EOG_IS_IMAGE_VIEWER(o) (GTK_CHECK_TYPE ((o), EOG_IMAGE_VIEWER_TYPE))
#define EOG_IS_IMAGE_VIEWER_CLASS(k) (GTK_CHECK_CLASS_TYPE ((k), EOG_IMAGE_VIEWER_TYPE))
typedef struct _EogImageViewer EogImageViewer;
typedef struct _EogImageViewerClass EogImageViewerClass;
typedef struct _EogImageViewerPrivate EogImageViewerPrivate;
struct _EogImageViewer {
BonoboControl control;
EogImageViewerPrivate *priv;
};
struct _EogImageViewerClass {
BonoboControlClass parent_class;
};
EogImageViewer *eog_image_viewer_new (void);
GtkType eog_image_viewer_get_type (void) G_GNUC_CONST;
EogImageViewer *eog_image_viewer_construct (EogImageViewer *image_viewer,
Bonobo_Control corba_control);
END_GNOME_DECLS
#endif _EOG_EOG_IMAGE_VIEWER

View file

@ -0,0 +1,130 @@
/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*-
*
* EOG image viewer using the core eog code.
*
* Authors:
* Michael Meeks (mmeeks@gnu.org)
* Martin Baulig (baulig@suse.de)
*
* TODO:
* Progressive loading.
* Do not display more than required
* Queue request-resize on image size change/load
* Save image
*
* Copyright 2000, Helixcode Inc.
* Copyright 2000, Eazel, Inc.
* Copyright 2000, SuSE GmbH.
*/
#include <config.h>
#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <errno.h>
#include <gnome.h>
#include <liboaf/liboaf.h>
#include <bonobo.h>
#include "eog-image-viewer.h"
/*
* Number of running objects
*/
static int running_objects = 0;
static BonoboGenericFactory *image_factory = NULL;
/*
* BonoboObject data
*/
typedef struct {
EogImageViewer *bonobo_object;
} bonobo_object_data_t;
static void
bod_destroy_cb (BonoboObject *object, bonobo_object_data_t *bod)
{
if (!bod)
return;
g_message ("bod_destroy_cb: %p", object);
g_free (bod);
running_objects--;
if (running_objects > 0)
return;
/*
* When last object has gone unref the factory & quit.
*/
bonobo_object_unref (BONOBO_OBJECT (image_factory));
gtk_main_quit ();
}
static BonoboObject *
eog_image_viewer_component_factory (BonoboGenericFactory *this, void *data)
{
bonobo_object_data_t *bod;
g_return_val_if_fail (this != NULL, NULL);
g_return_val_if_fail (this->goad_id != NULL, NULL);
bod = g_new0 (bonobo_object_data_t, 1);
bod->bonobo_object = eog_image_viewer_new ();
running_objects++;
gtk_signal_connect (GTK_OBJECT (bod->bonobo_object), "destroy",
GTK_SIGNAL_FUNC (bod_destroy_cb), bod);
return BONOBO_OBJECT (bod->bonobo_object);
}
static void
init_eog_image_viewer_component_factory (void)
{
image_factory = bonobo_generic_factory_new
("OAFIID:eog_image_viewer_component_factory:a5c88a13-9021-4f9e-b0c2-faa8a657c40c",
eog_image_viewer_component_factory, NULL);
}
static void
init_server_factory (int argc, char **argv)
{
CORBA_Environment ev;
CORBA_exception_init (&ev);
gnome_init_with_popt_table("bonobo-image-generic", VERSION,
argc, argv,
oaf_popt_options, 0, NULL);
oaf_init (argc, argv);
if (bonobo_init (CORBA_OBJECT_NIL, CORBA_OBJECT_NIL, CORBA_OBJECT_NIL) == FALSE)
g_error (_("I could not initialize Bonobo"));
CORBA_exception_free (&ev);
}
int
main (int argc, char *argv [])
{
GLogLevelFlags fatal_mask;
fatal_mask = g_log_set_always_fatal (G_LOG_FATAL_MASK);
fatal_mask |= G_LOG_LEVEL_WARNING | G_LOG_LEVEL_CRITICAL;
g_log_set_always_fatal (fatal_mask);
init_server_factory (argc, argv);
init_eog_image_viewer_component_factory ();
gtk_widget_set_default_colormap (gdk_rgb_get_cmap ());
gtk_widget_set_default_visual (gdk_rgb_get_visual ());
bonobo_main ();
return 0;
}

View file

@ -0,0 +1,40 @@
<oaf_info>
<oaf_server iid="OAFIID:eog_image_viewer_component_factory:a5c88a13-9021-4f9e-b0c2-faa8a657c40c" type="exe" location="eog-image-viewer-component">
<oaf_attribute name="repo_ids" type="stringv">
<item value="IDL:GNOME/GenericFactory:1.0"/>
</oaf_attribute>
<oaf_attribute name="name" type="string" value="EOG Image viewer factory"/>
<oaf_attribute name="description" type="string" value="EOG Image viewer factory"/>
</oaf_server>
<oaf_server iid="OAFIID:eog_image_viewer_component:0813c484-a035-4654-ae8d-ffec4cd54bd6" type="factory" location="OAFIID:eog_image_viewer_component_factory:a5c88a13-9021-4f9e-b0c2-faa8a657c40c">
<oaf_attribute name="repo_ids" type="stringv">
<item value="IDL:Bonobo/Control:1.0"/>
<item value="IDL:Bonobo/Unknown:1.0"/>
<item value="IDL:Bonobo/PersistStream:1.0"/>
<item value="IDL:Bonobo/Persist:1.0"/>
</oaf_attribute>
<oaf_attribute name="name" type="string" value="EOG Image Viewer component"/>
<oaf_attribute name="description" type="string" value="EOG Image Viewer component"/>
<oaf_attribute name="bonobo:editable" type="boolean" value="false"/>
<oaf_attribute name="bonobo:supported_mime_types" type="stringv">
<item value="image/gif"/>
<item value="image/jpeg"/>
<item value="image/png"/>
<item value="image/tiff"/>
<item value="image/x-bmp"/>
<item value="image/x-cmu-raster"/>
<item value="image/x-ico"/>
<item value="image/x-png"/>
<item value="image/x-portable-anymap"/>
<item value="image/x-portable-bitmap"/>
<item value="image/x-portable-graymap"/>
<item value="image/x-portable-pixmap"/>
<item value="image/x-xpixmap"/>
<item value="image/xpm"/>
</oaf_attribute>
<oaf_attribute name="nautilus:view_as_name" type="string" value="Image (EOG)"/>
</oaf_server>
</oaf_info>