Mercurial > hg > xemacs-beta
annotate src/ui-byhand.c @ 4709:db7068430402
Add explicit GPL v2 or later notices to Bill Perry's code, where such notices
are missing. This is done with Bill Perry's stated permission, in private
email to me.
author | Jerry James <james@xemacs.org> |
---|---|
date | Mon, 05 Oct 2009 11:08:59 -0600 |
parents | ecf1ebac70d8 |
children | 304aebb79cd3 |
rev | line source |
---|---|
462 | 1 /* I really wish this entire file could go away, but there is |
2 currently no way to do the following in the Foreign Function | |
3 Interface: | |
4 | |
5 1) Deal with return values in the parameter list (ie: int *foo) | |
6 | |
7 So we have to code a few functions by hand. Ick. | |
8 | |
9 William M. Perry 5/8/00 | |
4709
db7068430402
Add explicit GPL v2 or later notices to Bill Perry's code, where such notices
Jerry James <james@xemacs.org>
parents:
2367
diff
changeset
|
10 |
db7068430402
Add explicit GPL v2 or later notices to Bill Perry's code, where such notices
Jerry James <james@xemacs.org>
parents:
2367
diff
changeset
|
11 This file is part of XEmacs. |
db7068430402
Add explicit GPL v2 or later notices to Bill Perry's code, where such notices
Jerry James <james@xemacs.org>
parents:
2367
diff
changeset
|
12 |
db7068430402
Add explicit GPL v2 or later notices to Bill Perry's code, where such notices
Jerry James <james@xemacs.org>
parents:
2367
diff
changeset
|
13 XEmacs is free software; you can redistribute it and/or modify it |
db7068430402
Add explicit GPL v2 or later notices to Bill Perry's code, where such notices
Jerry James <james@xemacs.org>
parents:
2367
diff
changeset
|
14 under the terms of the GNU General Public License as published by the |
db7068430402
Add explicit GPL v2 or later notices to Bill Perry's code, where such notices
Jerry James <james@xemacs.org>
parents:
2367
diff
changeset
|
15 Free Software Foundation; either version 2, or (at your option) any |
db7068430402
Add explicit GPL v2 or later notices to Bill Perry's code, where such notices
Jerry James <james@xemacs.org>
parents:
2367
diff
changeset
|
16 later version. |
db7068430402
Add explicit GPL v2 or later notices to Bill Perry's code, where such notices
Jerry James <james@xemacs.org>
parents:
2367
diff
changeset
|
17 |
db7068430402
Add explicit GPL v2 or later notices to Bill Perry's code, where such notices
Jerry James <james@xemacs.org>
parents:
2367
diff
changeset
|
18 XEmacs is distributed in the hope that it will be useful, but WITHOUT |
db7068430402
Add explicit GPL v2 or later notices to Bill Perry's code, where such notices
Jerry James <james@xemacs.org>
parents:
2367
diff
changeset
|
19 ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or |
db7068430402
Add explicit GPL v2 or later notices to Bill Perry's code, where such notices
Jerry James <james@xemacs.org>
parents:
2367
diff
changeset
|
20 FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License |
db7068430402
Add explicit GPL v2 or later notices to Bill Perry's code, where such notices
Jerry James <james@xemacs.org>
parents:
2367
diff
changeset
|
21 for more details. |
db7068430402
Add explicit GPL v2 or later notices to Bill Perry's code, where such notices
Jerry James <james@xemacs.org>
parents:
2367
diff
changeset
|
22 |
db7068430402
Add explicit GPL v2 or later notices to Bill Perry's code, where such notices
Jerry James <james@xemacs.org>
parents:
2367
diff
changeset
|
23 You should have received a copy of the GNU General Public License |
db7068430402
Add explicit GPL v2 or later notices to Bill Perry's code, where such notices
Jerry James <james@xemacs.org>
parents:
2367
diff
changeset
|
24 along with XEmacs; see the file COPYING. If not, write to |
db7068430402
Add explicit GPL v2 or later notices to Bill Perry's code, where such notices
Jerry James <james@xemacs.org>
parents:
2367
diff
changeset
|
25 the Free Software Foundation, Inc., 51 Franklin Street - Fifth Floor, |
db7068430402
Add explicit GPL v2 or later notices to Bill Perry's code, where such notices
Jerry James <james@xemacs.org>
parents:
2367
diff
changeset
|
26 Boston, MA 02111-1301, USA. |
462 | 27 */ |
28 | |
29 #include "gui.h" | |
30 | |
31 DEFUN ("gtk-box-query-child-packing", Fgtk_box_query_child_packing, 2, 2,0, /* | |
32 Returns information about how CHILD is packed into BOX. | |
33 Return value is a list of (EXPAND FILL PADDING PACK_TYPE). | |
34 */ | |
35 (box, child)) | |
36 { | |
37 gboolean expand, fill; | |
38 guint padding; | |
39 GtkPackType pack_type; | |
40 Lisp_Object result = Qnil; | |
41 | |
42 CHECK_GTK_OBJECT (box); | |
43 CHECK_GTK_OBJECT (child); | |
44 | |
45 if (!GTK_IS_BOX (XGTK_OBJECT (box)->object)) | |
46 { | |
563 | 47 wtaerror ("Object is not a GtkBox", box); |
462 | 48 } |
49 | |
50 if (!GTK_IS_WIDGET (XGTK_OBJECT (child)->object)) | |
51 { | |
563 | 52 wtaerror ("Child is not a GtkWidget", child); |
462 | 53 } |
54 | |
55 gtk_box_query_child_packing (GTK_BOX (XGTK_OBJECT (box)->object), | |
56 GTK_WIDGET (XGTK_OBJECT (child)->object), | |
57 &expand, &fill, &padding, &pack_type); | |
58 | |
59 result = Fcons (make_int (pack_type), result); | |
60 result = Fcons (make_int (padding), result); | |
61 result = Fcons (fill ? Qt : Qnil, result); | |
62 result = Fcons (expand ? Qt : Qnil, result); | |
63 | |
64 return (result); | |
65 } | |
66 | |
67 /* void gtk_button_box_get_child_size_default (gint *min_width, gint *min_height); */ | |
68 DEFUN ("gtk-button-box-get-child-size-default", | |
69 Fgtk_button_box_get_child_size_default, 0, 0, 0, /* | |
70 Return a cons cell (WIDTH . HEIGHT) of the default button box child size. | |
71 */ | |
72 ()) | |
73 { | |
74 gint width, height; | |
75 | |
76 gtk_button_box_get_child_size_default (&width, &height); | |
77 | |
78 return (Fcons (make_int (width), make_int (height))); | |
79 } | |
80 | |
81 /* void gtk_button_box_get_child_ipadding_default (gint *ipad_x, gint *ipad_y); */ | |
82 DEFUN ("gtk-button-box-get-child-ipadding-default", | |
83 Fgtk_button_box_get_child_ipadding_default, 0, 0, 0, /* | |
84 Return a cons cell (X . Y) of the default button box ipadding. | |
85 */ | |
86 ()) | |
87 { | |
88 gint x, y; | |
89 | |
90 gtk_button_box_get_child_ipadding_default (&x, &y); | |
91 | |
92 return (Fcons (make_int (x), make_int (y))); | |
93 } | |
94 | |
95 /* void gtk_button_box_get_child_size (GtkButtonBox *widget, | |
96 gint *min_width, gint *min_height); */ | |
97 DEFUN ("gtk-button-box-get-child-size", Fgtk_button_box_get_child_size, 1, 1, 0, /* | |
98 Get the current size of a child in the buttonbox BOX. | |
99 */ | |
100 (box)) | |
101 { | |
102 gint width, height; | |
103 | |
104 CHECK_GTK_OBJECT (box); | |
105 | |
106 if (!GTK_IS_BUTTON_BOX (XGTK_OBJECT (box)->object)) | |
107 { | |
563 | 108 wtaerror ("Not a GtkBox object", box); |
462 | 109 } |
110 | |
111 gtk_button_box_get_child_size (GTK_BUTTON_BOX (XGTK_OBJECT (box)->object), | |
112 &width, &height); | |
113 | |
114 return (Fcons (make_int (width), make_int (height))); | |
115 } | |
116 | |
117 /* void gtk_button_box_get_child_ipadding (GtkButtonBox *widget, gint *ipad_x, gint *ipad_y); */ | |
118 DEFUN ("gtk-button-box-get-child-ipadding", | |
119 Fgtk_button_box_get_child_ipadding, 1, 1, 0, /* | |
120 Return a cons cell (X . Y) of the current buttonbox BOX ipadding. | |
121 */ | |
122 (box)) | |
123 { | |
124 gint x, y; | |
125 | |
126 CHECK_GTK_OBJECT (box); | |
127 | |
128 if (!GTK_IS_BUTTON_BOX (XGTK_OBJECT (box)->object)) | |
129 { | |
563 | 130 wtaerror ("Not a GtkBox object", box); |
462 | 131 } |
132 | |
133 gtk_button_box_get_child_ipadding (GTK_BUTTON_BOX (XGTK_OBJECT (box)->object), | |
134 &x, &y); | |
135 | |
136 return (Fcons (make_int (x), make_int (y))); | |
137 } | |
138 | |
139 /*void gtk_calendar_get_date (GtkCalendar *calendar, | |
140 guint *year, | |
141 guint *month, | |
142 guint *day); | |
143 */ | |
144 DEFUN ("gtk-calendar-get-date", Fgtk_calendar_get_date, 1, 1, 0, /* | |
145 Return a list of (YEAR MONTH DAY) from the CALENDAR object. | |
146 */ | |
147 (calendar)) | |
148 { | |
149 guint year, month, day; | |
150 | |
151 CHECK_GTK_OBJECT (calendar); | |
152 | |
153 if (!GTK_IS_CALENDAR (XGTK_OBJECT (calendar)->object)) | |
154 { | |
563 | 155 wtaerror ("Not a GtkCalendar object", calendar); |
462 | 156 } |
157 | |
158 gtk_calendar_get_date (GTK_CALENDAR (XGTK_OBJECT (calendar)->object), | |
159 &year, &month, &day); | |
160 | |
161 return (list3 (make_int (year), make_int (month), make_int (day))); | |
162 } | |
163 | |
164 /* gint gtk_clist_get_text (GtkCList *clist, | |
165 gint row, | |
166 gint column, | |
167 gchar **text); | |
168 */ | |
169 DEFUN ("gtk-clist-get-text", Fgtk_clist_get_text, 3, 3, 0, /* | |
170 Returns the text from GtkCList OBJ cell at coordinates ROW, COLUMN. | |
171 */ | |
172 (obj, row, column)) | |
173 { | |
174 gchar *text = NULL; | |
175 Lisp_Object rval = Qnil; | |
176 | |
177 CHECK_GTK_OBJECT (obj); | |
178 CHECK_INT (row); | |
179 CHECK_INT (column); | |
180 | |
181 if (!GTK_IS_CLIST (XGTK_OBJECT (obj)->object)) | |
182 { | |
563 | 183 wtaerror ("Object is not a GtkCList", obj); |
462 | 184 } |
185 | |
186 gtk_clist_get_text (GTK_CLIST (XGTK_OBJECT (obj)->object), XINT (row), XINT (column), &text); | |
187 | |
188 if (text) | |
189 { | |
190 rval = build_string (text); | |
191 /* NOTE: This is NOT a memory leak. GtkCList returns a pointer | |
192 to internally used memory, not a copy of it. | |
193 g_free (text); | |
194 */ | |
195 } | |
196 | |
197 return (rval); | |
198 } | |
199 | |
200 /* gint gtk_clist_get_selection_info (GtkCList *clist, | |
201 gint x, | |
202 gint y, | |
203 gint *row, | |
204 gint *column); */ | |
205 DEFUN ("gtk-clist-get-selection-info", Fgtk_clist_get_selection, 3, 3, 0, /* | |
206 Returns a cons cell of (ROW . COLUMN) of the GtkCList OBJ at coordinates X, Y. | |
207 */ | |
208 (obj, x, y)) | |
209 { | |
210 gint row, column; | |
211 | |
212 CHECK_GTK_OBJECT (obj); | |
213 CHECK_INT (x); | |
214 CHECK_INT (y); | |
215 | |
216 if (!GTK_IS_CLIST (XGTK_OBJECT (obj)->object)) | |
217 { | |
563 | 218 wtaerror ("Object is not a GtkCList", obj); |
462 | 219 } |
220 | |
221 gtk_clist_get_selection_info (GTK_CLIST (XGTK_OBJECT (obj)->object), | |
222 XINT (x), XINT (y), &row, &column); | |
223 | |
224 return (Fcons (make_int (row), make_int (column))); | |
225 } | |
226 | |
227 DEFUN ("gtk-clist-get-pixmap", Fgtk_clist_get_pixmap, 3, 3, 0, /* | |
228 Return a cons of (pixmap . mask) at ROW,COLUMN in CLIST. | |
229 */ | |
230 (clist, row, column)) | |
231 { | |
232 GdkPixmap *pixmap = NULL; | |
233 GdkBitmap *mask = NULL; | |
234 | |
235 CHECK_GTK_OBJECT (clist); | |
236 CHECK_INT (row); | |
237 CHECK_INT (column); | |
238 | |
239 if (!GTK_IS_CLIST (XGTK_OBJECT (clist)->object)) | |
240 { | |
563 | 241 wtaerror ("Object is not a GtkCList", clist); |
462 | 242 } |
243 | |
244 gtk_clist_get_pixmap (GTK_CLIST (XGTK_OBJECT (clist)->object), | |
245 XINT (row), XINT (column), | |
246 &pixmap, &mask); | |
247 | |
248 return (Fcons (pixmap ? build_gtk_boxed (pixmap, GTK_TYPE_GDK_WINDOW) : Qnil, | |
249 mask ? build_gtk_boxed (mask, GTK_TYPE_GDK_WINDOW) : Qnil)); | |
250 } | |
251 | |
252 DEFUN ("gtk-clist-get-pixtext", Fgtk_clist_get_pixtext, 3, 3, 0, /* | |
253 Return a list of (pixmap mask text) at ROW,COLUMN in CLIST. | |
254 */ | |
255 (clist, row, column)) | |
256 { | |
257 GdkPixmap *pixmap = NULL; | |
258 GdkBitmap *mask = NULL; | |
259 char *text = NULL; | |
260 guint8 spacing; | |
261 | |
262 CHECK_GTK_OBJECT (clist); | |
263 CHECK_INT (row); | |
264 CHECK_INT (column); | |
265 | |
266 if (!GTK_IS_CLIST (XGTK_OBJECT (clist)->object)) | |
267 { | |
563 | 268 wtaerror ("Object is not a GtkCList", clist); |
462 | 269 } |
270 | |
271 gtk_clist_get_pixtext (GTK_CLIST (XGTK_OBJECT (clist)->object), | |
272 XINT (row), XINT (column), &text, &spacing, | |
273 &pixmap, &mask); | |
274 | |
275 return (list3 (pixmap ? build_gtk_boxed (pixmap, GTK_TYPE_GDK_WINDOW) : Qnil, | |
276 mask ? build_gtk_boxed (mask, GTK_TYPE_GDK_WINDOW) : Qnil, | |
277 (text && text[0]) ? build_string (text) : Qnil)); | |
278 } | |
279 | |
280 /* void gtk_color_selection_get_color(GtkColorSelection *colorsel, gdouble *color); */ | |
281 DEFUN ("gtk-color-selection-get-color", Fgtk_color_selection_get_color, 1, 1, 0, /* | |
282 Return a list of (RED GREEN BLUE ALPHA) from the GtkColorSelection OBJECT. | |
283 */ | |
284 (object)) | |
285 { | |
286 gdouble rgba[4]; | |
287 | |
288 CHECK_GTK_OBJECT (object); | |
289 | |
290 if (!GTK_IS_COLOR_SELECTION (XGTK_OBJECT (object)->object)) | |
291 { | |
563 | 292 wtaerror ("Object is not a GtkColorSelection", object); |
462 | 293 } |
294 | |
295 gtk_color_selection_get_color (GTK_COLOR_SELECTION (XGTK_OBJECT (object)), rgba); | |
296 | |
297 return (list4 (make_float (rgba[0]), | |
298 make_float (rgba[1]), | |
299 make_float (rgba[2]), | |
300 make_float (rgba[3]))); | |
301 } | |
302 | |
303 /* (gtk-import-function nil "gtk_editable_insert_text" 'GtkEditable 'GtkString 'gint 'pointer-to-gint) */ | |
304 DEFUN ("gtk-editable-insert-text", Fgtk_editable_insert_text, 3, 3, 0, /* | |
305 Insert text STRINT at POS in GtkEditable widget OBJ. | |
306 Returns the new position of the cursor in the widget. | |
307 */ | |
308 (obj, string, pos)) | |
309 { | |
310 gint the_pos; | |
311 | |
312 CHECK_GTK_OBJECT (obj); | |
313 CHECK_STRING (string); | |
314 CHECK_INT (pos); | |
315 | |
316 the_pos = XINT (pos); | |
317 | |
318 if (!GTK_IS_EDITABLE (XGTK_OBJECT (obj)->object)) | |
319 { | |
563 | 320 wtaerror ("Object is not a GtkEditable", obj); |
462 | 321 } |
322 | |
323 gtk_editable_insert_text (GTK_EDITABLE (XGTK_OBJECT (obj)->object), | |
324 (char *) XSTRING_DATA (string), | |
325 XSTRING_LENGTH (string), | |
326 &the_pos); | |
327 | |
328 return (make_int (the_pos)); | |
329 } | |
330 | |
331 DEFUN ("gtk-pixmap-get", Fgtk_pixmap_get, 1, 1, 0, /* | |
332 Return a cons cell of (PIXMAP . MASK) from GtkPixmap OBJECT. | |
333 */ | |
334 (object)) | |
335 { | |
336 GdkPixmap *pixmap, *mask; | |
337 | |
338 CHECK_GTK_OBJECT (object); | |
339 | |
340 if (!GTK_IS_PIXMAP (XGTK_OBJECT (object)->object)) | |
341 { | |
563 | 342 wtaerror ("Object is not a GtkPixmap", object); |
462 | 343 } |
344 | |
345 gtk_pixmap_get (GTK_PIXMAP (XGTK_OBJECT (object)->object), &pixmap, &mask); | |
346 | |
347 return (Fcons (pixmap ? build_gtk_object (GTK_OBJECT (pixmap)) : Qnil, | |
348 mask ? build_gtk_object (GTK_OBJECT (mask)) : Qnil)); | |
349 } | |
350 | |
351 DEFUN ("gtk-curve-get-vector", Fgtk_curve_get_vector, 2, 2, 0, /* | |
352 Returns a vector of LENGTH points representing the curve of CURVE. | |
353 */ | |
354 (curve, length)) | |
355 { | |
356 gfloat *vector = NULL; | |
357 Lisp_Object lisp_vector = Qnil; | |
358 int i; | |
359 | |
360 CHECK_GTK_OBJECT (curve); | |
361 CHECK_INT (length); | |
362 | |
363 if (!GTK_IS_CURVE (XGTK_OBJECT (curve)->object)) | |
364 { | |
563 | 365 wtaerror ("Object is not a GtkCurve", curve); |
462 | 366 } |
367 | |
2367 | 368 vector = alloca_array (gfloat, XINT (length)); |
462 | 369 |
370 gtk_curve_get_vector (GTK_CURVE (XGTK_OBJECT (curve)->object), XINT (length), vector); | |
371 lisp_vector = make_vector (XINT (length), Qnil); | |
372 | |
373 for (i = 0; i < XINT (length); i++) | |
374 { | |
375 XVECTOR_DATA (lisp_vector)[i] = make_float (vector[i]); | |
376 } | |
377 | |
378 return (lisp_vector); | |
379 } | |
380 | |
381 DEFUN ("gtk-curve-set-vector", Fgtk_curve_set_vector, 2, 2, 0, /* | |
382 Set the vector of points on CURVE to VECTOR. | |
383 */ | |
384 (curve, vector)) | |
385 { | |
386 gfloat *c_vector = NULL; | |
387 int vec_length = 0; | |
388 int i; | |
389 | |
390 CHECK_GTK_OBJECT (curve); | |
391 CHECK_VECTOR (vector); | |
392 | |
393 vec_length = XVECTOR_LENGTH (vector); | |
394 | |
395 if (!GTK_IS_CURVE (XGTK_OBJECT (curve)->object)) | |
396 { | |
563 | 397 wtaerror ("Object is not a GtkCurve", curve); |
462 | 398 } |
399 | |
2367 | 400 c_vector = alloca_array (gfloat, vec_length); |
462 | 401 |
402 for (i = 0; i < vec_length; i++) | |
403 { | |
404 CHECK_FLOAT (XVECTOR_DATA (vector)[i]); | |
405 c_vector[i] = extract_float (XVECTOR_DATA (vector)[i]); | |
406 } | |
407 | |
408 gtk_curve_set_vector (GTK_CURVE (XGTK_OBJECT (curve)->object), vec_length, c_vector); | |
409 return (Qt); | |
410 } | |
411 | |
412 DEFUN ("gtk-label-get", Fgtk_label_get, 1, 1, 0, /* | |
413 Return the text of LABEL. | |
414 */ | |
415 (label)) | |
416 { | |
417 gchar *string; | |
418 | |
419 CHECK_GTK_OBJECT (label); | |
420 | |
421 if (!GTK_IS_LABEL (XGTK_OBJECT (label)->object)) | |
422 { | |
563 | 423 wtaerror ("Object is not a GtkLabel", label); |
462 | 424 } |
425 | |
426 gtk_label_get (GTK_LABEL (XGTK_OBJECT (label)->object), &string); | |
427 | |
428 return (build_string (string)); | |
429 } | |
430 | |
431 DEFUN ("gtk-notebook-query-tab-label-packing", Fgtk_notebook_query_tab_label_packing, 2, 2, 0, /* | |
432 Return a list of packing information (EXPAND FILL PACK_TYPE) for CHILD in NOTEBOOK. | |
433 */ | |
434 (notebook, child)) | |
435 { | |
436 gboolean expand, fill; | |
437 GtkPackType pack_type; | |
438 | |
439 CHECK_GTK_OBJECT (notebook); | |
440 CHECK_GTK_OBJECT (child); | |
441 | |
442 if (!GTK_IS_NOTEBOOK (XGTK_OBJECT (notebook)->object)) | |
443 { | |
563 | 444 wtaerror ("Object is not a GtkLabel", notebook); |
462 | 445 } |
446 | |
447 if (!GTK_IS_WIDGET (XGTK_OBJECT (child)->object)) | |
448 { | |
563 | 449 wtaerror ("Object is not a GtkWidget", child); |
462 | 450 } |
451 | |
452 gtk_notebook_query_tab_label_packing (GTK_NOTEBOOK (XGTK_OBJECT (notebook)->object), | |
453 GTK_WIDGET (XGTK_OBJECT (child)->object), | |
454 &expand, &fill, &pack_type); | |
455 | |
456 return (list3 (expand ? Qt : Qnil, fill ? Qt : Qnil, make_int (pack_type))); | |
457 } | |
458 | |
459 DEFUN ("gtk-widget-get-pointer", Fgtk_widget_get_pointer, 1, 1, 0, /* | |
460 Return the pointer position relative to WIDGET as a cons of (X . Y). | |
461 */ | |
462 (widget)) | |
463 { | |
464 gint x,y; | |
465 CHECK_GTK_OBJECT (widget); | |
466 | |
467 if (!GTK_IS_WIDGET (XGTK_OBJECT (widget)->object)) | |
468 { | |
563 | 469 wtaerror ("Object is not a GtkWidget", widget); |
462 | 470 } |
471 | |
472 gtk_widget_get_pointer (GTK_WIDGET (XGTK_OBJECT (widget)->object), &x, &y); | |
473 | |
474 return (Fcons (make_int (x), make_int (y))); | |
475 } | |
476 | |
477 /* This is called whenever an item with a GUI_ID associated with it is | |
478 destroyed. This allows us to remove the references in gui-gtk.c | |
479 that made sure callbacks and such were GCPRO-ed | |
480 */ | |
481 static void | |
482 __remove_gcpro_by_id (gpointer user_data) | |
483 { | |
484 ungcpro_popup_callbacks ((GUI_ID) user_data); | |
485 } | |
486 | |
487 static void | |
2286 | 488 __generic_toolbar_callback (GtkWidget *UNUSED (item), gpointer user_data) |
462 | 489 { |
490 Lisp_Object callback; | |
491 Lisp_Object lisp_user_data; | |
492 | |
826 | 493 callback = VOID_TO_LISP (user_data); |
462 | 494 |
495 lisp_user_data = XCAR (callback); | |
496 callback = XCDR (callback); | |
497 | |
498 signal_special_gtk_user_event (Qnil, callback, lisp_user_data); | |
499 } | |
500 | |
501 static Lisp_Object | |
502 generic_toolbar_insert_item (Lisp_Object toolbar, | |
503 Lisp_Object text, | |
504 Lisp_Object tooltip_text, | |
505 Lisp_Object tooltip_private_text, | |
506 Lisp_Object icon, | |
507 Lisp_Object callback, | |
508 Lisp_Object data, | |
509 Lisp_Object prepend_p, | |
510 Lisp_Object position) | |
511 { | |
512 GUI_ID id; | |
513 GtkWidget *w = NULL; | |
514 | |
515 CHECK_GTK_OBJECT (toolbar); | |
516 CHECK_GTK_OBJECT (icon); | |
517 CHECK_STRING (text); | |
518 CHECK_STRING (tooltip_text); | |
519 CHECK_STRING (tooltip_private_text); | |
520 | |
521 if (!SYMBOLP (callback) && !LISTP (callback)) | |
522 { | |
563 | 523 wtaerror ("Callback must be symbol or eval-able form", callback); |
462 | 524 } |
525 | |
526 if (!GTK_IS_TOOLBAR (XGTK_OBJECT (toolbar)->object)) | |
527 { | |
563 | 528 wtaerror ("Object is not a GtkToolbar", toolbar); |
462 | 529 } |
530 | |
531 if (!GTK_IS_WIDGET (XGTK_OBJECT (icon)->object)) | |
532 { | |
563 | 533 wtaerror ("Object is not a GtkWidget", icon); |
462 | 534 } |
535 | |
536 callback = Fcons (data, callback); | |
537 | |
538 id = new_gui_id (); | |
539 gcpro_popup_callbacks (id, callback); | |
540 gtk_object_weakref (XGTK_OBJECT (toolbar)->object, __remove_gcpro_by_id, | |
541 (gpointer) id); | |
542 | |
543 if (NILP (position)) | |
544 { | |
545 w = (NILP (prepend_p) ? gtk_toolbar_append_item : gtk_toolbar_prepend_item) | |
546 (GTK_TOOLBAR (XGTK_OBJECT (toolbar)->object), | |
2054 | 547 (char*) XSTRING_DATA (text), |
548 (char*) XSTRING_DATA (tooltip_text), | |
549 (char*) XSTRING_DATA (tooltip_private_text), | |
462 | 550 GTK_WIDGET (XGTK_OBJECT (icon)->object), |
551 GTK_SIGNAL_FUNC (__generic_toolbar_callback), | |
552 LISP_TO_VOID (callback)); | |
553 } | |
554 else | |
555 { | |
556 w = gtk_toolbar_insert_item (GTK_TOOLBAR (XGTK_OBJECT (toolbar)->object), | |
2054 | 557 (char*) XSTRING_DATA (text), |
558 (char*) XSTRING_DATA (tooltip_text), | |
559 (char*) XSTRING_DATA (tooltip_private_text), | |
462 | 560 GTK_WIDGET (XGTK_OBJECT (icon)->object), |
561 GTK_SIGNAL_FUNC (__generic_toolbar_callback), | |
562 LISP_TO_VOID (callback), | |
563 XINT (position)); | |
564 } | |
565 | |
566 | |
567 return (w ? build_gtk_object (GTK_OBJECT (w)) : Qnil); | |
568 } | |
569 | |
570 DEFUN ("gtk-toolbar-append-item", Fgtk_toolbar_append_item, 6, 7, 0, /* | |
571 Appends a new button to the given toolbar. | |
572 */ | |
573 (toolbar, text, tooltip_text, tooltip_private_text, icon, callback, data)) | |
574 { | |
575 return (generic_toolbar_insert_item (toolbar,text,tooltip_text,tooltip_private_text,icon,callback,data,Qnil,Qnil)); | |
576 } | |
577 | |
578 DEFUN ("gtk-toolbar-prepend-item", Fgtk_toolbar_prepend_item, 6, 7, 0, /* | |
579 Adds a new button to the beginning (left or top edges) of the given toolbar. | |
580 */ | |
581 (toolbar, text, tooltip_text, tooltip_private_text, icon, callback, data)) | |
582 { | |
583 return (generic_toolbar_insert_item (toolbar,text,tooltip_text,tooltip_private_text,icon,callback,data,Qt,Qnil)); | |
584 } | |
585 | |
586 DEFUN ("gtk-toolbar-insert-item", Fgtk_toolbar_insert_item, 7, 8, 0, /* | |
587 Adds a new button to the beginning (left or top edges) of the given toolbar. | |
588 */ | |
589 (toolbar, text, tooltip_text, tooltip_private_text, icon, callback, position, data)) | |
590 { | |
591 CHECK_INT (position); | |
592 | |
593 return (generic_toolbar_insert_item (toolbar,text,tooltip_text,tooltip_private_text,icon,callback,data,Qnil,position)); | |
594 } | |
595 | |
596 /* GtkCTree is an abomination in the eyes of the object system. */ | |
597 static void | |
598 __emacs_gtk_ctree_recurse_internal (GtkCTree *ctree, GtkCTreeNode *node, gpointer user_data) | |
599 { | |
600 Lisp_Object closure; | |
601 | |
826 | 602 closure = VOID_TO_LISP (user_data); |
462 | 603 |
604 call3 (XCAR (closure), | |
605 build_gtk_object (GTK_OBJECT (ctree)), | |
606 build_gtk_boxed (node, GTK_TYPE_CTREE_NODE), | |
607 XCDR (closure)); | |
608 } | |
609 | |
610 DEFUN ("gtk-ctree-recurse", Fgtk_ctree_recurse, 3, 6, 0, /* | |
611 Recursively apply FUNC to all nodes of CTREE at or below NODE. | |
612 FUNC is called with three arguments: CTREE, a GtkCTreeNode, and DATA. | |
613 The return value of FUNC is ignored. | |
614 | |
615 If optional 5th argument CHILDFIRSTP is non-nil, then | |
616 the function is called for each node after it has been | |
617 called for that node's children. | |
618 | |
619 Optional 6th argument DEPTH limits how deeply to recurse. | |
620 | |
621 This function encompasses all the following Gtk functions: | |
622 | |
623 void gtk_ctree_post_recursive (GtkCTree *ctree, | |
624 GtkCTreeNode *node, | |
625 GtkCTreeFunc func, | |
626 gpointer data); | |
627 void gtk_ctree_post_recursive_to_depth (GtkCTree *ctree, | |
628 GtkCTreeNode *node, | |
629 gint depth, | |
630 GtkCTreeFunc func, | |
631 gpointer data); | |
632 void gtk_ctree_pre_recursive (GtkCTree *ctree, | |
633 GtkCTreeNode *node, | |
634 GtkCTreeFunc func, | |
635 gpointer data); | |
636 void gtk_ctree_pre_recursive_to_depth (GtkCTree *ctree, | |
637 GtkCTreeNode *node, | |
638 gint depth, | |
639 GtkCTreeFunc func, | |
640 gpointer data); | |
641 */ | |
642 (ctree, node, func, data, childfirstp, depth)) | |
643 { | |
644 struct gcpro gcpro1, gcpro2, gcpro3; | |
645 Lisp_Object closure = Qnil; | |
646 | |
647 CHECK_GTK_OBJECT (ctree); | |
648 | |
649 if (!NILP (node)) | |
650 { | |
651 CHECK_GTK_BOXED (node); | |
652 } | |
653 | |
654 if (!NILP (depth)) | |
655 { | |
656 CHECK_INT (depth); | |
657 } | |
658 | |
659 closure = Fcons (func, data); | |
660 | |
661 GCPRO3 (ctree, node, closure); | |
662 | |
663 if (NILP (depth)) | |
664 { | |
665 (NILP (childfirstp) ? gtk_ctree_post_recursive : gtk_ctree_pre_recursive) | |
666 (GTK_CTREE (XGTK_OBJECT (ctree)->object), | |
667 NILP (node) ? NULL : (GtkCTreeNode *) XGTK_BOXED (node)->object, | |
668 __emacs_gtk_ctree_recurse_internal, | |
669 LISP_TO_VOID (closure)); | |
670 } | |
671 else | |
672 { | |
673 (NILP (childfirstp) ? gtk_ctree_post_recursive_to_depth : gtk_ctree_pre_recursive_to_depth) | |
674 (GTK_CTREE (XGTK_OBJECT (ctree)->object), | |
675 NILP (node) ? NULL : (GtkCTreeNode *) XGTK_BOXED (node)->object, | |
676 XINT (depth), | |
677 __emacs_gtk_ctree_recurse_internal, | |
678 LISP_TO_VOID (closure)); | |
679 } | |
680 | |
681 UNGCPRO; | |
682 return (Qnil); | |
683 } | |
684 | |
685 void syms_of_ui_byhand (void) | |
686 { | |
687 DEFSUBR (Fgtk_toolbar_append_item); | |
688 DEFSUBR (Fgtk_toolbar_insert_item); | |
689 DEFSUBR (Fgtk_toolbar_prepend_item); | |
690 DEFSUBR (Fgtk_box_query_child_packing); | |
691 DEFSUBR (Fgtk_button_box_get_child_size_default); | |
692 DEFSUBR (Fgtk_button_box_get_child_ipadding_default); | |
693 DEFSUBR (Fgtk_button_box_get_child_size); | |
694 DEFSUBR (Fgtk_button_box_get_child_ipadding); | |
695 DEFSUBR (Fgtk_calendar_get_date); | |
696 DEFSUBR (Fgtk_clist_get_text); | |
697 DEFSUBR (Fgtk_clist_get_selection); | |
698 DEFSUBR (Fgtk_clist_get_pixmap); | |
699 DEFSUBR (Fgtk_clist_get_pixtext); | |
700 DEFSUBR (Fgtk_color_selection_get_color); | |
701 DEFSUBR (Fgtk_editable_insert_text); | |
702 DEFSUBR (Fgtk_pixmap_get); | |
703 DEFSUBR (Fgtk_curve_get_vector); | |
704 DEFSUBR (Fgtk_curve_set_vector); | |
705 DEFSUBR (Fgtk_label_get); | |
706 DEFSUBR (Fgtk_notebook_query_tab_label_packing); | |
707 DEFSUBR (Fgtk_widget_get_pointer); | |
708 DEFSUBR (Fgtk_ctree_recurse); | |
709 } |