0

特定の色(色#A9D691)が選択されたときにフレークの色が白に変わるように、ファジーフレークのスクリーンセーバーをハックしようとしています。私はそれを行う方法を正確に理解できないようです(私はこのようなものには少し慣れていません)。

コードを確認しましたが、フレークの色はFuzzyFlakesInit()関数の終わり近く、ここのあたりで設定されているようです。

Flake.ForeColor = FuzzyFlakesColorResource(Flake.Colors.Fore);
Flake.BackColor = FuzzyFlakesColorResource(Flake.Colors.Back);
Flake.BordColor = FuzzyFlakesColorResource(Flake.Colors.Bord);

Flake.GCValues.foreground = Flake.ForeColor;
Flake.GCValues.background = Flake.BackColor;

私がやろうとしているのは、最初に特定の色が設定されているかどうかを確認し、設定されている場合はFlake.Colors.Fore変数を白に設定することです。私は次のようなコードを使用してみました:

if (flake->Colors.Fore == (char) "#A9D691") {
         flake->ForeColor = FuzzyFlakesColorResource(flake, "white");
          } else {
        flake->ForeColor = FuzzyFlakesColorResource(flake, flake->Colors.Fore);
       } 
flake->BackColor = FuzzyFlakesColorResource(flake, flake->Colors.Back);
flake->BordColor = FuzzyFlakesColorResource(flake, flake->Colors.Bord);

悲しいことに、そのような単純なハックは機能しません。FuzzyFlakesColorHelper()したがって、関数はすでにこれらの変数を設定しているように見えるので、「#A9D691」を他の何かに変換する必要があるかどうかはわかりません。

4

2 に答える 2

2
if (flake->Colors.Fore == (char) "#A9D691")

カラー文字列を文字列リテラルへのポインタと比較し、"#A9D691"にキャストしcharます。これはtrueを返しません。文字列の値を比較したいので、strcmp

if (strcmp(flake->Colors.Fore, "#A9D691") == 0)
于 2012-07-17T23:04:14.160 に答える
1

バギーカラーアルゴリズムでごめんなさい。意図したとおりに機能することは決してなかったので、コードを送信する前にさらにデバッグする必要がありました。変更をFuzzyFlakesColorHelperに入れる必要があります。行を変更した場合:

sprintf(Flake.Colors.Fore, "#%02X%02X%02X", iR0, iG0, iB0);

のようなものに

sprintf(Flake.Colors.Fore, "#%02X%02X%02X", 0xFF, 0xFF, 0xFF);

これにより、フレークが白になるか、FuzzyFlakesInitのFlake.Colors.Foreが変更されます。

  /*
   * Here we establish our colormap based on what is in
   * Flake.Colors.Back
   */
  if (FuzzyFlakesColorHelper())
    {
       fprintf(stderr, " reverting to random\n");
       if (Flake.Colors.Back)
        free(Flake.Colors.Back);
       Flake.Colors.Back = malloc(sizeof(unsigned char) * 8);
       sprintf(Flake.Colors.Back, "#%X%X%X%X%X%X", random() % 16,
             random() % 16, random() % 16, random() % 16, random() % 16,
             random() % 16);
       FuzzyFlakesColorHelper();
    }


  Flake.BackColor = FuzzyFlakesColorResource(Flake.Colors.Back);
  Flake.BordColor = FuzzyFlakesColorResource(Flake.Colors.Bord);

16進形式の#ffffffで色を指定できるようにする場合は、FuzzyFlakesColorResourceを介して色を渡す必要があります。これは、そのフォームからxscreensaverおよびX11で使用されるフォームに変換されます。

これが機能する方法は、指定した色が背景色であり、この色アルゴリズムは、FuzzyFlakeColorHelperを完全にバイパスした場合に、境界線の色(Flake.Colors.Bord)とフレークの色(Flake.Colors.Fore)を選択することになっています。トリックを実行できる色を手動で設定します(これが元のバージョンの動作であり、色は元のバージョンにハードコードされていますが、1つの色を指定して、2つの類似した色を選択できると便利だと思いました。 )何年も経った今でも、私のスクリーンセーバーが気に入ってくれて嬉しいです。頑張ってください。

于 2014-03-15T02:03:52.343 に答える