[Message Prev][Message Next][Thread Prev][Thread Next][Message Index][Thread Index]
[MD:6600] mw32-sh-get-file-info()
- X-ml-count: 6600
- Subject: [MD:6600] mw32-sh-get-file-info()
- From: MIYOSHI Masanori <miyoshi@xxxxxxxxxxx>
- Date: Tue, 21 Jun 2005 22:47:26 +0900
- User-agent: Wanderlust/2.15.1 (Almost Unreal) EMIKO/1.14.1 (Choanoflagellata) LIMIT/1.14.8 (Hajinosato) APEL/10.6 Emacs/22.0.50 (i386-msvc-nt5.1.2600) MULE/5.0 (SAKAKI) Meadow/3.00-dev (KIKU)
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/