@@ -7,6 +7,7 @@ extern crate display_proto as proto;
77#[ macro_use]
88extern crate ulib;
99
10+ use alloc:: string:: String ;
1011use alloc:: vec:: Vec ;
1112use proto:: BufferHandle ;
1213use thunderdome:: { Arena , Index } ;
@@ -23,6 +24,7 @@ struct BufferInfo {
2324
2425struct Client {
2526 handle : BufferHandle ,
27+ title : String ,
2628 present_ready : bool ,
2729}
2830
@@ -76,6 +78,7 @@ fn handle_incoming(
7678 let client = Client {
7779 handle,
7880 present_ready : false ,
81+ title : String :: new ( ) ,
7982 } ;
8083 ( window, client)
8184}
@@ -321,6 +324,16 @@ fn handle_conns(mut fb: framebuffer::Framebuffer, server_socket: FileDesc) {
321324 load_image ( include_bytes ! ( "../assets/close-pressed.qoi" ) ) ;
322325 assert ! ( close_height == close2_height && close_width == close2_width) ;
323326
327+ let compressed_font = include_bytes_align ! ( u32 , "../../console/ctrld-fixed-10r.pcf.lz4" ) ;
328+ let size = lz4:: frame:: read_frame ( compressed_font)
329+ . unwrap ( )
330+ . 0
331+ . content_size ( )
332+ . unwrap ( ) ;
333+ let mut font_data = alloc:: vec![ 0 ; size as usize ] ;
334+ let font_data = lz4:: decode_into ( compressed_font, & mut font_data) . unwrap ( ) ;
335+ let font = gfx:: format:: pcf:: load_pcf ( font_data) . unwrap ( ) ;
336+
324337 let mut to_remove = Vec :: < Index > :: new ( ) ;
325338
326339 let mut intermediate_fb = alloc:: vec![ 0u128 ; fb. data. len( ) ] ;
@@ -447,6 +460,7 @@ fn handle_conns(mut fb: framebuffer::Framebuffer, server_socket: FileDesc) {
447460 }
448461
449462 for ( i, client) in clients. iter_mut ( ) {
463+ use proto:: EventData ;
450464 let mut ev_limit = 10 ;
451465 while let Some ( msg) = client. handle . client_to_server_queue ( ) . try_recv ( ) {
452466 if ev_limit == 0 {
@@ -455,15 +469,21 @@ fn handle_conns(mut fb: framebuffer::Framebuffer, server_socket: FileDesc) {
455469 ev_limit -= 1 ;
456470 match msg. kind {
457471 proto:: EventKind :: PRESENT => {
458- // HACK: treat newest window as active
459- use proto:: EventData ;
460472 let proto:: PresentEvent = proto:: PresentEvent :: parse ( & msg) . unwrap ( ) ;
461473 client. present_ready = true ;
462474 any_updated = true ;
463475 }
476+ proto:: EventKind :: TITLE => {
477+ let proto:: TitleEvent { len, data } =
478+ proto:: TitleEvent :: parse ( & msg) . unwrap ( ) ;
479+ let buf = & data[ ..( len as usize ) . min ( data. len ( ) ) ] ;
480+ client. title = alloc:: string:: String :: from_utf8_lossy ( buf) . into_owned ( ) ;
481+ println ! ( "Updated title: {:?}" , client. title) ;
482+ any_updated = true ;
483+ }
464484 proto:: EventKind :: DISCONNECT => {
465485 // TODO: auto-disconnect on process exit?
466- println ! ( "Client {:?} disconnected." , i) ;
486+ println ! ( "[disp] client {:?} disconnected." , i) ;
467487 to_remove. push ( i) ;
468488 break ;
469489 }
@@ -475,6 +495,7 @@ fn handle_conns(mut fb: framebuffer::Framebuffer, server_socket: FileDesc) {
475495 }
476496
477497 let title_height = 12 ;
498+ let title_fg_color = 0xFF000000 ;
478499 let title_bg_color_active = 0xFFFFFFFF ;
479500 let title_bg_color_inactive = 0xFFCCCCCC ;
480501
@@ -529,6 +550,19 @@ fn handle_conns(mut fb: framebuffer::Framebuffer, server_socket: FileDesc) {
529550 }
530551
531552 let out = bytemuck:: cast_slice_mut :: < _ , u32 > ( & mut intermediate_fb) ;
553+ let buf = & mut out
554+ [ window_y * fb. stride ..( window_y + title_height) . min ( fb. height ) * fb. stride ] ;
555+ let title_start = ( fb. stride * 2 ) + window_x + 2 ;
556+ font. draw_string (
557+ & client. title ,
558+ buf,
559+ title_start,
560+ Some ( effective_width. saturating_sub ( 2 ) ) ,
561+ fb. stride ,
562+ 1 ,
563+ title_fg_color,
564+ ) ;
565+
532566 // Draw close button
533567
534568 let close_pressed = match hovered {
0 commit comments