이 페이지는 BoAYo SDK 0.2.0의 함수와 이벤트를 현재 코드 기준으로 설명합니다. 앱은 창 이미지를 만들고, SDK는 Bosio 창 관리자 연결·아래 캡션·창별 이벤트를 처리합니다. 런처 패널은 앱 창과 별개의 UI입니다.
연결하고 창 만들기·닫기
from boayo_sdk import BoayoSDK
with BoayoSDK("my-app") as sdk:
window = sdk.create_window("My App")
window.present(draw_content)
while sdk.windows:
for event in sdk.poll_events():
handle(event)
| API | 역할과 반환값 |
|---|---|
BoayoSDK(app_name, socket_path="/tmp/bosio-wm.sock", wm=None) | 앱에서 사용할 Bosio 연결을 준비합니다. app_name은 앱 이름입니다. wm은 이미 연결한 Bosio 클라이언트를 전달할 때만 사용합니다. |
with sdk ... / sdk.__enter__() | Bosio 데몬에 연결하고 SDK 객체를 반환합니다. 연결하기 전에는 창을 만들 수 없습니다. |
sdk.close() / sdk.__exit__() | SDK가 연 연결을 닫고 앱의 창 목록을 비웁니다. 정상적으로 연결이 종료되면 Bosio는 해당 앱이 만든 창을 제거합니다. 전달받은 wm 연결은 SDK가 닫지 않습니다. |
sdk.create_window(...) | 앱 창 하나를 등록하고 BoayoApplicationWindow를 반환합니다. 새 창은 포커스를 받습니다. |
sdk.window_state(window) | 이 앱에서 만든 창 객체나 ID를 받아 읽는 시점의 BoayoWindowState를 반환합니다. 없는 창이나 다른 앱의 창이면 ValueError입니다. |
sdk.destroy_window(window) | 해당 앱 창 하나만 닫습니다. 나머지 창과 앱 프로세스는 유지됩니다. |
sdk.poll_events() | Bosio 입력을 읽고 캡션·포커스·크기 변경을 처리해 list[BoayoEvent]를 반환합니다. 이미지가 바뀌지 않아도 계속 호출해야 캡션 버튼이 반응합니다. |
sdk.windows | 이 앱에서 열어 둔 {window_id: window} 딕셔너리입니다. 창을 닫으면 항목이 제거됩니다. |
create_window()의 모든 인자
window = sdk.create_window(
title, *, azimuth=None, elevation=None,
width_deg=38, height_deg=28,
width=400, height=300, accent=ACCENT,
)
| 인자 | 단위와 역할 |
|---|---|
title | 창 제목. 현재 아래 캡션 상자에 공간이 있을 때 일부를 그립니다. |
azimuth, elevation | 창 중심 각도, 도(°). 생략하면 런처가 설정한 BOAYO_APP_AZIMUTH와 BOAYO_APP_ELEVATION을 읽고, 둘 다 없으면 0°입니다. |
width_deg, height_deg | 창이 구면에서 차지하는 각도 너비·높이, 도(°). HDMI 픽셀 수가 아닙니다. |
width, height | 앱 RGB24 그림 표면의 픽셀 크기, 기본 400×300. 현재 캡션 레이아웃은 최소 240×170 픽셀이 필요합니다. |
accent | RGB 색상 튜플로 앱 프레임에 저장됩니다. 현재 캡션 조작 버튼은 고정된 회색·빨강이므로 이 값만 바꾸어 버튼 색은 바뀌지 않습니다. |
캡션을 드래그하면 창이 차지하는 구면 각도는 바뀌지만, 처음 만든 RGB 그림 영역의 픽셀 크기는 그대로입니다. 앱이 다른 크기의 이미지를 만들어 보내면 SDK가 기존 내용 영역에 맞춰 넣습니다.
창 객체로 내용을 그리기
| 함수·속성 | 역할 |
|---|---|
window.present(draw_content) | draw_content(canvas, content) 콜백으로 앱 내용을 그리고 아래 캡션을 더한 뒤 전체 RGB24 표면을 Bosio로 보냅니다. canvas는 BoayoSurface, content는 AppRect입니다. |
window.present_rgb(rgb, fit="contain") | (높이, 너비, 3) RGB 배열을 bilinear로 내용 영역에 넣고 캡션을 더합니다. contain은 종횡비 유지, stretch는 영역에 맞춰 늘리기입니다. 입력은 uint8로 변환합니다. |
window.state | 읽는 시점의 창 상태를 복사한 BoayoWindowState입니다. |
window.window_id, window.closed | Bosio 창 ID와 닫힘 여부입니다. 이벤트는 창 ID별로 분배합니다. |
window.frame.content | AppRect(x, y, width, height) 내용 픽셀 사각형. 원점은 전체 표면 왼쪽 위입니다. |
window.poll_events() | SDK 내부에서 쓰는 단일 창 도우미입니다. SDK를 사용하는 앱은 이 함수 대신 sdk.poll_events()를 호출하세요. 두 함수를 섞으면 다른 창의 이벤트를 놓칠 수 있습니다. |
def draw_content(canvas, content):
canvas.text("HELLO", content.x + 20, content.y + 20,
INK, scale=3, bold=True)
canvas.rounded_rect(content.x + 20, content.y + 70,
120, 50, 12, ACCENT)
window.present(draw_content)
앱에서는 BoayoApplicationWindow(...)를 직접 만들지 않고 sdk.create_window()를 사용하세요. window.handle_event(raw), window.apply_gaze_drag(azimuth, elevation), window.cancel_drag()는 캡션 클릭과 창 밖 드래그를 SDK가 처리할 때 사용하는 함수입니다. 앱에서 직접 호출하면 SDK가 돌려주는 이벤트와 실제 창 상태가 어긋날 수 있습니다.
각 present()는 화면을 다시 만들어 제출합니다. 콜백은 content.x/y를 더해 내용 영역 안에 그려야 합니다. SDK 표면은 RGB24이므로 픽셀별 알파 투명도가 없습니다.
BoayoWindowState 필드
| 필드 | 의미 |
|---|---|
window_id | Bosio 창 식별자. |
azimuth, elevation | 창 중심의 현재 구면 각도, 도(°). |
width_deg, height_deg | 창의 현재 구면 각도 크기, 도(°). |
surface_width, surface_height | RGB24 그림 표면의 고정 픽셀 크기. |
content_width, content_height | 캡션을 뺀 내용 영역의 고정 픽셀 크기. |
focused, closed | 마지막으로 처리한 포커스 상태와 창 닫힘 상태. |
sdk.window_state(window)와 window.state의 내용은 같습니다. 포커스 값은 sdk.poll_events()로 새 이벤트를 읽은 뒤 갱신됩니다. SDK를 거치지 않고 Bosio에서 창 위치·크기를 직접 바꾸면 SDK의 창 상태에는 자동으로 반영되지 않습니다.
BoayoEvent와 이벤트 종류
sdk.poll_events()는 BoayoEvent 목록을 반환합니다. 모든 이벤트에 window_id와 type이 있으며, 나머지 필드인 x, y, pressed, button, focused, state는 이벤트 종류에 따라 값이 있거나 None입니다.
event.type | 전달 시점 | 주요 필드 |
|---|---|---|
pointer_motion | 앱 내용 영역에서 포인터가 움직일 때 | x, y |
pointer_button | 앱 내용 영역에서 버튼을 누르거나 놓을 때 | x, y, pressed, button |
focus | Bosio가 그 창에 포커스를 주거나 빼앗을 때 | focused, state |
resize | 캡션 조작으로 창의 각도 크기가 이전 poll_events() 호출 이후 달라졌을 때 | state.width_deg, state.height_deg 등 |
내용 영역에서 받은 x/y는 캡션을 제외한 내용 영역의 왼쪽 위가 (0, 0)인 픽셀 좌표입니다. 값은 실수이며 오른쪽과 아래쪽으로 증가합니다. pointer_button.pressed는 눌렀을 때 True, 놓았을 때 False이고 왼쪽 버튼 이름은 "left"입니다. 포인터 이동 이벤트의 pressed와 내용 입력 이벤트의 state는 None입니다.
focus 이벤트의 event.focused와 event.state.focused는 같습니다. 크기 조절 중 변화가 여러 번 있어도 sdk.poll_events()를 한 번 호출할 때 창별로 최종 크기 한 번만 resize를 돌려줍니다. 드래그가 창 밖으로 이어지면 현재 포인터 위치를 이용해 계속 계산합니다. RGB 이미지의 픽셀 크기가 바뀌는 것은 아닙니다.
캡션의 닫기·이동·크기 조절 클릭은 SDK가 처리하므로 앱 내용의 포인터 이벤트가 아닙니다. 창을 닫을 때 별도의 close 이벤트는 없고 window.closed 또는 sdk.windows에서 확인합니다. 위치 이동의 별도 move 이벤트도 없습니다. 현재 중심 위치는 window.state.azimuth/elevation에서 읽을 수 있습니다. 런처 패널 입력은 앱 SDK 이벤트가 아닙니다.
여러 창에서 이벤트 처리하기
with BoayoSDK("multi-view") as sdk:
main = sdk.create_window("Main")
tools = sdk.create_window("Tools", azimuth=20, elevation=0)
main.present(draw_main)
tools.present(draw_tools)
while sdk.windows:
for event in sdk.poll_events():
if event.type == "resize":
print(event.window_id, event.state.width_deg)
elif event.type == "focus":
print(event.window_id, event.focused)
elif event.type == "pointer_button" and event.pressed:
print(event.window_id, event.x, event.y)
한 SDK 연결에서 앱의 모든 창 이벤트를 읽으므로 window_id로 창을 구분하세요. 이미지가 바뀌지 않는 앱도 sdk.poll_events()를 주기적으로 호출해야 캡션 조작과 닫기에 반응합니다.
BoayoSurface 그리기 함수
window.present(draw_content) 콜백의 canvas는 RGB24 이미지를 그리는 BoayoSurface입니다. 색은 각 채널이 0~255인 (R, G, B) 튜플이고 좌표는 창 이미지 전체의 픽셀 단위입니다.
| 함수 | 역할 |
|---|---|
BoayoSurface(width=640, height=360, background=BLACK) | RGB24 표면 생성. window.present() 콜백에서는 SDK가 만든 표면을 이미 받습니다. |
clear(color=BLACK) | 표면 전체 채우기. present()는 콜백 전에 초기화합니다. |
rect(x, y, width, height, color, fill=True, stroke=1) | 직사각형. fill=False이면 테두리 굵기를 지정합니다. |
rounded_rect(x, y, width, height, radius, color) | AA 둥근 모서리 상자. |
polygon(points, color) | (x, y) 꼭짓점 목록의 AA 다각형. |
rounded_polygon(points, radius, color) | 둥근 꼭짓점의 AA 다각형. |
circle(cx, cy, radius, color) | AA 원. |
text(value, x, y, color=INK, scale=2, bold=False) | 내장 5×7 글꼴로 글자를 그립니다. 대문자로 바꿔 그리며 글꼴에 없는 문자는 빈 칸이 됩니다. |
card(x, y, width, height, title, value, accent=ACCENT) | 표준 카드·점·두 줄 텍스트. |
progress(x, y, width, ratio, color=ACCENT) | 0~1 비율의 둥근 진행 막대. |
image() | 현재 이미지를 (높이, 너비, 3) RGB 배열로 반환합니다. |
canvas.pixels는 직접 수정할 수 있는 uint8 NumPy RGB 배열입니다. 다른 도구에서 만든 이미지를 내용 영역에 복사할 때 사용할 수 있습니다. 캡션까지 덮어쓰지 않도록 content 좌표를 확인하세요.
INK, MUTED, PANEL, WHITE, ACCENT는 SDK가 제공하는 RGB 색상값입니다. 내장 글꼴은 한글을 지원하지 않습니다. 한글이나 더 선명한 글씨가 필요하면 다른 도구로 RGB 이미지를 만든 뒤 present_rgb()로 보내세요.
오류와 현재 한계
- Bosio에 연결하기 전에
create_window(), 연결을 닫은 뒤poll_events()를 호출하면RuntimeError가 납니다. - 다른 앱이 만들었거나 이미 닫힌 창을
window_state()또는destroy_window()에 넘기면ValueError가 납니다. - 그림 영역이 240×170픽셀보다 작으면 캡션을 그릴 수 없습니다.
present_rgb()에는 3채널 RGB 배열과contain또는stretch를 지정해야 합니다. - Bosio와의 연결이 끊기면 클라이언트 오류가 발생합니다. 보드에서는 창 관리자와 BoAYo 서비스 상태를 확인하세요.
- 구면 각도 크기를 조절해도 앱 이미지의 픽셀 해상도는 자동으로 높아지지 않습니다. 현재 RGB24에는 픽셀별 투명도도 없습니다.
저장소의 SDK 문서, SDK 코드, Pulse 앱, 여러 창 예제를 참고하세요.