Commit 0578eb4d authored by Javier Sánchez's avatar Javier Sánchez Committed by Felix Riemann

Bug 438642 - EOG should have a "fit to image width" zoom mode

Add the fit-to-width plugin by Javier Sánchez. It tries to set the zoom
so that the image width fits the window.
parent 11eb605e
2009-04-27 Felix Riemann <friemann@svn.gnome.org>
* configure.ac:
* plugins/fit-to-width/Makefile.am:
* plugins/fit-to-width/eog-fit-to-width-plugin.c:
* plugins/fit-to-width/eog-fit-to-width-plugin.h:
* plugins/fit-to-width/fit-to-width.eog-plugin.desktop.in:
Add fit-to-width plugin which tries to make the image width fit the
window. Fixes bug #438642 (Javier Sánchez).
2009-04-12 Felix Riemann <friemann@svn.gnome.org>
* configure.ac:
......
......@@ -58,9 +58,9 @@ EOG_HAS_PYTHON=1
AC_MSG_CHECKING([which plugins to build])
ALL_PLUGINS="postr champlain"
USEFUL_PLUGINS="postr champlain"
DEFAULT_PLUGINS="postr champlain"
ALL_PLUGINS="postr champlain fit-to-width"
USEFUL_PLUGINS="postr champlain fit-to-width"
DEFAULT_PLUGINS="postr champlain fit-to-width"
PYTHON_ALL_PLUGINS="slideshowshuffle pythonconsole"
PYTHON_USEFUL_PLUGINS="slideshowshuffle pythonconsole"
......@@ -327,6 +327,7 @@ AC_CONFIG_FILES([
Makefile
plugins/Makefile
plugins/champlain/Makefile
plugins/fit-to-width/Makefile
plugins/slideshowshuffle/Makefile
plugins/postr/Makefile
plugins/pythonconsole/Makefile
......
# Fit-to-width plugin
plugindir = $(libdir)/eog/plugins
INCLUDES = \
-I$(top_srcdir)/src \
$(EOG_CFLAGS) \
$(WARN_CFLAGS) \
-DEOG_LOCALEDIR=\""$(prefix)/$(DATADIRNAME)/locale"\"
plugin_LTLIBRARIES = libfit-to-width.la
libfit_to_width_la_SOURCES = \
eog-fit-to-width-plugin.h \
eog-fit-to-width-plugin.c
libfit_to_width_la_LDFLAGS = \
-avoid-version -module
libfit_to_width_la_LIBADD = $(EOG_LIBS)
# Plugin Info
plugin_in_files = fit-to-width.eog-plugin.desktop.in
%.eog-plugin: %.eog-plugin.desktop.in $(INTLTOOL_MERGE) $(wildcard $(top_srcdir)/po/*po) ; $(INTLTOOL_MERGE) $(top_srcdir)/po $< $@ -d -u -c $(top_builddir)/po/.intltool-merge-cache
plugin_DATA = $(plugin_in_files:.eog-plugin.desktop.in=.eog-plugin)
EXTRA_DIST = $(plugin_in_files)
CLEANFILES = $(plugin_DATA)
DISTCLEANFILES = $(plugin_DATA)
/* Fit-to-width -- Fit zoom to the image width
*
* Copyright (C) 2009 The Free Software Foundation
*
* Author: Javier Sánchez <jsanchez@deskblue.com>
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
*/
#ifdef HAVE_CONFIG_H
#include <config.h>
#endif
#include <glib/gi18n-lib.h>
#include <eog/eog-scroll-view.h>
#include <eog/eog-image.h>
#include "eog-fit-to-width-plugin.h"
#define WINDOW_DATA_KEY "EogFitToWidthWindowData"
EOG_PLUGIN_REGISTER_TYPE(EogFitToWidthPlugin, eog_fit_to_width_plugin)
typedef struct
{
GtkActionGroup *ui_action_group;
guint ui_menuitem_id;
} WindowData;
static void
fit_to_width_cb (GtkAction *action,
EogWindow *window)
{
GtkWidget *view;
EogImage *image;
gint image_width;
gint image_height;
gint view_width;
double zoom;
g_return_if_fail (EOG_IS_WINDOW (window));
view = eog_window_get_view (window);
image = eog_window_get_image (window);
g_return_if_fail (EOG_IS_SCROLL_VIEW (view));
g_return_if_fail (EOG_IS_IMAGE (image));
eog_image_get_size (image, &image_width, &image_height);
view_width = view->allocation.width;
// HACK: It's necessary subtract the width size (15) of vscrollbar
// to scrollview for obtain the display area.
zoom = (double) (view_width - 15) / image_width;
eog_scroll_view_set_zoom (EOG_SCROLL_VIEW (view), zoom);
}
static const gchar * const ui_definition =
"<ui><menubar name=\"MainMenu\">"
"<menu action=\"View\">"
"<menuitem action=\"EogPluginFitToWidth\"/>"
"</menu></menubar></ui>";
static const GtkActionEntry action_entries[] =
{
{ "EogPluginFitToWidth",
GTK_STOCK_ZOOM_FIT,
N_("Fit to width"),
NULL,
N_("Zoom to fit image width"),
G_CALLBACK (fit_to_width_cb) }
};
static void
free_window_data (WindowData *data)
{
g_return_if_fail (data != NULL);
g_object_unref (data->ui_action_group);
g_free (data);
}
static void
eog_fit_to_width_plugin_init (EogFitToWidthPlugin *plugin)
{
}
static void
eog_fit_to_width_plugin_finalize (GObject *object)
{
}
static void
impl_activate (EogPlugin *plugin,
EogWindow *window)
{
GtkUIManager *manager;
GList *action_groups;
WindowData *data;
manager = eog_window_get_ui_manager (window);
action_groups = gtk_ui_manager_get_action_groups (manager);
data = g_new (WindowData, 1);
data->ui_action_group = gtk_action_group_new ("EogFitToWidthPluginActions");
gtk_action_group_set_translation_domain (data->ui_action_group,
GETTEXT_PACKAGE);
gtk_action_group_add_actions (data->ui_action_group,
action_entries,
G_N_ELEMENTS (action_entries),
window);
gtk_ui_manager_insert_action_group (manager,
data->ui_action_group,
-1);
data->ui_menuitem_id = gtk_ui_manager_add_ui_from_string (manager,
ui_definition,
-1, NULL);
g_object_set_data_full (G_OBJECT (window),
WINDOW_DATA_KEY,
data,
(GDestroyNotify) free_window_data);
}
static void
impl_deactivate (EogPlugin *plugin,
EogWindow *window)
{
GtkUIManager *manager;
WindowData *data;
manager = eog_window_get_ui_manager (window);
data = (WindowData *) g_object_get_data (G_OBJECT (window),
WINDOW_DATA_KEY);
g_return_if_fail (data != NULL);
gtk_ui_manager_remove_ui (manager,
data->ui_menuitem_id);
gtk_ui_manager_remove_action_group (manager,
data->ui_action_group);
g_object_set_data (G_OBJECT (window),
WINDOW_DATA_KEY,
NULL);
}
static void
impl_update_ui (EogPlugin *plugin,
EogWindow *window)
{
}
static void
eog_fit_to_width_plugin_class_init (EogFitToWidthPluginClass *klass)
{
EogPluginClass *plugin_class = EOG_PLUGIN_CLASS (klass);
plugin_class->activate = impl_activate;
plugin_class->deactivate = impl_deactivate;
plugin_class->update_ui = impl_update_ui;
}
/* Fit-to-width -- Fit zoom to the image width
*
* Copyright (C) 2009 The Free Software Foundation
*
* Author: Javier Sánchez <jsanchez@deskblue.com>
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
*/
#ifndef __EOG_FIT_TO_WIDTH_PLUGIN_H__
#define __EOG_FIT_TO_WIDTH_PLUGIN_H__
#include <glib.h>
#include <glib-object.h>
#include <eog/eog-plugin.h>
G_BEGIN_DECLS
/*
* Type checking and casting macros
*/
#define EOG_TYPE_FIT_TO_WIDTH_PLUGIN (eog_fit_to_width_plugin_get_type ())
#define EOG_FIT_TO_WIDTH_PLUGIN(o) (G_TYPE_CHECK_INSTANCE_CAST ((o), EOG_TYPE_FIT_TO_WIDTH_PLUGIN, EogStatusbarDatePlugin))
#define EOG_FIT_TO_WIDTH_PLUGIN_CLASS(k) G_TYPE_CHECK_CLASS_CAST((k), EOG_TYPE_FIT_TO_WIDTH_PLUGIN, EogStatusbarDatePluginClass))
#define EOG_IS_FIT_TO_WIDTH_PLUGIN(o) (G_TYPE_CHECK_INSTANCE_TYPE ((o), EOG_TYPE_FIT_TO_WIDTH_PLUGIN))
#define EOG_IS_FIT_TO_WIDTH_PLUGIN_CLASS(k) (G_TYPE_CHECK_CLASS_TYPE ((k), EOG_TYPE_FIT_TO_WIDTH_PLUGIN))
#define EOG_FIT_TO_WIDTH_PLUGIN_GET_CLASS(o) (G_TYPE_INSTANCE_GET_CLASS ((o), EOG_TYPE_FIT_TO_WIDTH_PLUGIN, EogStatusbarDatePluginClass))
/* Private structure type */
typedef struct _EogFitToWidthPluginPrivate EogFitToWidthPluginPrivate;
/*
* Main object structure
*/
typedef struct _EogFitToWidthPlugin EogFitToWidthPlugin;
struct _EogFitToWidthPlugin
{
EogPlugin parent_instance;
};
/*
* Class definition
*/
typedef struct _EogFitToWidthPluginClass EogFitToWidthPluginClass;
struct _EogFitToWidthPluginClass
{
EogPluginClass parent_class;
};
/*
* Public methods
*/
GType eog_fit_to_width_plugin_get_type (void) G_GNUC_CONST;
/* All the plugins must implement this function */
G_MODULE_EXPORT GType register_eog_plugin (GTypeModule *module);
G_END_DECLS
#endif /* __EOG_FIT_TO_WIDTH_PLUGIN_H__ */
[Eog Plugin]
Module=fit-to-width
IAge=2
_Name=Zoom to fit image width
Icon=gtk-zoom-fit
_Description=Zoom to fit image width
Authors=Javier Sánchez <jsanchez@deskblue.com>
Copyright=Copyright © 2009 Javier Sánchez
Website=http://www.gnome.org/projects/eog
2009-04-27 Felix Riemann <friemann@svn.gnome.org>
* POTFILES.in: Add entries for fit-to-width plugin.
2009-04-20 Daniel Nylander <po@danielnylander.se>
* sv.po: Updated Swedish translation.
......
plugins/champlain/champlain.eog-plugin.desktop.in
plugins/fit-to-width/eog-fit-to-width-plugin.c
plugins/fit-to-width/fit-to-width.eog-plugin.desktop.in
plugins/slideshowshuffle/slideshowshuffle.eog-plugin.desktop.in
plugins/postr/postr.eog-plugin.desktop.in
plugins/postr/eog-postr-plugin.c
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment