comparison src/ui-gtk.c @ 5125:b5df3737028a ben-lisp-object

merge
author Ben Wing <ben@xemacs.org>
date Wed, 24 Feb 2010 01:58:04 -0600
parents 623d57b7fbe8 ae48681c47fa
children a9c41067dd88
comparison
equal deleted inserted replaced
5124:623d57b7fbe8 5125:b5df3737028a
19 ** 19 **
20 ** You should have received a copy of the GNU General Public License 20 ** You should have received a copy of the GNU General Public License
21 ** along with XEmacs; see the file COPYING. If not, write to 21 ** along with XEmacs; see the file COPYING. If not, write to
22 ** the Free Software Foundation, Inc., 51 Franklin Street - Fifth Floor, 22 ** the Free Software Foundation, Inc., 51 Franklin Street - Fifth Floor,
23 ** Boston, MA 02111-1301, USA. */ 23 ** Boston, MA 02111-1301, USA. */
24 */
25 24
26 #include <config.h> 25 #include <config.h>
27 #include "lisp.h" 26 #include "lisp.h"
28 27
29 #include "buffer.h" 28 #include "buffer.h"
30 #include "console-gtk-impl.h"
31 #include "device.h" 29 #include "device.h"
32 #include "elhash.h" 30 #include "elhash.h"
33 #include "event-gtk.h"
34 #include "events.h" 31 #include "events.h"
35 #include "faces.h" 32 #include "faces.h"
33 #include "hash.h"
34 #include "sysdll.h"
35 #include "window.h"
36
37 #include "console-gtk-impl.h"
36 #include "glyphs-gtk.h" 38 #include "glyphs-gtk.h"
37 #include "hash.h"
38 #include "objects-gtk.h" 39 #include "objects-gtk.h"
39 #include "sysdll.h"
40 #include "ui-gtk.h" 40 #include "ui-gtk.h"
41 #include "window.h"
42 41
43 /* XEmacs specific GTK types */ 42 /* XEmacs specific GTK types */
44 #include "gtk-glue.c" 43 #include "gtk-glue.c"
45 44
46 /* Is the fundamental type of 't' the xemacs defined fundamental type 'type'? */ 45 /* Is the fundamental type of 't' the xemacs defined fundamental type 'type'? */
92 91
93 initialize_dll_cache (); 92 initialize_dll_cache ();
94 93
95 /* If the dll name has a directory component in it, then we should 94 /* If the dll name has a directory component in it, then we should
96 expand it. */ 95 expand it. */
97 if (!NILP (Fstring_match (build_string ("/"), dll, Qnil, Qnil))) 96 if (!NILP (Fstring_match (build_ascstring ("/"), dll, Qnil, Qnil)))
98 dll = Fexpand_file_name (dll, Qnil); 97 dll = Fexpand_file_name (dll, Qnil);
99 98
100 /* Check if we have already opened it first */ 99 /* Check if we have already opened it first */
101 h = g_hash_table_lookup (dll_cache, XSTRING_DATA (dll)); 100 h = g_hash_table_lookup (dll_cache, XSTRING_DATA (dll));
102 101
325 static void 324 static void
326 ffi_object_printer (Lisp_Object obj, Lisp_Object printcharfun, 325 ffi_object_printer (Lisp_Object obj, Lisp_Object printcharfun,
327 int UNUSED (escapeflag)) 326 int UNUSED (escapeflag))
328 { 327 {
329 if (print_readably) 328 if (print_readably)
330 printing_unreadable_object ("#<ffi %p>", XFFI (obj)->function_ptr); 329 printing_unreadable_lcrecord (obj, 0);
331 330
332 write_fmt_string_lisp (printcharfun, "#<ffi %S", 1, XFFI (obj)->function_name); 331 write_fmt_string_lisp (printcharfun, "#<ffi %S", 1, XFFI (obj)->function_name);
333 if (XFFI (obj)->n_args) 332 if (XFFI (obj)->n_args)
334 write_fmt_string (printcharfun, " %d arguments", XFFI (obj)->n_args); 333 write_fmt_string (printcharfun, " %d arguments", XFFI (obj)->n_args);
335 write_fmt_string (printcharfun, " %p>", (void *)XFFI (obj)->function_ptr); 334 write_fmt_string (printcharfun, " %p>", (void *)XFFI (obj)->function_ptr);
383 CONVERT_SINGLE_TYPE(a,OBJECT,GtkObject *); \ 382 CONVERT_SINGLE_TYPE(a,OBJECT,GtkObject *); \
384 default: \ 383 default: \
385 GTK_VALUE_POINTER (a) = * (void **) v; \ 384 GTK_VALUE_POINTER (a) = * (void **) v; \
386 break; \ 385 break; \
387 } \ 386 } \
388 if (freep) xfree(v, void *); \ 387 if (freep) xfree (v); \
389 } while (0) 388 } while (0)
390 389
391 static gpointer __allocate_object_storage (GtkType t) 390 static gpointer __allocate_object_storage (GtkType t)
392 { 391 {
393 size_t s = 0; 392 size_t s = 0;
461 static Lisp_Object type_to_marshaller_type (GtkType t) 460 static Lisp_Object type_to_marshaller_type (GtkType t)
462 { 461 {
463 switch (GTK_FUNDAMENTAL_TYPE (t)) 462 switch (GTK_FUNDAMENTAL_TYPE (t))
464 { 463 {
465 case GTK_TYPE_NONE: 464 case GTK_TYPE_NONE:
466 return (build_string ("NONE")); 465 return (build_ascstring ("NONE"));
467 /* flag types */ 466 /* flag types */
468 case GTK_TYPE_CHAR: 467 case GTK_TYPE_CHAR:
469 case GTK_TYPE_UCHAR: 468 case GTK_TYPE_UCHAR:
470 return (build_string ("CHAR")); 469 return (build_ascstring ("CHAR"));
471 case GTK_TYPE_BOOL: 470 case GTK_TYPE_BOOL:
472 return (build_string ("BOOL")); 471 return (build_ascstring ("BOOL"));
473 case GTK_TYPE_ENUM: 472 case GTK_TYPE_ENUM:
474 case GTK_TYPE_FLAGS: 473 case GTK_TYPE_FLAGS:
475 case GTK_TYPE_INT: 474 case GTK_TYPE_INT:
476 case GTK_TYPE_UINT: 475 case GTK_TYPE_UINT:
477 return (build_string ("INT")); 476 return (build_ascstring ("INT"));
478 case GTK_TYPE_LONG: 477 case GTK_TYPE_LONG:
479 case GTK_TYPE_ULONG: 478 case GTK_TYPE_ULONG:
480 return (build_string ("LONG")); 479 return (build_ascstring ("LONG"));
481 case GTK_TYPE_FLOAT: 480 case GTK_TYPE_FLOAT:
482 case GTK_TYPE_DOUBLE: 481 case GTK_TYPE_DOUBLE:
483 return (build_string ("FLOAT")); 482 return (build_ascstring ("FLOAT"));
484 case GTK_TYPE_STRING: 483 case GTK_TYPE_STRING:
485 return (build_string ("STRING")); 484 return (build_ascstring ("STRING"));
486 case GTK_TYPE_BOXED: 485 case GTK_TYPE_BOXED:
487 case GTK_TYPE_POINTER: 486 case GTK_TYPE_POINTER:
488 return (build_string ("POINTER")); 487 return (build_ascstring ("POINTER"));
489 case GTK_TYPE_OBJECT: 488 case GTK_TYPE_OBJECT:
490 return (build_string ("OBJECT")); 489 return (build_ascstring ("OBJECT"));
491 case GTK_TYPE_CALLBACK: 490 case GTK_TYPE_CALLBACK:
492 return (build_string ("CALLBACK")); 491 return (build_ascstring ("CALLBACK"));
493 default: 492 default:
494 /* I can't put this in the main switch statement because it is a 493 /* I can't put this in the main switch statement because it is a
495 new fundamental type that is not fixed at compile time. 494 new fundamental type that is not fixed at compile time.
496 *sigh* 495 *sigh*
497 */ 496 */
498 if (IS_XEMACS_GTK_FUNDAMENTAL_TYPE(t, GTK_TYPE_ARRAY)) 497 if (IS_XEMACS_GTK_FUNDAMENTAL_TYPE(t, GTK_TYPE_ARRAY))
499 return (build_string ("ARRAY")); 498 return (build_ascstring ("ARRAY"));
500 499
501 if (IS_XEMACS_GTK_FUNDAMENTAL_TYPE(t, GTK_TYPE_LISTOF)) 500 if (IS_XEMACS_GTK_FUNDAMENTAL_TYPE(t, GTK_TYPE_LISTOF))
502 return (build_string ("LIST")); 501 return (build_ascstring ("LIST"));
503 return (Qnil); 502 return (Qnil);
504 } 503 }
505 } 504 }
506 505
507 struct __dll_mapper_closure { 506 struct __dll_mapper_closure {
641 640
642 if (NILP (marshaller_type)) 641 if (NILP (marshaller_type))
643 { 642 {
644 invalid_argument ("Do not know how to marshal", type); 643 invalid_argument ("Do not know how to marshal", type);
645 } 644 }
646 marshaller = concat3 (marshaller, build_string ("_"), marshaller_type); 645 marshaller = concat3 (marshaller, build_ascstring ("_"), marshaller_type);
647 n_args++; 646 n_args++;
648 } 647 }
649 } 648 }
650 else 649 else
651 { 650 {
652 marshaller = concat3 (marshaller, build_string ("_"), type_to_marshaller_type (GTK_TYPE_NONE)); 651 marshaller = concat3 (marshaller, build_ascstring ("_"), type_to_marshaller_type (GTK_TYPE_NONE));
653 } 652 }
654 653
655 rettype = Fsymbol_name (rettype); 654 rettype = Fsymbol_name (rettype);
656 data->return_type = gtk_type_from_name ((char *) XSTRING_DATA (rettype)); 655 data->return_type = gtk_type_from_name ((char *) XSTRING_DATA (rettype));
657 656
660 invalid_argument ("Unknown return type", rettype); 659 invalid_argument ("Unknown return type", rettype);
661 } 660 }
662 661
663 import_gtk_type (data->return_type); 662 import_gtk_type (data->return_type);
664 663
665 marshaller = concat3 (type_to_marshaller_type (data->return_type), build_string ("_"), marshaller); 664 marshaller = concat3 (type_to_marshaller_type (data->return_type), build_ascstring ("_"), marshaller);
666 marshaller = concat2 (build_string ("emacs_gtk_marshal_"), marshaller); 665 marshaller = concat2 (build_ascstring ("emacs_gtk_marshal_"), marshaller);
667 666
668 marshaller_func = (ffi_marshalling_function) find_marshaller ((char *) XSTRING_DATA (marshaller)); 667 marshaller_func = (ffi_marshalling_function) find_marshaller ((char *) XSTRING_DATA (marshaller));
669 668
670 if (!marshaller_func) 669 if (!marshaller_func)
671 { 670 {
794 static void 793 static void
795 emacs_gtk_object_printer (Lisp_Object obj, Lisp_Object printcharfun, 794 emacs_gtk_object_printer (Lisp_Object obj, Lisp_Object printcharfun,
796 int UNUSED (escapeflag)) 795 int UNUSED (escapeflag))
797 { 796 {
798 if (print_readably) 797 if (print_readably)
799 printing_unreadable_object ("#<GtkObject %p>", XGTK_OBJECT (obj)->object); 798 printing_unreadable_lcrecord (obj, 0);
800 799
801 write_c_string (printcharfun, "#<GtkObject ("); 800 write_ascstring (printcharfun, "#<GtkObject (");
802 if (XGTK_OBJECT (obj)->alive_p) 801 if (XGTK_OBJECT (obj)->alive_p)
803 write_c_string (printcharfun, gtk_type_name (GTK_OBJECT_TYPE (XGTK_OBJECT (obj)->object))); 802 write_cistring (printcharfun, gtk_type_name (GTK_OBJECT_TYPE (XGTK_OBJECT (obj)->object)));
804 else 803 else
805 write_c_string (printcharfun, "dead"); 804 write_ascstring (printcharfun, "dead");
806 write_fmt_string (printcharfun, ") %p>", (void *) XGTK_OBJECT (obj)->object); 805 write_fmt_string (printcharfun, ") %p>", (void *) XGTK_OBJECT (obj)->object);
807 } 806 }
808 807
809 static Lisp_Object 808 static Lisp_Object
810 object_getprop (Lisp_Object obj, Lisp_Object prop) 809 object_getprop (Lisp_Object obj, Lisp_Object prop)
1004 static void 1003 static void
1005 __internal_callback_destroy (gpointer data) 1004 __internal_callback_destroy (gpointer data)
1006 { 1005 {
1007 Lisp_Object lisp_data; 1006 Lisp_Object lisp_data;
1008 1007
1009 lisp_data = VOID_TO_LISP (data); 1008 lisp_data = GET_LISP_FROM_VOID (data);
1010 1009
1011 ungcpro_popup_callbacks (XINT (XCAR (lisp_data))); 1010 ungcpro_popup_callbacks (XINT (XCAR (lisp_data)));
1012 } 1011 }
1013 1012
1014 static void 1013 static void
1020 Lisp_Object newargs[3]; 1019 Lisp_Object newargs[3];
1021 Lisp_Object rval = Qnil; 1020 Lisp_Object rval = Qnil;
1022 struct gcpro gcpro1; 1021 struct gcpro gcpro1;
1023 int i; 1022 int i;
1024 1023
1025 callback_fn = VOID_TO_LISP (data); 1024 callback_fn = GET_LISP_FROM_VOID (data);
1026 1025
1027 /* Nuke the GUI_ID off the front */ 1026 /* Nuke the GUI_ID off the front */
1028 callback_fn = XCDR (callback_fn); 1027 callback_fn = XCDR (callback_fn);
1029 1028
1030 callback_data = XCAR (callback_fn); 1029 callback_data = XCAR (callback_fn);
1086 func = Fcons (make_int (id), func); 1085 func = Fcons (make_int (id), func);
1087 1086
1088 gcpro_popup_callbacks (id, func); 1087 gcpro_popup_callbacks (id, func);
1089 1088
1090 gtk_signal_connect_full (XGTK_OBJECT (obj)->object, (char *) XSTRING_DATA (name), 1089 gtk_signal_connect_full (XGTK_OBJECT (obj)->object, (char *) XSTRING_DATA (name),
1091 NULL, __internal_callback_marshal, LISP_TO_VOID (func), 1090 NULL, __internal_callback_marshal, STORE_LISP_IN_VOID (func),
1092 __internal_callback_destroy, c_object_signal, c_after); 1091 __internal_callback_destroy, c_object_signal, c_after);
1093 return (Qt); 1092 return (Qt);
1094 } 1093 }
1095 1094
1096 1095
1102 static void 1101 static void
1103 emacs_gtk_boxed_printer (Lisp_Object obj, Lisp_Object printcharfun, 1102 emacs_gtk_boxed_printer (Lisp_Object obj, Lisp_Object printcharfun,
1104 int UNUSED (escapeflag)) 1103 int UNUSED (escapeflag))
1105 { 1104 {
1106 if (print_readably) 1105 if (print_readably)
1107 printing_unreadable_object ("#<GtkBoxed %p>", XGTK_BOXED (obj)->object); 1106 printing_unreadable_lcrecord (obj, 0);
1108 1107
1109 write_c_string (printcharfun, "#<GtkBoxed ("); 1108 write_ascstring (printcharfun, "#<GtkBoxed (");
1110 write_c_string (printcharfun, gtk_type_name (XGTK_BOXED (obj)->object_type)); 1109 write_cistring (printcharfun, gtk_type_name (XGTK_BOXED (obj)->object_type));
1111 write_fmt_string (printcharfun, ") %p>", (void *) XGTK_BOXED (obj)->object); 1110 write_fmt_string (printcharfun, ") %p>", (void *) XGTK_BOXED (obj)->object);
1112 } 1111 }
1113 1112
1114 static int 1113 static int
1115 emacs_gtk_boxed_equality (Lisp_Object o1, Lisp_Object o2, int UNUSED (depth)) 1114 emacs_gtk_boxed_equality (Lisp_Object o1, Lisp_Object o2, int UNUSED (depth))
1479 case GTK_TYPE_FLOAT: 1478 case GTK_TYPE_FLOAT:
1480 return (make_float (GTK_VALUE_FLOAT (*arg))); 1479 return (make_float (GTK_VALUE_FLOAT (*arg)));
1481 case GTK_TYPE_DOUBLE: 1480 case GTK_TYPE_DOUBLE:
1482 return (make_float (GTK_VALUE_DOUBLE (*arg))); 1481 return (make_float (GTK_VALUE_DOUBLE (*arg)));
1483 case GTK_TYPE_STRING: 1482 case GTK_TYPE_STRING:
1484 return (build_string (GTK_VALUE_STRING (*arg))); 1483 return (build_cistring (GTK_VALUE_STRING (*arg)));
1485 case GTK_TYPE_FLAGS: 1484 case GTK_TYPE_FLAGS:
1486 return (flags_to_list (GTK_VALUE_FLAGS (*arg), arg->type)); 1485 return (flags_to_list (GTK_VALUE_FLAGS (*arg), arg->type));
1487 case GTK_TYPE_ENUM: 1486 case GTK_TYPE_ENUM:
1488 return (enum_to_symbol (GTK_VALUE_ENUM (*arg), arg->type)); 1487 return (enum_to_symbol (GTK_VALUE_ENUM (*arg), arg->type));
1489 case GTK_TYPE_BOXED: 1488 case GTK_TYPE_BOXED:
1499 case GTK_TYPE_POINTER: 1498 case GTK_TYPE_POINTER:
1500 if (GTK_VALUE_POINTER (*arg)) 1499 if (GTK_VALUE_POINTER (*arg))
1501 { 1500 {
1502 Lisp_Object rval; 1501 Lisp_Object rval;
1503 1502
1504 rval = VOID_TO_LISP (GTK_VALUE_POINTER (*arg)); 1503 rval = GET_LISP_FROM_VOID (GTK_VALUE_POINTER (*arg));
1505 return (rval); 1504 return (rval);
1506 } 1505 }
1507 else 1506 else
1508 return (Qnil); 1507 return (Qnil);
1509 case GTK_TYPE_OBJECT: 1508 case GTK_TYPE_OBJECT:
1514 1513
1515 case GTK_TYPE_CALLBACK: 1514 case GTK_TYPE_CALLBACK:
1516 { 1515 {
1517 Lisp_Object rval; 1516 Lisp_Object rval;
1518 1517
1519 rval = VOID_TO_LISP (GTK_VALUE_CALLBACK (*arg).data); 1518 rval = GET_LISP_FROM_VOID (GTK_VALUE_CALLBACK (*arg).data);
1520 1519
1521 return (rval); 1520 return (rval);
1522 } 1521 }
1523 1522
1524 default: 1523 default:
1735 1734
1736 case GTK_TYPE_POINTER: 1735 case GTK_TYPE_POINTER:
1737 if (NILP (obj)) 1736 if (NILP (obj))
1738 GTK_VALUE_POINTER(*arg) = NULL; 1737 GTK_VALUE_POINTER(*arg) = NULL;
1739 else 1738 else
1740 GTK_VALUE_POINTER(*arg) = LISP_TO_VOID (obj); 1739 GTK_VALUE_POINTER(*arg) = STORE_LISP_IN_VOID (obj);
1741 break; 1740 break;
1742 1741
1743 /* structured types */ 1742 /* structured types */
1744 case GTK_TYPE_SIGNAL: 1743 case GTK_TYPE_SIGNAL:
1745 case GTK_TYPE_ARGS: /* This we can do as a list of values */ 1744 case GTK_TYPE_ARGS: /* This we can do as a list of values */
2015 2014
2016 case GTK_TYPE_POINTER: 2015 case GTK_TYPE_POINTER:
2017 if (NILP (obj)) 2016 if (NILP (obj))
2018 *(GTK_RETLOC_POINTER(*arg)) = NULL; 2017 *(GTK_RETLOC_POINTER(*arg)) = NULL;
2019 else 2018 else
2020 *(GTK_RETLOC_POINTER(*arg)) = LISP_TO_VOID (obj); 2019 *(GTK_RETLOC_POINTER(*arg)) = STORE_LISP_IN_VOID (obj);
2021 break; 2020 break;
2022 2021
2023 /* structured types */ 2022 /* structured types */
2024 case GTK_TYPE_SIGNAL: 2023 case GTK_TYPE_SIGNAL:
2025 case GTK_TYPE_ARGS: /* This we can do as a list of values */ 2024 case GTK_TYPE_ARGS: /* This we can do as a list of values */
2119 Lisp_Object alist = get_enumeration (t); 2118 Lisp_Object alist = get_enumeration (t);
2120 Lisp_Object value = Qnil; 2119 Lisp_Object value = Qnil;
2121 2120
2122 if (NILP (alist)) 2121 if (NILP (alist))
2123 { 2122 {
2124 invalid_argument ("Unknown enumeration", build_string (gtk_type_name (t))); 2123 invalid_argument ("Unknown enumeration", build_cistring (gtk_type_name (t)));
2125 } 2124 }
2126 2125
2127 value = Fassq (obj, alist); 2126 value = Fassq (obj, alist);
2128 2127
2129 if (NILP (value)) 2128 if (NILP (value))
2188 Lisp_Object alist = get_enumeration (t); 2187 Lisp_Object alist = get_enumeration (t);
2189 Lisp_Object cell = Qnil; 2188 Lisp_Object cell = Qnil;
2190 2189
2191 if (NILP (alist)) 2190 if (NILP (alist))
2192 { 2191 {
2193 invalid_argument ("Unknown enumeration", build_string (gtk_type_name (t))); 2192 invalid_argument ("Unknown enumeration", build_cistring (gtk_type_name (t)));
2194 } 2193 }
2195 2194
2196 cell = Frassq (make_int (value), alist); 2195 cell = Frassq (make_int (value), alist);
2197 2196
2198 return (NILP (cell) ? Qnil : XCAR (cell)); 2197 return (NILP (cell) ? Qnil : XCAR (cell));