1 USING: accessors alien.c-types alien.data alien.strings
2 alien.syntax classes.struct destructors file-picker
3 io.encodings.string io.encodings.utf8 kernel libc literals math
4 system windows windows.kernel32 windows.shell32 windows.types
6 IN: file-picker.windows
9 TYPEDEF: void* PIDLIST_ABSOLUTE
10 TYPEDEF: void* PCIDLIST_ABSOLUTE
11 TYPEDEF: void* BFFCALLBACK
13 FUNCTION: HRESULT SHGetFolderLocation (
18 PIDLIST_ABSOLUTE* ppidl
23 { pidlRoot PCIDLIST_ABSOLUTE }
24 { pszDisplayName LPTSTR }
31 CONSTANT: BIF_RETURNONLYFSDIRS 0x00000001
32 CONSTANT: BIF_DONTGOBELOWDOMAIN 0x00000002
33 CONSTANT: BIF_STATUSTEXT 0x00000004
34 CONSTANT: BIF_RETURNFSANCESTORS 0x00000008
35 CONSTANT: BIF_EDITBOX 0x00000010
36 CONSTANT: BIF_VALIDATE 0x00000020
37 CONSTANT: BIF_NEWDIALOGSTYLE 0x00000040
38 CONSTANT: BIF_BROWSEINCLUDEURLS 0x00000080
39 CONSTANT: BIF_USENEWUI flags{ BIF_EDITBOX BIF_NEWDIALOGSTYLE }
40 CONSTANT: BIF_UAHINT 0x00000100
41 CONSTANT: BIF_NONEWFOLDERBUTTON 0x00000200
42 CONSTANT: BIF_NOTRANSLATETARGETS 0x00000400
43 CONSTANT: BIF_BROWSEFORCOMPUTER 0x00001000
44 CONSTANT: BIF_BROWSEFORPRINTER 0x00002000
45 CONSTANT: BIF_BROWSEINCLUDEFILES 0x00004000
46 CONSTANT: BIF_SHAREABLE 0x00008000
47 CONSTANT: BIF_BROWSEFILEJUNCTIONS 0x00010000
49 FUNCTION: PIDLIST_ABSOLUTE SHBrowseForFolder (
53 FUNCTION: BOOL SHGetPathFromIDList (
54 PCIDLIST_ABSOLUTE pidl,
59 M: windows open-file-dialog
62 GetDesktopWindow >>hwndOwner
63 "Select a file or folder" utf8 malloc-string &free >>lpszTitle
64 BIF_BROWSEINCLUDEFILES >>ulFlags
66 MAX_UNICODE_PATH 1 + malloc &free [ SHGetPathFromIDList ] keep
67 swap [ utf8 alien>string ] [ drop f ] if
73 M: windows save-file-dialog ;