fzeet 0.5.2 → 0.5.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (75) hide show
  1. data/examples/Dialog/Dialog.rbw +2 -2
  2. data/examples/Raw/UIRibbon/Command.dll +0 -0
  3. data/examples/Raw/UIRibbon/Command.rb +17 -11
  4. data/examples/Raw/UIRibbon/Command.xml +6 -0
  5. data/examples/Raw/UIRibbon/Minimal.dll +0 -0
  6. data/examples/Raw/UIRibbon/Minimal.rb +10 -6
  7. data/examples/Raw/UIRibbon/Minimal.xml +4 -0
  8. data/examples/UIRibbon/Color.rbw +12 -0
  9. data/examples/UIRibbon/Command.dll +0 -0
  10. data/examples/UIRibbon/Command.rb +17 -11
  11. data/examples/UIRibbon/Command.xml +6 -0
  12. data/examples/UIRibbon/ContextPopup.dll +0 -0
  13. data/examples/UIRibbon/ContextPopup.rb +23 -0
  14. data/examples/UIRibbon/ContextPopup.rbw +12 -0
  15. data/examples/UIRibbon/ContextPopup.xml +83 -0
  16. data/examples/UIRibbon/Minimal.dll +0 -0
  17. data/examples/UIRibbon/Minimal.rb +10 -6
  18. data/examples/UIRibbon/Minimal.xml +4 -0
  19. data/examples/Version.rbw +5 -0
  20. data/examples/res/go-next-big.bmp +0 -0
  21. data/examples/res/go-previous-big.bmp +0 -0
  22. data/lib/fzeet/Accelerator.rb +23 -3
  23. data/lib/fzeet/Application.rb +1 -1
  24. data/lib/fzeet/{common.rb → Common.rb} +2 -50
  25. data/lib/fzeet/{ControlButton.rb → Control/Button.rb} +1 -1
  26. data/lib/fzeet/{ControlCommon.rb → Control/Common.rb} +1 -1
  27. data/lib/fzeet/Control.rb +1 -1
  28. data/lib/fzeet/Dialog/Common.rb +5 -0
  29. data/lib/fzeet/{DialogFileDialog.rb → Dialog/FileDialog.rb} +1 -43
  30. data/lib/fzeet/Dialog/FolderDialog.rb +45 -0
  31. data/lib/fzeet/Dialog.rb +2 -1
  32. data/lib/fzeet/Menu.rb +77 -77
  33. data/lib/fzeet/UIRibbon.rb +86 -1
  34. data/lib/fzeet/{WindowCommon.rb → Window/Common.rb} +52 -2
  35. data/lib/fzeet/{WindowDialog.rb → Window/Dialog.rb} +6 -6
  36. data/lib/fzeet/{WindowWindow.rb → Window/Window.rb} +1 -1
  37. data/lib/fzeet/{WindowMethods.rb → Window/WindowMethods.rb} +49 -43
  38. data/lib/fzeet/Window.rb +2 -2
  39. data/lib/fzeet/windows/com.rb +97 -15
  40. data/lib/fzeet/windows/{comctlbutton.rb → comctl/Button.rb} +1 -1
  41. data/lib/fzeet/windows/{comctlcommon.rb → comctl/Common.rb} +1 -1
  42. data/lib/fzeet/windows/comctl.rb +1 -1
  43. data/lib/fzeet/windows/{comdlgcommon.rb → comdlg/Common.rb} +1 -1
  44. data/lib/fzeet/windows/{comdlgofn.rb → comdlg/FileDialog.rb} +1 -1
  45. data/lib/fzeet/windows/comdlg.rb +1 -1
  46. data/lib/fzeet/windows/common.rb +80 -5
  47. data/lib/fzeet/windows/gdi.rb +30 -0
  48. data/lib/fzeet/windows/kernel.rb +74 -21
  49. data/lib/fzeet/windows/ole.rb +60 -0
  50. data/lib/fzeet/windows/propsys.rb +40 -0
  51. data/lib/fzeet/windows/shell/Common.rb +10 -0
  52. data/lib/fzeet/windows/shell/FolderDialog.rb +39 -0
  53. data/lib/fzeet/windows/shell.rb +1 -43
  54. data/lib/fzeet/windows/uiribbon.rb +275 -18
  55. data/lib/fzeet/windows/user/Accelerator.rb +182 -0
  56. data/lib/fzeet/windows/user/Common.rb +33 -0
  57. data/lib/fzeet/windows/{userctlbutton.rb → user/Control/Button.rb} +1 -1
  58. data/lib/fzeet/windows/{userctlcommon.rb → user/Control/Common.rb} +1 -1
  59. data/lib/fzeet/windows/user/Control.rb +1 -0
  60. data/lib/fzeet/windows/user/Menu.rb +115 -0
  61. data/lib/fzeet/windows/{usermsg.rb → user/Message.rb} +1 -3
  62. data/lib/fzeet/windows/{usermbox.rb → user/MessageBox.rb} +1 -5
  63. data/lib/fzeet/windows/user/SystemParametersInfo.rb +244 -0
  64. data/lib/fzeet/windows/{userwnd.rb → user/Window.rb} +70 -38
  65. data/lib/fzeet/windows/user.rb +7 -7
  66. data/lib/fzeet/windows.rb +2 -73
  67. data/lib/fzeet.rb +1 -1
  68. metadata +39 -27
  69. data/lib/fzeet/DialogCommon.rb +0 -5
  70. data/lib/fzeet/windows/usercommon.rb +0 -8
  71. data/lib/fzeet/windows/userctl.rb +0 -1
  72. data/lib/fzeet/windows/userkbd.rb +0 -20
  73. data/lib/fzeet/windows/usermenu.rb +0 -50
  74. data/lib/fzeet/windows/userspi.rb +0 -29
  75. /data/examples/Dialog/{FileDialog.rbw → FileAndFolderDialog.rbw} +0 -0
@@ -1,4 +1,4 @@
1
- require_relative 'common'
1
+ require_relative '../common'
2
2
 
3
3
  module Fzeet
4
4
  module Windows
@@ -1 +1 @@
1
- require_relative 'comctlbutton'
1
+ require_relative 'comctl/Button'
@@ -1,4 +1,4 @@
1
- require_relative 'common'
1
+ require_relative '../common'
2
2
 
3
3
  module Fzeet
4
4
  module Windows
@@ -1,4 +1,4 @@
1
- require_relative 'comdlgcommon'
1
+ require_relative 'Common'
2
2
 
3
3
  module Fzeet
4
4
  module Windows
@@ -1 +1 @@
1
- require_relative 'comdlgofn'
1
+ require_relative 'comdlg/FileDialog'
@@ -4,17 +4,92 @@ module Fzeet
4
4
  module Windows
5
5
  extend FFI::Library
6
6
 
7
+ ffi_lib 'kernel32'
8
+ ffi_convention :stdcall
9
+
10
+ INVALID_HANDLE_VALUE = FFI::Pointer.new(-1)
11
+ INVALID_FILE_SIZE = 0xFFFFFFFF
12
+ INVALID_SET_FILE_POINTER = 0xFFFFFFFF
13
+ INVALID_FILE_ATTRIBUTES = 0xFFFFFFFF
14
+ INVALID_ATOM = 0
15
+
16
+ attach_function :GetLastError, [], :ulong
17
+ attach_function :SetLastError, [:ulong], :void
18
+ attach_function :RestoreLastError, [:ulong], :void
19
+
20
+ def DetonateLastError(on, name, *args)
21
+ raise "#{name} failed (last error #{GetLastError()})." if (failed = [*on].include?(result = send(name, *args)))
22
+
23
+ result
24
+ ensure
25
+ yield failed if block_given?
26
+ end
27
+
28
+ module_function :DetonateLastError
29
+
30
+ class OSVERSIONINFOEX < FFI::Struct
31
+ layout \
32
+ :dwOSVersionInfoSize, :ulong,
33
+ :dwMajorVersion, :ulong,
34
+ :dwMinorVersion, :ulong,
35
+ :dwBuildNumber, :ulong,
36
+ :dwPlatformId, :ulong,
37
+ :szCSDVersion, [:char, 128],
38
+ :wServicePackMajor, :ushort,
39
+ :wServicePackMinor, :ushort,
40
+ :wSuiteMask, :ushort,
41
+ :wProductType, :uchar,
42
+ :wReserved, :uchar
43
+
44
+ def major; self[:dwMajorVersion] end
45
+ def minor; self[:dwMinorVersion] end
46
+ def build; self[:dwBuildNumber] end
47
+ def sp; self[:wServicePackMajor] end
48
+
49
+ def to_s; "#{major}.#{minor}.#{build} SP#{sp} (#{name})" end
50
+
51
+ def name
52
+ if Windows2000?; 'Windows 2000'
53
+ elsif WindowsXP?; 'Windows XP'
54
+ elsif WindowsVista?; 'Windows Vista'
55
+ elsif Windows7?; 'Windows 7'
56
+ else 'Unknown'
57
+ end
58
+ end
59
+
60
+ def Windows2000?; major == 5 && minor == 0 end
61
+ def WindowsXP?; major == 5 && minor == 1 end
62
+ def WindowsVista?; major == 6 && minor == 0 end
63
+ def Windows7?; major == 6 && minor == 1 end
64
+
65
+ def AtLeastWindows2000?; major >= 5 end
66
+ def AtLeastWindowsXP?; major > 5 || (major == 5 && minor >= 1) end
67
+ def AtLeastWindowsVista?; major >= 6 end
68
+ def AtLeastWindows7?; major > 6 || (major == 6 && minor >= 1) end
69
+ end
70
+
71
+ attach_function :GetVersionEx, :GetVersionExA, [:pointer], :int
72
+
73
+ WINVER = OSVERSIONINFOEX.new
74
+
75
+ WINVER[:dwOSVersionInfoSize] = WINVER.size
76
+
77
+ DetonateLastError(0, :GetVersionEx, WINVER)
78
+
79
+ def LOBYTE(w) w & 0xff end
80
+ def HIBYTE(w) (w >> 8) & 0xff end
81
+ def MAKEWORD(low, high) (low & 0xff) | ((high & 0xff) << 8) end
7
82
  def LOWORD(l) l & 0xffff end
8
83
  def HIWORD(l) (l >> 16) & 0xffff end
9
- def GET_X_LPARAM(lp) ((w = LOWORD(lp)) > 0x7fff) ? w - 0x1_0000 : w end
10
- def GET_Y_LPARAM(lp) ((w = HIWORD(lp)) > 0x7fff) ? w - 0x1_0000 : w end
84
+ def MAKELONG(low, high) (low & 0xffff) | ((high & 0xffff) << 16) end
85
+ def GET_X_LPARAM(l) ((w = LOWORD(l)) > 0x7fff) ? w - 0x1_0000 : w end
86
+ def GET_Y_LPARAM(l) ((w = HIWORD(l)) > 0x7fff) ? w - 0x1_0000 : w end
11
87
 
12
88
  module_function \
13
- :LOWORD, :HIWORD,
89
+ :LOBYTE, :HIBYTE, :MAKEWORD,
90
+ :LOWORD, :HIWORD, :MAKELONG,
14
91
  :GET_X_LPARAM, :GET_Y_LPARAM
15
92
 
16
- INVALID_HANDLE_VALUE = FFI::Pointer.new(-1)
17
-
18
93
  class POINT < FFI::Struct
19
94
  layout \
20
95
  :x, :long,
@@ -5,10 +5,40 @@ module Fzeet
5
5
  ffi_lib 'gdi32'
6
6
  ffi_convention :stdcall
7
7
 
8
+ def GetRValue(rgb) LOBYTE(rgb) end
9
+ def GetGValue(rgb) LOBYTE(rgb >> 8) end
10
+ def GetBValue(rgb) LOBYTE(rgb >> 16) end
11
+ def RGB(r, g, b) r | (g << 8) | (b << 16) end
12
+
13
+ module_function \
14
+ :GetRValue, :GetGValue, :GetBValue, :RGB
15
+
8
16
  DEFAULT_GUI_FONT = 17
9
17
 
10
18
  attach_function :GetStockObject, [:int], :pointer
19
+
20
+ =begin
21
+ class LOGFONT < FFI::Struct
22
+ layout \
23
+ :lfHeight, :long,
24
+ :lfWidth, :long,
25
+ :lfEscapement, :long,
26
+ :lfOrientation, :long,
27
+ :lfWeight, :long,
28
+ :lfItalic, :uchar,
29
+ :lfUnderline, :uchar,
30
+ :lfStrikeOut, :uchar,
31
+ :lfCharSet, :uchar,
32
+ :lfOutPrecision, :uchar,
33
+ :lfClipPrecision, :uchar,
34
+ :lfQuality, :uchar,
35
+ :lfPitchAndFamily, :uchar,
36
+ :lfFaceName, [:char, 32]
37
+ end
38
+ =end
39
+
11
40
  attach_function :CreateFontIndirect, :CreateFontIndirectA, [:pointer], :pointer
41
+
12
42
  attach_function :DeleteObject, [:pointer], :int
13
43
 
14
44
  attach_function :MoveToEx, [:pointer, :int, :int, :pointer], :int
@@ -5,31 +5,84 @@ module Fzeet
5
5
  ffi_lib 'kernel32'
6
6
  ffi_convention :stdcall
7
7
 
8
- attach_function :GetLastError, [], :ulong
9
- attach_function :SetLastError, [:ulong], :void
10
-
11
- class ACTCTX < FFI::Struct
12
- layout \
13
- :cbSize, :ulong,
14
- :dwFlags, :ulong,
15
- :lpSource, :pointer,
16
- :wProcessorArchitecture, :ushort,
17
- :wLangId, :ushort,
18
- :lpAssemblyDirectory, :pointer,
19
- :lpResourceName, :pointer,
20
- :lpApplicationName, :pointer,
21
- :hModule, :pointer
8
+ attach_function :GetModuleHandle, :GetModuleHandleA, [:string], :pointer
9
+
10
+ attach_function :LoadLibrary, :LoadLibraryA, [:string], :pointer
11
+ attach_function :FreeLibrary, [:pointer], :int
12
+
13
+ if WINVER.AtLeastWindowsXP?
14
+ class ACTCTX < FFI::Struct
15
+ layout \
16
+ :cbSize, :ulong,
17
+ :dwFlags, :ulong,
18
+ :lpSource, :pointer,
19
+ :wProcessorArchitecture, :ushort,
20
+ :wLangId, :ushort,
21
+ :lpAssemblyDirectory, :pointer,
22
+ :lpResourceName, :pointer,
23
+ :lpApplicationName, :pointer,
24
+ :hModule, :pointer
25
+ end
26
+
27
+ attach_function :CreateActCtx, :CreateActCtxA, [:pointer], :pointer
28
+ attach_function :ReleaseActCtx, [:pointer], :void
29
+
30
+ attach_function :ActivateActCtx, [:pointer, :pointer], :int
31
+ attach_function :DeactivateActCtx, [:ulong, :ulong], :int
32
+
33
+ COMMON_CONTROLS_ACTCTX = {
34
+ handle: INVALID_HANDLE_VALUE,
35
+ cookie: FFI::MemoryPointer.new(:ulong),
36
+ activated: false
37
+ }
38
+
39
+ at_exit {
40
+ DeactivateActCtx(0, COMMON_CONTROLS_ACTCTX[:cookie].get_ulong(0)) if
41
+ COMMON_CONTROLS_ACTCTX[:activated]
42
+
43
+ COMMON_CONTROLS_ACTCTX[:cookie].free
44
+
45
+ ReleaseActCtx(COMMON_CONTROLS_ACTCTX[:handle]) unless
46
+ COMMON_CONTROLS_ACTCTX[:handle] == INVALID_HANDLE_VALUE
47
+ }
22
48
  end
23
49
 
24
- attach_function :CreateActCtx, :CreateActCtxA, [:pointer], :pointer
25
- attach_function :ReleaseActCtx, [:pointer], :void
50
+ def EnableVisualStyles
51
+ return unless WINVER.AtLeastWindowsXP?
26
52
 
27
- attach_function :ActivateActCtx, [:pointer, :pointer], :int
28
- attach_function :DeactivateActCtx, [:ulong, :ulong], :int
53
+ raise 'Visual styles already enabled.' if COMMON_CONTROLS_ACTCTX[:activated]
29
54
 
30
- attach_function :GetModuleHandle, :GetModuleHandleA, [:string], :pointer
55
+ manifest = "#{ENV['TEMP']}/Fzeet.Common-Controls.manifest"
31
56
 
32
- attach_function :LoadLibrary, :LoadLibraryA, [:string], :pointer
33
- attach_function :FreeLibrary, [:pointer], :int
57
+ File.open(manifest, 'w:utf-8') { |file|
58
+ file << <<-XML
59
+ <?xml version='1.0' encoding='utf-8' standalone='yes' ?>
60
+ <assembly xmlns='urn:schemas-microsoft-com:asm.v1' manifestVersion='1.0'>
61
+ <dependency>
62
+ <dependentAssembly>
63
+ <assemblyIdentity type='Win32' name='Microsoft.Windows.Common-Controls' version='6.0.0.0' processorArchitecture='*' publicKeyToken='6595b64144ccf1df' language='*' />
64
+ </dependentAssembly>
65
+ </dependency>
66
+ </assembly>
67
+ XML
68
+ }
69
+
70
+ ac = ACTCTX.new
71
+
72
+ ac[:cbSize] = ac.size
73
+ ac[:lpSource] = source = FFI::MemoryPointer.from_string(File.expand_path(manifest))
74
+
75
+ COMMON_CONTROLS_ACTCTX[:handle] = DetonateLastError(INVALID_HANDLE_VALUE, :CreateActCtx, ac) { source.free }
76
+
77
+ DetonateLastError(0, :ActivateActCtx, COMMON_CONTROLS_ACTCTX[:handle], COMMON_CONTROLS_ACTCTX[:cookie]) { |failed|
78
+ next unless failed
79
+
80
+ ReleaseActCtx(COMMON_CONTROLS_ACTCTX[:handle]); COMMON_CONTROLS_ACTCTX[:handle] = INVALID_HANDLE_VALUE
81
+ }
82
+
83
+ COMMON_CONTROLS_ACTCTX[:activated] = true
84
+ end
85
+
86
+ module_function :EnableVisualStyles
34
87
  end
35
88
  end
@@ -8,9 +8,63 @@ module Fzeet
8
8
  attach_function :OleInitialize, [:pointer], :long
9
9
  attach_function :OleUninitialize, [], :void
10
10
 
11
+ def InitializeOle
12
+ DetonateHresult(:OleInitialize, nil)
13
+
14
+ at_exit { OleUninitialize() }
15
+ end
16
+
17
+ module_function :InitializeOle
18
+
11
19
  attach_function :CoTaskMemFree, [:pointer], :void
12
20
 
21
+ VT_EMPTY = 0
22
+ VT_NULL = 1
23
+ VT_I2 = 2
24
+ VT_I4 = 3
25
+ VT_R4 = 4
26
+ VT_R8 = 5
27
+ VT_CY = 6
28
+ VT_DATE = 7
29
+ VT_BSTR = 8
30
+ VT_DISPATCH = 9
31
+ VT_ERROR = 10
13
32
  VT_BOOL = 11
33
+ VT_VARIANT = 12
34
+ VT_UNKNOWN = 13
35
+ VT_DECIMAL = 14
36
+ VT_I1 = 16
37
+ VT_UI1 = 17
38
+ VT_UI2 = 18
39
+ VT_UI4 = 19
40
+ VT_I8 = 20
41
+ VT_UI8 = 21
42
+ VT_INT = 22
43
+ VT_UINT = 23
44
+ VT_VOID = 24
45
+ VT_HRESULT = 25
46
+ VT_PTR = 26
47
+ VT_SAFEARRAY = 27
48
+ VT_CARRAY = 28
49
+ VT_USERDEFINED = 29
50
+ VT_LPSTR = 30
51
+ VT_LPWSTR = 31
52
+ VT_FILETIME = 64
53
+ VT_BLOB = 65
54
+ VT_STREAM = 66
55
+ VT_STORAGE = 67
56
+ VT_STREAMED_OBJECT = 68
57
+ VT_STORED_OBJECT = 69
58
+ VT_BLOB_OBJECT = 70
59
+ VT_CF = 71
60
+ VT_CLSID = 72
61
+ VT_VECTOR = 0x1000
62
+ VT_ARRAY = 0x2000
63
+ VT_BYREF = 0x4000
64
+ VT_RESERVED = 0x8000
65
+ VT_ILLEGAL = 0xffff
66
+ VT_ILLEGALMASKED = 0xfff
67
+ VT_TYPEMASK = 0xff
14
68
 
15
69
  class PROPERTYKEY < FFI::Struct
16
70
  layout \
@@ -208,6 +262,12 @@ module Fzeet
208
262
 
209
263
  def bool; raise 'Wrong type tag.' unless self[:vt] == VT_BOOL; self[:boolVal] != 0 end
210
264
  def bool=(bool) self[:vt] = VT_BOOL; self[:boolVal] = (bool) ? -1 : 0 end
265
+
266
+ def int; raise 'Wrong type tag.' unless self[:vt] == VT_I4; self[:intVal] end
267
+ def int=(int) self[:vt] = VT_I4; self[:intVal] = int end
268
+
269
+ def uint; raise 'Wrong type tag.' unless self[:vt] == VT_UI4; self[:uintVal] end
270
+ def uint=(uint) self[:vt] = VT_UI4; self[:uintVal] = uint end
211
271
  end
212
272
  end
213
273
  end
@@ -0,0 +1,40 @@
1
+ require_relative 'ole'
2
+
3
+ module Fzeet
4
+ module Windows
5
+ ffi_lib 'propsys'
6
+ ffi_convention :stdcall
7
+
8
+ IPropertyStore = COM::Interface[IUnknown,
9
+ GUID['886d8eeb-8cf2-4446-8d02-cdba1dbdcf99'],
10
+
11
+ GetCount: [[:pointer], :long],
12
+ GetAt: [[:ulong, :pointer], :long],
13
+ GetValue: [[:pointer, :pointer], :long],
14
+ SetValue: [[:pointer, :pointer], :long],
15
+ Commit: [[], :long]
16
+ ]
17
+
18
+ PropertyStore = COM::Instance[IPropertyStore]
19
+
20
+ class PropertyStore
21
+ def count; count = 0; FFI::MemoryPointer.new(:ulong) { |p| count = p.get_ulong(0) }; count end
22
+ alias :size :count
23
+ alias :length :count
24
+
25
+ # superclass.superclass is FFI::Struct, so do NOT touch [] and []=
26
+ def get(k) PROPVARIANT.new.tap { |v| GetValue(k, v) } end
27
+ def set(k, v) SetValue(k, v); self end
28
+
29
+ def prop(*args)
30
+ case args.length
31
+ when 1; get(*args)
32
+ when 2; set(*args)
33
+ else raise ArgumentError
34
+ end
35
+ end
36
+
37
+ def commit; Commit(); self end
38
+ end
39
+ end
40
+ end
@@ -0,0 +1,10 @@
1
+ require_relative '../com'
2
+
3
+ module Fzeet
4
+ module Windows
5
+ ffi_lib 'shell32'
6
+ ffi_convention :stdcall
7
+
8
+ attach_function :SHGetPathFromIDList, :SHGetPathFromIDListA, [:pointer, :pointer], :int
9
+ end
10
+ end
@@ -0,0 +1,39 @@
1
+ require_relative 'Common'
2
+
3
+ module Fzeet
4
+ module Windows
5
+ BIF_RETURNONLYFSDIRS = 0x00000001
6
+ BIF_DONTGOBELOWDOMAIN = 0x00000002
7
+ BIF_STATUSTEXT = 0x00000004
8
+ BIF_RETURNFSANCESTORS = 0x00000008
9
+ BIF_EDITBOX = 0x00000010
10
+ BIF_VALIDATE = 0x00000020
11
+ BIF_NEWDIALOGSTYLE = 0x00000040
12
+ BIF_USENEWUI = BIF_NEWDIALOGSTYLE | BIF_EDITBOX
13
+ BIF_BROWSEINCLUDEURLS = 0x00000080
14
+ BIF_UAHINT = 0x00000100
15
+ BIF_NONEWFOLDERBUTTON = 0x00000200
16
+ BIF_NOTRANSLATETARGETS = 0x00000400
17
+ BIF_BROWSEFORCOMPUTER = 0x00001000
18
+ BIF_BROWSEFORPRINTER = 0x00002000
19
+ BIF_BROWSEINCLUDEFILES = 0x00004000
20
+ BIF_SHAREABLE = 0x00008000
21
+ BIF_BROWSEFILEJUNCTIONS = 0x00010000
22
+
23
+ callback :BFFCALLBACK, [:pointer, :uint, :long, :long], :int
24
+
25
+ class BROWSEINFO < FFI::Struct
26
+ layout \
27
+ :hwndOwner, :pointer,
28
+ :pidlRoot, :pointer,
29
+ :pszDisplayName, :pointer,
30
+ :lpszTitle, :pointer,
31
+ :ulFlags, :uint,
32
+ :lpfn, :BFFCALLBACK,
33
+ :lParam, :long,
34
+ :iImage, :int
35
+ end
36
+
37
+ attach_function :SHBrowseForFolder, :SHBrowseForFolderA, [:pointer], :pointer
38
+ end
39
+ end
@@ -1,43 +1 @@
1
- require_relative 'com'
2
-
3
- module Fzeet
4
- module Windows
5
- ffi_lib 'shell32'
6
- ffi_convention :stdcall
7
-
8
- BIF_RETURNONLYFSDIRS = 0x00000001
9
- BIF_DONTGOBELOWDOMAIN = 0x00000002
10
- BIF_STATUSTEXT = 0x00000004
11
- BIF_RETURNFSANCESTORS = 0x00000008
12
- BIF_EDITBOX = 0x00000010
13
- BIF_VALIDATE = 0x00000020
14
- BIF_NEWDIALOGSTYLE = 0x00000040
15
- BIF_USENEWUI = BIF_NEWDIALOGSTYLE | BIF_EDITBOX
16
- BIF_BROWSEINCLUDEURLS = 0x00000080
17
- BIF_UAHINT = 0x00000100
18
- BIF_NONEWFOLDERBUTTON = 0x00000200
19
- BIF_NOTRANSLATETARGETS = 0x00000400
20
- BIF_BROWSEFORCOMPUTER = 0x00001000
21
- BIF_BROWSEFORPRINTER = 0x00002000
22
- BIF_BROWSEINCLUDEFILES = 0x00004000
23
- BIF_SHAREABLE = 0x00008000
24
- BIF_BROWSEFILEJUNCTIONS = 0x00010000
25
-
26
- callback :BFFCALLBACK, [:pointer, :uint, :long, :long], :int
27
-
28
- class BROWSEINFO < FFI::Struct
29
- layout \
30
- :hwndOwner, :pointer,
31
- :pidlRoot, :pointer,
32
- :pszDisplayName, :pointer,
33
- :lpszTitle, :pointer,
34
- :ulFlags, :uint,
35
- :lpfn, :BFFCALLBACK,
36
- :lParam, :long,
37
- :iImage, :int
38
- end
39
-
40
- attach_function :SHBrowseForFolder, :SHBrowseForFolderA, [:pointer], :pointer
41
- attach_function :SHGetPathFromIDList, :SHGetPathFromIDListA, [:pointer, :pointer], :int
42
- end
43
- end
1
+ require_relative 'shell/FolderDialog'