raiguard/odin-wayland
git clone https://git.raiguard.me/raiguard/odin-wayland
fd8ef50
trunk
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 ) { 14header := _unmarshal_raw ( session . socket_stream , Message_Header ) or_return 15 16buf := & session . message_read_buffer 17bytes . buffer_reset ( buf ) 18resize ( & buf . buf , header . size - size_of ( header )) 19 20payload := bytes . buffer_to_bytes ( buf ) 21io . read ( session . socket_stream , payload ) or_return 22 23return { header , payload }, nil 24} 25 26_msg_write :: proc ( session : ^ Session , object_id : $ I / Object_ID , opcode : $ O , args : .. Message_Primitive ) -> Error 27where intr . type_core_type ( O ) == Opcode 28{ 29buf := & session . message_write_buffer 30bytes . buffer_reset ( buf ) 31payload_stream := bytes . buffer_to_stream ( buf ) 32 33for arg in args { 34_marshal_primitive ( payload_stream , arg ) or_return 35} 36 37header := Message_Header { 38object_id = Object_ID ( object_id ), 39opcode = Opcode ( opcode ), 40size = u16 ( size_of ( Message_Header ) + bytes . buffer_length ( buf )), 41} 42_marshal_raw ( session . socket_stream , header ) or_return 43io . write ( session . socket_stream , bytes . buffer_to_bytes ( buf )) or_return 44 45_message_log ( session , . Request , Object_ID ( object_id ), opcode , .. args ) 46 47return 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 ) { 52if ! session . debug_logging_enabled { 53return 54} 55 56builder := & session . debug_log_builder 57strings . builder_reset ( builder ) 58if type == . Request { 59strings . write_string ( builder , " -> " ) 60} 61fmt . sbprintf ( builder , "{}#{}.{}(" , _get_object_interface_name ( session , object_id ), object_id , opcode ) 62 63num_args := len ( arguments ) 64for argument , i in arguments { 65switch value in argument { 66case i32 : 67strings . write_int ( builder , int ( value )) 68case u32 : 69strings . write_uint ( builder , uint ( value )) 70case Object_ID : 71fmt . sbprintf ( builder , "{}#{}" , _get_object_interface_name ( session , value ), value ) 72case Fixed : 73_string_builder_write_fixed ( builder , value ) 74case string : 75fmt . sbprintf ( builder , "\"{}\"" , value ) 76case [] byte : 77unimplemented () 78case linux . Fd : 79fmt . sbprintf ( builder , "FD({})" , value ) 80} 81if i < num_args - 1 { 82strings . write_string ( builder , ", " ) 83} 84} 85 86strings . write_byte ( builder , ')' ) 87 88log . debug ( strings . to_string ( builder ^ )) 89}