view src/glade.c @ 5781:0853e1ec8529

Use alloca_{rawbytes,ibytes} in #'copy-file, #'insert-file-contents-internal src/ChangeLog addition: 2014-01-20 Aidan Kehoe <kehoea@parhasard.net> * fileio.c (Fcopy_file, Finsert_file_contents_internal): Use alloca_{rawbytes,ibytes} here instead of the implicit alloca on the stack; doesn't change where the buffers are allocated for these two functions, but does mean that decisions about alloca vs. malloc based on buffer size are made in the same place (ultimately, the ALLOCA() macro).
author Aidan Kehoe <kehoea@parhasard.net>
date Mon, 20 Jan 2014 17:53:07 +0000
parents 2aa9cd456ae7
children
line wrap: on
line source

/* glade.c
**
** Description: Interface to `libglade' for XEmacs/GTK
**
** Created by: William M. Perry <wmperry@gnu.org>
**
** Copyright (C) 1999 John Harper <john@dcs.warwick.ac.uk>
** Copyright (c) 2000 Free Software Foundation
**
** This file is part of XEmacs.
**
** XEmacs 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 3 of the License, or (at your
** option) any later version.
** 
** XEmacs 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 XEmacs.  If not, see <http://www.gnu.org/licenses/>. */

#if defined(HAVE_GLADE_H) || defined(HAVE_GLADE_GLADE_H)

/* For COMPILED_FUNCTIONP */
#include "bytecode.h"

#ifdef HAVE_GLADE_GLADE_H
#include <glade/glade.h>
#endif

#ifdef HAVE_GLADE_H
#include <glade.h>
#endif

/* This is based on the code from rep-gtk 0.11 in libglade-support.c */

static void
connector (const gchar *handler_name, GtkObject *object,
	   const gchar *signal_name, const gchar *signal_data,
	   GtkObject *connect_object, gboolean after, gpointer user_data)
{
  Lisp_Object func;
  Lisp_Object lisp_data = Qnil;

  func = GET_LISP_FROM_VOID (user_data);

  if (NILP (func))
    {
      /* Look for a lisp function called HANDLER_NAME */
      func = intern (handler_name);
    }

  if (signal_data && signal_data[0])
    {
      lisp_data
        = IGNORE_MULTIPLE_VALUES (Feval (Fread (build_cistring (signal_data))));
    }

  /* obj, name, func, cb_data, object_signal, after_p */
  Fgtk_signal_connect (build_gtk_object (object),
		       intern (signal_name),
		       func,
		       lisp_data,
		       connect_object ? Qt : Qnil,
		       after ? Qt : Qnil);
}

/* This differs from lisp/subr.el (functionp) definition by allowing
** symbol names that may not necessarily be fboundp yet.
*/
static int __almost_functionp (Lisp_Object obj)
{
  return (SYMBOLP (obj) ||
	  SUBRP (obj) ||
	  COMPILED_FUNCTIONP (obj) ||
	  EQ (Fcar_safe (obj), Qlambda));
}

DEFUN ("glade-xml-signal-connect", Fglade_xml_signal_connect, 3, 3, 0, /*
Connect a glade handler.
*/
       (xml, handler_name, func))
{
  CHECK_GTK_OBJECT (xml);
  CHECK_STRING (handler_name);

  if (!__almost_functionp (func))
    {
      func = wrong_type_argument (intern ("functionp"), func);
    }

  glade_xml_signal_connect_full (GLADE_XML (XGTK_OBJECT (xml)->object),
				 (char*) XSTRING_DATA (handler_name),
				 connector, STORE_LISP_IN_VOID (func));
  return (Qt);
}

DEFUN ("glade-xml-signal-autoconnect", Fglade_xml_signal_autoconnect, 1, 1, 0, /*
Connect all glade handlers.
*/
       (xml))
{
  CHECK_GTK_OBJECT (xml);

  glade_xml_signal_autoconnect_full (GLADE_XML (XGTK_OBJECT (xml)->object),
				     connector, STORE_LISP_IN_VOID (Qnil));
  return (Qt);
}

DEFUN ("glade-xml-textdomain", Fglade_xml_textdomain, 1, 1, 0, /*
Return the textdomain of a GladeXML object.
*/
       (xml))
{
  gchar *the_domain = NULL;

  CHECK_GTK_OBJECT (xml);

  if (!GLADE_IS_XML (XGTK_OBJECT (xml)->object))
    {
      wtaerror ("Object is not a GladeXML type.", xml);
    }

#ifdef LIBGLADE_XML_TXTDOMAIN
  the_domain = GLADE_XML (XGTK_OBJECT (xml)->object)->txtdomain;
#else
  the_domain = GLADE_XML (XGTK_OBJECT (xml)->object)->textdomain;
#endif  
  return (build_cistring (the_domain));
}

void syms_of_glade (void)
{
  DEFSUBR (Fglade_xml_signal_connect);
  DEFSUBR (Fglade_xml_signal_autoconnect);
  DEFSUBR (Fglade_xml_textdomain);
}

void vars_of_glade (void)
{
  Fprovide (intern ("glade"));
}

#else /* !(HAVE_GLADE_H || HAVE_GLADE_GLADE_H) */
#define syms_of_glade()
#define vars_of_glade()
#endif