annotate src/ui-gtk.c @ 996:25e260cb7994

[xemacs-hg @ 2002-09-10 15:27:02 by james] Enable unloading of dynamic modules. Create the first two internal XEmacs modules: LDAP and postgreSQL. Update the sample directory to contain a sample internal XEmacs module and a sample external XEmacs module. Improve support for autoloading modules. Make internal module code compile into the XEmacs binary if XEmacs is configured without module support. Make the internal module directories self-contained so that they can be distributed separately from XEmacs.
author james
date Tue, 10 Sep 2002 15:27:39 +0000
parents 5b372a329b97
children e22b0213b713
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
462
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1 /* ui-gtk.c
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
2 **
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
3 ** Description: Creating 'real' UIs from lisp.
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
4 **
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
5 ** Created by: William M. Perry <wmperry@gnu.org>
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
6 ** Copyright (c) 2000 William M. Perry <wmperry@gnu.org>
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
7 **
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
8 */
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
9
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
10 #include <config.h>
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
11 #include "lisp.h"
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
12 #include "buffer.h"
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
13 #include "console-gtk.h"
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
14 #include "device.h"
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
15 #include "window.h"
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
16 #include "glyphs-gtk.h"
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
17 #include "objects-gtk.h"
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
18 #include "ui-gtk.h"
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
19 #include "faces.h"
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
20 #include "gui-gtk.h"
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
21 #include "sysdll.h"
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
22 #include "hash.h"
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
23 #include "events.h"
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
24 #include "elhash.h"
778
2923009caf47 [xemacs-hg @ 2002-03-16 10:38:59 by ben]
ben
parents: 563
diff changeset
25 #include "event-gtk.h"
462
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
26
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
27 /* XEmacs specific GTK types */
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
28 #include "gtk-glue.c"
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
29
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
30 Lisp_Object Qemacs_ffip;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
31 Lisp_Object Qemacs_gtk_objectp;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
32 Lisp_Object Qemacs_gtk_boxedp;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
33 Lisp_Object Qvoid;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
34 Lisp_Object Venumeration_info;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
35
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
36 static GHashTable *dll_cache;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
37
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
38 Lisp_Object gtk_type_to_lisp (GtkArg *arg);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
39 int lisp_to_gtk_type (Lisp_Object obj, GtkArg *arg);
778
2923009caf47 [xemacs-hg @ 2002-03-16 10:38:59 by ben]
ben
parents: 563
diff changeset
40 #if 0
462
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
41 void describe_gtk_arg (GtkArg *arg);
778
2923009caf47 [xemacs-hg @ 2002-03-16 10:38:59 by ben]
ben
parents: 563
diff changeset
42 #endif
462
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
43 guint symbol_to_enum (Lisp_Object obj, GtkType t);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
44 static guint lisp_to_flag (Lisp_Object obj, GtkType t);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
45 static Lisp_Object flags_to_list (guint value, GtkType t);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
46 static Lisp_Object enum_to_symbol (guint value, GtkType t);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
47
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
48 #define NIL_OR_VOID_P(x) (NILP (x) || EQ (x, Qvoid))
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
49
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
50 static void
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
51 initialize_dll_cache (void)
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
52 {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
53 if (!dll_cache)
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
54 {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
55 dll_cache = g_hash_table_new (g_str_hash, g_str_equal);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
56
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
57 g_hash_table_insert (dll_cache, "---XEmacs Internal Handle---", dll_open (NULL));
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
58 }
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
59 }
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
60
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
61 DEFUN ("dll-load", Fdll_load, 1, 1, 0, /*
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
62 Load a shared library DLL into XEmacs. No initialization routines are required.
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
63 This is for loading dependency DLLs into XEmacs.
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
64 */
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
65 (dll))
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
66 {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
67 dll_handle h;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
68
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
69 CHECK_STRING (dll);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
70
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
71 initialize_dll_cache ();
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
72
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
73 /* If the dll name has a directory component in it, then we should
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
74 expand it. */
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
75 if (!NILP (Fstring_match (build_string ("/"), dll, Qnil, Qnil)))
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
76 dll = Fexpand_file_name (dll, Qnil);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
77
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
78 /* Check if we have already opened it first */
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
79 h = g_hash_table_lookup (dll_cache, XSTRING_DATA (dll));
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
80
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
81 if (!h)
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
82 {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
83 h = dll_open ((char *) XSTRING_DATA (dll));
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
84
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
85 if (h)
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
86 {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
87 g_hash_table_insert (dll_cache, g_strdup (XSTRING_DATA (dll)), h);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
88 }
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
89 else
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
90 {
563
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 462
diff changeset
91 signal_error (Qfile_error,
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 462
diff changeset
92 "dll_open error", build_string (dll_error (NULL)));
462
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
93 }
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
94 }
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
95 return (h ? Qt : Qnil);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
96 }
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
97
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
98
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
99 /* Gtk object importing */
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
100 EXFUN (Fgtk_import_type, 1);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
101
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
102 static struct hash_table *internal_type_hash;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
103
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
104 static int
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
105 type_hash_equal(const void *arg1, const void *arg2)
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
106 {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
107 return ((GtkType) arg1 == (GtkType) arg2);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
108 }
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
109
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
110 static unsigned long
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
111 type_hash_hash(const void *arg)
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
112 {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
113 return ((unsigned long) arg);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
114 }
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
115
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
116 static int
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
117 type_already_imported_p (GtkType t)
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
118 {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
119 void *retval = NULL;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
120
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
121 /* These are cases that we don't need to import */
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
122 switch (GTK_FUNDAMENTAL_TYPE (t))
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
123 {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
124 case GTK_TYPE_CHAR:
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
125 case GTK_TYPE_UCHAR:
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
126 case GTK_TYPE_BOOL:
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
127 case GTK_TYPE_INT:
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
128 case GTK_TYPE_UINT:
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
129 case GTK_TYPE_LONG:
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
130 case GTK_TYPE_ULONG:
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
131 case GTK_TYPE_FLOAT:
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
132 case GTK_TYPE_DOUBLE:
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
133 case GTK_TYPE_STRING:
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
134 case GTK_TYPE_BOXED:
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
135 case GTK_TYPE_POINTER:
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
136 case GTK_TYPE_SIGNAL:
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
137 case GTK_TYPE_ARGS:
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
138 case GTK_TYPE_CALLBACK:
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
139 case GTK_TYPE_C_CALLBACK:
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
140 case GTK_TYPE_FOREIGN:
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
141 return (1);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
142 }
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
143
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
144 if (!internal_type_hash)
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
145 {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
146 internal_type_hash = make_general_hash_table (163, type_hash_hash, type_hash_equal);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
147 return (0);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
148 }
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
149
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
150 if (gethash ((void *)t, internal_type_hash, (const void **)&retval))
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
151 {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
152 return (1);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
153 }
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
154 return (0);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
155 }
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
156
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
157 static void
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
158 mark_type_as_imported (GtkType t)
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
159 {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
160 if (type_already_imported_p (t))
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
161 return;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
162
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
163 puthash ((void *) t, (void *) 1, internal_type_hash);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
164 }
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
165
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
166 static void import_gtk_type (GtkType t);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
167
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
168 static void
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
169 import_gtk_object_internal (GtkType the_type)
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
170 {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
171 GtkType original_type = the_type;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
172 int first_time = 1;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
173
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
174 do
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
175 {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
176 GtkArg *args;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
177 guint32 *flags;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
178 guint n_args;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
179 guint i;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
180 #if 0
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
181 GtkObjectClass *klass;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
182 GtkSignalQuery *query;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
183 guint32 *signals;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
184 guint n_signals;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
185 #endif
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
186
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
187 /* Register the type before we do anything else with it... */
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
188 if (!first_time)
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
189 {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
190 if (!type_already_imported_p (the_type))
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
191 {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
192 import_gtk_type (the_type);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
193 }
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
194 }
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
195 else
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
196 {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
197 /* We need to mark the object type as imported here or we
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
198 run the risk of SERIOUS recursion when we do automatic
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
199 argument type importing. mark_type_as_imported() is
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
200 smart enough to be a noop if we attempt to register
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
201 things twice. */
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
202 first_time = 0;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
203 mark_type_as_imported (the_type);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
204 }
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
205
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
206 args = gtk_object_query_args(the_type,&flags,&n_args);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
207
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
208 /* First get the arguments the object can accept */
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
209 for (i = 0; i < n_args; i++)
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
210 {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
211 if ((args[i].type != original_type) && !type_already_imported_p (args[i].type))
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
212 {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
213 import_gtk_type (args[i].type);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
214 }
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
215 }
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
216
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
217 g_free(args);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
218 g_free(flags);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
219
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
220 #if 0
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
221 /* Now lets publish the signals */
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
222 klass = (GtkObjectClass *) gtk_type_class (the_type);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
223 signals = klass->signals;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
224 n_signals = klass->nsignals;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
225
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
226 for (i = 0; i < n_signals; i++)
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
227 {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
228 query = gtk_signal_query (signals[i]);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
229 /* What do we want to do here? */
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
230 g_free (query);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
231 }
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
232 #endif
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
233
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
234 the_type = gtk_type_parent(the_type);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
235 } while (the_type != GTK_TYPE_INVALID);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
236 }
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
237
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
238 static void
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
239 import_gtk_enumeration_internal (GtkType the_type)
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
240 {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
241 GtkEnumValue *vals = gtk_type_enum_get_values (the_type);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
242 Lisp_Object assoc = Qnil;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
243
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
244 if (NILP (Venumeration_info))
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
245 {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
246 Venumeration_info = call2 (intern ("make-hashtable"), make_int (100), Qequal);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
247 }
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
248
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
249 while (vals && vals->value_name)
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
250 {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
251 assoc = Fcons (Fcons (intern (vals->value_nick), make_int (vals->value)), assoc);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
252 assoc = Fcons (Fcons (intern (vals->value_name), make_int (vals->value)), assoc);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
253 vals++;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
254 }
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
255
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
256 assoc = Fnreverse (assoc);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
257
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
258 Fputhash (make_int (the_type), assoc, Venumeration_info);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
259 }
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
260
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
261 static void
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
262 import_gtk_type (GtkType t)
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
263 {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
264 if (type_already_imported_p (t))
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
265 {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
266 return;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
267 }
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
268
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
269 switch (GTK_FUNDAMENTAL_TYPE (t))
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
270 {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
271 case GTK_TYPE_ENUM:
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
272 case GTK_TYPE_FLAGS:
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
273 import_gtk_enumeration_internal (t);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
274 break;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
275 case GTK_TYPE_OBJECT:
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
276 import_gtk_object_internal (t);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
277 break;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
278 default:
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
279 break;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
280 }
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
281
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
282 mark_type_as_imported (t);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
283 }
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
284
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
285
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
286 /* Foreign function calls */
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
287 static emacs_ffi_data *
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
288 allocate_ffi_data (void)
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
289 {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
290 emacs_ffi_data *data = alloc_lcrecord_type (emacs_ffi_data, &lrecord_emacs_ffi);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
291
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
292 data->return_type = GTK_TYPE_NONE;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
293 data->n_args = 0;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
294 data->function_name = Qnil;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
295 data->function_ptr = 0;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
296 data->marshal = 0;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
297
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
298 return (data);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
299 }
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
300
934
c925bacdda60 [xemacs-hg @ 2002-07-29 09:21:12 by michaels]
michaels
parents: 867
diff changeset
301 #ifdef USE_KKCC
c925bacdda60 [xemacs-hg @ 2002-07-29 09:21:12 by michaels]
michaels
parents: 867
diff changeset
302 static const struct lrecord_description ffi_data_description [] = {
c925bacdda60 [xemacs-hg @ 2002-07-29 09:21:12 by michaels]
michaels
parents: 867
diff changeset
303 { XD_LISP_OBJECT, offsetof (struct emacs_ffi_data, function_name) },
c925bacdda60 [xemacs-hg @ 2002-07-29 09:21:12 by michaels]
michaels
parents: 867
diff changeset
304 { XD_END }
c925bacdda60 [xemacs-hg @ 2002-07-29 09:21:12 by michaels]
michaels
parents: 867
diff changeset
305 };
c925bacdda60 [xemacs-hg @ 2002-07-29 09:21:12 by michaels]
michaels
parents: 867
diff changeset
306 #endif /* USE_KKCC */
c925bacdda60 [xemacs-hg @ 2002-07-29 09:21:12 by michaels]
michaels
parents: 867
diff changeset
307
462
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
308 static Lisp_Object
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
309 mark_ffi_data (Lisp_Object obj)
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
310 {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
311 emacs_ffi_data *data = (emacs_ffi_data *) XFFI (obj);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
312
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
313 mark_object (data->function_name);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
314 return (Qnil);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
315 }
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
316
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
317 static void
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
318 ffi_object_printer (Lisp_Object obj, Lisp_Object printcharfun, int escapeflag)
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
319 {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
320 if (print_readably)
563
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 462
diff changeset
321 printing_unreadable_object ("#<ffi %p>", XFFI (obj)->function_ptr);
462
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
322
800
a5954632b187 [xemacs-hg @ 2002-03-31 08:27:14 by ben]
ben
parents: 797
diff changeset
323 write_fmt_string_lisp (printcharfun, "#<ffi %S", 1, XFFI (obj)->function_name);
462
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
324 if (XFFI (obj)->n_args)
800
a5954632b187 [xemacs-hg @ 2002-03-31 08:27:14 by ben]
ben
parents: 797
diff changeset
325 write_fmt_string (printcharfun, " %d arguments", XFFI (obj)->n_args);
a5954632b187 [xemacs-hg @ 2002-03-31 08:27:14 by ben]
ben
parents: 797
diff changeset
326 write_fmt_string (printcharfun, " %p>", (void *)XFFI (obj)->function_ptr);
462
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
327 }
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
328
934
c925bacdda60 [xemacs-hg @ 2002-07-29 09:21:12 by michaels]
michaels
parents: 867
diff changeset
329 #ifdef USE_KKCC
c925bacdda60 [xemacs-hg @ 2002-07-29 09:21:12 by michaels]
michaels
parents: 867
diff changeset
330 DEFINE_LRECORD_IMPLEMENTATION ("ffi", emacs_ffi,
960
5b372a329b97 [xemacs-hg @ 2002-08-12 08:00:01 by michaels]
michaels
parents: 934
diff changeset
331 0, /*dumpable-flag*/
934
c925bacdda60 [xemacs-hg @ 2002-07-29 09:21:12 by michaels]
michaels
parents: 867
diff changeset
332 mark_ffi_data, ffi_object_printer,
c925bacdda60 [xemacs-hg @ 2002-07-29 09:21:12 by michaels]
michaels
parents: 867
diff changeset
333 0, 0, 0,
c925bacdda60 [xemacs-hg @ 2002-07-29 09:21:12 by michaels]
michaels
parents: 867
diff changeset
334 ffi_data_description, emacs_ffi_data);
c925bacdda60 [xemacs-hg @ 2002-07-29 09:21:12 by michaels]
michaels
parents: 867
diff changeset
335 #else /* not USE_KKCC */
462
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
336 DEFINE_LRECORD_IMPLEMENTATION ("ffi", emacs_ffi,
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
337 mark_ffi_data, ffi_object_printer,
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
338 0, 0, 0, NULL, emacs_ffi_data);
934
c925bacdda60 [xemacs-hg @ 2002-07-29 09:21:12 by michaels]
michaels
parents: 867
diff changeset
339 #endif /* not USE_KKCC */
462
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
340
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
341 typedef GtkObject * (*__OBJECT_fn) ();
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
342 typedef gint (*__INT_fn) ();
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
343 typedef void (*__NONE_fn) ();
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
344 typedef gchar * (*__STRING_fn) ();
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
345 typedef gboolean (*__BOOL_fn) ();
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
346 typedef gfloat (*__FLOAT_fn) ();
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
347 typedef void * (*__POINTER_fn) ();
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
348 typedef GList * (*__LIST_fn) ();
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
349
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
350 /* An auto-generated file of marshalling functions. */
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
351 #include "emacs-marshals.c"
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
352
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
353 #define CONVERT_SINGLE_TYPE(var,nam,tp) case GTK_TYPE_##nam: GTK_VALUE_##nam (var) = * (tp *) v; break;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
354 #define CONVERT_RETVAL(a,freep) \
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
355 do { \
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
356 void *v = GTK_VALUE_POINTER(a); \
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
357 switch (GTK_FUNDAMENTAL_TYPE (a.type)) \
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
358 { \
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
359 CONVERT_SINGLE_TYPE(a,CHAR,gchar); \
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
360 CONVERT_SINGLE_TYPE(a,UCHAR,guchar); \
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
361 CONVERT_SINGLE_TYPE(a,BOOL,gboolean); \
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
362 CONVERT_SINGLE_TYPE(a,INT,gint); \
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
363 CONVERT_SINGLE_TYPE(a,UINT,guint); \
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
364 CONVERT_SINGLE_TYPE(a,LONG,glong); \
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
365 CONVERT_SINGLE_TYPE(a,ULONG,gulong); \
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
366 CONVERT_SINGLE_TYPE(a,FLOAT,gfloat); \
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
367 CONVERT_SINGLE_TYPE(a,DOUBLE,gdouble); \
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
368 CONVERT_SINGLE_TYPE(a,STRING,gchar *); \
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
369 CONVERT_SINGLE_TYPE(a,ENUM,gint); \
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
370 CONVERT_SINGLE_TYPE(a,FLAGS,guint); \
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
371 CONVERT_SINGLE_TYPE(a,BOXED,void *); \
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
372 CONVERT_SINGLE_TYPE(a,POINTER,void *); \
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
373 CONVERT_SINGLE_TYPE(a,OBJECT,GtkObject *); \
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
374 default: \
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
375 GTK_VALUE_POINTER (a) = * (void **) v; \
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
376 break; \
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
377 } \
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
378 if (freep) xfree(v); \
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
379 } while (0)
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
380
778
2923009caf47 [xemacs-hg @ 2002-03-16 10:38:59 by ben]
ben
parents: 563
diff changeset
381 static gpointer __allocate_object_storage (GtkType t)
462
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
382 {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
383 size_t s = 0;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
384 void *rval = NULL;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
385
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
386 switch (GTK_FUNDAMENTAL_TYPE (t))
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
387 {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
388 /* flag types */
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
389 case GTK_TYPE_CHAR:
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
390 s = (sizeof (gchar));
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
391 break;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
392 case GTK_TYPE_UCHAR:
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
393 s = (sizeof (guchar));
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
394 break;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
395 case GTK_TYPE_BOOL:
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
396 s = (sizeof (gboolean));
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
397 break;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
398 case GTK_TYPE_INT:
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
399 s = (sizeof (gint));
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
400 break;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
401 case GTK_TYPE_UINT:
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
402 s = (sizeof (guint));
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
403 break;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
404 case GTK_TYPE_LONG:
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
405 s = (sizeof (glong));
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
406 break;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
407 case GTK_TYPE_ULONG:
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
408 s = (sizeof (gulong));
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
409 break;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
410 case GTK_TYPE_FLOAT:
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
411 s = (sizeof (gfloat));
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
412 break;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
413 case GTK_TYPE_DOUBLE:
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
414 s = (sizeof (gdouble));
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
415 break;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
416 case GTK_TYPE_STRING:
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
417 s = (sizeof (gchar *));
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
418 break;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
419 case GTK_TYPE_ENUM:
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
420 case GTK_TYPE_FLAGS:
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
421 s = (sizeof (guint));
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
422 break;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
423 case GTK_TYPE_BOXED:
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
424 case GTK_TYPE_POINTER:
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
425 s = (sizeof (void *));
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
426 break;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
427
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
428 /* base type of the object system */
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
429 case GTK_TYPE_OBJECT:
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
430 s = (sizeof (GtkObject *));
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
431 break;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
432
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
433 default:
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
434 if (GTK_FUNDAMENTAL_TYPE (t) == GTK_TYPE_LISTOF)
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
435 {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
436 s = (sizeof (void *));
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
437 }
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
438 rval = NULL;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
439 break;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
440 }
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
441
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
442 if (s)
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
443 {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
444 rval = xmalloc (s);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
445 memset (rval, '\0', s);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
446 }
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
447
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
448 return (rval);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
449 }
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
450
778
2923009caf47 [xemacs-hg @ 2002-03-16 10:38:59 by ben]
ben
parents: 563
diff changeset
451 static Lisp_Object type_to_marshaller_type (GtkType t)
462
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
452 {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
453 switch (GTK_FUNDAMENTAL_TYPE (t))
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
454 {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
455 case GTK_TYPE_NONE:
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
456 return (build_string ("NONE"));
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
457 /* flag types */
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
458 case GTK_TYPE_CHAR:
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
459 case GTK_TYPE_UCHAR:
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
460 return (build_string ("CHAR"));
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
461 case GTK_TYPE_BOOL:
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
462 return (build_string ("BOOL"));
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
463 case GTK_TYPE_ENUM:
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
464 case GTK_TYPE_FLAGS:
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
465 case GTK_TYPE_INT:
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
466 case GTK_TYPE_UINT:
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
467 return (build_string ("INT"));
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
468 case GTK_TYPE_LONG:
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
469 case GTK_TYPE_ULONG:
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
470 return (build_string ("LONG"));
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
471 case GTK_TYPE_FLOAT:
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
472 case GTK_TYPE_DOUBLE:
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
473 return (build_string ("FLOAT"));
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
474 case GTK_TYPE_STRING:
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
475 return (build_string ("STRING"));
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
476 case GTK_TYPE_BOXED:
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
477 case GTK_TYPE_POINTER:
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
478 return (build_string ("POINTER"));
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
479 case GTK_TYPE_OBJECT:
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
480 return (build_string ("OBJECT"));
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
481 case GTK_TYPE_CALLBACK:
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
482 return (build_string ("CALLBACK"));
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
483 default:
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
484 /* I can't put this in the main switch statement because it is a
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
485 new fundamental type that is not fixed at compile time.
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
486 *sigh*
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
487 */
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
488 if (GTK_FUNDAMENTAL_TYPE (t) == GTK_TYPE_ARRAY)
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
489 return (build_string ("ARRAY"));
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
490
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
491 if (GTK_FUNDAMENTAL_TYPE (t) == GTK_TYPE_LISTOF)
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
492 return (build_string ("LIST"));
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
493 return (Qnil);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
494 }
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
495 }
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
496
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
497 struct __dll_mapper_closure {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
498 void * (*func) (dll_handle, const char *);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
499 const char *obj_name;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
500 void **storage;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
501 };
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
502
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
503 static void __dll_mapper (gpointer key, gpointer value, gpointer user_data)
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
504 {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
505 struct __dll_mapper_closure *closure = (struct __dll_mapper_closure *) user_data;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
506
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
507 if (*(closure->storage) == NULL)
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
508 {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
509 /* Need to see if it is in this one */
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
510 *(closure->storage) = closure->func ((dll_handle) value, closure->obj_name);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
511 }
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
512 }
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
513
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
514 DEFUN ("gtk-import-variable-internal", Fgtk_import_variable_internal, 2, 2, 0, /*
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
515 Import a variable into the XEmacs namespace.
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
516 */
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
517 (type, name))
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
518 {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
519 void *var = NULL;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
520 GtkArg arg;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
521
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
522 if (SYMBOLP (type)) type = Fsymbol_name (type);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
523
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
524 CHECK_STRING (type);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
525 CHECK_STRING (name);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
526
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
527 initialize_dll_cache ();
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
528 xemacs_init_gtk_classes ();
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
529
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
530 arg.type = gtk_type_from_name ((char *) XSTRING_DATA (type));
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
531
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
532 if (arg.type == GTK_TYPE_INVALID)
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
533 {
563
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 462
diff changeset
534 sferror ("Unknown type", type);
462
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
535 }
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
536
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
537 /* Need to look thru the already-loaded dlls */
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
538 {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
539 struct __dll_mapper_closure closure;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
540
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
541 closure.func = dll_variable;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
542 closure.obj_name = XSTRING_DATA (name);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
543 closure.storage = &var;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
544
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
545 g_hash_table_foreach (dll_cache, __dll_mapper, &closure);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
546 }
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
547
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
548 if (!var)
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
549 {
563
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 462
diff changeset
550 gui_error ("Could not locate variable", name);
462
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
551 }
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
552
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
553 GTK_VALUE_POINTER(arg) = var;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
554 CONVERT_RETVAL (arg, 0);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
555 return (gtk_type_to_lisp (&arg));
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
556 }
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
557
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
558 DEFUN ("gtk-import-function-internal", Fgtk_import_function_internal, 2, 3, 0, /*
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
559 Import a function into the XEmacs namespace.
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
560 */
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
561 (rettype, name, args))
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
562 {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
563 Lisp_Object rval = Qnil;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
564 Lisp_Object marshaller = Qnil;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
565 emacs_ffi_data *data = NULL;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
566 gint n_args = 0;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
567 #if 0
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
568 dll_handle h = NULL;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
569 #endif
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
570 ffi_marshalling_function marshaller_func = NULL;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
571 ffi_actual_function name_func = NULL;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
572
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
573 CHECK_SYMBOL (rettype);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
574 CHECK_STRING (name);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
575 CHECK_LIST (args);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
576
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
577 initialize_dll_cache ();
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
578 xemacs_init_gtk_classes ();
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
579
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
580 /* Need to look thru the already-loaded dlls */
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
581 {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
582 struct __dll_mapper_closure closure;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
583
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
584 closure.func = dll_function;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
585 closure.obj_name = XSTRING_DATA (name);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
586 closure.storage = (void **) &name_func;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
587
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
588 g_hash_table_foreach (dll_cache, __dll_mapper, &closure);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
589 }
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
590
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
591 if (!name_func)
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
592 {
563
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 462
diff changeset
593 gui_error ("Could not locate function", name);
462
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
594 }
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
595
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
596 data = allocate_ffi_data ();
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
597
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
598 if (NILP (rettype))
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
599 {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
600 rettype = Qvoid;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
601 }
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
602
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
603 if (!NILP (args))
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
604 {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
605 Lisp_Object tail = Qnil;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
606 Lisp_Object value = args;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
607 Lisp_Object type = Qnil;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
608
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
609 EXTERNAL_LIST_LOOP (tail, value)
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
610 {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
611 GtkType the_type;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
612 Lisp_Object marshaller_type = Qnil;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
613
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
614 CHECK_SYMBOL (XCAR (tail));
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
615
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
616 type = Fsymbol_name (XCAR (tail));
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
617
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
618 the_type = gtk_type_from_name ((char *) XSTRING_DATA (type));
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
619
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
620 if (the_type == GTK_TYPE_INVALID)
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
621 {
563
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 462
diff changeset
622 invalid_argument ("Unknown argument type", type);
462
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
623 }
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
624
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
625 /* All things must be reduced to their basest form... */
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
626 import_gtk_type (the_type);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
627 data->args[n_args] = the_type; /* GTK_FUNDAMENTAL_TYPE (the_type); */
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
628
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
629 /* Now lets build up another chunk of our marshaller function name */
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
630 marshaller_type = type_to_marshaller_type (data->args[n_args]);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
631
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
632 if (NILP (marshaller_type))
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
633 {
563
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 462
diff changeset
634 invalid_argument ("Do not know how to marshal", type);
462
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
635 }
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
636 marshaller = concat3 (marshaller, build_string ("_"), marshaller_type);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
637 n_args++;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
638 }
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
639 }
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
640 else
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
641 {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
642 marshaller = concat3 (marshaller, build_string ("_"), type_to_marshaller_type (GTK_TYPE_NONE));
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
643 }
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
644
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
645 rettype = Fsymbol_name (rettype);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
646 data->return_type = gtk_type_from_name ((char *) XSTRING_DATA (rettype));
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
647
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
648 if (data->return_type == GTK_TYPE_INVALID)
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
649 {
563
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 462
diff changeset
650 invalid_argument ("Unknown return type", rettype);
462
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
651 }
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
652
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
653 import_gtk_type (data->return_type);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
654
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
655 marshaller = concat3 (type_to_marshaller_type (data->return_type), build_string ("_"), marshaller);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
656 marshaller = concat2 (build_string ("emacs_gtk_marshal_"), marshaller);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
657
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
658 marshaller_func = (ffi_marshalling_function) find_marshaller ((char *) XSTRING_DATA (marshaller));
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
659
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
660 if (!marshaller_func)
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
661 {
563
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 462
diff changeset
662 gui_error ("Could not locate marshaller function", marshaller);
462
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
663 }
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
664
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
665 data->n_args = n_args;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
666 data->function_name = name;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
667 data->function_ptr = name_func;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
668 data->marshal = marshaller_func;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
669
797
776fcda0ee36 [xemacs-hg @ 2002-03-29 13:51:37 by wmperry]
wmperry
parents: 793
diff changeset
670 rval = wrap_emacs_ffi (data);
462
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
671 return (rval);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
672 }
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
673
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
674 DEFUN ("gtk-call-function", Fgtk_call_function, 1, 2, 0, /*
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
675 Call an external function.
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
676 */
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
677 (func, args))
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
678 {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
679 GtkArg the_args[MAX_GTK_ARGS];
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
680 gint n_args = 0;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
681 Lisp_Object retval = Qnil;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
682
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
683 CHECK_FFI (func);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
684 CHECK_LIST (args);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
685
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
686 n_args = XINT (Flength (args));
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
687
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
688 #ifdef XEMACS_IS_SMARTER_THAN_THE_PROGRAMMER
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
689 /* #### I think this is too dangerous to enable by default.
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
690 ** #### Genuine program bugs would probably be allowed to
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
691 ** #### slip by, and not be very easy to find.
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
692 ** #### Bill Perry July 9, 2000
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
693 */
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
694 if (n_args != XFFI(func)->n_args)
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
695 {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
696 Lisp_Object for_append[3];
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
697
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
698 /* Signal an error if they pass in too many arguments */
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
699 if (n_args > XFFI(func)->n_args)
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
700 {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
701 return Fsignal (Qwrong_number_of_arguments,
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
702 list2 (func, make_int (n_args)));
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
703 }
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
704
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
705 /* If they did not provide enough arguments, be nice and assume
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
706 ** they wanted `nil' in there.
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
707 */
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
708 for_append[0] = args;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
709 for_append[1] = Fmake_list (make_int (XFFI(func)->n_args - n_args), Qnil);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
710
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
711 args = Fappend (2, for_append);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
712 }
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
713 #else
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
714 if (n_args != XFFI(func)->n_args)
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
715 {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
716 /* Signal an error if they do not pass in the correct # of arguments */
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
717 return Fsignal (Qwrong_number_of_arguments,
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
718 list2 (func, make_int (n_args)));
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
719 }
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
720 #endif
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
721
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
722 if (!NILP (args))
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
723 {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
724 Lisp_Object tail = Qnil;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
725 Lisp_Object value = args;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
726
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
727 CHECK_LIST (args);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
728 n_args = 0;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
729
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
730 /* First we convert all of the arguments from Lisp to GtkArgs */
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
731 EXTERNAL_LIST_LOOP (tail, value)
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
732 {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
733 the_args[n_args].type = XFFI (func)->args[n_args];
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
734
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
735 if (lisp_to_gtk_type (XCAR (tail), &the_args[n_args]))
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
736 {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
737 /* There was some sort of an error */
563
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 462
diff changeset
738 gui_error ("Error converting arguments", args);
462
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
739 }
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
740 n_args++;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
741 }
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
742 }
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
743
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
744 /* Now we need to tack on space for a return value, if they have
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
745 asked for one */
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
746 if (XFFI (func)->return_type != GTK_TYPE_NONE)
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
747 {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
748 the_args[n_args].type = XFFI (func)->return_type;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
749 GTK_VALUE_POINTER (the_args[n_args]) = __allocate_object_storage (the_args[n_args].type);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
750 n_args++;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
751 }
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
752
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
753 XFFI (func)->marshal ((ffi_actual_function) (XFFI (func)->function_ptr), the_args);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
754
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
755 if (XFFI (func)->return_type != GTK_TYPE_NONE)
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
756 {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
757 CONVERT_RETVAL (the_args[n_args - 1], 1);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
758 retval = gtk_type_to_lisp (&the_args[n_args - 1]);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
759 }
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
760
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
761 /* Need to free any array or list pointers */
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
762 {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
763 int i;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
764 for (i = 0; i < n_args; i++)
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
765 {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
766 if (GTK_FUNDAMENTAL_TYPE (the_args[i].type) == GTK_TYPE_ARRAY)
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
767 {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
768 g_free (GTK_VALUE_POINTER (the_args[i]));
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
769 }
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
770 else if (GTK_FUNDAMENTAL_TYPE (the_args[i].type) == GTK_TYPE_LISTOF)
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
771 {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
772 /* g_list_free (GTK_VALUE_POINTER (the_args[i])); */
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
773 }
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
774 }
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
775 }
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
776
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
777 return (retval);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
778 }
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
779
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
780
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
781
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
782 /* GtkObject wrapping for Lisp */
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
783 static void
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
784 emacs_gtk_object_printer (Lisp_Object obj, Lisp_Object printcharfun, int escapeflag)
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
785 {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
786 if (print_readably)
563
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 462
diff changeset
787 printing_unreadable_object ("#<GtkObject %p>", XGTK_OBJECT (obj)->object);
462
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
788
826
6728e641994e [xemacs-hg @ 2002-05-05 11:30:15 by ben]
ben
parents: 800
diff changeset
789 write_c_string (printcharfun, "#<GtkObject (");
462
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
790 if (XGTK_OBJECT (obj)->alive_p)
826
6728e641994e [xemacs-hg @ 2002-05-05 11:30:15 by ben]
ben
parents: 800
diff changeset
791 write_c_string (printcharfun, gtk_type_name (GTK_OBJECT_TYPE (XGTK_OBJECT (obj)->object)));
462
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
792 else
826
6728e641994e [xemacs-hg @ 2002-05-05 11:30:15 by ben]
ben
parents: 800
diff changeset
793 write_c_string (printcharfun, "dead");
800
a5954632b187 [xemacs-hg @ 2002-03-31 08:27:14 by ben]
ben
parents: 797
diff changeset
794 write_fmt_string (printcharfun, ") %p>", (void *) XGTK_OBJECT (obj)->object);
462
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
795 }
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
796
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
797 static Lisp_Object
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
798 object_getprop (Lisp_Object obj, Lisp_Object prop)
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
799 {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
800 Lisp_Object rval = Qnil;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
801 Lisp_Object prop_name = Qnil;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
802 GtkArgInfo *info = NULL;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
803 char *err;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
804 GtkArg args[2];
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
805
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
806 CHECK_SYMBOL (prop); /* Shouldn't need to ever do this, but I'm paranoid */
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
807
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
808 prop_name = Fsymbol_name (prop);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
809
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
810 args[0].name = (char *) XSTRING_DATA (prop_name);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
811
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
812 err = gtk_object_arg_get_info (GTK_OBJECT_TYPE (XGTK_OBJECT (obj)->object),
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
813 args[0].name,
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
814 &info);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
815
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
816 if (err)
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
817 {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
818 /* Not a magic symbol, fall back to just looking in our real plist */
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
819 g_free (err);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
820
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
821 return (Fplist_get (XGTK_OBJECT (obj)->plist, prop, Qunbound));
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
822 }
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
823
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
824 if (!(info->arg_flags & GTK_ARG_READABLE))
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
825 {
563
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 462
diff changeset
826 invalid_operation ("Attempt to get write-only property", prop);
462
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
827 }
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
828
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
829 gtk_object_getv (XGTK_OBJECT (obj)->object, 1, args);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
830
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
831 if (args[0].type == GTK_TYPE_INVALID)
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
832 {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
833 /* If we can't get the attribute, then let the code in Fget know
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
834 so it can use the default value supplied by the caller */
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
835 return (Qunbound);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
836 }
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
837
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
838 rval = gtk_type_to_lisp (&args[0]);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
839
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
840 /* Free up any memory. According to the documentation and Havoc's
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
841 book, if the fundamental type of the returned value is
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
842 GTK_TYPE_STRING, GTK_TYPE_BOXED, or GTK_TYPE_ARGS, you are
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
843 responsible for freeing it. */
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
844 switch (GTK_FUNDAMENTAL_TYPE (args[0].type))
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
845 {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
846 case GTK_TYPE_STRING:
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
847 g_free (GTK_VALUE_STRING (args[0]));
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
848 break;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
849 case GTK_TYPE_BOXED:
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
850 g_free (GTK_VALUE_BOXED (args[0]));
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
851 break;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
852 case GTK_TYPE_ARGS:
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
853 g_free (GTK_VALUE_ARGS (args[0]).args);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
854 default:
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
855 break;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
856 }
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
857
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
858 return (rval);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
859 }
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
860
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
861 static int
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
862 object_putprop (Lisp_Object obj, Lisp_Object prop, Lisp_Object value)
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
863 {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
864 GtkArgInfo *info = NULL;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
865 Lisp_Object prop_name = Qnil;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
866 GtkArg args[2];
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
867 char *err = NULL;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
868
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
869 prop_name = Fsymbol_name (prop);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
870
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
871 args[0].name = (char *) XSTRING_DATA (prop_name);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
872
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
873 err = gtk_object_arg_get_info (GTK_OBJECT_TYPE (XGTK_OBJECT (obj)->object),
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
874 args[0].name,
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
875 &info);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
876
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
877 if (err)
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
878 {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
879 /* Not a magic symbol, fall back to just storing in our real plist */
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
880 g_free (err);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
881
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
882 XGTK_OBJECT (obj)->plist = Fplist_put (XGTK_OBJECT (obj)->plist, prop, value);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
883 return (1);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
884 }
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
885
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
886 args[0].type = info->type;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
887
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
888 if (lisp_to_gtk_type (value, &args[0]))
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
889 {
563
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 462
diff changeset
890 gui_error ("Error converting to GtkType", value);
462
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
891 }
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
892
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
893 if (!(info->arg_flags & GTK_ARG_WRITABLE))
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
894 {
563
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 462
diff changeset
895 invalid_operation ("Attempt to set read-only argument", prop);
462
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
896 }
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
897
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
898 gtk_object_setv (XGTK_OBJECT (obj)->object, 1, args);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
899
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
900 return (1);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
901 }
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
902
934
c925bacdda60 [xemacs-hg @ 2002-07-29 09:21:12 by michaels]
michaels
parents: 867
diff changeset
903 #ifdef USE_KKCC
c925bacdda60 [xemacs-hg @ 2002-07-29 09:21:12 by michaels]
michaels
parents: 867
diff changeset
904 static const struct lrecord_description gtk_object_data_description [] = {
c925bacdda60 [xemacs-hg @ 2002-07-29 09:21:12 by michaels]
michaels
parents: 867
diff changeset
905 { XD_LISP_OBJECT, offsetof (struct emacs_gtk_object_data, plist) },
c925bacdda60 [xemacs-hg @ 2002-07-29 09:21:12 by michaels]
michaels
parents: 867
diff changeset
906 { XD_END }
c925bacdda60 [xemacs-hg @ 2002-07-29 09:21:12 by michaels]
michaels
parents: 867
diff changeset
907 };
c925bacdda60 [xemacs-hg @ 2002-07-29 09:21:12 by michaels]
michaels
parents: 867
diff changeset
908 #endif /* USE_KKCC */
c925bacdda60 [xemacs-hg @ 2002-07-29 09:21:12 by michaels]
michaels
parents: 867
diff changeset
909
462
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
910 static Lisp_Object
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
911 mark_gtk_object_data (Lisp_Object obj)
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
912 {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
913 return (XGTK_OBJECT (obj)->plist);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
914 }
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
915
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
916 static void
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
917 emacs_gtk_object_finalizer (void *header, int for_disksave)
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
918 {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
919 emacs_gtk_object_data *data = (emacs_gtk_object_data *) header;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
920
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
921 if (for_disksave)
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
922 {
797
776fcda0ee36 [xemacs-hg @ 2002-03-29 13:51:37 by wmperry]
wmperry
parents: 793
diff changeset
923 Lisp_Object obj = wrap_emacs_gtk_object (data);
793
e38acbeb1cae [xemacs-hg @ 2002-03-29 04:46:17 by ben]
ben
parents: 778
diff changeset
924
462
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
925
563
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 462
diff changeset
926 invalid_operation
462
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
927 ("Can't dump an emacs containing GtkObject objects", obj);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
928 }
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
929
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
930 if (data->alive_p)
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
931 {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
932 gtk_object_unref (data->object);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
933 }
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
934 }
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
935
934
c925bacdda60 [xemacs-hg @ 2002-07-29 09:21:12 by michaels]
michaels
parents: 867
diff changeset
936 #ifdef USE_KKCC
c925bacdda60 [xemacs-hg @ 2002-07-29 09:21:12 by michaels]
michaels
parents: 867
diff changeset
937 DEFINE_LRECORD_IMPLEMENTATION_WITH_PROPS ("GtkObject", emacs_gtk_object,
960
5b372a329b97 [xemacs-hg @ 2002-08-12 08:00:01 by michaels]
michaels
parents: 934
diff changeset
938 0, /*dumpable-flag*/
934
c925bacdda60 [xemacs-hg @ 2002-07-29 09:21:12 by michaels]
michaels
parents: 867
diff changeset
939 mark_gtk_object_data, /* marker function */
c925bacdda60 [xemacs-hg @ 2002-07-29 09:21:12 by michaels]
michaels
parents: 867
diff changeset
940 emacs_gtk_object_printer, /* print function */
c925bacdda60 [xemacs-hg @ 2002-07-29 09:21:12 by michaels]
michaels
parents: 867
diff changeset
941 emacs_gtk_object_finalizer, /* finalizer */
c925bacdda60 [xemacs-hg @ 2002-07-29 09:21:12 by michaels]
michaels
parents: 867
diff changeset
942 0, /* equality */
c925bacdda60 [xemacs-hg @ 2002-07-29 09:21:12 by michaels]
michaels
parents: 867
diff changeset
943 0, /* hash */
c925bacdda60 [xemacs-hg @ 2002-07-29 09:21:12 by michaels]
michaels
parents: 867
diff changeset
944 gtk_object_data_description, /* desc */
c925bacdda60 [xemacs-hg @ 2002-07-29 09:21:12 by michaels]
michaels
parents: 867
diff changeset
945 object_getprop, /* get prop */
c925bacdda60 [xemacs-hg @ 2002-07-29 09:21:12 by michaels]
michaels
parents: 867
diff changeset
946 object_putprop, /* put prop */
c925bacdda60 [xemacs-hg @ 2002-07-29 09:21:12 by michaels]
michaels
parents: 867
diff changeset
947 0, /* rem prop */
c925bacdda60 [xemacs-hg @ 2002-07-29 09:21:12 by michaels]
michaels
parents: 867
diff changeset
948 0, /* plist */
c925bacdda60 [xemacs-hg @ 2002-07-29 09:21:12 by michaels]
michaels
parents: 867
diff changeset
949 emacs_gtk_object_data);
c925bacdda60 [xemacs-hg @ 2002-07-29 09:21:12 by michaels]
michaels
parents: 867
diff changeset
950 #else /* not USE_KKCC */
462
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
951 DEFINE_LRECORD_IMPLEMENTATION_WITH_PROPS ("GtkObject", emacs_gtk_object,
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
952 mark_gtk_object_data, /* marker function */
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
953 emacs_gtk_object_printer, /* print function */
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
954 emacs_gtk_object_finalizer, /* finalizer */
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
955 0, /* equality */
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
956 0, /* hash */
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
957 NULL, /* desc */
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
958 object_getprop, /* get prop */
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
959 object_putprop, /* put prop */
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
960 0, /* rem prop */
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
961 0, /* plist */
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
962 emacs_gtk_object_data);
934
c925bacdda60 [xemacs-hg @ 2002-07-29 09:21:12 by michaels]
michaels
parents: 867
diff changeset
963 #endif /* not USE_KKCC */
462
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
964
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
965 static emacs_gtk_object_data *
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
966 allocate_emacs_gtk_object_data (void)
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
967 {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
968 emacs_gtk_object_data *data = alloc_lcrecord_type (emacs_gtk_object_data,
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
969 &lrecord_emacs_gtk_object);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
970
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
971 data->object = NULL;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
972 data->alive_p = FALSE;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
973 data->plist = Qnil;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
974
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
975 return (data);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
976 }
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
977
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
978 /* We need to keep track of when the object is destroyed so that we
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
979 can mark it as dead, otherwise even our print routine (which calls
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
980 GTK_OBJECT_TYPE) will crap out and die. This is also used in the
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
981 lisp_to_gtk_type() routine to defend against passing dead objects
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
982 to GTK routines. */
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
983 static void
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
984 __notice_object_destruction (GtkObject *obj, gpointer user_data)
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
985 {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
986 ungcpro_popup_callbacks ((GUI_ID) user_data);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
987 }
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
988
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
989 Lisp_Object build_gtk_object (GtkObject *obj)
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
990 {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
991 Lisp_Object retval = Qnil;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
992 emacs_gtk_object_data *data = NULL;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
993 GUI_ID id = 0;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
994
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
995 id = (GUI_ID) gtk_object_get_data (obj, "xemacs::gui_id");
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
996
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
997 if (id)
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
998 {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
999 retval = get_gcpro_popup_callbacks (id);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1000 }
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1001
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1002 if (NILP (retval))
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1003 {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1004 data = allocate_emacs_gtk_object_data ();
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1005
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1006 data->object = obj;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1007 data->alive_p = TRUE;
797
776fcda0ee36 [xemacs-hg @ 2002-03-29 13:51:37 by wmperry]
wmperry
parents: 793
diff changeset
1008 retval = wrap_emacs_gtk_object (data);
462
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1009
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1010 id = new_gui_id ();
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1011 gtk_object_set_data (obj, "xemacs::gui_id", (gpointer) id);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1012 gcpro_popup_callbacks (id, retval);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1013 gtk_object_ref (obj);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1014 gtk_signal_connect (obj, "destroy", GTK_SIGNAL_FUNC (__notice_object_destruction), (gpointer)id);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1015 }
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1016
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1017 return (retval);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1018 }
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1019
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1020 static void
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1021 __internal_callback_destroy (gpointer data)
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1022 {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1023 Lisp_Object lisp_data;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1024
826
6728e641994e [xemacs-hg @ 2002-05-05 11:30:15 by ben]
ben
parents: 800
diff changeset
1025 lisp_data = VOID_TO_LISP (data);
462
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1026
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1027 ungcpro_popup_callbacks (XINT (XCAR (lisp_data)));
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1028 }
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1029
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1030 static void
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1031 __internal_callback_marshal (GtkObject *obj, gpointer data, guint n_args, GtkArg *args)
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1032 {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1033 Lisp_Object arg_list = Qnil;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1034 Lisp_Object callback_fn = Qnil;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1035 Lisp_Object callback_data = Qnil;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1036 Lisp_Object newargs[3];
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1037 Lisp_Object rval = Qnil;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1038 struct gcpro gcpro1;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1039 int i;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1040
826
6728e641994e [xemacs-hg @ 2002-05-05 11:30:15 by ben]
ben
parents: 800
diff changeset
1041 callback_fn = VOID_TO_LISP (data);
462
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1042
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1043 /* Nuke the GUI_ID off the front */
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1044 callback_fn = XCDR (callback_fn);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1045
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1046 callback_data = XCAR (callback_fn);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1047 callback_fn = XCDR (callback_fn);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1048
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1049 /* The callback data goes at the very end of the argument list */
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1050 arg_list = Fcons (callback_data, Qnil);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1051
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1052 /* Build up the argument list, lisp style */
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1053 for (i = n_args - 1; i >= 0; i--)
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1054 {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1055 arg_list = Fcons (gtk_type_to_lisp (&args[i]), arg_list);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1056 }
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1057
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1058 /* We always pass the widget as the first parameter at the very least */
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1059 arg_list = Fcons (build_gtk_object (obj), arg_list);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1060
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1061 GCPRO1 ((arg_list));
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1062
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1063 newargs[0] = callback_fn;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1064 newargs[1] = arg_list;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1065
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1066 rval = Fapply (2, newargs);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1067 signal_fake_event ();
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1068
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1069 if (args[n_args].type != GTK_TYPE_NONE)
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1070 lisp_to_gtk_type (rval, &args[n_args]);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1071
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1072 UNGCPRO;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1073 }
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1074
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1075 DEFUN ("gtk-signal-connect", Fgtk_signal_connect, 3, 6, 0, /*
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1076 */
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1077 (obj, name, func, cb_data, object_signal, after_p))
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1078 {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1079 int c_after;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1080 int c_object_signal;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1081 GUI_ID id = 0;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1082
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1083 CHECK_GTK_OBJECT (obj);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1084
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1085 if (SYMBOLP (name))
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1086 name = Fsymbol_name (name);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1087
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1088 CHECK_STRING (name);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1089
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1090 if (NILP (object_signal))
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1091 c_object_signal = 0;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1092 else
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1093 c_object_signal = 1;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1094
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1095 if (NILP (after_p))
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1096 c_after = 0;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1097 else
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1098 c_after = 1;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1099
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1100 id = new_gui_id ();
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1101 func = Fcons (cb_data, func);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1102 func = Fcons (make_int (id), func);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1103
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1104 gcpro_popup_callbacks (id, func);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1105
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1106 gtk_signal_connect_full (XGTK_OBJECT (obj)->object, (char *) XSTRING_DATA (name),
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1107 NULL, __internal_callback_marshal, LISP_TO_VOID (func),
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1108 __internal_callback_destroy, c_object_signal, c_after);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1109 return (Qt);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1110 }
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1111
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1112
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1113 /* GTK_TYPE_BOXED wrapper for Emacs lisp */
960
5b372a329b97 [xemacs-hg @ 2002-08-12 08:00:01 by michaels]
michaels
parents: 934
diff changeset
1114 #ifdef USE_KKCC
5b372a329b97 [xemacs-hg @ 2002-08-12 08:00:01 by michaels]
michaels
parents: 934
diff changeset
1115 static const struct lrecord_description emacs_gtk_boxed_description [] = {
5b372a329b97 [xemacs-hg @ 2002-08-12 08:00:01 by michaels]
michaels
parents: 934
diff changeset
1116 { XD_END }
5b372a329b97 [xemacs-hg @ 2002-08-12 08:00:01 by michaels]
michaels
parents: 934
diff changeset
1117 };
5b372a329b97 [xemacs-hg @ 2002-08-12 08:00:01 by michaels]
michaels
parents: 934
diff changeset
1118 #endif /* USE_KKCC */
5b372a329b97 [xemacs-hg @ 2002-08-12 08:00:01 by michaels]
michaels
parents: 934
diff changeset
1119
462
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1120 static void
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1121 emacs_gtk_boxed_printer (Lisp_Object obj, Lisp_Object printcharfun, int escapeflag)
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1122 {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1123 if (print_readably)
563
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 462
diff changeset
1124 printing_unreadable_object ("#<GtkBoxed %p>", XGTK_BOXED (obj)->object);
462
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1125
826
6728e641994e [xemacs-hg @ 2002-05-05 11:30:15 by ben]
ben
parents: 800
diff changeset
1126 write_c_string (printcharfun, "#<GtkBoxed (");
6728e641994e [xemacs-hg @ 2002-05-05 11:30:15 by ben]
ben
parents: 800
diff changeset
1127 write_c_string (printcharfun, gtk_type_name (XGTK_BOXED (obj)->object_type));
800
a5954632b187 [xemacs-hg @ 2002-03-31 08:27:14 by ben]
ben
parents: 797
diff changeset
1128 write_fmt_string (printcharfun, ") %p>", (void *) XGTK_BOXED (obj)->object);
462
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1129 }
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1130
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1131 static int
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1132 emacs_gtk_boxed_equality (Lisp_Object o1, Lisp_Object o2, int depth)
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1133 {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1134 emacs_gtk_boxed_data *data1 = XGTK_BOXED(o1);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1135 emacs_gtk_boxed_data *data2 = XGTK_BOXED(o2);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1136
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1137 return ((data1->object == data2->object) &&
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1138 (data1->object_type == data2->object_type));
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1139 }
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1140
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1141 static unsigned long
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1142 emacs_gtk_boxed_hash (Lisp_Object obj, int depth)
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1143 {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1144 emacs_gtk_boxed_data *data = XGTK_BOXED(obj);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1145 return (HASH2 ((unsigned long)data->object, data->object_type));
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1146 }
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1147
960
5b372a329b97 [xemacs-hg @ 2002-08-12 08:00:01 by michaels]
michaels
parents: 934
diff changeset
1148 #ifdef USE_KKCC
5b372a329b97 [xemacs-hg @ 2002-08-12 08:00:01 by michaels]
michaels
parents: 934
diff changeset
1149 DEFINE_LRECORD_IMPLEMENTATION_WITH_PROPS ("GtkBoxed", emacs_gtk_boxed,
5b372a329b97 [xemacs-hg @ 2002-08-12 08:00:01 by michaels]
michaels
parents: 934
diff changeset
1150 0, /*dumpable-flag*/
5b372a329b97 [xemacs-hg @ 2002-08-12 08:00:01 by michaels]
michaels
parents: 934
diff changeset
1151 0, /* marker function */
5b372a329b97 [xemacs-hg @ 2002-08-12 08:00:01 by michaels]
michaels
parents: 934
diff changeset
1152 emacs_gtk_boxed_printer, /* print function */
5b372a329b97 [xemacs-hg @ 2002-08-12 08:00:01 by michaels]
michaels
parents: 934
diff changeset
1153 0, /* nuker */
5b372a329b97 [xemacs-hg @ 2002-08-12 08:00:01 by michaels]
michaels
parents: 934
diff changeset
1154 emacs_gtk_boxed_equality, /* equality */
5b372a329b97 [xemacs-hg @ 2002-08-12 08:00:01 by michaels]
michaels
parents: 934
diff changeset
1155 emacs_gtk_boxed_hash, /* hash */
5b372a329b97 [xemacs-hg @ 2002-08-12 08:00:01 by michaels]
michaels
parents: 934
diff changeset
1156 emacs_gtk_boxed_description, /* desc */
5b372a329b97 [xemacs-hg @ 2002-08-12 08:00:01 by michaels]
michaels
parents: 934
diff changeset
1157 0, /* get prop */
5b372a329b97 [xemacs-hg @ 2002-08-12 08:00:01 by michaels]
michaels
parents: 934
diff changeset
1158 0, /* put prop */
5b372a329b97 [xemacs-hg @ 2002-08-12 08:00:01 by michaels]
michaels
parents: 934
diff changeset
1159 0, /* rem prop */
5b372a329b97 [xemacs-hg @ 2002-08-12 08:00:01 by michaels]
michaels
parents: 934
diff changeset
1160 0, /* plist */
5b372a329b97 [xemacs-hg @ 2002-08-12 08:00:01 by michaels]
michaels
parents: 934
diff changeset
1161 emacs_gtk_boxed_data);
5b372a329b97 [xemacs-hg @ 2002-08-12 08:00:01 by michaels]
michaels
parents: 934
diff changeset
1162 #else /* not USE_KKCC */
462
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1163 DEFINE_LRECORD_IMPLEMENTATION_WITH_PROPS ("GtkBoxed", emacs_gtk_boxed,
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1164 0, /* marker function */
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1165 emacs_gtk_boxed_printer, /* print function */
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1166 0, /* nuker */
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1167 emacs_gtk_boxed_equality, /* equality */
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1168 emacs_gtk_boxed_hash, /* hash */
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1169 NULL, /* desc */
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1170 0, /* get prop */
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1171 0, /* put prop */
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1172 0, /* rem prop */
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1173 0, /* plist */
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1174 emacs_gtk_boxed_data);
960
5b372a329b97 [xemacs-hg @ 2002-08-12 08:00:01 by michaels]
michaels
parents: 934
diff changeset
1175 #endif /* not USE_KKCC */
462
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1176 /* Currently defined GTK_TYPE_BOXED structures are:
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1177
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1178 GtkAccelGroup -
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1179 GtkSelectionData -
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1180 GtkStyle -
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1181 GtkCTreeNode -
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1182 GdkColormap -
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1183 GdkVisual -
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1184 GdkFont -
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1185 GdkWindow -
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1186 GdkDragContext -
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1187 GdkEvent -
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1188 GdkColor -
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1189 */
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1190 static emacs_gtk_boxed_data *
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1191 allocate_emacs_gtk_boxed_data (void)
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1192 {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1193 emacs_gtk_boxed_data *data = alloc_lcrecord_type (emacs_gtk_boxed_data,
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1194 &lrecord_emacs_gtk_boxed);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1195
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1196 data->object = NULL;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1197 data->object_type = GTK_TYPE_INVALID;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1198
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1199 return (data);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1200 }
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1201
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1202 Lisp_Object build_gtk_boxed (void *obj, GtkType t)
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1203 {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1204 Lisp_Object retval = Qnil;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1205 emacs_gtk_boxed_data *data = NULL;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1206
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1207 if (GTK_FUNDAMENTAL_TYPE (t) != GTK_TYPE_BOXED)
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1208 abort();
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1209
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1210 data = allocate_emacs_gtk_boxed_data ();
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1211 data->object = obj;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1212 data->object_type = t;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1213
797
776fcda0ee36 [xemacs-hg @ 2002-03-29 13:51:37 by wmperry]
wmperry
parents: 793
diff changeset
1214 retval = wrap_emacs_gtk_boxed (data);
462
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1215
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1216 return (retval);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1217 }
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1218
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1219
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1220 /* The automatically generated structure access routines */
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1221 #include "emacs-widget-accessors.c"
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1222
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1223 /* The hand generated funky functions that we can't just import using the FFI */
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1224 #include "ui-byhand.c"
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1225
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1226 /* The glade support */
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1227 #include "glade.c"
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1228
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1229
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1230 /* Type manipulation */
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1231 DEFUN ("gtk-fundamental-type", Fgtk_fundamental_type, 1, 1, 0, /*
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1232 Load a shared library DLL into XEmacs. No initialization routines are required.
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1233 This is for loading dependency DLLs into XEmacs.
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1234 */
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1235 (type))
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1236 {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1237 GtkType t;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1238
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1239 if (SYMBOLP (type))
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1240 type = Fsymbol_name (type);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1241
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1242 CHECK_STRING (type);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1243
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1244 t = gtk_type_from_name ((char *) XSTRING_DATA (type));
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1245
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1246 if (t == GTK_TYPE_INVALID)
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1247 {
563
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 462
diff changeset
1248 invalid_argument ("Not a GTK type", type);
462
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1249 }
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1250 return (make_int (GTK_FUNDAMENTAL_TYPE (t)));
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1251 }
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1252
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1253 DEFUN ("gtk-object-type", Fgtk_object_type, 1, 1, 0, /*
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1254 Return the GtkType of OBJECT.
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1255 */
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1256 (object))
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1257 {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1258 CHECK_GTK_OBJECT (object);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1259 return (make_int (GTK_OBJECT_TYPE (XGTK_OBJECT (object)->object)));
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1260 }
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1261
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1262 DEFUN ("gtk-describe-type", Fgtk_describe_type, 1, 1, 0, /*
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1263 Returns a cons of two lists describing the Gtk object TYPE.
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1264 The car is a list of all the signals that it will emit.
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1265 The cdr is a list of all the magic properties it has.
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1266 */
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1267 (type))
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1268 {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1269 Lisp_Object rval, signals, props;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1270 GtkType t;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1271
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1272 props = signals = rval = Qnil;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1273
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1274 if (SYMBOLP (type))
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1275 {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1276 type = Fsymbol_name (type);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1277 }
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1278
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1279 if (STRINGP (type))
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1280 {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1281 t = gtk_type_from_name (XSTRING_DATA (type));
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1282 if (t == GTK_TYPE_INVALID)
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1283 {
563
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 462
diff changeset
1284 invalid_argument ("Not a GTK type", type);
462
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1285 }
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1286 }
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1287 else
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1288 {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1289 CHECK_INT (type);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1290 t = XINT (type);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1291 }
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1292
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1293 if (GTK_FUNDAMENTAL_TYPE (t) != GTK_TYPE_OBJECT)
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1294 {
563
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 462
diff changeset
1295 invalid_argument ("Not a GtkObject", type);
462
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1296 }
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1297
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1298 /* Need to do stupid shit like this to get the args
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1299 ** registered... damn GTK and its lazy loading
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1300 */
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1301 {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1302 GtkArg args[3];
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1303 GtkObject *obj = gtk_object_newv (t, 0, args);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1304
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1305 gtk_object_destroy(obj);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1306 }
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1307
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1308 do
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1309 {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1310 guint i;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1311
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1312 /* Do the magic arguments first */
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1313 {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1314 GtkArg *args;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1315 guint32 *flags;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1316 guint n_args;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1317
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1318 args = gtk_object_query_args(t,&flags,&n_args);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1319
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1320 for (i = 0; i < n_args; i++)
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1321 {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1322 props = Fcons (Fcons (intern (gtk_type_name(args[i].type)),
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1323 intern (args[i].name)), props);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1324 }
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1325
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1326 g_free (args);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1327 g_free (flags);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1328 }
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1329
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1330 /* Now the signals */
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1331 {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1332 GtkObjectClass *klass;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1333 GtkSignalQuery *query;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1334 guint32 *gtk_signals;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1335 guint n_signals;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1336
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1337 klass = (GtkObjectClass *) gtk_type_class (t);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1338 gtk_signals = klass->signals;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1339 n_signals = klass->nsignals;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1340
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1341 for (i = 0; i < n_signals; i++)
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1342 {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1343 Lisp_Object params = Qnil;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1344
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1345 query = gtk_signal_query (gtk_signals[i]);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1346
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1347 if (query)
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1348 {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1349 if (query->nparams)
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1350 {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1351 int j;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1352
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1353 for (j = query->nparams - 1; j >= 0; j--)
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1354 {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1355 params = Fcons (intern (gtk_type_name (query->params[j])), params);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1356 }
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1357 }
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1358
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1359 signals = Fcons (Fcons (intern (gtk_type_name (query->return_val)),
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1360 Fcons (intern (query->signal_name),
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1361 params)),
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1362 signals);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1363
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1364 g_free (query);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1365 }
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1366 }
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1367 }
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1368 t = gtk_type_parent(t);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1369 } while (t != GTK_TYPE_INVALID);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1370
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1371 rval = Fcons (signals, props);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1372
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1373 return (rval);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1374 }
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1375
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1376
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1377 void
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1378 syms_of_ui_gtk (void)
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1379 {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1380 INIT_LRECORD_IMPLEMENTATION (emacs_ffi);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1381 INIT_LRECORD_IMPLEMENTATION (emacs_gtk_object);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1382 INIT_LRECORD_IMPLEMENTATION (emacs_gtk_boxed);
563
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 462
diff changeset
1383 DEFSYMBOL_MULTIWORD_PREDICATE (Qemacs_ffip);
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 462
diff changeset
1384 DEFSYMBOL_MULTIWORD_PREDICATE (Qemacs_gtk_objectp);
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 462
diff changeset
1385 DEFSYMBOL_MULTIWORD_PREDICATE (Qemacs_gtk_boxedp);
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 462
diff changeset
1386 DEFSYMBOL (Qvoid);
462
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1387 DEFSUBR (Fdll_load);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1388 DEFSUBR (Fgtk_import_function_internal);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1389 DEFSUBR (Fgtk_import_variable_internal);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1390 DEFSUBR (Fgtk_signal_connect);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1391 DEFSUBR (Fgtk_call_function);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1392 DEFSUBR (Fgtk_fundamental_type);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1393 DEFSUBR (Fgtk_object_type);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1394 DEFSUBR (Fgtk_describe_type);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1395 syms_of_widget_accessors ();
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1396 syms_of_ui_byhand ();
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1397 syms_of_glade ();
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1398 }
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1399
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1400 void
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1401 vars_of_ui_gtk (void)
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1402 {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1403 Fprovide (intern ("gtk-ui"));
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1404 DEFVAR_LISP ("gtk-enumeration-info", &Venumeration_info /*
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1405 A hashtable holding type information about GTK enumerations and flags.
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1406 Do NOT modify unless you really understand ui-gtk.c.
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1407 */);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1408
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1409 Venumeration_info = Qnil;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1410 vars_of_glade ();
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1411 }
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1412
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1413
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1414 /* Various utility functions */
778
2923009caf47 [xemacs-hg @ 2002-03-16 10:38:59 by ben]
ben
parents: 563
diff changeset
1415 #if 0
462
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1416 void describe_gtk_arg (GtkArg *arg)
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1417 {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1418 GtkArg a = *arg;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1419
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1420 switch (GTK_FUNDAMENTAL_TYPE (a.type))
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1421 {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1422 /* flag types */
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1423 case GTK_TYPE_CHAR:
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1424 stderr_out ("char: %c\n", GTK_VALUE_CHAR (a));
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1425 break;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1426 case GTK_TYPE_UCHAR:
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1427 stderr_out ("uchar: %c\n", GTK_VALUE_CHAR (a));
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1428 break;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1429 case GTK_TYPE_BOOL:
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1430 stderr_out ("uchar: %s\n", GTK_VALUE_BOOL (a) ? "true" : "false");
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1431 break;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1432 case GTK_TYPE_INT:
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1433 stderr_out ("int: %d\n", GTK_VALUE_INT (a));
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1434 break;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1435 case GTK_TYPE_UINT:
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1436 stderr_out ("uint: %du\n", GTK_VALUE_UINT (a));
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1437 break;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1438 case GTK_TYPE_LONG:
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1439 stderr_out ("long: %ld\n", GTK_VALUE_LONG (a));
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1440 break;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1441 case GTK_TYPE_ULONG:
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1442 stderr_out ("ulong: %lu\n", GTK_VALUE_ULONG (a));
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1443 break;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1444 case GTK_TYPE_FLOAT:
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1445 stderr_out ("float: %g\n", GTK_VALUE_FLOAT (a));
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1446 break;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1447 case GTK_TYPE_DOUBLE:
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1448 stderr_out ("double: %f\n", GTK_VALUE_DOUBLE (a));
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1449 break;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1450 case GTK_TYPE_STRING:
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1451 stderr_out ("string: %s\n", GTK_VALUE_STRING (a));
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1452 break;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1453 case GTK_TYPE_ENUM:
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1454 case GTK_TYPE_FLAGS:
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1455 stderr_out ("%s: ", (a.type == GTK_TYPE_ENUM) ? "enum" : "flag");
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1456 {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1457 GtkEnumValue *vals = gtk_type_enum_get_values (a.type);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1458
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1459 while (vals && vals->value_name && (vals->value != GTK_VALUE_ENUM(a))) vals++;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1460
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1461 stderr_out ("%s\n", vals ? vals->value_name : "!!! UNKNOWN ENUM VALUE !!!");
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1462 }
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1463 break;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1464 case GTK_TYPE_BOXED:
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1465 stderr_out ("boxed: %p\n", GTK_VALUE_BOXED (a));
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1466 break;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1467 case GTK_TYPE_POINTER:
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1468 stderr_out ("pointer: %p\n", GTK_VALUE_BOXED (a));
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1469 break;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1470
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1471 /* structured types */
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1472 case GTK_TYPE_SIGNAL:
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1473 case GTK_TYPE_ARGS: /* This we can do as a list of values */
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1474 abort();
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1475 case GTK_TYPE_CALLBACK:
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1476 stderr_out ("callback fn: ...\n");
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1477 break;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1478 case GTK_TYPE_C_CALLBACK:
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1479 case GTK_TYPE_FOREIGN:
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1480 abort();
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1481
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1482 /* base type of the object system */
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1483 case GTK_TYPE_OBJECT:
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1484 if (GTK_VALUE_OBJECT (a))
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1485 stderr_out ("object: %s\n", gtk_type_name (GTK_OBJECT_TYPE (GTK_VALUE_OBJECT (a))));
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1486 else
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1487 stderr_out ("object: NULL\n");
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1488 break;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1489
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1490 default:
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1491 abort();
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1492 }
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1493 }
778
2923009caf47 [xemacs-hg @ 2002-03-16 10:38:59 by ben]
ben
parents: 563
diff changeset
1494 #endif
462
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1495
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1496 Lisp_Object gtk_type_to_lisp (GtkArg *arg)
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1497 {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1498 switch (GTK_FUNDAMENTAL_TYPE (arg->type))
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1499 {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1500 case GTK_TYPE_NONE:
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1501 return (Qnil);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1502 case GTK_TYPE_CHAR:
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1503 return (make_char (GTK_VALUE_CHAR (*arg)));
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1504 case GTK_TYPE_UCHAR:
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1505 return (make_char (GTK_VALUE_UCHAR (*arg)));
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1506 case GTK_TYPE_BOOL:
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1507 return (GTK_VALUE_BOOL (*arg) ? Qt : Qnil);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1508 case GTK_TYPE_INT:
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1509 return (make_int (GTK_VALUE_INT (*arg)));
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1510 case GTK_TYPE_UINT:
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1511 return (make_int (GTK_VALUE_INT (*arg)));
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1512 case GTK_TYPE_LONG: /* I think these are wrong! */
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1513 return (make_int (GTK_VALUE_INT (*arg)));
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1514 case GTK_TYPE_ULONG: /* I think these are wrong! */
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1515 return (make_int (GTK_VALUE_INT (*arg)));
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1516 case GTK_TYPE_FLOAT:
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1517 return (make_float (GTK_VALUE_FLOAT (*arg)));
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1518 case GTK_TYPE_DOUBLE:
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1519 return (make_float (GTK_VALUE_DOUBLE (*arg)));
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1520 case GTK_TYPE_STRING:
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1521 return (build_string (GTK_VALUE_STRING (*arg)));
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1522 case GTK_TYPE_FLAGS:
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1523 return (flags_to_list (GTK_VALUE_FLAGS (*arg), arg->type));
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1524 case GTK_TYPE_ENUM:
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1525 return (enum_to_symbol (GTK_VALUE_ENUM (*arg), arg->type));
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1526 case GTK_TYPE_BOXED:
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1527 if (arg->type == GTK_TYPE_GDK_EVENT)
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1528 {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1529 return (gdk_event_to_emacs_event((GdkEvent *) GTK_VALUE_BOXED (*arg)));
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1530 }
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1531
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1532 if (GTK_VALUE_BOXED (*arg))
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1533 return (build_gtk_boxed (GTK_VALUE_BOXED (*arg), arg->type));
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1534 else
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1535 return (Qnil);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1536 case GTK_TYPE_POINTER:
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1537 if (GTK_VALUE_POINTER (*arg))
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1538 {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1539 Lisp_Object rval;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1540
826
6728e641994e [xemacs-hg @ 2002-05-05 11:30:15 by ben]
ben
parents: 800
diff changeset
1541 rval = VOID_TO_LISP (GTK_VALUE_POINTER (*arg));
462
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1542 return (rval);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1543 }
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1544 else
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1545 return (Qnil);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1546 case GTK_TYPE_OBJECT:
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1547 if (GTK_VALUE_OBJECT (*arg))
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1548 return (build_gtk_object (GTK_VALUE_OBJECT (*arg)));
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1549 else
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1550 return (Qnil);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1551
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1552 case GTK_TYPE_CALLBACK:
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1553 {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1554 Lisp_Object rval;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1555
826
6728e641994e [xemacs-hg @ 2002-05-05 11:30:15 by ben]
ben
parents: 800
diff changeset
1556 rval = VOID_TO_LISP (GTK_VALUE_CALLBACK (*arg).data);
462
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1557
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1558 return (rval);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1559 }
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1560
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1561 default:
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1562 if (GTK_FUNDAMENTAL_TYPE (arg->type) == GTK_TYPE_LISTOF)
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1563 {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1564 if (!GTK_VALUE_POINTER (*arg))
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1565 return (Qnil);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1566 else
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1567 {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1568 return (xemacs_gtklist_to_list (arg));
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1569 }
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1570 }
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1571 stderr_out ("Do not know how to convert `%s' to lisp!\n", gtk_type_name (arg->type));
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1572 abort ();
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1573 }
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1574 /* This is chuck reminding GCC to... SHUT UP! */
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1575 return (Qnil);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1576 }
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1577
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1578 int lisp_to_gtk_type (Lisp_Object obj, GtkArg *arg)
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1579 {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1580 switch (GTK_FUNDAMENTAL_TYPE (arg->type))
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1581 {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1582 /* flag types */
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1583 case GTK_TYPE_NONE:
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1584 return (0);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1585 case GTK_TYPE_CHAR:
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1586 {
867
804517e16990 [xemacs-hg @ 2002-06-05 09:54:39 by ben]
ben
parents: 826
diff changeset
1587 Ichar c;
462
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1588
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1589 CHECK_CHAR_COERCE_INT (obj);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1590 c = XCHAR (obj);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1591 GTK_VALUE_CHAR (*arg) = c;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1592 }
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1593 break;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1594 case GTK_TYPE_UCHAR:
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1595 {
867
804517e16990 [xemacs-hg @ 2002-06-05 09:54:39 by ben]
ben
parents: 826
diff changeset
1596 Ichar c;
462
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1597
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1598 CHECK_CHAR_COERCE_INT (obj);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1599 c = XCHAR (obj);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1600 GTK_VALUE_CHAR (*arg) = c;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1601 }
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1602 break;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1603 case GTK_TYPE_BOOL:
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1604 GTK_VALUE_BOOL (*arg) = NILP (obj) ? FALSE : TRUE;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1605 break;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1606 case GTK_TYPE_INT:
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1607 case GTK_TYPE_UINT:
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1608 if (NILP (obj) || EQ (Qt, obj))
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1609 {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1610 /* For we are a kind mistress and allow sending t/nil for
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1611 1/0 to stupid GTK functions that say they take guint or
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1612 gint in the header files, but actually treat it like a
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1613 bool. *sigh*
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1614 */
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1615 GTK_VALUE_INT(*arg) = NILP (obj) ? 0 : 1;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1616 }
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1617 else
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1618 {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1619 CHECK_INT (obj);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1620 GTK_VALUE_INT(*arg) = XINT (obj);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1621 }
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1622 break;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1623 case GTK_TYPE_LONG:
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1624 case GTK_TYPE_ULONG:
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1625 abort();
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1626 case GTK_TYPE_FLOAT:
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1627 CHECK_INT_OR_FLOAT (obj);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1628 GTK_VALUE_FLOAT(*arg) = extract_float (obj);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1629 break;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1630 case GTK_TYPE_DOUBLE:
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1631 CHECK_INT_OR_FLOAT (obj);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1632 GTK_VALUE_DOUBLE(*arg) = extract_float (obj);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1633 break;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1634 case GTK_TYPE_STRING:
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1635 if (NILP (obj))
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1636 GTK_VALUE_STRING (*arg) = NULL;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1637 else
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1638 {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1639 CHECK_STRING (obj);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1640 GTK_VALUE_STRING (*arg) = (char *) XSTRING_DATA (obj);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1641 }
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1642 break;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1643 case GTK_TYPE_ENUM:
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1644 case GTK_TYPE_FLAGS:
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1645 /* Convert a lisp symbol to a GTK enum */
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1646 GTK_VALUE_ENUM(*arg) = lisp_to_flag (obj, arg->type);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1647 break;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1648 case GTK_TYPE_BOXED:
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1649 if (NILP (obj))
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1650 {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1651 GTK_VALUE_BOXED(*arg) = NULL;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1652 }
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1653 else if (GTK_BOXEDP (obj))
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1654 {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1655 GTK_VALUE_BOXED(*arg) = XGTK_BOXED (obj)->object;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1656 }
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1657 else if (arg->type == GTK_TYPE_STYLE)
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1658 {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1659 obj = Ffind_face (obj);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1660 CHECK_FACE (obj);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1661 GTK_VALUE_BOXED(*arg) = face_to_style (obj);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1662 }
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1663 else if (arg->type == GTK_TYPE_GDK_GC)
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1664 {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1665 obj = Ffind_face (obj);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1666 CHECK_FACE (obj);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1667 GTK_VALUE_BOXED(*arg) = face_to_gc (obj);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1668 }
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1669 else if (arg->type == GTK_TYPE_GDK_WINDOW)
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1670 {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1671 if (GLYPHP (obj))
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1672 {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1673 Lisp_Object window = Fselected_window (Qnil);
793
e38acbeb1cae [xemacs-hg @ 2002-03-29 04:46:17 by ben]
ben
parents: 778
diff changeset
1674 Lisp_Object instance =
e38acbeb1cae [xemacs-hg @ 2002-03-29 04:46:17 by ben]
ben
parents: 778
diff changeset
1675 glyph_image_instance (obj, window, ERROR_ME_DEBUG_WARN, 1);
462
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1676 struct Lisp_Image_Instance *p = XIMAGE_INSTANCE (instance);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1677
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1678 switch (XIMAGE_INSTANCE_TYPE (instance))
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1679 {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1680 case IMAGE_TEXT:
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1681 case IMAGE_POINTER:
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1682 case IMAGE_SUBWINDOW:
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1683 case IMAGE_NOTHING:
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1684 GTK_VALUE_BOXED(*arg) = NULL;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1685 break;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1686
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1687 case IMAGE_MONO_PIXMAP:
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1688 case IMAGE_COLOR_PIXMAP:
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1689 GTK_VALUE_BOXED(*arg) = IMAGE_INSTANCE_GTK_PIXMAP (p);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1690 break;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1691 }
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1692 }
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1693 else if (GTK_OBJECTP (obj) && GTK_IS_WIDGET (XGTK_OBJECT (obj)->object))
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1694 {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1695 GTK_VALUE_BOXED(*arg) = GTK_WIDGET (XGTK_OBJECT (obj))->window;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1696 }
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1697 else
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1698 {
563
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 462
diff changeset
1699 invalid_argument ("Don't know how to convert object to GDK_WINDOW", obj);
462
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1700 }
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1701 break;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1702 }
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1703 else if (arg->type == GTK_TYPE_GDK_COLOR)
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1704 {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1705 if (COLOR_SPECIFIERP (obj))
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1706 {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1707 /* If it is a specifier, we just convert it to an
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1708 instance, and let the ifs below handle it.
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1709 */
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1710 obj = Fspecifier_instance (obj, Qnil, Qnil, Qnil);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1711 }
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1712
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1713 if (COLOR_INSTANCEP (obj))
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1714 {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1715 /* Easiest one */
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1716 GTK_VALUE_BOXED(*arg) = COLOR_INSTANCE_GTK_COLOR (XCOLOR_INSTANCE (obj));
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1717 }
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1718 else if (STRINGP (obj))
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1719 {
563
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 462
diff changeset
1720 invalid_argument ("Please use a color specifier or instance, not a string", obj);
462
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1721 }
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1722 else
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1723 {
563
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 462
diff changeset
1724 invalid_argument ("Don't know how to convert to GdkColor", obj);
462
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1725 }
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1726 }
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1727 else if (arg->type == GTK_TYPE_GDK_FONT)
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1728 {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1729 if (SYMBOLP (obj))
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1730 {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1731 /* If it is a symbol, we treat that as a face name */
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1732 obj = Ffind_face (obj);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1733 }
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1734
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1735 if (FACEP (obj))
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1736 {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1737 /* If it is a face, we just grab the font specifier, and
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1738 cascade down until we finally reach a FONT_INSTANCE
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1739 */
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1740 obj = Fget (obj, Qfont, Qnil);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1741 }
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1742
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1743 if (FONT_SPECIFIERP (obj))
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1744 {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1745 /* If it is a specifier, we just convert it to an
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1746 instance, and let the ifs below handle it
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1747 */
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1748 obj = Fspecifier_instance (obj, Qnil, Qnil, Qnil);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1749 }
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1750
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1751 if (FONT_INSTANCEP (obj))
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1752 {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1753 /* Easiest one */
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1754 GTK_VALUE_BOXED(*arg) = FONT_INSTANCE_GTK_FONT (XFONT_INSTANCE (obj));
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1755 }
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1756 else if (STRINGP (obj))
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1757 {
563
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 462
diff changeset
1758 invalid_argument ("Please use a font specifier or instance, not a string", obj);
462
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1759 }
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1760 else
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1761 {
563
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 462
diff changeset
1762 invalid_argument ("Don't know how to convert to GdkColor", obj);
462
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1763 }
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1764 }
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1765 else
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1766 {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1767 /* Unknown type to convert to boxed */
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1768 stderr_out ("Don't know how to convert to boxed!\n");
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1769 GTK_VALUE_BOXED(*arg) = NULL;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1770 }
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1771 break;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1772
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1773 case GTK_TYPE_POINTER:
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1774 if (NILP (obj))
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1775 GTK_VALUE_POINTER(*arg) = NULL;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1776 else
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1777 GTK_VALUE_POINTER(*arg) = LISP_TO_VOID (obj);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1778 break;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1779
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1780 /* structured types */
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1781 case GTK_TYPE_SIGNAL:
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1782 case GTK_TYPE_ARGS: /* This we can do as a list of values */
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1783 case GTK_TYPE_C_CALLBACK:
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1784 case GTK_TYPE_FOREIGN:
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1785 stderr_out ("Do not know how to convert `%s' from lisp!\n", gtk_type_name (arg->type));
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1786 return (-1);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1787
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1788 #if 0
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1789 /* #### BILL! */
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1790 /* This is not used, and does not work with union type */
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1791 case GTK_TYPE_CALLBACK:
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1792 {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1793 GUI_ID id;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1794
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1795 id = new_gui_id ();
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1796 obj = Fcons (Qnil, obj); /* Empty data */
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1797 obj = Fcons (make_int (id), obj);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1798
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1799 gcpro_popup_callbacks (id, obj);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1800
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1801 GTK_VALUE_CALLBACK(*arg).marshal = __internal_callback_marshal;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1802 GTK_VALUE_CALLBACK(*arg).data = (gpointer) obj;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1803 GTK_VALUE_CALLBACK(*arg).notify = __internal_callback_destroy;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1804 }
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1805 break;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1806 #endif
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1807
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1808 /* base type of the object system */
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1809 case GTK_TYPE_OBJECT:
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1810 if (NILP (obj))
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1811 GTK_VALUE_OBJECT (*arg) = NULL;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1812 else
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1813 {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1814 CHECK_GTK_OBJECT (obj);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1815 if (XGTK_OBJECT (obj)->alive_p)
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1816 GTK_VALUE_OBJECT (*arg) = XGTK_OBJECT (obj)->object;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1817 else
563
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 462
diff changeset
1818 invalid_argument ("Attempting to pass dead object to GTK function", obj);
462
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1819 }
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1820 break;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1821
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1822 default:
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1823 if (GTK_FUNDAMENTAL_TYPE (arg->type) == GTK_TYPE_ARRAY)
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1824 {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1825 if (NILP (obj))
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1826 GTK_VALUE_POINTER(*arg) = NULL;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1827 else
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1828 {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1829 xemacs_list_to_array (obj, arg);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1830 }
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1831 }
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1832 else if (GTK_FUNDAMENTAL_TYPE (arg->type) == GTK_TYPE_LISTOF)
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1833 {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1834 if (NILP (obj))
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1835 GTK_VALUE_POINTER(*arg) = NULL;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1836 else
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1837 {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1838 xemacs_list_to_gtklist (obj, arg);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1839 }
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1840 }
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1841 else
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1842 {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1843 stderr_out ("Do not know how to convert `%s' from lisp!\n", gtk_type_name (arg->type));
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1844 abort();
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1845 }
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1846 break;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1847 }
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1848
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1849 return (0);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1850 }
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1851
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1852 /* This is used in glyphs-gtk.c as well */
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1853 static Lisp_Object
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1854 get_enumeration (GtkType t)
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1855 {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1856 Lisp_Object alist;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1857
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1858 if (NILP (Venumeration_info))
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1859 {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1860 Venumeration_info = call2 (intern ("make-hashtable"), make_int (100), Qequal);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1861 }
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1862
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1863 alist = Fgethash (make_int (t), Venumeration_info, Qnil);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1864
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1865 if (NILP (alist))
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1866 {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1867 import_gtk_enumeration_internal (t);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1868 alist = Fgethash (make_int (t), Venumeration_info, Qnil);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1869 }
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1870 return (alist);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1871 }
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1872
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1873 guint
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1874 symbol_to_enum (Lisp_Object obj, GtkType t)
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1875 {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1876 Lisp_Object alist = get_enumeration (t);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1877 Lisp_Object value = Qnil;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1878
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1879 if (NILP (alist))
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1880 {
563
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 462
diff changeset
1881 invalid_argument ("Unknown enumeration", build_string (gtk_type_name (t)));
462
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1882 }
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1883
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1884 value = Fassq (obj, alist);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1885
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1886 if (NILP (value))
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1887 {
563
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 462
diff changeset
1888 invalid_argument ("Unknown value", obj);
462
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1889 }
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1890
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1891 CHECK_INT (XCDR (value));
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1892
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1893 return (XINT (XCDR (value)));
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1894 }
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1895
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1896 static guint
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1897 lisp_to_flag (Lisp_Object obj, GtkType t)
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1898 {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1899 guint val = 0;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1900
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1901 if (NILP (obj))
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1902 {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1903 /* Do nothing */
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1904 }
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1905 else if (SYMBOLP (obj))
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1906 {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1907 val = symbol_to_enum (obj, t);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1908 }
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1909 else if (LISTP (obj))
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1910 {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1911 while (!NILP (obj))
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1912 {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1913 val |= symbol_to_enum (XCAR (obj), t);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1914 obj = XCDR (obj);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1915 }
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1916 }
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1917 else
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1918 {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1919 /* abort ()? */
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1920 }
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1921 return (val);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1922 }
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1923
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1924 static Lisp_Object
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1925 flags_to_list (guint value, GtkType t)
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1926 {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1927 Lisp_Object rval = Qnil;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1928 Lisp_Object alist = get_enumeration (t);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1929
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1930 while (!NILP (alist))
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1931 {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1932 if (value & XINT (XCDR (XCAR (alist))))
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1933 {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1934 rval = Fcons (XCAR (XCAR (alist)), rval);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1935 value &= ~(XINT (XCDR (XCAR (alist))));
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1936 }
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1937 alist = XCDR (alist);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1938 }
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1939 return (rval);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1940 }
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1941
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1942 static Lisp_Object
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1943 enum_to_symbol (guint value, GtkType t)
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1944 {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1945 Lisp_Object alist = get_enumeration (t);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1946 Lisp_Object cell = Qnil;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1947
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1948 if (NILP (alist))
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1949 {
563
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 462
diff changeset
1950 invalid_argument ("Unknown enumeration", build_string (gtk_type_name (t)));
462
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1951 }
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1952
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1953 cell = Frassq (make_int (value), alist);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1954
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1955 return (NILP (cell) ? Qnil : XCAR (cell));
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1956 }