2018-04-29

デスクトップの魔物... 雨降って頭固まっちゃった!?

デスクトップには魔物が住むという...
なかなか仕事が手につかず、とりあえず周りの整理整頓をしていると、これが徹底的にやらないと気が済まなくなり、夜な夜な大掃除を始めてしまう始末。やらなければならない!という意識が強いほどマインドセットに逆らってしまう。条件反射的に。天の邪鬼な性癖がそうさせるのか...
デスクトップ環境をいじるのにも、これに似た心理が働く。カスタマイズ衝動が、かっぱえびせん状態へ誘うのだ。忙しい時にかぎって。そして、 雨計量器に嵌ってもうた...

1. Rainmeter(Stable Ver 4.1)... こいつの柔軟性にイチコロ!
Windows 系のデスクトップツールで遊ぶなら、こいつは最強かもしれない。なにしろ、ある種の言語システムもどきを具えているのだから。Documentation サイトも非常に参考になる。
スキン求めて、deviantArt あたりを散歩すると... スキン集というより、コードの宝庫!あまりの量に目移りし、どれをベースに改造しようか、惚れっぽい酔いどれは、はしごしまくり。柔軟性が高いということは自由度が高いことを意味し、自分でいじり倒すことができなければ、逆に不自由の呪縛にかかる。自由への道は険しい。ド M を覚醒させるにはうってつけの性向か...
中には完成度の低い作品もあり、自分の環境に合わせてカスタマイズを強いられる。やがて採用したスキンすべてに対して、なにかしらいじらないと落ち着かなくなる。自由というより、これはもう依存症だ!

2. マルチモニタ環境で... 病みつき!
スキン毎に「ドラック許可」や「クリックスルー」などの設定を組み合わせて、擬似的にドラッグ禁止領域を作ることができる。透明色で前面に配置しておけば、普段触りたくないリソースモニタ用アプリの保護領域を作ったり。
ちなみに、狼の黄色い目と青い目のあたりが、その領域...




とはいえ、あまり凝って、デスクトップツールに CPU を持っていかれれば本末転倒。リソースモニタ以外のアニメーションは、四つの地球儀と時計だけにし、CPU 使用率を 3% 未満に調整する。尚、CPU は、Intel Core i7-7700 3.6GHz...
右上画面には、三つの地球儀を重ね、大きくなるにつれて周期を遅くし、左下画面には、"Van Schagen Globe" という大航海時代風の地球儀スキンに "Steam Clock" という時計スキンの歯車を接地させて、ポンプで地球儀を回転させているように見せている。ちなみに、時計といえば、おいらは、SKAGEN を愛用している。Schagen と SKAGEN では綴りが違うけど日本語の発音は同じ。思わず夜の社交場でお馴染みの口癖を漏らす... 奇遇だねぇ!

尚、カレンダー、イベント、ToDo リストでは、姉妹ソフトの Rainlendar を採用している。Rainmeter に比べて柔軟性は劣るが、これらの要素では手軽さを優先したい。
Rainmeter の気がかりは、オーディオ制御系がちと不安定なところであろうか。ソースのスイッチングなど。使えないほどではないが、うちの環境といまいちマッチしない模様。お気に入りのイコライザや VU メータもあって惜しいのだけど。
てなわけで、WMP + XTHREE + FRUITY + DefaultAudioChanger を採用(画面右上)。実は、FRUITY にも嵌ってたりして...

3. 記述フォーマットに... なんとなくノスタルジア!
スキンファイルの拡張子は .ini で、基本フォーマットはこれ...

  [Section]
  Key=Value

Section には、こんなものがある。

  [Rainmeter] : 全体のオプション定義
  [Variables] : 変数定義
  Measures    : CPU やメモリなどの計測オブジェクト(Measure=Option で指定)
  Meters      : 視覚的なオブジェクト(Meter=Option で指定)
  MeterStyles : Meters のオプション定義。
  [Metadata]  : 動作に無関係な情報を記述

オブジェクト名はなんでもいいようだが、とりあえず、このあたりの動作を抑えておきたい。

  Measure=Calc    : 演算制御オブジェクトに指定
  Meter=Shape     : 形状制御オブジェクトに指定
  Meter=Image     : 画像制御オブジェクトに指定
  Meter=Rotator   : 回転制御オブジェクトに指定
  Meter=Roundline : 円運動制御オブジェクトに指定
  Meter=Button    : マウス操作オブジェクトに指定

Shape オブジェクトには基本的な属性が揃っている。
Rectangle(長方形), Ellipse(楕円), Line(線), Arc(円弧), Curve(曲線), Path(パス)、あるいは、 図形の結合やグラデーションなど。
Image オブジェクトでは、画像データの位置やサイズの変更が自由にでき、色を混在させることもできる。
そして、軽く試すと、こんな感じ...

;; 横方向にグラデーション
[Object1]
Meter=image
BackgroundMode=2
SolidColor=0,0,0,255
SolidColor2=0,0,0,0
X=0
Y=0
W=100
H=200

;; 縦方向にグラデーション
[Object3]
Meter=Shape
Shape=Rectangle 0,0,200,100 | Fill LinearGradient MyFillGradient | Stroke Color 0,0,0,0
MyFillGradient=90 | 0,0,0,0 ; 0.0 | 0,0,0,255 ; 1.0
; MyFillGradient で角度を指定する。0度や180度にすれば横方向。
X=0
Y=250

;; 枠付き長方形
[Object2]
Meter=Shape
Shape=Rectangle 0,0,200,100 | Fill Color 0,0,0 | StrokeWidth 4 | Stroke Color 0,0,255
X=0
Y=400

4. おまけ... 目玉!
新人時代に実習で書いたマウスカーソル追尾プログラム(C コード)を移植してみた。
目玉を二つにしたければ、インスタンスを二つにするだけ。具体的には、別々のフォルダにそれぞれ同じ ini ファイルを置く。
ところで、マウスカーソルを含めた画面キャプチャで、ちと悩んでしまった。
Windows 標準の「拡大鏡」なんてツールは一生使わない!と思っていたけど、こいつでわりと簡単! 拡大鏡ウィンドウをアクティブにした状態でマウスを移動させて、Alt + PSc で一発。へぇ~...
尚、ビューモードは固定。



さて、基本的な演算子はだいたい揃っているので、計測で困ることはあまりなさそう。
マウスの座標を取得するには、"MouseXY" という Plugin を見つけたので、どこぞからもってきた。
また、ビルトイン変数を知っているとなかなか便利。リソースのパスを暗黙に取得したり、モニタ変数を動的に取得したり。動的オブジェクトに対しては、現在の位置とサイズを取得するビルトイン変数が用意されている。

  #CURRENTCONFIGX#
  #CURRENTCONFIGY#
  #CURRENTCONFIGWIDTH#
  #CURRENTCONFIGHEIGHT#

尚、動的変数は、Measure と Meter だけに許されていて、おまじないを一つ書いておけばいい。

  DynamicVariables=1

あれ?
Roundline オブジェクトの "StartAngle" というオプションが、0度を指定すると3時の方向?なので、頂点から開始するなら 270度を指定するってこと?目玉なんて、どこから始まってもええんだけど、とりあえず Documentation サイトの事例に従って...

  StartAngle=(Rad(270))

RotationAngle は、360度フルに欲しいから...

  RotationAngle=(Rad(360))

そして、コードはこんな感じ...

[Metadata]
eye follow the cursor... Junk Edition.

[Rainmeter]
Update=20

[Variables] 
EyeColor=127,255,212
IrisColor=47,79,79
PupilColor=0,139,139
OutlineColor=47,79,79

EyeSize=180
IrisSize=80
PupilSize=30
OutlineSize=2
AdjustMaxLen=0.005
AdjustEyeDis=0.002
; "AdjustMaxLen" は、[MaxLength]オブジェクトに対する瞳孔の移動係数。
; "AdjustEyeDis" は、[EyeDistance]オブジェクトに対する瞳孔の移動係数。
; 目のサイズを変更すると、これらを微調整しないと瞳孔が眼球からはみ出すかも...

[PosX]
Measure=Plugin
Plugin=MouseXY
Dimension=X
 
[PosY]
Measure=Plugin
Plugin=MouseXY
Dimension=Y

[EyeArea]
Meter=Roundline
W=#EyeSize#
H=#EyeSize#
StartAngle=(Rad(270))
RotationAngle=(Rad(360))
LineLength=(0.5*#EyeSize#)
LineColor=#EyeColor#
Solid=1
AntiAlias=1

[EyeOutline]
Meter=Roundline
W=#EyeSize#
H=#EyeSize#
StartAngle=(Rad(270))
RotationAngle=(Rad(360))
LineLength=(0.5*#EyeSize#-#OutlineSize#)
LineStart=(0.5*#EyeSize#)
LineColor=#OutlineColor#
Solid=1
AntiAlias=1

[EyeAngle]
Measure=Calc
DynamicVariables=1
Formula=(Atan2(([PosY]-0.5*#EyeSize#-#CURRENTCONFIGY#),([PosX]-0.5*#EyeSize#-#CURRENTCONFIGX#)))

[EyeDistance]
Measure=Calc
DynamicVariables=1
Formula=(Sqrt(Abs(([PosX]-0.5*#EyeSize#-#CURRENTCONFIGX#)**2+([PosY]-0.5*#EyeSize#-#CURRENTCONFIGY#)**2)))

[MaxLength]
Measure=Calc
DynamicVariables=1
Formula=(0.5*(#EyeSize#-#IrisSize#)-#OutlineSize#+1)

[Iris]
Meter=Roundline
DynamicVariables=1
W=#IrisSize#
H=#IrisSize#
StartAngle=(Rad(270))
RotationAngle=(Rad(360))
LineLength=(0.5*#IrisSize#)
LineColor=#IrisColor#
Solid=1
X=(([EyeDistance] > [MaxLength] ? ([MaxLength]*Cos([EyeAngle])) : ([EyeDistance]*Cos([EyeAngle])))+0.5*(#EyeSize#-#IrisSize#))
Y=(([EyeDistance] > [MaxLength] ? ([MaxLength]*Sin([EyeAngle])) : ([EyeDistance]*Sin([EyeAngle])))+0.5*(#EyeSize#-#IrisSize#))

[Pupil]
Meter=Roundline
DynamicVariables=1
W=#PupilSize#
H=#PupilSize#
StartAngle=(Rad(270))
RotationAngle=(Rad(360))
LineLength=(0.5*#PupilSize#)
LineColor=#PupilColor#
Solid=1
X=([Iris:X]+0.5*(#IrisSize#-#PupilSize#)+([EyeDistance] > (2*[MaxLength]) ? (#AdjustMaxLen#*[MaxLength]) : (#AdjustEyeDis#*[EyeDistance]))*#IrisSize#*Cos([EyeAngle]))
Y=([Iris:Y]+0.5*(#IrisSize#-#PupilSize#)+([EyeDistance] > (2*[MaxLength]) ? (#AdjustMaxLen#*[MaxLength]) : (#AdjustEyeDis#*[EyeDistance]))*#IrisSize#*Sin([EyeAngle]))

0 コメント:

コメントを投稿