[maemo-commits] [maemo-commits] r8892 - in projects/haf/branches/maemo-af-desktop/hildon-desktop: . src

From: subversion at stage.maemo.org subversion at stage.maemo.org
Date: Fri Dec 29 16:19:05 EET 2006
Author: lucasr
Date: 2006-12-29 16:19:03 +0200 (Fri, 29 Dec 2006)
New Revision: 8892

Added:
   projects/haf/branches/maemo-af-desktop/hildon-desktop/src/hd-plugin-loader-python.c
   projects/haf/branches/maemo-af-desktop/hildon-desktop/src/hd-plugin-loader-python.h
Modified:
   projects/haf/branches/maemo-af-desktop/hildon-desktop/ChangeLog
   projects/haf/branches/maemo-af-desktop/hildon-desktop/configure.ac
   projects/haf/branches/maemo-af-desktop/hildon-desktop/src/Makefile.am
   projects/haf/branches/maemo-af-desktop/hildon-desktop/src/hd-plugin-loader-factory.c
   projects/haf/branches/maemo-af-desktop/hildon-desktop/src/hd-plugin-loader-factory.h
   projects/haf/branches/maemo-af-desktop/hildon-desktop/src/main.c
Log:
2006-12-29  Lucas Rocha  <lucas.rocha at nokia.com>

	Support for python plugins.

	* src/hd-plugin-loader-factory.[ch]: plugin loader for python plugins.
	* src/hd-plugin-loader-factory.[cg]: added python plugin loader.
	* src/Makefile.am: update to get new files into the build process.
	* configure.ac: complete reorganization and python checks added. 


Modified: projects/haf/branches/maemo-af-desktop/hildon-desktop/ChangeLog
===================================================================
--- projects/haf/branches/maemo-af-desktop/hildon-desktop/ChangeLog	2006-12-29 13:29:33 UTC (rev 8891)
+++ projects/haf/branches/maemo-af-desktop/hildon-desktop/ChangeLog	2006-12-29 14:19:03 UTC (rev 8892)
@@ -1,7 +1,15 @@
+2006-12-29  Lucas Rocha  <lucas.rocha at nokia.com>
+
+	Support for python plugins.
+
+	* src/hd-plugin-loader-factory.[ch]: plugin loader for python plugins.
+	* src/hd-plugin-loader-factory.[cg]: added python plugin loader.
+	* src/Makefile.am: update to get new files into the build process.
+	* configure.ac: complete reorganization and python checks added. 
+
 2006-12-29  Johan Bilien  <johan.bilien at nokia.com>
 
-	* src/hd-home-background-dialog.[ch]:
-	- added
+	* src/hd-home-background-dialog.[ch]: added
 	- import and large rewrite from maemo-af-desktop
 	* background-manager/Makefile.am: Add object remote
 	object definition to the exported header

Modified: projects/haf/branches/maemo-af-desktop/hildon-desktop/configure.ac
===================================================================
--- projects/haf/branches/maemo-af-desktop/hildon-desktop/configure.ac	2006-12-29 13:29:33 UTC (rev 8891)
+++ projects/haf/branches/maemo-af-desktop/hildon-desktop/configure.ac	2006-12-29 14:19:03 UTC (rev 8892)
@@ -1,21 +1,9 @@
 AC_INIT(Makefile.am)
-AM_INIT_AUTOMAKE(maemo-af-desktop, 3.9)
-AM_CONFIG_HEADER(config.h)
 
-AC_ARG_ENABLE(debug, [AC_HELP_STRING([--enable-debug],[Debug (default=no)])],
-                            [hildon_use_debug=yes],[hildon_use_debug=no])
+AM_INIT_AUTOMAKE(hildon-desktop, 3.9)
 
-AC_ARG_ENABLE(timestamping,
-		[AC_HELP_STRING([--enable-timestamping],
-			[Define HILDON_USE_TIMESTAMPING (default=no)])],
-		[hildon_use_timestamping=yes],[hildon_use_timestamping=no])
+AM_CONFIG_HEADER(config.h)
 
-AC_ARG_ENABLE(instrumenting,
-	      [AC_HELP_STRING([--enable-instrumenting],
-			      [Compile with instrumentation flags (default=no)])],
-	      [hildon_use_instrumenting=yes],
-	      [hildon_use_instrumenting=no])
-
 AC_CANONICAL_HOST
 
 AC_PROG_CC
@@ -23,38 +11,70 @@
 AC_PROG_INSTALL
 AC_PROG_LIBTOOL
 
+AC_HEADER_STDC
+
 AC_PATH_X
 AC_PATH_XTRA
 AC_SUBST(X_CFLAGS)
 
-AC_HEADER_STDC
+#+++++++++++++++
+# Misc programs 
+#+++++++++++++++
 
 AC_PATH_PROG(GLIB_GENMARSHAL, glib-genmarshal)
 AC_PATH_PROG(DBUS_BINDING_TOOL, dbus-binding-tool)
 
-if test foobar${hildon_use_timestamping} = foobaryes
+#++++++++++++++++++
+# Misc build flags
+#++++++++++++++++++
+
+AC_ARG_ENABLE(debug, 
+	      [AC_HELP_STRING([--enable-debug],[Debug (default=no)])],
+              [hildon_use_debug=yes],[hildon_use_debug=no])
+
+AC_ARG_ENABLE(timestamping,
+	      [AC_HELP_STRING([--enable-timestamping],[Define HILDON_USE_TIMESTAMPING (default=no)])],
+	      [hildon_use_timestamping=yes],[hildon_use_timestamping=no])
+
+AC_ARG_ENABLE(instrumenting,
+	      [AC_HELP_STRING([--enable-instrumenting],[Compile with instrumentation flags (default=no)])],
+	      [hildon_use_instrumenting=yes],[hildon_use_instrumenting=no])
+
+if test "x${hildon_use_timestamping}" = "xyes"
 then
     CFLAGS="$CFLAGS -DHILDON_USE_TIMESTAMPING"
 fi
 
-ALL_LINGUAS="en_GB"
-AC_SUBST(ALL_LINGUAS)
-AM_GLIB_GNU_GETTEXT
+if test "x${hildon_use_instrumenting}" = "xyes"
+then
+    CFLAGS="$CFLAGS -Wall -Wmissing-prototypes -Wmissing-declarations -Werror -Wno-format-extra-args -g -finstrument-functions"
+else
+    CFLAGS="$CFLAGS -Wall -Wmissing-prototypes -Wmissing-declarations -Werror -Wno-format-extra-args"
+fi
 
 # D-BUS headers do not compile with -pedantic. Once they are fixed, 
 #return the flag
 #CFLAGS="$CFLAGS -Wall -ansi -pedantic -Wmissing-prototypes -Wmissing-declarations -Werror" 
 #CFLAGS="$CFLAGS -Wall -ansi  -Wmissing-prototypes -Wmissing-declarations -Werror"
 
-if test foobar${hildon_use_instrumenting} = foobaryes
-then
-    CFLAGS="$CFLAGS -Wall -Wmissing-prototypes -Wmissing-declarations -Werror -Wno-format-extra-args -g -finstrument-functions"
-else
-    CFLAGS="$CFLAGS -Wall -Wmissing-prototypes -Wmissing-declarations -Werror -Wno-format-extra-args"
-fi
-
 AC_SUBST(CFLAGS)
 
+#++++++++++++
+# i18n setup 
+#++++++++++++
+
+ALL_LINGUAS="en_GB"
+AC_SUBST(ALL_LINGUAS)
+AM_GLIB_GNU_GETTEXT
+
+PKG_CHECK_MODULES(OSSOSETTINGS, osso-af-settings >= 0.8.1)
+localedir=`pkg-config osso-af-settings --variable=localedir`
+AC_SUBST(localedir)
+
+#+++++++++++++++++++++
+# Dependencies checks
+#+++++++++++++++++++++
+
 PKG_CHECK_MODULES(ESD, esound)
 AC_SUBST(ESD_LIBS)
 AC_SUBST(ESD_CFLAGS)
@@ -63,12 +83,10 @@
 AC_SUBST(XTEST_LIBS)
 AC_SUBST(XTEST_CFLAGS)
 
-
 PKG_CHECK_MODULES(HILDON_FM,hildon-fm >= 0.15 )
 AC_SUBST(HILDON_FM_LIBS)
 AC_SUBST(HILDON_FM_CFLAGS)
 
-
 PKG_CHECK_MODULES(LIBXML,libxml-2.0 )
 AC_SUBST(LIBXML_LIBS)
 AC_SUBST(LIBXML_CFLAGS)
@@ -104,10 +122,6 @@
 PKG_CHECK_MODULES(GDK, gdk-2.0 >= 1.3.12)
 AC_SUBST(GDK_LIBS)
 
-PKG_CHECK_MODULES(OSSOSETTINGS, osso-af-settings >= 0.8.1)
-localedir=`pkg-config osso-af-settings --variable=localedir`
-AC_SUBST(localedir)
-
 PKG_CHECK_MODULES(XLIBS, x11)
 AC_SUBST(XLIBS_CFLAGS)
 AC_SUBST(XLIBS_ERROR_LIBS)
@@ -116,9 +130,9 @@
 AC_SUBST(OSSO_HELP_CFLAGS)
 AC_SUBST(OSSO_HELP_LIBS)
 
-ALL_LINGUAS="en_GB"
-AC_SUBST(ALL_LINGUAS)
-AM_GLIB_GNU_GETTEXT
+#+++++++++++++++++++
+# Directories setup
+#+++++++++++++++++++
 
 hildondesktopentrydir=`pkg-config osso-af-settings --variable=desktopentrydir`
 hildondesktoplibdir=${libdir}/hildon-desktop
@@ -148,21 +162,80 @@
 hildoncpdesktopentrydir=${datadir}/applications/hildon-control-panel
 AC_SUBST(hildoncpdesktopentrydir)
 
+#++++++++++++++++++++
+# Background Manager 
+#++++++++++++++++++++
+
 HILDON_BACKGROUND_MANAGER_SERVICE="org.maemo.hildon.background_manager"
+HILDON_BACKGROUND_MANAGER_OBJECT_PATH="/org/maemo/hildon/background_manager"
+HILDON_BACKGROUND_MANAGER_INTERFACE="org.maemo.hildon.background_manager"
 AC_SUBST(HILDON_BACKGROUND_MANAGER_SERVICE)
-HILDON_BACKGROUND_MANAGER_OBJECT_PATH="/org/maemo/hildon/background_manager"
 AC_SUBST(HILDON_BACKGROUND_MANAGER_OBJECT_PATH)
-HILDON_BACKGROUND_MANAGER_INTERFACE="org.maemo.hildon.background_manager"
 AC_SUBST(HILDON_BACKGROUND_MANAGER_INTERFACE)
 
-AC_OUTPUT(Makefile \
-	libhildonwm/Makefile \
-	libhildonwm/libhildonwm.pc \
-	libhildondesktop/Makefile \
-	libhildondesktop/libhildondesktop.pc \
-    background-manager/Makefile \
-    background-manager/hildon-background-manager.service \
-    background-manager/background-manager.xml \
-    background-manager/background-manager-dbus.h \
-	data/Makefile \
-	src/Makefile)
+#++++++++
+# Python 
+#++++++++
+
+AC_MSG_CHECKING([whether Python support is requested])
+AC_ARG_ENABLE(python,
+	      AS_HELP_STRING([--enable-python],[Enable python support]),
+	      [enable_python=$enableval have_python=$enableval], 
+              [enable_python=autodetect have_python=yes])
+AC_MSG_RESULT([$enable_python])
+
+if test "x$have_python" != "xno"; then
+    AM_PATH_PYTHON([2.3],[],[no])
+    if test "x$PYTHON" = "x:"; then
+        have_python=no
+    fi
+fi
+
+dnl if test "x$have_python" != "xno"; then
+dnl         AM_CHECK_PYTHON_HEADERS([],[have_python=no])
+dnl fi
+
+if test "x$have_python" != "xno"; then
+        PYTHON_LIBS="-lpython$PYTHON_VERSION"
+        PYTHON_LIB_LOC="-L$PYTHON_EXEC_PREFIX/lib/python$PYTHON_VERSION/config"
+        PYTHON_CFLAGS="-I$PYTHON_PREFIX/include/python$PYTHON_VERSION"
+        AC_SUBST(PYTHON_LIBS)
+        AC_SUBST(PYTHON_LIB_LOC)
+        AC_SUBST(PYTHON_CFLAGS)
+
+        PKG_CHECK_MODULES(PYGOBJECT, pygobject-2.0 >= 2.6)
+        AC_SUBST(PYGOBJECT_LIBS)
+        AC_SUBST(PYGOBJECT_CFLAGS)
+
+        PKG_CHECK_MODULES(PYGTK, pygtk-2.0 >= 2.6)
+        AC_SUBST(PYGTK_CFLAGS)
+        AC_SUBST(PYGTK_LIBS)
+fi
+
+if test "x$have_python" != "xyes"; then
+    if test "x$enable_python" = "xyes"; then
+        AC_MSG_ERROR([Python not found])
+    elif test "x$enable_python" = "xautodetect"; then
+        enable_python=no
+        AC_MSG_WARN([Python not found, disabling python support])
+    fi
+elif test "x$enable_python" != "xno"; then
+    enable_python=yes
+    AC_DEFINE([ENABLE_PYTHON],[1],[Define to compile with python support])
+fi
+
+AM_CONDITIONAL([ENABLE_PYTHON],[test "x$enable_python" = "xyes"])
+
+AC_OUTPUT([
+Makefile 
+libhildonwm/Makefile 
+libhildonwm/libhildonwm.pc 
+libhildondesktop/Makefile 
+libhildondesktop/libhildondesktop.pc 
+background-manager/Makefile 
+background-manager/hildon-background-manager.service 
+background-manager/background-manager.xml 
+background-manager/background-manager-dbus.h 
+data/Makefile 
+src/Makefile
+])

Modified: projects/haf/branches/maemo-af-desktop/hildon-desktop/src/Makefile.am
===================================================================
--- projects/haf/branches/maemo-af-desktop/hildon-desktop/src/Makefile.am	2006-12-29 13:29:33 UTC (rev 8891)
+++ projects/haf/branches/maemo-af-desktop/hildon-desktop/src/Makefile.am	2006-12-29 14:19:03 UTC (rev 8892)
@@ -23,28 +23,45 @@
 
 hildon_desktop_CPPFLAGS = \
 	$(HILDON_CFLAGS)             					   \
-	$(HILDON_FM_CFLAGS)             					   \
+	$(HILDON_FM_CFLAGS)             				   \
 	$(OSSO_CFLAGS)               					   \
 	$(OSSO_HELP_CFLAGS)          					   \
 	-DLOCALEDIR=\"$(localedir)\" 					   \
 	-I$(top_srcdir) 						   \
 	-DHD_DESKTOP_CONFIG_PATH=\"$(hildondesktopconfdir)\" 		   \
 	-DHD_DESKTOP_MODULE_PATH=\"$(hildondesktoplibdir)\"                \
+	-DHD_DESKTOP_BACKGROUNDS_PATH=\"$(hildondesktopbackgroundsdir)\"   \
 	-DHD_PLUGIN_LOADER_LEGACY_HOME_MODULE_PATH=\"$(hildonhomelibdir)\" \
-	-DHD_PLUGIN_LOADER_LEGACY_NAVIGATOR_MODULE_PATH=\"$(hildonnavigatorlibdir)\"\
-	-DHD_DESKTOP_BACKGROUNDS_PATH=\"$(hildondesktopbackgroundsdir)\"
+	-DHD_PLUGIN_LOADER_LEGACY_NAVIGATOR_MODULE_PATH=\"$(hildonnavigatorlibdir)\"
 
+if ENABLE_PYTHON
+hildon_desktop_CPPFLAGS += \
+	$(PYTHON_CFLAGS)    \
+	$(PYGOBJECT_CFLAGS) \
+	$(PYGTK_CFLAGS)
+endif
+
 hildon_desktop_LDFLAGS  = \
 	$(HILDON_LIBS)	  \
 	$(HILDON_FM_LIBS)  \
 	$(OSSO_LIBS)	  \
 	$(OSSO_HELP_LIBS)
 
+if ENABLE_PYTHON
+hildon_desktop_LDFLAGS += \
+	$(PYTHON_LIBS)    \
+	$(PYTHON_LIB_LOC) \
+	$(PYGOBJECT_LIBS) \
+	$(PYGTK_LIBS) 
+endif
+
 hildon_desktop_LDADD = $(top_srcdir)/libhildondesktop/libhildondesktop.la
 
+PYTHON_SOURCES = \
+	hd-plugin-loader-python.c   \
+	hd-plugin-loader-python.h 
+
 PLUGIN_MANAGER_SOURCES  = \
-	hd-desktop.c                \
-	hd-desktop.h                \
 	hd-plugin-manager.c         \
 	hd-plugin-manager.h         \
 	hd-plugin-loader-factory.c  \
@@ -54,18 +71,25 @@
 	hd-plugin-loader-default.c  \
 	hd-plugin-loader-default.h  \
 	hd-plugin-loader-legacy.c   \
-	hd-plugin-loader-legacy.h   \
-	hd-select-plugins-dialog.c  \
-	hd-select-plugins-dialog.h  \
-	hd-config.h
+	hd-plugin-loader-legacy.h 
 
+if ENABLE_PYTHON
+PLUGIN_MANAGER_SOURCES += $(PYTHON_SOURCES)
+endif
+
 HOME_SOURCES = \
-	hd-home-window.c \
-	hd-home-window.h \
+	hd-home-window.c            \
+	hd-home-window.h            \
         hd-home-background-dialog.c \
         hd-home-background-dialog.h
 
-hildon_desktop_SOURCES  = \
-	$(HOME_SOURCES)           \
-	$(PLUGIN_MANAGER_SOURCES) \
-	main.c 
+hildon_desktop_SOURCES = \
+	$(HOME_SOURCES)             \
+	$(PLUGIN_MANAGER_SOURCES)   \
+	hd-desktop.c                \
+	hd-desktop.h                \
+	hd-select-plugins-dialog.c  \
+	hd-select-plugins-dialog.h  \
+	hd-config.h                 \
+	main.c
+

Modified: projects/haf/branches/maemo-af-desktop/hildon-desktop/src/hd-plugin-loader-factory.c
===================================================================
--- projects/haf/branches/maemo-af-desktop/hildon-desktop/src/hd-plugin-loader-factory.c	2006-12-29 13:29:33 UTC (rev 8891)
+++ projects/haf/branches/maemo-af-desktop/hildon-desktop/src/hd-plugin-loader-factory.c	2006-12-29 14:19:03 UTC (rev 8892)
@@ -22,6 +22,10 @@
  *
  */
 
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+
 #include <glib-object.h>
 
 #include "hd-plugin-loader-factory.h"
@@ -30,6 +34,10 @@
 #include "hd-plugin-loader-legacy.h"
 #include "hd-config.h"
 
+#ifdef ENABLE_PYTHON
+#include "hd-plugin-loader-python.h"
+#endif
+
 #define HD_PLUGIN_LOADER_FACTORY_GET_PRIVATE(object) \
         (G_TYPE_INSTANCE_GET_PRIVATE ((object), HD_TYPE_PLUGIN_LOADER_FACTORY, HDPluginLoaderFactoryPrivate))
 
@@ -165,6 +173,12 @@
     {
       loader = g_object_new (HD_TYPE_PLUGIN_LOADER_DEFAULT, NULL);
     }
+#ifdef ENABLE_PYTHON
+    else if (!g_ascii_strcasecmp (type, HD_PLUGIN_LOADER_TYPE_PYTHON)) 
+    {
+      loader = g_object_new (HD_TYPE_PLUGIN_LOADER_PYTHON, NULL);
+    }
+#endif
     else
     {
       g_warning ("Unknown Plugin Loader type: %s", type);

Modified: projects/haf/branches/maemo-af-desktop/hildon-desktop/src/hd-plugin-loader-factory.h
===================================================================
--- projects/haf/branches/maemo-af-desktop/hildon-desktop/src/hd-plugin-loader-factory.h	2006-12-29 13:29:33 UTC (rev 8891)
+++ projects/haf/branches/maemo-af-desktop/hildon-desktop/src/hd-plugin-loader-factory.h	2006-12-29 14:19:03 UTC (rev 8892)
@@ -45,6 +45,9 @@
 #define HD_PLUGIN_LOADER_TYPE_DEFAULT      "default"
 #define HD_PLUGIN_LOADER_TYPE_OLD_API      "old_api"
 #define HD_PLUGIN_LOADER_TYPE_OLD_API_HOME "HildonHomeApplet"
+#ifdef ENABLE_PYTHON
+#define HD_PLUGIN_LOADER_TYPE_PYTHON       "python"
+#endif
 
 struct _HDPluginLoaderFactory 
 {

Added: projects/haf/branches/maemo-af-desktop/hildon-desktop/src/hd-plugin-loader-python.c
===================================================================
--- projects/haf/branches/maemo-af-desktop/hildon-desktop/src/hd-plugin-loader-python.c	2006-12-29 13:29:33 UTC (rev 8891)
+++ projects/haf/branches/maemo-af-desktop/hildon-desktop/src/hd-plugin-loader-python.c	2006-12-29 14:19:03 UTC (rev 8892)
@@ -0,0 +1,280 @@
+/*
+ * This file is part of hildon-desktop
+ *
+ * Copyright (C) 2006 Nokia Corporation.
+ *
+ * Author:  Lucas Rocha <lucas.rocha at nokia.com>
+ * Contact: Karoliina Salminen <karoliina.t.salminen at nokia.com>
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public License
+ * as published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This library 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
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA
+ *
+ */
+
+#include <Python.h>
+#include <pygobject.h>
+#include <pygtk/pygtk.h>
+#include <libhildondesktop/hildon-desktop-plugin.h>
+
+#include "hd-plugin-loader-python.h"
+#include "hd-config.h"
+
+#define HD_PLUGIN_LOADER_PYTHON_GET_PRIVATE(obj) \
+        (G_TYPE_INSTANCE_GET_PRIVATE ((obj), HD_TYPE_PLUGIN_LOADER_PYTHON, HDPluginLoaderPythonPrivate))
+
+G_DEFINE_TYPE (HDPluginLoaderPython, hd_plugin_loader_python, HD_TYPE_PLUGIN_LOADER);
+
+struct _HDPluginLoaderPythonPrivate 
+{
+  gboolean initialised;
+};
+
+static GList * 
+hd_plugin_loader_python_open_module (HDPluginLoaderPython *loader,
+                                      GError **error)
+{
+  HDPluginLoaderPythonPrivate *priv;
+  PyObject *pModules, *pModule, *pReload, *pDict, *pFunc, *pList;
+  GKeyFile *keyfile;
+  GList *objects = NULL;
+  GError *keyfile_error = NULL;
+  gchar *module_file = NULL;
+  gchar *module_name = NULL;
+
+  g_return_val_if_fail (HD_IS_PLUGIN_LOADER_PYTHON (loader), NULL);
+
+  priv = loader->priv;
+ 
+  keyfile = hd_plugin_loader_get_key_file (HD_PLUGIN_LOADER (loader));
+  
+  module_file = g_key_file_get_string (keyfile,
+                                       HD_PLUGIN_CONFIG_GROUP,
+                                       HD_PLUGIN_CONFIG_KEY_PATH,
+                                       &keyfile_error);
+
+  if (keyfile_error)
+  {
+    g_propagate_error (error, keyfile_error);
+
+    return NULL;
+  }
+
+  if (g_path_is_absolute (module_file))
+  {
+    module_name = g_path_get_basename (module_file);
+
+    g_free (module_file);
+  }
+  else
+  {
+    module_name = module_file; 
+  }
+
+  pModules = PySys_GetObject ("modules");
+
+  g_assert (pModules != NULL);
+  
+  pModule = PyDict_GetItemString (pModules, module_name);
+  
+  if (pModule == NULL)
+  {
+    pModule = PyImport_ImportModule (module_name);
+  
+    if (pModule == NULL) 
+    {
+      PyErr_Print ();
+      PyErr_Clear ();
+
+      g_warning ("Could not initialize Python module '%s'",
+                 module_name);
+    }
+  }
+  else
+  {
+    pReload = PyImport_ReloadModule (pModule);
+  
+    if (pReload == NULL)
+    {
+      PyErr_Print ();
+      PyErr_Clear ();
+
+      g_warning ("Could not reload Python module '%s'\n"
+                 "Falling back to previous version",
+                 module_name);
+    }
+    else
+    {
+      Py_DECREF (pReload);
+    }
+  }
+
+  if (pModule != NULL) 
+  {
+    pDict = PyModule_GetDict (pModule);
+
+    pFunc = PyDict_GetItemString (pDict, "hd_plugin_get_objects");
+
+    if (pFunc && PyCallable_Check (pFunc)) 
+    {
+      pList = PyObject_CallObject (pFunc, NULL);
+
+      if (pList != NULL && PyList_Check (pList)) 
+      {
+        int i;
+
+        for (i = 0; i < PyList_Size (pList); i++)
+        {
+          PyObject *pObject = PyList_GetItem (pList, i);
+
+          /* FIXME: add type checking here */
+          if (pObject != NULL)
+          {
+            objects = g_list_append (objects, ((PyGObject *) pObject)->obj);
+          }
+        }
+      }
+      else 
+      {
+          Py_DECREF(pList);
+          Py_DECREF(pFunc);
+          Py_DECREF(pModule);
+
+          PyErr_Print ();
+          PyErr_Clear ();
+
+          g_warning ("hd_plugin_get_objects call failed in python module");
+
+          return NULL;
+      }
+    }
+    else 
+    {
+      if (PyErr_Occurred ())
+      {
+        PyErr_Print ();
+        PyErr_Clear ();
+      }
+
+      g_warning ("Cannot find function \"%s\"\n", "hd_plugin_get_objects");
+    }
+
+    Py_XDECREF(pFunc);
+    Py_DECREF(pModule);
+  }
+  else 
+  {
+    PyErr_Print ();
+    PyErr_Clear ();
+
+    g_warning ("Failed to load \"%s\"\n", module_name);
+  }
+
+  g_free (module_name);
+
+  return objects;
+}
+
+static GList *
+hd_plugin_loader_python_load (HDPluginLoader *loader, GError **error)
+{
+  GList *objects = NULL;
+  GKeyFile *keyfile;
+  GError *local_error = NULL;
+
+  g_return_val_if_fail (loader, NULL);
+ 
+  keyfile = hd_plugin_loader_get_key_file (loader);
+
+  if (!keyfile)
+  {
+    g_set_error (error,
+                 hd_plugin_loader_error_quark (),
+                 HD_PLUGIN_LOADER_ERROR_KEYFILE,
+                 "A keyfile required to load plugins");
+
+    return NULL;
+  }
+
+  objects = 
+      hd_plugin_loader_python_open_module (HD_PLUGIN_LOADER_PYTHON (loader),
+                                            &local_error);
+
+  if (local_error) 
+  {
+    g_propagate_error (error, local_error);
+
+    if (objects)
+    {
+      g_list_foreach (objects, (GFunc) gtk_widget_destroy, NULL);
+      g_list_free (objects);
+    }
+
+    return NULL;
+  }
+
+  return objects;
+}
+
+static void
+hd_plugin_loader_python_finalize (GObject *loader)
+{
+  HDPluginLoaderPythonPrivate *priv;
+
+  g_return_if_fail (loader != NULL);
+  g_return_if_fail (HD_IS_PLUGIN_LOADER_PYTHON (loader));
+
+  priv = HD_PLUGIN_LOADER_PYTHON (loader)->priv;
+
+  if (priv->initialised)
+  {
+    Py_Finalize (); 
+  }
+
+  G_OBJECT_CLASS (hd_plugin_loader_python_parent_class)->finalize (loader);
+}
+
+static void
+hd_plugin_loader_python_init (HDPluginLoaderPython *loader)
+{
+  PyObject *pPath, *pStr;
+
+  loader->priv = HD_PLUGIN_LOADER_PYTHON_GET_PRIVATE (loader);
+
+  Py_Initialize ();
+  loader->priv->initialised = TRUE;
+  
+  init_pygobject ();
+  init_pygtk ();
+
+  pStr = PyString_FromString (HD_DESKTOP_MODULE_PATH); 
+  pPath = PySys_GetObject ("path");
+  PyList_Append (pPath, pStr);
+}
+
+static void
+hd_plugin_loader_python_class_init (HDPluginLoaderPythonClass *class)
+{
+  GObjectClass *object_class;
+  HDPluginLoaderClass *loader_class;
+
+  object_class = G_OBJECT_CLASS (class);
+  loader_class = HD_PLUGIN_LOADER_CLASS (class);
+  
+  object_class->finalize = hd_plugin_loader_python_finalize;
+
+  loader_class->load = hd_plugin_loader_python_load;
+
+  g_type_class_add_private (object_class, sizeof (HDPluginLoaderPythonPrivate));
+}

Added: projects/haf/branches/maemo-af-desktop/hildon-desktop/src/hd-plugin-loader-python.h
===================================================================
--- projects/haf/branches/maemo-af-desktop/hildon-desktop/src/hd-plugin-loader-python.h	2006-12-29 13:29:33 UTC (rev 8891)
+++ projects/haf/branches/maemo-af-desktop/hildon-desktop/src/hd-plugin-loader-python.h	2006-12-29 14:19:03 UTC (rev 8892)
@@ -0,0 +1,60 @@
+/*
+ * This file is part of hildon-desktop
+ *
+ * Copyright (C) 2006 Nokia Corporation.
+ *
+ * Author:  Lucas Rocha <lucas.rocha at nokia.com>
+ * Contact: Karoliina Salminen <karoliina.t.salminen at nokia.com>
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public License
+ * as published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This library 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
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA
+ *
+ */
+
+#ifndef __HD_PLUGIN_LOADER_PYTHON_H__
+#define __HD_PLUGIN_LOADER_PYTHON_H__
+
+#include "hd-plugin-loader.h"
+
+G_BEGIN_DECLS
+
+typedef struct _HDPluginLoaderPython HDPluginLoaderPython;
+typedef struct _HDPluginLoaderPythonClass HDPluginLoaderPythonClass;
+typedef struct _HDPluginLoaderPythonPrivate HDPluginLoaderPythonPrivate;
+
+#define HD_TYPE_PLUGIN_LOADER_PYTHON            (hd_plugin_loader_python_get_type ())
+#define HD_PLUGIN_LOADER_PYTHON(obj)		(G_TYPE_CHECK_INSTANCE_CAST ((obj), HD_TYPE_PLUGIN_LOADER_PYTHON, HDPluginLoaderPython))
+#define HD_IS_PLUGIN_LOADER_PYTHON(obj)         (G_TYPE_CHECK_INSTANCE_TYPE ((obj), HD_TYPE_PLUGIN_LOADER_PYTHON))
+#define HD_PLUGIN_LOADER_PYTHON_CLASS(klass)	(G_TYPE_CHECK_CLASS_CAST ((klass), HD_TYPE_PLUGIN_LOADER_PYTHON_CLASS, HDPluginLoaderPythonClass))
+#define HD_IS_PLUGIN_LOADER_PYTHON_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), HD_TYPE_PLUGIN_LOADER_PYTHON_CLASS))
+#define HD_PLUGIN_LOADER_PYTHON_GET_CLASS(obj)	(G_TYPE_INSTANCE_GET_CLASS ((obj), HD_TYPE_PLUGIN_LOADER_PYTHON, HDPluginLoaderPythonClass))
+
+struct _HDPluginLoaderPython
+{
+  HDPluginLoader parent;
+
+  HDPluginLoaderPythonPrivate *priv;
+};
+
+struct _HDPluginLoaderPythonClass
+{
+  HDPluginLoaderClass parent_class;
+};
+
+GType  hd_plugin_loader_python_get_type  (void);
+
+G_END_DECLS
+
+#endif

Modified: projects/haf/branches/maemo-af-desktop/hildon-desktop/src/main.c
===================================================================
--- projects/haf/branches/maemo-af-desktop/hildon-desktop/src/main.c	2006-12-29 13:29:33 UTC (rev 8891)
+++ projects/haf/branches/maemo-af-desktop/hildon-desktop/src/main.c	2006-12-29 14:19:03 UTC (rev 8892)
@@ -25,6 +25,7 @@
 #ifdef HAVE_CONFIG_H
 #include <config.h>
 #endif
+
 #include <locale.h>
 #include <glib/gi18n.h>
 #include <gtk/gtk.h>


More information about the maemo-commits mailing list