comparison src/ui-gtk.c @ 5133:444a448b2f53

Merge branch ben-lisp-object into default branch
author Ben Wing <ben@xemacs.org>
date Sun, 07 Mar 2010 06:47:37 -0600
parents a9c41067dd88
children f965e31a35f0
comparison
equal deleted inserted replaced
5113:b2dcf6a6d8ab 5133:444a448b2f53
2 ** 2 **
3 ** Description: Creating 'real' UIs from lisp. 3 ** Description: Creating 'real' UIs from lisp.
4 ** 4 **
5 ** Created by: William M. Perry <wmperry@gnu.org> 5 ** Created by: William M. Perry <wmperry@gnu.org>
6 ** Copyright (c) 2000 William M. Perry <wmperry@gnu.org> 6 ** Copyright (c) 2000 William M. Perry <wmperry@gnu.org>
7 ** Copyright (C) 2010 Ben Wing.
7 ** 8 **
8 ** This file is part of XEmacs. 9 ** This file is part of XEmacs.
9 ** 10 **
10 ** XEmacs is free software; you can redistribute it and/or modify it 11 ** XEmacs is free software; you can redistribute it and/or modify it
11 ** under the terms of the GNU General Public License as published by the 12 ** under the terms of the GNU General Public License as published by the
293 294
294 /* Foreign function calls */ 295 /* Foreign function calls */
295 static emacs_ffi_data * 296 static emacs_ffi_data *
296 allocate_ffi_data (void) 297 allocate_ffi_data (void)
297 { 298 {
298 emacs_ffi_data *data = ALLOC_LCRECORD_TYPE (emacs_ffi_data, &lrecord_emacs_ffi); 299 Lisp_Object obj = ALLOC_NORMAL_LISP_OBJECT (emacs_ffi);
300 emacs_ffi_data *data = XFFI (obj);
299 301
300 data->return_type = GTK_TYPE_NONE; 302 data->return_type = GTK_TYPE_NONE;
301 data->n_args = 0; 303 data->n_args = 0;
302 data->function_name = Qnil; 304 data->function_name = Qnil;
303 data->function_ptr = 0; 305 data->function_ptr = 0;
331 if (XFFI (obj)->n_args) 333 if (XFFI (obj)->n_args)
332 write_fmt_string (printcharfun, " %d arguments", XFFI (obj)->n_args); 334 write_fmt_string (printcharfun, " %d arguments", XFFI (obj)->n_args);
333 write_fmt_string (printcharfun, " %p>", (void *)XFFI (obj)->function_ptr); 335 write_fmt_string (printcharfun, " %p>", (void *)XFFI (obj)->function_ptr);
334 } 336 }
335 337
336 DEFINE_LRECORD_IMPLEMENTATION ("ffi", emacs_ffi, 338 DEFINE_NODUMP_LISP_OBJECT ("ffi", emacs_ffi,
337 0, /*dumpable-flag*/ 339 mark_ffi_data, ffi_object_printer,
338 mark_ffi_data, ffi_object_printer, 340 0, 0, 0,
339 0, 0, 0, 341 ffi_data_description, emacs_ffi_data);
340 ffi_data_description, emacs_ffi_data);
341 342
342 #if defined (__cplusplus) 343 #if defined (__cplusplus)
343 #define MANY_ARGS ... 344 #define MANY_ARGS ...
344 #else 345 #else
345 #define MANY_ARGS 346 #define MANY_ARGS
921 { 922 {
922 return (XGTK_OBJECT (obj)->plist); 923 return (XGTK_OBJECT (obj)->plist);
923 } 924 }
924 925
925 static void 926 static void
926 emacs_gtk_object_finalizer (void *header, int for_disksave) 927 emacs_gtk_object_finalizer (Lisp_Object obj)
927 { 928 {
928 emacs_gtk_object_data *data = (emacs_gtk_object_data *) header; 929 emacs_gtk_object_data *data = XEMACS_GTK_OBJECT_DATA (obj);
929
930 if (for_disksave)
931 {
932 Lisp_Object obj = wrap_emacs_gtk_object (data);
933
934
935 invalid_operation
936 ("Can't dump an emacs containing GtkObject objects", obj);
937 }
938 930
939 if (data->alive_p) 931 if (data->alive_p)
940 { 932 gtk_object_unref (data->object);
941 gtk_object_unref (data->object); 933 }
942 } 934
943 } 935 DEFINE_NODUMP_GENERAL_LISP_OBJECT ("GtkObject", emacs_gtk_object,
944 936 mark_gtk_object_data,
945 DEFINE_LRECORD_IMPLEMENTATION_WITH_PROPS ("GtkObject", emacs_gtk_object, 937 emacs_gtk_object_printer,
946 0, /*dumpable-flag*/ 938 emacs_gtk_object_finalizer,
947 mark_gtk_object_data, 939 0, /* equality */
948 emacs_gtk_object_printer, 940 0, /* hash */
949 emacs_gtk_object_finalizer, 941 gtk_object_data_description,
950 0, /* equality */ 942 object_getprop,
951 0, /* hash */ 943 object_putprop,
952 gtk_object_data_description, 944 0, /* rem prop */
953 object_getprop, 945 0, /* plist */
954 object_putprop, 946 0, /* disksaver */
955 0, /* rem prop */ 947 emacs_gtk_object_data);
956 0, /* plist */
957 emacs_gtk_object_data);
958 948
959 static emacs_gtk_object_data * 949 static emacs_gtk_object_data *
960 allocate_emacs_gtk_object_data (void) 950 allocate_emacs_gtk_object_data (void)
961 { 951 {
962 emacs_gtk_object_data *data = ALLOC_LCRECORD_TYPE (emacs_gtk_object_data, 952 Lisp_Object obj = ALLOC_NORMAL_LISP_OBJECT (emacs_gtk_object);
963 &lrecord_emacs_gtk_object); 953 emacs_gtk_object_data *data = XGTK_OBJECT (obj);
964 954
965 data->object = NULL; 955 data->object = NULL;
966 data->alive_p = FALSE; 956 data->alive_p = FALSE;
967 data->plist = Qnil; 957 data->plist = Qnil;
968 958
1136 { 1126 {
1137 emacs_gtk_boxed_data *data = XGTK_BOXED(obj); 1127 emacs_gtk_boxed_data *data = XGTK_BOXED(obj);
1138 return (HASH2 ((Hashcode) data->object, data->object_type)); 1128 return (HASH2 ((Hashcode) data->object, data->object_type));
1139 } 1129 }
1140 1130
1141 DEFINE_LRECORD_IMPLEMENTATION_WITH_PROPS ("GtkBoxed", emacs_gtk_boxed, 1131 DEFINE_NODUMP_LISP_OBJECT ("GtkBoxed", emacs_gtk_boxed,
1142 0, /*dumpable-flag*/ 1132 0, /* marker function */
1143 0, /* marker function */ 1133 emacs_gtk_boxed_printer,
1144 emacs_gtk_boxed_printer, 1134 0, /* nuker */
1145 0, /* nuker */ 1135 emacs_gtk_boxed_equality,
1146 emacs_gtk_boxed_equality, 1136 emacs_gtk_boxed_hash,
1147 emacs_gtk_boxed_hash, 1137 emacs_gtk_boxed_description,
1148 emacs_gtk_boxed_description, 1138 emacs_gtk_boxed_data);
1149 0, /* get prop */
1150 0, /* put prop */
1151 0, /* rem prop */
1152 0, /* plist */
1153 emacs_gtk_boxed_data);
1154 /* Currently defined GTK_TYPE_BOXED structures are: 1139 /* Currently defined GTK_TYPE_BOXED structures are:
1155 1140
1156 GtkAccelGroup - 1141 GtkAccelGroup -
1157 GtkSelectionData - 1142 GtkSelectionData -
1158 GtkStyle - 1143 GtkStyle -
1166 GdkColor - 1151 GdkColor -
1167 */ 1152 */
1168 static emacs_gtk_boxed_data * 1153 static emacs_gtk_boxed_data *
1169 allocate_emacs_gtk_boxed_data (void) 1154 allocate_emacs_gtk_boxed_data (void)
1170 { 1155 {
1171 emacs_gtk_boxed_data *data = ALLOC_LCRECORD_TYPE (emacs_gtk_boxed_data, 1156 Lisp_Object obj = ALLOC_NORMAL_LISP_OBJECT (emacs_gtk_boxed);
1172 &lrecord_emacs_gtk_boxed); 1157 emacs_gtk_boxed_data *data = XGTK_BOXED (obj);
1173 1158
1174 data->object = NULL; 1159 data->object = NULL;
1175 data->object_type = GTK_TYPE_INVALID; 1160 data->object_type = GTK_TYPE_INVALID;
1176 1161
1177 return (data); 1162 return (data);
1353 1338
1354 1339
1355 void 1340 void
1356 syms_of_ui_gtk (void) 1341 syms_of_ui_gtk (void)
1357 { 1342 {
1358 INIT_LRECORD_IMPLEMENTATION (emacs_ffi); 1343 INIT_LISP_OBJECT (emacs_ffi);
1359 INIT_LRECORD_IMPLEMENTATION (emacs_gtk_object); 1344 INIT_LISP_OBJECT (emacs_gtk_object);
1360 INIT_LRECORD_IMPLEMENTATION (emacs_gtk_boxed); 1345 INIT_LISP_OBJECT (emacs_gtk_boxed);
1361 DEFSYMBOL_MULTIWORD_PREDICATE (Qemacs_ffip); 1346 DEFSYMBOL_MULTIWORD_PREDICATE (Qemacs_ffip);
1362 DEFSYMBOL_MULTIWORD_PREDICATE (Qemacs_gtk_objectp); 1347 DEFSYMBOL_MULTIWORD_PREDICATE (Qemacs_gtk_objectp);
1363 DEFSYMBOL_MULTIWORD_PREDICATE (Qemacs_gtk_boxedp); 1348 DEFSYMBOL_MULTIWORD_PREDICATE (Qemacs_gtk_boxedp);
1364 DEFSYMBOL (Qvoid); 1349 DEFSYMBOL (Qvoid);
1365 DEFSUBR (Fdll_load); 1350 DEFSUBR (Fdll_load);