Mercurial > hg > xemacs-beta
annotate src/ui-byhand.c @ 5231:ba07c880114a
Fix up FSF's Franklin Street address in many files.
author | Stephen J. Turnbull <stephen@xemacs.org> |
---|---|
date | Sun, 13 Jun 2010 17:44:56 +0900 |
parents | ae48681c47fa |
children | cd167465bf69 2aa9cd456ae7 |
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, |
5231
ba07c880114a
Fix up FSF's Franklin Street address in many files.
Stephen J. Turnbull <stephen@xemacs.org>
parents:
5013
diff
changeset
|
26 Boston, MA 02110-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 { | |
4953
304aebb79cd3
function renamings to track names of char typedefs
Ben Wing <ben@xemacs.org>
parents:
4709
diff
changeset
|
190 rval = build_cistring (text); |
462 | 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, | |
4953
304aebb79cd3
function renamings to track names of char typedefs
Ben Wing <ben@xemacs.org>
parents:
4709
diff
changeset
|
277 (text && text[0]) ? build_cistring (text) : Qnil)); |
462 | 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 | |
4953
304aebb79cd3
function renamings to track names of char typedefs
Ben Wing <ben@xemacs.org>
parents:
4709
diff
changeset
|
428 return (build_cistring (string)); |
462 | 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 | |
5013 | 493 callback = GET_LISP_FROM_VOID (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), | |
5013 | 552 STORE_LISP_IN_VOID (callback)); |
462 | 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), | |
5013 | 562 STORE_LISP_IN_VOID (callback), |
462 | 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 | |
5013 | 602 closure = GET_LISP_FROM_VOID (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, | |
5013 | 669 STORE_LISP_IN_VOID (closure)); |
462 | 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, | |
5013 | 678 STORE_LISP_IN_VOID (closure)); |
462 | 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 } |