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

スポンサーサイト

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

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

Rainmeter 0.14.1

2009.03.19 | Rainmeter-dev

0 Comments

Google Codeにて、untested versionと注記はされているものの、最新のRainmeter 0.14.1が公開されました。
プロジェクトトップページを見ると、「Featured Downloads」に「Rainmeter-latest-20090310-32bit.exe」と表記されているだけで、(untested)と書かれたコメントが見えないので、非常に紛らわしいですね。あくまでテスト版という位置づけだと思います。
(ヘルプファイルでの表記は、Version 0.15となっているので、次期正式版は0.15となるのでしょう)

この0.14.1には、以下の修正点が含まれています(ヘルプより)。

・Diskspace can be checked from the removable drives too.
・Time measure didn't show correct week number. Fixed.
・New plugin: RecycleManager

新しいプラグインの完成度は別として、本体としては順調にbug fixから入っていってるのかなという印象です。ちなみに、前回記事のROUNDLINEでAAがかかるようになる修正は0.14.1には入っていません。
新機能の提案もいくつか面白そうなものがあって、楽しみではあります。IMAGEのアスペクト比保持とか。

で、本題です。

修正点には記載されていませんが、今回の「untested」として公開されたものでは、0.14に存在したNetIn/NetOutにあったバグが修正されていると思います。
(たとえばMeter=BARで「MaxValue」を指定しないとバーが振れない、というようなバグなら)

0.14として公開されていたものは、設定ファイルからの「MaxValue」や「NetInSpeed/NetOutSpeed」の読み取りにバグがあり、「MaxValue」での指定がないと、最大値が「-0.125 (-1/8)」に固定されてしまっていました(マイナスになるのが厄介)。そのため、本来であれば描画に必要な「現在値を元に0.0-1.0の間の値を返す関数」が0.0しか返さなくなり、結果、バーが振れないと。
(他のMeterだと振れるのは、たぶんこの関数を使わずAutoScaleや現在値を元に描画してるから……かな?)

ということで、test版とはいえ本体におかしな修正や新機能が入ったりはしていないので、次に公開されると思われる(ROUNDLINEの修正された)バイナリを使ってみるのもいいかもしれません。(※)

(※)ROUNDLINEの修正まで入ったバイナリが3/20に公開されました。ちなみに、次回のバイナリからはIssue3(Relative window positions)の機能追加が入ると思われるので、本当の意味で「untested」なものになると思います。

続きからは、上記NetIn/NetOutのバグとなっていたと思われる部分のソースについて。

旧サイトで公開されていた0.14ソースには一部変なところがあって、std::wstringを使っているわけでもないのに比較にstd::wstring::nposが出てきたりしてました。NetIn/NetOutもこれでバグってたんだと思います。
ちなみに、Google Codeに上げられた最初のソースは、この旧サイトのソースとは微妙に違っていて、この時点からすでにバグが修正されていました。

該当部分は、MeasureNet.cppのReadConfig()内にあります。

[MeasureNet.cpp (Rainmeter 0.14) : line 313 - 321]

    double maxValue = parser.ReadFloat(section, L"MaxValue", -1);
    if (maxValue == std::wstring::npos) 
    {
        maxValue = parser.ReadFloat(section, netName, -1);
        if (maxValue == std::wstring::npos) 
        {
            maxValue = value;
        }
    }

313行目で取得した「MaxValue」の比較に、何故かstd::wstring::nposが使われています。こいつは-1とは限らないので、「MaxValue」の指定がなかった場合、比較で失敗し、そのまま最大値に-1が使われてしまいます(実際にはbits per secondからbytes per secondへの変換が入るので、-0.125)。

「MaxValue」の指定があれば、その値が使われることになり、想定した動作になりますが、「NetInSpeed/NetOutSpeed」のみが指定されていた場合は、指定されているにも関わらず、最初の「MaxValue」の比較で失敗するので、316行目まで到達せず、読み取りすら行われません。結果、-1になります。

[MeasureNet.cpp (Rainmeter 0.14.1 from Google Code) : line 313 - 321]

    double maxValue = parser.ReadFloat(section, L"MaxValue", -1);
    if (maxValue == -1) 
    {
        maxValue = parser.ReadFloat(section, netName, -1);
        if (maxValue == -1) 
        {
            maxValue = value;
        }
    }

こちらでは、問題の314/317行目の比較対象が-1に修正されています。浮動小数点での等値比較なのがちょっとアレですが、意図的にマイナス値を指定しない限りは意図通りに動くと思います。(319行目のvalueはRainmeter.iniから読まれた「NetInSpeed/NetOutSpeed」の値。指定がなければ0になってる)。
どの指定もされない場合は、最大値に0を指定したとみなされ、ヘルプ通りにつど最大値を記憶しながら動作するようになります。

« リンク追加 RainmeterのROUNDLINE »

- Comments
0 Comments

管理者にだけ表示を許可する
- Trackbacks
0 Trackbacks


この記事にトラックバックする(FC2ブログユーザー)

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