Linux Mint 19.1 BETA がリリースされました!19.1 までもうすぐですね!
roadtoalinuxmintuser

theming

roundup
Linux Mint 18.3 : Conky の Lua スクリプトの書き方 Part1 01:50
アイキャッチ

このチュートリアルは Lua プログラミング初心者にも優しいように記述されています。できれば何でも良いので他のプログラミング言語の入門レベルを習得していると理解しやすいと思います。

もし Conky をまだインストールしていない場合はこちらを参考にしてください:

Conky で Lua スクリプトを使うには


Lua スクリプトはどう動作するか


Conky では Lua に関係する設定項目がいくつかあります。そのうち2つは Lua スクリプトを実行する上で不可欠です:
lua_load
lua_draw_hook

これらの項目は conky.config={...} セクションに記述しなければなりません。
lua_load は Conky に Lua スクリプトの場所を知らせます。例えば以下のような感じでパスを指定してあげます:
lua_load = '/home/ユーザー名/.conky/テーマ名/script.lua'

2 行目の lua_draw_hook(lua_draw_hook には 2 種類あり、lua_draw_hook_pre と lua_draw_hook_post があります)は指定した Lua スクリプトのどの関数を読みこませるかを Conky に知らせるため項目です。pre や post はこれらの関数をいつ読み込ませるかを指示するためのものです。より具体的に見ていくと、Conky で使う Lua スクリプトの基本形は以下のようになっています:
--this is a lua script for use in conky
require 'cairo'

function conky_main()
if conky_window == nil then
return
end
local cs = cairo_xlib_surface_create(conky_window.display,
conky_window.drawable,
conky_window.visual,
conky_window.width,
conky_window.height)
cr = cairo_create(cs)
local updates=tonumber(conky_parse('${updates}'))
if updates>5 then
print ("hello world")
end
cairo_destroy(cr)
cairo_surface_destroy(cs)
cr=nil
end

この lua スクリプトをテストするためには、上記の lua スクリプトをホームディレクトリ内の .conky フォルダ内に test というディレクトリを作成し、その中に script.lua という名前で保存してください。

さらに .conkyrc もコピペして、同フォルダー内に .conkyrc という名前で保存します:
conky.config = {
alignment = 'top_right',
background = false,
border_width = 1,
cpu_avg_samples = 2,
default_color = 'white',
default_outline_color = 'white',
default_shade_color = 'white',
draw_borders = false,
draw_graph_borders = true,
draw_outline = false,
draw_shades = false,
override_utf8_locale = true,
double_buffer = true,
no_buffers = true,
use_xft = true,
font = 'Ubuntu Mono:size=12',
gap_x = 5,
gap_y = 60,
minimum_height = 500,
minimum_width = 500,
net_avg_samples = 2,
no_buffers = true,
out_to_console = false,
out_to_stderr = false,
extra_newline = false,
own_window = true,
own_window_class = 'Conky',
own_window_type = 'desktop',
stippled_borders = 0,
update_interval = 1.0,
uppercase = false,
use_spacer = 'none',
show_graph_scale = false,
show_graph_range = false,
lua_load = '/home/shellingford/.conky/test/script.lua',
lua_draw_hook_post = 'main'
}

conky.text = [[
${updates}
]]

保存する際には shellingford の部分を自分のユーザー名に変更してから保存してください。
範囲を選択_030

lua スクリプトを見ていく


一番上の行に:
--this is a lua script for use in conky

というコメントがあります。Lua では -- から始まる行はコメントアウトされます。複数行に渡るコメントを書きたい場合は --[[ と ]] で囲みます:
--[[ this is a comment
and it can span multiple
lines until you end it with ]]

次に:
require 'cairo'

とありますが、これは画面にベクター画像を描画するために設計されたグラフィック系のライブラリである Cairo を読み込むための行です。Lua スクリプトで文字列や図形など様々なものを描くためにこのライブラリを使用します。

function conky_main()

この関数は .conkyrc の lua_draw_hook に指定した main 関数です。Lua スクリプトをテキストエディターで開いた時にどの関数が .conkyrc に設定されているかを知りたければ conky_ から始まる関数を探しましょう。この関数は Conky が実行されている間何度も何度も呼び出されます。

次の行は .conkyrc で指定した main 関数にだけ必要な cairo を使って描画するのに必要なコードの決まり文句おまじないです:
    if conky_window == nil then
return
end
local cs = cairo_xlib_surface_create(conky_window.display,
conky_window.drawable,
conky_window.visual,
conky_window.width,
conky_window.height)
cr = cairo_create(cs)

最初の三行を見てみると、if 文のブロックを表すのに { } は使わず then と end で表すことがわかります。残りのコードは文字列や図形を描画する "surface" を作成しています。この場合、"surface" は Conky ウィンドウそのものです。また、Lua では変数は自動的にグローバル変数になります。ローカル変数としたい場合、local を変数名の前につけます。また、文の終わりにセミコロンをつける必要はありません。

Lua スクリプトでは Conky の設定項目が扱えます。例えば、以下の行では Conky の変数をスクリプトにパースし、 ${updates} の値を取得します。留意すべきは .conkyrc に記述していない変数も使えることです:
    local updates=tonumber(conky_parse('${updates}'))

conky_parse 関数で Conky 変数をパースし tonumber 関数で、取得した値を数値に変えています。

if 文では Conky が 5 回更新したあと、hello world を表示するコードです:
    if updates>5 then
print ("hello world")
end

表示するのにどれだけの間隔があくかは .conkyrc ファイル内で指定した update_interval の値によります。1 に設定していれば、helloword と表示するまでに 5 秒、2 に設定していれば、表示するまでに 10 秒かかります。

print 関数は端末にしか出力しません。実際に Conky ウィンドウに描画するのは後ほど見ていきますが、print 関数はデバッグする際にはとても有用です。実際に print の出力を見るには Conky を端末から起動してみましょう:
conky -c .conkyrcのパス
範囲を選択_031
よくよく考えてみると、この helloword と出力する文は繰り返し制御(for とか while)文の中に記述されていないにもかかわらず、updates の値が増加しています。これは上述した通り、Conky から何度も Lua スクリプトが呼び出されるためです。

もちろんこれらの行は、Lua スクリプト内で cpu 使用率のように更新の処理が必要なものを読み込む場合にのみ必要です。ですが、とりあえず、これらの行は記述しておくのが賢明でしょう。conky_parse 関数で、以下のようにして Conky の変数の出力を取得します:
cpu=conky_parse("${cpu}")
memory=conky_parse("${memperc}")
home_used=conky_parse("${fs_used /home}")

if_ から始まる変数も conky_parse で扱えます。これは出力する値を切り替えるのに便利です:
internet=conky_parse("${if_up wlan0}1${else}0${endif}")

これで internet に if_up の出力に応じて 1 か 0 が代入されます。

最後に関数の最後で以下の処理を行っています:
    cairo_destroy(cr)
cairo_surface_destroy(cs)
cr=nil

これらの行はお掃除するためのものです。Lua が実行されているうちに、だんだんメモリを占有するようになります。特にメモリーリークを引き起こしてしまうため、これらの行を記述することで回避します。メモリーの使用量はチェックできるので、メモリーリークを起こしているかどうかをチェックし、メモリーを大量に食っている場合は、何かしら間違った記述をしていることになります。最も簡単な対処法は Conky プロセスを終了し、再度起動することです。

Conky ウィンドウに描画する


さて、スクリプトのパスを .conkyrc の lua_load に記述し、空の main 関数が用意できました。この lua スクリプトを実行するために lua_draw_hook で main 関数を指定しました。しかし、Conky ウィンドウに描画する処理は何も記述していません。それでは Lua で Conky ウィンドウに何を描画することができるのでしょうか。大まかに2つあります:
  • 文字列
  • 図形
    • バー
    • リング
    • など。。

まず、Lua で文字列を表現するには " で囲む必要があります。こんな感じです:
text="hello world"

続いて、この hello world を Conky ウィンドウに表示したいと思います。何でもかんでも変数に入れるほうが好きなので変数に入れていますが、直接値を引数に指定しても構いません:
font="Mono"
font_size=12
text="hello world"
xpos,ypos=100,100
red,green,blue,alpha=1,1,1,1
font_slant=CAIRO_FONT_SLANT_NORMAL
font_face=CAIRO_FONT_WEIGHT_NORMAL
----------------------------------
cairo_select_font_face (cr, font, font_slant, font_face);
cairo_set_font_size (cr, font_size)
cairo_set_source_rgba (cr,red,green,blue,alpha)
cairo_move_to (cr,xpos,ypos)
cairo_show_text (cr,text)
cairo_stroke (cr)

実際に変数が展開されれば下の 6 行はこんな感じになります。これは上のコードと等価です:
cairo_select_font_face (cr, "mono", CAIRO_FONT_SLANT_NORMAL, CAIRO_FONT_WEIGHT_NORMAL);
cairo_set_font_size (cr, 12)
cairo_set_source_rgba (cr,1,1,1,1)
cairo_move_to (cr,100,100)
cairo_show_text (cr,"hello world")
cairo_stroke (cr)

Lua スクリプトでは文の終わりに ; を必要とはしませんが、もし複数の文を一行に収めたい場合は ; を文の終わりにつけます:
cairo_move_to (cr,100,100);cairo_show_text (cr,"hello world");cairo_stroke (cr)

ただ、エラーが起きてスクリプトを読み返す必要ができた時に、読みづらくなります。

上述のスクリプトでは以下のようなことを行っています:
  • hello world と表示する
  • 文字は白く
  • フォントは Mono
  • フォントサイズは 12
  • 表示座標は(100,100)
  • 標準の face と slant(つまり太字でもなくイタリック体でもない)

では、一行ずつ具体的に見ていきます。フォント名は " で囲んで指定します。例では font 変数に代入することで font と " をつけずに使用しています。"hello world" なども同様に一旦変数に代入すれば " をつけずに使用できます。数値は " で囲む必要はありません。

更に特筆すべきは xpos,ypos=100,100 というように同じ行に複数の変数に値を代入していることです。この記述は以下のように書いた場合と等価です:
xpos=100
ypos=100

この話は色の指定 red,green,blua,alpha=1,1,1,1 にも当てはまります。以下と等価です:
red=1
green=1
blua=1
alpha=1

どちらでも構いません。ちなみに、スクリプト内で同じ変数名を使うと上書きされてしまいます。

x,y で指定した座標は文字列の左下の座標です。Conky ウィンドウの左上からの相対的な位置になります。なので、x,y=100,100 というのは Conky ウィンドウの上から 100 ピクセル下、100 ピクセル左の座標ということになります。この座標から上に右向きで文字列が表示されます。

lua では色は red も blue も green も alpha も 0 から 1 までの範囲を取ります。ではどのように値を取得すれば良いのでしょうか。多くのスクリプトではよく見かける #000000 形式の 16 進数カラーコードを rgba 形式の値に変換数関数を個別に用意しています。この関数については後で見ることにして、今はより直接的な方法を見ていくことにします。

R=246,G=155,B=11 のオレンジっぽい色を選んでみました。しかし、範囲が 0 から 1 ではなく、0 から 255 までになってしまいます。プログラミングの良いところは計算ができることです。Lua では他のプログラミング言語同様に、計算結果を変数に代入することができます。以下のように計算することでオレンジっぽい色を 0 から 1 までの範囲で取得できます:
red=246/255
green=155/255
blue=11/255

alpha 値はこれらとは少し異なり、0 であれば完全に透明で、1 であれば完全に不透明です。表示をくっきりしたいのであれば、1 に近い値をセットしましょう。

最後に、font_face と font_slant に関してです。これらは定数なので " で囲む必要はありません:
font_slant=CAIRO_FONT_SLANT_NORMAL
font_face=CAIRO_FONT_WEIGHT_NORMAL

イタリック体にしたい場合は CAIRO_FONT_SLANT_ITALIC、太字にしたい場合は CAIRO_FONT_WEIGHT_BOLD を使用します。
範囲を選択_029

今までの知識で実践


Lua スクリプトを使って Conky に CPU の使用率を表示したいとします。まずは、conky_parse 関数で CPU 使用率を取得します:
cpu_perc=conky_parse("${cpu}")

もちろん変数名(cpu_perc)は自由に変えれます。ただし、Lua では変数名に英数字とアンダーバーのみ使えます。先頭に数字は来てはいけません。

ところで、値を取得しただけでは、なんの値なのかわかりません。「CPU使用率:」という文字も追加する必要があります。方法はいくつかありますが、一番簡単な方法は ..(ピリオド2つ) を使って連結することです。PHP では文字の連結に .(ピリオド1つ)を使いますが、Lua では .. で連結します:
cpu_text="CPU使用率: "..cpu_perc.."%"

CPU使用率の値が入った変数 cpu_perc の両端に "CPU使用率:" という文字列と "%" という文字を .. を使って連結しています:
範囲を選択_034

参考元: Using Lua scripts in conky (Part 01), (Part 02)
| Linux |
<< NEW | TOP | OLD>>
スポンサーサイト 01:50
| - |

Show some apps list:


miku

Follow on your feed reader:


About this blog:

Linux Mint-centric chronicle.
Since 2009.
Info 再開しました。更新日は月一です。

roadtoapython

roadtorubyist

git

Amazon: