« 日曜日は登山… | トップページ | Cygwin で MinGW(-mno-cygwin) での wxWidgets-2.8.3 ビルド »

2007年4月18日 (水曜日)

Windows の管理者権限ないけどフォント追加し鯛

会社の PC(Windows XP) では、通常のユーザは殆ど何も出来ない設定になっていて、例えば、 NTEmacs で使いたいフォントをインストールしようとしても、アクセス権がないと叱られてしまう。
ちょっと検索すると、管理者権限が無くても一時的にフォントを追加出来るツールがいくつかあるようで、これまでは FontPnP(リンク切れ??) や FontPlug を試させて貰っていた。しかし、どちらも使いたいフォントを有効にするには、アプリケーションを起動して、ヒトが操作してやる必要がある。確かに、フォントを一時的に試したい場合や、たくさんあるフォントの一部だけを選んで有効にしたい場合には便利なのかもしれないが、自分がやりたいのは、毎回起動(ログオン)時に決まったフォントが有効になって欲しいだけなので、それくらい勝手にやって欲しいのだ…と、 ruby + Win32API で書いてみたメモ。

使い方は、予め入手したフォントがあるフォルダのパスを引数として指定して起動するか、フォントのあるパスにスクリプトを置いて引数なしで起動すると、現在のセッションの間だけ、フォルダ内のフォントが使用可能になるという…それだけ。

自分は、フォントがあるフォルダにスクリプトを置いて、そのショートカットをスタートアップに登録して使ってます :-)
あ、そうやって使う場合は、 Win32 版 ruby がインストールされていて .rb ファイルに関連付けされている必要があるのかな…。 Exerb で .exe にしてもいいんでしょうが。

#!/usr/bin/ruby

require 'Win32API'

fontPath = String.new
# if font-path is not specified as an argument, use the path where this script resides
if ARGV.size != 0
  fontPath = ARGV.shift
else
  # retrieve my own name depends on whether I am .rb or .exe...
  myName   = (defined?(ExerbRuntime))? ExerbRuntime.filepath: $0
  fontPath = File.dirname(myName)
end

objAddFontResource = Win32API.new('GDI32.DLL', 'AddFontResource', %w(p), 'i')
Dir.chdir(fontPath) {
  Dir.glob("*.{fon,fnt,ttf,ttc,fot,otf}", File::FNM_CASEFOLD) {|entry|
    if /cygwin/ =~ RUBY_PLATFORM
      font = `cygpath -aw #{fontPath}/#{entry}`.chomp!
    else
      font = "#{fontPath}\\#{entry}"
    end
    if File.file?(font)
      ret = objAddFontResource.call(font)
      if ret != 0
        print "%d font(s) added from #{entry}.\n" % ret
      else
        print "adding #{entry} failed.\n"
      end
    end
  }
}

##########  font files with following extensions are added
## .fon
## .fnt
## .ttf
## .ttc
## .fot
## .otf

##########  font files with following extensions are not added
## .mmm
## .pfb
## .pfm

(2007/06/13 追記)
今は、下記の用に一部変更して addfont.rbw という名前で使っています。終了時に追加したフォント一覧を表示しますが、何も考えていないのでフォントが多すぎるとダメ鴨。

#!/usr/bin/ruby

require 'Win32API'

fontPath = String.new
# if font-path is not specified as an argument, use the path where this script resides
if ARGV.size != 0
  fontPath = ARGV.shift
else
  # retrieve my own name depends on whether I am .rb or .exe...
  myName   = (defined?(ExerbRuntime))? ExerbRuntime.filepath: $0
  fontPath = File.dirname(myName)
end

objAddFontResource = Win32API.new('GDI32.DLL', 'AddFontResource', %w(p), 'i')
text = String.new
Dir.chdir(fontPath) {
  Dir.glob("*.{fon,fnt,ttf,ttc,fot,otf}", File::FNM_CASEFOLD) {|entry|
    if /cygwin/ =~ RUBY_PLATFORM
      font = `cygpath -aw #{fontPath}/#{entry}`.chomp!
    else
      font = "#{fontPath}\\#{entry}"
    end
    if File.file?(font)
      ret = objAddFontResource.call(font)
      if ret != 0
        text << "%d font(s) added from #{entry}.\n" % ret
      else
        text << "adding #{entry} failed.\n"
      end
    end
  }
}

objMessageBox = Win32API.new('user32', 'MessageBox', %w(p p p i), 'i') # args: window, text, caption, type
if text.size > 0
  objMessageBox.call(0, text, "#{myName}", 0) # MB_OK=0
else
  objMessageBox.call(0, "No font specified...", "#{myName}", 0) # type = MB_OK = 0
end

##########  font files with following extensions are added
## .fon
## .fnt
## .ttf
## .ttc
## .fot
## .otf

##########  font files with following extensions are not added
## .mmm
## .pfb
## .pfm

|

« 日曜日は登山… | トップページ | Cygwin で MinGW(-mno-cygwin) での wxWidgets-2.8.3 ビルド »

Emacsen」カテゴリの記事

スクリプティング」カテゴリの記事

パソコン・インターネット」カテゴリの記事

コメント

コメントを書く



(ウェブ上には掲載しません)


コメントは記事投稿者が公開するまで表示されません。



トラックバック

この記事のトラックバックURL:
http://app.cocolog-nifty.com/t/trackback/144752/14750812

この記事へのトラックバック一覧です: Windows の管理者権限ないけどフォント追加し鯛:

« 日曜日は登山… | トップページ | Cygwin で MinGW(-mno-cygwin) での wxWidgets-2.8.3 ビルド »