Implemented Win16 behaviour of DDL_DRIVES in DlgDirList.
diff --git a/controls/listbox.c b/controls/listbox.c
index 5ebd498..91624bc 100644
--- a/controls/listbox.c
+++ b/controls/listbox.c
@@ -1661,42 +1661,47 @@
WIN32_FIND_DATAA entry;
int pos;
- if ((handle = FindFirstFileA(filespec,&entry)) == INVALID_HANDLE_VALUE)
- {
- if (GetLastError() != ERROR_NO_MORE_FILES) return LB_ERR;
- }
- else
- {
- do
+ /* don't scan directory if we just want drives exclusively */
+ if (attrib != (DDL_DRIVES | DDL_EXCLUSIVE)) {
+ /* scan directory */
+ if ((handle = FindFirstFileA(filespec,&entry)) == INVALID_HANDLE_VALUE)
{
- char buffer[270];
- if (entry.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)
+ if (GetLastError() != ERROR_NO_MORE_FILES) return LB_ERR;
+ }
+ else
+ {
+ do
{
- if (!(attrib & DDL_DIRECTORY) ||
- !strcmp( entry.cAlternateFileName, "." )) continue;
- if (long_names) sprintf( buffer, "[%s]", entry.cFileName );
- else sprintf( buffer, "[%s]", entry.cAlternateFileName );
- }
- else /* not a directory */
- {
+ char buffer[270];
+ if (entry.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)
+ {
+ if (!(attrib & DDL_DIRECTORY) ||
+ !strcmp( entry.cAlternateFileName, "." )) continue;
+ if (long_names) sprintf( buffer, "[%s]", entry.cFileName );
+ else sprintf( buffer, "[%s]", entry.cAlternateFileName );
+ }
+ else /* not a directory */
+ {
#define ATTRIBS (FILE_ATTRIBUTE_READONLY | FILE_ATTRIBUTE_HIDDEN | \
FILE_ATTRIBUTE_SYSTEM | FILE_ATTRIBUTE_ARCHIVE)
- if ((attrib & DDL_EXCLUSIVE) &&
- ((attrib & ATTRIBS) != (entry.dwFileAttributes & ATTRIBS)))
- continue;
+ if ((attrib & DDL_EXCLUSIVE) &&
+ ((attrib & ATTRIBS) != (entry.dwFileAttributes & ATTRIBS)))
+ continue;
#undef ATTRIBS
- if (long_names) strcpy( buffer, entry.cFileName );
- else strcpy( buffer, entry.cAlternateFileName );
- }
- if (!long_names) CharLowerA( buffer );
- pos = LISTBOX_FindFileStrPos( wnd, descr, buffer );
- if ((ret = LISTBOX_InsertString( wnd, descr, pos, buffer )) < 0)
- break;
- } while (FindNextFileA( handle, &entry ));
- FindClose( handle );
+ if (long_names) strcpy( buffer, entry.cFileName );
+ else strcpy( buffer, entry.cAlternateFileName );
+ }
+ if (!long_names) CharLowerA( buffer );
+ pos = LISTBOX_FindFileStrPos( wnd, descr, buffer );
+ if ((ret = LISTBOX_InsertString( wnd, descr, pos, buffer )) < 0)
+ break;
+ } while (FindNextFileA( handle, &entry ));
+ FindClose( handle );
+ }
}
+ /* scan drives */
if ((ret >= 0) && (attrib & DDL_DRIVES))
{
char buffer[] = "[-a-]";
@@ -2689,6 +2694,9 @@
return LB_OKAY;
case LB_DIR16:
+ /* according to Win16 docs, DDL_DRIVES should make DDL_EXCLUSIVE
+ * be set automatically (this is different in Win32) */
+ if (wParam & DDL_DRIVES) wParam |= DDL_EXCLUSIVE;
return LISTBOX_Directory( wnd, descr, wParam,
(LPCSTR)PTR_SEG_TO_LIN(lParam), FALSE );