Mercurial > hg > xemacs-beta
comparison src/events.c @ 173:8eaf7971accc r20-3b13
Import from CVS: tag r20-3b13
author | cvs |
---|---|
date | Mon, 13 Aug 2007 09:49:09 +0200 |
parents | 0132846995bd |
children | e121b013d1f0 |
comparison
equal
deleted
inserted
replaced
172:a38aed19690b | 173:8eaf7971accc |
---|---|
159 print_event (Lisp_Object obj, Lisp_Object printcharfun, int escapeflag) | 159 print_event (Lisp_Object obj, Lisp_Object printcharfun, int escapeflag) |
160 { | 160 { |
161 if (print_readably) | 161 if (print_readably) |
162 error ("printing unreadable object #<event>"); | 162 error ("printing unreadable object #<event>"); |
163 | 163 |
164 switch (XEVENT (obj)->event_type) | 164 switch (XEVENT (obj)->event_type) |
165 { | 165 { |
166 case key_press_event: | 166 case key_press_event: |
167 print_event_1 ("#<keypress-event ", obj, printcharfun); | 167 print_event_1 ("#<keypress-event ", obj, printcharfun); |
168 break; | 168 break; |
169 case button_press_event: | 169 case button_press_event: |
215 write_c_string ("#<UNKNOWN-EVENT-TYPE", printcharfun); | 215 write_c_string ("#<UNKNOWN-EVENT-TYPE", printcharfun); |
216 break; | 216 break; |
217 } | 217 } |
218 write_c_string (">", printcharfun); | 218 write_c_string (">", printcharfun); |
219 } | 219 } |
220 | 220 |
221 static int | 221 static int |
222 event_equal (Lisp_Object o1, Lisp_Object o2, int depth) | 222 event_equal (Lisp_Object o1, Lisp_Object o2, int depth) |
223 { | 223 { |
224 struct Lisp_Event *e1 = XEVENT (o1); | 224 struct Lisp_Event *e1 = XEVENT (o1); |
225 struct Lisp_Event *e2 = XEVENT (o2); | 225 struct Lisp_Event *e2 = XEVENT (o2); |
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) |
231 { | 231 { |
232 case process_event: | 232 case process_event: |
233 return EQ (e1->event.process.process, e2->event.process.process); | 233 return EQ (e1->event.process.process, e2->event.process.process); |
234 | 234 |
235 case timeout_event: | 235 case timeout_event: |
236 return (!NILP (Fequal (e1->event.timeout.function, | 236 return (!NILP (Fequal (e1->event.timeout.function, |
237 e2->event.timeout.function)) && | 237 e2->event.timeout.function)) && |
238 !NILP (Fequal (e1->event.timeout.object, | 238 !NILP (Fequal (e1->event.timeout.object, |
239 e2->event.timeout.object))); | 239 e2->event.timeout.object))); |
240 | 240 |
241 case key_press_event: | 241 case key_press_event: |
242 return (EQ (e1->event.key.keysym, e2->event.key.keysym) && | 242 return (EQ (e1->event.key.keysym, e2->event.key.keysym) && |
243 (e1->event.key.modifiers == e2->event.key.modifiers)); | 243 (e1->event.key.modifiers == e2->event.key.modifiers)); |
244 | 244 |
245 case button_press_event: | 245 case button_press_event: |
304 hash = HASH2 (e->event_type, LISP_HASH (e->channel)); | 304 hash = HASH2 (e->event_type, LISP_HASH (e->channel)); |
305 switch (e->event_type) | 305 switch (e->event_type) |
306 { | 306 { |
307 case process_event: | 307 case process_event: |
308 return HASH2 (hash, LISP_HASH (e->event.process.process)); | 308 return HASH2 (hash, LISP_HASH (e->event.process.process)); |
309 | 309 |
310 case timeout_event: | 310 case timeout_event: |
311 return HASH3 (hash, internal_hash (e->event.timeout.function, depth + 1), | 311 return HASH3 (hash, internal_hash (e->event.timeout.function, depth + 1), |
312 internal_hash (e->event.timeout.object, depth + 1)); | 312 internal_hash (e->event.timeout.object, depth + 1)); |
313 | 313 |
314 case key_press_event: | 314 case key_press_event: |
315 return HASH3 (hash, LISP_HASH (e->event.key.keysym), | 315 return HASH3 (hash, LISP_HASH (e->event.key.keysym), |
316 e->event.key.modifiers); | 316 e->event.key.modifiers); |
317 | 317 |
318 case button_press_event: | 318 case button_press_event: |
404 error ("this event is already deallocated!"); | 404 error ("this event is already deallocated!"); |
405 | 405 |
406 assert (XEVENT_TYPE (event) <= last_event_type); | 406 assert (XEVENT_TYPE (event) <= last_event_type); |
407 | 407 |
408 #if 0 | 408 #if 0 |
409 { | 409 { |
410 int i; | 410 int i, len; |
411 extern Lisp_Object Vlast_command_event; | 411 extern Lisp_Object Vlast_command_event; |
412 extern Lisp_Object Vlast_input_event, Vunread_command_event; | 412 extern Lisp_Object Vlast_input_event, Vunread_command_event; |
413 extern Lisp_Object Vthis_command_keys, Vrecent_keys_ring; | 413 extern Lisp_Object Vthis_command_keys, Vrecent_keys_ring; |
414 | 414 |
415 if (EQ (event, Vlast_command_event)) | 415 if (EQ (event, Vlast_command_event) || |
416 EQ (event, Vlast_input_event) || | |
417 EQ (event, Vunread_command_event)) | |
416 abort (); | 418 abort (); |
417 if (EQ (event, Vlast_input_event)) | 419 |
418 abort (); | 420 len = XVECTOR_LENGTH (Vthis_command_keys); |
419 if (EQ (event, Vunread_command_event)) | 421 for (i = 0; i < len; i++) |
420 abort (); | 422 if (EQ (event, XVECTOR_DATA (Vthis_command_keys) [i])) |
421 for (i = 0; i < XVECTOR (Vthis_command_keys)->size; i++) | |
422 if (EQ (event, vector_data (XVECTOR (Vthis_command_keys)) [i])) | |
423 abort (); | 423 abort (); |
424 if (!NILP (Vrecent_keys_ring)) | 424 if (!NILP (Vrecent_keys_ring)) |
425 { | 425 { |
426 for (i = 0; i < XVECTOR (Vrecent_keys_ring)->size; i++) | 426 int recent_ring_len = XVECTOR_LENGTH (Vrecent_keys_ring); |
427 if (EQ (event, vector_data (XVECTOR (Vrecent_keys_ring)) [i])) | 427 for (i = 0; i < recent_ring_len; i++) |
428 if (EQ (event, XVECTOR_DATA (Vrecent_keys_ring) [i])) | |
428 abort (); | 429 abort (); |
429 } | 430 } |
430 } | 431 } |
431 #endif /* 0 */ | 432 #endif /* 0 */ |
432 | 433 |
462 { | 463 { |
463 Lisp_Object save_next = XEVENT_NEXT (event2); | 464 Lisp_Object save_next = XEVENT_NEXT (event2); |
464 | 465 |
465 *XEVENT (event2) = *XEVENT (event1); | 466 *XEVENT (event2) = *XEVENT (event1); |
466 XSET_EVENT_NEXT (event2, save_next); | 467 XSET_EVENT_NEXT (event2, save_next); |
467 return (event2); | 468 return event2; |
468 } | 469 } |
469 } | 470 } |
470 | 471 |
471 | 472 |
472 | 473 |
518 assert (!EQ (event, XEVENT_NEXT (event))); | 519 assert (!EQ (event, XEVENT_NEXT (event))); |
519 } | 520 } |
520 | 521 |
521 /* Remove an event off the head of a chain of events and return it. | 522 /* Remove an event off the head of a chain of events and return it. |
522 HEAD points to the first event in the chain, TAIL to the last event. */ | 523 HEAD points to the first event in the chain, TAIL to the last event. */ |
523 | 524 |
524 Lisp_Object | 525 Lisp_Object |
525 dequeue_event (Lisp_Object *head, Lisp_Object *tail) | 526 dequeue_event (Lisp_Object *head, Lisp_Object *tail) |
526 { | 527 { |
527 Lisp_Object event; | 528 Lisp_Object event; |
528 | 529 |
633 { | 634 { |
634 case key_press_event: | 635 case key_press_event: |
635 case button_press_event: | 636 case button_press_event: |
636 case button_release_event: | 637 case button_release_event: |
637 case misc_user_event: | 638 case misc_user_event: |
638 return (1); | 639 return 1; |
639 default: | 640 default: |
640 return (0); | 641 return 0; |
641 } | 642 } |
642 } | 643 } |
643 | 644 |
644 | 645 |
645 void | 646 void |
690 } | 691 } |
691 else if (c == 127) | 692 else if (c == 127) |
692 k = QKdelete; | 693 k = QKdelete; |
693 else if (c == ' ') | 694 else if (c == ' ') |
694 k = QKspace; | 695 k = QKspace; |
695 | 696 |
696 event->event_type = key_press_event; | 697 event->event_type = key_press_event; |
697 event->timestamp = 0; /* #### */ | 698 event->timestamp = 0; /* #### */ |
698 event->channel = make_console (con); | 699 event->channel = make_console (con); |
699 event->event.key.keysym = (!NILP (k) ? k : make_char (c)); | 700 event->event.key.keysym = (!NILP (k) ? k : make_char (c)); |
700 event->event.key.modifiers = m; | 701 event->event.key.modifiers = m; |
749 c -= ('a' - 'A'); | 750 c -= ('a' - 'A'); |
750 else | 751 else |
751 /* reject Control-Shift- keys */ | 752 /* reject Control-Shift- keys */ |
752 if (c >= 'A' && c <= 'Z' && !allow_extra_modifiers) | 753 if (c >= 'A' && c <= 'Z' && !allow_extra_modifiers) |
753 return -1; | 754 return -1; |
754 | 755 |
755 if (c >= '@' && c <= '_') | 756 if (c >= '@' && c <= '_') |
756 c -= '@'; | 757 c -= '@'; |
757 else if (c == ' ') /* C-space and C-@ are the same. */ | 758 else if (c == ' ') /* C-space and C-@ are the same. */ |
758 c = 0; | 759 c = 0; |
759 else | 760 else |
797 CHECK_LIVE_EVENT (event); | 798 CHECK_LIVE_EVENT (event); |
798 c = event_to_character (XEVENT (event), | 799 c = event_to_character (XEVENT (event), |
799 !NILP (allow_extra_modifiers), | 800 !NILP (allow_extra_modifiers), |
800 !NILP (allow_meta), | 801 !NILP (allow_meta), |
801 !NILP (allow_non_ascii)); | 802 !NILP (allow_non_ascii)); |
802 return (c < 0 ? Qnil : make_char (c)); | 803 return c < 0 ? Qnil : make_char (c); |
803 } | 804 } |
804 | 805 |
805 DEFUN ("character-to-event", Fcharacter_to_event, 1, 4, 0, /* | 806 DEFUN ("character-to-event", Fcharacter_to_event, 1, 4, 0, /* |
806 Converts a keystroke specifier into an event structure, replete with | 807 Converts a keystroke specifier into an event structure, replete with |
807 bucky bits. The keystroke is the first argument, and the event to fill | 808 bucky bits. The keystroke is the first argument, and the event to fill |
859 Emchar ch = string_char (XSTRING (seq), n); | 860 Emchar ch = string_char (XSTRING (seq), n); |
860 Fcharacter_to_event (make_char (ch), event, Qnil, Qnil); | 861 Fcharacter_to_event (make_char (ch), event, Qnil, Qnil); |
861 } | 862 } |
862 else | 863 else |
863 { | 864 { |
864 Lisp_Object keystroke = vector_data (XVECTOR (seq))[n]; | 865 Lisp_Object keystroke = XVECTOR_DATA (seq)[n]; |
865 if (EVENTP (keystroke)) | 866 if (EVENTP (keystroke)) |
866 Fcopy_event (keystroke, event); | 867 Fcopy_event (keystroke, event); |
867 else | 868 else |
868 Fcharacter_to_event (keystroke, event, Qnil, Qnil); | 869 Fcharacter_to_event (keystroke, event, Qnil, Qnil); |
869 } | 870 } |
1040 | 1041 |
1041 CHECK_LIVE_EVENT (event); | 1042 CHECK_LIVE_EVENT (event); |
1042 if (NILP (next_event)) | 1043 if (NILP (next_event)) |
1043 { | 1044 { |
1044 XSET_EVENT_NEXT (event, Qnil); | 1045 XSET_EVENT_NEXT (event, Qnil); |
1045 return (Qnil); | 1046 return Qnil; |
1046 } | 1047 } |
1047 | 1048 |
1048 CHECK_LIVE_EVENT (next_event); | 1049 CHECK_LIVE_EVENT (next_event); |
1049 | 1050 |
1050 EVENT_CHAIN_LOOP (ev, XEVENT_NEXT (event)) | 1051 EVENT_CHAIN_LOOP (ev, XEVENT_NEXT (event)) |
1051 { | 1052 { |
1052 QUIT; | 1053 QUIT; |
1053 if (EQ (ev, event)) | 1054 if (EQ (ev, event)) |
1054 signal_error (Qerror, | 1055 signal_error (Qerror, |
1055 list3 (build_string ("Cyclic event-next"), | 1056 list3 (build_string ("Cyclic event-next"), |
1056 event, | 1057 event, |
1057 next_event)); | 1058 next_event)); |
1058 } | 1059 } |
1059 XSET_EVENT_NEXT (event, next_event); | 1060 XSET_EVENT_NEXT (event, next_event); |
1060 return next_event; | 1061 return next_event; |
1061 } | 1062 } |
1326 The buffer position it's over in BUFP, if not a null pointer. | 1327 The buffer position it's over in BUFP, if not a null pointer. |
1327 The closest buffer position in CLOSEST, if not a null pointer. | 1328 The closest buffer position in CLOSEST, if not a null pointer. |
1328 | 1329 |
1329 OBJ_X, OBJ_Y, OBJ1, and OBJ2 are as in pixel_to_glyph_translation(). | 1330 OBJ_X, OBJ_Y, OBJ1, and OBJ2 are as in pixel_to_glyph_translation(). |
1330 */ | 1331 */ |
1331 | 1332 |
1332 static int | 1333 static int |
1333 event_pixel_translation (Lisp_Object event, int *char_x, int *char_y, | 1334 event_pixel_translation (Lisp_Object event, int *char_x, int *char_y, |
1334 int *obj_x, int *obj_y, | 1335 int *obj_x, int *obj_y, |
1335 struct window **w, Bufpos *bufp, Bufpos *closest, | 1336 struct window **w, Bufpos *bufp, Bufpos *closest, |
1336 Charcount *modeline_closest, | 1337 Charcount *modeline_closest, |
1337 Lisp_Object *obj1, Lisp_Object *obj2) | 1338 Lisp_Object *obj1, Lisp_Object *obj2) |
1338 { | 1339 { |
1339 int pix_x = 0; | 1340 int pix_x = 0; |
1340 int pix_y = 0; | 1341 int pix_y = 0; |
1341 int result; | 1342 int result; |
1342 Lisp_Object frame; | 1343 Lisp_Object frame = Qnil; |
1343 | 1344 |
1344 int ret_x, ret_y, ret_obj_x, ret_obj_y; | 1345 int ret_x, ret_y, ret_obj_x, ret_obj_y; |
1345 struct window *ret_w; | 1346 struct window *ret_w; |
1346 Bufpos ret_bufp, ret_closest; | 1347 Bufpos ret_bufp, ret_closest; |
1347 Charcount ret_modeline_closest; | 1348 Charcount ret_modeline_closest; |
1348 Lisp_Object ret_obj1, ret_obj2; | 1349 Lisp_Object ret_obj1, ret_obj2; |
1349 | 1350 |
1350 CHECK_LIVE_EVENT (event); | 1351 CHECK_LIVE_EVENT (event); |
1351 if (XEVENT (event)->event_type == pointer_motion_event) | 1352 frame = XEVENT (event)->channel; |
1352 { | 1353 switch (XEVENT (event)->event_type) |
1354 { | |
1355 case pointer_motion_event : | |
1353 pix_x = XEVENT (event)->event.motion.x; | 1356 pix_x = XEVENT (event)->event.motion.x; |
1354 pix_y = XEVENT (event)->event.motion.y; | 1357 pix_y = XEVENT (event)->event.motion.y; |
1355 frame = XEVENT (event)->channel; | 1358 break; |
1356 } | 1359 case button_press_event : |
1357 else if (XEVENT (event)->event_type == button_press_event || | 1360 case button_release_event : |
1358 XEVENT (event)->event_type == button_release_event) | |
1359 { | |
1360 pix_x = XEVENT (event)->event.button.x; | 1361 pix_x = XEVENT (event)->event.button.x; |
1361 pix_y = XEVENT (event)->event.button.y; | 1362 pix_y = XEVENT (event)->event.button.y; |
1362 frame = XEVENT (event)->channel; | 1363 break; |
1363 } | 1364 default: |
1364 else | 1365 dead_wrong_type_argument (Qmouse_event_p, event); |
1365 wrong_type_argument (Qmouse_event_p, event); | 1366 } |
1366 | 1367 |
1367 result = pixel_to_glyph_translation (XFRAME (frame), pix_x, pix_y, | 1368 result = pixel_to_glyph_translation (XFRAME (frame), pix_x, pix_y, |
1368 &ret_x, &ret_y, &ret_obj_x, &ret_obj_y, | 1369 &ret_x, &ret_y, &ret_obj_x, &ret_obj_y, |
1369 &ret_w, &ret_bufp, &ret_closest, | 1370 &ret_w, &ret_bufp, &ret_closest, |
1370 &ret_modeline_closest, | 1371 &ret_modeline_closest, |
1386 #ifdef HAVE_TOOLBARS | 1387 #ifdef HAVE_TOOLBARS |
1387 || TOOLBAR_BUTTONP (ret_obj1) | 1388 || TOOLBAR_BUTTONP (ret_obj1) |
1388 #endif | 1389 #endif |
1389 )) | 1390 )) |
1390 abort (); | 1391 abort (); |
1391 if (!NILP (ret_obj2) && !(EXTENTP (ret_obj2) | 1392 if (!NILP (ret_obj2) && !(EXTENTP (ret_obj2) || CONSP (ret_obj2))) |
1392 || CONSP (ret_obj2))) | |
1393 abort (); | 1393 abort (); |
1394 | 1394 |
1395 if (char_x) | 1395 if (char_x) |
1396 *char_x = ret_x; | 1396 *char_x = ret_x; |
1397 if (char_y) | 1397 if (char_y) |
1676 { | 1676 { |
1677 CHECK_LIVE_EVENT (event); | 1677 CHECK_LIVE_EVENT (event); |
1678 switch (XEVENT (event)->event_type) | 1678 switch (XEVENT (event)->event_type) |
1679 { | 1679 { |
1680 case timeout_event: | 1680 case timeout_event: |
1681 return (XEVENT (event)->event.timeout.function); | 1681 return XEVENT (event)->event.timeout.function; |
1682 case misc_user_event: | 1682 case misc_user_event: |
1683 case eval_event: | 1683 case eval_event: |
1684 return (XEVENT (event)->event.eval.function); | 1684 return XEVENT (event)->event.eval.function; |
1685 default: | 1685 default: |
1686 return wrong_type_argument (intern ("timeout-or-eval-event-p"), event); | 1686 return wrong_type_argument (intern ("timeout-or-eval-event-p"), event); |
1687 } | 1687 } |
1688 } | 1688 } |
1689 | 1689 |
1696 again: | 1696 again: |
1697 CHECK_LIVE_EVENT (event); | 1697 CHECK_LIVE_EVENT (event); |
1698 switch (XEVENT (event)->event_type) | 1698 switch (XEVENT (event)->event_type) |
1699 { | 1699 { |
1700 case timeout_event: | 1700 case timeout_event: |
1701 return (XEVENT (event)->event.timeout.object); | 1701 return XEVENT (event)->event.timeout.object; |
1702 case misc_user_event: | 1702 case misc_user_event: |
1703 case eval_event: | 1703 case eval_event: |
1704 return (XEVENT (event)->event.eval.object); | 1704 return XEVENT (event)->event.eval.object; |
1705 default: | 1705 default: |
1706 event = wrong_type_argument (intern ("timeout-or-eval-event-p"), event); | 1706 event = wrong_type_argument (intern ("timeout-or-eval-event-p"), event); |
1707 goto again; | 1707 goto again; |
1708 } | 1708 } |
1709 } | 1709 } |
1727 switch (e->event_type) | 1727 switch (e->event_type) |
1728 { | 1728 { |
1729 case process_event: | 1729 case process_event: |
1730 props = Fcons (Qprocess, Fcons (e->event.process.process, props)); | 1730 props = Fcons (Qprocess, Fcons (e->event.process.process, props)); |
1731 break; | 1731 break; |
1732 | 1732 |
1733 case timeout_event: | 1733 case timeout_event: |
1734 props = Fcons (Qobject, Fcons (Fevent_object (event), props)); | 1734 props = Fcons (Qobject, Fcons (Fevent_object (event), props)); |
1735 props = Fcons (Qfunction, Fcons (Fevent_function (event), props)); | 1735 props = Fcons (Qfunction, Fcons (Fevent_function (event), props)); |
1736 props = Fcons (Qid, Fcons (make_int (e->event.timeout.id_number), | 1736 props = Fcons (Qid, Fcons (make_int (e->event.timeout.id_number), |
1737 props)); | 1737 props)); |