emacs-diffs
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[Emacs-diffs] Changes to emacs/src/keyboard.c


From: Jason Rumney
Subject: [Emacs-diffs] Changes to emacs/src/keyboard.c
Date: Sun, 01 Jun 2003 17:40:39 -0400

Index: emacs/src/keyboard.c
diff -c emacs/src/keyboard.c:1.747 emacs/src/keyboard.c:1.748
*** emacs/src/keyboard.c:1.747  Mon May 26 18:55:45 2003
--- emacs/src/keyboard.c        Sun Jun  1 17:40:38 2003
***************
*** 547,553 ****
  /* Symbols to denote kinds of events.  */
  Lisp_Object Qfunction_key;
  Lisp_Object Qmouse_click;
! #if defined(WINDOWSNT) || defined(MAC_OSX)
  Lisp_Object Qmouse_wheel;
  #endif
  #ifdef WINDOWSNT
--- 547,553 ----
  /* Symbols to denote kinds of events.  */
  Lisp_Object Qfunction_key;
  Lisp_Object Qmouse_click;
! #if defined(MAC_OSX)
  Lisp_Object Qmouse_wheel;
  #endif
  #ifdef WINDOWSNT
***************
*** 3737,3742 ****
--- 3737,3743 ----
        sp = kbd_buffer;
  
        if (sp->kind == MOUSE_CLICK_EVENT
+         || sp->kind == WHEEL_EVENT
  #ifdef WINDOWSNT
          || sp->kind == W32_SCROLL_BAR_CLICK_EVENT
  #endif
***************
*** 4436,4442 ****
  static Lisp_Object accent_key_syms;
  static Lisp_Object func_key_syms;
  static Lisp_Object mouse_syms;
! #if defined(WINDOWSNT) || defined(MAC_OSX)
  static Lisp_Object mouse_wheel_syms;
  #endif
  static Lisp_Object drag_n_drop_syms;
--- 4437,4444 ----
  static Lisp_Object accent_key_syms;
  static Lisp_Object func_key_syms;
  static Lisp_Object mouse_syms;
! static Lisp_Object wheel_syms;
! #if defined(MAC_OSX)
  static Lisp_Object mouse_wheel_syms;
  #endif
  static Lisp_Object drag_n_drop_syms;
***************
*** 4892,4898 ****
  
  Lisp_Object Vlispy_mouse_stem;
  
! #if defined(WINDOWSNT) || defined(MAC_OSX)
  /* mouse-wheel events are generated by the wheel on devices such as
     the MS Intellimouse.  The wheel sits in between the left and right
     mouse buttons, and is typically used to scroll or zoom the window
--- 4894,4905 ----
  
  Lisp_Object Vlispy_mouse_stem;
  
! static char *lispy_wheel_names[] =
! {
!   "wheel-up", "wheel-down"
! };
! 
! #if defined(MAC_OSX)
  /* mouse-wheel events are generated by the wheel on devices such as
     the MS Intellimouse.  The wheel sits in between the left and right
     mouse buttons, and is typically used to scroll or zoom the window
***************
*** 4905,4911 ****
    "mouse-wheel"
  };
  
! #endif /* WINDOWSNT */
  
  /* drag-n-drop events are generated when a set of selected files are
     dragged from another application and dropped onto an Emacs window.  */
--- 4912,4918 ----
    "mouse-wheel"
  };
  
! #endif /* MAC_OSX */
  
  /* drag-n-drop events are generated when a set of selected files are
     dragged from another application and dropped onto an Emacs window.  */
***************
*** 5416,5421 ****
--- 5423,5614 ----
        }
        }
  
+     case WHEEL_EVENT:
+       {
+       Lisp_Object position;
+       Lisp_Object window;
+       Lisp_Object head;
+       
+       position = Qnil;
+       /* Build the position as appropriate for this mouse click.  */
+       enum window_part part;
+       struct frame *f = XFRAME (event->frame_or_window);
+       Lisp_Object posn;
+       Lisp_Object string_info = Qnil;
+       int row, column;
+       int wx, wy;
+ 
+       /* Ignore wheel events that were made on frame that have been
+          deleted.  */
+       if (! FRAME_LIVE_P (f))
+         return Qnil;
+       
+       /* EVENT->x and EVENT->y are frame-relative pixel
+          coordinates at this place.  Under old redisplay, COLUMN
+          and ROW are set to frame relative glyph coordinates
+          which are then used to determine whether this click is
+          in a menu (non-toolkit version).  */
+       pixel_to_glyph_coords (f, XINT (event->x), XINT (event->y),
+                              &column, &row, NULL, 1);
+ 
+       /* Set `window' to the window under frame pixel coordinates
+          event->x/event->y.  */
+       window = window_from_coordinates (f, XINT (event->x),
+                                         XINT (event->y),
+                                         &part, &wx, &wy, 0);
+ 
+       if (!WINDOWP (window))
+         {
+           window = event->frame_or_window;
+           posn = Qnil;
+         }
+       else
+         {
+           /* It's a click in window window at frame coordinates
+              event->x/ event->y.  */
+           struct window *w = XWINDOW (window);
+       
+           /* Set event coordinates to window-relative coordinates
+              for constructing the Lisp event below.  */
+           XSETINT (event->x, wx);
+           XSETINT (event->y, wy);
+       
+           if (part == ON_MODE_LINE || part == ON_HEADER_LINE)
+             {
+               /* Mode line or header line.  Look for a string under
+                  the mouse that may have a `local-map' property.  */
+               Lisp_Object string;
+               int charpos;
+               
+               posn = part == ON_MODE_LINE ? Qmode_line : Qheader_line;
+               string = mode_line_string (w, wx, wy, part, &charpos);
+               if (STRINGP (string))
+                 string_info = Fcons (string, make_number (charpos));
+             }
+           else if (part == ON_VERTICAL_BORDER)
+             posn = Qvertical_line;
+           else if (part == ON_LEFT_MARGIN || part == ON_RIGHT_MARGIN)
+             {
+               int charpos;
+               Lisp_Object object = marginal_area_string (w, wx, wy, part,
+                                                          &charpos);
+               posn = (part == ON_LEFT_MARGIN) ? Qleft_margin : Qright_margin;
+               if (STRINGP (object))
+                 string_info = Fcons (object, make_number (charpos));
+             }
+           else
+             {
+               Lisp_Object object;
+               struct display_pos p;
+               buffer_posn_from_coords (w, &wx, &wy, &object, &p);
+               posn = make_number (CHARPOS (p.pos));
+               if (STRINGP (object))
+                 string_info
+                   = Fcons (object,
+                            make_number (CHARPOS (p.string_pos)));
+             }
+         }
+       
+       position
+         = Fcons (window,
+                  Fcons (posn,
+                         Fcons (Fcons (event->x, event->y),
+                                Fcons (make_number (event->timestamp),
+                                       (NILP (string_info)
+                                        ? Qnil
+                                        : Fcons (string_info, Qnil))))));
+ 
+       /* Set double or triple modifiers to indicate the wheel speed.  */
+       {
+         /* On window-system frames, use the value of
+            double-click-fuzz as is.  On other frames, interpret it
+            as a multiple of 1/8 characters.  */
+         struct frame *f;
+         int fuzz;
+         int is_double;
+ 
+         if (WINDOWP (event->frame_or_window))
+           f = XFRAME (XWINDOW (event->frame_or_window)->frame);
+         else if (FRAMEP (event->frame_or_window))
+           f = XFRAME (event->frame_or_window);
+         else
+           abort ();
+ 
+         if (FRAME_WINDOW_P (f))
+           fuzz = double_click_fuzz;
+         else
+           fuzz = double_click_fuzz / 8;
+ 
+         is_double = (last_mouse_button < 0
+                      && (abs (XINT (event->x) - last_mouse_x) <= fuzz)
+                      && (abs (XINT (event->y) - last_mouse_y) <= fuzz)
+                      && button_down_time != 0
+                      && (EQ (Vdouble_click_time, Qt)
+                          || (INTEGERP (Vdouble_click_time)
+                              && ((int)(event->timestamp - button_down_time)
+                                  < XINT (Vdouble_click_time)))));
+         if (is_double)
+           {
+             double_click_count++;
+             event->modifiers |= ((double_click_count > 2)
+                                  ? triple_modifier
+                                  : double_modifier);
+           }
+         else
+           {
+             double_click_count = 1;
+             event->modifiers |= click_modifier;
+           }
+       
+         button_down_time = event->timestamp;
+         /* Use a negative value to distinguish wheel from mouse button.  */
+         last_mouse_button = -1;
+         last_mouse_x = XINT (event->x);
+         last_mouse_y = XINT (event->y);
+       }
+       
+       {
+         int symbol_num;
+       
+         if (event->modifiers & up_modifier)
+           {
+             /* Emit a wheel-up event.  */
+             event->modifiers &= ~up_modifier;
+             symbol_num = 0;
+           }
+         else if (event->modifiers & down_modifier)
+           {
+             /* Emit a wheel-down event.  */
+             event->modifiers &= ~down_modifier;
+             symbol_num = 1;
+           }
+         else
+           /* Every wheel event should either have the down_modifier or
+              the up_modifier set.  */
+           abort ();
+       
+         /* Get the symbol we should use for the wheel event.  */
+         head = modify_event_symbol (symbol_num,
+                                     event->modifiers,
+                                     Qmouse_click,
+                                     Qnil,
+                                     lispy_wheel_names,
+                                     &wheel_syms,
+                                     ASIZE (wheel_syms));
+       }
+       
+       if (event->modifiers & (double_modifier | triple_modifier))
+         return Fcons (head,
+                       Fcons (position,
+                              Fcons (make_number (double_click_count),
+                                     Qnil)));
+       else
+         return Fcons (head,
+                       Fcons (position,
+                              Qnil));
+       }
+ 
+ 
  #ifdef USE_TOOLKIT_SCROLL_BARS
  
        /* We don't have down and up events if using toolkit scroll bars,
***************
*** 10675,10681 ****
    staticpro (&Qfunction_key);
    Qmouse_click = intern ("mouse-click");
    staticpro (&Qmouse_click);
! #if defined(WINDOWSNT) || defined(MAC_OSX)
    Qmouse_wheel = intern ("mouse-wheel");
    staticpro (&Qmouse_wheel);
  #endif
--- 10868,10874 ----
    staticpro (&Qfunction_key);
    Qmouse_click = intern ("mouse-click");
    staticpro (&Qmouse_click);
! #if defined(MAC_OSX)
    Qmouse_wheel = intern ("mouse-wheel");
    staticpro (&Qmouse_wheel);
  #endif
***************
*** 10793,10798 ****
--- 10986,10993 ----
    staticpro (&button_down_location);
    mouse_syms = Fmake_vector (make_number (1), Qnil);
    staticpro (&mouse_syms);
+   wheel_syms = Fmake_vector (make_number (2), Qnil);
+   staticpro (&wheel_syms);
  
    {
      int i;
***************
*** 10827,10833 ****
    func_key_syms = Qnil;
    staticpro (&func_key_syms);
  
! #if defined(WINDOWSNT) || defined(MAC_OSX)
    mouse_wheel_syms = Qnil;
    staticpro (&mouse_wheel_syms);
    drag_n_drop_syms = Qnil;
--- 11022,11028 ----
    func_key_syms = Qnil;
    staticpro (&func_key_syms);
  
! #if defined(MAC_OSX)
    mouse_wheel_syms = Qnil;
    staticpro (&mouse_wheel_syms);
    drag_n_drop_syms = Qnil;




reply via email to

[Prev in Thread] Current Thread [Next in Thread]