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));