comparison src/events.c @ 398:74fd4e045ea6 r21-2-29

Import from CVS: tag r21-2-29
author cvs
date Mon, 13 Aug 2007 11:13:30 +0200
parents bbff43aa5eb7
children a86b2b5e0111
comparison
equal deleted inserted replaced
397:f4aeb21a5bad 398:74fd4e045ea6
79 /* 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 */
80 static void 80 static void
81 deinitialize_event (Lisp_Object ev) 81 deinitialize_event (Lisp_Object ev)
82 { 82 {
83 int i; 83 int i;
84 struct Lisp_Event *event = XEVENT (ev); 84 Lisp_Event *event = XEVENT (ev);
85 85
86 for (i = 0; i < (int) (sizeof (struct Lisp_Event) / sizeof (int)); i++) 86 for (i = 0; i < (int) (sizeof (Lisp_Event) / sizeof (int)); i++)
87 ((int *) event) [i] = 0xdeadbeef; 87 ((int *) event) [i] = 0xdeadbeef;
88 event->event_type = dead_event; 88 event->event_type = dead_event;
89 event->channel = Qnil; 89 event->channel = Qnil;
90 set_lheader_implementation (&(event->lheader), lrecord_event); 90 set_lheader_implementation (&(event->lheader), &lrecord_event);
91 XSET_EVENT_NEXT (ev, Qnil); 91 XSET_EVENT_NEXT (ev, Qnil);
92 } 92 }
93 93
94 /* Set everything to zero or nil so that it's predictable. */ 94 /* Set everything to zero or nil so that it's predictable. */
95 void 95 void
96 zero_event (struct Lisp_Event *e) 96 zero_event (Lisp_Event *e)
97 { 97 {
98 xzero (*e); 98 xzero (*e);
99 set_lheader_implementation (&(e->lheader), lrecord_event); 99 set_lheader_implementation (&(e->lheader), &lrecord_event);
100 e->event_type = empty_event; 100 e->event_type = empty_event;
101 e->next = Qnil; 101 e->next = Qnil;
102 e->channel = Qnil; 102 e->channel = Qnil;
103 } 103 }
104 104
105 static Lisp_Object 105 static Lisp_Object
106 mark_event (Lisp_Object obj, void (*markobj) (Lisp_Object)) 106 mark_event (Lisp_Object obj)
107 { 107 {
108 struct Lisp_Event *event = XEVENT (obj); 108 Lisp_Event *event = XEVENT (obj);
109 109
110 switch (event->event_type) 110 switch (event->event_type)
111 { 111 {
112 case key_press_event: 112 case key_press_event:
113 markobj (event->event.key.keysym); 113 mark_object (event->event.key.keysym);
114 break; 114 break;
115 case process_event: 115 case process_event:
116 markobj (event->event.process.process); 116 mark_object (event->event.process.process);
117 break; 117 break;
118 case timeout_event: 118 case timeout_event:
119 markobj (event->event.timeout.function); 119 mark_object (event->event.timeout.function);
120 markobj (event->event.timeout.object); 120 mark_object (event->event.timeout.object);
121 break; 121 break;
122 case eval_event: 122 case eval_event:
123 case misc_user_event: 123 case misc_user_event:
124 markobj (event->event.eval.function); 124 mark_object (event->event.eval.function);
125 markobj (event->event.eval.object); 125 mark_object (event->event.eval.object);
126 break; 126 break;
127 case magic_eval_event: 127 case magic_eval_event:
128 markobj (event->event.magic_eval.object); 128 mark_object (event->event.magic_eval.object);
129 break; 129 break;
130 case button_press_event: 130 case button_press_event:
131 case button_release_event: 131 case button_release_event:
132 case pointer_motion_event: 132 case pointer_motion_event:
133 case magic_event: 133 case magic_event:
135 case dead_event: 135 case dead_event:
136 break; 136 break;
137 default: 137 default:
138 abort (); 138 abort ();
139 } 139 }
140 markobj (event->channel); 140 mark_object (event->channel);
141 return event->next; 141 return event->next;
142 } 142 }
143 143
144 static void 144 static void
145 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)
146 { 146 {
147 char buf[255]; 147 char buf[255];
148 write_c_string (str, printcharfun); 148 write_c_string (str, printcharfun);
149 format_event_object (buf, XEVENT (obj), 0); 149 format_event_object (buf, XEVENT (obj), 0);
150 write_c_string (buf, printcharfun); 150 write_c_string (buf, printcharfun);
219 } 219 }
220 220
221 static int 221 static int
222 event_equal (Lisp_Object obj1, Lisp_Object obj2, int depth) 222 event_equal (Lisp_Object obj1, Lisp_Object obj2, int depth)
223 { 223 {
224 struct Lisp_Event *e1 = XEVENT (obj1); 224 Lisp_Event *e1 = XEVENT (obj1);
225 struct Lisp_Event *e2 = XEVENT (obj2); 225 Lisp_Event *e2 = XEVENT (obj2);
226 226
227 if (e1->event_type != e2->event_type) return 0; 227 if (e1->event_type != e2->event_type) return 0;
228 if (!EQ (e1->channel, e2->channel)) return 0; 228 if (!EQ (e1->channel, e2->channel)) return 0;
229 /* if (e1->timestamp != e2->timestamp) return 0; */ 229 /* if (e1->timestamp != e2->timestamp) return 0; */
230 switch (e1->event_type) 230 switch (e1->event_type)
291 #endif 291 #endif
292 #ifdef HAVE_MS_WINDOWS 292 #ifdef HAVE_MS_WINDOWS
293 if (CONSOLE_MSWINDOWS_P (con)) 293 if (CONSOLE_MSWINDOWS_P (con))
294 return (!memcmp(&e1->event.magic.underlying_mswindows_event, 294 return (!memcmp(&e1->event.magic.underlying_mswindows_event,
295 &e2->event.magic.underlying_mswindows_event, 295 &e2->event.magic.underlying_mswindows_event,
296 sizeof(union magic_data))); 296 sizeof (union magic_data)));
297 #endif 297 #endif
298 abort ();
298 return 1; /* not reached */ 299 return 1; /* not reached */
299 } 300 }
300 301
301 case empty_event: /* Empty and deallocated events are equal. */ 302 case empty_event: /* Empty and deallocated events are equal. */
302 case dead_event: 303 case dead_event:
305 } 306 }
306 307
307 static unsigned long 308 static unsigned long
308 event_hash (Lisp_Object obj, int depth) 309 event_hash (Lisp_Object obj, int depth)
309 { 310 {
310 struct Lisp_Event *e = XEVENT (obj); 311 Lisp_Event *e = XEVENT (obj);
311 unsigned long hash; 312 unsigned long hash;
312 313
313 hash = HASH2 (e->event_type, LISP_HASH (e->channel)); 314 hash = HASH2 (e->event_type, LISP_HASH (e->channel));
314 switch (e->event_type) 315 switch (e->event_type)
315 { 316 {
358 #endif 359 #endif
359 #ifdef HAVE_MS_WINDOWS 360 #ifdef HAVE_MS_WINDOWS
360 if (CONSOLE_MSWINDOWS_P (con)) 361 if (CONSOLE_MSWINDOWS_P (con))
361 return HASH2 (hash, e->event.magic.underlying_mswindows_event); 362 return HASH2 (hash, e->event.magic.underlying_mswindows_event);
362 #endif 363 #endif
364 abort ();
365 return 0;
363 } 366 }
364 367
365 case empty_event: 368 case empty_event:
366 case dead_event: 369 case dead_event:
367 return hash; 370 return hash;
373 return 0; /* unreached */ 376 return 0; /* unreached */
374 } 377 }
375 378
376 DEFINE_BASIC_LRECORD_IMPLEMENTATION ("event", event, 379 DEFINE_BASIC_LRECORD_IMPLEMENTATION ("event", event,
377 mark_event, print_event, 0, event_equal, 380 mark_event, print_event, 0, event_equal,
378 event_hash, struct Lisp_Event); 381 event_hash, 0, Lisp_Event);
379 382
380 383
381 DEFUN ("make-event", Fmake_event, 0, 2, 0, /* 384 DEFUN ("make-event", Fmake_event, 0, 2, 0, /*
382 Return a new event of type TYPE, with properties described by PLIST. 385 Return a new event of type TYPE, with properties described by PLIST.
383 386
426 */ 429 */
427 (type, plist)) 430 (type, plist))
428 { 431 {
429 Lisp_Object tail, keyword, value; 432 Lisp_Object tail, keyword, value;
430 Lisp_Object event = Qnil; 433 Lisp_Object event = Qnil;
431 struct Lisp_Event *e; 434 Lisp_Event *e;
432 EMACS_INT coord_x = 0, coord_y = 0; 435 EMACS_INT coord_x = 0, coord_y = 0;
433 struct gcpro gcpro1; 436 struct gcpro gcpro1;
434 437
435 GCPRO1 (event); 438 GCPRO1 (event);
436 439
761 764
762 DEFUN ("copy-event", Fcopy_event, 1, 2, 0, /* 765 DEFUN ("copy-event", Fcopy_event, 1, 2, 0, /*
763 Make a copy of the given event object. 766 Make a copy of the given event object.
764 If a second argument is given, the first event is copied into the second 767 If a second argument is given, the first event is copied into the second
765 and the second is returned. If the second argument is not supplied (or 768 and the second is returned. If the second argument is not supplied (or
766 is nil) then a new event will be made as with `allocate-event.' See also 769 is nil) then a new event will be made as with `make-event'. See also
767 the function `deallocate-event'. 770 the function `deallocate-event'.
768 */ 771 */
769 (event1, event2)) 772 (event1, event2))
770 { 773 {
771 CHECK_LIVE_EVENT (event1); 774 CHECK_LIVE_EVENT (event1);
772 if (NILP (event2)) 775 if (NILP (event2))
773 event2 = Fmake_event (Qnil, Qnil); 776 event2 = Fmake_event (Qnil, Qnil);
774 else CHECK_LIVE_EVENT (event2); 777 else
775 if (EQ (event1, event2)) 778 {
776 return signal_simple_continuable_error_2 779 CHECK_LIVE_EVENT (event2);
777 ("copy-event called with `eq' events", event1, event2); 780 if (EQ (event1, event2))
781 return signal_simple_continuable_error_2
782 ("copy-event called with `eq' events", event1, event2);
783 }
778 784
779 assert (XEVENT_TYPE (event1) <= last_event_type); 785 assert (XEVENT_TYPE (event1) <= last_event_type);
780 assert (XEVENT_TYPE (event2) <= last_event_type); 786 assert (XEVENT_TYPE (event2) <= last_event_type);
781 787
782 { 788 {
783 Lisp_Object save_next = XEVENT_NEXT (event2); 789 Lisp_Event *ev2 = XEVENT (event2);
784 790 Lisp_Event *ev1 = XEVENT (event1);
785 *XEVENT (event2) = *XEVENT (event1); 791
786 XSET_EVENT_NEXT (event2, save_next); 792 ev2->event_type = ev1->event_type;
793 ev2->channel = ev1->channel;
794 ev2->timestamp = ev1->timestamp;
795 ev2->event = ev1->event;
796
787 return event2; 797 return event2;
788 } 798 }
789 } 799 }
790 800
791 801
961 } 971 }
962 } 972 }
963 973
964 974
965 void 975 void
966 character_to_event (Emchar c, struct Lisp_Event *event, struct console *con, 976 character_to_event (Emchar c, Lisp_Event *event, struct console *con,
967 int use_console_meta_flag, int do_backspace_mapping) 977 int use_console_meta_flag, int do_backspace_mapping)
968 { 978 {
969 Lisp_Object k = Qnil; 979 Lisp_Object k = Qnil;
970 unsigned int m = 0; 980 unsigned int m = 0;
971 if (event->event_type == dead_event) 981 if (event->event_type == dead_event)
1030 event->channel = make_console (con); 1040 event->channel = make_console (con);
1031 event->event.key.keysym = (!NILP (k) ? k : make_char (c)); 1041 event->event.key.keysym = (!NILP (k) ? k : make_char (c));
1032 event->event.key.modifiers = m; 1042 event->event.key.modifiers = m;
1033 } 1043 }
1034 1044
1035
1036 /* This variable controls what character name -> character code mapping 1045 /* This variable controls what character name -> character code mapping
1037 we are using. Window-system-specific code sets this to some symbol, 1046 we are using. Window-system-specific code sets this to some symbol,
1038 and we use that symbol as the plist key to convert keysyms into 8-bit 1047 and we use that symbol as the plist key to convert keysyms into 8-bit
1039 codes. In this way one can have several character sets predefined and 1048 codes. In this way one can have several character sets predefined and
1040 switch them by changing this. 1049 switch them by changing this.
1050
1051 #### This is utterly bogus and should be removed.
1041 */ 1052 */
1042 Lisp_Object Vcharacter_set_property; 1053 Lisp_Object Vcharacter_set_property;
1043 1054
1044 Emchar 1055 Emchar
1045 event_to_character (struct Lisp_Event *event, 1056 event_to_character (Lisp_Event *event,
1046 int allow_extra_modifiers, 1057 int allow_extra_modifiers,
1047 int allow_meta, 1058 int allow_meta,
1048 int allow_non_ascii) 1059 int allow_non_ascii)
1049 { 1060 {
1050 Emchar c = 0; 1061 Emchar c = 0;
1051 Lisp_Object code; 1062 Lisp_Object code;
1052 1063
1053 if (event->event_type != key_press_event) 1064 if (event->event_type != key_press_event)
1054 { 1065 {
1055 if (event->event_type == dead_event) abort (); 1066 assert (event->event_type != dead_event);
1056 return -1; 1067 return -1;
1057 } 1068 }
1058 if (!allow_extra_modifiers && 1069 if (!allow_extra_modifiers &&
1059 event->event.key.modifiers & (MOD_SUPER|MOD_HYPER|MOD_ALT)) 1070 event->event.key.modifiers & (MOD_SUPER|MOD_HYPER|MOD_ALT))
1060 return -1; 1071 return -1;
1217 1228
1218 return head; 1229 return head;
1219 } 1230 }
1220 1231
1221 void 1232 void
1222 format_event_object (char *buf, struct Lisp_Event *event, int brief) 1233 format_event_object (char *buf, Lisp_Event *event, int brief)
1223 { 1234 {
1224 int mouse_p = 0; 1235 int mouse_p = 0;
1225 int mod = 0; 1236 int mod = 0;
1226 Lisp_Object key; 1237 Lisp_Object key;
1227 1238
1253 key = make_char (event->event.button.button + '0'); 1264 key = make_char (event->event.button.button + '0');
1254 break; 1265 break;
1255 } 1266 }
1256 case magic_event: 1267 case magic_event:
1257 { 1268 {
1258 CONST char *name = NULL; 1269 const char *name = NULL;
1259 1270
1260 #ifdef HAVE_X_WINDOWS 1271 #ifdef HAVE_X_WINDOWS
1261 { 1272 {
1262 Lisp_Object console = CDFW_CONSOLE (EVENT_CHANNEL (event)); 1273 Lisp_Object console = CDFW_CONSOLE (EVENT_CHANNEL (event));
1263 if (CONSOLE_X_P (XCONSOLE (console))) 1274 if (CONSOLE_X_P (XCONSOLE (console)))
1301 buf += set_charptr_emchar ((Bufbyte *) buf, XCHAR (key)); 1312 buf += set_charptr_emchar ((Bufbyte *) buf, XCHAR (key));
1302 *buf = 0; 1313 *buf = 0;
1303 } 1314 }
1304 else if (SYMBOLP (key)) 1315 else if (SYMBOLP (key))
1305 { 1316 {
1306 CONST char *str = 0; 1317 const char *str = 0;
1307 if (brief) 1318 if (brief)
1308 { 1319 {
1309 if (EQ (key, QKlinefeed)) str = "LFD"; 1320 if (EQ (key, QKlinefeed)) str = "LFD";
1310 else if (EQ (key, QKtab)) str = "TAB"; 1321 else if (EQ (key, QKtab)) str = "TAB";
1311 else if (EQ (key, QKreturn)) str = "RET"; 1322 else if (EQ (key, QKreturn)) str = "RET";
1320 memcpy (buf, str, i+1); 1331 memcpy (buf, str, i+1);
1321 str += i; 1332 str += i;
1322 } 1333 }
1323 else 1334 else
1324 { 1335 {
1325 struct Lisp_String *name = XSYMBOL (key)->name; 1336 Lisp_String *name = XSYMBOL (key)->name;
1326 memcpy (buf, string_data (name), string_length (name) + 1); 1337 memcpy (buf, string_data (name), string_length (name) + 1);
1327 str += string_length (name); 1338 str += string_length (name);
1328 } 1339 }
1329 } 1340 }
1330 else 1341 else
1356 Return the event object's `next' event, or nil if it has none. 1367 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'. 1368 The `next-event' field is changed by calling `set-next-event'.
1358 */ 1369 */
1359 (event)) 1370 (event))
1360 { 1371 {
1361 struct Lisp_Event *e; 1372 Lisp_Event *e;
1362 CHECK_LIVE_EVENT (event); 1373 CHECK_LIVE_EVENT (event);
1363 1374
1364 return XEVENT_NEXT (event); 1375 return XEVENT_NEXT (event);
1365 } 1376 }
1366 1377
2096 This is in the form of a property list (alternating keyword/value pairs). 2107 This is in the form of a property list (alternating keyword/value pairs).
2097 */ 2108 */
2098 (event)) 2109 (event))
2099 { 2110 {
2100 Lisp_Object props = Qnil; 2111 Lisp_Object props = Qnil;
2101 struct Lisp_Event *e; 2112 Lisp_Event *e;
2102 struct gcpro gcpro1; 2113 struct gcpro gcpro1;
2103 2114
2104 CHECK_LIVE_EVENT (event); 2115 CHECK_LIVE_EVENT (event);
2105 e = XEVENT (event); 2116 e = XEVENT (event);
2106 GCPRO1 (props); 2117 GCPRO1 (props);
2227 defsymbol (&Qkey_press, "key-press"); 2238 defsymbol (&Qkey_press, "key-press");
2228 defsymbol (&Qbutton_press, "button-press"); 2239 defsymbol (&Qbutton_press, "button-press");
2229 defsymbol (&Qbutton_release, "button-release"); 2240 defsymbol (&Qbutton_release, "button-release");
2230 defsymbol (&Qmisc_user, "misc-user"); 2241 defsymbol (&Qmisc_user, "misc-user");
2231 defsymbol (&Qascii_character, "ascii-character"); 2242 defsymbol (&Qascii_character, "ascii-character");
2243
2244 defsymbol (&QKbackspace, "backspace");
2245 defsymbol (&QKtab, "tab");
2246 defsymbol (&QKlinefeed, "linefeed");
2247 defsymbol (&QKreturn, "return");
2248 defsymbol (&QKescape, "escape");
2249 defsymbol (&QKspace, "space");
2250 defsymbol (&QKdelete, "delete");
2251 }
2252
2253
2254 void
2255 reinit_vars_of_events (void)
2256 {
2257 Vevent_resource = Qnil;
2232 } 2258 }
2233 2259
2234 void 2260 void
2235 vars_of_events (void) 2261 vars_of_events (void)
2236 { 2262 {
2263 reinit_vars_of_events ();
2264
2237 DEFVAR_LISP ("character-set-property", &Vcharacter_set_property /* 2265 DEFVAR_LISP ("character-set-property", &Vcharacter_set_property /*
2238 A symbol used to look up the 8-bit character of a keysym. 2266 A symbol used to look up the 8-bit character of a keysym.
2239 To convert a keysym symbol to an 8-bit code, as when that key is 2267 To convert a keysym symbol to an 8-bit code, as when that key is
2240 bound to self-insert-command, we will look up the property that this 2268 bound to self-insert-command, we will look up the property that this
2241 variable names on the property list of the keysym-symbol. The window- 2269 variable names on the property list of the keysym-symbol. The window-
2242 system-specific code will set up appropriate properties and set this 2270 system-specific code will set up appropriate properties and set this
2243 variable. 2271 variable.
2244 */ ); 2272 */ );
2245 Vcharacter_set_property = Qnil; 2273 Vcharacter_set_property = Qnil;
2246 2274 }
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 }