Mailing-List: contact cygwin-help AT cygwin DOT com; run by ezmlm List-Subscribe: List-Archive: List-Post: List-Help: , Sender: cygwin-owner AT cygwin DOT com Mail-Followup-To: cygwin AT cygwin DOT com Delivered-To: mailing list cygwin AT cygwin DOT com X-Injected-Via-Gmane: http://gmane.org/ To: cygwin AT cygwin DOT com From: Soren A Subject: CygPath to Clipboard (was: example needed pls ...) Date: Wed, 2 Jul 2003 21:09:29 +0000 (UTC) Organization: Occasionally Sporadically Lines: 137 Message-ID: X-Complaints-To: usenet AT main DOT gmane DOT org User-Agent: Xnews/L5 X-Archive: encrypt Note-from-DJ: This may be spam Hey, 'bout time to change the Subject: and start a new thread, eh? ---Reference to Previous thread--- Subject: Re: example needed pls: `cygpath -c ' Message-ID: <3F02DA32 DOT EAD1FC18 AT dessent DOT net> References: <3EFE120B DOT 58A0C79E AT dessent DOT net> <20030701040434 DOT GE7604 AT ny-kenton2a-710 DOT buf DOT adelphia DOT net> <3F018740 DOT B28F53DC AT dessent DOT net> <3F018D6C DOT EA1226CA AT dessent DOT net> <3F021C46 DOT C8F4CE31 AT dessent DOT net> 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 > #include > > 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/