Mercurial > emacs
comparison src/mac.c @ 67456:2efa50cbb7cd
(Qundecoded_file_name): New variable.
(syms_of_mac): Initialize it.
(mac_aelist_to_lisp, mac_aedesc_to_lisp): New functions.
[TARGET_API_MAC_CARBON] (create_apple_event_from_event_ref): New
function.
(Fmac_coerce_ae_data): New defun.
(syms_of_mac): Defsubr it.
| author | YAMAMOTO Mitsuharu <mituharu@math.s.chiba-u.ac.jp> |
|---|---|
| date | Sat, 10 Dec 2005 01:49:36 +0000 |
| parents | 5e6f93897afb |
| children | 98b67f3d9491 |
comparison
equal
deleted
inserted
replaced
| 67455:9bf079216f0e | 67456:2efa50cbb7cd |
|---|---|
| 254 } | 254 } |
| 255 } | 255 } |
| 256 | 256 |
| 257 return 1; | 257 return 1; |
| 258 } | 258 } |
| 259 | |
| 260 | |
| 261 /*********************************************************************** | |
| 262 Conversions on Apple event objects | |
| 263 ***********************************************************************/ | |
| 264 | |
| 265 static Lisp_Object Qundecoded_file_name; | |
| 266 | |
| 267 static Lisp_Object | |
| 268 mac_aelist_to_lisp (desc_list) | |
| 269 AEDescList *desc_list; | |
| 270 { | |
| 271 OSErr err; | |
| 272 long count; | |
| 273 Lisp_Object result, elem; | |
| 274 DescType desc_type; | |
| 275 Size size; | |
| 276 AEKeyword keyword; | |
| 277 AEDesc desc; | |
| 278 | |
| 279 err = AECountItems (desc_list, &count); | |
| 280 if (err != noErr) | |
| 281 return Qnil; | |
| 282 result = Qnil; | |
| 283 while (count > 0) | |
| 284 { | |
| 285 err = AESizeOfNthItem (desc_list, count, &desc_type, &size); | |
| 286 if (err == noErr) | |
| 287 switch (desc_type) | |
| 288 { | |
| 289 case typeAEList: | |
| 290 case typeAERecord: | |
| 291 case typeAppleEvent: | |
| 292 err = AEGetNthDesc (desc_list, count, typeWildCard, | |
| 293 &keyword, &desc); | |
| 294 if (err != noErr) | |
| 295 break; | |
| 296 elem = mac_aelist_to_lisp (&desc); | |
| 297 AEDisposeDesc (&desc); | |
| 298 break; | |
| 299 | |
| 300 default: | |
| 301 if (desc_type == typeNull) | |
| 302 elem = Qnil; | |
| 303 else | |
| 304 { | |
| 305 elem = make_uninit_string (size); | |
| 306 err = AEGetNthPtr (desc_list, count, typeWildCard, &keyword, | |
| 307 &desc_type, SDATA (elem), size, &size); | |
| 308 } | |
| 309 if (err != noErr) | |
| 310 break; | |
| 311 desc_type = EndianU32_NtoB (desc_type); | |
| 312 elem = Fcons (make_unibyte_string ((char *) &desc_type, 4), elem); | |
| 313 break; | |
| 314 } | |
| 315 | |
| 316 if (err != noErr) | |
| 317 elem = Qnil; | |
| 318 else if (desc_list->descriptorType != typeAEList) | |
| 319 { | |
| 320 keyword = EndianU32_NtoB (keyword); | |
| 321 elem = Fcons (make_unibyte_string ((char *) &keyword, 4), elem); | |
| 322 } | |
| 323 | |
| 324 result = Fcons (elem, result); | |
| 325 count--; | |
| 326 } | |
| 327 | |
| 328 desc_type = EndianU32_NtoB (desc_list->descriptorType); | |
| 329 return Fcons (make_unibyte_string ((char *) &desc_type, 4), result); | |
| 330 } | |
| 331 | |
| 332 Lisp_Object | |
| 333 mac_aedesc_to_lisp (desc) | |
| 334 AEDesc *desc; | |
| 335 { | |
| 336 OSErr err; | |
| 337 DescType desc_type = desc->descriptorType; | |
| 338 Lisp_Object result; | |
| 339 | |
| 340 switch (desc_type) | |
| 341 { | |
| 342 case typeNull: | |
| 343 result = Qnil; | |
| 344 break; | |
| 345 | |
| 346 case typeAEList: | |
| 347 case typeAERecord: | |
| 348 case typeAppleEvent: | |
| 349 return mac_aelist_to_lisp (desc); | |
| 350 #if 0 | |
| 351 /* The following one is much simpler, but creates and disposes | |
| 352 of Apple event descriptors many times. */ | |
| 353 { | |
| 354 long count; | |
| 355 Lisp_Object elem; | |
| 356 AEKeyword keyword; | |
| 357 AEDesc desc1; | |
| 358 | |
| 359 err = AECountItems (desc, &count); | |
| 360 if (err != noErr) | |
| 361 break; | |
| 362 result = Qnil; | |
| 363 while (count > 0) | |
| 364 { | |
| 365 err = AEGetNthDesc (desc, count, typeWildCard, &keyword, &desc1); | |
| 366 if (err != noErr) | |
| 367 break; | |
| 368 elem = mac_aedesc_to_lisp (&desc1); | |
| 369 AEDisposeDesc (&desc1); | |
| 370 if (desc_type != typeAEList) | |
| 371 { | |
| 372 keyword = EndianU32_NtoB (keyword); | |
| 373 elem = Fcons (make_unibyte_string ((char *) &keyword, 4), elem); | |
| 374 } | |
| 375 result = Fcons (elem, result); | |
| 376 count--; | |
| 377 } | |
| 378 } | |
| 379 #endif | |
| 380 break; | |
| 381 | |
| 382 default: | |
| 383 #if TARGET_API_MAC_CARBON | |
| 384 result = make_uninit_string (AEGetDescDataSize (desc)); | |
| 385 err = AEGetDescData (desc, SDATA (result), SBYTES (result)); | |
| 386 #else | |
| 387 result = make_uninit_string (GetHandleSize (desc->dataHandle)); | |
| 388 memcpy (SDATA (result), *(desc->dataHandle), SBYTES (result)); | |
| 389 #endif | |
| 390 break; | |
| 391 } | |
| 392 | |
| 393 if (err != noErr) | |
| 394 return Qnil; | |
| 395 | |
| 396 desc_type = EndianU32_NtoB (desc_type); | |
| 397 return Fcons (make_unibyte_string ((char *) &desc_type, 4), result); | |
| 398 } | |
| 399 | |
| 400 #if TARGET_API_MAC_CARBON | |
| 401 OSErr | |
| 402 create_apple_event_from_event_ref (event, num_params, names, | |
| 403 types, sizes, result) | |
| 404 EventRef event; | |
| 405 UInt32 num_params; | |
| 406 EventParamName *names; | |
| 407 EventParamType *types; | |
| 408 UInt32 *sizes; | |
| 409 AppleEvent *result; | |
| 410 { | |
| 411 OSErr err; | |
| 412 static const ProcessSerialNumber psn = {0, kCurrentProcess}; | |
| 413 AEAddressDesc address_desc; | |
| 414 UInt32 i; | |
| 415 CFStringRef string; | |
| 416 CFDataRef data; | |
| 417 char *buf; | |
| 418 | |
| 419 err = AECreateDesc (typeProcessSerialNumber, &psn, | |
| 420 sizeof (ProcessSerialNumber), &address_desc); | |
| 421 if (err == noErr) | |
| 422 { | |
| 423 err = AECreateAppleEvent (0, 0, /* Dummy class and ID. */ | |
| 424 &address_desc, /* NULL is not allowed | |
| 425 on Mac OS Classic. */ | |
| 426 kAutoGenerateReturnID, | |
| 427 kAnyTransactionID, result); | |
| 428 AEDisposeDesc (&address_desc); | |
| 429 } | |
| 430 if (err != noErr) | |
| 431 return err; | |
| 432 | |
| 433 for (i = 0; i < num_params; i++) | |
| 434 switch (types[i]) | |
| 435 { | |
| 436 #ifdef MAC_OSX | |
| 437 case typeCFStringRef: | |
| 438 err = GetEventParameter (event, names[i], typeCFStringRef, NULL, | |
| 439 sizeof (CFStringRef), NULL, &string); | |
| 440 if (err != noErr) | |
| 441 break; | |
| 442 data = CFStringCreateExternalRepresentation (NULL, string, | |
| 443 kCFStringEncodingUTF8, | |
| 444 '?'); | |
| 445 if (data == NULL) | |
| 446 break; | |
| 447 /* typeUTF8Text is not available on Mac OS X 10.1. */ | |
| 448 AEPutParamPtr (result, names[i], 'utf8', | |
| 449 CFDataGetBytePtr (data), CFDataGetLength (data)); | |
| 450 CFRelease (data); | |
| 451 break; | |
| 452 #endif | |
| 453 | |
| 454 default: | |
| 455 buf = xmalloc (sizes[i]); | |
| 456 if (buf == NULL) | |
| 457 break; | |
| 458 err = GetEventParameter (event, names[i], types[i], NULL, | |
| 459 sizes[i], NULL, buf); | |
| 460 if (err == noErr) | |
| 461 AEPutParamPtr (result, names[i], types[i], buf, sizes[i]); | |
| 462 xfree (buf); | |
| 463 break; | |
| 464 } | |
| 465 | |
| 466 return noErr; | |
| 467 } | |
| 468 #endif | |
| 259 | 469 |
| 260 | 470 |
| 261 /*********************************************************************** | 471 /*********************************************************************** |
| 262 Conversion between Lisp and Core Foundation objects | 472 Conversion between Lisp and Core Foundation objects |
| 263 ***********************************************************************/ | 473 ***********************************************************************/ |
| 3885 else | 4095 else |
| 3886 return Qnil; | 4096 return Qnil; |
| 3887 } | 4097 } |
| 3888 | 4098 |
| 3889 | 4099 |
| 4100 DEFUN ("mac-coerce-ae-data", Fmac_coerce_ae_data, Smac_coerce_ae_data, 3, 3, 0, | |
| 4101 doc: /* Coerce Apple event data SRC-DATA of type SRC-TYPE to DST-TYPE. | |
| 4102 Each type should be a string of length 4 or the symbol | |
| 4103 `undecoded-file-name'. */) | |
| 4104 (src_type, src_data, dst_type) | |
| 4105 Lisp_Object src_type, src_data, dst_type; | |
| 4106 { | |
| 4107 OSErr err; | |
| 4108 Lisp_Object result = Qnil; | |
| 4109 DescType src_desc_type, dst_desc_type; | |
| 4110 AEDesc dst_desc; | |
| 4111 #ifdef MAC_OSX | |
| 4112 FSRef fref; | |
| 4113 #else | |
| 4114 FSSpec fs; | |
| 4115 #endif | |
| 4116 | |
| 4117 CHECK_STRING (src_data); | |
| 4118 if (EQ (src_type, Qundecoded_file_name)) | |
| 4119 { | |
| 4120 #ifdef MAC_OSX | |
| 4121 src_desc_type = typeFileURL; | |
| 4122 #else | |
| 4123 src_desc_type = typeFSS; | |
| 4124 #endif | |
| 4125 } | |
| 4126 else | |
| 4127 src_desc_type = mac_get_code_from_arg (src_type, 0); | |
| 4128 | |
| 4129 if (EQ (dst_type, Qundecoded_file_name)) | |
| 4130 { | |
| 4131 #ifdef MAC_OSX | |
| 4132 dst_desc_type = typeFSRef; | |
| 4133 #else | |
| 4134 dst_desc_type = typeFSS; | |
| 4135 #endif | |
| 4136 } | |
| 4137 else | |
| 4138 dst_desc_type = mac_get_code_from_arg (dst_type, 0); | |
| 4139 | |
| 4140 BLOCK_INPUT; | |
| 4141 if (EQ (src_type, Qundecoded_file_name)) | |
| 4142 { | |
| 4143 #ifdef MAC_OSX | |
| 4144 CFStringRef str; | |
| 4145 CFURLRef url = NULL; | |
| 4146 CFDataRef data = NULL; | |
| 4147 | |
| 4148 str = cfstring_create_with_utf8_cstring (SDATA (src_data)); | |
| 4149 if (str) | |
| 4150 { | |
| 4151 url = CFURLCreateWithFileSystemPath (NULL, str, | |
| 4152 kCFURLPOSIXPathStyle, false); | |
| 4153 CFRelease (str); | |
| 4154 } | |
| 4155 if (url) | |
| 4156 { | |
| 4157 data = CFURLCreateData (NULL, url, kCFStringEncodingUTF8, true); | |
| 4158 CFRelease (url); | |
| 4159 } | |
| 4160 if (data) | |
| 4161 err = AECoercePtr (src_desc_type, CFDataGetBytePtr (data), | |
| 4162 CFDataGetLength (data), | |
| 4163 dst_desc_type, &dst_desc); | |
| 4164 else | |
| 4165 err = memFullErr; | |
| 4166 #else | |
| 4167 err = posix_pathname_to_fsspec (SDATA (src_data), &fs); | |
| 4168 if (err == noErr) | |
| 4169 AECoercePtr (src_desc_type, &fs, sizeof (FSSpec), | |
| 4170 dst_desc_type, &dst_desc); | |
| 4171 #endif | |
| 4172 } | |
| 4173 else | |
| 4174 err = AECoercePtr (src_desc_type, SDATA (src_data), SBYTES (src_data), | |
| 4175 dst_desc_type, &dst_desc); | |
| 4176 | |
| 4177 if (err == noErr) | |
| 4178 { | |
| 4179 if (EQ (dst_type, Qundecoded_file_name)) | |
| 4180 { | |
| 4181 char file_name[MAXPATHLEN]; | |
| 4182 | |
| 4183 #ifdef MAC_OSX | |
| 4184 err = AEGetDescData (&dst_desc, &fref, sizeof (FSRef)); | |
| 4185 if (err == noErr) | |
| 4186 err = FSRefMakePath (&fref, file_name, sizeof (file_name)); | |
| 4187 #else | |
| 4188 #if TARGET_API_MAC_CARBON | |
| 4189 err = AEGetDescData (&dst_desc, &fs, sizeof (FSSpec)); | |
| 4190 #else | |
| 4191 memcpy (&fs, *(dst_desc.dataHandle), sizeof (FSSpec)); | |
| 4192 #endif | |
| 4193 if (err == noErr) | |
| 4194 err = fsspec_to_posix_pathname (&fs, file_name, | |
| 4195 sizeof (file_name) - 1); | |
| 4196 #endif | |
| 4197 if (err == noErr) | |
| 4198 result = make_unibyte_string (file_name, strlen (file_name)); | |
| 4199 } | |
| 4200 else | |
| 4201 result = Fcdr (mac_aedesc_to_lisp (&dst_desc)); | |
| 4202 AEDisposeDesc (&dst_desc); | |
| 4203 } | |
| 4204 UNBLOCK_INPUT; | |
| 4205 | |
| 4206 return result; | |
| 4207 } | |
| 4208 | |
| 4209 | |
| 3890 #if TARGET_API_MAC_CARBON | 4210 #if TARGET_API_MAC_CARBON |
| 3891 static Lisp_Object Qxml, Qmime_charset; | 4211 static Lisp_Object Qxml, Qmime_charset; |
| 3892 static Lisp_Object QNFD, QNFKD, QNFC, QNFKC, QHFS_plus_D, QHFS_plus_C; | 4212 static Lisp_Object QNFD, QNFKD, QNFC, QNFKC, QHFS_plus_D, QHFS_plus_C; |
| 3893 | 4213 |
| 3894 DEFUN ("mac-get-preference", Fmac_get_preference, Smac_get_preference, 1, 4, 0, | 4214 DEFUN ("mac-get-preference", Fmac_get_preference, Smac_get_preference, 1, 4, 0, |
| 4674 | 4994 |
| 4675 | 4995 |
| 4676 void | 4996 void |
| 4677 syms_of_mac () | 4997 syms_of_mac () |
| 4678 { | 4998 { |
| 4999 Qundecoded_file_name = intern ("undecoded-file-name"); | |
| 5000 staticpro (&Qundecoded_file_name); | |
| 5001 | |
| 4679 #if TARGET_API_MAC_CARBON | 5002 #if TARGET_API_MAC_CARBON |
| 4680 Qstring = intern ("string"); staticpro (&Qstring); | 5003 Qstring = intern ("string"); staticpro (&Qstring); |
| 4681 Qnumber = intern ("number"); staticpro (&Qnumber); | 5004 Qnumber = intern ("number"); staticpro (&Qnumber); |
| 4682 Qboolean = intern ("boolean"); staticpro (&Qboolean); | 5005 Qboolean = intern ("boolean"); staticpro (&Qboolean); |
| 4683 Qdate = intern ("date"); staticpro (&Qdate); | 5006 Qdate = intern ("date"); staticpro (&Qdate); |
| 4697 QNFKC = intern ("NFKC"); staticpro (&QNFKC); | 5020 QNFKC = intern ("NFKC"); staticpro (&QNFKC); |
| 4698 QHFS_plus_D = intern ("HFS+D"); staticpro (&QHFS_plus_D); | 5021 QHFS_plus_D = intern ("HFS+D"); staticpro (&QHFS_plus_D); |
| 4699 QHFS_plus_C = intern ("HFS+C"); staticpro (&QHFS_plus_C); | 5022 QHFS_plus_C = intern ("HFS+C"); staticpro (&QHFS_plus_C); |
| 4700 #endif | 5023 #endif |
| 4701 | 5024 |
| 5025 defsubr (&Smac_coerce_ae_data); | |
| 4702 #if TARGET_API_MAC_CARBON | 5026 #if TARGET_API_MAC_CARBON |
| 4703 defsubr (&Smac_get_preference); | 5027 defsubr (&Smac_get_preference); |
| 4704 defsubr (&Smac_code_convert_string); | 5028 defsubr (&Smac_code_convert_string); |
| 4705 #endif | 5029 #endif |
| 4706 defsubr (&Smac_clear_font_name_table); | 5030 defsubr (&Smac_clear_font_name_table); |
