[Message Prev][Message Next][Thread Prev][Thread Next][Message Index][Thread Index]

[MD:6600] mw32-sh-get-file-info()



mw32-sh-get-file-info() というプリミティブ関数を実験的に
Meadow-3.00-dev に実装しました。

これによって、寺西さんの dispicon を高速に実行することができます。
http://wiki.gohome.org/teranisi/?EmacsOnWindows
dispicon はファイルに関連付けられたアイコンを Meadow/NTEmacs で表
示するツールです。

dispicon では、外部ツールを使ってアイコン用法を抽出していたため表
示速度に問題がありました。本関数を使うことでdired で使っても、そこ
そこ使えるものになると思います。

この関数は、SHGetFileInfo() を単純に呼び出すだけのものです。詳しく
は mw32-sh-get-file-info() の doc-string を見てください。例えば、
以下のコードで meadow.exe に対応するアイコンをバッファに挿入するこ
とができます。

(insert-image
 (create-image
  (car
   (mw32-sh-get-file-info
    "somewhere/meadow.exe"
    nil
    '(SHGFI_ICON SHGFI_LARGEICON)))
  nil t))


なお、オリジナルの dispicon() を以下のように置き換えることで、
mw32-sh-get-file-info() を利用することができます。

このコードはいい加減なので、どなたか、従来のコードとの整合性を考え
てちゃんとしたのを作って寺西さんにフィードバックしてもらえません
か? > 白井さんとか :-)

(defun dispicon (filename &optional type size depth bgcolor ignore-errors)
  (let ((size (or size dispicon-default-size))
	(bgcolor (or bgcolor dispicon-default-bgcolor
		     (dispicon-default-background))) ; ignored
	(depth (or depth dispicon-default-depth))    ; ignored
	(icontype (or type dispicon-default-type))
	(shgfi '(SHGFI_ICON))
	file-attrib blob image)
    (setq shgfi
	  (cons (if (eq icontype 'large) 'SHGFI_LARGEICON 'SHGFI_SMALLICON)
		shgfi))
    (unless (file-exists-p filename)
      (setq file-attrib 'FILE_ATTRIBUTE_NORMAL)
      (setq shgfi (cons 'SHGFI_USEFILEATTRIBUTES shgfi)))

    (setq blob (car (mw32-sh-get-file-info filename file-attrib shgfi)))

    (when blob
      (setq image (create-image blob nil t :ascent 90))
      (unless (and (eq (car (image-size image t) size))
		   (eq (cdr (image-size image t) size)))
	(setq blob (mw32-magick-scale-image blob size size))
	(setq image (create-image blob nil t :ascent 90)))
      (propertize " " 'display image 'invisible t))))



ここで議論があるのは、Windows API を elisp で実現する際の
FILE_ATTRIBUTE_NORMAL などのシンボルの表記法だと思います。ご意見あ
ればお聞かせください。

(1) `mw32-' のようなプレフィックスが必要か?
    →私は不要だと思います。関数・変数名と違って衝突しても問題がお
    きませんので。

(2) 単語間のセパレータを `_' から、elisp で一般的な `-' に変えるべ
    きか?
    →私はどちらでも良いと思いますが、統一すべきことだと思います。

(3) 大文字でなく小文字で正規化すべきか?
    →同上

--
三好 雅則 http://www.boreas.dti.ne.jp/~miyoshi/