Commit 94982e05 authored by Juan Pablo Ugarte's avatar Juan Pablo Ugarte
Browse files

added name parameter to GladeCatalogInitFunc.

* gladeui/glade-catalog.c: added name parameter to
  GladeCatalogInitFunc.

* python/glade-python.c: New plugin to support python widget
  at runtime.

* m4/python.m4, glade3/configure.ac, plugins/Makefile.am,
  plugins/python/Makefile.am:
  added python check and build rules.

* gnome/glade-gnome.c: updated glade_gnomeui_init() prototype


svn path=/trunk/; revision=1844
parent df0f167b
......@@ -145,6 +145,33 @@ fi
AM_CONDITIONAL(BUILD_GNOME, test x"$have_gnome" = "xyes")
dnl ================================================================
dnl Python for optional python dev libs
dnl ================================================================
AC_ARG_ENABLE(python,
AS_HELP_STRING([--disable-python], [disable python catalog]),
check_python=$enableval, check_python=yes)
if test x"$check_python" = x"yes"; then
PYGTK_REQUIRED_MAJOR=2
PYGTK_REQUIRED_MINOR=10
PYGTK_REQUIRED_MICRO=0
AM_CHECK_PYTHON_HEADERS(, [AC_MSG_ERROR(could not find Python headers)])
AM_CHECK_PYTHON_LIBS(, [AC_MSG_ERROR(could not find Python lib)])
PKG_CHECK_MODULES(PYGTK, [pygtk-2.0 >= 2.10.0], [have_python=yes],[have_python=no])
AC_DEFINE_UNQUOTED(PYGTK_REQUIRED_MAJOR, $PYGTK_REQUIRED_MAJOR, Pygtk mayor version required)
AC_DEFINE_UNQUOTED(PYGTK_REQUIRED_MINOR, $PYGTK_REQUIRED_MINOR, Pygtk minor version required)
AC_DEFINE_UNQUOTED(PYGTK_REQUIRED_MICRO, $PYGTK_REQUIRED_MICRO, Pygtk micro version required)
AC_SUBST(PYGTK_LIBS)
AC_SUBST(PYGTK_CFLAGS)
else
have_python=no
fi
AM_CONDITIONAL(BUILD_PYTHON, test x"$have_python" = "xyes")
# ==================================================================
# Glade User Manual (requires gnome-doc-utils)
# ==================================================================
......@@ -218,6 +245,7 @@ plugins/gnome/Makefile
plugins/gnome/icons/Makefile
plugins/gnome/icons/16x16/Makefile
plugins/gnome/icons/22x22/Makefile
plugins/python/Makefile
po/Makefile.in
doc/Makefile
doc/version.xml
......@@ -234,4 +262,5 @@ Configuration:
Compiler: ${CC}
GTK+ UNIX Print Widgets: ${have_unix_print}
GNOME UI Widgets: ${have_gnome}
PYTHON Widgets support: ${have_python}
"
......@@ -33,7 +33,7 @@
#include <glib.h>
#include <glib/gi18n-lib.h>
typedef void (*GladeCatalogInitFunc) (void);
typedef void (*GladeCatalogInitFunc) (const gchar *name);
struct _GladeCatalog
{
......@@ -535,7 +535,7 @@ glade_catalog_load_all (void)
{
catalog = l->data;
if (catalog->init_function)
catalog->init_function ();
catalog->init_function (catalog->name);
}
for (l = catalogs; l; l = l->next)
......
## this one is commonly used with AM_PATH_PYTHONDIR ...
dnl AM_CHECK_PYMOD(MODNAME [,SYMBOL [,ACTION-IF-FOUND [,ACTION-IF-NOT-FOUND]]])
dnl Check if a module containing a given symbol is visible to python.
AC_DEFUN([AM_CHECK_PYMOD],
AC_DEFUN(AM_CHECK_PYMOD,
[AC_REQUIRE([AM_PATH_PYTHON])
py_mod_var=`echo $1['_']$2 | sed 'y%./+-%__p_%'`
AC_MSG_CHECKING(for ifelse([$2],[],,[$2 in ])python module $1)
......@@ -60,65 +60,29 @@ $1],dnl
$2])
CPPFLAGS="$save_CPPFLAGS"
])
## this one is commonly used with AM_PATH_PYTHONDIR ...
dnl AM_CHECK_PYMOD(MODNAME [,SYMBOL [,ACTION-IF-FOUND [,ACTION-IF-NOT-FOUND]]])
dnl Check if a module containing a given symbol is visible to python.
AC_DEFUN([AM_CHECK_PYMOD],
[AC_REQUIRE([AM_PATH_PYTHON])
py_mod_var=`echo $1['_']$2 | sed 'y%./+-%__p_%'`
AC_MSG_CHECKING(for ifelse([$2],[],,[$2 in ])python module $1)
AC_CACHE_VAL(py_cv_mod_$py_mod_var, [
ifelse([$2],[], [prog="
import sys
try:
import $1
except ImportError:
sys.exit(1)
except:
sys.exit(0)
sys.exit(0)"], [prog="
import $1
$1.$2"])
if $PYTHON -c "$prog" 1>&AC_FD_CC 2>&AC_FD_CC
then
eval "py_cv_mod_$py_mod_var=yes"
else
eval "py_cv_mod_$py_mod_var=no"
fi
])
py_val=`eval "echo \`echo '$py_cv_mod_'$py_mod_var\`"`
if test "x$py_val" != xno; then
AC_MSG_RESULT(yes)
ifelse([$3], [],, [$3
])dnl
else
AC_MSG_RESULT(no)
ifelse([$4], [],, [$4
])dnl
fi
])
dnl a macro to check for ability to create python extensions
dnl AM_CHECK_PYTHON_HEADERS([ACTION-IF-POSSIBLE], [ACTION-IF-NOT-POSSIBLE])
dnl function also defines PYTHON_INCLUDES
AC_DEFUN([AM_CHECK_PYTHON_HEADERS],
[AC_REQUIRE([AM_PATH_PYTHON])
AC_MSG_CHECKING(for headers required to compile python extensions)
dnl deduce PYTHON_INCLUDES
py_prefix=`$PYTHON -c "import sys; print sys.prefix"`
dnl a macro to check for ability to embed python
dnl AM_CHECK_PYTHON_LIBS([ACTION-IF-POSSIBLE], [ACTION-IF-NOT-POSSIBLE])
dnl function also defines PYTHON_LIBS
AC_DEFUN([AM_CHECK_PYTHON_LIBS],
[AC_REQUIRE([AM_CHECK_PYTHON_HEADERS])
AC_MSG_CHECKING(for libraries required to embed python)
dnl deduce PYTHON_LIBS
py_exec_prefix=`$PYTHON -c "import sys; print sys.exec_prefix"`
PYTHON_INCLUDES="-I${py_prefix}/include/python${PYTHON_VERSION}"
if test "$py_prefix" != "$py_exec_prefix"; then
PYTHON_INCLUDES="$PYTHON_INCLUDES -I${py_exec_prefix}/include/python${PYTHON_VERSION}"
if test "x$PYTHON_LIBS" == x; then
PYTHON_LIBS="-L${py_prefix}/lib -lpython${PYTHON_VERSION}"
fi
AC_SUBST(PYTHON_INCLUDES)
if test "x$PYTHON_LIB_LOC" == x; then
PYTHON_LIB_LOC="${py_prefix}/lib"
fi
AC_SUBST(PYTHON_LIBS)
AC_SUBST(PYTHON_LIB_LOC)
dnl check if the headers exist:
save_CPPFLAGS="$CPPFLAGS"
CPPFLAGS="$CPPFLAGS $PYTHON_INCLUDES"
AC_TRY_CPP([#include <Python.h>],dnl
[AC_MSG_RESULT(found)
$1],dnl
[AC_MSG_RESULT(not found)
$2])
CPPFLAGS="$save_CPPFLAGS"
save_LIBS="$LIBS"
LIBS="$LIBS $PYTHON_LIBS"
AC_TRY_LINK_FUNC(Py_Initialize, dnl
[LIBS="$save_LIBS"; AC_MSG_RESULT(yes); $1], dnl
[LIBS="$save_LIBS"; AC_MSG_RESULT(no); $2])
])
......@@ -5,3 +5,7 @@ SUBDIRS = gtk+
if BUILD_GNOME
SUBDIRS += gnome
endif
if BUILD_PYTHON
SUBDIRS += python
endif
......@@ -41,7 +41,7 @@ empty (GObject *container, GladeCreateReason reason)
/* Catalog init function */
void
glade_gnomeui_init (void)
glade_gnomeui_init (const gchar *name)
{
gchar *argv[2] = {"glade-3", NULL};
GtkStockItem items [] = {
......
## Process this file with automake to produce Makefile.in
libgladeui = $(top_builddir)/gladeui/libgladeui-1.la
# libgladepython
gladepython_LTLIBRARIES = libgladepython.la
gladepythondir = $(pkglibdir)/modules
libgladepython_la_SOURCES = glade-python.c
libgladepython_la_CPPFLAGS = $(AM_CPPFLAGS)
libgladepython_la_CFLAGS = \
-DG_LOG_DOMAIN=\"GladeUI-PYTHON\" \
-I$(top_srcdir) \
-I$(top_builddir) \
$(PYTHON_INCLUDES) \
$(PYGTK_CFLAGS) \
$(GTK_CFLAGS) \
$(PLUGINS_WARN_CFLAGS) \
$(AM_CPPFLAGS)
libgladepython_la_LDFLAGS = -module -avoid-version $(PYTHON_LIBS) $(AM_LDFLAGS)
libgladepython_la_LIBADD = $(libgladeui) $(PYTHON_LIBS)
if PLATFORM_WIN32
libgladepython_la_LDFLAGS += -no-undefined
endif
/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
/*
* Copyright (C) 2006-2008 Juan Pablo Ugarte.
*
* 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
*
* Authors:
* Juan Pablo Ugarte <juanpablougarte@gmail.com>
*/
#include <config.h>
#include <gladeui/glade.h>
#include <Python.h>
#include <pygobject.h>
static void
python_init (void)
{
char *argv[1];
if (Py_IsInitialized ()) return;
Py_InitializeEx (0);
argv[0] = g_get_prgname ();
PySys_SetArgv (1, argv);
}
static void
glade_python_init_pygtk_check (gint req_major, gint req_minor, gint req_micro)
{
PyObject *gobject, *mdict, *version;
int found_major, found_minor, found_micro;
init_pygobject();
gobject = PyImport_ImportModule("gobject");
mdict = PyModule_GetDict(gobject);
version = PyDict_GetItemString(mdict, "pygtk_version");
if (!version)
{
PyErr_SetString(PyExc_ImportError, "PyGObject version too old");
return;
}
if (!PyArg_ParseTuple(version, "iii", &found_major, &found_minor, &found_micro))
return;
if (req_major != found_major || req_minor > found_minor ||
(req_minor == found_minor && req_micro > found_micro))
{
PyErr_Format(PyExc_ImportError,
"PyGObject version mismatch, %d.%d.%d is required, "
"found %d.%d.%d.", req_major, req_minor, req_micro,
found_major, found_minor, found_micro);
return;
}
}
static void
glade_python_setup ()
{
gchar *command;
Py_SetProgramName (PACKAGE_NAME);
/* Initialize the Python interpreter */
python_init ();
/* Check and init pygobject >= 2.12.0 */
PyErr_Clear ();
glade_python_init_pygtk_check (PYGTK_REQUIRED_MAJOR, PYGTK_REQUIRED_MINOR, PYGTK_REQUIRED_MICRO);
if (PyErr_Occurred ())
{
PyObject *ptype, *pvalue, *ptraceback;
PyErr_Fetch(&ptype, &pvalue, &ptraceback);
g_warning ("Unable to load pygobject module >= %d.%d.%d, "
"please make sure it is in python's path (sys.path). "
"(use PYTHONPATH env variable to specify non default paths)\n%s",
PYGTK_REQUIRED_MAJOR, PYGTK_REQUIRED_MINOR, PYGTK_REQUIRED_MICRO,
PyString_AsString (pvalue));
PyErr_Clear ();
Py_Finalize ();
return;
}
pyg_disable_warning_redirections ();
/* Set path */
command = g_strdup_printf ("import sys; sys.path+=['.', '%s', '%s'];\n",
g_getenv (GLADE_ENV_CATALOG_PATH),
glade_app_get_modules_dir ());
PyRun_SimpleString (command);
g_free (command);
}
void
glade_python_init (const gchar *name)
{
static gboolean init = TRUE;
gchar *import_sentence;
if (init)
{
glade_python_setup ();
init = FALSE;
}
/* Yeah, we use the catalog name as the library */
import_sentence = g_strdup_printf ("import %s;", name);
PyRun_SimpleString (import_sentence);
g_free (import_sentence);
}
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