/ 最近 .rdf 追記 設定 本棚

脳log[2008-06-17~]



2008年06月17日 (火) 少し前に近所のスーパーから姿を消したトワイニングのレディグレイ。別のスーパーで最近、これのティーバッグでないものの取り扱いが始まっていた。融通がきくぶんこちらの方が便利な場合もある。


2008年06月16日 (月) sqlite3-rubyが 5月31日に 1年3か月ぶりのバージョンアップをしていた。


2008年06月15日 (日) 我が道を行っていた Operaが 9.50からキーボードショートカットで Win, IE, Fxに歩み寄りを見せた。これは良い。そして、おぺらたん素敵っ!( http://www.dabun-doumei.com/kinkyou/20051208-2.html ) <今頃?


2008年06月14日 (土) [Vista] Altを押すまでアクセラレータキーに下線を表示しないようにしている。するとコンテクストメニューでも下線が表示されなくなるのに、Altを押すとメニューが消えてしまう。これではどのキーを押せばいいのかわからない(必ずしもかっこに囲まれているわけではないので)。欠陥だ。と思ったら右クリックでなくキーボード(Shift+F10 or Appキー)でメニューを開くと最初から下線が表示された。なんとぬかりないことよ。


2008年06月13日 (金) executableをエクセキュータブルと読むくせに exeをエグゼと読む不思議。(一般論ではない。もちろん)


2008年06月12日 (木) [Vista] リストビューのアイテムを選択したときに一般の警告音が鳴るようになったら、HKEY_CURRENT_USER\AppEvents\Schemes\Apps\.Default\CCSelectのサブキー(.Currentや .Defaultなど)の(既定)を削除。空文字列ではダメで、(値の設定なし)にする。


2008年06月11日 (水) はげしくいまさらだが知らなかった。萌ディタの、JScriptでエディタの動作を定義するというコンセプトが素敵。表示スタイルがカスケードするというのは、まさしくサクラエディタに欲しいと思っていた機能。(ルーラーとかカーソル行アンダーラインとかスタイル毎に消す必要があるのが面倒すぎるので) Vista(x64)で動かすには管理者権限が必要。他にも問題があって使用は難しい。


2008年06月10日 (火) 既に数年来 2chフリーなネット生活。検索で過去ログが引っかかっても大抵ブラウザでは読めないから使えない。mamimiとかかちゅーしゃとか使ってた頃が最後。kage.exeの動作の仕組みは今でも興味津々。<つまりは理解できていない


2008年06月09日 (月) Firefox3(現在は RC2)にしてから IMEをオフにし忘れることが多いと思ったら、ロケーションバーで Enterを押した瞬間にフォーカスが(文字入力できない場所へ)移動するからだ。


2008年06月07日 (土) Ultimate Extrasのサウンドスキーム(Glass, Pearl)を削除してしまったら C:\Windows\System32\SoundSchemes.exeを実行

Visual C++ 2008 Express Editionのオレオレ仕様が許せない。

  • なぜ新しいタブを左端に開く!
  • なぜ Ctrl+Tab(Ctrl+F6)で単純に隣のタブに移動しない!
  • Ctrl+TabTab(Ctrl+F6F6)と Ctrl+Tab,Ctrl+Tab(Ctrl+F6,Ctrl+F6)を区別するな!

使用者の予測できない小賢しいことはしなくてよい。

ところでこれってデスクトップにオーバーラップ表示された複数のウィンドウに対するインターフェイスと同じだろう。

  • 新しいウィンドウは最前面
  • Alt+TabTabTabでウィンドウ選択
  • Alt+Tab, Alt+Tabは二つのウィンドウを行ったり来たり

ウィンドウとタブは違う。タブコントロールは既に存在している。まねをしろ。見た目をまねしたなら反応まで。ドキュメントの上に常に表示されているタブリストは飾りじゃないんだよ。オーバーラップ表示されたウィンドウの切り替えには Z-Orderという手がかりがあるが、それに対する操作だけをまねしたタブウィンドウには何がある? ユーザーの目の前のタブリストでなく、プログラムが覚えてるだけの、過去にアクティブになった順番だ。それでは先読みができないだろう。毎回選択肢から探さなければならないのなら、いっそ名前順でソートされてる方がましってもんだ。

ところでところで、Operaの Ctrl+Tabも VC++2008EEと同じだったんだな。小さいウィンドウで選択肢を表示してワンクッション挟むところまで Windowsの Alt+Tab、VC++2008EEの Ctrl+Tabと同じ。まことにまどろっこしい。

Operaは Ctrl(+Shift)+F6、1(2)という、隣のタブに移動する代替手段を用意しているが、VC++2008EEには見つけられなかった。Safariは Firefoxと同じ操作感で良いけど、やっぱり Firefox + Tabs Open Relativeが理想的。

つまりは VC++2008EEのタブ*だけがイレギュラーで、使えない子。ほんとうんざり。

* 本当は、VC++2008EEにとってタブと呼ばれるものは別にあり、ここでタブといっている一個一個のものはドキュメントウィンドウと呼ばれている。これも紛らわしくて迷惑な話。本物のタブって見たことないんだけどー。


2008年06月06日 (金) --force-log: 「ログメッセージを含むファイルを強制的に有効にします」は使用経験からすると「ファイル名を含むログメッセージを強制的に有効にします(-m, --message の後ろのパスっぽく見える引数はログメッセージで間違いありません)」だと思ったが。原文はどうなっている?


2008年06月05日 (木) マンガは場所を取るから、ほとんどは配信でいい。


2008年06月04日 (水) 状態表示系のボタンが好き。でも基本はツールバー非表示。

最終更新: 2010-07-05T02:44+0900

[SakuraEditor] 現在適用されているファイルタイプを表示/変更するツールバーボタン

既存のコード(主に検索ボックス)の切り貼りで、とりあえず機能するものに。

スクリーンショット(一部)

ソース面の難はニンともしがたいが機能面の問題くらいは何とかしたいところ。以下、わかっている問題点。

  • 検索ボックスより右に表示できない。(済み)
  • リストにフォーカスがある状態では(検索ボックスと同様に)共通設定で割り当てたキーボードショートカットが効かない。(済み)
  • マウスオーバーでツールチップが出ない。(対応しない)
  • 頭文字を利用した選択。(Jを押すと Jで始まるアイテムを順番に選択する機能)(済み)
  • ツールバーを非表示から表示にしたとき、現在のタイプ別設定を反映していない(2010-06-29追記&修正済み)。

 追記@2008-06-05: 「検索ボックスより右に表示できない。」を修正した。

switch-caseで break忘れというまぬけぶりが原因だった。

フォント(HFONT)の削除漏れも修正した。

ツールチップはリストの上下数ピクセルで出ていた。(役に立たない!でもマウスオーバーでツールチップが出てもうるさいだけなのでそのまま)

 追記@2008-06-05: リストのキーボード操作「頭文字を利用した選択」を有効に。

他に、WM_PAINTで行っていた処理を、本来あるべき位置である WM_COMMAND(CBN_SELCHANGE)で行うように変更した。

キーボードアクセラレータを有効にするのは難しい。矢印や PageUp/PageDownキーまでが登録されているから、単純に有効にするとアクセラレータにそれらの入力を奪われてリストの操作が行えなくなる。

 追記@2008-06-14: キー割り当てを有効に。

ドロップダウンリストにフォーカスがあるときでもエディタのキーボードショートカットを有効にした。優先順位は

  1. リストの操作(↑, ↓, ←, →, PageDown, PageUp, Home, End, F4, Alt+↓で全部かな?)
  2. キーボードショートカット (↑, ↓, ←, →, PageDown, PageUp, Home, End, F4を使わないものと、Tab、Shift+Tab以外のもの)
  3. 頭文字を利用したリストアイテムの選択

なぜ一部のキーボードショートカットを無効にするかというと、リストの先頭のアイテムが選択されているときに Homeを押してもリストはこの入力を処理しない(すでに先頭が選択されているから)のだが、リストの選択位置に依存してキーの意味が変わってしまう(リストの先頭を選択↔キャレットを行頭に移動)のは不自然だと思うから。同様のキーをわかっている分だけ無効にした結果が上記リストの 2。モディファイアキーの状態やリストの選択位置を考慮して、もっと多くのキー入力をキーボードショートカットとして渡す余地はある(が、こんなアドホックな対処にこれ以上の手間をかけるのもどうかと)。


 SakuraEditorに欲しい機能

 ウィンドウのリサイズに追従する「現在のウィンドウ幅で折り返し」

追従しないことにむしろ驚いた。ブラウザにできてテキストエディタにできないはずがない。

 標準入力から編集テキストを読む機能

ファイル名も与えられていた場合は、それを上書き保存先にしてくれると尚良し。長めの出力をコマンドプロントからエディタに流して読んだりできる。

 svn diff hoge.rb | sakura --stdin "hoge.rb.diff"

 追記@2009-07-19: アップデート > SakuraEditor(Toolbar-FileTypeBox)_rev2.diff

Set/GetWindowLongPtr(hwnd, GWLP_USERDATA, ) の代わりに Set/Get/RemoveProp(hwnd, TEXT("MyData"), ) を使うようにした。

参考> http://hilbert.elcom.nitech.ac.jp/~taki/program.html

 1. そもそもあった疑問: GWLP_USERDATAはウィンドウクラスに属するのかウィンドウに属するのか?

以下のものを見つけた。

  • Set/GetClassLongPtr()
  • WNDCLASSEX.cbClsExtra
  • WNDCLASSEX.cbWndExtra

答え。GWLP_USERDATAはウィンドウに属し、その領域は WNDCLASSEX.cbWndExtraの値に従って確保される。

 2. ぎゃっ! WNDCLASSEX.cbWndExtraなんて変更してなかった。

いったいどこを読み書きしていたんだろう? クラッシュしなかったのは Windowsが俺みたいなうっかりもののために余白を空けていたから?

言い訳。msdnのこの記述は非常に誤解を招きやすいと思う。予め 32ビットだけメモリが確保されてると勘違いしても仕方ないじゃない?

GWLP_USERDATA | ウィンドウに関連付けられた 32 ビット値を取得します。この 32 ビット値は、ウィンドウを作成したアプリケーションで使用する目的で各ウィンドウが持っているものです。この値の初期値は 0 です。

現状の理解で、この「32 ビット値」の出所は、読み書き(Get/Set)の単位が 4バイトだというところから。LONG=32ビットだから。

ここで、LONG_PTRが 64ビットのとき、GetWindowLongPtr(,GWLP_USERDATA)は 64ビット値を取得するのでは?ドキュメントあってる?という新たな疑問。

 3. いずれにしろ

GWLP_USERDATAのように汎用的な場所から取得した値を恐る恐る CMainToolbar* にキャストするより、特別な名前をつけた場所に保存した値をキャストする方がまだ安心できる、という理由で改訂した。


ありふれた課題のようで GWLP_USERDATA を検索するだけで似たような話が見つかる。最初にリンクを張ったページは理解しやすかったが ATLのは難しい。これから読む > WTL/ATLのメッセージマップ実現のしくみ


GWLP_USERDATAと WNDCLASSEX.cbWndExtraが別物の可能性。


別物。GWLP_USERDATAは負のオフセット(-21)。cbWndExtraで確保した領域には 0から始まるオフセット(バイト単位)でアクセスする。

GWLP_USERDATAの有効な領域はポインタのサイズに関係なく、ドキュメント通りの 32ビットなのかについては winuser.hを見てもよくわからない。GWLP?_USERDATA(-21)から GWL_EXSTYLE(-20)まで差が 1しかないし……。GWLP?_* というのはオフセットでなく特別扱いされる値で、Windowsのソースを見ないと何もわからない、ということ? GWLP_USERDATAにポインタを格納できるのとできないのの差は大きいからハッキリ 64ビットサイズだと知りたい。

/*
 * Window field offsets for GetWindowLong()
 */
#define GWL_WNDPROC         (-4)
#define GWL_HINSTANCE       (-6)
#define GWL_HWNDPARENT      (-8)
#define GWL_STYLE           (-16)
#define GWL_EXSTYLE         (-20)
#define GWL_USERDATA        (-21)
#define GWL_ID              (-12)

#ifdef _WIN64

#undef GWL_WNDPROC
#undef GWL_HINSTANCE
#undef GWL_HWNDPARENT
#undef GWL_USERDATA

#endif /* _WIN64 */

#define GWLP_WNDPROC        (-4)
#define GWLP_HINSTANCE      (-6)
#define GWLP_HWNDPARENT     (-8)
#define GWLP_USERDATA       (-21)
#define GWLP_ID             (-12)

 追記@2010-06-29: ツールバーを非表示から表示にしたとき、現在のタイプ別設定を反映していないのを修正

// まだファイルタイプは取得できないっぽい。常に基本(0)になる。
//::SendMessageAny( m_hwndFileTypeBox, CB_SETCURSEL, m_pOwner->GetDocument().m_cDocType.GetDocumentType().GetIndex()+1, 0 );
::SendMessageAny( m_hwndFileTypeBox, CB_SETCURSEL, 0, 0 );

とコメントアウトしていた部分を復活させて

::SendMessageAny( m_hwndFileTypeBox, CB_SETCURSEL, m_pOwner->GetDocument().m_cDocType.GetDocumentType().GetIndex(), 0 );

ちょっと修正した(謎の+1を取り除いた)だけ。

アプリケーションの起動と同時にツールバーが作成されるときであれば、コメントの内容は正しい。アプリケーションが起動してファイルが読み込まれた後でツールバーが表示する設定に変更されたとき(このときもツールバーが作成される)は、そうではなかった。