diff options
Diffstat (limited to 'src/mac.c')
| -rw-r--r-- | src/mac.c | 125 |
1 files changed, 98 insertions, 27 deletions
| @@ -272,7 +272,7 @@ static Lisp_Object Qundecoded_file_name; | |||
| 272 | 272 | ||
| 273 | static Lisp_Object | 273 | static Lisp_Object |
| 274 | mac_aelist_to_lisp (desc_list) | 274 | mac_aelist_to_lisp (desc_list) |
| 275 | AEDescList *desc_list; | 275 | const AEDescList *desc_list; |
| 276 | { | 276 | { |
| 277 | OSErr err; | 277 | OSErr err; |
| 278 | long count; | 278 | long count; |
| @@ -337,7 +337,7 @@ mac_aelist_to_lisp (desc_list) | |||
| 337 | 337 | ||
| 338 | Lisp_Object | 338 | Lisp_Object |
| 339 | mac_aedesc_to_lisp (desc) | 339 | mac_aedesc_to_lisp (desc) |
| 340 | AEDesc *desc; | 340 | const AEDesc *desc; |
| 341 | { | 341 | { |
| 342 | OSErr err = noErr; | 342 | OSErr err = noErr; |
| 343 | DescType desc_type = desc->descriptorType; | 343 | DescType desc_type = desc->descriptorType; |
| @@ -665,33 +665,46 @@ init_coercion_handler () | |||
| 665 | } | 665 | } |
| 666 | 666 | ||
| 667 | #if TARGET_API_MAC_CARBON | 667 | #if TARGET_API_MAC_CARBON |
| 668 | OSErr | 668 | static OSErr |
| 669 | create_apple_event_from_event_ref (event, num_params, names, types, result) | 669 | create_apple_event (class, id, result) |
| 670 | EventRef event; | 670 | AEEventClass class; |
| 671 | UInt32 num_params; | 671 | AEEventID id; |
| 672 | EventParamName *names; | ||
| 673 | EventParamType *types; | ||
| 674 | AppleEvent *result; | 672 | AppleEvent *result; |
| 675 | { | 673 | { |
| 676 | OSErr err; | 674 | OSErr err; |
| 677 | static const ProcessSerialNumber psn = {0, kCurrentProcess}; | 675 | static const ProcessSerialNumber psn = {0, kCurrentProcess}; |
| 678 | AEAddressDesc address_desc; | 676 | AEAddressDesc address_desc; |
| 679 | UInt32 i, size; | ||
| 680 | CFStringRef string; | ||
| 681 | CFDataRef data; | ||
| 682 | char *buf; | ||
| 683 | 677 | ||
| 684 | err = AECreateDesc (typeProcessSerialNumber, &psn, | 678 | err = AECreateDesc (typeProcessSerialNumber, &psn, |
| 685 | sizeof (ProcessSerialNumber), &address_desc); | 679 | sizeof (ProcessSerialNumber), &address_desc); |
| 686 | if (err == noErr) | 680 | if (err == noErr) |
| 687 | { | 681 | { |
| 688 | err = AECreateAppleEvent (0, 0, /* Dummy class and ID. */ | 682 | err = AECreateAppleEvent (class, id, |
| 689 | &address_desc, /* NULL is not allowed | 683 | &address_desc, /* NULL is not allowed |
| 690 | on Mac OS Classic. */ | 684 | on Mac OS Classic. */ |
| 691 | kAutoGenerateReturnID, | 685 | kAutoGenerateReturnID, |
| 692 | kAnyTransactionID, result); | 686 | kAnyTransactionID, result); |
| 693 | AEDisposeDesc (&address_desc); | 687 | AEDisposeDesc (&address_desc); |
| 694 | } | 688 | } |
| 689 | |||
| 690 | return err; | ||
| 691 | } | ||
| 692 | |||
| 693 | OSErr | ||
| 694 | create_apple_event_from_event_ref (event, num_params, names, types, result) | ||
| 695 | EventRef event; | ||
| 696 | UInt32 num_params; | ||
| 697 | EventParamName *names; | ||
| 698 | EventParamType *types; | ||
| 699 | AppleEvent *result; | ||
| 700 | { | ||
| 701 | OSErr err; | ||
| 702 | UInt32 i, size; | ||
| 703 | CFStringRef string; | ||
| 704 | CFDataRef data; | ||
| 705 | char *buf = NULL; | ||
| 706 | |||
| 707 | err = create_apple_event (0, 0, result); /* Dummy class and ID. */ | ||
| 695 | if (err != noErr) | 708 | if (err != noErr) |
| 696 | return err; | 709 | return err; |
| 697 | 710 | ||
| @@ -721,19 +734,88 @@ create_apple_event_from_event_ref (event, num_params, names, types, result) | |||
| 721 | 0, &size, NULL); | 734 | 0, &size, NULL); |
| 722 | if (err != noErr) | 735 | if (err != noErr) |
| 723 | break; | 736 | break; |
| 724 | buf = xmalloc (size); | 737 | buf = xrealloc (buf, size); |
| 725 | err = GetEventParameter (event, names[i], types[i], NULL, | 738 | err = GetEventParameter (event, names[i], types[i], NULL, |
| 726 | size, NULL, buf); | 739 | size, NULL, buf); |
| 727 | if (err == noErr) | 740 | if (err == noErr) |
| 728 | AEPutParamPtr (result, names[i], types[i], buf, size); | 741 | AEPutParamPtr (result, names[i], types[i], buf, size); |
| 729 | xfree (buf); | ||
| 730 | break; | 742 | break; |
| 731 | } | 743 | } |
| 744 | if (buf) | ||
| 745 | xfree (buf); | ||
| 732 | 746 | ||
| 733 | return noErr; | 747 | return noErr; |
| 734 | } | 748 | } |
| 735 | #endif | ||
| 736 | 749 | ||
| 750 | OSErr | ||
| 751 | create_apple_event_from_drag_ref (drag, num_types, types, result) | ||
| 752 | DragRef drag; | ||
| 753 | UInt32 num_types; | ||
| 754 | FlavorType *types; | ||
| 755 | AppleEvent *result; | ||
| 756 | { | ||
| 757 | OSErr err; | ||
| 758 | UInt16 num_items; | ||
| 759 | AppleEvent items; | ||
| 760 | long index; | ||
| 761 | char *buf = NULL; | ||
| 762 | |||
| 763 | err = CountDragItems (drag, &num_items); | ||
| 764 | if (err != noErr) | ||
| 765 | return err; | ||
| 766 | err = AECreateList (NULL, 0, false, &items); | ||
| 767 | if (err != noErr) | ||
| 768 | return err; | ||
| 769 | |||
| 770 | for (index = 1; index <= num_items; index++) | ||
| 771 | { | ||
| 772 | ItemReference item; | ||
| 773 | DescType desc_type = typeNull; | ||
| 774 | Size size; | ||
| 775 | |||
| 776 | err = GetDragItemReferenceNumber (drag, index, &item); | ||
| 777 | if (err == noErr) | ||
| 778 | { | ||
| 779 | int i; | ||
| 780 | |||
| 781 | for (i = 0; i < num_types; i++) | ||
| 782 | { | ||
| 783 | err = GetFlavorDataSize (drag, item, types[i], &size); | ||
| 784 | if (err == noErr) | ||
| 785 | { | ||
| 786 | buf = xrealloc (buf, size); | ||
| 787 | err = GetFlavorData (drag, item, types[i], buf, &size, 0); | ||
| 788 | } | ||
| 789 | if (err == noErr) | ||
| 790 | { | ||
| 791 | desc_type = types[i]; | ||
| 792 | break; | ||
| 793 | } | ||
| 794 | } | ||
| 795 | } | ||
| 796 | err = AEPutPtr (&items, index, desc_type, | ||
| 797 | desc_type != typeNull ? buf : NULL, | ||
| 798 | desc_type != typeNull ? size : 0); | ||
| 799 | if (err != noErr) | ||
| 800 | break; | ||
| 801 | } | ||
| 802 | if (buf) | ||
| 803 | xfree (buf); | ||
| 804 | |||
| 805 | if (err == noErr) | ||
| 806 | { | ||
| 807 | err = create_apple_event (0, 0, result); /* Dummy class and ID. */ | ||
| 808 | if (err == noErr) | ||
| 809 | err = AEPutParamDesc (result, keyDirectObject, &items); | ||
| 810 | if (err != noErr) | ||
| 811 | AEDisposeDesc (result); | ||
| 812 | } | ||
| 813 | |||
| 814 | AEDisposeDesc (&items); | ||
| 815 | |||
| 816 | return err; | ||
| 817 | } | ||
| 818 | #endif /* TARGET_API_MAC_CARBON */ | ||
| 737 | 819 | ||
| 738 | /*********************************************************************** | 820 | /*********************************************************************** |
| 739 | Conversion between Lisp and Core Foundation objects | 821 | Conversion between Lisp and Core Foundation objects |
| @@ -4686,16 +4768,6 @@ On successful conversion, return the result string, else return nil. */) | |||
| 4686 | #endif /* TARGET_API_MAC_CARBON */ | 4768 | #endif /* TARGET_API_MAC_CARBON */ |
| 4687 | 4769 | ||
| 4688 | 4770 | ||
| 4689 | DEFUN ("mac-clear-font-name-table", Fmac_clear_font_name_table, Smac_clear_font_name_table, 0, 0, 0, | ||
| 4690 | doc: /* Clear the font name table. */) | ||
| 4691 | () | ||
| 4692 | { | ||
| 4693 | check_mac (); | ||
| 4694 | mac_clear_font_name_table (); | ||
| 4695 | return Qnil; | ||
| 4696 | } | ||
| 4697 | |||
| 4698 | |||
| 4699 | static Lisp_Object | 4771 | static Lisp_Object |
| 4700 | mac_get_system_locale () | 4772 | mac_get_system_locale () |
| 4701 | { | 4773 | { |
| @@ -5167,7 +5239,6 @@ syms_of_mac () | |||
| 5167 | defsubr (&Smac_get_preference); | 5239 | defsubr (&Smac_get_preference); |
| 5168 | defsubr (&Smac_code_convert_string); | 5240 | defsubr (&Smac_code_convert_string); |
| 5169 | #endif | 5241 | #endif |
| 5170 | defsubr (&Smac_clear_font_name_table); | ||
| 5171 | 5242 | ||
| 5172 | defsubr (&Smac_set_file_creator); | 5243 | defsubr (&Smac_set_file_creator); |
| 5173 | defsubr (&Smac_set_file_type); | 5244 | defsubr (&Smac_set_file_type); |