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: Andrew Choi
Subject: [Emacs-diffs] Changes to emacs/src/macterm.c
Date: Sat, 03 Aug 2002 18:21:11 -0400

Index: emacs/src/macterm.c
diff -c emacs/src/macterm.c:1.12 emacs/src/macterm.c:1.13
*** emacs/src/macterm.c:1.12    Sun Jul 14 20:00:36 2002
--- emacs/src/macterm.c Sat Aug  3 18:21:09 2002
***************
*** 58,63 ****
--- 58,67 ----
  #define max(a, b) ((a) > (b) ? (a) : (b))
  #undef init_process
  #define init_process emacs_init_process
+ /* USE_CARBON_EVENTS determines if the Carbon Event Manager is used to
+    obtain events from the event queue.  If set to 0, WaitNextEvent is
+    used instead.  */
+ #define USE_CARBON_EVENTS 1
  #else /* not MAC_OSX */
  #include <Quickdraw.h>
  #include <ToolUtils.h>
***************
*** 106,111 ****
--- 110,124 ----
  
  #define BETWEEN(X, LOWER, UPPER)  ((X) >= (LOWER) && (X) < (UPPER))
  
+ /* Set of macros that handle mapping of Mac modifier keys to emacs.  */
+ #define macCtrlKey     (NILP (Vmac_reverse_ctrl_meta) ? controlKey :  \
+                       (NILP (Vmac_command_key_is_meta) ? optionKey : cmdKey))
+ #define macShiftKey    (shiftKey)
+ #define macMetaKey     (NILP (Vmac_reverse_ctrl_meta) ?                       
\
+                       (NILP (Vmac_command_key_is_meta) ? optionKey : cmdKey) \
+                       : controlKey)
+ #define macAltKey      (NILP (Vmac_command_key_is_meta) ? cmdKey : optionKey)
+ 
  
  /* Fringe bitmaps.  */
  
***************
*** 10092,10199 ****
  x_iconify_frame (f)
       struct frame *f;
  {
- #if 0 /* MAC_TODO: really no iconify on Mac */
-   int result;
-   Lisp_Object type;
- 
    /* Don't keep the highlight on an invisible frame.  */
!   if (FRAME_X_DISPLAY_INFO (f)->x_highlight_frame == f)
!     FRAME_X_DISPLAY_INFO (f)->x_highlight_frame = 0;
  
    if (f->async_iconified)
      return;
  
    BLOCK_INPUT;
  
!   FRAME_SAMPLE_VISIBILITY (f);
! 
!   type = x_icon_type (f);
!   if (!NILP (type))
!     x_bitmap_icon (f, type);
! 
! #ifdef USE_X_TOOLKIT
! 
!   if (! FRAME_VISIBLE_P (f))
!     {
!       if (! EQ (Vx_no_window_manager, Qt))
!       x_wm_set_window_state (f, IconicState);
!       /* This was XtPopup, but that did nothing for an iconified frame.  */
!       XtMapWidget (f->output_data.x->widget);
!       /* The server won't give us any event to indicate
!        that an invisible frame was changed to an icon,
!        so we have to record it here.  */
!       f->iconified = 1;
!       f->visible = 1;
!       f->async_iconified = 1;
!       f->async_visible = 0;
!       UNBLOCK_INPUT;
!       return;
!     }
! 
!   result = XIconifyWindow (FRAME_X_DISPLAY (f),
!                          XtWindow (f->output_data.x->widget),
!                          DefaultScreen (FRAME_X_DISPLAY (f)));
!   UNBLOCK_INPUT;
! 
!   if (!result)
!     error ("Can't notify window manager of iconification");
! 
!   f->async_iconified = 1;
!   f->async_visible = 0;
! 
! 
!   BLOCK_INPUT;
!   XFlush (FRAME_X_DISPLAY (f));
!   UNBLOCK_INPUT;
! #else /* not USE_X_TOOLKIT */
! 
!   /* Make sure the X server knows where the window should be positioned,
!      in case the user deiconifies with the window manager.  */
!   if (! FRAME_VISIBLE_P (f) && !FRAME_ICONIFIED_P (f))
!     x_set_offset (f, f->output_data.x->left_pos, f->output_data.x->top_pos, 
0);
! 
!   /* Since we don't know which revision of X we're running, we'll use both
!      the X11R3 and X11R4 techniques.  I don't know if this is a good idea.  */
! 
!   /* X11R4: send a ClientMessage to the window manager using the
!      WM_CHANGE_STATE type.  */
!   {
!     XEvent message;
! 
!     message.xclient.window = FRAME_X_WINDOW (f);
!     message.xclient.type = ClientMessage;
!     message.xclient.message_type = FRAME_X_DISPLAY_INFO 
(f)->Xatom_wm_change_state;
!     message.xclient.format = 32;
!     message.xclient.data.l[0] = IconicState;
! 
!     if (! XSendEvent (FRAME_X_DISPLAY (f),
!                     DefaultRootWindow (FRAME_X_DISPLAY (f)),
!                     False,
!                     SubstructureRedirectMask | SubstructureNotifyMask,
!                     &message))
!       {
!       UNBLOCK_INPUT_RESIGNAL;
!       error ("Can't notify window manager of iconification");
!       }
!   }
! 
!   /* X11R3: set the initial_state field of the window manager hints to
!      IconicState.  */
!   x_wm_set_window_state (f, IconicState);
! 
!   if (!FRAME_VISIBLE_P (f))
!     {
!       /* If the frame was withdrawn, before, we must map it.  */
!       XMapRaised (FRAME_X_DISPLAY (f), FRAME_X_WINDOW (f));
!     }
! 
!   f->async_iconified = 1;
!   f->async_visible = 0;
! 
!   XFlush (FRAME_X_DISPLAY (f));
    UNBLOCK_INPUT;
- #endif /* not USE_X_TOOLKIT */
- #endif /* MAC_TODO */
  }
  
  
--- 10105,10125 ----
  x_iconify_frame (f)
       struct frame *f;
  {
    /* Don't keep the highlight on an invisible frame.  */
!   if (FRAME_MAC_DISPLAY_INFO (f)->x_highlight_frame == f)
!     FRAME_MAC_DISPLAY_INFO (f)->x_highlight_frame = 0;
  
+ #if 0
+   /* Review:  Since window is still visible in dock, still allow updates? */
    if (f->async_iconified)
      return;
+ #endif
  
    BLOCK_INPUT;
  
!   CollapseWindow (FRAME_MAC_WINDOW (f), true);
!   
    UNBLOCK_INPUT;
  }
  
  
***************
*** 11560,11568 ****
  
  Boolean       terminate_flag = false;
  
! /* true if using command key as meta key */
  Lisp_Object Vmac_command_key_is_meta;
  
  /* convert input from Mac keyboard (assumed to be in Mac Roman coding)
     to this text encoding */
  int mac_keyboard_text_encoding;
--- 11486,11503 ----
  
  Boolean       terminate_flag = false;
  
! /* True if using command key as meta key.  */
  Lisp_Object Vmac_command_key_is_meta;
  
+ /* True if the ctrl and meta keys should be reversed.  */
+ Lisp_Object Vmac_reverse_ctrl_meta;
+ 
+ #if USE_CARBON_EVENTS
+ /* True if the mouse wheel button (i.e. button 4) should map to
+    mouse-2, instead of mouse-3.  */
+ Lisp_Object Vmac_wheel_button_is_mouse_2;
+ #endif
+ 
  /* convert input from Mac keyboard (assumed to be in Mac Roman coding)
     to this text encoding */
  int mac_keyboard_text_encoding;
***************
*** 11577,11589 ****
  Point saved_menu_event_location;
  
  /* Apple Events */
! static void init_required_apple_events(void);
  static pascal OSErr
! do_ae_open_application(const AppleEvent *, AppleEvent *, long);
  static pascal OSErr
! do_ae_print_documents(const AppleEvent *, AppleEvent *, long);
! static pascal OSErr do_ae_open_documents(AppleEvent *, AppleEvent *, long);
! static pascal OSErr do_ae_quit_application(AppleEvent *, AppleEvent *, long);
  
  extern void init_emacs_passwd_dir ();
  extern int emacs_main (int, char **, char **);
--- 11512,11534 ----
  Point saved_menu_event_location;
  
  /* Apple Events */
! static void init_required_apple_events (void);
  static pascal OSErr
! do_ae_open_application (const AppleEvent *, AppleEvent *, long);
  static pascal OSErr
! do_ae_print_documents (const AppleEvent *, AppleEvent *, long);
! static pascal OSErr do_ae_open_documents (AppleEvent *, AppleEvent *, long);
! static pascal OSErr do_ae_quit_application (AppleEvent *, AppleEvent *, long);
! 
! /* Drag and Drop */
! static OSErr init_mac_drag_n_drop ();
! static pascal OSErr mac_do_receive_drag (WindowPtr, void*, DragReference); 
! 
! #if USE_CARBON_EVENTS
! /* Preliminary Support for the OSX Services Menu */
! static OSStatus mac_handle_service_event (EventHandlerCallRef,EventRef,void*);
! static void init_service_handler ();
! #endif
  
  extern void init_emacs_passwd_dir ();
  extern int emacs_main (int, char **, char **);
***************
*** 11592,11597 ****
--- 11537,11640 ----
  extern void initialize_applescript();
  extern void terminate_applescript();
  
+ static unsigned int 
+ #if USE_CARBON_EVENTS
+ mac_to_emacs_modifiers (UInt32 mods)
+ #else
+ mac_to_emacs_modifiers (EventModifiers mods)
+ #endif
+ {
+   unsigned int result = 0;
+   if (mods & macShiftKey)
+     result |= shift_modifier;
+   if (mods & macCtrlKey)
+     result |= ctrl_modifier;
+   if (mods & macMetaKey)
+     result |= meta_modifier;
+   if (NILP (Vmac_command_key_is_meta) && (mods & macAltKey))
+     result |= alt_modifier;
+   return result;
+ }
+ 
+ #if USE_CARBON_EVENTS
+ /* Obtains the event modifiers from the event ref and then calls
+    mac_to_emacs_modifiers.  */
+ static int 
+ mac_event_to_emacs_modifiers (EventRef eventRef) 
+ {
+   UInt32 mods = 0;
+   GetEventParameter (eventRef, kEventParamKeyModifiers, typeUInt32, NULL,
+                   sizeof (UInt32), NULL, &mods);
+   return mac_to_emacs_modifiers (mods);
+ }
+ 
+ /* Given an event ref, return the code to use for the mouse button
+    code in the emacs input_event.  */
+ static int
+ mac_get_mouse_btn (EventRef ref) 
+ {
+   EventMouseButton result = kEventMouseButtonPrimary;
+   GetEventParameter (ref, kEventParamMouseButton, typeMouseButton, NULL,
+                   sizeof (EventMouseButton), NULL, &result);
+   switch (result) 
+     {
+     case kEventMouseButtonPrimary:
+       return 0;
+     case kEventMouseButtonSecondary:
+       return NILP (Vmac_wheel_button_is_mouse_2) ? 2 : 1; 
+     case kEventMouseButtonTertiary:
+     case 4:  /* 4 is the number for the mouse wheel button */
+       return NILP (Vmac_wheel_button_is_mouse_2) ? 1 : 2; 
+     default:
+       return 0;
+     }
+ }
+ 
+ /* 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;
+ }
+ 
+ #endif
  
  static void
  do_get_menus (void)
***************
*** 12019,12024 ****
--- 12062,12074 ----
    SetPort (save_port);
  }
  
+ /* Initialize Drag And Drop to allow files to be dropped onto emacs frames */
+ static OSErr
+ init_mac_drag_n_drop ()
+ {
+   OSErr result = InstallReceiveHandler (mac_do_receive_drag, 0L, NULL);
+   return result;
+ }
  
  /* Intialize AppleEvent dispatcher table for the required events.  */
  void
***************
*** 12092,12097 ****
--- 12142,12243 ----
      abort ();
  }
  
+ #if USE_CARBON_EVENTS
+ 
+ void init_service_handler()
+ {
+   EventTypeSpec specs[] = {{kEventClassService, kEventServiceGetTypes},
+                          {kEventClassService, kEventServiceCopy},
+                          {kEventClassService, kEventServicePaste}};
+   InstallApplicationEventHandler (NewEventHandlerUPP 
(mac_handle_service_event),
+                                 3, specs, NULL, NULL);
+ }
+ 
+ /*
+    MAC_TODO: Check to see if this is called by AEProcessDesc...
+  */
+ OSStatus mac_handle_service_event (EventHandlerCallRef callRef,
+                                  EventRef event, void *data)
+ {
+   OSStatus err = noErr; 
+   switch (GetEventKind (event))
+     {
+     case kEventServiceGetTypes: 
+       {
+       CFMutableArrayRef copyTypes, pasteTypes;
+       CFStringRef type;
+       Boolean selection = true;
+       /*
+         GetEventParameter(event, kEventParamServicePasteTypes,
+         typeCFMutableArrayRef, NULL,
+         sizeof (CFMutableArrayRef), NULL, &pasteTypes);
+       */
+       GetEventParameter(event, kEventParamServiceCopyTypes,
+                         typeCFMutableArrayRef, NULL,
+                         sizeof (CFMutableArrayRef), NULL, &copyTypes);
+       type = CreateTypeStringWithOSType (kScrapFlavorTypeText);
+       if (type) {
+         CFArrayAppendValue (copyTypes, type);
+         //CFArrayAppendValue (pasteTypes, type);
+         CFRelease (type);
+       }
+       }
+     case kEventServiceCopy:
+       {
+       ScrapRef currentScrap, specificScrap;
+       char * buf = "";
+       Size byteCount = 0;
+ 
+       GetCurrentScrap (&currentScrap);
+ 
+       err = GetScrapFlavorSize (currentScrap, kScrapFlavorTypeText, 
&byteCount);
+       if (err == noErr)
+         {
+           void *buffer = xmalloc (byteCount);
+           if (buffer != NULL)
+             {
+               GetEventParameter (event, kEventParamScrapRef, typeScrapRef, 
NULL,
+                                  sizeof (ScrapRef), NULL, &specificScrap);
+             
+               err = GetScrapFlavorData (currentScrap, kScrapFlavorTypeText,
+                                         &byteCount, buffer);
+               if (err == noErr)
+                 PutScrapFlavor (specificScrap, kScrapFlavorTypeText,
+                                 kScrapFlavorMaskNone, byteCount, buffer);
+               xfree (buffer);
+             } 
+         }
+       err = noErr;
+       }
+     case kEventServicePaste:
+       {
+       /*
+       // Get the current location
+         Size     byteCount;
+         ScrapRef specificScrap;
+         GetEventParameter(event, kEventParamScrapRef, typeScrapRef, NULL,
+                         sizeof(ScrapRef), NULL, &specificScrap);
+         err = GetScrapFlavorSize(specificScrap, kScrapFlavorTypeText, 
&byteCount);
+         if (err == noErr) {
+         void * buffer = xmalloc(byteCount);
+         if (buffer != NULL ) {
+           err = GetScrapFlavorData(specificScrap, kScrapFlavorTypeText, 
+                                    &byteCount, buffer);
+           if (err == noErr) {
+             // Actually place in the buffer
+             BLOCK_INPUT;
+             // Get the current "selection" string here
+             UNBLOCK_INPUT;
+           }
+         }
+         xfree(buffer);
+         }
+         */
+       }   
+     }
+   return err;
+ }
+ #endif
  
  /* Open Application Apple Event */
  static pascal OSErr
***************
*** 12187,12192 ****
--- 12333,12415 ----
  }
  
  
+ static pascal OSErr mac_do_receive_drag (WindowPtr window, void 
*handlerRefCon,
+                                        DragReference theDrag)
+ {
+   short items;
+   short index;
+   FlavorFlags theFlags;
+   Point mouse;
+   OSErr result;
+   ItemReference theItem;
+   HFSFlavor data;
+   FSRef fref;
+   Size size = sizeof (HFSFlavor);
+ 
+   drag_and_drop_file_list = Qnil;
+   GetDragMouse (theDrag, &mouse, 0L);
+   CountDragItems (theDrag, &items);
+   for (index = 1; index <= items; index++) 
+     {
+       /* Only handle file references.  */
+       GetDragItemReferenceNumber (theDrag, index, &theItem);
+       result = GetFlavorFlags (theDrag, theItem, flavorTypeHFS, &theFlags);
+       if (result == noErr)
+       {
+ #ifdef MAC_OSX
+         FSRef frref;
+ #else
+         Str255 path_name;
+ #endif
+         Str255 unix_path_name;
+         GetFlavorData (theDrag, theItem, flavorTypeHFS, &data, &size, 0L);
+ #ifdef MAC_OSX
+         /* Use Carbon routines, otherwise it converts the file name
+            to /Macintosh HD/..., which is not correct. */
+         FSpMakeFSRef (&data.fileSpec, &fref);
+         if (! FSRefMakePath (&fref, unix_path_name, sizeof (unix_path_name)));
+ #else
+         if (path_from_vol_dir_name (path_name, 255, data.fileSpec.vRefNum,
+                                     data.fileSpec.parID, data.fileSpec.name) 
&&
+             mac_to_posix_pathname (path_name, unix_path_name, 255))
+ #endif
+             drag_and_drop_file_list = Fcons (build_string (unix_path_name),
+                                            drag_and_drop_file_list);
+       }
+       else
+       return;
+     }
+   /* If there are items in the list, construct an event and post it to
+      the queue like an interrupt using kbd_buffer_store_event.  */
+   if (!NILP (drag_and_drop_file_list)) 
+     {
+       struct input_event event;
+       Lisp_Object frame;
+       struct frame *f = ((mac_output *) GetWRefCon(window))->mFP;
+       SetPort (GetWindowPort (window));
+       GlobalToLocal (&mouse);
+ 
+       event.kind = DRAG_N_DROP_EVENT;
+       event.code = 0;
+       event.modifiers = 0;
+       event.timestamp = TickCount () * (1000 / 60);
+       XSETINT (event.x, mouse.h);
+       XSETINT (event.y, mouse.v);
+       XSETFRAME (frame, f);
+       event.frame_or_window = Fcons (frame, drag_and_drop_file_list);
+       event.arg = Qnil;
+       /* Post to the interrupt queue */
+       kbd_buffer_store_event (&event);
+       /* MAC_TODO: Mimic behavior of windows by switching contexts to Emacs */
+       {
+       ProcessSerialNumber psn;
+       GetCurrentProcess (&psn);
+       SetFrontProcess (&psn);
+       }
+     }
+ }
+ 
+ 
  /* Print Document Apple Event */
  static pascal OSErr
  do_ae_print_documents (const AppleEvent *pAE, AppleEvent *reply, long refcon)
***************
*** 12334,12340 ****
  int
  XTread_socket (int sd, struct input_event *bufp, int numchars, int expected)
  {
!   int count = 0;
    EventRecord er;
    int the_modifiers;
    EventMask event_mask;
--- 12557,12568 ----
  int
  XTread_socket (int sd, struct input_event *bufp, int numchars, int expected)
  {
!   int count = 0; 
! #if USE_CARBON_EVENTS
!   OSStatus rneResult;
!   EventRef eventRef;
!   EventMouseButton mouseBtn;
! #endif
    EventRecord er;
    int the_modifiers;
    EventMask event_mask;
***************
*** 12380,12386 ****
--- 12608,12659 ----
    if (NILP (Fboundp (Qmac_ready_for_drag_n_drop)))
      event_mask -= highLevelEventMask;
  
+ #if USE_CARBON_EVENTS
+   rneResult = ReceiveNextEvent (0, NULL, 
+                               expected ? TicksToEventTime(app_sleep_time) : 0,
+                               true, &eventRef);
+   if (!rneResult)
+     {
+       /* Handle new events */
+       if (!mac_convert_event_ref (eventRef, &er)) 
+       switch (GetEventClass (eventRef)) 
+         {
+         case kEventClassMouse:
+           if (GetEventKind (eventRef) == kEventMouseWheelMoved) 
+             {
+               SInt32 delta;
+               Point point;
+               WindowPtr window_ptr = FrontWindow ();
+               struct mac_output *mwp = (mac_output *) GetWRefCon (window_ptr);
+               GetEventParameter(eventRef, kEventParamMouseWheelDelta,
+                                 typeSInt32, NULL, sizeof (SInt32),
+                                 NULL, &delta);
+               GetEventParameter(eventRef, kEventParamMouseLocation,
+                                 typeQDPoint, NULL, sizeof (Point),
+                                 NULL, &point);
+               bufp->kind = MOUSE_WHEEL_EVENT;
+               bufp->code = delta;
+               bufp->modifiers = mac_event_to_emacs_modifiers(eventRef);
+               SetPort (GetWindowPort (window_ptr));
+               GlobalToLocal (&point);
+               XSETINT (bufp->x, point.h);
+               XSETINT (bufp->y, point.v);
+               XSETFRAME (bufp->frame_or_window, mwp->mFP);
+               bufp->timestamp = EventTimeToTicks (GetEventTime 
(eventRef))*(1000/60);
+               count++;
+             }
+           else
+             SendEventToEventTarget (eventRef, GetEventDispatcherTarget ());
+ 
+           break;
+         default:
+           /* Send the event to the appropriate receiver.  */
+           SendEventToEventTarget (eventRef, GetEventDispatcherTarget ());
+         }
+       else
+ #else
    if (WaitNextEvent (event_mask, &er, (expected ? app_sleep_time : 0L), NULL))
+ #endif /* USE_CARBON_EVENTS */
      switch (er.what)
        {
        case mouseDown:
***************
*** 12389,12394 ****
--- 12662,12672 ----
          WindowPtr window_ptr = FrontWindow ();
          SInt16 part_code;
  
+ #if USE_CARBON_EVENTS
+         /* This is needed to correctly */
+         SendEventToEventTarget (eventRef, GetEventDispatcherTarget ());
+ #endif
+ 
            if (mouse_tracking_in_progress == mouse_tracking_scroll_bar
              && er.what == mouseUp)
              {
***************
*** 12404,12414 ****
  
              GlobalToLocal (&mouse_loc);
                  
              bufp->code = 0;  /* only one mouse button */
                bufp->kind = SCROLL_BAR_CLICK_EVENT;
                bufp->frame_or_window = tracked_scroll_bar->window;
                bufp->part = scroll_bar_handle;
!               bufp->modifiers = up_modifier;
              bufp->timestamp = er.when * (1000 / 60);
                /* ticks to milliseconds */
  
--- 12682,12701 ----
  
              GlobalToLocal (&mouse_loc);
                  
+ #if USE_CARBON_EVENTS
+             bufp->code = mac_get_mouse_btn (eventRef);
+ #else
              bufp->code = 0;  /* only one mouse button */
+ #endif
                bufp->kind = SCROLL_BAR_CLICK_EVENT;
                bufp->frame_or_window = tracked_scroll_bar->window;
                bufp->part = scroll_bar_handle;
! #if USE_CARBON_EVENTS
!             bufp->modifiers = mac_event_to_emacs_modifiers (eventRef);
! #else
!             bufp->modifiers = mac_to_emacs_modifiers (er.modifiers);
! #endif
!               bufp->modifiers |= up_modifier;
              bufp->timestamp = er.when * (1000 / 60);
                /* ticks to milliseconds */
  
***************
*** 12461,12467 ****
--- 12748,12759 ----
  #else
                  control_part_code = FindControl (mouse_loc, window_ptr, &ch);
  #endif                  
+ 
+ #if USE_CARBON_EVENTS
+                 bufp->code = mac_get_mouse_btn (eventRef);
+ #else           
                  bufp->code = 0;  /* only one mouse button */
+ #endif
                  XSETINT (bufp->x, mouse_loc.h);
                  XSETINT (bufp->y, mouse_loc.v);
                  bufp->timestamp = er.when * (1000 / 60);
***************
*** 12501,12513 ****
                        mouse_tracking_in_progress = mouse_tracking_none;
                    }
                                
                  switch (er.what)
                    {
                    case mouseDown:
!                     bufp->modifiers = down_modifier;
                      break;
                    case mouseUp:
!                     bufp->modifiers = up_modifier;
                      break;
                    }
                                                                
--- 12793,12811 ----
                        mouse_tracking_in_progress = mouse_tracking_none;
                    }
                                
+ #if USE_CARBON_EVENTS
+                 bufp->modifiers = mac_event_to_emacs_modifiers (eventRef);
+ #else
+                 bufp->modifiers = mac_to_emacs_modifiers (er.modifiers);
+ #endif
+ 
                  switch (er.what)
                    {
                    case mouseDown:
!                     bufp->modifiers |= down_modifier;
                      break;
                    case mouseUp:
!                     bufp->modifiers |= up_modifier;
                      break;
                    }
                                                                
***************
*** 12559,12564 ****
--- 12857,12865 ----
        case updateEvt:
        case osEvt:
        case activateEvt:
+ #if USE_CARBON_EVENTS
+       SendEventToEventTarget (eventRef, GetEventDispatcherTarget ());
+ #endif        
        do_events (&er);
        break;
        
***************
*** 12579,12589 ****
            {
              bufp->code = 0xff00 | xkeysym;
              bufp->kind = NON_ASCII_KEYSTROKE_EVENT;
!           }         
          else
            {
!             if (er.modifiers
!                 & (NILP (Vmac_command_key_is_meta) ? optionKey : cmdKey))
                {
                  /* This code comes from Keyboard Resource, Appendix
                     C of IM - Text.  This is necessary since shift is
--- 12880,12900 ----
            {
              bufp->code = 0xff00 | xkeysym;
              bufp->kind = NON_ASCII_KEYSTROKE_EVENT;
!           }      
!         else if (!NILP (Vmac_reverse_ctrl_meta) && (er.modifiers & 
controlKey))
!           {
!             /* This is a special case to deal with converting from
!                a control character to non-control character */
!             int new_modifiers = er.modifiers & ~controlKey;
!             int new_keycode = keycode | new_modifiers;              
!             Ptr kchr_ptr = (Ptr) GetScriptManagerVariable (smKCHRCache);
!             unsigned long some_state = 0;
!             bufp->code = KeyTranslate (kchr_ptr, new_keycode, &some_state) & 
0xff;
!             bufp->kind = ASCII_KEYSTROKE_EVENT;
!           }
          else
            {
!             if (er.modifiers & macMetaKey)
                {
                  /* This code comes from Keyboard Resource, Appendix
                     C of IM - Text.  This is necessary since shift is
***************
*** 12597,12602 ****
--- 12908,12923 ----
                  bufp->code = KeyTranslate (kchr_ptr, new_keycode,
                                             &some_state) & 0xff;
                }
+ #if USE_CARBON_EVENTS
+             else if (er.modifiers & cmdKey &&
+                      (NILP (Vmac_command_key_is_meta)))
+               {
+                 /* If this is a command key (and we are not overriding it),
+                    send back to the operating system  */
+                 SendEventToEventTarget (eventRef, GetEventDispatcherTarget 
());
+                 break;
+               }
+ #endif
              else
                bufp->code = er.message & charCodeMask;
              bufp->kind = ASCII_KEYSTROKE_EVENT;
***************
*** 12654,12677 ****
                }
          }
  
!       the_modifiers = 0;
!       if (er.modifiers & shiftKey)
!         the_modifiers |= shift_modifier;
!       if (er.modifiers & controlKey)
!         the_modifiers |= ctrl_modifier;
!       /* Use option or command key as meta depending on value of
!          mac-command-key-is-meta.  */
!       if (er.modifiers
!           & (NILP (Vmac_command_key_is_meta) ? optionKey : cmdKey))
!         the_modifiers |= meta_modifier;
!  
!       /* If the Mac option key is meta, then make Emacs recognize
!          the Mac command key as alt.  */
!       if (NILP (Vmac_command_key_is_meta) && (er.modifiers & cmdKey))
!         the_modifiers |= alt_modifier;
! 
!       bufp->modifiers = the_modifiers;
!                               
        {
          mac_output *mwp
            = (mac_output *) GetWRefCon (FrontNonFloatingWindow ());
--- 12975,12986 ----
                }
          }
  
! #if USE_CARBON_EVENTS
!       bufp->modifiers = mac_event_to_emacs_modifiers (eventRef);
! #else
!       bufp->modifiers = mac_to_emacs_modifiers (er.modifiers);
! #endif
!       
        {
          mac_output *mwp
            = (mac_output *) GetWRefCon (FrontNonFloatingWindow ());
***************
*** 12706,12712 ****
              bufp->code = 0;
              bufp->timestamp = er.when * (1000 / 60);
              /* ticks to milliseconds */
!             bufp->modifiers = 0;
  
              XSETINT (bufp->x, 0);
              XSETINT (bufp->y, 0);
--- 13015,13025 ----
              bufp->code = 0;
              bufp->timestamp = er.when * (1000 / 60);
              /* ticks to milliseconds */
! #if USE_CARBON_EVENTS
!           bufp->modifiers = mac_event_to_emacs_modifiers (eventRef);
! #else
!           bufp->modifiers = mac_to_emacs_modifiers (er.modifiers);
! #endif
  
              XSETINT (bufp->x, 0);
              XSETINT (bufp->y, 0);
***************
*** 12732,12741 ****
              
              count++;
            }
-         
        default:
        break;
        }
  
    /* If the focus was just given to an autoraising frame,
       raise it now.  */
--- 13045,13057 ----
              
              count++;
            }
        default:
        break;
        }
+ #if USE_CARBON_EVENTS
+       ReleaseEvent (eventRef);
+     }
+ #endif
  
    /* If the focus was just given to an autoraising frame,
       raise it now.  */
***************
*** 12847,12853 ****
      if (!(mwp->mWP = GetNewCWindow (WINDOW_RESOURCE, NULL, (WindowPtr) -1)))
        abort ();
    
- 
    SetWRefCon (mwp->mWP, (long) mwp);
      /* so that update events can find this mac_output struct */
    mwp->mFP = fp;  /* point back to emacs frame */
--- 13163,13168 ----
***************
*** 13183,13188 ****
--- 13498,13509 ----
  #if TARGET_API_MAC_CARBON
    init_required_apple_events ();
  
+   init_mac_drag_n_drop ();
+ 
+ #if USE_CARBON_EVENTS
+   init_service_handler ();
+ #endif
+ 
    DisableMenuCommand (NULL, kHICommandQuit);
  #endif
  }
***************
*** 13252,13257 ****
--- 13573,13591 ----
      doc: /* Non-nil means that the command key is used as the Emacs meta key.
  Otherwise the option key is used.  */);
    Vmac_command_key_is_meta = Qt;
+ 
+   DEFVAR_LISP ("mac-reverse-ctrl-meta", &Vmac_reverse_ctrl_meta,
+     doc: /* Non-nil means that the control and meta keys are reversed.  This 
is
+           useful for non-standard keyboard layouts.  */);
+   Vmac_reverse_ctrl_meta = Qnil;
+ 
+ #if USE_CARBON_EVENTS
+   DEFVAR_LISP ("mac-wheel-button-is-mouse-2", &Vmac_wheel_button_is_mouse_2,
+    doc: /* Non-nil means that the wheel button will be treated as mouse-2 and
+ the right click will be mouse-3.
+ Otherwise, the right click will be mouse-2 and the wheel button mouse-3.*/);
+   Vmac_wheel_button_is_mouse_2 = Qt;
+ #endif
  
    DEFVAR_INT ("mac-keyboard-text-encoding", &mac_keyboard_text_encoding,
      doc: /* One of the Text Encoding Base constant values defined in the



reply via email to

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