# HG changeset patch # User YAMAMOTO Mitsuharu # Date 1146811441 0 # Node ID 606c88bcaeeeebeb9f55c28ca31003975767dd33 # Parent 85887be0a943da01dd39ed87401aaaf743b08908 (mac_aelist_to_lisp, mac_aedesc_to_lisp): Change arg 1 to `const AEDesc *'. [TARGET_API_MAC_CARBON] (create_apple_event): New function. [TARGET_API_MAC_CARBON] (create_apple_event_from_event_ref): Use it. Use xrealloc instead of repeated xmalloc/xfree. [TARGET_API_MAC_CARBON] (create_apple_event_from_drag_ref): New function. diff -r 85887be0a943 -r 606c88bcaeee src/mac.c --- a/src/mac.c Fri May 05 06:43:50 2006 +0000 +++ b/src/mac.c Fri May 05 06:44:01 2006 +0000 @@ -272,7 +272,7 @@ static Lisp_Object mac_aelist_to_lisp (desc_list) - AEDescList *desc_list; + const AEDescList *desc_list; { OSErr err; long count; @@ -337,7 +337,7 @@ Lisp_Object mac_aedesc_to_lisp (desc) - AEDesc *desc; + const AEDesc *desc; { OSErr err = noErr; DescType desc_type = desc->descriptorType; @@ -665,6 +665,31 @@ } #if TARGET_API_MAC_CARBON +static OSErr +create_apple_event (class, id, result) + AEEventClass class; + AEEventID id; + AppleEvent *result; +{ + OSErr err; + static const ProcessSerialNumber psn = {0, kCurrentProcess}; + AEAddressDesc address_desc; + + err = AECreateDesc (typeProcessSerialNumber, &psn, + sizeof (ProcessSerialNumber), &address_desc); + if (err == noErr) + { + err = AECreateAppleEvent (class, id, + &address_desc, /* NULL is not allowed + on Mac OS Classic. */ + kAutoGenerateReturnID, + kAnyTransactionID, result); + AEDisposeDesc (&address_desc); + } + + return err; +} + OSErr create_apple_event_from_event_ref (event, num_params, names, types, result) EventRef event; @@ -674,24 +699,12 @@ AppleEvent *result; { OSErr err; - static const ProcessSerialNumber psn = {0, kCurrentProcess}; - AEAddressDesc address_desc; UInt32 i, size; CFStringRef string; CFDataRef data; - char *buf; - - err = AECreateDesc (typeProcessSerialNumber, &psn, - sizeof (ProcessSerialNumber), &address_desc); - if (err == noErr) - { - err = AECreateAppleEvent (0, 0, /* Dummy class and ID. */ - &address_desc, /* NULL is not allowed - on Mac OS Classic. */ - kAutoGenerateReturnID, - kAnyTransactionID, result); - AEDisposeDesc (&address_desc); - } + char *buf = NULL; + + err = create_apple_event (0, 0, result); /* Dummy class and ID. */ if (err != noErr) return err; @@ -721,19 +734,88 @@ 0, &size, NULL); if (err != noErr) break; - buf = xmalloc (size); + buf = xrealloc (buf, size); err = GetEventParameter (event, names[i], types[i], NULL, size, NULL, buf); if (err == noErr) AEPutParamPtr (result, names[i], types[i], buf, size); - xfree (buf); break; } + if (buf) + xfree (buf); return noErr; } -#endif - + +OSErr +create_apple_event_from_drag_ref (drag, num_types, types, result) + DragRef drag; + UInt32 num_types; + FlavorType *types; + AppleEvent *result; +{ + OSErr err; + UInt16 num_items; + AppleEvent items; + long index; + char *buf = NULL; + + err = CountDragItems (drag, &num_items); + if (err != noErr) + return err; + err = AECreateList (NULL, 0, false, &items); + if (err != noErr) + return err; + + for (index = 1; index <= num_items; index++) + { + ItemReference item; + DescType desc_type = typeNull; + Size size; + + err = GetDragItemReferenceNumber (drag, index, &item); + if (err == noErr) + { + int i; + + for (i = 0; i < num_types; i++) + { + err = GetFlavorDataSize (drag, item, types[i], &size); + if (err == noErr) + { + buf = xrealloc (buf, size); + err = GetFlavorData (drag, item, types[i], buf, &size, 0); + } + if (err == noErr) + { + desc_type = types[i]; + break; + } + } + } + err = AEPutPtr (&items, index, desc_type, + desc_type != typeNull ? buf : NULL, + desc_type != typeNull ? size : 0); + if (err != noErr) + break; + } + if (buf) + xfree (buf); + + if (err == noErr) + { + err = create_apple_event (0, 0, result); /* Dummy class and ID. */ + if (err == noErr) + err = AEPutParamDesc (result, keyDirectObject, &items); + if (err != noErr) + AEDisposeDesc (result); + } + + AEDisposeDesc (&items); + + return err; +} +#endif /* TARGET_API_MAC_CARBON */ /*********************************************************************** Conversion between Lisp and Core Foundation objects