문제의 일부에 멋진 WM 4.2을 실행하고있어 멋진 위젯 한 번에 여러 위치에 표시 할 수 있기 때문에 "A"위젯은 위치와 크기를하지 않는다는 것입니다. 우리가이 문제를 무시할 경우, 다음과 같은 것을 일할 수있는 (정직하기 :이 테스트하지 않았다) :
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)
을 그 위젯 계층은 다시 칠 때만 업데이트됩니다. 따라서 위의 코드는 시작시 위젯을 전혀 찾지 못하고 변경된 후에 (예 : 다른 문자를 프롬프트 상자에 입력 한 경우) 위의 코드는 이전의 형상을 여전히 "파악"합니다.