forked from AbleOS/ableos
101 lines
2.3 KiB
Plaintext
101 lines
2.3 KiB
Plaintext
.{math: .{Vec2}, buffer, memory} := @use("stn");
|
|
.{Surface} := @use("../../render/src/lib.hb")
|
|
|
|
$BUFFER_SERVER := "sunset_server\0"
|
|
$BUFFER_CLIENT := "sunset_client\0"
|
|
|
|
Channel := packed struct {
|
|
client: uint,
|
|
server: uint,
|
|
}
|
|
|
|
client := @use("./client.hb")
|
|
server := @use("./server.hb")
|
|
message := @use("./message.hb")
|
|
permissions := @use("./permissions.hb")
|
|
|
|
$send_message := fn($Expr: type, kind: MessageKind, msg: Expr, buffer_id: uint): void {
|
|
buffer.write(?Message(Expr), buffer_id, &@as(?Message(Expr), .(.(kind), msg)))
|
|
}
|
|
|
|
$send_header := fn(kind: MessageKind, buffer_id: uint): void {
|
|
buffer.write(?MessageHeader, buffer_id, &@as(?MessageHeader, .(kind)))
|
|
}
|
|
|
|
$recv_message := fn($Expr: type, buffer_id: uint): Message(Expr) {
|
|
response := @as(?Message(Expr), null)
|
|
buffer.recv(?Message(Expr), buffer_id, &response)
|
|
return response
|
|
}
|
|
|
|
$recv_header := fn(buffer_id: uint): ?MessageHeader {
|
|
response := @as(?MessageHeader, null)
|
|
buffer.recv(?MessageHeader, buffer_id, &response)
|
|
return response
|
|
}
|
|
|
|
await_channel := fn(): Channel {
|
|
channel := Channel.(0, 0)
|
|
loop if channel.server != 0 break else {
|
|
channel.server = buffer.search(BUFFER_SERVER)
|
|
}
|
|
loop if channel.client != 0 break else {
|
|
channel.client = buffer.search(BUFFER_CLIENT)
|
|
}
|
|
return channel
|
|
}
|
|
|
|
await_message := fn($Expr: type, buffer_id: uint): Message(Expr) {
|
|
response := @as(?Message(Expr), null)
|
|
loop {
|
|
// awaiting here causes flickering... idk why
|
|
buffer.await(buffer_id)
|
|
buffer.recv(?Message(Expr), buffer_id, &response)
|
|
if response != null {
|
|
return @as(Message(Expr), response)
|
|
}
|
|
}
|
|
}
|
|
|
|
await_header := fn(buffer_id: uint): MessageHeader {
|
|
response := @as(?MessageHeader, null)
|
|
loop {
|
|
// awaiting here causes flickering... idk why
|
|
buffer.await(buffer_id)
|
|
buffer.recv(?MessageHeader, buffer_id, &response)
|
|
if response != null {
|
|
return @as(MessageHeader, response)
|
|
}
|
|
}
|
|
}
|
|
|
|
MessageKind := u8
|
|
|
|
MessageHeader := packed struct {
|
|
kind: MessageKind,
|
|
}
|
|
|
|
Message := fn($Expr: type): type {
|
|
return packed struct {
|
|
header: MessageHeader,
|
|
body: Expr,
|
|
}
|
|
}
|
|
|
|
WindowProps := struct {
|
|
position: Vec2(uint),
|
|
dimensions: Vec2(uint),
|
|
// ! replace with owned string type later
|
|
title: ^u8,
|
|
}
|
|
|
|
WindowData := struct {
|
|
props: WindowProps,
|
|
channel: Channel,
|
|
permissions: uint,
|
|
}
|
|
|
|
Window := struct {
|
|
data: WindowData,
|
|
surface: Surface,
|
|
} |