emacs-diffs
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[Emacs-diffs] Changes to emacs/src/mac.c


From: YAMAMOTO Mitsuharu
Subject: [Emacs-diffs] Changes to emacs/src/mac.c
Date: Sun, 24 Apr 2005 02:05:39 -0400

Index: emacs/src/mac.c
diff -c emacs/src/mac.c:1.33 emacs/src/mac.c:1.34
*** emacs/src/mac.c:1.33        Sat Apr 16 03:03:02 2005
--- emacs/src/mac.c     Sun Apr 24 06:05:39 2005
***************
*** 31,42 ****
  #include "sysselect.h"
  #include "systime.h"
  #include "blockinput.h"
- #include "charset.h"
- #include "coding.h"
  
  #include "macterm.h"
  
! #ifndef HAVE_CARBON
  #include <Files.h>
  #include <MacTypes.h>
  #include <TextUtils.h>
--- 31,43 ----
  #include "sysselect.h"
  #include "systime.h"
  #include "blockinput.h"
  
  #include "macterm.h"
  
! #if TARGET_API_MAC_CARBON
! #include "charset.h"
! #include "coding.h"
! #else  /* not TARGET_API_MAC_CARBON */
  #include <Files.h>
  #include <MacTypes.h>
  #include <TextUtils.h>
***************
*** 52,58 ****
  #include <Processes.h>
  #include <EPPC.h>
  #include <MacLocales.h>
! #endif        /* not HAVE_CARBON */
  
  #include <utime.h>
  #include <dirent.h>
--- 53,59 ----
  #include <Processes.h>
  #include <EPPC.h>
  #include <MacLocales.h>
! #endif        /* not TARGET_API_MAC_CARBON */
  
  #include <utime.h>
  #include <dirent.h>
***************
*** 68,75 ****
  #include <unistd.h>
  #endif
  
- Lisp_Object QCLIPBOARD;
- 
  /* The system script code. */
  static int mac_system_script_code;
  
--- 69,74 ----
***************
*** 331,337 ****
  {
    CFIndex len = CFDataGetLength (data);
    Lisp_Object result = make_uninit_string (len);
!   
    CFDataGetBytes (data, CFRangeMake (0, len), SDATA (result));
  
    return result;
--- 330,336 ----
  {
    CFIndex len = CFDataGetLength (data);
    Lisp_Object result = make_uninit_string (len);
! 
    CFDataGetBytes (data, CFRangeMake (0, len), SDATA (result));
  
    return result;
***************
*** 894,900 ****
        if (i < 0)
        {
          max_nid++;
!         XSETINT (node_id, max_nid); 
          hash_put (h, key, node_id, hash_code);
        }
        else
--- 893,899 ----
        if (i < 0)
        {
          max_nid++;
!         XSETINT (node_id, max_nid);
          hash_put (h, key, node_id, hash_code);
        }
        else
***************
*** 3515,3683 ****
  }
  
  
- /* set interprogram-paste-function to mac-paste-function in mac-win.el
-    to enable Emacs to obtain the contents of the Mac clipboard. */
- DEFUN ("mac-paste-function", Fmac_paste_function, Smac_paste_function, 0, 0, 
0,
-        doc: /* Return the contents of the Mac clipboard as a string.  */)
-      ()
- {
  #if TARGET_API_MAC_CARBON
!   OSStatus err;
!   ScrapRef scrap;
!   ScrapFlavorFlags sff;
!   Size s;
!   int i;
!   char *data;
! 
!   BLOCK_INPUT;
!   err = GetCurrentScrap (&scrap);
!   if (err == noErr)
!     err = GetScrapFlavorFlags (scrap, kScrapFlavorTypeText, &sff);
!   if (err == noErr)
!     err = GetScrapFlavorSize (scrap, kScrapFlavorTypeText, &s);
!   if (err == noErr && (data = (char*) alloca (s)))
!     err = GetScrapFlavorData (scrap, kScrapFlavorTypeText, &s, data);
!   UNBLOCK_INPUT;
!   if (err != noErr || s == 0)
!     return Qnil;
! 
!   /* Emacs expects clipboard contents have Unix-style eol's */
!   for (i = 0; i < s; i++)
!     if (data[i] == '\r')
!       data[i] = '\n';
! 
!   return make_string (data, s);
! #else /* not TARGET_API_MAC_CARBON */
!   Lisp_Object value;
!   Handle my_handle;
!   long scrap_offset, rc, i;
! 
!   my_handle = NewHandle (0);  /* allocate 0-length data area */
! 
!   rc = GetScrap (my_handle, 'TEXT', &scrap_offset);
!   if (rc < 0)
!     return Qnil;
! 
!   HLock (my_handle);
! 
!   /* Emacs expects clipboard contents have Unix-style eol's */
!   for (i = 0; i < rc; i++)
!     if ((*my_handle)[i] == '\r')
!       (*my_handle)[i] = '\n';
! 
!   value = make_string (*my_handle, rc);
! 
!   HUnlock (my_handle);
! 
!   DisposeHandle (my_handle);
! 
!   return value;
! #endif /* not TARGET_API_MAC_CARBON */
! }
! 
! 
! /* set interprogram-cut-function to mac-cut-function in mac-win.el
!    to enable Emacs to write the top of the kill-ring to the Mac clipboard. */
! DEFUN ("mac-cut-function", Fmac_cut_function, Smac_cut_function, 1, 2, 0,
!        doc: /* Put the value of the string parameter to the Mac clipboard.  
*/)
!   (value, push)
!     Lisp_Object value, push;
! {
!   char *buf;
!   int len, i;
! 
!   /* fixme: ignore the push flag for now */
! 
!   CHECK_STRING (value);
! 
!   len = SCHARS (value);
!   buf = (char *) alloca (len+1);
!   bcopy (SDATA (value), buf, len);
!   buf[len] = '\0';
! 
!   /* convert to Mac-style eol's before sending to clipboard */
!   for (i = 0; i < len; i++)
!     if (buf[i] == '\n')
!       buf[i] = '\r';
! 
! #if TARGET_API_MAC_CARBON
!   {
!     ScrapRef scrap;
! 
!     BLOCK_INPUT;
!     ClearCurrentScrap ();
!     if (GetCurrentScrap (&scrap) != noErr)
!       {
!       UNBLOCK_INPUT;
!       error ("cannot get current scrap");
!       }
! 
!     if (PutScrapFlavor (scrap, kScrapFlavorTypeText, kScrapFlavorMaskNone, 
len,
!                       buf) != noErr)
!       {
!       UNBLOCK_INPUT;
!       error ("cannot put to scrap");
!       }
!     UNBLOCK_INPUT;
!   }
! #else /* not TARGET_API_MAC_CARBON */
!   ZeroScrap ();
!   PutScrap (len, 'TEXT', buf);
! #endif /* not TARGET_API_MAC_CARBON */
! 
!   return Qnil;
! }
! 
! 
! DEFUN ("x-selection-exists-p", Fx_selection_exists_p, Sx_selection_exists_p,
!        0, 1, 0,
!        doc: /* Whether there is an owner for the given X Selection.
! The arg should be the name of the selection in question, typically one of
! the symbols `PRIMARY', `SECONDARY', or `CLIPBOARD'.
! \(Those are literal upper-case symbol names, since that's what X expects.)
! For convenience, the symbol nil is the same as `PRIMARY',
! and t is the same as `SECONDARY'.  */)
!   (selection)
!      Lisp_Object selection;
! {
!   CHECK_SYMBOL (selection);
! 
!   /* Return nil for PRIMARY and SECONDARY selections; for CLIPBOARD, check
!      if the clipboard currently has valid text format contents. */
! 
!   if (EQ (selection, QCLIPBOARD))
!     {
!       Lisp_Object val = Qnil;
! 
! #if TARGET_API_MAC_CARBON
!       ScrapRef scrap;
!       ScrapFlavorFlags sff;
! 
!       BLOCK_INPUT;
!       if (GetCurrentScrap (&scrap) == noErr)
!         if (GetScrapFlavorFlags (scrap, kScrapFlavorTypeText, &sff) == noErr)
!           val = Qt;
!       UNBLOCK_INPUT;
! #else /* not TARGET_API_MAC_CARBON */
!       Handle my_handle;
!       long rc, scrap_offset;
! 
!       my_handle = NewHandle (0);
! 
!       rc = GetScrap (my_handle, 'TEXT', &scrap_offset);
!       if (rc >= 0)
!         val = Qt;
! 
!       DisposeHandle (my_handle);
! #endif /* not TARGET_API_MAC_CARBON */
! 
!       return val;
!     }
!   return Qnil;
! }
! 
! #if TARGET_API_MAC_CARBON
! static Lisp_Object Qxml;
  
  DEFUN ("mac-get-preference", Fmac_get_preference, Smac_get_preference, 1, 4, 
0,
         doc: /* Return the application preference value for KEY.
--- 3514,3522 ----
  }
  
  
  #if TARGET_API_MAC_CARBON
! static Lisp_Object Qxml, Qmime_charset;
! static Lisp_Object QNFD, QNFKD, QNFC, QNFKC, QHFS_plus_D, QHFS_plus_C;
  
  DEFUN ("mac-get-preference", Fmac_get_preference, Smac_get_preference, 1, 4, 
0,
         doc: /* Return the application preference value for KEY.
***************
*** 3792,3797 ****
--- 3631,3848 ----
  
    return result;
  }
+ 
+ 
+ static CFStringEncoding
+ get_cfstring_encoding_from_lisp (obj)
+      Lisp_Object obj;
+ {
+   CFStringRef iana_name;
+   CFStringEncoding encoding = kCFStringEncodingInvalidId;
+ 
+   if (INTEGERP (obj))
+     return XINT (obj);
+ 
+   if (SYMBOLP (obj) && !NILP (obj) && !NILP (Fcoding_system_p (obj)))
+     {
+       Lisp_Object coding_spec, plist;
+ 
+       coding_spec = Fget (obj, Qcoding_system);
+       plist = XVECTOR (coding_spec)->contents[3];
+       obj = Fplist_get (XVECTOR (coding_spec)->contents[3], Qmime_charset);
+     }
+ 
+   if (SYMBOLP (obj))
+     obj = SYMBOL_NAME (obj);
+ 
+   if (STRINGP (obj))
+     {
+       iana_name = cfstring_create_with_string (obj);
+       if (iana_name)
+       {
+         encoding = CFStringConvertIANACharSetNameToEncoding (iana_name);
+         CFRelease (iana_name);
+       }
+     }
+ 
+   return encoding;
+ }
+ 
+ #if MAC_OS_X_VERSION_MAX_ALLOWED >= 1020
+ static CFStringRef
+ cfstring_create_normalized (str, symbol)
+      CFStringRef str;
+      Lisp_Object symbol;
+ {
+   int form = -1;
+   TextEncodingVariant variant;
+   float initial_mag = 0.0;
+   CFStringRef result = NULL;
+ 
+   if (EQ (symbol, QNFD))
+     form = kCFStringNormalizationFormD;
+   else if (EQ (symbol, QNFKD))
+     form = kCFStringNormalizationFormKD;
+   else if (EQ (symbol, QNFC))
+     form = kCFStringNormalizationFormC;
+   else if (EQ (symbol, QNFKC))
+     form = kCFStringNormalizationFormKC;
+   else if (EQ (symbol, QHFS_plus_D))
+     {
+       variant = kUnicodeHFSPlusDecompVariant;
+       initial_mag = 1.5;
+     }
+   else if (EQ (symbol, QHFS_plus_C))
+     {
+       variant = kUnicodeHFSPlusCompVariant;
+       initial_mag = 1.0;
+     }
+ 
+   if (form >= 0)
+     {
+       CFMutableStringRef mut_str = CFStringCreateMutableCopy (NULL, 0, str);
+ 
+       if (mut_str)
+       {
+         CFStringNormalize (mut_str, form);
+         result = mut_str;
+       }
+     }
+   else if (initial_mag > 0.0)
+     {
+       UnicodeToTextInfo uni = NULL;
+       UnicodeMapping map;
+       CFIndex length;
+       UniChar *in_text, *buffer = NULL, *out_buf = NULL;
+       OSErr err = noErr;
+       ByteCount out_read, out_size, out_len;
+ 
+       map.unicodeEncoding = CreateTextEncoding (kTextEncodingUnicodeDefault,
+                                               kUnicodeNoSubset,
+                                               kTextEncodingDefaultFormat);
+       map.otherEncoding = CreateTextEncoding (kTextEncodingUnicodeDefault,
+                                             variant,
+                                             kTextEncodingDefaultFormat);
+       map.mappingVersion = kUnicodeUseLatestMapping;
+ 
+       length = CFStringGetLength (str);
+       out_size = (int)((float)length * initial_mag) * sizeof (UniChar);
+       if (out_size < 32)
+       out_size = 32;
+ 
+       in_text = (UniChar *)CFStringGetCharactersPtr (str);
+       if (in_text == NULL)
+       {
+         buffer = xmalloc (sizeof (UniChar) * length);
+         if (buffer)
+           {
+             CFStringGetCharacters (str, CFRangeMake (0, length), buffer);
+             in_text = buffer;
+           }
+       }
+ 
+       if (in_text)
+       err = CreateUnicodeToTextInfo(&map, &uni);
+       while (err == noErr)
+       {
+         out_buf = xmalloc (out_size);
+         if (out_buf == NULL)
+           err = mFulErr;
+         else
+           err = ConvertFromUnicodeToText (uni, length * sizeof (UniChar),
+                                           in_text,
+                                           kUnicodeDefaultDirectionMask,
+                                           0, NULL, NULL, NULL,
+                                           out_size, &out_read, &out_len,
+                                           out_buf);
+         if (err == noErr && out_read < length * sizeof (UniChar))
+           {
+             xfree (out_buf);
+             out_size += length;
+           }
+         else
+           break;
+       }
+       if (err == noErr)
+       result = CFStringCreateWithCharacters (NULL, out_buf,
+                                              out_len / sizeof (UniChar));
+       if (uni)
+       DisposeUnicodeToTextInfo (&uni);
+       if (out_buf)
+       xfree (out_buf);
+       if (buffer)
+       xfree (buffer);
+     }
+   else
+     {
+       result = str;
+       CFRetain (result);
+     }
+ 
+   return result;
+ }
+ #endif
+ 
+ DEFUN ("mac-code-convert-string", Fmac_code_convert_string, 
Smac_code_convert_string, 3, 4, 0,
+        doc: /* Convert STRING from SOURCE encoding to TARGET encoding.
+ The conversion is performed using the converter provided by the system.
+ Each encoding is specified by either a coding system symbol, a mime
+ charset string, or an integer as a CFStringEncoding value.
+ On Mac OS X 10.2 and later, you can do Unicode Normalization by
+ specifying the optional argument NORMALIZATION-FORM with a symbol NFD,
+ NFKD, NFC, NFKC, HFS+D, or HFS+C.
+ On successful conversion, returns the result string, else returns
+ nil.  */)
+   (string, source, target, normalization_form)
+      Lisp_Object string, source, target, normalization_form;
+ {
+   Lisp_Object result = Qnil;
+   CFStringEncoding src_encoding, tgt_encoding;
+   CFStringRef str = NULL;
+   CFDataRef data = NULL;
+ 
+   CHECK_STRING (string);
+   if (!INTEGERP (source) && !STRINGP (source))
+     CHECK_SYMBOL (source);
+   if (!INTEGERP (target) && !STRINGP (target))
+     CHECK_SYMBOL (target);
+   CHECK_SYMBOL (normalization_form);
+ 
+   BLOCK_INPUT;
+ 
+   src_encoding = get_cfstring_encoding_from_lisp (source);
+   tgt_encoding = get_cfstring_encoding_from_lisp (target);
+ 
+   string = string_make_unibyte (string);
+   if (src_encoding != kCFStringEncodingInvalidId
+       && tgt_encoding != kCFStringEncodingInvalidId)
+     str = CFStringCreateWithBytes (NULL, SDATA (string), SBYTES (string),
+                                  src_encoding, true);
+ #if MAC_OS_X_VERSION_MAX_ALLOWED >= 1020
+   if (str)
+     {
+       CFStringRef saved_str = str;
+ 
+       str = cfstring_create_normalized (saved_str, normalization_form);
+       CFRelease (saved_str);
+     }
+ #endif
+   if (str)
+     {
+       data = CFStringCreateExternalRepresentation (NULL, str,
+                                                  tgt_encoding, '\0');
+       CFRelease (str);
+     }
+   if (data)
+     {
+       result = cfdata_to_lisp (data);
+       CFRelease (data);
+     }
+ 
+   UNBLOCK_INPUT;
+ 
+   return result;
+ }
  #endif        /* TARGET_API_MAC_CARBON */
  
  
***************
*** 4232,4240 ****
  void
  syms_of_mac ()
  {
-   QCLIPBOARD = intern ("CLIPBOARD");
-   staticpro (&QCLIPBOARD);
- 
  #if TARGET_API_MAC_CARBON
    Qstring  = intern ("string");               staticpro (&Qstring);
    Qnumber  = intern ("number");               staticpro (&Qnumber);
--- 4283,4288 ----
***************
*** 4246,4258 ****
  
    Qxml = intern ("xml");
    staticpro (&Qxml);
  #endif
  
-   defsubr (&Smac_paste_function);
-   defsubr (&Smac_cut_function);
-   defsubr (&Sx_selection_exists_p);
  #if TARGET_API_MAC_CARBON
    defsubr (&Smac_get_preference);
  #endif
    defsubr (&Smac_clear_font_name_table);
  
--- 4294,4314 ----
  
    Qxml = intern ("xml");
    staticpro (&Qxml);
+ 
+   Qmime_charset = intern ("mime-charset");
+   staticpro (&Qmime_charset);
+ 
+   QNFD  = intern ("NFD");             staticpro (&QNFD);
+   QNFKD = intern ("NFKD");            staticpro (&QNFKD);
+   QNFC  = intern ("NFC");             staticpro (&QNFC);
+   QNFKC = intern ("NFKC");            staticpro (&QNFKC);
+   QHFS_plus_D = intern ("HFS+D");     staticpro (&QHFS_plus_D);
+   QHFS_plus_C = intern ("HFS+C");     staticpro (&QHFS_plus_C);
  #endif
  
  #if TARGET_API_MAC_CARBON
    defsubr (&Smac_get_preference);
+   defsubr (&Smac_code_convert_string);
  #endif
    defsubr (&Smac_clear_font_name_table);
  




reply via email to

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