emacs-diffs
[Top][All Lists]
Advanced

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

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


From: YAMAMOTO Mitsuharu
Subject: [Emacs-diffs] Changes to emacs/src/macterm.c
Date: Tue, 14 Jun 2005 22:29:29 -0400

Index: emacs/src/macterm.c
diff -c emacs/src/macterm.c:1.117 emacs/src/macterm.c:1.118
*** emacs/src/macterm.c:1.117   Mon Jun  6 20:23:56 2005
--- emacs/src/macterm.c Wed Jun 15 02:29:29 2005
***************
*** 1996,2028 ****
  mac_compute_glyph_string_overhangs (s)
       struct glyph_string *s;
  {
!   Rect r;
!   MacFontStruct *font = s->font;
! 
!   TextFont (font->mac_fontnum);
!   TextSize (font->mac_fontsize);
!   TextFace (font->mac_fontface);
! 
!   if (s->two_byte_p)
!     QDTextBounds (s->nchars * 2, (char *)s->char2b, &r);
!   else
      {
!       int i;
!       char *buf = xmalloc (s->nchars);
  
!       if (buf == NULL)
!       SetRect (&r, 0, 0, 0, 0);
        else
        {
!         for (i = 0; i < s->nchars; ++i)
!           buf[i] = s->char2b[i].byte2;
!         QDTextBounds (s->nchars, buf, &r);
!         xfree (buf);
        }
-     }
  
!   s->right_overhang = r.right > s->width ? r.right - s->width : 0;
!   s->left_overhang = r.left < 0 ? -r.left : 0;
  }
  
  
--- 1996,2032 ----
  mac_compute_glyph_string_overhangs (s)
       struct glyph_string *s;
  {
!   if (s->cmp == NULL
!       && s->first_glyph->type == CHAR_GLYPH)
      {
!       Rect r;
!       MacFontStruct *font = s->font;
  
!       TextFont (font->mac_fontnum);
!       TextSize (font->mac_fontsize);
!       TextFace (font->mac_fontface);
! 
!       if (s->two_byte_p)
!       QDTextBounds (s->nchars * 2, (char *)s->char2b, &r);
        else
        {
!         int i;
!         char *buf = xmalloc (s->nchars);
! 
!         if (buf == NULL)
!           SetRect (&r, 0, 0, 0, 0);
!         else
!           {
!             for (i = 0; i < s->nchars; ++i)
!               buf[i] = s->char2b[i].byte2;
!             QDTextBounds (s->nchars, buf, &r);
!             xfree (buf);
!           }
        }
  
!       s->right_overhang = r.right > s->width ? r.right - s->width : 0;
!       s->left_overhang = r.left < 0 ? -r.left : 0;
!     }
  }
  
  
***************
*** 7469,7474 ****
--- 7473,7483 ----
  /* If Non-nil, the Mac "Control" key is passed on to the Mac Toolbox
     for processing before Emacs sees it.  */
  Lisp_Object Vmac_pass_control_to_system;
+ 
+ /* Points to the variable `inev' in the function XTread_socket.  It is
+    used for passing an input event to the function back from a Carbon
+    event handler.  */
+ static struct input_event *read_socket_inev = NULL;
  #endif
  
  /* Set in term/mac-win.el to indicate that event loop can now generate
***************
*** 7601,7645 ****
  
  /* Normally, ConvertEventRefToEventRecord will correctly handle all
     events.  However the click of the mouse wheel is not converted to a
!    mouseDown or mouseUp event.  This calls ConvertEventRef, but then
!    checks to see if it is a mouse up or down carbon event that has not
!    been converted, and if so, converts it by hand (to be picked up in
!    the XTread_socket loop).  */
  static Boolean mac_convert_event_ref (EventRef eventRef, EventRecord 
*eventRec)
  {
    Boolean result = ConvertEventRefToEventRecord (eventRef, eventRec);
!   /* Do special case for mouse wheel button.  */
!   if (!result && GetEventClass (eventRef) == kEventClassMouse)
      {
!       UInt32 kind = GetEventKind (eventRef);
!       if (kind == kEventMouseDown && !(eventRec->what == mouseDown))
        {
          eventRec->what = mouseDown;
!         result=1;
!       }
!       if (kind == kEventMouseUp && !(eventRec->what == mouseUp))
!       {
          eventRec->what = mouseUp;
!         result=1;
        }
!       if (result)
        {
!         /* Need where and when.  */
!         UInt32 mods;
!         GetEventParameter (eventRef, kEventParamMouseLocation,
!                            typeQDPoint, NULL, sizeof (Point),
!                            NULL, &eventRec->where);
!         /* Use two step process because new event modifiers are
!            32-bit and old are 16-bit.  Currently, only loss is
!            NumLock & Fn. */
!         GetEventParameter (eventRef, kEventParamKeyModifiers,
!                            typeUInt32, NULL, sizeof (UInt32),
!                            NULL, &mods);
!         eventRec->modifiers = mods;
  
!         eventRec->when = EventTimeToTicks (GetEventTime (eventRef));
        }
      }
    return result;
  }
  
--- 7610,7688 ----
  
  /* Normally, ConvertEventRefToEventRecord will correctly handle all
     events.  However the click of the mouse wheel is not converted to a
!    mouseDown or mouseUp event.  Likewise for dead key down events.
!    This calls ConvertEventRef, but then checks to see if it is a mouse
!    up/down, or a dead key down carbon event that has not been
!    converted, and if so, converts it by hand (to be picked up in the
!    XTread_socket loop).  */
  static Boolean mac_convert_event_ref (EventRef eventRef, EventRecord 
*eventRec)
  {
    Boolean result = ConvertEventRefToEventRecord (eventRef, eventRec);
! 
!   if (result)
!     return result;
! 
!   switch (GetEventClass (eventRef))
      {
!     case kEventClassMouse:
!       switch (GetEventKind (eventRef))
        {
+       case kEventMouseDown:
          eventRec->what = mouseDown;
!         result = 1;
!         break;
! 
!       case kEventMouseUp:
          eventRec->what = mouseUp;
!         result = 1;
!         break;
! 
!       default:
!         break;
        }
! 
!     case kEventClassKeyboard:
!       switch (GetEventKind (eventRef))
        {
!       case kEventRawKeyDown:
!         {
!           unsigned char char_codes;
!           UInt32 key_code;
! 
!           eventRec->what = keyDown;
!           GetEventParameter (eventRef, kEventParamKeyMacCharCodes, typeChar,
!                              NULL, sizeof (char), NULL, &char_codes);
!           GetEventParameter (eventRef, kEventParamKeyCode, typeUInt32,
!                              NULL, sizeof (UInt32), NULL, &key_code);
!           eventRec->message = char_codes | ((key_code & 0xff) << 8);
!           result = 1;
!         }
!         break;
  
!       default:
!         break;
        }
+ 
+     default:
+       break;
      }
+ 
+   if (result)
+     {
+       /* Need where and when.  */
+       UInt32 mods;
+ 
+       GetEventParameter (eventRef, kEventParamMouseLocation, typeQDPoint,
+                        NULL, sizeof (Point), NULL, &eventRec->where);
+       /* Use two step process because new event modifiers are 32-bit
+        and old are 16-bit.  Currently, only loss is NumLock & Fn. */
+       GetEventParameter (eventRef, kEventParamKeyModifiers, typeUInt32,
+                        NULL, sizeof (UInt32), NULL, &mods);
+       eventRec->modifiers = mods;
+ 
+       eventRec->when = EventTimeToTicks (GetEventTime (eventRef));
+     }
+ 
    return result;
  }
  
***************
*** 8209,8216 ****
  }
  
  static OSErr
! init_command_handler (window)
!      WindowPtr window;
  {
    OSErr err = noErr;
    EventTypeSpec specs[] = {{kEventClassCommand, kEventCommandProcess}};
--- 8252,8258 ----
  }
  
  static OSErr
! init_command_handler ()
  {
    OSErr err = noErr;
    EventTypeSpec specs[] = {{kEventClassCommand, kEventCommandProcess}};
***************
*** 8295,8300 ****
--- 8337,8404 ----
  
    return eventNotHandledErr;
  }
+ 
+ static pascal OSStatus
+ mac_handle_mouse_event (next_handler, event, data)
+      EventHandlerCallRef next_handler;
+      EventRef event;
+      void *data;
+ {
+   OSStatus result;
+ 
+   switch (GetEventKind (event))
+     {
+     case kEventMouseWheelMoved:
+       {
+       WindowPtr wp;
+       struct frame *f;
+       EventMouseWheelAxis axis;
+       SInt32 delta;
+       Point point;
+ 
+       result = CallNextEventHandler (next_handler, event);
+       if (result != eventNotHandledErr || read_socket_inev == NULL)
+         return result;
+ 
+       GetEventParameter (event, kEventParamWindowRef, typeWindowRef,
+                          NULL, sizeof (WindowRef), NULL, &wp);
+       f = mac_window_to_frame (wp);
+       if (f != mac_focus_frame (&one_mac_display_info))
+         break;
+ 
+       GetEventParameter (event, kEventParamMouseWheelAxis,
+                          typeMouseWheelAxis, NULL,
+                          sizeof (EventMouseWheelAxis), NULL, &axis);
+       if (axis != kEventMouseWheelAxisY)
+         break;
+ 
+       GetEventParameter (event, kEventParamMouseWheelDelta, typeSInt32,
+                          NULL, sizeof (SInt32), NULL, &delta);
+       GetEventParameter (event, kEventParamMouseLocation, typeQDPoint,
+                          NULL, sizeof (Point), NULL, &point);
+       read_socket_inev->kind = WHEEL_EVENT;
+       read_socket_inev->code = 0;
+       read_socket_inev->modifiers =
+         (mac_event_to_emacs_modifiers (event)
+          | ((delta < 0) ? down_modifier : up_modifier));
+       SetPortWindowPort (wp);
+       GlobalToLocal (&point);
+       XSETINT (read_socket_inev->x, point.h);
+       XSETINT (read_socket_inev->y, point.v);
+       XSETFRAME (read_socket_inev->frame_or_window, f);
+       read_socket_inev->timestamp =
+         EventTimeToTicks (GetEventTime (event)) * (1000/60);
+ 
+       return noErr;
+       }
+       break;
+ 
+     default:
+       break;
+     }
+ 
+   return eventNotHandledErr;
+ }
  #endif        /* USE_CARBON_EVENTS */
  
  
***************
*** 8304,8319 ****
  {
    OSErr err = noErr;
  #if USE_CARBON_EVENTS
!   EventTypeSpec specs[] = {{kEventClassWindow, kEventWindowUpdate},
!                          {kEventClassWindow, kEventWindowBoundsChanging}};
!   static EventHandlerUPP handle_window_event_UPP = NULL;
! 
!   if (handle_window_event_UPP == NULL)
!     handle_window_event_UPP = NewEventHandlerUPP (mac_handle_window_event);
! 
!   err = InstallWindowEventHandler (window, handle_window_event_UPP,
!                                  GetEventTypeCount (specs), specs,
!                                  NULL, NULL);
  #endif
  #if TARGET_API_MAC_CARBON
    if (mac_do_track_dragUPP == NULL)
--- 8408,8431 ----
  {
    OSErr err = noErr;
  #if USE_CARBON_EVENTS
!   EventTypeSpec specs_window[] =
!     {{kEventClassWindow, kEventWindowUpdate},
!      {kEventClassWindow, kEventWindowBoundsChanging}};
!   EventTypeSpec specs_mouse[] = {{kEventClassMouse, kEventMouseWheelMoved}};
!   static EventHandlerUPP handle_window_eventUPP = NULL;
!   static EventHandlerUPP handle_mouse_eventUPP = NULL;
! 
!   if (handle_window_eventUPP == NULL)
!     handle_window_eventUPP = NewEventHandlerUPP (mac_handle_window_event);
!   if (handle_mouse_eventUPP == NULL)
!     handle_mouse_eventUPP = NewEventHandlerUPP (mac_handle_mouse_event);
!   err = InstallWindowEventHandler (window, handle_window_eventUPP,
!                                  GetEventTypeCount (specs_window),
!                                  specs_window, NULL, NULL);
!   if (err == noErr)
!     err = InstallWindowEventHandler (window, handle_mouse_eventUPP,
!                                    GetEventTypeCount (specs_mouse),
!                                    specs_mouse, NULL, NULL);
  #endif
  #if TARGET_API_MAC_CARBON
    if (mac_do_track_dragUPP == NULL)
***************
*** 8865,8932 ****
  #if USE_CARBON_EVENTS
        /* Handle new events */
        if (!mac_convert_event_ref (eventRef, &er))
!       switch (GetEventClass (eventRef))
!         {
!         case kEventClassWindow:
!           if (GetEventKind (eventRef) == kEventWindowBoundsChanged)
!             {
!               WindowPtr window_ptr;
!               GetEventParameter(eventRef, kEventParamDirectObject,
!                                 typeWindowRef, NULL, sizeof(WindowPtr),
!                                 NULL, &window_ptr);
!               f = mac_window_to_frame (window_ptr);
!               if (f && !f->async_iconified)
!                 x_real_positions (f, &f->left_pos, &f->top_pos);
!               SendEventToEventTarget (eventRef, toolbox_dispatcher);
!             }
!           break;
!         case kEventClassMouse:
!           if (GetEventKind (eventRef) == kEventMouseWheelMoved)
!             {
!               SInt32 delta;
!               Point point;
!               struct frame *f = mac_focus_frame (dpyinfo);
!               WindowPtr window_ptr;
! 
! #if 0
!               if (dpyinfo->x_focus_frame == NULL)
!                 {
!                   /* Beep if wheel move occurs when all the frames
!                      are invisible.  */
!                   SysBeep(1);
!                   break;
!                 }
! #endif
! 
!               GetEventParameter(eventRef, kEventParamMouseWheelDelta,
!                                 typeSInt32, NULL, sizeof (SInt32),
!                                 NULL, &delta);
!               GetEventParameter(eventRef, kEventParamMouseLocation,
!                                 typeQDPoint, NULL, sizeof (Point),
!                                 NULL, &point);
!               inev.kind = WHEEL_EVENT;
!               inev.code = 0;
!               inev.modifiers = (mac_event_to_emacs_modifiers (eventRef)
!                                 | ((delta < 0) ? down_modifier
!                                    : up_modifier));
!               window_ptr = FRAME_MAC_WINDOW (f);
!               SetPortWindowPort (window_ptr);
!               GlobalToLocal (&point);
!               XSETINT (inev.x, point.h);
!               XSETINT (inev.y, point.v);
!               XSETFRAME (inev.frame_or_window,
!                          mac_window_to_frame (window_ptr));
!               inev.timestamp = EventTimeToTicks (GetEventTime 
(eventRef))*(1000/60);
!             }
!           else
!             SendEventToEventTarget (eventRef, toolbox_dispatcher);
! 
!           break;
! 
!         default:
!           /* Send the event to the appropriate receiver.  */
!           SendEventToEventTarget (eventRef, toolbox_dispatcher);
!         }
        else
  #endif /* USE_CARBON_EVENTS */
        switch (er.what)
--- 8977,8995 ----
  #if USE_CARBON_EVENTS
        /* Handle new events */
        if (!mac_convert_event_ref (eventRef, &er))
!       {
!         /* There used to be a handler for the kEventMouseWheelMoved
!            event here.  But as of Mac OS X 10.4, this kind of event
!            is not directly posted to the main event queue by
!            two-finger scrolling on the trackpad.  Instead, some
!            private event is posted and it is converted to a wheel
!            event by the default handler for the application target.
!            The converted one can be received by a Carbon event
!            handler installed on a window target.  */
!         read_socket_inev = &inev;
!         SendEventToEventTarget (eventRef, toolbox_dispatcher);
!         read_socket_inev = NULL;
!       }
        else
  #endif /* USE_CARBON_EVENTS */
        switch (er.what)
***************
*** 9362,9368 ****
            if ((!NILP (Vmac_pass_command_to_system)
                 || !(er.modifiers & cmdKey))
                && (!NILP (Vmac_pass_control_to_system)
!                   || !(er.modifiers & controlKey)))
              if (SendEventToEventTarget (eventRef, toolbox_dispatcher)
                  != eventNotHandledErr)
                break;
--- 9425,9434 ----
            if ((!NILP (Vmac_pass_command_to_system)
                 || !(er.modifiers & cmdKey))
                && (!NILP (Vmac_pass_control_to_system)
!                   || !(er.modifiers & controlKey))
!               && (!NILP (Vmac_command_key_is_meta)
!                   && NILP (Vmac_option_modifier)
!                   || !(er.modifiers & optionKey)))
              if (SendEventToEventTarget (eventRef, toolbox_dispatcher)
                  != eventNotHandledErr)
                break;




reply via email to

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