forked from AbleOS/ableos
65 lines
2 KiB
Plaintext
65 lines
2 KiB
Plaintext
.{math: .{Vec2}, buffer, log, memory, string} := @use("../../stn/src/lib.hb");
|
|
.{Channel, Window, send_header, send_message, await_channel, await_message, message, BUFFER_SERVER, BUFFER_CLIENT, WindowProps, WindowData} := @use("./lib.hb");
|
|
.{new_surface, Color} := @use("../../render/src/lib.hb")
|
|
|
|
// ! in the future this should be safely handled
|
|
channel := @as(Channel, idk)
|
|
|
|
find_server := fn(): void {
|
|
log.info("client: locating server\0")
|
|
channel = await_channel()
|
|
log.info("client: server located\0")
|
|
}
|
|
|
|
new := fn(props: WindowProps): ?Window {
|
|
send_header(message.syn, channel.server)
|
|
response := await_message(Channel, channel.client)
|
|
if response.header.kind != message.ack {
|
|
log.info(string.display_int(@bitcast(response.header.kind), "\0\0\0\0\0\0\0\0\0\0\0\0\0", 10))
|
|
return null
|
|
}
|
|
log.info("client: recv ack\0")
|
|
send_message(WindowProps, message.props, props, response.body.server)
|
|
windowdata := await_message(WindowData, response.body.client)
|
|
if windowdata.header.kind != message.ack {
|
|
return null
|
|
}
|
|
log.info("client: recv windowdata\0")
|
|
surface := new_surface(windowdata.body.props.dimensions.x, windowdata.body.props.dimensions.y)
|
|
return .(windowdata.body, surface)
|
|
}
|
|
|
|
quit := fn(client: Window): void {
|
|
send_header(message.quit, client.data.channel.server)
|
|
}
|
|
|
|
connected := fn(client: Window): bool {
|
|
return true
|
|
}
|
|
|
|
shutdown_server := fn(client: Window): bool {
|
|
return false
|
|
}
|
|
|
|
update_props := fn(client: Window): bool {
|
|
return false
|
|
}
|
|
|
|
update_permissions := fn(client: Window): bool {
|
|
return false
|
|
}
|
|
|
|
send_frame := fn(client: Window): bool {
|
|
server_id := client.data.channel.server
|
|
client_id := client.data.channel.client
|
|
send_header(message.frame_ready, server_id)
|
|
response := await_message(uint, client_id)
|
|
if response.header.kind != message.ack {
|
|
return false
|
|
}
|
|
log.info("client: recv ack\0")
|
|
// ! FOR NOW, server will ALWAYS be local,
|
|
// ! so we can send pointer to surface.
|
|
send_message(^Color, message.ack, client.surface.buf, server_id)
|
|
return true
|
|
} |