Merge branch 'master' into ke-lua
authorKlaus Ethgen <Klaus@Ethgen.de>
Tue, 2 Oct 2012 21:19:13 +0000 (22:19 +0100)
committerKlaus Ethgen <Klaus@Ethgen.de>
Tue, 2 Oct 2012 21:23:24 +0000 (22:23 +0100)
* master: (185 commits)
  better fix for big-endian architectures
  Minor indentation fixes.
  Cleanup checker shader code.
  Fix exif orientation in clutter rendering mode.
  Silent 2 warnings using explicit type casting.
  Polish translation was updated, thanks to Grzegorz Gibas.
  Update pt_BR translation.
  Add *~, *.rej, *.orig files to git ignore list.
  Fix for support >=automake-1.11.4
  Trim trailing white spaces on empty lines.
  Trim trailing white spaces.
  Add missing vim modeline.
  Fix indentation and few trailing white spaces.
  Clear few more warnings, unused variables mostly.
  Drop unused variable.
  Remove commented out code.
  Remove commented out code.
  Remove commented out code.
  Remove commented out code.
  Remove commented out code.
  ...

configure.in
src/Makefile.am
src/filedata.c
src/glua.h [new file with mode: 0644]
src/image-overlay.c
src/lua.c [new file with mode: 0644]
src/main.c

index 59f88a1..c5b726c 100644 (file)
@@ -478,6 +478,33 @@ AM_CONDITIONAL(HAVE_LIBCHAMPLAIN_GTK, [test "x$HAVE_LIBCHAMPLAIN_GTK" = xyes])
 AC_SUBST(LIBCHAMPLAIN_GTK_CFLAGS)
 AC_SUBST(LIBCHAMPLAIN_GTK_LIBS)
 
+#  Lua support
+# ----------------------------------------------------------------------
+
+AC_ARG_ENABLE([lua],
+  AC_HELP_STRING([--disable-lua], [disable lua support]),
+    [liblua=$enableval], [liblua=auto])
+
+if test "x${liblua}" != "xno"; then
+  PKG_CHECK_MODULES(LUA, lua5.1 >= 5.1,
+    [
+      HAVE_LUA=yes
+      AC_DEFINE(HAVE_LUA, 1, [define to enable lua support])
+    ],
+    [
+      HAVE_LUA=no
+      AC_MSG_WARN([$LUA_PKG_ERRORS])
+    ])
+else
+  HAVE_LUA=disabled
+fi
+
+AM_CONDITIONAL(HAVE_LUA, [test "x$HAVE_LUA" = xyes])
+AC_SUBST(LUA_CFLAGS)
+AC_SUBST(LUA_LIBS)
+
+# ----------------------------------------------------------------------
+
 AH_TOP([
 /** \file
  * \short autogenerated definition by autoheader.
@@ -551,7 +578,7 @@ Flags:
   Gtk:           $GTK_CFLAGS
   Glib:          $GLIB_CFLAGS
   Thread:        $GTHREAD_LIBS
-  Others:       $JPEG_LIBS $TIFF_LIBS $LCMS_LIBS $EXIV2_LIBS $CLUTTER_LIBS $CLUTTER_GTK_LIBS $LIBCHAMPLAIN_LIBS $LIBCHAMPLAIN_GTK_LIBS
+  Others:       $JPEG_LIBS $TIFF_LIBS $LCMS_LIBS $EXIV2_LIBS $CLUTTER_LIBS $CLUTTER_GTK_LIBS $LIBCHAMPLAIN_LIBS $LIBCHAMPLAIN_GTK_LIBS $LUA_LIBS
 
 Localization:
   NLS support:   $USE_NLS
@@ -570,6 +597,7 @@ Support:
   Clutter:       $HAVE_CLUTTER
   Libchamplain:                $HAVE_LIBCHAMPLAIN
   Libchamplain-gtk:    $HAVE_LIBCHAMPLAIN_GTK
+  Lua:          $HAVE_LUA
 
 Documentation:
   Doxygen:       $DOXYGEN
index 329973c..02cfeec 100644 (file)
@@ -7,6 +7,7 @@ AM_CFLAGS =                             \
        $(EXIV2_CFLAGS)                 \
        $(LIBCHAMPLAIN_CFLAGS)          \
        $(LIBCHAMPLAIN_GTK_CFLAGS)      \
+       $(LUA_CFLAGS)                   \
        $(CLUTTER_CFLAGS)               \
        $(CLUTTER_GTK_CFLAGS)   \
        -I$(top_srcdir)                 \
@@ -19,6 +20,7 @@ AM_CXXFLAGS =                         \
        $(EXIV2_CFLAGS)                 \
        $(LIBCHAMPLAIN_CFLAGS)          \
        $(LIBCHAMPLAIN_GTK_CFLAGS)      \
+       $(LUA_CFLAGS)                   \
        $(CLUTTER_CFLAGS)               \
        $(CLUTTER_GTK_CFLAGS)   \
        -I$(top_srcdir)                 \
@@ -257,9 +259,10 @@ geeqie_SOURCES = \
        view_file_icon.c        \
        view_file_icon.h        \
        window.c        \
-       window.h
+       window.h        \
+       lua.c
 
-geeqie_LDADD = $(GTK_LIBS) $(GLIB_LIBS) $(INTLLIBS) $(JPEG_LIBS) $(TIFF_LIBS) $(LCMS_LIBS) $(EXIV2_LIBS) $(LIBCHAMPLAIN_LIBS) $(LIBCHAMPLAIN_GTK_LIBS) $(CLUTTER_LIBS) $(CLUTTER_GTK_LIBS)
+geeqie_LDADD = $(GTK_LIBS) $(GLIB_LIBS) $(INTLLIBS) $(JPEG_LIBS) $(TIFF_LIBS) $(LCMS_LIBS) $(EXIV2_LIBS) $(LIBCHAMPLAIN_LIBS) $(LIBCHAMPLAIN_GTK_LIBS) $(LUA_LIBS) $(CLUTTER_LIBS) $(CLUTTER_GTK_LIBS)
 
 EXTRA_DIST = \
        $(extra_SLIK)
index e0d70f0..4b7e70e 100644 (file)
@@ -2638,12 +2638,6 @@ GList *file_data_process_groups_in_selection(GList *list, gboolean ungroup, GLis
    implementation in view_file_list.c */
 
 
-typedef struct _NotifyIdleData NotifyIdleData;
-
-struct _NotifyIdleData {
-       FileData *fd;
-       NotifyType type;
-};
 
 
 typedef struct _NotifyData NotifyData;
@@ -2717,29 +2711,17 @@ gboolean file_data_unregister_notify_func(FileDataNotifyFunc func, gpointer data
 }
 
 
-gboolean file_data_send_notification_idle_cb(gpointer data)
+void file_data_send_notification(FileData *fd, NotifyType type)
 {
-       NotifyIdleData *nid = (NotifyIdleData *)data;
        GList *work = notify_func_list;
 
        while (work)
                {
                NotifyData *nd = (NotifyData *)work->data;
 
-               nd->func(nid->fd, nid->type, nd->data);
+               nd->func(fd, type, nd->data);
                work = work->next;
                }
-       file_data_unref(nid->fd);
-       g_free(nid);
-       return FALSE;
-}
-
-void file_data_send_notification(FileData *fd, NotifyType type)
-{
-       NotifyIdleData *nid = g_new0(NotifyIdleData, 1);
-       nid->fd = file_data_ref(fd);
-       nid->type = type;
-       g_idle_add_full(G_PRIORITY_HIGH, file_data_send_notification_idle_cb, nid, NULL);
 }
 
 static GHashTable *file_data_monitor_pool = NULL;
diff --git a/src/glua.h b/src/glua.h
new file mode 100644 (file)
index 0000000..410cfb6
--- /dev/null
@@ -0,0 +1,35 @@
+/** \file
+ * \short LUA implementation
+ * \author Klaus Ethgen <Klaus@Ethgen.de>
+ */
+
+/*
+ *  This file is a part of Geeqie project (http://geeqie.sourceforge.net/).
+ *  Copyright (C) 2008 - 2010 The Geeqie Team
+ *
+ *  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.
+ */
+
+#ifndef __GLUA_H
+#define __GLUA_H
+
+#ifdef HAVE_LUA
+
+#include <glib.h>
+#include "main.h"
+
+void lua_init(void);
+
+gchar *lua_callvalue(FileData *fd, const gchar *file, const gchar *function);
+
+#endif
+#endif
+/* vim: set shiftwidth=8 softtabstop=0 cindent cinoptions={1s: */
index 35451c5..10d8284 100644 (file)
@@ -25,6 +25,7 @@
 #include "pixbuf_util.h"
 #include "ui_fileops.h"
 #include "image-load.h"
+#include "glua.h"
 
 /*
  *----------------------------------------------------------------------------
@@ -318,6 +319,17 @@ static gchar *image_osd_mkinfo(const gchar *str, ImageWindow *imd, GHashTable *v
                        {
                        data = metadata_read_string(imd->image_fd, COMMENT_KEY, METADATA_PLAIN);
                        }
+#ifdef HAVE_LUA
+               else if (strncmp(name, "lua/", 4) == 0)
+                       {
+                       gchar *tmp;
+                       tmp = strchr(name+4, '/');
+                       if (!tmp)
+                               break;
+                       *tmp = '\0';
+                       data = lua_callvalue(imd->image_fd, name+4, tmp+1);
+                       }
+#endif
                else
                        {
                        data = g_strdup(g_hash_table_lookup(vars, name));
diff --git a/src/lua.c b/src/lua.c
new file mode 100644 (file)
index 0000000..84f3ff5
--- /dev/null
+++ b/src/lua.c
@@ -0,0 +1,277 @@
+/** \file
+ * \short LUA implementation
+ * \author Klaus Ethgen <Klaus@Ethgen.de>
+ */
+
+/*
+ *  This file is a part of Geeqie project (http://geeqie.sourceforge.net/).
+ *  Copyright (C) 2008 - 2010 The Geeqie Team
+ *
+ *  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.
+ */
+
+#include "config.h"
+
+#ifdef HAVE_LUA
+
+#define _XOPEN_SOURCE
+
+#include <lua.h>
+#include <lauxlib.h>
+#include <lualib.h>
+
+#include <stdio.h>
+#include <glib.h>
+#include <string.h>
+#include <time.h>
+
+#include "main.h"
+#include "glua.h"
+#include "ui_fileops.h"
+#include "exif.h"
+
+static lua_State *L; /** The LUA object needed for all operations (NOTE: That is
+                      * a upper-case variable to match the documentation!) */
+
+static FileData *lua_check_image(lua_State *L, int index)
+{
+       FileData **fd;
+       luaL_checktype(L, index, LUA_TUSERDATA);
+       fd = (FileData **)luaL_checkudata(L, index, "Image");
+       if (fd == NULL) luaL_typerror(L, index, "Image");
+       return *fd;
+}
+
+static int lua_image_get_exif(lua_State *L)
+{
+       FileData *fd;
+       ExifData *exif;
+       ExifData **exif_data;
+
+       fd = lua_check_image(L, 1);
+       exif = exif_read_fd(fd);
+
+       exif_data = (ExifData **)lua_newuserdata(L, sizeof(ExifData *));
+       luaL_getmetatable(L, "Exif");
+       lua_setmetatable(L, -2);
+
+       *exif_data = exif;
+
+       return 1;
+}
+
+static int lua_image_get_path(lua_State *L)
+{
+       FileData *fd;
+
+       fd = lua_check_image(L, 1);
+       lua_pushstring(L, fd->path);
+       return 1;
+}
+
+static int lua_image_get_name(lua_State *L)
+{
+       FileData *fd;
+
+       fd = lua_check_image(L, 1);
+       lua_pushstring(L, fd->name);
+       return 1;
+}
+
+static int lua_image_get_extension(lua_State *L)
+{
+       FileData *fd;
+
+       fd = lua_check_image(L, 1);
+       lua_pushstring(L, fd->extension);
+       return 1;
+}
+
+static int lua_image_get_date(lua_State *L)
+{
+       FileData *fd;
+
+       fd = lua_check_image(L, 1);
+       lua_pushnumber(L, fd->date);
+       return 1;
+}
+
+static int lua_image_get_size(lua_State *L)
+{
+       FileData *fd;
+
+       fd = lua_check_image(L, 1);
+       lua_pushnumber(L, fd->size);
+       return 1;
+}
+
+static ExifData *lua_check_exif(lua_State *L, int index)
+{
+       ExifData **exif;
+       luaL_checktype(L, index, LUA_TUSERDATA);
+       exif = (ExifData **)luaL_checkudata(L, index, "Exif");
+       if (exif == NULL) luaL_typerror(L, index, "Exif");
+       return *exif;
+}
+
+/* Interface for EXIF data */
+static int lua_exif_get_datum(lua_State *L)
+{
+       const gchar *key;
+       gchar *value = NULL;
+       ExifData *exif;
+       struct tm tm;
+       time_t datetime;
+
+       exif = lua_check_exif(L, 1);
+       key = luaL_checkstring(L, 2);
+       if (key == (gchar*)NULL || key[0] == '\0')
+               {
+               lua_pushnil(L);
+               return 1;
+               }
+       if (!exif)
+               {
+               lua_pushnil(L);
+               return 1;
+               }
+       value = exif_get_data_as_text(exif, key);
+       if (strcmp(key, "Exif.Photo.DateTimeOriginal") == 0)
+               {
+               memset(&tm, 0, sizeof(tm));
+               if (value && strptime(value, "%Y:%m:%d %H:%M:%S", &tm))
+                       {
+                       datetime = mktime(&tm);
+                       lua_pushnumber(L, datetime);
+                       return 1;
+                       }
+               else
+                       {
+                       lua_pushnil(L);
+                       return 1;
+                       }
+               } // if (strcmp(key, "Exif.Photo.Da...
+       lua_pushstring(L, value);
+       return 1;
+}
+
+/**
+ * \brief Initialize the lua interpreter.
+ */
+void lua_init(void)
+{
+       L = luaL_newstate();
+       luaL_openlibs(L); /* Open all libraries for lua programms */
+
+       /* Now create custom methodes to do something */
+       static const luaL_Reg meta_methods[] = {
+                       {NULL, NULL}
+       };
+
+       /* The Image metatable and methodes */
+       static const luaL_Reg image_methods[] = {
+                       {"get_path", lua_image_get_path},
+                       {"get_name", lua_image_get_name},
+                       {"get_extension", lua_image_get_extension},
+                       {"get_date", lua_image_get_date},
+                       {"get_size", lua_image_get_size},
+                       {"get_exif", lua_image_get_exif},
+                       {NULL, NULL}
+       };
+       luaL_register(L, "Image", image_methods);
+       luaL_newmetatable(L, "Image");
+       luaL_register(L, NULL, meta_methods);
+       lua_pushliteral(L, "__index");
+       lua_pushvalue(L, -3);
+       lua_settable(L, -3);
+       lua_pushliteral(L, "__metatable");
+       lua_pushvalue(L, -3);
+       lua_settable(L, -3);
+       lua_pop(L, 1);
+       lua_pop(L, 1);
+
+       /* The Exif table and methodes */
+       static const luaL_Reg exif_methods[] = {
+                       {"get_datum", lua_exif_get_datum},
+                       {NULL, NULL}
+       };
+       luaL_register(L, "Exif", exif_methods);
+       luaL_newmetatable(L, "Exif");
+       luaL_register(L, NULL, meta_methods);
+       lua_pushliteral(L, "__index");
+       lua_pushvalue(L, -3);
+       lua_settable(L, -3);
+       lua_pushliteral(L, "__metatable");
+       lua_pushvalue(L, -3);
+       lua_settable(L, -3);
+       lua_pop(L, 1);
+       lua_pop(L, 1);
+}
+
+/**
+ * \brief Call a lua function to get a single value.
+ */
+gchar *lua_callvalue(FileData *fd, const gchar *file, const gchar *function)
+{
+       gint result;
+       gchar *data = NULL;
+       gchar *dir;
+       gchar *path;
+       FileData **image_data;
+       gchar *tmp;
+       GError *error = NULL;
+
+       /* Collection Table (Dummy at the moment) */
+       lua_newtable(L);
+       lua_setglobal(L, "Collection");
+
+       /* Current Image */
+       image_data = (FileData **)lua_newuserdata(L, sizeof(FileData *));
+       luaL_getmetatable(L, "Image");
+       lua_setmetatable(L, -2);
+       lua_setglobal(L, "Image");
+
+       *image_data = fd;
+       if (file[0] == '\0')
+               {
+               result = luaL_dostring(L, function);
+               }
+       else
+               {
+               dir = g_build_filename(get_rc_dir(), "lua", NULL);
+               path = g_build_filename(dir, file, NULL);
+               result = luaL_dofile(L, path);
+               g_free(path);
+               g_free(dir);
+               }
+
+       if (result)
+               {
+               data = g_strdup_printf("Error running lua script: %s", lua_tostring(L, -1));
+               return data;
+               }
+       data = g_strdup(lua_tostring(L, -1));
+       tmp = g_locale_to_utf8(data, strlen(data), NULL, NULL, &error);
+       if (error)
+               {
+               log_printf("Error converting lua output from locale to UTF-8: %s\n", error->message);
+               g_error_free(error);
+               }
+       else
+               {
+               g_free(data);
+               data = g_strdup(tmp);
+               } // if (error) { ... } else
+       return data;
+}
+
+#endif
+/* vim: set shiftwidth=8 softtabstop=0 cindent cinoptions={1s: */
index d40416f..c56ab57 100644 (file)
@@ -46,6 +46,7 @@
 #include "exif.h"
 #include "histogram.h"
 #include "pixbuf_util.h"
+#include "glua.h"
 
 #ifdef HAVE_CLUTTER
 #include <clutter-gtk/clutter-gtk.h>
@@ -756,6 +757,10 @@ gint main(gint argc, gchar *argv[])
 
        exif_init();
 
+#ifdef HAVE_LUA
+       lua_init();
+#endif
+
        /* setup random seed for random slideshow */
        srand(time(NULL));