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: Fri, 09 Dec 2005 20:49:53 -0500

Index: emacs/src/macterm.c
diff -c emacs/src/macterm.c:1.145 emacs/src/macterm.c:1.146
*** emacs/src/macterm.c:1.145   Thu Nov 24 08:20:16 2005
--- emacs/src/macterm.c Sat Dec 10 01:49:53 2005
***************
*** 622,628 ****
        ByteCount sizes[] = {sizeof (ATSLineLayoutOptions)};
        static ATSLineLayoutOptions line_layout =
  #if MAC_OS_X_VERSION_MAX_ALLOWED >= 1020
!       kATSLineDisableAllLayoutOperations  | kATSLineUseDeviceMetrics
  #else
        kATSLineIsDisplayOnly | kATSLineFractDisable
  #endif
--- 622,628 ----
        ByteCount sizes[] = {sizeof (ATSLineLayoutOptions)};
        static ATSLineLayoutOptions line_layout =
  #if MAC_OS_X_VERSION_MAX_ALLOWED >= 1020
!       kATSLineDisableAllLayoutOperations | kATSLineUseDeviceMetrics
  #else
        kATSLineIsDisplayOnly | kATSLineFractDisable
  #endif
***************
*** 8127,8146 ****
     Carbon/Apple event handlers.  */
  static struct input_event *read_socket_inev = NULL;
  
- /* Set in term/mac-win.el to indicate that event loop can now generate
-    drag and drop events.  */
- Lisp_Object Qmac_ready_for_drag_n_drop;
- 
  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);
  
  #if TARGET_API_MAC_CARBON
  /* Drag and Drop */
--- 8127,8144 ----
     Carbon/Apple event handlers.  */
  static struct input_event *read_socket_inev = NULL;
  
  Point saved_menu_event_location;
  
  /* Apple Events */
! #if USE_CARBON_EVENTS
! static Lisp_Object Qhicommand;
! #endif
! extern int mac_ready_for_apple_events;
! extern Lisp_Object Qundefined;
! extern void init_apple_event_handler P_ ((void));
! extern void mac_find_apple_event_spec P_ ((AEEventClass, AEEventID,
!                                          Lisp_Object *, Lisp_Object *,
!                                          Lisp_Object *));
  
  #if TARGET_API_MAC_CARBON
  /* Drag and Drop */
***************
*** 8150,8160 ****
  static DragReceiveHandlerUPP mac_do_receive_dragUPP = NULL;
  #endif
  
- static Lisp_Object Qapplication, Qabout;
  #if USE_CARBON_EVENTS
  #ifdef MAC_OSX
  extern void init_service_handler ();
! static Lisp_Object Qpreferences, Qservices, Qpaste, Qperform;
  #endif
  /* Window Event Handler */
  static pascal OSStatus mac_handle_window_event (EventHandlerCallRef,
--- 8148,8157 ----
  static DragReceiveHandlerUPP mac_do_receive_dragUPP = NULL;
  #endif
  
  #if USE_CARBON_EVENTS
  #ifdef MAC_OSX
  extern void init_service_handler ();
! static Lisp_Object Qservices, Qpaste, Qperform;
  #endif
  /* Window Event Handler */
  static pascal OSStatus mac_handle_window_event (EventHandlerCallRef,
***************
*** 8699,8877 ****
    x_real_positions (f, &f->left_pos, &f->top_pos);
  }
  
! /* Intialize AppleEvent dispatcher table for the required events.  */
! void
! init_required_apple_events ()
! {
!   OSErr err;
!   long result;
! 
!   /* Make sure we have apple events before starting.  */
!   err = Gestalt (gestaltAppleEventsAttr, &result);
!   if (err != noErr)
!     abort ();
! 
!   if (!(result & (1 << gestaltAppleEventsPresent)))
!     abort ();
! 
! #if TARGET_API_MAC_CARBON
!   err = AEInstallEventHandler(kCoreEventClass, kAEOpenApplication,
!                             NewAEEventHandlerUPP
!                             ((AEEventHandlerProcPtr) do_ae_open_application),
!                               0L, false);
! #else
!   err = AEInstallEventHandler(kCoreEventClass, kAEOpenApplication,
!                             NewAEEventHandlerProc
!                             ((AEEventHandlerProcPtr) do_ae_open_application),
!                               0L, false);
! #endif
!   if (err != noErr)
!     abort ();
! 
! #if TARGET_API_MAC_CARBON
!   err = AEInstallEventHandler(kCoreEventClass, kAEOpenDocuments,
!                               NewAEEventHandlerUPP
!                             ((AEEventHandlerProcPtr) do_ae_open_documents),
!                               0L, false);
! #else
!   err = AEInstallEventHandler(kCoreEventClass, kAEOpenDocuments,
!                               NewAEEventHandlerProc
!                             ((AEEventHandlerProcPtr) do_ae_open_documents),
!                               0L, false);
! #endif
!   if (err != noErr)
!     abort ();
! 
! #if TARGET_API_MAC_CARBON
!   err = AEInstallEventHandler(kCoreEventClass, kAEPrintDocuments,
!                               NewAEEventHandlerUPP
!                             ((AEEventHandlerProcPtr) do_ae_print_documents),
!                               0L, false);
! #else
!   err = AEInstallEventHandler(kCoreEventClass, kAEPrintDocuments,
!                               NewAEEventHandlerProc
!                             ((AEEventHandlerProcPtr) do_ae_print_documents),
!                               0L, false);
! #endif
!   if (err != noErr)
!     abort ();
! 
! #if TARGET_API_MAC_CARBON
!   err = AEInstallEventHandler(kCoreEventClass, kAEQuitApplication,
!                               NewAEEventHandlerUPP
!                             ((AEEventHandlerProcPtr) do_ae_quit_application),
!                               0L, false);
! #else
!   err = AEInstallEventHandler(kCoreEventClass, kAEQuitApplication,
!                               NewAEEventHandlerProc
!                             ((AEEventHandlerProcPtr) do_ae_quit_application),
!                               0L, false);
! #endif
!   if (err != noErr)
!     abort ();
! }
! 
! void
! mac_store_application_menu_event (event)
! #if USE_CARBON_EVENTS
!      EventRef event;
! #else
!      UInt32 event;
! #endif
  {
    struct input_event buf;
!   Lisp_Object frame, entry;
! 
!   EVENT_INIT (buf);
  
!   XSETFRAME (frame, mac_focus_frame (&one_mac_display_info));
!   buf.kind = MENU_BAR_EVENT;
!   buf.frame_or_window = frame;
!   buf.arg = frame;
!   kbd_buffer_store_event (&buf);
! 
!   buf.arg = Qapplication;
!   kbd_buffer_store_event (&buf);
! 
! #if USE_CARBON_EVENTS
!   switch (GetEventClass (event))
      {
! #ifdef MAC_OSX
!     case kEventClassService:
!       buf.arg = Qservices;
!       kbd_buffer_store_event (&buf);
!       switch (GetEventKind (event))
!       {
!       case kEventServicePaste:
!         entry = Qpaste;
!         break;
  
!       case kEventServicePerform:
!         {
!           OSErr err;
!           CFStringRef message;
! 
!           err = GetEventParameter (event, kEventParamServiceMessageName,
!                                    typeCFStringRef, NULL,
!                                    sizeof (CFStringRef), NULL, &message);
!           buf.arg = Qperform;
!           kbd_buffer_store_event (&buf);
!           if (err == noErr && message)
!             entry = intern (SDATA (cfstring_to_lisp (message)));
!           else
!             entry = Qnil;
!         }
!         break;
  
!       default:
!         abort ();
!       }
!       break;
! #endif        /* MAC_OSX */
!     case kEventClassCommand:
!       {
!       HICommand command;
  
!       GetEventParameter(event, kEventParamDirectObject, typeHICommand,
!                         NULL, sizeof (HICommand), NULL, &command);
!       switch (command.commandID)
!         {
!         case kHICommandAbout:
!           entry = Qabout;
!           break;
! #ifdef MAC_OSX
!         case kHICommandPreferences:
!           entry = Qpreferences;
!           break;
! #endif /* MAC_OSX */
!         case kHICommandQuit:
!           entry = Qquit;
!           break;
!         default:
!           abort ();
!         }
!       }
!       break;
  
!     default:
!       abort ();
!     }
! #else  /* USE_CARBON_EVENTS */
!   switch (event)
!     {
!     case kHICommandAbout:
!       entry = Qabout;
!       break;
!     case kHICommandQuit:
!       entry = Qquit;
!       break;
!     default:
!       abort ();
!     }
! #endif
  
!   buf.arg = entry;
!   kbd_buffer_store_event (&buf);
  }
  
  #if USE_CARBON_EVENTS
--- 8696,8744 ----
    x_real_positions (f, &f->left_pos, &f->top_pos);
  }
  
! OSErr
! mac_store_apple_event (class, id, desc)
!      Lisp_Object class, id;
!      const AEDesc *desc;
  {
+   OSErr err = noErr;
    struct input_event buf;
!   AEDesc *desc_copy;
  
!   desc_copy = xmalloc (sizeof (AEDesc));
!   if (desc_copy == NULL)
!     err = memFullErr;
!   else
!     err = AEDuplicateDesc (desc, desc_copy);
!   if (err == noErr)
      {
!       EVENT_INIT (buf);
  
!       buf.kind = MAC_APPLE_EVENT;
!       buf.x = class;
!       buf.y = id;
!       buf.code = (int)desc_copy;
!       XSETFRAME (buf.frame_or_window,
!                mac_focus_frame (&one_mac_display_info));
!       buf.arg = Qnil;
!       kbd_buffer_store_event (&buf);
!     }
  
!   return err;
! }
  
! Lisp_Object
! mac_make_lispy_event_code (code)
!      int code;
! {
!   AEDesc *desc = (AEDesc *)code;
!   Lisp_Object obj;
  
!   obj = mac_aedesc_to_lisp (desc);
!   AEDisposeDesc (desc);
!   xfree (desc);
  
!   return obj;
  }
  
  #if USE_CARBON_EVENTS
***************
*** 8881,8908 ****
       EventRef event;
       void *data;
  {
    HICommand command;
!   OSErr result;
  
!   GetEventParameter(event, kEventParamDirectObject, typeHICommand, NULL,
!                   sizeof (HICommand), NULL, &command);
  
!   switch (command.commandID)
!     {
!     case kHICommandAbout:
! #ifdef MAC_OSX
!     case kHICommandPreferences:
! #endif        /* MAC_OSX */
!       result = CallNextEventHandler (next_handler, event);
!       if (result != eventNotHandledErr)
!       return result;
  
!       mac_store_application_menu_event (event);
!       return noErr;
  
!     default:
!       break;
!     }
  
    return eventNotHandledErr;
  }
--- 8748,8796 ----
       EventRef event;
       void *data;
  {
+   OSStatus result;
+   OSErr err;
    HICommand command;
!   Lisp_Object class_key, id_key, binding;
  
!   result = CallNextEventHandler (next_handler, event);
!   if (result != eventNotHandledErr)
!     return result;
  
!   GetEventParameter (event, kEventParamDirectObject, typeHICommand, NULL,
!                    sizeof (HICommand), NULL, &command);
  
!   if (command.commandID == 0)
!     return eventNotHandledErr;
  
!   /* A HICommand event is mapped to an Apple event whose event class
!      symbol is `hicommand' and event ID is its command ID.  */
!   class_key = Qhicommand;
!   mac_find_apple_event_spec (0, command.commandID,
!                            &class_key, &id_key, &binding);
!   if (!NILP (binding) && !EQ (binding, Qundefined))
!     if (INTEGERP (binding))
!       return XINT (binding);
!     else
!       {
!       AppleEvent apple_event;
!       UInt32 modifiers;
!       static EventParamName names[] = {kEventParamDirectObject,
!                                        kEventParamKeyModifiers};
!       static EventParamType types[] = {typeHICommand,
!                                        typeUInt32};
!       static UInt32 sizes[] = {sizeof (HICommand),
!                                sizeof (UInt32)};
!       err = create_apple_event_from_event_ref (event, 2, names, types,
!                                                sizes, &apple_event);
!       if (err == noErr)
!         {
!           err = mac_store_apple_event (class_key, id_key, &apple_event);
!           AEDisposeDesc (&apple_event);
!         }
!       if (err == noErr)
!         return noErr;
!       }
  
    return eventNotHandledErr;
  }
***************
*** 9064,9069 ****
--- 8952,9003 ----
  
    return eventNotHandledErr;
  }
+ 
+ #ifdef MAC_OSX
+ OSErr
+ mac_store_services_event (event)
+      EventRef event;
+ {
+   OSErr err;
+   AppleEvent apple_event;
+   Lisp_Object id_key;
+ 
+   switch (GetEventKind (event))
+     {
+     case kEventServicePaste:
+       id_key = Qpaste;
+       err = create_apple_event_from_event_ref (event, 0, NULL,
+                                              NULL, NULL, &apple_event);
+       break;
+ 
+     case kEventServicePerform:
+       {
+       static EventParamName names[] = {kEventParamServiceMessageName,
+                                        kEventParamServiceUserData};
+       static EventParamType types[] = {typeCFStringRef,
+                                        typeCFStringRef};
+       static UInt32 sizes[] = {sizeof (CFStringRef),
+                                sizeof (CFStringRef)};
+ 
+       id_key = Qperform;
+       err = create_apple_event_from_event_ref (event, 2, names, types,
+                                                sizes, &apple_event);
+       }
+       break;
+ 
+     default:
+       abort ();
+     }
+ 
+   if (err == noErr)
+     {
+       err = mac_store_apple_event (Qservices, id_key, &apple_event);
+       AEDisposeDesc (&apple_event);
+     }
+ 
+   return err;
+ }
+ #endif        /* MAC_OSX */
  #endif        /* USE_CARBON_EVENTS */
  
  
***************
*** 9122,9280 ****
  #endif
  }
  
- /* Open Application Apple Event */
- static pascal OSErr
- do_ae_open_application(const AppleEvent *pae, AppleEvent *preply, long 
prefcon)
- {
-   return noErr;
- }
- 
- 
- /* Called when we receive an AppleEvent with an ID of
-    "kAEOpenDocuments".  This routine gets the direct parameter,
-    extracts the FSSpecs in it, and puts their names on a list.  */
- #pragma options align=mac68k
- typedef struct SelectionRange {
-   short unused1; // 0 (not used)
-   short lineNum; // line to select (<0 to specify range)
-   long startRange; // start of selection range (if line < 0)
-   long endRange; // end of selection range (if line < 0)
-   long unused2; // 0 (not used)
-   long theDate; // modification date/time
- } SelectionRange;
- #pragma options align=reset
- 
- static pascal OSErr
- do_ae_open_documents(AppleEvent *message, AppleEvent *reply, long refcon)
- {
-   OSErr err, err2;
-   AEDesc the_desc;
-   AEKeyword keyword;
-   DescType actual_type;
-   Size actual_size;
-   SelectionRange position;
-   Lisp_Object file_list = Qnil;
- 
-   xassert (read_socket_inev);
- 
-   err = AEGetParamDesc (message, keyDirectObject, typeAEList, &the_desc);
-   if (err != noErr)
-     goto descriptor_error_exit;
- 
-   err = AEGetParamPtr (message, keyAEPosition, typeChar, &actual_type, 
&position, sizeof(SelectionRange), &actual_size);
-   if (err == noErr)
-     file_list = Fcons (list3 (make_number (position.lineNum + 1),
-                             make_number (position.startRange + 1),
-                             make_number (position.endRange + 1)),
-                      file_list);
- 
-   /* Check to see that we got all of the required parameters from the
-      event descriptor.  For an 'odoc' event this should just be the
-      file list.  */
-   err = AEGetAttributePtr(message, keyMissedKeywordAttr, typeWildCard,
-                         &actual_type, (Ptr) &keyword,
-                           sizeof (keyword), &actual_size);
-   /* No error means that we found some unused parameters.
-      errAEDescNotFound means that there are no more parameters.  If we
-      get an error code other than that, flag it.  */
-   if ((err == noErr) || (err != errAEDescNotFound))
-     {
-       err = errAEEventNotHandled;
-       goto error_exit;
-     }
-   err = noErr;
- 
-   /* Got all the parameters we need.  Now, go through the direct
-      object list and parse it up.  */
-   {
-     long num_files_to_open;
- 
-     err = AECountItems (&the_desc, &num_files_to_open);
-     if (err == noErr)
-       {
-         int i;
- 
-         /* AE file list is one based so just use that for indexing here.  */
-         for (i = 1; i <= num_files_to_open; i++)
-         {
-           char unix_path_name[MAXPATHLEN];
- #ifdef MAC_OSX
-           FSRef fref;
- 
-           err = AEGetNthPtr (&the_desc, i, typeFSRef, &keyword,
-                              &actual_type, &fref, sizeof (FSRef),
-                              &actual_size);
-           if (err != noErr || actual_type != typeFSRef)
-             continue;
- 
-           if (FSRefMakePath (&fref, unix_path_name, sizeof (unix_path_name))
-               == noErr)
- #else
-           FSSpec fs;
- 
-           err = AEGetNthPtr(&the_desc, i, typeFSS, &keyword, &actual_type,
-                             (Ptr) &fs, sizeof (fs), &actual_size);
-           if (err != noErr) continue;
- 
-           if (fsspec_to_posix_pathname (&fs, unix_path_name,
-                                         sizeof (unix_path_name) - 1) == noErr)
- #endif
-             /* x-dnd functions expect undecoded filenames.  */
-             file_list = Fcons (make_unibyte_string (unix_path_name,
-                                                     strlen (unix_path_name)),
-                                file_list);
-         }
-       }
- 
-     /* Build a DRAG_N_DROP_EVENT type event as is done in
-        constuct_drag_n_drop in w32term.c.  */
-     if (!NILP (file_list))
-       {
-       struct frame *f = mac_focus_frame (&one_mac_display_info);
-       WindowPtr wp;
-       Lisp_Object frame;
- 
-       read_socket_inev->kind = DRAG_N_DROP_EVENT;
-       read_socket_inev->code = 0;
-       read_socket_inev->modifiers = 0;
- 
-       XSETINT (read_socket_inev->x, 0);
-       XSETINT (read_socket_inev->y, 0);
- 
-       XSETFRAME (frame, f);
-       read_socket_inev->frame_or_window = Fcons (frame, file_list);
- 
- #if 0
-       /* Regardless of whether Emacs was suspended or in the
-          foreground, ask it to redraw its entire screen.  Otherwise
-          parts of the screen can be left in an inconsistent
-          state.  */
-       wp = FRAME_MAC_WINDOW (f);
-       if (wp)
- #if TARGET_API_MAC_CARBON
-         {
-           Rect r;
- 
-           GetWindowPortBounds (wp, &r);
-           InvalWindowRect (wp, &r);
-         }
- #else /* not TARGET_API_MAC_CARBON */
-       InvalRect (&(wp->portRect));
- #endif /* not TARGET_API_MAC_CARBON */
- #endif
-       }
-   }
- 
- error_exit:
-   /* Nuke the coerced file list in any case */
-   err2 = AEDisposeDesc(&the_desc);
- 
- descriptor_error_exit:
-   /* InvalRect(&(gFrontMacWindowP->mWP->portRect)); */
-   return err;
- }
- 
- 
  #if TARGET_API_MAC_CARBON
  static pascal OSErr
  mac_do_track_drag (DragTrackingMessage message, WindowPtr window,
--- 9056,9061 ----
***************
*** 9429,9472 ****
  #endif
  
  
- /* Print Document Apple Event */
- static pascal OSErr
- do_ae_print_documents (const AppleEvent *pAE, AppleEvent *reply, long refcon)
- {
-   return errAEEventNotHandled;
- }
- 
- 
- static pascal OSErr
- do_ae_quit_application (AppleEvent* message, AppleEvent *reply, long refcon)
- {
- #if USE_CARBON_EVENTS
-   OSErr err;
-   EventRef event = NULL;
-   static const HICommand quit_command = {kEventAttributeNone, kHICommandQuit};
- 
-   err = CreateEvent (NULL, kEventClassCommand, kEventCommandProcess, 0,
-                    kEventAttributeUserEvent, &event);
-   if (err == noErr)
-     err = SetEventParameter (event, kEventParamDirectObject, typeHICommand,
-                            sizeof (HICommand), &quit_command);
-   if (err == noErr)
-     mac_store_application_menu_event (event);
-   if (event)
-     ReleaseEvent (event);
- 
-   if (err == noErr)
-     return noErr;
-   else
-     return errAEEventNotHandled;
- #else
-   mac_store_application_menu_event (kHICommandQuit);
- 
-   return noErr;
- #endif
- }
- 
- 
  #if __profile__
  void
  profiler_exit_proc ()
--- 9210,9215 ----
***************
*** 9520,9526 ****
  
    initialize_applescript ();
  
!   init_required_apple_events ();
  
    {
      char **argv;
--- 9263,9269 ----
  
    initialize_applescript ();
  
!   init_apple_event_handler ();
  
    {
      char **argv;
***************
*** 9724,9730 ****
      mouse_region = NewRgn ();
  
    event_mask = everyEvent;
!   if (NILP (Fboundp (Qmac_ready_for_drag_n_drop)))
      event_mask -= highLevelEventMask;
  
    current_tick = TickCount ();
--- 9467,9473 ----
      mouse_region = NewRgn ();
  
    event_mask = everyEvent;
!   if (!mac_ready_for_apple_events)
      event_mask -= highLevelEventMask;
  
    current_tick = TickCount ();
***************
*** 10891,10897 ****
    BLOCK_INPUT;
  
  #if TARGET_API_MAC_CARBON
-   init_required_apple_events ();
  
  #if USE_CARBON_EVENTS
  #ifdef MAC_OSX
--- 10634,10639 ----
***************
*** 10906,10911 ****
--- 10648,10655 ----
  #endif        /* USE_CARBON_EVENTS */
  
  #ifdef MAC_OSX
+   init_apple_event_handler ();
+ 
    if (!inhibit_window_system)
      MakeMeTheFrontProcess ();
  #endif
***************
*** 10936,10950 ****
    Fput (Qhyper,   Qmodifier_value, make_number (hyper_modifier));
    Fput (Qsuper,   Qmodifier_value, make_number (super_modifier));
  
!   Qapplication = intern ("application");  staticpro (&Qapplication);
!   Qabout       = intern ("about");      staticpro (&Qabout);
! 
! #if USE_CARBON_EVENTS && defined (MAC_OSX)
!   Qpreferences = intern ("preferences");  staticpro (&Qpreferences);
    Qservices    = intern ("services");   staticpro (&Qservices);
    Qpaste       = intern ("paste");      staticpro (&Qpaste);
    Qperform     = intern ("perform");    staticpro (&Qperform);
  #endif
  
  #ifdef MAC_OSX
    Fprovide (intern ("mac-carbon"), Qnil);
--- 10680,10693 ----
    Fput (Qhyper,   Qmodifier_value, make_number (hyper_modifier));
    Fput (Qsuper,   Qmodifier_value, make_number (super_modifier));
  
! #if USE_CARBON_EVENTS
!   Qhicommand   = intern ("hicommand");    staticpro (&Qhicommand);
! #ifdef MAC_OSX
    Qservices    = intern ("services");   staticpro (&Qservices);
    Qpaste       = intern ("paste");      staticpro (&Qpaste);
    Qperform     = intern ("perform");    staticpro (&Qperform);
  #endif
+ #endif
  
  #ifdef MAC_OSX
    Fprovide (intern ("mac-carbon"), Qnil);
***************
*** 10952,10960 ****
  
    staticpro (&Qreverse);
    Qreverse = intern ("reverse");
- 
-   staticpro (&Qmac_ready_for_drag_n_drop);
-   Qmac_ready_for_drag_n_drop = intern ("mac-ready-for-drag-n-drop");
  
    staticpro (&x_display_name_list);
    x_display_name_list = Qnil;
--- 10695,10700 ----




reply via email to

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