@@ -713,6 +713,7 @@ public bool DispatchHoverMotion
713713 private ReturnTypeEventHandler < object , WheelEventArgs , bool > interceptWheelHandler ;
714714 private event EventHandler < KeyEventArgs > stageKeyHandler ;
715715 private ReturnTypeEventHandler < object , KeyEventArgs , bool > stageInterceptKeyHandler ;
716+ private ReturnTypeEventHandler < object , KeyEventArgs , bool > stageSystemInterceptKeyHandler ;
716717 private event EventHandler stageEventProcessingFinishedEventHandler ;
717718 private event EventHandler < ResizedEventArgs > windowResizeEventHandler ;
718719 private event EventHandler < FocusChangedEventArgs > windowFocusChangedEventHandler2 ;
@@ -826,6 +827,37 @@ internal event EventHandler SceneCreated
826827 }
827828 }
828829
830+ /// <summary>
831+ /// System-level key event interception that occurs before the user-level InterceptKeyEvent.<br />
832+ /// This event is intended for internal framework use and provides the highest priority for intercepting key events.<br />
833+ /// When this event returns true (consumed), it prevents the key event from being dispatched to both InterceptKeyEvent and child views.<br />
834+ /// Multiple handlers can be registered, and their return values are OR'd together.<br />
835+ /// This event is marked as internal and should not be used by application code.
836+ /// </summary>
837+ internal event ReturnTypeEventHandler < object , KeyEventArgs , bool > SystemInterceptKeyEvent
838+ {
839+ add
840+ {
841+ if ( stageInterceptKeyHandler == null )
842+ {
843+ CreateSafeCallback ( OnStageInterceptKey , out stageInterceptKeyCallbackDelegate ) ;
844+ using KeyEventSignal signal = new KeyEventSignal ( Interop . Window . InterceptKeyEventSignal ( SwigCPtr ) , false ) ;
845+ signal . Ensure ( ) ? . Connect ( stageInterceptKeyCallbackDelegate ) ;
846+ }
847+ stageSystemInterceptKeyHandler += value ;
848+ }
849+ remove
850+ {
851+ stageSystemInterceptKeyHandler -= value ;
852+ if ( stageInterceptKeyHandler == null && stageInterceptKeyCallbackDelegate != null )
853+ {
854+ using KeyEventSignal signal = new KeyEventSignal ( Interop . Window . InterceptKeyEventSignal ( SwigCPtr ) , false ) ;
855+ signal . Ensure ( ) ? . Disconnect ( stageInterceptKeyCallbackDelegate ) ;
856+ ReleaseSafeCallback ( ref stageInterceptKeyCallbackDelegate ) ;
857+ }
858+ }
859+ }
860+
829861 internal System . IntPtr GetNativeWindowHandler ( )
830862 {
831863 System . IntPtr ret = Interop . Window . GetNativeWindowHandler ( HandleRef . ToIntPtr ( this . SwigCPtr ) ) ;
@@ -1177,6 +1209,26 @@ private bool OnStageInterceptKey(IntPtr data)
11771209 return false ;
11781210 }
11791211
1212+ bool systemConsumed = false ;
1213+ if ( stageSystemInterceptKeyHandler != null )
1214+ {
1215+ KeyEventArgs e = new KeyEventArgs ( ) ;
1216+ e . Key = Tizen . NUI . Key . GetKeyFromPtr ( data ) ;
1217+
1218+ Delegate [ ] delegateList = stageSystemInterceptKeyHandler . GetInvocationList ( ) ;
1219+ // Oring the result of each callback.
1220+ foreach ( ReturnTypeEventHandler < object , KeyEventArgs , bool > del in delegateList )
1221+ {
1222+ systemConsumed |= del ( this , e ) ;
1223+ }
1224+ }
1225+
1226+ // If SystemInterceptKeyEvent consumes, it also blocks interceptKeyEvent.
1227+ if ( systemConsumed )
1228+ {
1229+ return true ;
1230+ }
1231+
11801232 bool consumed = false ;
11811233 if ( stageInterceptKeyHandler != null )
11821234 {
0 commit comments