Skip to content

Commit 295c607

Browse files
committed
[NUI] Add SystemInterceptKeyEvent for framework-level key event interception
Add SystemInterceptKeyEvent to provide system-level key event interception with higher priority than user-level InterceptKeyEvent. Features: - System-level event that executes before InterceptKeyEvent - Highest priority for intercepting key events in the framework - When consumed, prevents event dispatch to both InterceptKeyEvent and child views - Supports multiple handlers with OR'd return values - Marked as internal for framework use only
1 parent 875ef8f commit 295c607

File tree

1 file changed

+52
-0
lines changed

1 file changed

+52
-0
lines changed

src/Tizen.NUI/src/public/Window/WindowEvent.cs

Lines changed: 52 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)