BOSIO × BoAYo 개발 문서 전체 소스 ↗
앱과 UI · SDK 함수·이벤트

함수와 이벤트 안내

창 만들기와 닫기, 공개 함수, 상태값과 이벤트의 사용법을 찾아봅니다.

이 페이지는 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_AZIMUTHBOAYO_APP_ELEVATION을 읽고, 둘 다 없으면 0°입니다.
width_deg, height_deg창이 구면에서 차지하는 각도 너비·높이, 도(°). HDMI 픽셀 수가 아닙니다.
width, height앱 RGB24 그림 표면의 픽셀 크기, 기본 400×300. 현재 캡션 레이아웃은 최소 240×170 픽셀이 필요합니다.
accentRGB 색상 튜플로 앱 프레임에 저장됩니다. 현재 캡션 조작 버튼은 고정된 회색·빨강이므로 이 값만 바꾸어 버튼 색은 바뀌지 않습니다.

캡션을 드래그하면 창이 차지하는 구면 각도는 바뀌지만, 처음 만든 RGB 그림 영역의 픽셀 크기는 그대로입니다. 앱이 다른 크기의 이미지를 만들어 보내면 SDK가 기존 내용 영역에 맞춰 넣습니다.

창 객체로 내용을 그리기

함수·속성역할
window.present(draw_content)draw_content(canvas, content) 콜백으로 앱 내용을 그리고 아래 캡션을 더한 뒤 전체 RGB24 표면을 Bosio로 보냅니다. canvasBoayoSurface, contentAppRect입니다.
window.present_rgb(rgb, fit="contain")(높이, 너비, 3) RGB 배열을 bilinear로 내용 영역에 넣고 캡션을 더합니다. contain은 종횡비 유지, stretch는 영역에 맞춰 늘리기입니다. 입력은 uint8로 변환합니다.
window.state읽는 시점의 창 상태를 복사한 BoayoWindowState입니다.
window.window_id, window.closedBosio 창 ID와 닫힘 여부입니다. 이벤트는 창 ID별로 분배합니다.
window.frame.contentAppRect(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_idBosio 창 식별자.
azimuth, elevation창 중심의 현재 구면 각도, 도(°).
width_deg, height_deg창의 현재 구면 각도 크기, 도(°).
surface_width, surface_heightRGB24 그림 표면의 고정 픽셀 크기.
content_width, content_height캡션을 뺀 내용 영역의 고정 픽셀 크기.
focused, closed마지막으로 처리한 포커스 상태와 창 닫힘 상태.

sdk.window_state(window)window.state의 내용은 같습니다. 포커스 값은 sdk.poll_events()로 새 이벤트를 읽은 뒤 갱신됩니다. SDK를 거치지 않고 Bosio에서 창 위치·크기를 직접 바꾸면 SDK의 창 상태에는 자동으로 반영되지 않습니다.

BoayoEvent와 이벤트 종류

sdk.poll_events()BoayoEvent 목록을 반환합니다. 모든 이벤트에 window_idtype이 있으며, 나머지 필드인 x, y, pressed, button, focused, state는 이벤트 종류에 따라 값이 있거나 None입니다.

event.type전달 시점주요 필드
pointer_motion내용 영역에서 포인터가 움직일 때x, y
pointer_button내용 영역에서 버튼을 누르거나 놓을 때x, y, pressed, button
focusBosio가 그 창에 포커스를 주거나 빼앗을 때focused, state
resize캡션 조작으로 창의 각도 크기가 이전 poll_events() 호출 이후 달라졌을 때state.width_deg, state.height_deg

내용 영역에서 받은 x/y캡션을 제외한 내용 영역의 왼쪽 위가 (0, 0)인 픽셀 좌표입니다. 값은 실수이며 오른쪽과 아래쪽으로 증가합니다. pointer_button.pressed는 눌렀을 때 True, 놓았을 때 False이고 왼쪽 버튼 이름은 "left"입니다. 포인터 이동 이벤트의 pressed와 내용 입력 이벤트의 stateNone입니다.

focus 이벤트의 event.focusedevent.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 앱, 여러 창 예제를 참고하세요.

BOSIO × BoAYo · 문서 저장소 · 구현 원본은 각 소스 저장소에서 확인하세요.