comparison src/events.c @ 282:c42ec1d1cded r21-0b39

Import from CVS: tag r21-0b39
author cvs
date Mon, 13 Aug 2007 10:33:18 +0200
parents 7df0dd720c89
children 558f606b08ae
comparison
equal deleted inserted replaced
281:090b52736db2 282:c42ec1d1cded
64 Lisp_Object Qprocess_event_p; 64 Lisp_Object Qprocess_event_p;
65 65
66 Lisp_Object Qkey_press, Qbutton_press, Qbutton_release, Qmisc_user; 66 Lisp_Object Qkey_press, Qbutton_press, Qbutton_release, Qmisc_user;
67 Lisp_Object Qascii_character; 67 Lisp_Object Qascii_character;
68 68
69 #if defined(HAVE_OFFIX_DND) || defined(HAVE_MS_WINDOWS)
70 Lisp_Object Qdnd_drop_event_p;
71 Lisp_Object Qdnd_drop;
72 #endif
73
74 EXFUN (Fevent_x_pixel, 1); 69 EXFUN (Fevent_x_pixel, 1);
75 EXFUN (Fevent_y_pixel, 1); 70 EXFUN (Fevent_y_pixel, 1);
76 71
77 /* #### Ad-hoc hack. Should be part of define_lrecord_implementation */ 72 /* #### Ad-hoc hack. Should be part of define_lrecord_implementation */
78 void 73 void
136 case button_release_event: 131 case button_release_event:
137 case pointer_motion_event: 132 case pointer_motion_event:
138 case magic_event: 133 case magic_event:
139 case empty_event: 134 case empty_event:
140 case dead_event: 135 case dead_event:
141 #if defined(HAVE_OFFIX_DND) || defined(HAVE_MS_WINDOWS)
142 case dnd_drop_event:
143 #endif
144 break; 136 break;
145 default: 137 default:
146 abort (); 138 abort ();
147 } 139 }
148 ((markobj) (event->channel)); 140 ((markobj) (event->channel));
201 break; 193 break;
202 case empty_event: 194 case empty_event:
203 write_c_string ("#<empty-event", printcharfun); 195 write_c_string ("#<empty-event", printcharfun);
204 break; 196 break;
205 case misc_user_event: 197 case misc_user_event:
198 write_c_string ("#<misc-user-event (", printcharfun);
199 print_internal (XEVENT (obj)->event.misc.function, printcharfun, 1);
200 write_c_string (" ", printcharfun);
201 print_internal (XEVENT (obj)->event.misc.object, printcharfun, 1);
202 write_c_string (")", printcharfun);
203 break;
206 case eval_event: 204 case eval_event:
207 write_c_string ("#<", printcharfun); 205 write_c_string ("#<eval-event (", printcharfun);
208 if (XEVENT (obj)->event_type == misc_user_event)
209 write_c_string ("misc-user", printcharfun);
210 else
211 write_c_string ("eval", printcharfun);
212 write_c_string ("-event (", printcharfun);
213 print_internal (XEVENT (obj)->event.eval.function, printcharfun, 1); 206 print_internal (XEVENT (obj)->event.eval.function, printcharfun, 1);
214 write_c_string (" ", printcharfun); 207 write_c_string (" ", printcharfun);
215 print_internal (XEVENT (obj)->event.eval.object, printcharfun, 1); 208 print_internal (XEVENT (obj)->event.eval.object, printcharfun, 1);
216 write_c_string (")", printcharfun); 209 write_c_string (")", printcharfun);
217 break; 210 break;
218 case dead_event: 211 case dead_event:
219 write_c_string ("#<DEALLOCATED-EVENT", printcharfun); 212 write_c_string ("#<DEALLOCATED-EVENT", printcharfun);
220 break; 213 break;
221 #if defined(HAVE_OFFIX_DND) || defined(HAVE_MS_WINDOWS)
222 case dnd_drop_event:
223 print_event_1 ("#<dnd-drop-event ", obj, printcharfun);
224 break;
225 #endif
226 default: 214 default:
227 write_c_string ("#<UNKNOWN-EVENT-TYPE", printcharfun); 215 write_c_string ("#<UNKNOWN-EVENT-TYPE", printcharfun);
228 break; 216 break;
229 } 217 }
230 write_c_string (">", printcharfun); 218 write_c_string (">", printcharfun);
262 case pointer_motion_event: 250 case pointer_motion_event:
263 return (e1->event.motion.x == e2->event.motion.x && 251 return (e1->event.motion.x == e2->event.motion.x &&
264 e1->event.motion.y == e2->event.motion.y); 252 e1->event.motion.y == e2->event.motion.y);
265 253
266 case misc_user_event: 254 case misc_user_event:
255 return (internal_equal (e1->event.eval.function,
256 e2->event.eval.function, 0) &&
257 internal_equal (e1->event.eval.object,
258 e2->event.eval.object, 0) &&
259 /* is this really needed for equality
260 or is x and y also important? */
261 e1->event.misc.button == e2->event.misc.button &&
262 e1->event.misc.modifiers == e2->event.misc.modifiers);
263
267 case eval_event: 264 case eval_event:
268 return (internal_equal (e1->event.eval.function, 265 return (internal_equal (e1->event.eval.function,
269 e2->event.eval.function, 0) && 266 e2->event.eval.function, 0) &&
270 internal_equal (e1->event.eval.object, 267 internal_equal (e1->event.eval.object,
271 e2->event.eval.object, 0)); 268 e2->event.eval.object, 0));
273 case magic_eval_event: 270 case magic_eval_event:
274 return (e1->event.magic_eval.internal_function == 271 return (e1->event.magic_eval.internal_function ==
275 e2->event.magic_eval.internal_function && 272 e2->event.magic_eval.internal_function &&
276 internal_equal (e1->event.magic_eval.object, 273 internal_equal (e1->event.magic_eval.object,
277 e2->event.magic_eval.object, 0)); 274 e2->event.magic_eval.object, 0));
278
279 #if defined(HAVE_OFFIX_DND) || defined(HAVE_MS_WINDOWS)
280 case dnd_drop_event:
281 return (e1->event.dnd_drop.button == e2->event.dnd_drop.button &&
282 e1->event.dnd_drop.modifiers == e2->event.dnd_drop.modifiers &&
283 EQ (e1->event.dnd_drop.data, e2->event.dnd_drop.data));
284 #endif
285 275
286 case magic_event: 276 case magic_event:
287 { 277 {
288 struct console *con = XCONSOLE (CDFW_CONSOLE (e1->channel)); 278 struct console *con = XCONSOLE (CDFW_CONSOLE (e1->channel));
289 279
342 332
343 case pointer_motion_event: 333 case pointer_motion_event:
344 return HASH3 (hash, e->event.motion.x, e->event.motion.y); 334 return HASH3 (hash, e->event.motion.x, e->event.motion.y);
345 335
346 case misc_user_event: 336 case misc_user_event:
337 return HASH5 (hash, internal_hash (e->event.misc.function, depth + 1),
338 internal_hash (e->event.misc.object, depth + 1),
339 e->event.misc.button, e->event.misc.modifiers);
340
347 case eval_event: 341 case eval_event:
348 return HASH3 (hash, internal_hash (e->event.eval.function, depth + 1), 342 return HASH3 (hash, internal_hash (e->event.eval.function, depth + 1),
349 internal_hash (e->event.eval.object, depth + 1)); 343 internal_hash (e->event.eval.object, depth + 1));
350 344
351 case magic_eval_event: 345 case magic_eval_event:
352 return HASH3 (hash, 346 return HASH3 (hash,
353 (unsigned long) e->event.magic_eval.internal_function, 347 (unsigned long) e->event.magic_eval.internal_function,
354 internal_hash (e->event.magic_eval.object, depth + 1)); 348 internal_hash (e->event.magic_eval.object, depth + 1));
355
356 #if defined(HAVE_OFFIX_DND) || defined(HAVE_MS_WINDOWS)
357 case dnd_drop_event:
358 return HASH4 (hash, e->event.dnd_drop.button, e->event.dnd_drop.modifiers,
359 LISP_HASH(e->event.dnd_drop.data));
360 #endif
361 349
362 case magic_event: 350 case magic_event:
363 { 351 {
364 struct console *con = XCONSOLE (CDFW_CONSOLE (EVENT_CHANNEL (e))); 352 struct console *con = XCONSOLE (CDFW_CONSOLE (EVENT_CHANNEL (e)));
365 #ifdef HAVE_X_WINDOWS 353 #ifdef HAVE_X_WINDOWS
394 382
395 DEFUN ("make-event", Fmake_event, 0, 2, 0, /* 383 DEFUN ("make-event", Fmake_event, 0, 2, 0, /*
396 Return a new event of type TYPE, with properties described by PLIST. 384 Return a new event of type TYPE, with properties described by PLIST.
397 385
398 TYPE is a symbol, either `empty', `key-press', `button-press', 386 TYPE is a symbol, either `empty', `key-press', `button-press',
399 `button-release', `motion' or `dnd-drop'. If TYPE is nil, it 387 `button-release', or `motion'. If TYPE is nil, it
400 defaults to `empty'. 388 defaults to `empty'.
401 389
402 PLIST is a property list, the properties being compatible to those 390 PLIST is a property list, the properties being compatible to those
403 returned by `event-properties'. The following properties are 391 returned by `event-properties'. The following properties are
404 allowed: 392 allowed:
405 393
406 channel -- The event channel, a frame or a console. For 394 channel -- The event channel, a frame or a console. For
407 button-press, button-release, motion and dnd-drop 395 button-press, button-release, motion events,
408 events, this must be a frame. For key-press 396 this must be a frame. For key-press
409 events, it must be a console. If channel is 397 events, it must be a console. If channel is
410 unspecified, it will be set to the selected frame 398 unspecified, it will be set to the selected frame
411 or selected console, as appropriate. 399 or selected console, as appropriate.
412 key -- The event key, a symbol or character. Allowed only for 400 key -- The event key, a symbol or character. Allowed only for
413 keypress events. 401 keypress events.
414 button -- The event button, integer 1, 2 or 3. Allowed for 402 button -- The event button, integer 1, 2 or 3. Allowed for
415 button-press, button-release and dnd-drag events. 403 button-press, button-release and misc-user events.
416 modifiers -- The event modifiers, a list of modifier symbols. Allowed 404 modifiers -- The event modifiers, a list of modifier symbols. Allowed
417 for key-press, button-press, button-release, motion and 405 for key-press, button-press, button-release, motion and
418 dnd-drop events. 406 misc-user events.
419 x -- The event X coordinate, an integer. This is relative 407 x -- The event X coordinate, an integer. This is relative
420 to the left of CHANNEL's root window. Allowed for 408 to the left of CHANNEL's root window. Allowed for
421 motion, button-press, button-release and dnd-drop events. 409 motion, button-press, button-release and misc-user events.
422 y -- The event Y coordinate, an integer. This is relative 410 y -- The event Y coordinate, an integer. This is relative
423 to the top of CHANNEL's root window. Allowed for 411 to the top of CHANNEL's root window. Allowed for
424 motion, button-press, button-release and dnd-drop events. 412 motion, button-press, button-release and misc-user events.
425 dnd-data -- The event DND data, a list of (INTEGER DATA). Allowed
426 for dnd-drop events, if support for DND has been
427 compiled into XEmacs.
428 timestamp -- The event timestamp, a non-negative integer. Allowed for 413 timestamp -- The event timestamp, a non-negative integer. Allowed for
429 all types of events. If unspecified, it will be set to 0 414 all types of events. If unspecified, it will be set to 0
430 by default. 415 by default.
431 416
432 For event type `empty', PLIST must be nil. 417 For event type `empty', PLIST must be nil.
441 */ 426 */
442 (type, plist)) 427 (type, plist))
443 { 428 {
444 Lisp_Object tail, keyword, value; 429 Lisp_Object tail, keyword, value;
445 Lisp_Object event = Qnil; 430 Lisp_Object event = Qnil;
446 Lisp_Object dnd_data = Qnil;
447 struct Lisp_Event *e; 431 struct Lisp_Event *e;
448 EMACS_INT coord_x = 0, coord_y = 0; 432 EMACS_INT coord_x = 0, coord_y = 0;
449 struct gcpro gcpro1, gcpro2; 433 struct gcpro gcpro1;
450 434
451 GCPRO2 (event, dnd_data); 435 GCPRO1 (event);
452 436
453 if (NILP (type)) 437 if (NILP (type))
454 type = Qempty; 438 type = Qempty;
455 439
456 if (!NILP (Vevent_resource)) 440 if (!NILP (Vevent_resource))
491 else if (EQ (type, Qmisc_user)) 475 else if (EQ (type, Qmisc_user))
492 { 476 {
493 e->event_type = misc_user_event; 477 e->event_type = misc_user_event;
494 e->event.eval.function = e->event.eval.object = Qnil; 478 e->event.eval.function = e->event.eval.object = Qnil;
495 } 479 }
496 #if defined(HAVE_OFFIX_DND) || defined(HAVE_MS_WINDOWS)
497 else if (EQ (type, Qdnd_drop))
498 {
499 e->event_type = dnd_drop_event;
500 e->event.dnd_drop.data = Qnil;
501 }
502 #endif
503 else 480 else
504 { 481 {
505 /* Not allowed: Qprocess, Qtimeout, Qmagic, Qeval, Qmagic_eval. */ 482 /* Not allowed: Qprocess, Qtimeout, Qmagic, Qeval, Qmagic_eval. */
506 signal_simple_error ("Invalid event type", type); 483 signal_simple_error ("Invalid event type", type);
507 } 484 }
540 e->event.key.keysym = value; 517 e->event.key.keysym = value;
541 } 518 }
542 else if (EQ (keyword, Qbutton)) 519 else if (EQ (keyword, Qbutton))
543 { 520 {
544 if (e->event_type != button_press_event 521 if (e->event_type != button_press_event
545 && e->event_type != button_release_event) 522 && e->event_type != button_release_event
523 && e->event_type != misc_user_event)
546 { 524 {
547 WRONG_EVENT_TYPE_FOR_PROPERTY (type, keyword); 525 WRONG_EVENT_TYPE_FOR_PROPERTY (type, keyword);
548 } 526 }
549 CHECK_NATNUM (value); 527 CHECK_NATNUM (value);
550 check_int_range (XINT (value), 0, 7); 528 check_int_range (XINT (value), 0, 7);
551 e->event.button.button = XINT (value); 529 if (e->event_type == misc_user_event)
530 e->event.misc.button = XINT (value);
531 else
532 e->event.button.button = XINT (value);
552 } 533 }
553 else if (EQ (keyword, Qmodifiers)) 534 else if (EQ (keyword, Qmodifiers))
554 { 535 {
555 Lisp_Object modtail; 536 Lisp_Object modtail;
556 int modifiers = 0; 537 int modifiers = 0;
557 538
558 if (e->event_type != key_press_event 539 if (e->event_type != key_press_event
559 && e->event_type != button_press_event 540 && e->event_type != button_press_event
560 && e->event_type != button_release_event 541 && e->event_type != button_release_event
561 && e->event_type != pointer_motion_event) 542 && e->event_type != pointer_motion_event
543 && e->event_type != misc_user_event)
562 { 544 {
563 WRONG_EVENT_TYPE_FOR_PROPERTY (type, keyword); 545 WRONG_EVENT_TYPE_FOR_PROPERTY (type, keyword);
564 } 546 }
565 547
566 EXTERNAL_LIST_LOOP (modtail, value) 548 EXTERNAL_LIST_LOOP (modtail, value)
579 if (e->event_type == key_press_event) 561 if (e->event_type == key_press_event)
580 e->event.key.modifiers = modifiers; 562 e->event.key.modifiers = modifiers;
581 else if (e->event_type == button_press_event 563 else if (e->event_type == button_press_event
582 || e->event_type == button_release_event) 564 || e->event_type == button_release_event)
583 e->event.button.modifiers = modifiers; 565 e->event.button.modifiers = modifiers;
584 else /* pointer_motion_event */ 566 else if (e->event_type == pointer_motion_event)
585 e->event.motion.modifiers = modifiers; 567 e->event.motion.modifiers = modifiers;
568 else /* misc_user_event */
569 e->event.misc.modifiers = modifiers;
586 } 570 }
587 else if (EQ (keyword, Qx)) 571 else if (EQ (keyword, Qx))
588 { 572 {
589 if (e->event_type != pointer_motion_event 573 if (e->event_type != pointer_motion_event
590 && e->event_type != button_press_event 574 && e->event_type != button_press_event
591 && e->event_type != button_release_event) 575 && e->event_type != button_release_event
576 && e->event_type != misc_user_event)
592 { 577 {
593 WRONG_EVENT_TYPE_FOR_PROPERTY (type, keyword); 578 WRONG_EVENT_TYPE_FOR_PROPERTY (type, keyword);
594 } 579 }
595 /* Allow negative values, so we can specify toolbar 580 /* Allow negative values, so we can specify toolbar
596 positions. */ 581 positions. */
599 } 584 }
600 else if (EQ (keyword, Qy)) 585 else if (EQ (keyword, Qy))
601 { 586 {
602 if (e->event_type != pointer_motion_event 587 if (e->event_type != pointer_motion_event
603 && e->event_type != button_press_event 588 && e->event_type != button_press_event
604 && e->event_type != button_release_event) 589 && e->event_type != button_release_event
590 && e->event_type != misc_user_event)
605 { 591 {
606 WRONG_EVENT_TYPE_FOR_PROPERTY (type, keyword); 592 WRONG_EVENT_TYPE_FOR_PROPERTY (type, keyword);
607 } 593 }
608 /* Allow negative values; see above. */ 594 /* Allow negative values; see above. */
609 CHECK_INT (value); 595 CHECK_INT (value);
624 { 610 {
625 if (e->event_type != misc_user_event) 611 if (e->event_type != misc_user_event)
626 WRONG_EVENT_TYPE_FOR_PROPERTY (type, keyword); 612 WRONG_EVENT_TYPE_FOR_PROPERTY (type, keyword);
627 e->event.eval.object = value; 613 e->event.eval.object = value;
628 } 614 }
629 #if defined(HAVE_OFFIX_DND) || defined(HAVE_MS_WINDOWS)
630 else if (EQ (keyword, Qdnd_data))
631 {
632 if (e->event_type != dnd_drop_event)
633 WRONG_EVENT_TYPE_FOR_PROPERTY (type, keyword);
634
635 /* Value is either nil, or a list of (TYPE DATA). TYPE is
636 an integer. DATA is a list. */
637 if (!NILP (value))
638 {
639 Lisp_Object dnd_tail;
640 CHECK_CONS (value);
641 /* To be changed to CHECK_SYMBOL. */
642 CHECK_NATNUM (XCAR (value));
643 CHECK_CONS (XCDR (value));
644 if (XINT (Flength (value)) != 2)
645 signal_simple_error ("Data should be a two-element list", value);
646 /* Check validity of DATA. */
647 EXTERNAL_LIST_LOOP (dnd_tail, XCAR (XCDR (value)))
648 {
649 /* Every element must be a string. */
650 CHECK_STRING (XCAR (dnd_tail));
651 }
652 /* And now, copy it all to avoid corruption later. */
653 e->event.dnd_drop.data = Fcopy_tree (value, Qnil);
654 }
655 }
656 #endif /* HAVE_OFFIX_DND || HAVE_MS_WINDOWS */
657 else 615 else
658 signal_simple_error_2 ("Invalid property", keyword, value); 616 signal_simple_error_2 ("Invalid property", keyword, value);
659 } 617 }
660 618
661 /* Insert the channel, if missing. */ 619 /* Insert the channel, if missing. */
670 /* Fevent_properties, Fevent_x_pixel, etc. work with pixels relative 628 /* Fevent_properties, Fevent_x_pixel, etc. work with pixels relative
671 to the frame, so we must adjust accordingly. */ 629 to the frame, so we must adjust accordingly. */
672 if (e->event_type == pointer_motion_event 630 if (e->event_type == pointer_motion_event
673 || e->event_type == button_press_event 631 || e->event_type == button_press_event
674 || e->event_type == button_release_event 632 || e->event_type == button_release_event
675 #if defined(HAVE_OFFIX_DND) || defined(HAVE_MS_WINDOWS) 633 || e->event_type == misc_user_event)
676 || e->event_type == dnd_drop_event
677 #endif
678 )
679 { 634 {
680 struct frame *f = XFRAME (EVENT_CHANNEL (e)); 635 struct frame *f = XFRAME (EVENT_CHANNEL (e));
681 636
682 coord_x += FRAME_REAL_LEFT_TOOLBAR_WIDTH (f); 637 coord_x += FRAME_REAL_LEFT_TOOLBAR_WIDTH (f);
683 coord_y += FRAME_REAL_TOP_TOOLBAR_HEIGHT (f); 638 coord_y += FRAME_REAL_TOP_TOOLBAR_HEIGHT (f);
686 { 641 {
687 e->event.motion.x = coord_x; 642 e->event.motion.x = coord_x;
688 e->event.motion.y = coord_y; 643 e->event.motion.y = coord_y;
689 } 644 }
690 else if (e->event_type == button_press_event 645 else if (e->event_type == button_press_event
691 || e->event_type == button_release_event 646 || e->event_type == button_release_event)
692 #if defined(HAVE_OFFIX_DND) || defined(HAVE_MS_WINDOWS)
693 || e->event_type == dnd_drop_event
694 #endif
695 )
696 { 647 {
697 e->event.button.x = coord_x; 648 e->event.button.x = coord_x;
698 e->event.button.y = coord_y; 649 e->event.button.y = coord_y;
699 } 650 }
651 else if (e->event_type == misc_user_event)
652 {
653 e->event.misc.x = coord_x;
654 e->event.misc.y = coord_y;
655 }
700 } 656 }
701 657
702 /* Finally, do some more validation. */ 658 /* Finally, do some more validation. */
703 switch (e->event_type) 659 switch (e->event_type)
704 { 660 {
707 || !(SYMBOLP (e->event.key.keysym) || CHARP (e->event.key.keysym))) 663 || !(SYMBOLP (e->event.key.keysym) || CHARP (e->event.key.keysym)))
708 error ("Undefined key for keypress event"); 664 error ("Undefined key for keypress event");
709 break; 665 break;
710 case button_press_event: 666 case button_press_event:
711 case button_release_event: 667 case button_release_event:
712 #if defined(HAVE_OFFIX_DND) || defined(HAVE_MS_WINDOWS)
713 case dnd_drop_event:
714 #endif
715 if (!e->event.button.button) 668 if (!e->event.button.button)
716 error ("Undefined button for %s event", 669 error ("Undefined button for %s event",
717 e->event_type == button_press_event 670 e->event_type == button_press_event
718 ? "buton-press" : 671 ? "buton-press" : "button-release");
719 #if defined(HAVE_OFFIX_DND) || defined(HAVE_MS_WINDOWS) 672 break;
720 e->event_type == button_release_event 673 case misc_user_event:
721 ? "button-release" : "dnd-drop" 674 if (!e->event.misc.button)
722 #else 675 error ("Undefined button for misc-user event");
723 "button-release"
724 #endif
725 );
726 break; 676 break;
727 default: 677 default:
728 break; 678 break;
729 } 679 }
730 680
975 { 925 {
976 case key_press_event: 926 case key_press_event:
977 case button_press_event: 927 case button_press_event:
978 case button_release_event: 928 case button_release_event:
979 case misc_user_event: 929 case misc_user_event:
980 #if defined(HAVE_OFFIX_DND) || defined(HAVE_MS_WINDOWS)
981 case dnd_drop_event:
982 #endif
983 return 1; 930 return 1;
984 default: 931 default:
985 return 0; 932 return 0;
986 } 933 }
987 } 934 }
1247 format_event_object (char *buf, struct Lisp_Event *event, int brief) 1194 format_event_object (char *buf, struct Lisp_Event *event, int brief)
1248 { 1195 {
1249 int mouse_p = 0; 1196 int mouse_p = 0;
1250 int mod = 0; 1197 int mod = 0;
1251 Lisp_Object key; 1198 Lisp_Object key;
1252 #if defined(HAVE_OFFIX_DND) || defined(HAVE_MS_WINDOWS)
1253 int dnd_p = 0;
1254 #endif
1255 1199
1256 switch (event->event_type) 1200 switch (event->event_type)
1257 { 1201 {
1258 case key_press_event: 1202 case key_press_event:
1259 { 1203 {
1294 #endif /* HAVE_X_WINDOWS */ 1238 #endif /* HAVE_X_WINDOWS */
1295 if (name) strcpy (buf, name); 1239 if (name) strcpy (buf, name);
1296 else strcpy (buf, "???"); 1240 else strcpy (buf, "???");
1297 return; 1241 return;
1298 } 1242 }
1299 #if defined(HAVE_OFFIX_DND) || defined(HAVE_MS_WINDOWS)
1300 case dnd_drop_event:
1301 {
1302 dnd_p++;
1303 mod = event->event.dnd_drop.modifiers;
1304 key = make_char (event->event.dnd_drop.button + '0');
1305 break;
1306 }
1307 #endif
1308 case magic_eval_event: strcpy (buf, "magic-eval"); return; 1243 case magic_eval_event: strcpy (buf, "magic-eval"); return;
1309 case pointer_motion_event: strcpy (buf, "motion"); return; 1244 case pointer_motion_event: strcpy (buf, "motion"); return;
1310 case misc_user_event: strcpy (buf, "misc-user"); return; 1245 case misc_user_event: strcpy (buf, "misc-user"); return;
1311 case eval_event: strcpy (buf, "eval"); return; 1246 case eval_event: strcpy (buf, "eval"); return;
1312 case process_event: strcpy (buf, "process"); return; 1247 case process_event: strcpy (buf, "process"); return;
1327 if (mouse_p) 1262 if (mouse_p)
1328 { 1263 {
1329 modprint1 ("button"); 1264 modprint1 ("button");
1330 --mouse_p; 1265 --mouse_p;
1331 } 1266 }
1332
1333 #if defined(HAVE_OFFIX_DND) || defined(HAVE_MS_WINDOWS)
1334 switch (dnd_p)
1335 {
1336 case 1:
1337 modprint1 ("drop");
1338 }
1339 #endif
1340 1267
1341 #undef modprint 1268 #undef modprint
1342 #undef modprint1 1269 #undef modprint1
1343 1270
1344 if (CHARP (key)) 1271 if (CHARP (key))
1471 case misc_user_event: return Qmisc_user; 1398 case misc_user_event: return Qmisc_user;
1472 case pointer_motion_event: return Qmotion; 1399 case pointer_motion_event: return Qmotion;
1473 case process_event: return Qprocess; 1400 case process_event: return Qprocess;
1474 case timeout_event: return Qtimeout; 1401 case timeout_event: return Qtimeout;
1475 case eval_event: return Qeval; 1402 case eval_event: return Qeval;
1476 #if defined(HAVE_OFFIX_DND) || defined(HAVE_MS_WINDOWS)
1477 case dnd_drop_event: return Qdnd_drop;
1478 #endif
1479 case magic_event: 1403 case magic_event:
1480 case magic_eval_event: 1404 case magic_eval_event:
1481 return Qmagic; 1405 return Qmagic;
1482 1406
1483 case empty_event: 1407 case empty_event:
1513 if (XEVENT(e)->event_type != (t1) && \ 1437 if (XEVENT(e)->event_type != (t1) && \
1514 XEVENT(e)->event_type != (t2)) \ 1438 XEVENT(e)->event_type != (t2)) \
1515 e = wrong_type_argument ((sym),(e)); \ 1439 e = wrong_type_argument ((sym),(e)); \
1516 } while (0) 1440 } while (0)
1517 1441
1442 #define CHECK_EVENT_TYPE3(e,t1,t2,t3,sym) do { \
1443 CHECK_LIVE_EVENT (e); \
1444 if (XEVENT(e)->event_type != (t1) && \
1445 XEVENT(e)->event_type != (t2) && \
1446 XEVENT(e)->event_type != (t3)) \
1447 e = wrong_type_argument ((sym),(e)); \
1448 } while (0)
1449
1518 DEFUN ("event-key", Fevent_key, 1, 1, 0, /* 1450 DEFUN ("event-key", Fevent_key, 1, 1, 0, /*
1519 Return the Keysym of the key-press event EVENT. 1451 Return the Keysym of the key-press event EVENT.
1520 This will be a character if the event is associated with one, else a symbol. 1452 This will be a character if the event is associated with one, else a symbol.
1521 */ 1453 */
1522 (event)) 1454 (event))
1528 DEFUN ("event-button", Fevent_button, 1, 1, 0, /* 1460 DEFUN ("event-button", Fevent_button, 1, 1, 0, /*
1529 Return the button-number of the given button-press or button-release event. 1461 Return the button-number of the given button-press or button-release event.
1530 */ 1462 */
1531 (event)) 1463 (event))
1532 { 1464 {
1533 #if !defined(HAVE_OFFIX_DND) && !defined(HAVE_MS_WINDOWS) 1465
1534 1466 CHECK_EVENT_TYPE3 (event, button_press_event, button_release_event,
1535 CHECK_EVENT_TYPE2 (event, button_press_event, button_release_event, 1467 misc_user_event, Qbutton_event_p);
1536 Qbutton_event_p);
1537 #ifdef HAVE_WINDOW_SYSTEM 1468 #ifdef HAVE_WINDOW_SYSTEM
1538 return make_int (XEVENT (event)->event.button.button); 1469 if ( XEVENT (event)->event_type == misc_user_event)
1470 return make_int (XEVENT (event)->event.misc.button);
1471 else
1472 return make_int (XEVENT (event)->event.button.button);
1539 #else /* !HAVE_WINDOW_SYSTEM */ 1473 #else /* !HAVE_WINDOW_SYSTEM */
1540 return Qzero; 1474 return Qzero;
1541 #endif /* !HAVE_WINDOW_SYSTEM */ 1475 #endif /* !HAVE_WINDOW_SYSTEM */
1542 1476
1543 #else /* HAVE_OFFIX_DND || HAVE_MS_WINDOWS */
1544
1545 CHECK_LIVE_EVENT (event);
1546 if (XEVENT(event)->event_type == (button_press_event) ||
1547 XEVENT(event)->event_type == (button_release_event))
1548 /* we always have X if we have OffiX !! */
1549 return make_int (XEVENT (event)->event.button.button);
1550 else if (XEVENT(event)->event_type == (dnd_drop_event))
1551 /* we always have X if we have OffiX !! */
1552 return make_int (XEVENT (event)->event.button.button);
1553 else
1554 return wrong_type_argument ((Qbutton_event_p),(event));
1555
1556 #endif
1557 } 1477 }
1558 1478
1559 DEFUN ("event-modifier-bits", Fevent_modifier_bits, 1, 1, 0, /* 1479 DEFUN ("event-modifier-bits", Fevent_modifier_bits, 1, 1, 0, /*
1560 Return a number representing the modifier keys which were down 1480 Return a number representing the modifier keys which were down
1561 when the given mouse or keyboard event was produced. 1481 when the given mouse or keyboard event was produced.
1572 case button_press_event: 1492 case button_press_event:
1573 case button_release_event: 1493 case button_release_event:
1574 return make_int (XEVENT (event)->event.button.modifiers); 1494 return make_int (XEVENT (event)->event.button.modifiers);
1575 case pointer_motion_event: 1495 case pointer_motion_event:
1576 return make_int (XEVENT (event)->event.motion.modifiers); 1496 return make_int (XEVENT (event)->event.motion.modifiers);
1577 #if defined(HAVE_OFFIX_DND) || defined(HAVE_MS_WINDOWS) 1497 case misc_user_event:
1578 case dnd_drop_event: 1498 return make_int (XEVENT (event)->event.misc.modifiers);
1579 return make_int (XEVENT (event)->event.dnd_drop.modifiers);
1580 #endif
1581 default: 1499 default:
1582 event = wrong_type_argument (intern ("key-or-mouse-event-p"), event); 1500 event = wrong_type_argument (intern ("key-or-mouse-event-p"), event);
1583 goto again; 1501 goto again;
1584 } 1502 }
1585 } 1503 }
1617 XEVENT (event)->event_type == button_release_event) 1535 XEVENT (event)->event_type == button_release_event)
1618 { 1536 {
1619 *x = XEVENT (event)->event.button.x; 1537 *x = XEVENT (event)->event.button.x;
1620 *y = XEVENT (event)->event.button.y; 1538 *y = XEVENT (event)->event.button.y;
1621 } 1539 }
1622 #if defined(HAVE_OFFIX_DND) || defined(HAVE_MS_WINDOWS) 1540 else if (XEVENT (event)->event_type == misc_user_event)
1623 else if (XEVENT (event)->event_type == dnd_drop_event) 1541 {
1624 { 1542 *x = XEVENT (event)->event.misc.x;
1625 *x = XEVENT (event)->event.dnd_drop.x; 1543 *y = XEVENT (event)->event.misc.y;
1626 *y = XEVENT (event)->event.dnd_drop.y; 1544 }
1627 }
1628 #endif
1629 else 1545 else
1630 return 0; 1546 return 0;
1631 1547
1632 f = XFRAME (EVENT_CHANNEL (XEVENT (event))); 1548 f = XFRAME (EVENT_CHANNEL (XEVENT (event)));
1633 1549
1774 case button_press_event : 1690 case button_press_event :
1775 case button_release_event : 1691 case button_release_event :
1776 pix_x = XEVENT (event)->event.button.x; 1692 pix_x = XEVENT (event)->event.button.x;
1777 pix_y = XEVENT (event)->event.button.y; 1693 pix_y = XEVENT (event)->event.button.y;
1778 break; 1694 break;
1779 #if defined(HAVE_OFFIX_DND) || defined(HAVE_MS_WINDOWS) 1695 case misc_user_event :
1780 case dnd_drop_event : 1696 pix_x = XEVENT (event)->event.misc.x;
1781 pix_x = XEVENT (event)->event.dnd_drop.x; 1697 pix_y = XEVENT (event)->event.misc.y;
1782 pix_y = XEVENT (event)->event.dnd_drop.y; 1698 break;
1783 break;
1784 #endif
1785 default: 1699 default:
1786 dead_wrong_type_argument (Qmouse_event_p, event); 1700 dead_wrong_type_argument (Qmouse_event_p, event);
1787 } 1701 }
1788 1702
1789 result = pixel_to_glyph_translation (XFRAME (frame), pix_x, pix_y, 1703 result = pixel_to_glyph_translation (XFRAME (frame), pix_x, pix_y,
2101 switch (XEVENT (event)->event_type) 2015 switch (XEVENT (event)->event_type)
2102 { 2016 {
2103 case timeout_event: 2017 case timeout_event:
2104 return XEVENT (event)->event.timeout.function; 2018 return XEVENT (event)->event.timeout.function;
2105 case misc_user_event: 2019 case misc_user_event:
2020 return XEVENT (event)->event.misc.function;
2106 case eval_event: 2021 case eval_event:
2107 return XEVENT (event)->event.eval.function; 2022 return XEVENT (event)->event.eval.function;
2108 default: 2023 default:
2109 event = wrong_type_argument (intern ("timeout-or-eval-event-p"), event); 2024 event = wrong_type_argument (intern ("timeout-or-eval-event-p"), event);
2110 goto again; 2025 goto again;
2122 switch (XEVENT (event)->event_type) 2037 switch (XEVENT (event)->event_type)
2123 { 2038 {
2124 case timeout_event: 2039 case timeout_event:
2125 return XEVENT (event)->event.timeout.object; 2040 return XEVENT (event)->event.timeout.object;
2126 case misc_user_event: 2041 case misc_user_event:
2042 return XEVENT (event)->event.misc.object;
2127 case eval_event: 2043 case eval_event:
2128 return XEVENT (event)->event.eval.object; 2044 return XEVENT (event)->event.eval.object;
2129 default: 2045 default:
2130 event = wrong_type_argument (intern ("timeout-or-eval-event-p"), event); 2046 event = wrong_type_argument (intern ("timeout-or-eval-event-p"), event);
2131 goto again; 2047 goto again;
2132 } 2048 }
2133 }
2134
2135 DEFUN ("event-drag-and-drop-data", Fevent_drag_and_drop_data, 1, 1, 0, /*
2136 Return the Dnd data list of EVENT.
2137 EVENT should be a dnd_drop event.
2138 */
2139 (event))
2140 {
2141 #if defined(HAVE_OFFIX_DND) || defined(HAVE_MS_WINDOWS)
2142 again:
2143 CHECK_LIVE_EVENT (event);
2144 switch (XEVENT (event)->event_type)
2145 {
2146 case dnd_drop_event:
2147 return XEVENT (event)->event.dnd_drop.data;
2148 default:
2149 event = wrong_type_argument (Qdnd_drop_event_p, event);
2150 goto again;
2151 }
2152 #else /* !(HAVE_OFFIX_DND || HAVE_MS_WINDOWS) */
2153 return Qnil;
2154 #endif /* HAVE_OFFIX_DND || HAVE_MS_WINDOWS */
2155 } 2049 }
2156 2050
2157 DEFUN ("event-properties", Fevent_properties, 1, 1, 0, /* 2051 DEFUN ("event-properties", Fevent_properties, 1, 1, 0, /*
2158 Return a list of all of the properties of EVENT. 2052 Return a list of all of the properties of EVENT.
2159 This is in the form of a property list (alternating keyword/value pairs). 2053 This is in the form of a property list (alternating keyword/value pairs).
2200 props = cons3 (Qy, Fevent_y_pixel (event), props); 2094 props = cons3 (Qy, Fevent_y_pixel (event), props);
2201 props = cons3 (Qx, Fevent_x_pixel (event), props); 2095 props = cons3 (Qx, Fevent_x_pixel (event), props);
2202 break; 2096 break;
2203 2097
2204 case misc_user_event: 2098 case misc_user_event:
2099 props = cons3 (Qobject, Fevent_object (event), props);
2100 props = cons3 (Qfunction, Fevent_function (event), props);
2101 props = cons3 (Qy, Fevent_y_pixel (event), props);
2102 props = cons3 (Qx, Fevent_x_pixel (event), props);
2103 props = cons3 (Qmodifiers, Fevent_modifiers (event), props);
2104 props = cons3 (Qbutton, Fevent_button (event), props);
2105 break;
2106
2205 case eval_event: 2107 case eval_event:
2206 props = cons3 (Qobject, Fevent_object (event), props); 2108 props = cons3 (Qobject, Fevent_object (event), props);
2207 props = cons3 (Qfunction, Fevent_function (event), props); 2109 props = cons3 (Qfunction, Fevent_function (event), props);
2208 break; 2110 break;
2209
2210 #if defined(HAVE_OFFIX_DND) || defined(HAVE_MS_WINDOWS)
2211 case dnd_drop_event:
2212 props = cons3 (Qy, Fevent_y_pixel (event), props);
2213 props = cons3 (Qx, Fevent_x_pixel (event), props);
2214 props = cons3 (Qmodifiers, Fevent_modifiers (event), props);
2215 props = cons3 (Qbutton, Fevent_button (event), props);
2216 props = cons3 (Qdnd_data, Fevent_drag_and_drop_data (event), props);
2217 break;
2218 #endif
2219 2111
2220 case magic_eval_event: 2112 case magic_eval_event:
2221 case magic_event: 2113 case magic_event:
2222 break; 2114 break;
2223 2115
2281 DEFSUBR (Fevent_glyph_y_pixel); 2173 DEFSUBR (Fevent_glyph_y_pixel);
2282 DEFSUBR (Fevent_toolbar_button); 2174 DEFSUBR (Fevent_toolbar_button);
2283 DEFSUBR (Fevent_process); 2175 DEFSUBR (Fevent_process);
2284 DEFSUBR (Fevent_function); 2176 DEFSUBR (Fevent_function);
2285 DEFSUBR (Fevent_object); 2177 DEFSUBR (Fevent_object);
2286 DEFSUBR (Fevent_drag_and_drop_data);
2287 2178
2288 defsymbol (&Qeventp, "eventp"); 2179 defsymbol (&Qeventp, "eventp");
2289 defsymbol (&Qevent_live_p, "event-live-p"); 2180 defsymbol (&Qevent_live_p, "event-live-p");
2290 defsymbol (&Qkey_press_event_p, "key-press-event-p"); 2181 defsymbol (&Qkey_press_event_p, "key-press-event-p");
2291 defsymbol (&Qbutton_event_p, "button-event-p"); 2182 defsymbol (&Qbutton_event_p, "button-event-p");
2294 defsymbol (&Qkey_press, "key-press"); 2185 defsymbol (&Qkey_press, "key-press");
2295 defsymbol (&Qbutton_press, "button-press"); 2186 defsymbol (&Qbutton_press, "button-press");
2296 defsymbol (&Qbutton_release, "button-release"); 2187 defsymbol (&Qbutton_release, "button-release");
2297 defsymbol (&Qmisc_user, "misc-user"); 2188 defsymbol (&Qmisc_user, "misc-user");
2298 defsymbol (&Qascii_character, "ascii-character"); 2189 defsymbol (&Qascii_character, "ascii-character");
2299 #if defined(HAVE_OFFIX_DND) || defined(HAVE_MS_WINDOWS)
2300 defsymbol (&Qdnd_drop_event_p, "dnd-drop-event-p");
2301 defsymbol (&Qdnd_drop, "dnd-drop");
2302 #endif
2303 } 2190 }
2304 2191
2305 void 2192 void
2306 vars_of_events (void) 2193 vars_of_events (void)
2307 { 2194 {