Awesomeのバイナリ時計ウィジェット

どうしてこんな人生に来たか


それはすべて、新しい仕事への移行から始まりました。 しかし、いや...それはすべて奇跡の時計で偶然どこかで見たイメージからMarlaで始まりました 。 この画像に興味があり、ウィキペディアの助けを借りて、バイナリクロック( バイナリコード化された10進時計 )のようなすばらしいものを発見しました。その後、自由時間でJavaを勉強し、この時間表示の概念に染み込んでしまいました。バイナリクロックを使用した簡単なアプリケーションを作成しました。 時間が経ち、アプリケーションはずっと前に忘れられ、バイナリ時計は一時的に私の視界から外れ、記憶の屋根裏部屋に落ち着きました。 しかし、その後、一連のイベントがこの屋根裏部屋を揺り動かし、バイナリクロックの考えが再び脳の処理に入りました。



主な出来事は仕事の変更と、その後の17インチモニターの23インチへの変更でした。 数週間の作業の後、私が1年以上使用していたGnomeでは、利用可能なすべてのデスクトップスペースを完全に使用できないことが明らかになりました(1920 * 1080、10年前にモニターでこのような解像度を考えるのは怖かったです)。 比fig的にウィンドウを配置するのはかなり不便です。私の組織でのシステム管理者の作業の詳細には、少なくともコンソール、ブラウザー、メッセンジャー、およびrdesktopやvncviewerなどのアクティビティのコンテキストによって異なるアプリケーションのヒープを同時に開いて並行して使用することが含まれます



その瞬間、私はもう一度タイルデスクトップマネージャーについて言及し、この方法でワークスペースを整理することにしました。 そして見よ、それは非常に便利であることが判明した。 いくつかのWMを試した後、 Awesomeを選択しました。 数日間使用した後、このタイプのWMは作業に最適であり、awesomeはこのタイプの価値のある代表であると確信し、デスクトップをカスタマイズする可能性を検討し始めました。 幸いなことに、Awesomeは3番目のバージョンから、構成にLua言語のスクリプトを使用します。これにより、構成にウィジェットを直接書き込むことができます。 Awesomeサイトで利用可能なウィジェットをユーザーから調べてみると、 アナログ時計ウィジェットに出会いました。このウィジェットのコードをざっと見てみると、長い間興味のあるものを実装する絶好の機会がわかりました。 これに必要なのは、Awesome自体のツールを使用して画像を描画する機能だけであるため、ウィジェットは外部コンポーネントから独立しています。



image:draw_rectangle(x,y,w,h)







もちろん、私はこれまでLuaを使用したことはありませんでしたが、タスクは非常に簡単に思えたので、仕事に取り掛かりました。



さあ行こう


必要なファイルをテキストエディターで開きます。



$vim ~/.config/awesome/rc.lua







既存のテキスト時計ウィジェット広告を探しています



mytextclock = awful.widget.textclock { align = "right" }




そして、「作成」を開始します。



binaryclock = { }

binaryclock.widget = widget { type = "imagebox" }

binaryclock.w = 51-

binaryclock.h = 24 --height(6の倍数であることが望ましい)

-驚くほどwiboxの高さに合わせて時計で画像のサイズを変更することを忘れないでください

binaryclock.show_sec = true- 秒を表示する必要がありますか?

binaryclock.color_active = beautiful.bg_focus- アクティブなドットカラー

binaryclock.color_bg = beautiful.bg_normal- 背景色

binaryclock.color_inactive = beautiful.fg_focus- 非アクティブなドットカラー

binaryclock.dotsize = math.floor binaryclock.h / 6 )- ドットサイズ

binaryclock.step = math.floor binaryclock.dotsize / 2 -ドット間の空白

binaryclock.widget.image = image.argb32 binaryclock.w、binaryclock.h、 nil -イメージの作成

if binaryclock.show_sec then binaryclock.timeout = 1 else binaryclock.timeout = 20 end-秒を表示しない場合、頻繁に更新する必要はありません




ご覧のとおり、すべてのウィジェット設定はここで設定され、すべての基本的なサイズ計算はそこで行われます。

次に、Lua言語の既製のソリューションを使用しました。これにより、10進数の数値を他の数値に変換できます。

binaryclock.DEC_BIN = function IN )-- Lostgallifreyanへの感謝(http://lua-users.org/lists/lua-l/2004-09/msg00054.html)

ローカル B、K、OUT、I、D = 2「01」「」0

IN > 0の場合

I = I + 1

IN、D = math.floor IN / B math.mod IN、B + 1

OUT = string.sub K、D、D ..OUT

終わり

戻る

終わり




次に、クロックのダイオードポイントをそれぞれ数値自体に描画する関数を宣言します

binaryclock.paintdot = function val、shift、limit -左側からのシフトでドットとしてペイントする

ローカル binval = binaryclock.DEC_BIN val

ローカル l = string.len binval

ローカルの高さ= 0-高さ調整、ドットを持ち上げる必要がある場合

if l < limit then

i = 1の場合、limit-l do binval = "0" .. binval end

終わり

i = 0の場合、limit- 1 do

if string.sub binval、limit-i、limit-i == "1" then

binaryclock.widget.image:draw_rectangle shift、binaryclock.h-binaryclock.dotsize-height、binaryclock.dotsize、binaryclock.dotsize、 true 、binaryclock.color_active

他に

binaryclock.widget.image:draw_rectangle shift、binaryclock.h-binaryclock.dotsize-height、binaryclock.dotsize、binaryclock.dotsize、 true 、binaryclock.color_inactive

終わり

height = height + binaryclock.dotsize + binaryclock.step

終わり

終わり




そして最後に、時計を描く主な機能:



binaryclock.drawclock = function )- 時間を取得し、paintdotに数字を送信()

binaryclock.widget.image:draw_rectangle 0、0 、binaryclock.w、binaryclock.h、 true 、binaryclock.color_bg -背景を塗りつぶします

ローカル t = os.date "* t"

現地時間= t.hour

if string.len hour == 1 then

時間= "0" .. t.hour

終わり

ローカル 最小 = t。

if string.len min == 1 then

min = "0" .. t。

終わり

ローカル= t.sec

if string.len sec == 1 then

sec = "0" .. t.sec

終わり

ローカル col_count = 6

if binaryclock.show_secではない then col_count = 4 end

ローカルステップ= math.floor binaryclock.w-col_count * binaryclock.dotsize / 8 -cols間の水平方向の空白を計算

binaryclock.paintdot 0 + string.sub hour、 1、1 、step、 2

binaryclock.paintdot 0 + string.sub hour、 2、2 、binaryclock.dotsize + 2 * step、 4

binaryclock.paintdot 0 + string.sub min1、1 、binaryclock.dotsize * 2 + 4 * step、 3

binaryclock.paintdot 0 + string.sub min2、2 、binaryclock.dotsize * 3 + 5 * step、 4

if binaryclock.show_sec then

binaryclock.paintdot 0 + string.sub sec、 1、1 、binaryclock.dotsize * 4 + 7 * step、 3

binaryclock.paintdot 0 + string.sub sec、 2、2 、binaryclock.dotsize * 5 + 8 * step、 4

終わり

binaryclock.widget.image = binaryclock.widget.image

終わり




もちろん、最もエレガントなソリューションではありませんが、機能します。

更新タイマーを設定するだけです。



binarytimer = timer { timeout = binaryclock.timeout } -タイマーを登録する

binarytimer:add_signal "timeout"関数

binaryclock.drawclock

終了

binarytimer:start )- タイマーを開始




ウィジェットをパネル(vibox)に配置します。

mywibox [ s ] .widgets = {

-ウィジェット

binaryclock.widget、

-再びウィジェット

レイアウト= awful.widget.layout.horizo​​ntal.rightleft

}




美しさ(およびFull-HD画面での時計の通常サイズ)のために、パネルの高さを変更する必要がありました。

mywibox [ s ] = awful.wibox { position = "top" 、screen = s、height = "22" }




ウィジェットの高さは24で、パネルの高さが22ピクセルであることには驚かないかもしれません。パネルの高さが24ピクセルであるため、何らかの理由で、トレイのピジンアイコンが非常に不自然に動作し、点滅し、通常はいたずらです。

作業が終了したら、素晴らしい素晴らしいコンボMod4 + Ctrl + rを再起動して結果を評価できます。



そして、結果は何ですか?


スクリーンショットで私の作業の結果を評価できます。



昼休みに数日間コードを書くと、バイナリクロックが安全に点滅し、素晴らしいパネルに時刻が表示され、Lua言語の知識が豊かになり、仮想ワークスペースが装飾されました。 ところで、Awesomeは11インチのラップトップでの使用に適していることも示しており、タッチパッド/トラックパッドの使用を完全に放棄し、ラップトップの全体的な応答性を向上させることができました。



PSウィジェットのコード 、次のアドレスの Awesomeプロジェクトwikiでまもなく公開ます 。 Awesome v3.4.10(Exploder)が書き込みに使用されました。



All Articles