aboutsummaryrefslogtreecommitdiffstats
path: root/src/keyboard.c
diff options
context:
space:
mode:
authorJason Rumney2003-06-01 21:40:38 +0000
committerJason Rumney2003-06-01 21:40:38 +0000
commit8006e4bbcb8a7014cd7f3c5d5840b811a6472ceb (patch)
treed0fb5bf38863d6f09682d308e9ead7925634d755 /src/keyboard.c
parent3ecad19e403a7bdbb15f1af31913378192018faf (diff)
downloademacs-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.c207
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. */
548Lisp_Object Qfunction_key; 548Lisp_Object Qfunction_key;
549Lisp_Object Qmouse_click; 549Lisp_Object Qmouse_click;
550#if defined(WINDOWSNT) || defined(MAC_OSX) 550#if defined(MAC_OSX)
551Lisp_Object Qmouse_wheel; 551Lisp_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)
4436static Lisp_Object accent_key_syms; 4437static Lisp_Object accent_key_syms;
4437static Lisp_Object func_key_syms; 4438static Lisp_Object func_key_syms;
4438static Lisp_Object mouse_syms; 4439static Lisp_Object mouse_syms;
4439#if defined(WINDOWSNT) || defined(MAC_OSX) 4440static Lisp_Object wheel_syms;
4441#if defined(MAC_OSX)
4440static Lisp_Object mouse_wheel_syms; 4442static Lisp_Object mouse_wheel_syms;
4441#endif 4443#endif
4442static Lisp_Object drag_n_drop_syms; 4444static Lisp_Object drag_n_drop_syms;
@@ -4892,7 +4894,12 @@ static char *iso_lispy_function_keys[] =
4892 4894
4893Lisp_Object Vlispy_mouse_stem; 4895Lisp_Object Vlispy_mouse_stem;
4894 4896
4895#if defined(WINDOWSNT) || defined(MAC_OSX) 4897static 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;