summaryrefslogtreecommitdiff
path: root/libraries/goldman/include
diff options
context:
space:
mode:
authorBenji Dial <benji@benjidial.net>2024-07-29 11:27:22 -0400
committerBenji Dial <benji@benjidial.net>2024-07-29 11:27:22 -0400
commitbe691582ee12613278af24cb5a824eeb357f6324 (patch)
tree5982ca3aad5257f515c93f62735ff3d630aa3ab3 /libraries/goldman/include
parent3636fd21e079c47bd8d62e773e178f68fe9c2052 (diff)
downloadhilbert-os-be691582ee12613278af24cb5a824eeb357f6324.tar.gz
some work on compositor
Diffstat (limited to 'libraries/goldman/include')
-rw-r--r--libraries/goldman/include/goldman/protocol.hpp85
1 files changed, 85 insertions, 0 deletions
diff --git a/libraries/goldman/include/goldman/protocol.hpp b/libraries/goldman/include/goldman/protocol.hpp
new file mode 100644
index 0000000..b7f4d51
--- /dev/null
+++ b/libraries/goldman/include/goldman/protocol.hpp
@@ -0,0 +1,85 @@
+#pragma once
+
+#include <euler/syscall.hpp>
+#include <memory>
+
+//TODO: handle stream errors, make thread safe
+
+namespace goldman::protocol {
+
+ typedef euler::syscall::encoded_color color;
+ typedef uint16_t window;
+
+ static inline void send_open_window(
+ euler::syscall::stream_handle socket, uint32_t width, uint32_t height) {
+
+ struct [[gnu::packed]] {
+ uint8_t type;
+ uint32_t width;
+ uint32_t height;
+ } packet {
+ .type = 0x00,
+ .width = width,
+ .height = height
+ };
+
+ euler::syscall::write_to_stream(socket, sizeof(packet), &packet);
+
+ }
+
+ void send_update_window_region(
+ euler::syscall::stream_handle socket, window the_window,
+ uint32_t start_x, uint32_t start_y, uint32_t width,
+ uint32_t height, const color *the_data, size_t data_pitch) {
+
+ struct [[gnu::packed]] {
+ uint8_t type;
+ window the_window;
+ uint32_t start_x;
+ uint32_t start_y;
+ uint32_t width;
+ uint32_t height;
+ } packet_head {
+ .type = 0x01,
+ .the_window = the_window,
+ .start_x = start_x,
+ .start_y = start_y,
+ .width = width,
+ .height = height
+ };
+
+ euler::syscall::write_to_stream(socket, sizeof(packet_head), &packet_head);
+ for (uint32_t y = 0; y < height; ++y)
+ euler::syscall::write_to_stream(
+ socket, width * sizeof(color), the_data + data_pitch * y);
+
+ }
+
+ void send_close_window(
+ euler::syscall::stream_handle socket, window the_window) {
+
+ struct [[gnu::packed]] {
+ uint8_t type;
+ window the_window;
+ } packet {
+ .type = 0x02,
+ .the_window = the_window
+ };
+
+ euler::syscall::write_to_stream(socket, sizeof(packet), &packet);
+
+ }
+
+ enum class response_id : uint8_t {
+ window_opened
+ };
+
+ window get_window_opened_body(euler::syscall::stream_handle socket) {
+
+ window w;
+ euler::syscall::read_from_stream(socket, sizeof(w), &w);
+ return w;
+
+ }
+
+}