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

スポンサーサイト

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

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

[Rainmeter-dev] TwitterのTLが文字化けする

2010.08.17 | Rainmeter-dev // Issue/互換性問題やバグ修正

21 Comments

TwitterでRainmeterについて検索してみると、TwitterのTLを表示させると文字化けするっていうつぶやきがちらほらと見受けられます。
RainmeterでTwitterのタイムラインを取得すると、「はじめまして!」のような文字列が表示されてしまいますが、これは数値文字参照と言って、文字を10進数または16進数文字列で表しています(これは「はじめまして!」を表す)。本来は表示前に元の文字へと戻してやる必要があり、ブラウザなどではその処理をしてから表示していますが、RainmeterのWebParserにはその処理が入っていません(英語圏では変換して使うような文字があまりなく、そう問題にならないので)。

この数値文字参照を元の文字に戻す処理を加えたWebParserを作ってみたので、下へ置いておきます。変なことはしてないので、1.0でも使えると思います。興味のある方は試してみてください。

Rainmeter 1.3にこの変更を取り込んだので、公開終了しました。
デフォルトでは有効化されませんので、スキン製作者側または使用者側で適宜設定を行ってください。

適用方法)
WebParserを使っているMeasureで、かつ"StringIndex="を設定してあるものに、"DecodeCharacterReference=1"を設定してください。

例)

[Feed1.mLink1]
Measure=Plugin
Plugin=Plugins\WebParser.dll
Url=[Feed1]
DecodeCharacterReference=1
StringIndex=2

設定値)

0 : なにもしない (デフォルト動作)
1 : 数値文字参照と実体参照の両方をデコードする
2 : 数値文字参照のみをデコードする
3 : 実体参照のみをデコードする

※Substituteの設定値によっては意図しない結果になることもありますので、適宜調整してください。
(例えば、結果の文字列からダブルクォーテーションを消すためにSubstitute=""":""を指定してあった場合、DecodeCharacterReferenceを定義することによって&quot:は"に置き換えられてしまうため、消されずに残ってしまいます)

また、この件とは関係ありませんが、TwitterのBASIC認証が廃止されたために、TLが取得できなくなって困った方もおられると思います。これに関しては、GnometerがSuperTweetを介しての取得に対応していますので、そちらのコードを参考にしてみてください。

■更新履歴
2010.12.16 : 公開終了しました。
2010.08.17 : Rainmeter 1.3 beta r501 をベースに作成し直しました。処理も少しだけ変えているので、r320版と文字処理の動作が違っていたら教えてください。

続きはコード詳細。

続きを読む »

スポンサーサイト

[Rainmeter-dev] Rainmeter on Windows 2000

2010.01.21 | Rainmeter-dev // Issue/互換性問題やバグ修正

2 Comments

RainmeterをWindows 2000上で動かしたときの問題についてのまとめです。
私的なまとめですので、公開されているビルドに反映されているものではありません。ご注意ください。

■更新履歴(※更新のたびに、たぶん一番上にあがってきます)
- 2009.10.28 : Windows 2000に対応してない標準添付プラグインについて
- 2009.11.04 : Aboutダイアログを出そうとするとエラーが表示される問題について
- 2010.01.20 : ResMonプラグインをWindows 2000に対応させる

以下、続きに格納。

続きを読む »

[Rainmeter-dev] いろいろ

2009.11.29 | Rainmeter-dev // Issue/互換性問題やバグ修正

0 Comments

こまごまとした修正点や改善点のまとめです。
私的なまとめですので、公開されているビルドに反映されているものではありません。ご注意ください。

■更新履歴(※更新のたびに、たぶん一番上にあがってきます)
- 2009.04.20 : NetIn/NetOutでInterfaceを指定してCumulative=1とすると、正常な値が表示されない
- 2009.11.06 : Meter=STRINGでPercentual=1のときに、NumOfDecimalsの設定が有効にならない
- 2009.11.06 : Meter=STRINGでNumOfDecimals=0のときに、32ビットを越える値を表示できない
- 2009.11.06 : PerfMonプラグインで、32ビットを越える値を取得できない
- 2009.11.10 : ログに多バイト文字を出力できない(2009.11.29 追記)

以下、続きに格納。

続きを読む »

[Rainmeter-dev] Aeroが有効な環境で"On Desktop"にすると、スキンウィンドウが消える問題

2009.11.05 | Rainmeter-dev // Issue/互換性問題やバグ修正

0 Comments

Aeroが有効な状態でスキンのZオーダーを"On Desktop"に変更したら、画面から消えてなくなってしまう問題についてのまとめです。
私的なまとめですので、公開されているビルドに反映されているものではありません。ご注意ください。

■更新履歴(※更新のたびに、たぶん一番上にあがってきます)
- 2009.10.30 : Desktop compositionが有効なら、"On Desktop"を使わせないようにする("Bottom"に切り替える)
- 2009.11.05 : "On Desktop"なスキンウィンドウが存在するときにDesktop compositonを無効→有効にされたら、その切り替えを検知して"Bottom"に切り替えるようにする

以下、続きに格納。

続きを読む »

Refresh

2009.08.19 | Rainmeter-dev // Issue/互換性問題やバグ修正

0 Comments

kenz0さんの投稿されたIssue97はRefreshの中身が問題なのかなーと思い、ソースを見てみました。
(ダンプファイルってどうやって使うんだろう……こういう部分も勉強しないとなぁ)

!RainmeterRefreshがBANGされると、CMeterWindow::Refresh()が引数init = falseで呼ばれます。
中身はこんな感じ。

/*
** Refresh
**
** This deletes everything and rebuilds the config again.
**
*/
void CMeterWindow::Refresh(bool init)
{
    /* snip */
 
    if(!init)
    {
        // First destroy everything
        // WriteConfig(); //Not clear why this is needed and it messes up resolution changes
 
        KillTimer(m_Window, METERTIMER);    // Kill the timer
        KillTimer(m_Window, MOUSETIMER);    // Kill the timer
        KillTimer(m_Window, FADETIMER);    // Kill the timer
 
        std::list<CMeasure*>::iterator i = m_Measures.begin();
        for( ; i != m_Measures.end(); i++)
        {
            delete (*i);
        }
        m_Measures.clear();
 
        std::list<CMeter*>::iterator j = m_Meters.begin();
        for( ; j != m_Meters.end(); j++)
        {
            delete (*j);
        }
        m_Meters.clear();
 
        if(m_Background) delete m_Background;
        m_Background = NULL;
 
        m_BackgroundSize.cx = m_BackgroundSize.cy = 0;
 
        m_BackgroundName.erase();
    }
 
    //TODO: Should these be moved to a Reload command instead of hitting the disk on every refresh
    ReadConfig();    // Read the general settings 
    ReadSkin();
 
    InitializeMeters();
 
    /* snip */
}

Refresh(false)が呼ばれると、今まで使っていたMeasureとMeterをすべて削除し、作り直しています。
作り直すこと自体には別に問題ないですが、もしこれがUpdateタイマーでの更新タイミングで(IfEqualsActionなどから)呼び出されたものなら、呼び出し元Measureもdeleteしちゃうことになります。処理を終えても、呼び出し元がdeleteされちゃってるので、たぶんクラッシュします(?)。

同じように、前回書いた解像度変更のWM_SETTINGCHANGEまわりでクラッシュするというのも、Refresh(false)が過剰に呼び出され続けるタイミングで通常のUpdateタイマーでの更新が走ってクラッシュしてるのかなぁと想像(これはスレッドセーフではないということ? )。
(メッセージキューは1つしかないから、並行して実行することはなさそうだし、原因は別かな……)

これが原因と仮定して対策をするとして……IfなんとかActionから!RainmeterRefreshが呼び出された場合はどうすりゃいいんだろう……。deleteしちゃうようなものが呼ばれると構造上きつい気がする……。

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