@@ -36,7 +36,7 @@ struct DefaultHandler;
3636impl RiverXkbBindingV1Handler for DefaultHandler { }
3737
3838impl ConcreteObject for RiverXkbBindingV1 {
39- const XML_VERSION : u32 = 1 ;
39+ const XML_VERSION : u32 = 2 ;
4040 const INTERFACE : ObjectInterface = ObjectInterface :: RiverXkbBindingV1 ;
4141 const INTERFACE_NAME : & str = "river_xkb_binding_v1" ;
4242}
@@ -510,6 +510,79 @@ impl RiverXkbBindingV1 {
510510 log_send ( "river_xkb_binding_v1.released" , & e) ;
511511 }
512512 }
513+
514+ /// Since when the stop_repeat message is available.
515+ pub const MSG__STOP_REPEAT__SINCE : u32 = 2 ;
516+
517+ /// repeating should be stopped
518+ ///
519+ /// This event indicates that repeating should be stopped for the binding if
520+ /// the window manager has been repeating some action since the pressed
521+ /// event.
522+ ///
523+ /// This event is generally sent when some other (possible unbound) key is
524+ /// pressed after the pressed event is sent and before the released event
525+ /// is sent for this binding.
526+ ///
527+ /// This event will be followed by a manage_start event after all other new
528+ /// state has been sent by the server.
529+ #[ inline]
530+ pub fn try_send_stop_repeat (
531+ & self ,
532+ ) -> Result < ( ) , ObjectError > {
533+ let core = self . core ( ) ;
534+ let client_ref = core. client . borrow ( ) ;
535+ let Some ( client) = & * client_ref else {
536+ return Err ( ObjectError ( ObjectErrorKind :: ReceiverNoClient ) ) ;
537+ } ;
538+ let id = core. client_obj_id . get ( ) . unwrap_or ( 0 ) ;
539+ #[ cfg( feature = "logging" ) ]
540+ if self . core . state . log {
541+ #[ cold]
542+ fn log ( state : & State , client_id : u64 , id : u32 ) {
543+ let ( millis, micros) = time_since_epoch ( ) ;
544+ let prefix = & state. log_prefix ;
545+ let args = format_args ! ( "[{millis:7}.{micros:03}] {prefix}client#{:<4} <= river_xkb_binding_v1#{}.stop_repeat()\n " , client_id, id) ;
546+ state. log ( args) ;
547+ }
548+ log ( & self . core . state , client. endpoint . id , id) ;
549+ }
550+ let endpoint = & client. endpoint ;
551+ if !endpoint. flush_queued . replace ( true ) {
552+ self . core . state . add_flushable_endpoint ( endpoint, Some ( client) ) ;
553+ }
554+ let mut outgoing_ref = endpoint. outgoing . borrow_mut ( ) ;
555+ let outgoing = & mut * outgoing_ref;
556+ let mut fmt = outgoing. formatter ( ) ;
557+ fmt. words ( [
558+ id,
559+ 2 ,
560+ ] ) ;
561+ Ok ( ( ) )
562+ }
563+
564+ /// repeating should be stopped
565+ ///
566+ /// This event indicates that repeating should be stopped for the binding if
567+ /// the window manager has been repeating some action since the pressed
568+ /// event.
569+ ///
570+ /// This event is generally sent when some other (possible unbound) key is
571+ /// pressed after the pressed event is sent and before the released event
572+ /// is sent for this binding.
573+ ///
574+ /// This event will be followed by a manage_start event after all other new
575+ /// state has been sent by the server.
576+ #[ inline]
577+ pub fn send_stop_repeat (
578+ & self ,
579+ ) {
580+ let res = self . try_send_stop_repeat (
581+ ) ;
582+ if let Err ( e) = res {
583+ log_send ( "river_xkb_binding_v1.stop_repeat" , & e) ;
584+ }
585+ }
513586}
514587
515588/// A message handler for [`RiverXkbBindingV1`] proxies.
@@ -683,6 +756,33 @@ pub trait RiverXkbBindingV1Handler: Any {
683756 log_forward ( "river_xkb_binding_v1.released" , & e) ;
684757 }
685758 }
759+
760+ /// repeating should be stopped
761+ ///
762+ /// This event indicates that repeating should be stopped for the binding if
763+ /// the window manager has been repeating some action since the pressed
764+ /// event.
765+ ///
766+ /// This event is generally sent when some other (possible unbound) key is
767+ /// pressed after the pressed event is sent and before the released event
768+ /// is sent for this binding.
769+ ///
770+ /// This event will be followed by a manage_start event after all other new
771+ /// state has been sent by the server.
772+ #[ inline]
773+ fn handle_stop_repeat (
774+ & mut self ,
775+ slf : & Rc < RiverXkbBindingV1 > ,
776+ ) {
777+ if !slf. core . forward_to_client . get ( ) {
778+ return ;
779+ }
780+ let res = slf. try_send_stop_repeat (
781+ ) ;
782+ if let Err ( e) = res {
783+ log_forward ( "river_xkb_binding_v1.stop_repeat" , & e) ;
784+ }
785+ }
686786}
687787
688788impl ObjectPrivate for RiverXkbBindingV1 {
@@ -857,6 +957,27 @@ impl ObjectPrivate for RiverXkbBindingV1 {
857957 DefaultHandler . handle_released ( & self ) ;
858958 }
859959 }
960+ 2 => {
961+ if msg. len ( ) != 2 {
962+ return Err ( ObjectError ( ObjectErrorKind :: WrongMessageSize ( msg. len ( ) as u32 * 4 , 8 ) ) ) ;
963+ }
964+ #[ cfg( feature = "logging" ) ]
965+ if self . core . state . log {
966+ #[ cold]
967+ fn log ( state : & State , id : u32 ) {
968+ let ( millis, micros) = time_since_epoch ( ) ;
969+ let prefix = & state. log_prefix ;
970+ let args = format_args ! ( "[{millis:7}.{micros:03}] {prefix}server -> river_xkb_binding_v1#{}.stop_repeat()\n " , id) ;
971+ state. log ( args) ;
972+ }
973+ log ( & self . core . state , msg[ 0 ] ) ;
974+ }
975+ if let Some ( handler) = handler {
976+ ( * * handler) . handle_stop_repeat ( & self ) ;
977+ } else {
978+ DefaultHandler . handle_stop_repeat ( & self ) ;
979+ }
980+ }
860981 n => {
861982 let _ = server;
862983 let _ = msg;
@@ -883,6 +1004,7 @@ impl ObjectPrivate for RiverXkbBindingV1 {
8831004 let name = match id {
8841005 0 => "pressed" ,
8851006 1 => "released" ,
1007+ 2 => "stop_repeat" ,
8861008 _ => return None ,
8871009 } ;
8881010 Some ( name)
0 commit comments