462
+ − 1 /* glade.c
+ − 2 **
+ − 3 ** Description: Interface to `libglade' for XEmacs/GTK
+ − 4 **
+ − 5 ** Created by: William M. Perry <wmperry@gnu.org>
+ − 6 **
+ − 7 ** Copyright (C) 1999 John Harper <john@dcs.warwick.ac.uk>
+ − 8 ** Copyright (c) 2000 Free Software Foundation
+ − 9 **
+ − 10 */
+ − 11
+ − 12 #if defined(HAVE_GLADE_H) || defined(HAVE_GLADE_GLADE_H)
+ − 13
+ − 14 /* For COMPILED_FUNCTIONP */
+ − 15 #include "bytecode.h"
+ − 16
+ − 17 #ifdef HAVE_GLADE_GLADE_H
+ − 18 #include <glade/glade.h>
+ − 19 #endif
+ − 20
+ − 21 #ifdef HAVE_GLADE_H
+ − 22 #include <glade.h>
+ − 23 #endif
+ − 24
+ − 25 /* This is based on the code from rep-gtk 0.11 in libglade-support.c */
+ − 26
+ − 27 static void
+ − 28 connector (const gchar *handler_name, GtkObject *object,
+ − 29 const gchar *signal_name, const gchar *signal_data,
+ − 30 GtkObject *connect_object, gboolean after, gpointer user_data)
+ − 31 {
+ − 32 Lisp_Object func;
+ − 33 Lisp_Object lisp_data = Qnil;
+ − 34
826
+ − 35 func = VOID_TO_LISP (user_data);
462
+ − 36
+ − 37 if (NILP (func))
+ − 38 {
+ − 39 /* Look for a lisp function called HANDLER_NAME */
+ − 40 func = intern (handler_name);
+ − 41 }
+ − 42
+ − 43 if (signal_data && signal_data[0])
+ − 44 {
+ − 45 lisp_data = Feval (Fread (build_string (signal_data)));
+ − 46 }
+ − 47
+ − 48 /* obj, name, func, cb_data, object_signal, after_p */
+ − 49 Fgtk_signal_connect (build_gtk_object (object),
+ − 50 intern (signal_name),
+ − 51 func,
+ − 52 lisp_data,
+ − 53 connect_object ? Qt : Qnil,
+ − 54 after ? Qt : Qnil);
+ − 55 }
+ − 56
+ − 57 /* This differs from lisp/subr.el (functionp) definition by allowing
+ − 58 ** symbol names that may not necessarily be fboundp yet.
+ − 59 */
+ − 60 static int __almost_functionp (Lisp_Object obj)
+ − 61 {
+ − 62 return (SYMBOLP (obj) ||
+ − 63 SUBRP (obj) ||
+ − 64 COMPILED_FUNCTIONP (obj) ||
+ − 65 EQ (Fcar_safe (obj), Qlambda));
+ − 66 }
+ − 67
+ − 68 DEFUN ("glade-xml-signal-connect", Fglade_xml_signal_connect, 3, 3, 0, /*
+ − 69 Connect a glade handler.
+ − 70 */
+ − 71 (xml, handler_name, func))
+ − 72 {
+ − 73 CHECK_GTK_OBJECT (xml);
+ − 74 CHECK_STRING (handler_name);
+ − 75
+ − 76 if (!__almost_functionp (func))
+ − 77 {
+ − 78 func = wrong_type_argument (intern ("functionp"), func);
+ − 79 }
+ − 80
+ − 81 glade_xml_signal_connect_full (GLADE_XML (XGTK_OBJECT (xml)->object),
2054
+ − 82 (char*) XSTRING_DATA (handler_name),
462
+ − 83 connector, LISP_TO_VOID (func));
+ − 84 return (Qt);
+ − 85 }
+ − 86
+ − 87 DEFUN ("glade-xml-signal-autoconnect", Fglade_xml_signal_autoconnect, 1, 1, 0, /*
+ − 88 Connect all glade handlers.
+ − 89 */
+ − 90 (xml))
+ − 91 {
+ − 92 CHECK_GTK_OBJECT (xml);
+ − 93
+ − 94 glade_xml_signal_autoconnect_full (GLADE_XML (XGTK_OBJECT (xml)->object),
+ − 95 connector, LISP_TO_VOID (Qnil));
+ − 96 return (Qt);
+ − 97 }
+ − 98
+ − 99 DEFUN ("glade-xml-textdomain", Fglade_xml_textdomain, 1, 1, 0, /*
+ − 100 Return the textdomain of a GladeXML object.
+ − 101 */
+ − 102 (xml))
+ − 103 {
+ − 104 gchar *the_domain = NULL;
+ − 105
+ − 106 CHECK_GTK_OBJECT (xml);
+ − 107
+ − 108 if (!GLADE_IS_XML (XGTK_OBJECT (xml)->object))
+ − 109 {
563
+ − 110 wtaerror ("Object is not a GladeXML type.", xml);
462
+ − 111 }
+ − 112
+ − 113 #ifdef LIBGLADE_XML_TXTDOMAIN
+ − 114 the_domain = GLADE_XML (XGTK_OBJECT (xml)->object)->txtdomain;
+ − 115 #else
+ − 116 the_domain = GLADE_XML (XGTK_OBJECT (xml)->object)->textdomain;
+ − 117 #endif
+ − 118 return (build_string (the_domain));
+ − 119 }
+ − 120
+ − 121 void syms_of_glade (void)
+ − 122 {
+ − 123 DEFSUBR (Fglade_xml_signal_connect);
+ − 124 DEFSUBR (Fglade_xml_signal_autoconnect);
+ − 125 DEFSUBR (Fglade_xml_textdomain);
+ − 126 }
+ − 127
+ − 128 void vars_of_glade (void)
+ − 129 {
+ − 130 Fprovide (intern ("glade"));
+ − 131 }
+ − 132
+ − 133 #else /* !(HAVE_GLADE_H || HAVE_GLADE_GLADE_H) */
+ − 134 #define syms_of_glade()
+ − 135 #define vars_of_glade()
+ − 136 #endif