diff options
| author | Jason Rumney | 2003-06-01 21:40:38 +0000 |
|---|---|---|
| committer | Jason Rumney | 2003-06-01 21:40:38 +0000 |
| commit | 8006e4bbcb8a7014cd7f3c5d5840b811a6472ceb (patch) | |
| tree | d0fb5bf38863d6f09682d308e9ead7925634d755 /src/keyboard.c | |
| parent | 3ecad19e403a7bdbb15f1af31913378192018faf (diff) | |
| download | emacs-8006e4bbcb8a7014cd7f3c5d5840b811a6472ceb.tar.gz emacs-8006e4bbcb8a7014cd7f3c5d5840b811a6472ceb.zip | |
(Qmouse_wheel): Declare only if MAC_OSX defined.
(mouse_wheel_syms, lispy_mouse_wheel_names): Likewise.
(discard_mouse_events): Discard WHEEL_EVENT events too.
(lispy_wheel_names, wheel_syms): New.
(syms_of_keyboard): Init and staticpro `wheel_syms'. Init and
staticpro `Qmouse_wheel' and `mouse_wheel_syms' only if MAC_OSX
defined.
(make_lispy_event): Added WHEEL_EVENT handler.
Diffstat (limited to 'src/keyboard.c')
| -rw-r--r-- | src/keyboard.c | 207 |
1 files changed, 201 insertions, 6 deletions
diff --git a/src/keyboard.c b/src/keyboard.c index 9260a175746..14390fc9be9 100644 --- a/src/keyboard.c +++ b/src/keyboard.c | |||
| @@ -547,7 +547,7 @@ Lisp_Object Qhelp_echo; | |||
| 547 | /* Symbols to denote kinds of events. */ | 547 | /* Symbols to denote kinds of events. */ |
| 548 | Lisp_Object Qfunction_key; | 548 | Lisp_Object Qfunction_key; |
| 549 | Lisp_Object Qmouse_click; | 549 | Lisp_Object Qmouse_click; |
| 550 | #if defined(WINDOWSNT) || defined(MAC_OSX) | 550 | #if defined(MAC_OSX) |
| 551 | Lisp_Object Qmouse_wheel; | 551 | Lisp_Object Qmouse_wheel; |
| 552 | #endif | 552 | #endif |
| 553 | #ifdef WINDOWSNT | 553 | #ifdef WINDOWSNT |
| @@ -3737,6 +3737,7 @@ discard_mouse_events () | |||
| 3737 | sp = kbd_buffer; | 3737 | sp = kbd_buffer; |
| 3738 | 3738 | ||
| 3739 | if (sp->kind == MOUSE_CLICK_EVENT | 3739 | if (sp->kind == MOUSE_CLICK_EVENT |
| 3740 | || sp->kind == WHEEL_EVENT | ||
| 3740 | #ifdef WINDOWSNT | 3741 | #ifdef WINDOWSNT |
| 3741 | || sp->kind == W32_SCROLL_BAR_CLICK_EVENT | 3742 | || sp->kind == W32_SCROLL_BAR_CLICK_EVENT |
| 3742 | #endif | 3743 | #endif |
| @@ -4436,7 +4437,8 @@ timer_check (do_it_now) | |||
| 4436 | static Lisp_Object accent_key_syms; | 4437 | static Lisp_Object accent_key_syms; |
| 4437 | static Lisp_Object func_key_syms; | 4438 | static Lisp_Object func_key_syms; |
| 4438 | static Lisp_Object mouse_syms; | 4439 | static Lisp_Object mouse_syms; |
| 4439 | #if defined(WINDOWSNT) || defined(MAC_OSX) | 4440 | static Lisp_Object wheel_syms; |
| 4441 | #if defined(MAC_OSX) | ||
| 4440 | static Lisp_Object mouse_wheel_syms; | 4442 | static Lisp_Object mouse_wheel_syms; |
| 4441 | #endif | 4443 | #endif |
| 4442 | static Lisp_Object drag_n_drop_syms; | 4444 | static Lisp_Object drag_n_drop_syms; |
| @@ -4892,7 +4894,12 @@ static char *iso_lispy_function_keys[] = | |||
| 4892 | 4894 | ||
| 4893 | Lisp_Object Vlispy_mouse_stem; | 4895 | Lisp_Object Vlispy_mouse_stem; |
| 4894 | 4896 | ||
| 4895 | #if defined(WINDOWSNT) || defined(MAC_OSX) | 4897 | static char *lispy_wheel_names[] = |
| 4898 | { | ||
| 4899 | "wheel-up", "wheel-down" | ||
| 4900 | }; | ||
| 4901 | |||
| 4902 | #if defined(MAC_OSX) | ||
| 4896 | /* mouse-wheel events are generated by the wheel on devices such as | 4903 | /* mouse-wheel events are generated by the wheel on devices such as |
| 4897 | the MS Intellimouse. The wheel sits in between the left and right | 4904 | the MS Intellimouse. The wheel sits in between the left and right |
| 4898 | mouse buttons, and is typically used to scroll or zoom the window | 4905 | mouse buttons, and is typically used to scroll or zoom the window |
| @@ -4905,7 +4912,7 @@ static char *lispy_mouse_wheel_names[] = | |||
| 4905 | "mouse-wheel" | 4912 | "mouse-wheel" |
| 4906 | }; | 4913 | }; |
| 4907 | 4914 | ||
| 4908 | #endif /* WINDOWSNT */ | 4915 | #endif /* MAC_OSX */ |
| 4909 | 4916 | ||
| 4910 | /* drag-n-drop events are generated when a set of selected files are | 4917 | /* drag-n-drop events are generated when a set of selected files are |
| 4911 | dragged from another application and dropped onto an Emacs window. */ | 4918 | dragged from another application and dropped onto an Emacs window. */ |
| @@ -5416,6 +5423,192 @@ make_lispy_event (event) | |||
| 5416 | } | 5423 | } |
| 5417 | } | 5424 | } |
| 5418 | 5425 | ||
| 5426 | case WHEEL_EVENT: | ||
| 5427 | { | ||
| 5428 | Lisp_Object position; | ||
| 5429 | Lisp_Object window; | ||
| 5430 | Lisp_Object head; | ||
| 5431 | |||
| 5432 | position = Qnil; | ||
| 5433 | /* Build the position as appropriate for this mouse click. */ | ||
| 5434 | enum window_part part; | ||
| 5435 | struct frame *f = XFRAME (event->frame_or_window); | ||
| 5436 | Lisp_Object posn; | ||
| 5437 | Lisp_Object string_info = Qnil; | ||
| 5438 | int row, column; | ||
| 5439 | int wx, wy; | ||
| 5440 | |||
| 5441 | /* Ignore wheel events that were made on frame that have been | ||
| 5442 | deleted. */ | ||
| 5443 | if (! FRAME_LIVE_P (f)) | ||
| 5444 | return Qnil; | ||
| 5445 | |||
| 5446 | /* EVENT->x and EVENT->y are frame-relative pixel | ||
| 5447 | coordinates at this place. Under old redisplay, COLUMN | ||
| 5448 | and ROW are set to frame relative glyph coordinates | ||
| 5449 | which are then used to determine whether this click is | ||
| 5450 | in a menu (non-toolkit version). */ | ||
| 5451 | pixel_to_glyph_coords (f, XINT (event->x), XINT (event->y), | ||
| 5452 | &column, &row, NULL, 1); | ||
| 5453 | |||
| 5454 | /* Set `window' to the window under frame pixel coordinates | ||
| 5455 | event->x/event->y. */ | ||
| 5456 | window = window_from_coordinates (f, XINT (event->x), | ||
| 5457 | XINT (event->y), | ||
| 5458 | &part, &wx, &wy, 0); | ||
| 5459 | |||
| 5460 | if (!WINDOWP (window)) | ||
| 5461 | { | ||
| 5462 | window = event->frame_or_window; | ||
| 5463 | posn = Qnil; | ||
| 5464 | } | ||
| 5465 | else | ||
| 5466 | { | ||
| 5467 | /* It's a click in window window at frame coordinates | ||
| 5468 | event->x/ event->y. */ | ||
| 5469 | struct window *w = XWINDOW (window); | ||
| 5470 | |||
| 5471 | /* Set event coordinates to window-relative coordinates | ||
| 5472 | for constructing the Lisp event below. */ | ||
| 5473 | XSETINT (event->x, wx); | ||
| 5474 | XSETINT (event->y, wy); | ||
| 5475 | |||
| 5476 | if (part == ON_MODE_LINE || part == ON_HEADER_LINE) | ||
| 5477 | { | ||
| 5478 | /* Mode line or header line. Look for a string under | ||
| 5479 | the mouse that may have a `local-map' property. */ | ||
| 5480 | Lisp_Object string; | ||
| 5481 | int charpos; | ||
| 5482 | |||
| 5483 | posn = part == ON_MODE_LINE ? Qmode_line : Qheader_line; | ||
| 5484 | string = mode_line_string (w, wx, wy, part, &charpos); | ||
| 5485 | if (STRINGP (string)) | ||
| 5486 | string_info = Fcons (string, make_number (charpos)); | ||
| 5487 | } | ||
| 5488 | else if (part == ON_VERTICAL_BORDER) | ||
| 5489 | posn = Qvertical_line; | ||
| 5490 | else if (part == ON_LEFT_MARGIN || part == ON_RIGHT_MARGIN) | ||
| 5491 | { | ||
| 5492 | int charpos; | ||
| 5493 | Lisp_Object object = marginal_area_string (w, wx, wy, part, | ||
| 5494 | &charpos); | ||
| 5495 | posn = (part == ON_LEFT_MARGIN) ? Qleft_margin : Qright_margin; | ||
| 5496 | if (STRINGP (object)) | ||
| 5497 | string_info = Fcons (object, make_number (charpos)); | ||
| 5498 | } | ||
| 5499 | else | ||
| 5500 | { | ||
| 5501 | Lisp_Object object; | ||
| 5502 | struct display_pos p; | ||
| 5503 | buffer_posn_from_coords (w, &wx, &wy, &object, &p); | ||
| 5504 | posn = make_number (CHARPOS (p.pos)); | ||
| 5505 | if (STRINGP (object)) | ||
| 5506 | string_info | ||
| 5507 | = Fcons (object, | ||
| 5508 | make_number (CHARPOS (p.string_pos))); | ||
| 5509 | } | ||
| 5510 | } | ||
| 5511 | |||
| 5512 | position | ||
| 5513 | = Fcons (window, | ||
| 5514 | Fcons (posn, | ||
| 5515 | Fcons (Fcons (event->x, event->y), | ||
| 5516 | Fcons (make_number (event->timestamp), | ||
| 5517 | (NILP (string_info) | ||
| 5518 | ? Qnil | ||
| 5519 | : Fcons (string_info, Qnil)))))); | ||
| 5520 | |||
| 5521 | /* Set double or triple modifiers to indicate the wheel speed. */ | ||
| 5522 | { | ||
| 5523 | /* On window-system frames, use the value of | ||
| 5524 | double-click-fuzz as is. On other frames, interpret it | ||
| 5525 | as a multiple of 1/8 characters. */ | ||
| 5526 | struct frame *f; | ||
| 5527 | int fuzz; | ||
| 5528 | int is_double; | ||
| 5529 | |||
| 5530 | if (WINDOWP (event->frame_or_window)) | ||
| 5531 | f = XFRAME (XWINDOW (event->frame_or_window)->frame); | ||
| 5532 | else if (FRAMEP (event->frame_or_window)) | ||
| 5533 | f = XFRAME (event->frame_or_window); | ||
| 5534 | else | ||
| 5535 | abort (); | ||
| 5536 | |||
| 5537 | if (FRAME_WINDOW_P (f)) | ||
| 5538 | fuzz = double_click_fuzz; | ||
| 5539 | else | ||
| 5540 | fuzz = double_click_fuzz / 8; | ||
| 5541 | |||
| 5542 | is_double = (last_mouse_button < 0 | ||
| 5543 | && (abs (XINT (event->x) - last_mouse_x) <= fuzz) | ||
| 5544 | && (abs (XINT (event->y) - last_mouse_y) <= fuzz) | ||
| 5545 | && button_down_time != 0 | ||
| 5546 | && (EQ (Vdouble_click_time, Qt) | ||
| 5547 | || (INTEGERP (Vdouble_click_time) | ||
| 5548 | && ((int)(event->timestamp - button_down_time) | ||
| 5549 | < XINT (Vdouble_click_time))))); | ||
| 5550 | if (is_double) | ||
| 5551 | { | ||
| 5552 | double_click_count++; | ||
| 5553 | event->modifiers |= ((double_click_count > 2) | ||
| 5554 | ? triple_modifier | ||
| 5555 | : double_modifier); | ||
| 5556 | } | ||
| 5557 | else | ||
| 5558 | { | ||
| 5559 | double_click_count = 1; | ||
| 5560 | event->modifiers |= click_modifier; | ||
| 5561 | } | ||
| 5562 | |||
| 5563 | button_down_time = event->timestamp; | ||
| 5564 | /* Use a negative value to distinguish wheel from mouse button. */ | ||
| 5565 | last_mouse_button = -1; | ||
| 5566 | last_mouse_x = XINT (event->x); | ||
| 5567 | last_mouse_y = XINT (event->y); | ||
| 5568 | } | ||
| 5569 | |||
| 5570 | { | ||
| 5571 | int symbol_num; | ||
| 5572 | |||
| 5573 | if (event->modifiers & up_modifier) | ||
| 5574 | { | ||
| 5575 | /* Emit a wheel-up event. */ | ||
| 5576 | event->modifiers &= ~up_modifier; | ||
| 5577 | symbol_num = 0; | ||
| 5578 | } | ||
| 5579 | else if (event->modifiers & down_modifier) | ||
| 5580 | { | ||
| 5581 | /* Emit a wheel-down event. */ | ||
| 5582 | event->modifiers &= ~down_modifier; | ||
| 5583 | symbol_num = 1; | ||
| 5584 | } | ||
| 5585 | else | ||
| 5586 | /* Every wheel event should either have the down_modifier or | ||
| 5587 | the up_modifier set. */ | ||
| 5588 | abort (); | ||
| 5589 | |||
| 5590 | /* Get the symbol we should use for the wheel event. */ | ||
| 5591 | head = modify_event_symbol (symbol_num, | ||
| 5592 | event->modifiers, | ||
| 5593 | Qmouse_click, | ||
| 5594 | Qnil, | ||
| 5595 | lispy_wheel_names, | ||
| 5596 | &wheel_syms, | ||
| 5597 | ASIZE (wheel_syms)); | ||
| 5598 | } | ||
| 5599 | |||
| 5600 | if (event->modifiers & (double_modifier | triple_modifier)) | ||
| 5601 | return Fcons (head, | ||
| 5602 | Fcons (position, | ||
| 5603 | Fcons (make_number (double_click_count), | ||
| 5604 | Qnil))); | ||
| 5605 | else | ||
| 5606 | return Fcons (head, | ||
| 5607 | Fcons (position, | ||
| 5608 | Qnil)); | ||
| 5609 | } | ||
| 5610 | |||
| 5611 | |||
| 5419 | #ifdef USE_TOOLKIT_SCROLL_BARS | 5612 | #ifdef USE_TOOLKIT_SCROLL_BARS |
| 5420 | 5613 | ||
| 5421 | /* We don't have down and up events if using toolkit scroll bars, | 5614 | /* We don't have down and up events if using toolkit scroll bars, |
| @@ -10675,7 +10868,7 @@ syms_of_keyboard () | |||
| 10675 | staticpro (&Qfunction_key); | 10868 | staticpro (&Qfunction_key); |
| 10676 | Qmouse_click = intern ("mouse-click"); | 10869 | Qmouse_click = intern ("mouse-click"); |
| 10677 | staticpro (&Qmouse_click); | 10870 | staticpro (&Qmouse_click); |
| 10678 | #if defined(WINDOWSNT) || defined(MAC_OSX) | 10871 | #if defined(MAC_OSX) |
| 10679 | Qmouse_wheel = intern ("mouse-wheel"); | 10872 | Qmouse_wheel = intern ("mouse-wheel"); |
| 10680 | staticpro (&Qmouse_wheel); | 10873 | staticpro (&Qmouse_wheel); |
| 10681 | #endif | 10874 | #endif |
| @@ -10793,6 +10986,8 @@ syms_of_keyboard () | |||
| 10793 | staticpro (&button_down_location); | 10986 | staticpro (&button_down_location); |
| 10794 | mouse_syms = Fmake_vector (make_number (1), Qnil); | 10987 | mouse_syms = Fmake_vector (make_number (1), Qnil); |
| 10795 | staticpro (&mouse_syms); | 10988 | staticpro (&mouse_syms); |
| 10989 | wheel_syms = Fmake_vector (make_number (2), Qnil); | ||
| 10990 | staticpro (&wheel_syms); | ||
| 10796 | 10991 | ||
| 10797 | { | 10992 | { |
| 10798 | int i; | 10993 | int i; |
| @@ -10827,7 +11022,7 @@ syms_of_keyboard () | |||
| 10827 | func_key_syms = Qnil; | 11022 | func_key_syms = Qnil; |
| 10828 | staticpro (&func_key_syms); | 11023 | staticpro (&func_key_syms); |
| 10829 | 11024 | ||
| 10830 | #if defined(WINDOWSNT) || defined(MAC_OSX) | 11025 | #if defined(MAC_OSX) |
| 10831 | mouse_wheel_syms = Qnil; | 11026 | mouse_wheel_syms = Qnil; |
| 10832 | staticpro (&mouse_wheel_syms); | 11027 | staticpro (&mouse_wheel_syms); |
| 10833 | drag_n_drop_syms = Qnil; | 11028 | drag_n_drop_syms = Qnil; |