fzeet 0.5.2 → 0.5.3

Sign up to get free protection for your applications and to get access to all the features.
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'