emacs-pretest-bug
[Top][All Lists]
Advanced

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

Re: proxy icon and moved files


From: YAMAMOTO Mitsuharu
Subject: Re: proxy icon and moved files
Date: Tue, 22 Aug 2006 16:49:43 +0900
User-agent: Wanderlust/2.14.0 (Africa) SEMI/1.14.6 (Maruoka) FLIM/1.14.6 (Marutamachi) APEL/10.6 Emacs/22.0.50 (sparc-sun-solaris2.8) MULE/5.0 (SAKAKI)

>>>>> On Mon, 21 Aug 2006 16:27:58 +0100, David Reitter <address@hidden> said:

> Dragging and dropping the Carbon proxy icon to a Finder window
> sometimes saves the backup file (foo.txt~) instead of the actual
> file.

> I could reproduce this with a current build. I tried to locate the
> code that handles these things, but it's not immediately evident why
> a local copy of the file name for the frame is kept in macterm.c
> (file_name) and why it isn't updated correctly (if that is the
> cause).

The intended reason why a local copy is kept is to avoid needless data
conversion and display update as much as possible.  And the local copy
itself is updated correctly.

The proxy icon is set by giving the corresponding alias record to
SetWindowProxyAlias.  But the correspondence between file name and
alias record seems to be not persistent.  Actually, the latter takes
care of renaming.

Could you try the following patch?  It tries to see if the alias
record that is currently set is updated by the current file name.

                                     YAMAMOTO Mitsuharu
                                address@hidden

Index: src/macfns.c
===================================================================
RCS file: /cvsroot/emacs/emacs/src/macfns.c,v
retrieving revision 1.90
diff -c -p -r1.90 macfns.c
*** src/macfns.c        28 Jun 2006 08:30:16 -0000      1.90
--- src/macfns.c        22 Aug 2006 05:35:29 -0000
*************** static void
*** 1945,2007 ****
  mac_update_proxy_icon (f)
       struct frame *f;
  {
    Lisp_Object file_name =
      XBUFFER (XWINDOW (FRAME_SELECTED_WINDOW (f))->buffer)->filename;
    Window w = FRAME_MAC_WINDOW (f);
! 
!   if (FRAME_FILE_NAME (f) == NULL && !STRINGP (file_name))
!     return;
!   if (FRAME_FILE_NAME (f) && STRINGP (file_name)
!       && strcmp (FRAME_FILE_NAME (f), SDATA (file_name)) == 0)
!     return;
! 
!   if (FRAME_FILE_NAME (f))
!     {
!       xfree (FRAME_FILE_NAME (f));
!       FRAME_FILE_NAME (f) = NULL;
!     }
  
    BLOCK_INPUT;
  
    if (STRINGP (file_name))
      {
-       OSStatus err;
        AEDesc desc;
        Lisp_Object encoded_file_name = ENCODE_FILE (file_name);
  
! #ifdef MAC_OS8
        SetPortWindowPort (w);
- #endif
        err = AECoercePtr (TYPE_FILE_NAME, SDATA (encoded_file_name),
!                        SBYTES (encoded_file_name), typeAlias, &desc);
        if (err == noErr)
        {
!         Size size = AEGetDescDataSize (&desc);
!         AliasHandle alias = (AliasHandle) NewHandle (size);
! 
!         if (alias == NULL)
!           err = memFullErr;
!         else
!           {
!             HLock ((Handle) alias);
!             err = AEGetDescData (&desc, *alias, size);
!             HUnlock ((Handle) alias);
!             if (err == noErr)
!               err = SetWindowProxyAlias (w, alias);
!             DisposeHandle ((Handle) alias);
!           }
          AEDisposeDesc (&desc);
        }
        if (err == noErr)
        {
!         FRAME_FILE_NAME (f) = xmalloc (SBYTES (file_name) + 1);
!         strcpy (FRAME_FILE_NAME (f), SDATA (file_name));
        }
      }
  
!   if (FRAME_FILE_NAME (f) == NULL)
      RemoveWindowProxy (w);
  
    UNBLOCK_INPUT;
  }
  #endif
--- 1945,2024 ----
  mac_update_proxy_icon (f)
       struct frame *f;
  {
+   OSStatus err;
    Lisp_Object file_name =
      XBUFFER (XWINDOW (FRAME_SELECTED_WINDOW (f))->buffer)->filename;
    Window w = FRAME_MAC_WINDOW (f);
!   AliasHandle alias = NULL;
  
    BLOCK_INPUT;
  
+   err = GetWindowProxyAlias (w, &alias);
+   if (err == errWindowDoesNotHaveProxy && !STRINGP (file_name))
+     goto out;
+ 
    if (STRINGP (file_name))
      {
        AEDesc desc;
+ #ifdef MAC_OSX
+       FSRef fref;
+ #else
+       FSSpec fss;
+ #endif
+       Boolean changed;
        Lisp_Object encoded_file_name = ENCODE_FILE (file_name);
  
! #ifdef MAC_OSX
!       err = AECoercePtr (TYPE_FILE_NAME, SDATA (encoded_file_name),
!                        SBYTES (encoded_file_name), typeFSRef, &desc);
! #else
        SetPortWindowPort (w);
        err = AECoercePtr (TYPE_FILE_NAME, SDATA (encoded_file_name),
!                        SBYTES (encoded_file_name), typeFSS, &desc);
! #endif
        if (err == noErr)
        {
! #ifdef MAC_OSX
!         err = AEGetDescData (&desc, &fref, sizeof (FSRef));
! #else
!         err = AEGetDescData (&desc, &fss, sizeof (FSSpec));
! #endif
          AEDisposeDesc (&desc);
        }
        if (err == noErr)
        {
!         if (alias)
!           {
! #ifdef MAC_OSX
!             err = FSUpdateAlias (NULL, &fref, alias, &changed);
! #else
!             err = UpdateAlias (NULL, &fss, alias, &changed);
! #endif
!           }
!         if (err != noErr || alias == NULL)
!           {
!             if (alias)
!               DisposeHandle ((Handle) alias);
! #ifdef MAC_OSX
!             err = FSNewAliasMinimal (&fref, &alias);
! #else
!             err = NewAliasMinimal (&fss, &alias);
! #endif
!             changed = true;
!           }
        }
+       if (err == noErr)
+       if (changed)
+         err = SetWindowProxyAlias (w, alias);
      }
  
!   if (alias)
!     DisposeHandle ((Handle) alias);
! 
!   if (err != noErr || !STRINGP (file_name))
      RemoveWindowProxy (w);
  
+  out:
    UNBLOCK_INPUT;
  }
  #endif




reply via email to

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