Mercurial > hg > xemacs-beta
comparison src/events.c @ 412:697ef44129c6 r21-2-14
Import from CVS: tag r21-2-14
author | cvs |
---|---|
date | Mon, 13 Aug 2007 11:20:41 +0200 |
parents | de805c49cfc1 |
children | 41dbb7a9d5f2 |
comparison
equal
deleted
inserted
replaced
411:12e008d41344 | 412:697ef44129c6 |
---|---|
35 #include "frame.h" | 35 #include "frame.h" |
36 #include "glyphs.h" | 36 #include "glyphs.h" |
37 #include "keymap.h" /* for key_desc_list_to_event() */ | 37 #include "keymap.h" /* for key_desc_list_to_event() */ |
38 #include "redisplay.h" | 38 #include "redisplay.h" |
39 #include "window.h" | 39 #include "window.h" |
40 | |
41 #ifdef WINDOWSNT | |
42 /* Hmm, under unix we want X modifiers, under NT we want X modifiers if | |
43 we are running X and Windows modifiers otherwise. | |
44 gak. This is a kludge until we support multiple native GUIs! | |
45 */ | |
46 #undef MOD_ALT | |
47 #undef MOD_CONTROL | |
48 #undef MOD_SHIFT | |
49 #endif | |
50 | |
40 #include "events-mod.h" | 51 #include "events-mod.h" |
41 | 52 |
42 /* Where old events go when they are explicitly deallocated. | 53 /* Where old events go when they are explicitly deallocated. |
43 The event chain here is cut loose before GC, so these will be freed | 54 The event chain here is cut loose before GC, so these will be freed |
44 eventually. | 55 eventually. |
68 /* Make sure we lose quickly if we try to use this event */ | 79 /* Make sure we lose quickly if we try to use this event */ |
69 static void | 80 static void |
70 deinitialize_event (Lisp_Object ev) | 81 deinitialize_event (Lisp_Object ev) |
71 { | 82 { |
72 int i; | 83 int i; |
73 Lisp_Event *event = XEVENT (ev); | 84 struct Lisp_Event *event = XEVENT (ev); |
74 | 85 |
75 for (i = 0; i < (int) (sizeof (Lisp_Event) / sizeof (int)); i++) | 86 for (i = 0; i < (int) (sizeof (struct Lisp_Event) / sizeof (int)); i++) |
76 ((int *) event) [i] = 0xdeadbeef; | 87 ((int *) event) [i] = 0xdeadbeef; |
77 event->event_type = dead_event; | 88 event->event_type = dead_event; |
78 event->channel = Qnil; | 89 event->channel = Qnil; |
79 set_lheader_implementation (&event->lheader, &lrecord_event); | 90 set_lheader_implementation (&(event->lheader), &lrecord_event); |
80 XSET_EVENT_NEXT (ev, Qnil); | 91 XSET_EVENT_NEXT (ev, Qnil); |
81 } | 92 } |
82 | 93 |
83 /* Set everything to zero or nil so that it's predictable. */ | 94 /* Set everything to zero or nil so that it's predictable. */ |
84 void | 95 void |
85 zero_event (Lisp_Event *e) | 96 zero_event (struct Lisp_Event *e) |
86 { | 97 { |
87 xzero (*e); | 98 xzero (*e); |
88 set_lheader_implementation (&e->lheader, &lrecord_event); | 99 set_lheader_implementation (&(e->lheader), &lrecord_event); |
89 e->event_type = empty_event; | 100 e->event_type = empty_event; |
90 e->next = Qnil; | 101 e->next = Qnil; |
91 e->channel = Qnil; | 102 e->channel = Qnil; |
92 } | 103 } |
93 | 104 |
94 static Lisp_Object | 105 static Lisp_Object |
95 mark_event (Lisp_Object obj) | 106 mark_event (Lisp_Object obj, void (*markobj) (Lisp_Object)) |
96 { | 107 { |
97 Lisp_Event *event = XEVENT (obj); | 108 struct Lisp_Event *event = XEVENT (obj); |
98 | 109 |
99 switch (event->event_type) | 110 switch (event->event_type) |
100 { | 111 { |
101 case key_press_event: | 112 case key_press_event: |
102 mark_object (event->event.key.keysym); | 113 markobj (event->event.key.keysym); |
103 break; | 114 break; |
104 case process_event: | 115 case process_event: |
105 mark_object (event->event.process.process); | 116 markobj (event->event.process.process); |
106 break; | 117 break; |
107 case timeout_event: | 118 case timeout_event: |
108 mark_object (event->event.timeout.function); | 119 markobj (event->event.timeout.function); |
109 mark_object (event->event.timeout.object); | 120 markobj (event->event.timeout.object); |
110 break; | 121 break; |
111 case eval_event: | 122 case eval_event: |
112 case misc_user_event: | 123 case misc_user_event: |
113 mark_object (event->event.eval.function); | 124 markobj (event->event.eval.function); |
114 mark_object (event->event.eval.object); | 125 markobj (event->event.eval.object); |
115 break; | 126 break; |
116 case magic_eval_event: | 127 case magic_eval_event: |
117 mark_object (event->event.magic_eval.object); | 128 markobj (event->event.magic_eval.object); |
118 break; | 129 break; |
119 case button_press_event: | 130 case button_press_event: |
120 case button_release_event: | 131 case button_release_event: |
121 case pointer_motion_event: | 132 case pointer_motion_event: |
122 case magic_event: | 133 case magic_event: |
124 case dead_event: | 135 case dead_event: |
125 break; | 136 break; |
126 default: | 137 default: |
127 abort (); | 138 abort (); |
128 } | 139 } |
129 mark_object (event->channel); | 140 markobj (event->channel); |
130 return event->next; | 141 return event->next; |
131 } | 142 } |
132 | 143 |
133 static void | 144 static void |
134 print_event_1 (const char *str, Lisp_Object obj, Lisp_Object printcharfun) | 145 print_event_1 (CONST char *str, Lisp_Object obj, Lisp_Object printcharfun) |
135 { | 146 { |
136 char buf[255]; | 147 char buf[255]; |
137 write_c_string (str, printcharfun); | 148 write_c_string (str, printcharfun); |
138 format_event_object (buf, XEVENT (obj), 0); | 149 format_event_object (buf, XEVENT (obj), 0); |
139 write_c_string (buf, printcharfun); | 150 write_c_string (buf, printcharfun); |
208 } | 219 } |
209 | 220 |
210 static int | 221 static int |
211 event_equal (Lisp_Object obj1, Lisp_Object obj2, int depth) | 222 event_equal (Lisp_Object obj1, Lisp_Object obj2, int depth) |
212 { | 223 { |
213 Lisp_Event *e1 = XEVENT (obj1); | 224 struct Lisp_Event *e1 = XEVENT (obj1); |
214 Lisp_Event *e2 = XEVENT (obj2); | 225 struct Lisp_Event *e2 = XEVENT (obj2); |
215 | 226 |
216 if (e1->event_type != e2->event_type) return 0; | 227 if (e1->event_type != e2->event_type) return 0; |
217 if (!EQ (e1->channel, e2->channel)) return 0; | 228 if (!EQ (e1->channel, e2->channel)) return 0; |
218 /* if (e1->timestamp != e2->timestamp) return 0; */ | 229 /* if (e1->timestamp != e2->timestamp) return 0; */ |
219 switch (e1->event_type) | 230 switch (e1->event_type) |
280 #endif | 291 #endif |
281 #ifdef HAVE_MS_WINDOWS | 292 #ifdef HAVE_MS_WINDOWS |
282 if (CONSOLE_MSWINDOWS_P (con)) | 293 if (CONSOLE_MSWINDOWS_P (con)) |
283 return (!memcmp(&e1->event.magic.underlying_mswindows_event, | 294 return (!memcmp(&e1->event.magic.underlying_mswindows_event, |
284 &e2->event.magic.underlying_mswindows_event, | 295 &e2->event.magic.underlying_mswindows_event, |
285 sizeof (union magic_data))); | 296 sizeof(union magic_data))); |
286 #endif | 297 #endif |
287 abort (); | |
288 return 1; /* not reached */ | 298 return 1; /* not reached */ |
289 } | 299 } |
290 | 300 |
291 case empty_event: /* Empty and deallocated events are equal. */ | 301 case empty_event: /* Empty and deallocated events are equal. */ |
292 case dead_event: | 302 case dead_event: |
295 } | 305 } |
296 | 306 |
297 static unsigned long | 307 static unsigned long |
298 event_hash (Lisp_Object obj, int depth) | 308 event_hash (Lisp_Object obj, int depth) |
299 { | 309 { |
300 Lisp_Event *e = XEVENT (obj); | 310 struct Lisp_Event *e = XEVENT (obj); |
301 unsigned long hash; | 311 unsigned long hash; |
302 | 312 |
303 hash = HASH2 (e->event_type, LISP_HASH (e->channel)); | 313 hash = HASH2 (e->event_type, LISP_HASH (e->channel)); |
304 switch (e->event_type) | 314 switch (e->event_type) |
305 { | 315 { |
348 #endif | 358 #endif |
349 #ifdef HAVE_MS_WINDOWS | 359 #ifdef HAVE_MS_WINDOWS |
350 if (CONSOLE_MSWINDOWS_P (con)) | 360 if (CONSOLE_MSWINDOWS_P (con)) |
351 return HASH2 (hash, e->event.magic.underlying_mswindows_event); | 361 return HASH2 (hash, e->event.magic.underlying_mswindows_event); |
352 #endif | 362 #endif |
353 abort (); | |
354 return 0; | |
355 } | 363 } |
356 | 364 |
357 case empty_event: | 365 case empty_event: |
358 case dead_event: | 366 case dead_event: |
359 return hash; | 367 return hash; |
365 return 0; /* unreached */ | 373 return 0; /* unreached */ |
366 } | 374 } |
367 | 375 |
368 DEFINE_BASIC_LRECORD_IMPLEMENTATION ("event", event, | 376 DEFINE_BASIC_LRECORD_IMPLEMENTATION ("event", event, |
369 mark_event, print_event, 0, event_equal, | 377 mark_event, print_event, 0, event_equal, |
370 event_hash, 0, Lisp_Event); | 378 event_hash, struct Lisp_Event); |
371 | 379 |
372 | 380 |
373 DEFUN ("make-event", Fmake_event, 0, 2, 0, /* | 381 DEFUN ("make-event", Fmake_event, 0, 2, 0, /* |
374 Return a new event of type TYPE, with properties described by PLIST. | 382 Return a new event of type TYPE, with properties described by PLIST. |
375 | 383 |
418 */ | 426 */ |
419 (type, plist)) | 427 (type, plist)) |
420 { | 428 { |
421 Lisp_Object tail, keyword, value; | 429 Lisp_Object tail, keyword, value; |
422 Lisp_Object event = Qnil; | 430 Lisp_Object event = Qnil; |
423 Lisp_Event *e; | 431 struct Lisp_Event *e; |
424 EMACS_INT coord_x = 0, coord_y = 0; | 432 EMACS_INT coord_x = 0, coord_y = 0; |
425 struct gcpro gcpro1; | 433 struct gcpro gcpro1; |
426 | 434 |
427 GCPRO1 (event); | 435 GCPRO1 (event); |
428 | 436 |
538 int modifiers = 0; | 546 int modifiers = 0; |
539 Lisp_Object sym; | 547 Lisp_Object sym; |
540 | 548 |
541 EXTERNAL_LIST_LOOP_2 (sym, value) | 549 EXTERNAL_LIST_LOOP_2 (sym, value) |
542 { | 550 { |
543 if (EQ (sym, Qcontrol)) modifiers |= XEMACS_MOD_CONTROL; | 551 if (EQ (sym, Qcontrol)) modifiers |= MOD_CONTROL; |
544 else if (EQ (sym, Qmeta)) modifiers |= XEMACS_MOD_META; | 552 else if (EQ (sym, Qmeta)) modifiers |= MOD_META; |
545 else if (EQ (sym, Qsuper)) modifiers |= XEMACS_MOD_SUPER; | 553 else if (EQ (sym, Qsuper)) modifiers |= MOD_SUPER; |
546 else if (EQ (sym, Qhyper)) modifiers |= XEMACS_MOD_HYPER; | 554 else if (EQ (sym, Qhyper)) modifiers |= MOD_HYPER; |
547 else if (EQ (sym, Qalt)) modifiers |= XEMACS_MOD_ALT; | 555 else if (EQ (sym, Qalt)) modifiers |= MOD_ALT; |
548 else if (EQ (sym, Qsymbol)) modifiers |= XEMACS_MOD_ALT; | 556 else if (EQ (sym, Qsymbol)) modifiers |= MOD_ALT; |
549 else if (EQ (sym, Qshift)) modifiers |= XEMACS_MOD_SHIFT; | 557 else if (EQ (sym, Qshift)) modifiers |= MOD_SHIFT; |
550 else | 558 else |
551 signal_simple_error ("Invalid key modifier", sym); | 559 signal_simple_error ("Invalid key modifier", sym); |
552 } | 560 } |
553 | 561 |
554 switch (e->event_type) | 562 switch (e->event_type) |
753 | 761 |
754 DEFUN ("copy-event", Fcopy_event, 1, 2, 0, /* | 762 DEFUN ("copy-event", Fcopy_event, 1, 2, 0, /* |
755 Make a copy of the given event object. | 763 Make a copy of the given event object. |
756 If a second argument is given, the first event is copied into the second | 764 If a second argument is given, the first event is copied into the second |
757 and the second is returned. If the second argument is not supplied (or | 765 and the second is returned. If the second argument is not supplied (or |
758 is nil) then a new event will be made as with `make-event'. See also | 766 is nil) then a new event will be made as with `allocate-event.' See also |
759 the function `deallocate-event'. | 767 the function `deallocate-event'. |
760 */ | 768 */ |
761 (event1, event2)) | 769 (event1, event2)) |
762 { | 770 { |
763 CHECK_LIVE_EVENT (event1); | 771 CHECK_LIVE_EVENT (event1); |
764 if (NILP (event2)) | 772 if (NILP (event2)) |
765 event2 = Fmake_event (Qnil, Qnil); | 773 event2 = Fmake_event (Qnil, Qnil); |
766 else | 774 else CHECK_LIVE_EVENT (event2); |
767 { | 775 if (EQ (event1, event2)) |
768 CHECK_LIVE_EVENT (event2); | 776 return signal_simple_continuable_error_2 |
769 if (EQ (event1, event2)) | 777 ("copy-event called with `eq' events", event1, event2); |
770 return signal_simple_continuable_error_2 | |
771 ("copy-event called with `eq' events", event1, event2); | |
772 } | |
773 | 778 |
774 assert (XEVENT_TYPE (event1) <= last_event_type); | 779 assert (XEVENT_TYPE (event1) <= last_event_type); |
775 assert (XEVENT_TYPE (event2) <= last_event_type); | 780 assert (XEVENT_TYPE (event2) <= last_event_type); |
776 | 781 |
777 { | 782 { |
778 Lisp_Event *ev2 = XEVENT (event2); | 783 Lisp_Object save_next = XEVENT_NEXT (event2); |
779 Lisp_Event *ev1 = XEVENT (event1); | 784 |
780 | 785 *XEVENT (event2) = *XEVENT (event1); |
781 ev2->event_type = ev1->event_type; | 786 XSET_EVENT_NEXT (event2, save_next); |
782 ev2->channel = ev1->channel; | |
783 ev2->timestamp = ev1->timestamp; | |
784 ev2->event = ev1->event; | |
785 | |
786 return event2; | 787 return event2; |
787 } | 788 } |
788 } | 789 } |
789 | 790 |
790 | 791 |
960 } | 961 } |
961 } | 962 } |
962 | 963 |
963 | 964 |
964 void | 965 void |
965 character_to_event (Emchar c, Lisp_Event *event, struct console *con, | 966 character_to_event (Emchar c, struct Lisp_Event *event, struct console *con, |
966 int use_console_meta_flag, int do_backspace_mapping) | 967 int use_console_meta_flag, int do_backspace_mapping) |
967 { | 968 { |
968 Lisp_Object k = Qnil; | 969 Lisp_Object k = Qnil; |
969 int m = 0; | 970 unsigned int m = 0; |
970 if (event->event_type == dead_event) | 971 if (event->event_type == dead_event) |
971 error ("character-to-event called with a deallocated event!"); | 972 error ("character-to-event called with a deallocated event!"); |
972 | 973 |
973 #ifndef MULE | 974 #ifndef MULE |
974 c &= 255; | 975 c &= 255; |
983 case 0: /* ignore top bit; it's parity */ | 984 case 0: /* ignore top bit; it's parity */ |
984 c -= 128; | 985 c -= 128; |
985 break; | 986 break; |
986 case 1: /* top bit is meta */ | 987 case 1: /* top bit is meta */ |
987 c -= 128; | 988 c -= 128; |
988 m = XEMACS_MOD_META; | 989 m = MOD_META; |
989 break; | 990 break; |
990 default: /* this is a real character */ | 991 default: /* this is a real character */ |
991 break; | 992 break; |
992 } | 993 } |
993 } | 994 } |
994 if (c < ' ') c += '@', m |= XEMACS_MOD_CONTROL; | 995 if (c < ' ') c += '@', m |= MOD_CONTROL; |
995 if (m & XEMACS_MOD_CONTROL) | 996 if (m & MOD_CONTROL) |
996 { | 997 { |
997 switch (c) | 998 switch (c) |
998 { | 999 { |
999 case 'I': k = QKtab; m &= ~XEMACS_MOD_CONTROL; break; | 1000 case 'I': k = QKtab; m &= ~MOD_CONTROL; break; |
1000 case 'J': k = QKlinefeed; m &= ~XEMACS_MOD_CONTROL; break; | 1001 case 'J': k = QKlinefeed; m &= ~MOD_CONTROL; break; |
1001 case 'M': k = QKreturn; m &= ~XEMACS_MOD_CONTROL; break; | 1002 case 'M': k = QKreturn; m &= ~MOD_CONTROL; break; |
1002 case '[': k = QKescape; m &= ~XEMACS_MOD_CONTROL; break; | 1003 case '[': k = QKescape; m &= ~MOD_CONTROL; break; |
1003 default: | 1004 default: |
1004 #if defined(HAVE_TTY) | 1005 #if defined(HAVE_TTY) |
1005 if (do_backspace_mapping && | 1006 if (do_backspace_mapping && |
1006 CHARP (con->tty_erase_char) && | 1007 CHARP (con->tty_erase_char) && |
1007 c - '@' == XCHAR (con->tty_erase_char)) | 1008 c - '@' == XCHAR (con->tty_erase_char)) |
1008 { | 1009 { |
1009 k = QKbackspace; | 1010 k = QKbackspace; |
1010 m &= ~XEMACS_MOD_CONTROL; | 1011 m &= ~MOD_CONTROL; |
1011 } | 1012 } |
1012 #endif /* defined(HAVE_TTY) && !defined(CYGWIN) */ | 1013 #endif /* defined(HAVE_TTY) && !defined(__CYGWIN32__) */ |
1013 break; | 1014 break; |
1014 } | 1015 } |
1015 if (c >= 'A' && c <= 'Z') c -= 'A'-'a'; | 1016 if (c >= 'A' && c <= 'Z') c -= 'A'-'a'; |
1016 } | 1017 } |
1017 #if defined(HAVE_TTY) | 1018 #if defined(HAVE_TTY) |
1018 else if (do_backspace_mapping && | 1019 else if (do_backspace_mapping && |
1019 CHARP (con->tty_erase_char) && c == XCHAR (con->tty_erase_char)) | 1020 CHARP (con->tty_erase_char) && c == XCHAR (con->tty_erase_char)) |
1020 k = QKbackspace; | 1021 k = QKbackspace; |
1021 #endif /* defined(HAVE_TTY) && !defined(CYGWIN) */ | 1022 #endif /* defined(HAVE_TTY) && !defined(__CYGWIN32__) */ |
1022 else if (c == 127) | 1023 else if (c == 127) |
1023 k = QKdelete; | 1024 k = QKdelete; |
1024 else if (c == ' ') | 1025 else if (c == ' ') |
1025 k = QKspace; | 1026 k = QKspace; |
1026 | 1027 |
1029 event->channel = make_console (con); | 1030 event->channel = make_console (con); |
1030 event->event.key.keysym = (!NILP (k) ? k : make_char (c)); | 1031 event->event.key.keysym = (!NILP (k) ? k : make_char (c)); |
1031 event->event.key.modifiers = m; | 1032 event->event.key.modifiers = m; |
1032 } | 1033 } |
1033 | 1034 |
1035 | |
1034 /* This variable controls what character name -> character code mapping | 1036 /* This variable controls what character name -> character code mapping |
1035 we are using. Window-system-specific code sets this to some symbol, | 1037 we are using. Window-system-specific code sets this to some symbol, |
1036 and we use that symbol as the plist key to convert keysyms into 8-bit | 1038 and we use that symbol as the plist key to convert keysyms into 8-bit |
1037 codes. In this way one can have several character sets predefined and | 1039 codes. In this way one can have several character sets predefined and |
1038 switch them by changing this. | 1040 switch them by changing this. |
1039 | |
1040 #### This is utterly bogus and should be removed. | |
1041 */ | 1041 */ |
1042 Lisp_Object Vcharacter_set_property; | 1042 Lisp_Object Vcharacter_set_property; |
1043 | 1043 |
1044 Emchar | 1044 Emchar |
1045 event_to_character (Lisp_Event *event, | 1045 event_to_character (struct Lisp_Event *event, |
1046 int allow_extra_modifiers, | 1046 int allow_extra_modifiers, |
1047 int allow_meta, | 1047 int allow_meta, |
1048 int allow_non_ascii) | 1048 int allow_non_ascii) |
1049 { | 1049 { |
1050 Emchar c = 0; | 1050 Emchar c = 0; |
1051 Lisp_Object code; | 1051 Lisp_Object code; |
1052 | 1052 |
1053 if (event->event_type != key_press_event) | 1053 if (event->event_type != key_press_event) |
1054 { | 1054 { |
1055 assert (event->event_type != dead_event); | 1055 if (event->event_type == dead_event) abort (); |
1056 return -1; | 1056 return -1; |
1057 } | 1057 } |
1058 if (!allow_extra_modifiers && | 1058 if (!allow_extra_modifiers && |
1059 event->event.key.modifiers & (XEMACS_MOD_SUPER|XEMACS_MOD_HYPER|XEMACS_MOD_ALT)) | 1059 event->event.key.modifiers & (MOD_SUPER|MOD_HYPER|MOD_ALT)) |
1060 return -1; | 1060 return -1; |
1061 if (CHAR_OR_CHAR_INTP (event->event.key.keysym)) | 1061 if (CHAR_OR_CHAR_INTP (event->event.key.keysym)) |
1062 c = XCHAR_OR_CHAR_INT (event->event.key.keysym); | 1062 c = XCHAR_OR_CHAR_INT (event->event.key.keysym); |
1063 else if (!SYMBOLP (event->event.key.keysym)) | 1063 else if (!SYMBOLP (event->event.key.keysym)) |
1064 abort (); | 1064 abort (); |
1073 Qascii_character, Qnil))) | 1073 Qascii_character, Qnil))) |
1074 c = XCHAR_OR_CHAR_INT (code); | 1074 c = XCHAR_OR_CHAR_INT (code); |
1075 else | 1075 else |
1076 return -1; | 1076 return -1; |
1077 | 1077 |
1078 if (event->event.key.modifiers & XEMACS_MOD_CONTROL) | 1078 if (event->event.key.modifiers & MOD_CONTROL) |
1079 { | 1079 { |
1080 if (c >= 'a' && c <= 'z') | 1080 if (c >= 'a' && c <= 'z') |
1081 c -= ('a' - 'A'); | 1081 c -= ('a' - 'A'); |
1082 else | 1082 else |
1083 /* reject Control-Shift- keys */ | 1083 /* reject Control-Shift- keys */ |
1091 else | 1091 else |
1092 /* reject keys that can't take Control- modifiers */ | 1092 /* reject keys that can't take Control- modifiers */ |
1093 if (! allow_extra_modifiers) return -1; | 1093 if (! allow_extra_modifiers) return -1; |
1094 } | 1094 } |
1095 | 1095 |
1096 if (event->event.key.modifiers & XEMACS_MOD_META) | 1096 if (event->event.key.modifiers & MOD_META) |
1097 { | 1097 { |
1098 if (! allow_meta) return -1; | 1098 if (! allow_meta) return -1; |
1099 if (c & 0200) return -1; /* don't allow M-oslash (overlap) */ | 1099 if (c & 0200) return -1; /* don't allow M-oslash (overlap) */ |
1100 #ifdef MULE | 1100 #ifdef MULE |
1101 if (c >= 256) return -1; | 1101 if (c >= 256) return -1; |
1217 | 1217 |
1218 return head; | 1218 return head; |
1219 } | 1219 } |
1220 | 1220 |
1221 void | 1221 void |
1222 format_event_object (char *buf, Lisp_Event *event, int brief) | 1222 format_event_object (char *buf, struct Lisp_Event *event, int brief) |
1223 { | 1223 { |
1224 int mouse_p = 0; | 1224 int mouse_p = 0; |
1225 int mod = 0; | 1225 int mod = 0; |
1226 Lisp_Object key; | 1226 Lisp_Object key; |
1227 | 1227 |
1231 { | 1231 { |
1232 mod = event->event.key.modifiers; | 1232 mod = event->event.key.modifiers; |
1233 key = event->event.key.keysym; | 1233 key = event->event.key.keysym; |
1234 /* Hack. */ | 1234 /* Hack. */ |
1235 if (! brief && CHARP (key) && | 1235 if (! brief && CHARP (key) && |
1236 mod & (XEMACS_MOD_CONTROL | XEMACS_MOD_META | XEMACS_MOD_SUPER | XEMACS_MOD_HYPER)) | 1236 mod & (MOD_CONTROL | MOD_META | MOD_SUPER | MOD_HYPER)) |
1237 { | 1237 { |
1238 int k = XCHAR (key); | 1238 int k = XCHAR (key); |
1239 if (k >= 'a' && k <= 'z') | 1239 if (k >= 'a' && k <= 'z') |
1240 key = make_char (k - ('a' - 'A')); | 1240 key = make_char (k - ('a' - 'A')); |
1241 else if (k >= 'A' && k <= 'Z') | 1241 else if (k >= 'A' && k <= 'Z') |
1242 mod |= XEMACS_MOD_SHIFT; | 1242 mod |= MOD_SHIFT; |
1243 } | 1243 } |
1244 break; | 1244 break; |
1245 } | 1245 } |
1246 case button_release_event: | 1246 case button_release_event: |
1247 mouse_p++; | 1247 mouse_p++; |
1253 key = make_char (event->event.button.button + '0'); | 1253 key = make_char (event->event.button.button + '0'); |
1254 break; | 1254 break; |
1255 } | 1255 } |
1256 case magic_event: | 1256 case magic_event: |
1257 { | 1257 { |
1258 const char *name = NULL; | 1258 CONST char *name = NULL; |
1259 | 1259 |
1260 #ifdef HAVE_X_WINDOWS | 1260 #ifdef HAVE_X_WINDOWS |
1261 { | 1261 { |
1262 Lisp_Object console = CDFW_CONSOLE (EVENT_CHANNEL (event)); | 1262 Lisp_Object console = CDFW_CONSOLE (EVENT_CHANNEL (event)); |
1263 if (CONSOLE_X_P (XCONSOLE (console))) | 1263 if (CONSOLE_X_P (XCONSOLE (console))) |
1279 default: | 1279 default: |
1280 abort (); | 1280 abort (); |
1281 } | 1281 } |
1282 #define modprint1(x) do { strcpy (buf, (x)); buf += sizeof (x)-1; } while (0) | 1282 #define modprint1(x) do { strcpy (buf, (x)); buf += sizeof (x)-1; } while (0) |
1283 #define modprint(x,y) do { if (brief) modprint1 (y); else modprint1 (x); } while (0) | 1283 #define modprint(x,y) do { if (brief) modprint1 (y); else modprint1 (x); } while (0) |
1284 if (mod & XEMACS_MOD_CONTROL) modprint ("control-", "C-"); | 1284 if (mod & MOD_CONTROL) modprint ("control-", "C-"); |
1285 if (mod & XEMACS_MOD_META) modprint ("meta-", "M-"); | 1285 if (mod & MOD_META) modprint ("meta-", "M-"); |
1286 if (mod & XEMACS_MOD_SUPER) modprint ("super-", "S-"); | 1286 if (mod & MOD_SUPER) modprint ("super-", "S-"); |
1287 if (mod & XEMACS_MOD_HYPER) modprint ("hyper-", "H-"); | 1287 if (mod & MOD_HYPER) modprint ("hyper-", "H-"); |
1288 if (mod & XEMACS_MOD_ALT) modprint ("alt-", "A-"); | 1288 if (mod & MOD_ALT) modprint ("alt-", "A-"); |
1289 if (mod & XEMACS_MOD_SHIFT) modprint ("shift-", "Sh-"); | 1289 if (mod & MOD_SHIFT) modprint ("shift-", "Sh-"); |
1290 if (mouse_p) | 1290 if (mouse_p) |
1291 { | 1291 { |
1292 modprint1 ("button"); | 1292 modprint1 ("button"); |
1293 --mouse_p; | 1293 --mouse_p; |
1294 } | 1294 } |
1301 buf += set_charptr_emchar ((Bufbyte *) buf, XCHAR (key)); | 1301 buf += set_charptr_emchar ((Bufbyte *) buf, XCHAR (key)); |
1302 *buf = 0; | 1302 *buf = 0; |
1303 } | 1303 } |
1304 else if (SYMBOLP (key)) | 1304 else if (SYMBOLP (key)) |
1305 { | 1305 { |
1306 const char *str = 0; | 1306 CONST char *str = 0; |
1307 if (brief) | 1307 if (brief) |
1308 { | 1308 { |
1309 if (EQ (key, QKlinefeed)) str = "LFD"; | 1309 if (EQ (key, QKlinefeed)) str = "LFD"; |
1310 else if (EQ (key, QKtab)) str = "TAB"; | 1310 else if (EQ (key, QKtab)) str = "TAB"; |
1311 else if (EQ (key, QKreturn)) str = "RET"; | 1311 else if (EQ (key, QKreturn)) str = "RET"; |
1320 memcpy (buf, str, i+1); | 1320 memcpy (buf, str, i+1); |
1321 str += i; | 1321 str += i; |
1322 } | 1322 } |
1323 else | 1323 else |
1324 { | 1324 { |
1325 Lisp_String *name = XSYMBOL (key)->name; | 1325 struct Lisp_String *name = XSYMBOL (key)->name; |
1326 memcpy (buf, string_data (name), string_length (name) + 1); | 1326 memcpy (buf, string_data (name), string_length (name) + 1); |
1327 str += string_length (name); | 1327 str += string_length (name); |
1328 } | 1328 } |
1329 } | 1329 } |
1330 else | 1330 else |
1356 Return the event object's `next' event, or nil if it has none. | 1356 Return the event object's `next' event, or nil if it has none. |
1357 The `next-event' field is changed by calling `set-next-event'. | 1357 The `next-event' field is changed by calling `set-next-event'. |
1358 */ | 1358 */ |
1359 (event)) | 1359 (event)) |
1360 { | 1360 { |
1361 Lisp_Event *e; | 1361 struct Lisp_Event *e; |
1362 CHECK_LIVE_EVENT (event); | 1362 CHECK_LIVE_EVENT (event); |
1363 | 1363 |
1364 return XEVENT_NEXT (event); | 1364 return XEVENT_NEXT (event); |
1365 } | 1365 } |
1366 | 1366 |
1541 */ | 1541 */ |
1542 (event)) | 1542 (event)) |
1543 { | 1543 { |
1544 int mod = XINT (Fevent_modifier_bits (event)); | 1544 int mod = XINT (Fevent_modifier_bits (event)); |
1545 Lisp_Object result = Qnil; | 1545 Lisp_Object result = Qnil; |
1546 if (mod & XEMACS_MOD_SHIFT) result = Fcons (Qshift, result); | 1546 if (mod & MOD_SHIFT) result = Fcons (Qshift, result); |
1547 if (mod & XEMACS_MOD_ALT) result = Fcons (Qalt, result); | 1547 if (mod & MOD_ALT) result = Fcons (Qalt, result); |
1548 if (mod & XEMACS_MOD_HYPER) result = Fcons (Qhyper, result); | 1548 if (mod & MOD_HYPER) result = Fcons (Qhyper, result); |
1549 if (mod & XEMACS_MOD_SUPER) result = Fcons (Qsuper, result); | 1549 if (mod & MOD_SUPER) result = Fcons (Qsuper, result); |
1550 if (mod & XEMACS_MOD_META) result = Fcons (Qmeta, result); | 1550 if (mod & MOD_META) result = Fcons (Qmeta, result); |
1551 if (mod & XEMACS_MOD_CONTROL) result = Fcons (Qcontrol, result); | 1551 if (mod & MOD_CONTROL) result = Fcons (Qcontrol, result); |
1552 return result; | 1552 return result; |
1553 } | 1553 } |
1554 | 1554 |
1555 static int | 1555 static int |
1556 event_x_y_pixel_internal (Lisp_Object event, int *x, int *y, int relative) | 1556 event_x_y_pixel_internal (Lisp_Object event, int *x, int *y, int relative) |
2096 This is in the form of a property list (alternating keyword/value pairs). | 2096 This is in the form of a property list (alternating keyword/value pairs). |
2097 */ | 2097 */ |
2098 (event)) | 2098 (event)) |
2099 { | 2099 { |
2100 Lisp_Object props = Qnil; | 2100 Lisp_Object props = Qnil; |
2101 Lisp_Event *e; | 2101 struct Lisp_Event *e; |
2102 struct gcpro gcpro1; | 2102 struct gcpro gcpro1; |
2103 | 2103 |
2104 CHECK_LIVE_EVENT (event); | 2104 CHECK_LIVE_EVENT (event); |
2105 e = XEVENT (event); | 2105 e = XEVENT (event); |
2106 GCPRO1 (props); | 2106 GCPRO1 (props); |
2175 /************************************************************************/ | 2175 /************************************************************************/ |
2176 | 2176 |
2177 void | 2177 void |
2178 syms_of_events (void) | 2178 syms_of_events (void) |
2179 { | 2179 { |
2180 INIT_LRECORD_IMPLEMENTATION (event); | |
2181 | |
2182 DEFSUBR (Fcharacter_to_event); | 2180 DEFSUBR (Fcharacter_to_event); |
2183 DEFSUBR (Fevent_to_character); | 2181 DEFSUBR (Fevent_to_character); |
2184 | 2182 |
2185 DEFSUBR (Fmake_event); | 2183 DEFSUBR (Fmake_event); |
2186 DEFSUBR (Fdeallocate_event); | 2184 DEFSUBR (Fdeallocate_event); |
2229 defsymbol (&Qkey_press, "key-press"); | 2227 defsymbol (&Qkey_press, "key-press"); |
2230 defsymbol (&Qbutton_press, "button-press"); | 2228 defsymbol (&Qbutton_press, "button-press"); |
2231 defsymbol (&Qbutton_release, "button-release"); | 2229 defsymbol (&Qbutton_release, "button-release"); |
2232 defsymbol (&Qmisc_user, "misc-user"); | 2230 defsymbol (&Qmisc_user, "misc-user"); |
2233 defsymbol (&Qascii_character, "ascii-character"); | 2231 defsymbol (&Qascii_character, "ascii-character"); |
2234 | |
2235 defsymbol (&QKbackspace, "backspace"); | |
2236 defsymbol (&QKtab, "tab"); | |
2237 defsymbol (&QKlinefeed, "linefeed"); | |
2238 defsymbol (&QKreturn, "return"); | |
2239 defsymbol (&QKescape, "escape"); | |
2240 defsymbol (&QKspace, "space"); | |
2241 defsymbol (&QKdelete, "delete"); | |
2242 } | |
2243 | |
2244 | |
2245 void | |
2246 reinit_vars_of_events (void) | |
2247 { | |
2248 Vevent_resource = Qnil; | |
2249 } | 2232 } |
2250 | 2233 |
2251 void | 2234 void |
2252 vars_of_events (void) | 2235 vars_of_events (void) |
2253 { | 2236 { |
2254 reinit_vars_of_events (); | |
2255 | |
2256 DEFVAR_LISP ("character-set-property", &Vcharacter_set_property /* | 2237 DEFVAR_LISP ("character-set-property", &Vcharacter_set_property /* |
2257 A symbol used to look up the 8-bit character of a keysym. | 2238 A symbol used to look up the 8-bit character of a keysym. |
2258 To convert a keysym symbol to an 8-bit code, as when that key is | 2239 To convert a keysym symbol to an 8-bit code, as when that key is |
2259 bound to self-insert-command, we will look up the property that this | 2240 bound to self-insert-command, we will look up the property that this |
2260 variable names on the property list of the keysym-symbol. The window- | 2241 variable names on the property list of the keysym-symbol. The window- |
2261 system-specific code will set up appropriate properties and set this | 2242 system-specific code will set up appropriate properties and set this |
2262 variable. | 2243 variable. |
2263 */ ); | 2244 */ ); |
2264 Vcharacter_set_property = Qnil; | 2245 Vcharacter_set_property = Qnil; |
2265 } | 2246 |
2247 Vevent_resource = Qnil; | |
2248 | |
2249 QKbackspace = KEYSYM ("backspace"); | |
2250 QKtab = KEYSYM ("tab"); | |
2251 QKlinefeed = KEYSYM ("linefeed"); | |
2252 QKreturn = KEYSYM ("return"); | |
2253 QKescape = KEYSYM ("escape"); | |
2254 QKspace = KEYSYM ("space"); | |
2255 QKdelete = KEYSYM ("delete"); | |
2256 | |
2257 staticpro (&QKbackspace); | |
2258 staticpro (&QKtab); | |
2259 staticpro (&QKlinefeed); | |
2260 staticpro (&QKreturn); | |
2261 staticpro (&QKescape); | |
2262 staticpro (&QKspace); | |
2263 staticpro (&QKdelete); | |
2264 } |