Subject: CygPath to Clipboard (was: example needed pls ...)
From: Soren A <[email-masked]>
To: [email-masked]
Date: Wed, 2 Jul 2003 21:09:29 +0000 (UTC)

Hey, 'bout time to change the Subject: and start a new thread, eh?

---Reference to Previous thread---
  Subject: Re: example needed pls: `cygpath -c <HANDLE>'
  Message-ID: <[email-masked]>
  References: <[email-masked]> <[email-masked]> <[email-masked]> <[email-masked]> <[email-masked]> <[email-masked]> <[email-masked]> <[email-masked]> <[email-masked]
  Xref: main.gmane.org gmane.os.cygwin:32852
---end references---

> Soren A wrote:
> 
>> The expansion encoded is of a variable %CYGROOT% which must be present
>> in the Windows "master" environment, so that the Registry
>> _always_ has access to it. I set it in my Windows9x autoexec.bat
>> file of course, and under NT/2K/XP you can use the ControlPanel|System.

> I was wondering why I didn't have any CYGROOT set.  I agree that
> REG_EXPAND_SZ is "nicer" in terms of not hard-coding paths, but since
> $CYGROOT is non-standard I don't see that it matters too much.
> 
> There's a couple of problems with it still, in the backspaces/quotes
> department.  Your .reg file installs the command:

> "%CYGROOT%\\bin\\bash -c \"echo -n `/bin/cygpath -u '%l'`>/dev/clipboard\"" + NewLine

> When I run the command I get an error.  The proper quoting is
> 
> "%CYGROOT%\bin\bash" -c "echo -n `/bin/cygpath -u '%l'`>/dev/clipboard"
> 
> You don't want to escape the double-quotes because they are there to
> tell the windows shell to make all that stuff a single arg, after -c. 
> You need double quotes around the exe image in the off chance there's a
> space in $CYGROOT.  And there's the issue of the raw binary newline at
> the end.  The hexified version of that is
> hex(2):22,25,43,59,47,52,4f,4f,54,25,5c,62,69,6e,5c,62,61,73,68,22,20,2d,63,20,22,65,63,68,6f,20,2d,6e,20,60,2f,62,69,6e,2f,63,79,67,70,61,74,68,20,2d,75,20,27,25,6c,27,60,3e,2f,64,65,76,2f,63,6c,69,70,62,6f,61,72,64,22,00
> 
> 
> ----
> 
> Anyway, the Right Way (IMHO) to do this would be something like the
> following:
> 
> ----- copy_cygpath.c -----
> #include <sys/cygwin.h>
> #include <windows.h>
> 
> int main(int argc, char **argv)
> {
>     HGLOBAL hglbBuffer;
>     LPTSTR  lptstrBuffer;
> 
> 
>     if(argc != 2) {
> 
>         // usage: copy_cygpath [win32 path]
>         return 1;
>     }
> 
>     hglbBuffer = GlobalAlloc(GMEM_MOVEABLE, (MAX_PATH +
> 1)*sizeof(TCHAR));
>     if (hglbBuffer == NULL) {
>         return 1;
>     }
> 
>     lptstrBuffer = GlobalLock(hglbBuffer);
>     cygwin_conv_to_full_posix_path(argv[1], lptstrBuffer);
>     GlobalUnlock(hglbBuffer);
> 
>     if(OpenClipboard(NULL) == 0) {
>         // failure!
> 
>         GlobalFree(hglbBuffer);
>         return 1;
>     }
> 
>     EmptyClipboard();
>     SetClipboardData(CF_TEXT, hglbBuffer);
>     CloseClipboard();
> 
>     return 0;
> }
> ------
> 
> $ gcc copy_cygpath.c -o copy_cygpath.exe -mwindows -luser32
> $ mv copy_cygpath.exe /bin

OK, Brian, your copy_cygpath tool works just fine (sans the issues
of providing fancy escaping a' la' `ls'). But I cannot get the
Registry to accept the entries now! Each time I try I get the keys
created OK, but the "command" is undefined (I am writing of how we
see the Registry in "regedit"). Somehow, my guess is that REGEDIT
is not liking the way the data entries look and is blanking them
out when adding the values to the keys.

> Now your registry entry is just: 
> 
> "%CYGROOT%\bin\copy_cygpath.exe" "%1"

That's a numeral "one" (1), not an "l" (letter L) -- that gives us
a SFN, not a LFN, no?

> or
> 
> ------
> REGEDIT4
> 
> [HKEY_CLASSES_ROOT\Directory\shell\CygPath]
> @="&Copy LFN Cygwin Path"
> 
> [HKEY_CLASSES_ROOT\Directory\shell\CygPathLFN\Command]
> @=hex(2):22,25,43,59,47,52,4f,4f,54,25,5c,62,69,6e,5c,63,6f,70,79,5f,63,79,67,70,61,74,68,2e,65,78,65,22,20,22,25,31,22,00
> ------

I have been using double backslashes! It worked fine in the previous,
bash-based script version. Let me try with single backslashes in the
path to copy_cygpath and see if THAT works. Growl. I had it working
beautifully the previous way, now all this fussing... ;-)

(More previous message reference:)
> This has the advantage of loading a single process, rather than bash,
> echo, and cygpath.  You also eliminate the silly console window that
> flashes open and then closes.
> 
> One might also want to change the C code to backslash escape spaces and
> other non-[\w\d] characters.  That way you could still work with the
> long filenames at the command prompt.  Alternatively you could have it
> paste the path as '/path/with a/space' (with the quotes.)
> 
> Brian

Soren A.

-- 
"So, tell me, my little one-eyed one, on what poor, pitiful,
defenseless planet has my MONSTROSITY been unleashed?"
                       - Dr. Jumba, Disney's "Lilo & Stitch"
OpenPGP Key at http://savannah.gnu.org/people/viewgpg.php?user_id=6050

--
Unsubscribe info:      http://cygwin.com/ml/#unsubscribe-simple
Problem reports:       http://cygwin.com/problems.html
Documentation:         http://cygwin.com/docs.html
FAQ:                   http://cygwin.com/faq/