raiguard/odin-wayland

git clone https://git.raiguard.me/raiguard/odin-wayland

Caleb HeuerMove generated -> mockgenfd8ef50

trunk
2.4 KiB89 linesraw
1#+build linux
2#+vet explicit-allocators
3package wayland
4
5import intr "base:intrinsics"
6import "core:bytes"
7import "core:fmt"
8import "core:io"
9import "core:log"
10import "core:strings"
11import "core:sys/linux"
12
13_message_read :: proc(session: ^Session) -> (message: Raw_Message, error: Error) {
14	header := _unmarshal_raw(session.socket_stream, Message_Header) or_return
15
16	buf := &session.message_read_buffer
17	bytes.buffer_reset(buf)
18	resize(&buf.buf, header.size - size_of(header))
19
20	payload := bytes.buffer_to_bytes(buf)
21	io.read(session.socket_stream, payload) or_return
22
23	return {header, payload}, nil
24}
25
26_msg_write :: proc(session: ^Session, object_id: $I/Object_ID, opcode: $O, args: ..Message_Primitive) -> Error
27	where intr.type_core_type(O) == Opcode
28{
29	buf := &session.message_write_buffer
30	bytes.buffer_reset(buf)
31	payload_stream := bytes.buffer_to_stream(buf)
32
33	for arg in args {
34		_marshal_primitive(payload_stream, arg) or_return
35	}
36
37	header := Message_Header{
38		object_id = Object_ID(object_id),
39		opcode = Opcode(opcode),
40		size = u16(size_of(Message_Header) + bytes.buffer_length(buf)),
41	}
42	_marshal_raw(session.socket_stream, header) or_return
43	io.write(session.socket_stream, bytes.buffer_to_bytes(buf)) or_return
44
45	_message_log(session, .Request, Object_ID(object_id), opcode, ..args)
46
47	return nil
48}
49
50_Message_Log_Type :: enum { Request, Event }
51_message_log :: proc(session: ^Session, type: _Message_Log_Type, object_id: Object_ID, opcode: $O, arguments: ..Message_Primitive) {
52	if !session.debug_logging_enabled {
53		return
54	}
55
56	builder := &session.debug_log_builder
57	strings.builder_reset(builder)
58	if type == .Request {
59		strings.write_string(builder, " -> ")
60	}
61	fmt.sbprintf(builder, "{}#{}.{}(", _get_object_interface_name(session, object_id), object_id, opcode)
62
63	num_args := len(arguments)
64	for argument, i in arguments {
65		switch value in argument {
66		case i32:
67			strings.write_int(builder, int(value))
68		case u32:
69			strings.write_uint(builder, uint(value))
70		case Object_ID:
71			fmt.sbprintf(builder, "{}#{}", _get_object_interface_name(session, value), value)
72		case Fixed:
73			_string_builder_write_fixed(builder, value)
74		case string:
75			fmt.sbprintf(builder, "\"{}\"", value)
76		case []byte:
77			unimplemented()
78		case linux.Fd:
79			fmt.sbprintf(builder, "FD({})", value)
80		}
81		if i < num_args - 1 {
82			strings.write_string(builder, ", ")
83		}
84	}
85
86	strings.write_byte(builder, ')')
87
88	log.debug(strings.to_string(builder^))
89}