Search
Categories
Articles
Rainmeter関連
ファイル置き場
お知り合いなど

スポンサーサイト

--.--.-- | スポンサー広告

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

[Rainmeter-dev] モニタセレクタ

2010.01.22 | Rainmeter-dev // Issue/マルチモニタ関連

0 Comments

モニタセレクタ

公式のフォーラムで行われていたマルチモニタについての議論の中で、手動でRainmeter.iniを編集することなく、スキンを表示するモニタを指定したいというような要望というか希望というか、そういう話が出ていたので、これまで書いてきたマルチモニタ対応コードを整理して他の部分へも適用しやすくしつつ、新たにモニタセレクタメニューなるものを追加してみました(上の画像の"Display Monitor"サブメニューがそれ)。r317にて他のマルチモニタ対応コードとともにコミット済みです。

Rainmeterには0.14.1の後期から、WindowX/Yに"@2"などのモニタ番号を付加することで、スキンを表示するモニタを指定する機能がついていますが、これは自動的に付加されるものではなく、ユーザ側が手動でRainmeter.iniを編集して付加する必要がありました(一部の環境ではマルチモニタ機能がバグっていたために、モニタ番号を付加しないと意図したように動かなかったこともあり、その回避策として編集してもらうこともあった)。今回追加したメニューはその編集の手間を減らします。

Rainmeter.iniにおけるモニタ番号の解釈には3タイプあり、

 ・プライマリモニタを表す(なにもつけない) 例: WindowX=100
 ・仮想スクリーンを表す("@0"をつける) 例: WindowX=100@0
 ・存在する各モニタの番号を表す("@n"をつける) 例: WindowX=100@2

のどれかが使えます。"@n"のnには1~モニタ数分まで指定できます。1台のみなら"@1"だけで、3台なら"@1"から"@3"まで指定できます。

メニュー項目は上の3項目それぞれに対応しています。"Use default: Primary monitor"がプライマリモニタ、"@0: Virtual screen"が仮想スクリーン、"@1: (モニタ名)" ~ "@3: (モニタ名)"までが各モニタになります。項目を選択した時点で、Rainmeter.iniでの表記もその指定された項目を基準にした座標に置き換わります。

一番下の"Auto-select based on window position"は、モニタ番号の指定をさらに簡略化させるオプションです。これをチェックした状態でスキンウィンドウをドラッグさせると、モニタ番号の指定を自動的にそのウィンドウが位置するモニタ番号に置き換えるようになります。例えば、"@1"にあるスキンウィンドウを"@2"へドラッグすると、Rainmeter.iniのモニタ番号も自動的に"@2"へと置き換わります。
自動判定の仕組み上、メニューからモニタが直接選択されたら、このオプションは解除されます。

* * *

と、いうわけで、シングルモニタ環境ではまったく利益のない機能ではありますが、マルチモニタ環境ではちょっぴり便利になる機能です。

続きからは具体的な処理内容について。

続きを読む »

スポンサーサイト

[Rainmeter-dev] マルチモニタ対応

2009.12.17 | Rainmeter-dev // Issue/マルチモニタ関連

4 Comments

Rainmeter0.14.1で追加されたマルチモニタ対応についてのまとめです。
私的なまとめですので、公開されているビルドに反映されているものではありません。ご注意ください。

■更新履歴 (※更新のたびに、たぶん一番上にあがってきます)
- 2009.09.28 : WindowToScreen関数からexit関数を追い出す(MyInfoEnumProc関数の修正)
- 2009.10.07 : マルチモニタ環境でのモニタ順序と、座標や作業領域の取り扱い
- 2009.10.20 : Negative coordinatesの扱いと、上の件で間違ってたと思われるところを補足
- 2009.10.23 - 27 : (EnumDisplayMonitors APIでの)モニタの順序ってアテにならないのね…… → 別の方法を模索
- 2009.11.02 : これまでの変更に対応するために、WindowToScreen関数を修正して、一旦終わり
- 2009.11.11 : !RainmeterMoveをマルチモニタ対応にする
- 2009.11.15 : ユーザー切り替え時にEnumDisplayDevices APIが失敗してクラッシュを引き起こすことがある問題を修正

- 2009.12.17 : これまでの成果のほか、ディスプレイセレクタ機能などを追加したマルチモニタ対応コードを本家にコミットしました (r317)
 ※ マルチモニタ環境でウィンドウの挙動がおかしくなる場合には、こちらのテスト用DLL(Rainmeter-1.1用)を使ってみてください。いくつかの環境で症状の改善を確認しています。(ディスプレイセレクタ機能はついていません)

以下、続きに格納。

続きを読む »

[Rainmeter-dev] ウィンドウの移動処理

2009.11.22 | Rainmeter-dev // Issue/マルチモニタ関連

0 Comments

ウィンドウの移動処理についてのまとめです。
私的なまとめですので、公開されているビルドに反映されているものではありません。ご注意ください。

■対象となるRainmeterのバージョン
0.14.1 のマルチモニタ対応版 以降 ~ 1.1 (r306)

■更新履歴(※更新のたびに、たぶん一番上にあがってきます)
- 2009.11.07 : Step.1: スキンウィンドウのドラッグ中は位置保存を行わないようにする(フラグ管理の修正)
- 2009.11.07 : Step.2: "On Desktop"なスキンウィンドウを正常にドラッグできないことがある問題を修正する
- 2009.11.10 : Step.3: スキンウィンドウを上方向の画面外にドラッグしたときに、画面内に戻ってこないようにする
- 2009.11.12 : Step.4: ドラッグ可能な状態でもLeftMouseUpActionを実行できるようにする(移動処理の総まとめ)
- 2009.11.22 : ドラッグ中に、スキンウィンドウが元の位置(ドラッグ開始位置)に描画されてしまうことがある問題を修正

※!RainmeterMoveの修正については、マルチモニタ対応の記事に書きました。

以下、続きに格納。

続きを読む »

[Rainmeter-dev] 過剰にRefreshされる問題

2009.11.04 | Rainmeter-dev // Issue/マルチモニタ関連

0 Comments

(※いろんな記事に分散してたのを統合しました)

Rainmeter0.14.1 ~ 1.0で、壁紙や視覚効果の設定を変更すると、解像度変更とは関係ないのにスキンが"Refresh"されてしまう問題についてのまとめです。
本家でのコード変更についてのコメントや、私自身の変更案、コミット予定/済みなものなどが入り混じっていますので、決して公開されているビルドに反映されているものばかりではありません。ご注意ください。

※Rainmeter 1.1ではRefresh処理が省かれたことにより、処理が軽減されてクラッシュする可能性も小さくなりました。

■更新履歴(※更新のたびに、たぶん一番上にあがってきます)
- 2009.09.xx : タイマーを使って遅延処理するように変更(メッセージループの処理を阻害しないようにする)
- 2009.11.04 : タイマー形式を使わず、CTrayWindowでメッセージ検知して全スキンウィンドウを更新するように変更して、一旦終わり

以下、続きに格納。

続きを読む »

[Rainmeter-dev] issue 111

2009.09.27 | Rainmeter-dev // Issue/マルチモニタ関連

2 Comments

r229で入れた変更がどうやらバグを生んでいたようで、バタバタですが取り急ぎその部分の変更を取り消しました。
WebParserでの単純な勘違いによるコピペミスもそうですけど、なんだか変更するたびにどこかバグを埋め込んでる感じでダメダメですね……。
[Measure]の置き換えの挙動修正も、今まで動いてたものが動かなくなることもあって、もう少し後方互換性を考慮した形での修正も含めてからにしたほうがよかったなぁと……)

今回のバグは、自分の環境の設定では起こらないものでした……。

/*
** OnMove
**
** Stores the new place of the window so that it can be written in the config file.
**
*/
LRESULT CMeterWindow::OnMove(WPARAM wParam, LPARAM lParam) 
{
    // Store the new window position
    m_ScreenX = (SHORT)LOWORD(lParam);
    m_ScreenY = (SHORT)HIWORD(lParam);
/*
    if(m_Dragging)
    {
        OutputDebugString (_T("OnMove Dragging\n"));
    }
    else
    {
        OutputDebugString(_T("OnMove No Dragging\n"));
    }
*/
 
    if (m_SavePosition && m_Dragging)
    {
        //TODO: Recaculate WindowX/Y based on position flags
        //m_WindowX = m_ScreenX;
        //m_WindowY = m_ScreenY;
        ScreenToWindow();
        WriteConfig();
    }
    m_Dragging = false;
 
    return 0;
}

OnMove()はWM_MOVEが送られてきたとき、すなわちウィンドウの移動後に処理されます。
この「ウィンドウの移動後」というタイミングが、「ドラッグ中にウィンドウの内容を表示する」という設定をオンにしているかオフにしているかで変わるようで……。
(この設定はXPだと「画面のプロパティ」-「デザイン」-「効果...」にあります)

オフ(うちの環境)だと、ドラッグ中にはまったく送られてこず、ボタンを離すとWM_MOVEが送られてきます。
オンだと、ドラッグしてウィンドウを動かしている最中でも、たぶんその説明の通り、ウィンドウの内容を表示するために何度もWM_MOVEが送られてきます。オフのほうだけを確認して、てっきり「ドラッグ中には送られてこないんだ」と勘違いしてました。

赤字の "m_Dragging = false;" は、ドラッグが終わってもm_Draggingがそのままtrueを維持し続ける変な状態を修正しようと入れたのですが(コード上はOnLeftButtonDown()でm_Draggingがtrueにされ、OnLeftButtonUp()でfalseにリセットするようになっているけれど、ボタン押下からドラッグに遷移すると、ドラッグが終わってもOnLeftButtonUp()が呼ばれないので、リセットされずtrueのままになっている)、WM_MOVEが1度しか飛んでこないか、何度も飛んでくるかで話が全然違ってきます。

オフだと、ドラッグが終わってからWM_MOVEが飛んでくるので、ドラッグ終了位置を書きだしてm_Draggingをクリアして終わります。
オンだと、ドラッグ中に飛んでくる最初のWM_MOVEで現在値を書き出してm_Draggingをクリアしてしまい、その後のドラッグが終わったときのWM_MOVEでドラッグ終了位置を書き出せずに終わってしまいます。結果、refreshなどをすると、ドラッグ終了位置から最初に書き出した位置にジャンプしてしまうような(位置が全くセーブされていないような)挙動になります。

環境依存な問題ならまだしも、基本的なシステム設定の違いでこういうバグを埋め込んじゃうのはいただけないですね……。反省。
正直なところ、trueを維持していようが、動作としては特に問題なさそうではあったので、そのままにしておいてもよかったわけで(特に1.1正式版リリース間近なのに)、最近のポカミスラッシュとかいろいろ含めて結構凹み中ですorz

上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。