From f82cada6bbe326eb4100ec2b187e857f0c3516ff Mon Sep 17 00:00:00 2001 From: Eduard Urbach Date: Mon, 25 May 2026 00:21:52 +0200 Subject: [PATCH] Improved wayland example --- examples/wayland/wayland.q | 96 +++++++++++++++++++++++++++++--------- lib/wayland/Header.q | 5 ++ lib/wayland/State.q | 10 ++++ lib/wayland/const.q | 7 +-- 4 files changed, 94 insertions(+), 24 deletions(-) create mode 100644 lib/wayland/Header.q create mode 100644 lib/wayland/State.q diff --git a/examples/wayland/wayland.q b/examples/wayland/wayland.q index fb7153d..b509078 100644 --- a/examples/wayland/wayland.q +++ b/examples/wayland/wayland.q @@ -3,43 +3,97 @@ import net import wayland main() { - io.writeLine("connecting...") socket, err := wayland.connect() if err != 0 { + io.write("connect error: ") io.write(err) return } - io.writeLine("connected.") - io.writeLine("sending message...") + state := new(wayland.State) { + id: 1, + socket: socket + } + buffer := new(byte, 4096) - size := wayland.header_size + 4 - wayland.write32(buffer, wayland.display_object_id) - wayland.write16(buffer[4..], wayland.wl_display_get_registry_opcode) - wayland.write16(buffer[6..], size) - wayland.write32(buffer[8..], 2) - io.writeTo(socket, buffer[..size]) - io.writeLine("sent.") - io.writeLine("receiving message...") - n, err := io.readFrom(socket, buffer) + err := getRegistry(state, buffer) if err != 0 { + io.write("send error: ") io.write(err) + delete(state) delete(buffer) net.close(socket) return } - io.writeLine("received.") - handleMessage(buffer[..n]) - delete(buffer) - net.close(socket) + loop { + err := readMessage(state, buffer) + + if err != 0 { + delete(state) + delete(buffer) + net.close(socket) + return + } + } +} + +getRegistry(state *wayland.State, buffer string) -> error { + state.registry = wayland.newId(state) + size := wayland.headerSize + 4 + wayland.write32(buffer, wayland.displayId) + wayland.write16(buffer[4..], wayland.displayGetRegistry) + wayland.write16(buffer[6..], size) + wayland.write32(buffer[8..], state.registry) + _, err := io.writeTo(state.socket, buffer[..size]) + return err +} + +readMessage(state *wayland.State, buffer string) -> error { + n, err := io.readFrom(state.socket, buffer) + + if err != 0 { + return err + } + + if n == 0 { + return 0 + } + + pos := 0 + + loop { + if pos + wayland.headerSize >= n { + return 0 + } + + pos += handleMessage(state, buffer[pos..n]) + } } -handleMessage(msg string) { - io.writeLine("size:") - io.writeLine(msg.len as int) - io.writeLine("msg:") - io.writeLine(msg[wayland.header_size..]) +handleMessage(state *wayland.State, msg string) -> int { + header := msg.ptr as *wayland.Header + + if header.id == state.registry { + io.write("from:") + io.write(header.id as int) + io.write(" opcode:") + io.write(header.opcode as int) + io.write(" size:") + io.write(header.size as int) + io.write(" contents:") + id := [msg.ptr + wayland.headerSize as *uint32] + io.write(" id:") + io.write(id as int) + io.write(" name:") + len := [msg.ptr + wayland.headerSize + 4 as *uint32] + start := wayland.headerSize + 8 + end := start + len + contents := msg[start..end] + io.writeLine(contents) + } + + return header.size as int } \ No newline at end of file diff --git a/lib/wayland/Header.q b/lib/wayland/Header.q new file mode 100644 index 0000000..b05f8dd --- /dev/null +++ b/lib/wayland/Header.q @@ -0,0 +1,5 @@ +Header { + id uint32 + opcode uint16 + size uint16 +} \ No newline at end of file diff --git a/lib/wayland/State.q b/lib/wayland/State.q new file mode 100644 index 0000000..326ae6b --- /dev/null +++ b/lib/wayland/State.q @@ -0,0 +1,10 @@ +State { + socket int + id uint32 + registry uint32 +} + +newId(state *State) -> uint32 { + state.id += 1 + return state.id +} \ No newline at end of file diff --git a/lib/wayland/const.q b/lib/wayland/const.q index 15fccbe..c3daead 100644 --- a/lib/wayland/const.q +++ b/lib/wayland/const.q @@ -1,5 +1,6 @@ const { - display_object_id = 1 - header_size = 8 - wl_display_get_registry_opcode = 1 + displayGetRegistry = 1 + registryGlobal = 0 + displayId = 1 + headerSize = 8 } \ No newline at end of file -- 2.51.2