問題の一部に素晴らしいWM 4.2を実行していることは素晴らしいが、ウィジェットが一度に複数の場所に表示することを可能にするため、「」ウィジェットの位置とサイズを持っていないことです。私たちはこの問題を無視する場合は、次のようなものは、仕事ができる(正直に言う:私はこれをテストしていない):
function find_widget_in_wibox(wb, widget)
local function find_widget_in_hierarchy(h, widget)
if h:get_widget() == widget then
return h
end
local result
for _, ch in ipairs(h:get_children()) do
result = result or find_widget_in_hierarchy(ch, widget)
end
return result
end
local h = wb._drawable._widget_hierarchy
return h and find_widget_in_hierarchy(h, widget)
end
は、しかし、私は上記の新しいバージョンで破ることができることを警告しなければなりません非公開のAPI(wb._drawable._widget_hierarchy
の部分)にアクセスするのですばらしいです。 :find_widgets()
を使用して公開APIだけで作業する方法がありますが、今はあまりにも怠惰です。
上記の関数は(素晴らしい4.2のデフォルトの設定では)次のようなものを経由して、プロンプトのジオメトリを取得することができますウィジェットを表すwibox.hierarchy
インスタンスを取得します:
最後に
local s = screen.primary -- Pick a screen to work with
local h = find_widget_in_wibox(s.mywibox, s.mypromptbox)
local x, y, width, height = h:get_matrix_to_device()
:transform_rectangle(0, 0, h:get_size())
local geo = s.mywibox:geometry()
x, y = x + geo.x, y + geo.y
print(string.format("The widget is inside of the rectangle (%d, %d, %d, %d) on the screen", x, y, width, height)
、ということに注意してくださいウィジェット階層は、再塗りつぶし時にのみ更新されます。したがって、起動時に上記のコードは何か変更された直後(たとえば、別の文字をプロンプトボックスに入力した直後)にウィジェットを見つけることができませんが、上記の場合でも古いジオメトリを把握できます。