summaryrefslogtreecommitdiffstats
path: root/win
diff options
context:
space:
mode:
authorhobbs <hobbs>2004-02-13 01:28:19 (GMT)
committerhobbs <hobbs>2004-02-13 01:28:19 (GMT)
commit88c035ccaf4a878cadd321f795ba22287b1147f2 (patch)
tree0e49ce33e22ad55b5e6d62d9fe0cc68f4c8f4c19 /win
parentcdacfa2e4d156f218b48619e25ca2448a8de2e88 (diff)
downloadtk-88c035ccaf4a878cadd321f795ba22287b1147f2.zip
tk-88c035ccaf4a878cadd321f795ba22287b1147f2.tar.gz
tk-88c035ccaf4a878cadd321f795ba22287b1147f2.tar.bz2
* win/tkWinDialog.c (ChooseDirectoryValidateProc): create a pidl
for -initialdir if we have a UNC path because BFFM_SETSELECTION doesn't support UNC paths in strings.
Diffstat (limited to 'win')
-rw-r--r--win/tkWinDialog.c47
1 files changed, 40 insertions, 7 deletions
diff --git a/win/tkWinDialog.c b/win/tkWinDialog.c
index 1ede6d5..ea08072 100644
--- a/win/tkWinDialog.c
+++ b/win/tkWinDialog.c
@@ -8,7 +8,7 @@
* See the file "license.terms" for information on usage and redistribution
* of this file, and for a DISCLAIMER OF ALL WARRANTIES.
*
- * RCS: @(#) $Id: tkWinDialog.c,v 1.33 2004/01/13 02:06:01 davygrvy Exp $
+ * RCS: @(#) $Id: tkWinDialog.c,v 1.34 2004/02/13 01:28:19 hobbs Exp $
*
*/
@@ -1999,25 +1999,58 @@ ChooseDirectoryValidateProc (
SendMessage(hwnd, BFFM_SETSTATUSTEXT, 0, (LPARAM) selDir);
// enable the OK button
SendMessage(hwnd, BFFM_ENABLEOK, 0, (LPARAM) 1);
- //EnableWindow(GetDlgItem(hwnd, IDOK), TRUE);
SetCurrentDirectory(selDir);
} else {
// disable the OK button
SendMessage(hwnd, BFFM_ENABLEOK, 0, (LPARAM) 0);
- //EnableWindow(GetDlgItem(hwnd, IDOK), FALSE);
}
UpdateWindow(hwnd);
return 1;
- case BFFM_INITIALIZED:
+ case BFFM_INITIALIZED: {
/*
* Directory browser intializing - tell it where to start from,
* user specified parameter.
*/
- SetCurrentDirectory((char *) lpData);
- SendMessage(hwnd, BFFM_SETSELECTION, TRUE, (LPARAM)lpData);
- SendMessage(hwnd, BFFM_ENABLEOK, 0, (LPARAM) 1);
+ char *initDir = chooseDirSharedData->utfInitDir;
+
+ SetCurrentDirectory(initDir);
+ if (*initDir == '\\') {
+ /*
+ * BFFM_SETSELECTION only understands UNC paths as pidls,
+ * so convert path to pidl using IShellFolder interface.
+ */
+ LPMALLOC pMalloc;
+ LPSHELLFOLDER psfFolder;
+
+ if (SUCCEEDED(SHGetMalloc(&pMalloc))) {
+ if (SUCCEEDED(SHGetDesktopFolder(&psfFolder))) {
+ LPITEMIDLIST pidlMain;
+ ULONG ulCount, ulAttr;
+ Tcl_DString ds;
+
+ Tcl_UtfToExternalDString(TkWinGetUnicodeEncoding(),
+ initDir, -1, &ds);
+ if (SUCCEEDED(psfFolder->lpVtbl->ParseDisplayName(
+ psfFolder, hwnd, NULL,
+ (WCHAR *) Tcl_DStringValue(&ds),
+ &ulCount, &pidlMain, &ulAttr))
+ && (pidlMain != NULL)) {
+ SendMessage(hwnd, BFFM_SETSELECTION, FALSE,
+ (LPARAM)pidlMain);
+ pMalloc->lpVtbl->Free(pMalloc, pidlMain);
+ }
+ psfFolder->lpVtbl->Release(psfFolder);
+ Tcl_DStringFree(&ds);
+ }
+ pMalloc->lpVtbl->Release(pMalloc);
+ }
+ } else {
+ SendMessage(hwnd, BFFM_SETSELECTION, TRUE, (LPARAM)initDir);
+ }
+ SendMessage(hwnd, BFFM_ENABLEOK, 0, (LPARAM) 1);
break;
+ }
}
return 0;