Module: Fontina::Windows

Defined in:
lib/fontina/windows/version.rb,
lib/fontina/windows/meta_package.rb,
lib/fontina/windows/win32/dlload.rb,
lib/fontina/windows/marshal.rb,
lib/fontina/windows/win32.rb,
lib/fontina/windows.rb

Defined Under Namespace

Modules: Install, MetaPackage, PreferredName, QualifiedName

Constant Summary collapse

VERSION =
'0.2.1'

Constants included from Marshal

Marshal::BYTE, Marshal::WCHAR

Constants included from Win32

Win32::CSIDL_FONTS, Win32::ERROR_FILE_NOT_FOUND, Win32::ERROR_MORE_DATA, Win32::ERROR_NO_MORE_ITEMS, Win32::ERROR_SUCCESS, Win32::FORMAT_MESSAGE_FROM_SYSTEM, Win32::FORMAT_MESSAGE_IGNORE_INSERTS, Win32::HKEY_LOCAL_MACHINE, Win32::HWND_BROADCAST, Win32::KEY_READ, Win32::KEY_WRITE, Win32::MAX_PATH, Win32::NULL, Win32::REG_SZ, Win32::RRF_RT_ANY, Win32::RRF_RT_REG_SZ, Win32::SHGFP_TYPE_CURRENT, Win32::SHGFP_TYPE_DEFAULT, Win32::WM_FONTCHANGE

Class Method Summary collapse

Class Method Details

.add_font_resource(path, times: 1) ⇒ Object



71
72
73
# File 'lib/fontina/windows.rb', line 71

def add_font_resource(path, times: 1)
  (1..times).reduce(nil) { Gdi32.AddFontResourceW(path) }
end

.font_registered?(name) ⇒ Boolean

Returns:

  • (Boolean)


48
49
50
51
52
53
54
55
56
57
58
59
60
# File 'lib/fontina/windows.rb', line 48

def font_registered?(name)
  key = Advapi32.RegOpenKeyExW(HKEY_LOCAL_MACHINE, 'SOFTWARE\Microsoft\Windows NT\CurrentVersion\Fonts', KEY_READ)
  begin
    Advapi32.RegGetValueW(key, name, flags: RRF_RT_REG_SZ).tap do |value|
      value = Advapi32.RegGetValueW(key, name, data_len: value.data_len)
      break wstr!(value.data).rstrip.encode('filesystem')
    end
  rescue Error => e
    raise if e.code != ERROR_FILE_NOT_FOUND
  ensure
    Advapi32.RegCloseKey(key)
  end
end

.fonts_directoryObject



27
28
29
# File 'lib/fontina/windows.rb', line 27

def fonts_directory
  @fonts_directory ||= Shell32.SHGetFolderPathW(CSIDL_FONTS).encode('filesystem').freeze
end

.notify_fonts_changedObject



79
80
81
# File 'lib/fontina/windows.rb', line 79

def notify_fonts_changed
  User32.PostMessageW(HWND_BROADCAST, WM_FONTCHANGE, 0, 0)
end

.register_font(name, path) ⇒ Object



62
63
64
65
66
67
68
69
# File 'lib/fontina/windows.rb', line 62

def register_font(name, path)
  key = Advapi32.RegOpenKeyExW(HKEY_LOCAL_MACHINE, 'SOFTWARE\Microsoft\Windows NT\CurrentVersion\Fonts', KEY_WRITE)
  begin
    Advapi32.RegSetValueExW(key, name, REG_SZ, wstr(path) + wchar(0))
  ensure
    Advapi32.RegCloseKey(key)
  end
end

.registered_fontsObject



31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
# File 'lib/fontina/windows.rb', line 31

def registered_fonts
  key = Advapi32.RegOpenKeyExW(HKEY_LOCAL_MACHINE, 'SOFTWARE\Microsoft\Windows NT\CurrentVersion\Fonts', KEY_READ)
  begin
    Advapi32.RegQueryInfoKeyW(key)
      .tap do |info|
        break info.value_count.times.map do |i|
          Advapi32.RegEnumValueW(key, i, name_len: info.max_name_len + 1, data_len: info.max_data_len)
        end
      end
      .reject { |value| value.type != REG_SZ }
      .map { |value| [value.name, wstr!(value.data).rstrip.encode('filesystem')] }
      .to_h
  ensure
    Advapi32.RegCloseKey(key)
  end
end

.remove_font_resource(path) ⇒ Object



75
76
77
# File 'lib/fontina/windows.rb', line 75

def remove_font_resource(path)
  (0..Float::INFINITY).find { !Gdi32.RemoveFontResourceW(path) }
end

.system_languageObject



23
24
25
# File 'lib/fontina/windows.rb', line 23

def system_language
  @system_language ||= LANGUAGE_CODES.fetch Kernel32.GetSystemDefaultUILanguage()
end