Skip to content

Introduce Tizen.WindowSystem#7435

Closed
JoonghyunCho wants to merge 3 commits intomainfrom
refactor-windowsystem2
Closed

Introduce Tizen.WindowSystem#7435
JoonghyunCho wants to merge 3 commits intomainfrom
refactor-windowsystem2

Conversation

@JoonghyunCho
Copy link
Member

@JoonghyunCho JoonghyunCho commented Jan 28, 2026

Description of Change

  • Decoupled NUI dependency
    Refactored the module to be shared across different layers by removing direct dependencies on NUI
  • Optimized Lifecycle Management
    Eliminated inefficient destructors (finalizers) and implemented the standard .NET Dispose pattern.
  • Update the namespace (Tizen.NUI.WindowSystem -> Tizen.WindowSystem)

Benchmark Details

  • Environment
    Tizen 11.0 / RPI 4 / tizen-unified_20260119.131423
  • Scenario
    Performed 100, 200, and 300 iterations of creation and destruction for TizenShell and QuickPanelClient .
  • Results
    • Execution Speed
      Improved performance by 1~4% compared to the previous implementation.
    • Execution Stability
      Reduced standard deviation (jitter) by 9~54%.
      -> The increase stability is attributed to reduced CPU contension from the Finalizer thread and minimize GC interference previously caused by the DisposeQueue.
    • Memory Allocation: Negligible difference in allocated bytes (<0.01%).
      -> Although Heap uage remains identical, determinism in memory reclamation is achieved. By bypassing the Finalization Queue, native resources and managed memory are reclaimed immediately upon diposal.

@github-actions github-actions bot added the API14 Platform : Tizen 11.0 / TFM: net8.0-tizen11.0 label Jan 28, 2026
@TizenAPI-Bot
Copy link
Collaborator

Public API Changed

Please follow the ACR process for the changed API below.

Added: 35, Removed: 0, Changed: 0

Added

+ /// <since_tizen>8</since_tizen
+ Tizen.WindowSystem.Shell.QuickPanelClient

+ /// <since_tizen>8</since_tizen
+ Tizen.WindowSystem.Shell.QuickPanelClient/ScrollableState Tizen.WindowSystem.Shell.QuickPanelClient::Scrollable()

+ /// <since_tizen>8</since_tizen
+ Tizen.WindowSystem.Shell.QuickPanelClient/VisibleState Tizen.WindowSystem.Shell.QuickPanelClient::Visible()

+ /// <since_tizen>8</since_tizen
+ Tizen.WindowSystem.Shell.WindowOrientation Tizen.WindowSystem.Shell.QuickPanelClient::Orientation()

+ /// <since_tizen>12</since_tizen
+ System.Void Tizen.WindowSystem.Shell.QuickPanelClient::.ctor(Tizen.WindowSystem.Shell.TizenShell,Tizen.Common.IWindowProvider,Tizen.WindowSystem.Shell.QuickPanelClient/Types)

+ /// <since_tizen>8</since_tizen
+ System.Void Tizen.WindowSystem.Shell.QuickPanelClient::Dispose()

+ /// <since_tizen>none</since_tizen
+ System.Void Tizen.WindowSystem.Shell.QuickPanelClient::Dispose(System.Boolean)

+ /// <since_tizen>8</since_tizen
+ System.Void Tizen.WindowSystem.Shell.QuickPanelClient::Hide()

+ /// <since_tizen>8</since_tizen
+ System.Void Tizen.WindowSystem.Shell.QuickPanelClient::Show()

+ /// <since_tizen>12</since_tizen
+ System.EventHandler`1<System.Int32> Tizen.WindowSystem.Shell.QuickPanelClient::RotationChanged

+ /// <since_tizen>8</since_tizen
+ System.EventHandler`1<Tizen.WindowSystem.Shell.QuickPanelClient/VisibleState> Tizen.WindowSystem.Shell.QuickPanelClient::VisibleChanged

+ /// <since_tizen>8</since_tizen
+ System.EventHandler`1<Tizen.WindowSystem.Shell.WindowOrientation> Tizen.WindowSystem.Shell.QuickPanelClient::OrientationChanged

+ /// <since_tizen>8</since_tizen
+ Tizen.WindowSystem.Shell.QuickPanelClient/ScrollableState

+ /// <since_tizen>8</since_tizen
+ static Tizen.WindowSystem.Shell.QuickPanelClient/ScrollableState Tizen.WindowSystem.Shell.QuickPanelClient/ScrollableState::Retain

+ /// <since_tizen>8</since_tizen
+ static Tizen.WindowSystem.Shell.QuickPanelClient/ScrollableState Tizen.WindowSystem.Shell.QuickPanelClient/ScrollableState::Set

+ /// <since_tizen>8</since_tizen
+ static Tizen.WindowSystem.Shell.QuickPanelClient/ScrollableState Tizen.WindowSystem.Shell.QuickPanelClient/ScrollableState::Unknown

+ /// <since_tizen>8</since_tizen
+ static Tizen.WindowSystem.Shell.QuickPanelClient/ScrollableState Tizen.WindowSystem.Shell.QuickPanelClient/ScrollableState::Unset

+ /// <since_tizen>8</since_tizen
+ Tizen.WindowSystem.Shell.QuickPanelClient/Types

+ /// <since_tizen>none</since_tizen
+ static Tizen.WindowSystem.Shell.QuickPanelClient/Types Tizen.WindowSystem.Shell.QuickPanelClient/Types::AppsMenu

+ /// <since_tizen>none</since_tizen
+ static Tizen.WindowSystem.Shell.QuickPanelClient/Types Tizen.WindowSystem.Shell.QuickPanelClient/Types::ContextMenu

+ /// <since_tizen>none</since_tizen
+ static Tizen.WindowSystem.Shell.QuickPanelClient/Types Tizen.WindowSystem.Shell.QuickPanelClient/Types::SystemDefault

+ /// <since_tizen>none</since_tizen
+ static Tizen.WindowSystem.Shell.QuickPanelClient/Types Tizen.WindowSystem.Shell.QuickPanelClient/Types::Unknown

+ /// <since_tizen>8</since_tizen
+ Tizen.WindowSystem.Shell.QuickPanelClient/VisibleState

+ /// <since_tizen>8</since_tizen
+ static Tizen.WindowSystem.Shell.QuickPanelClient/VisibleState Tizen.WindowSystem.Shell.QuickPanelClient/VisibleState::Hidden

+ /// <since_tizen>8</since_tizen
+ static Tizen.WindowSystem.Shell.QuickPanelClient/VisibleState Tizen.WindowSystem.Shell.QuickPanelClient/VisibleState::Shown

+ /// <since_tizen>8</since_tizen
+ static Tizen.WindowSystem.Shell.QuickPanelClient/VisibleState Tizen.WindowSystem.Shell.QuickPanelClient/VisibleState::Unknown

+ /// <since_tizen>8</since_tizen
+ Tizen.WindowSystem.Shell.TizenShell

+ /// <since_tizen>8</since_tizen
+ System.Void Tizen.WindowSystem.Shell.TizenShell::.ctor()

+ /// <since_tizen>8</since_tizen
+ System.Void Tizen.WindowSystem.Shell.TizenShell::Dispose()

+ /// <since_tizen>none</since_tizen
+ System.Void Tizen.WindowSystem.Shell.TizenShell::Dispose(System.Boolean)

+ /// <since_tizen>8</since_tizen
+ Tizen.WindowSystem.Shell.WindowOrientation

+ /// <since_tizen>none</since_tizen
+ static Tizen.WindowSystem.Shell.WindowOrientation Tizen.WindowSystem.Shell.WindowOrientation::Landscape

+ /// <since_tizen>none</since_tizen
+ static Tizen.WindowSystem.Shell.WindowOrientation Tizen.WindowSystem.Shell.WindowOrientation::LandscapeInverse

+ /// <since_tizen>none</since_tizen
+ static Tizen.WindowSystem.Shell.WindowOrientation Tizen.WindowSystem.Shell.WindowOrientation::Portrait

+ /// <since_tizen>none</since_tizen
+ static Tizen.WindowSystem.Shell.WindowOrientation Tizen.WindowSystem.Shell.WindowOrientation::PortraitInverse

Internal API Changed

Added: 182, Removed: 0, Changed: 0

@JoonghyunCho JoonghyunCho force-pushed the refactor-windowsystem2 branch from 799de58 to ee860aa Compare January 28, 2026 11:11
@TizenAPI-Bot
Copy link
Collaborator

Public API Changed

Please follow the ACR process for the changed API below.

Added: 35, Removed: 0, Changed: 0

Added

+ /// <since_tizen>8</since_tizen
+ Tizen.WindowSystem.Shell.QuickPanelClient

+ /// <since_tizen>8</since_tizen
+ Tizen.WindowSystem.Shell.QuickPanelClient/ScrollableState Tizen.WindowSystem.Shell.QuickPanelClient::Scrollable()

+ /// <since_tizen>8</since_tizen
+ Tizen.WindowSystem.Shell.QuickPanelClient/VisibleState Tizen.WindowSystem.Shell.QuickPanelClient::Visible()

+ /// <since_tizen>8</since_tizen
+ Tizen.WindowSystem.Shell.WindowOrientation Tizen.WindowSystem.Shell.QuickPanelClient::Orientation()

+ /// <since_tizen>12</since_tizen
+ System.Void Tizen.WindowSystem.Shell.QuickPanelClient::.ctor(Tizen.WindowSystem.Shell.TizenShell,Tizen.Common.IWindowProvider,Tizen.WindowSystem.Shell.QuickPanelClient/Types)

+ /// <since_tizen>8</since_tizen
+ System.Void Tizen.WindowSystem.Shell.QuickPanelClient::Dispose()

+ /// <since_tizen>none</since_tizen
+ System.Void Tizen.WindowSystem.Shell.QuickPanelClient::Dispose(System.Boolean)

+ /// <since_tizen>8</since_tizen
+ System.Void Tizen.WindowSystem.Shell.QuickPanelClient::Hide()

+ /// <since_tizen>8</since_tizen
+ System.Void Tizen.WindowSystem.Shell.QuickPanelClient::Show()

+ /// <since_tizen>12</since_tizen
+ System.EventHandler`1<System.Int32> Tizen.WindowSystem.Shell.QuickPanelClient::RotationChanged

+ /// <since_tizen>8</since_tizen
+ System.EventHandler`1<Tizen.WindowSystem.Shell.QuickPanelClient/VisibleState> Tizen.WindowSystem.Shell.QuickPanelClient::VisibleChanged

+ /// <since_tizen>8</since_tizen
+ System.EventHandler`1<Tizen.WindowSystem.Shell.WindowOrientation> Tizen.WindowSystem.Shell.QuickPanelClient::OrientationChanged

+ /// <since_tizen>8</since_tizen
+ Tizen.WindowSystem.Shell.QuickPanelClient/ScrollableState

+ /// <since_tizen>8</since_tizen
+ static Tizen.WindowSystem.Shell.QuickPanelClient/ScrollableState Tizen.WindowSystem.Shell.QuickPanelClient/ScrollableState::Retain

+ /// <since_tizen>8</since_tizen
+ static Tizen.WindowSystem.Shell.QuickPanelClient/ScrollableState Tizen.WindowSystem.Shell.QuickPanelClient/ScrollableState::Set

+ /// <since_tizen>8</since_tizen
+ static Tizen.WindowSystem.Shell.QuickPanelClient/ScrollableState Tizen.WindowSystem.Shell.QuickPanelClient/ScrollableState::Unknown

+ /// <since_tizen>8</since_tizen
+ static Tizen.WindowSystem.Shell.QuickPanelClient/ScrollableState Tizen.WindowSystem.Shell.QuickPanelClient/ScrollableState::Unset

+ /// <since_tizen>8</since_tizen
+ Tizen.WindowSystem.Shell.QuickPanelClient/Types

+ /// <since_tizen>none</since_tizen
+ static Tizen.WindowSystem.Shell.QuickPanelClient/Types Tizen.WindowSystem.Shell.QuickPanelClient/Types::AppsMenu

+ /// <since_tizen>none</since_tizen
+ static Tizen.WindowSystem.Shell.QuickPanelClient/Types Tizen.WindowSystem.Shell.QuickPanelClient/Types::ContextMenu

+ /// <since_tizen>none</since_tizen
+ static Tizen.WindowSystem.Shell.QuickPanelClient/Types Tizen.WindowSystem.Shell.QuickPanelClient/Types::SystemDefault

+ /// <since_tizen>none</since_tizen
+ static Tizen.WindowSystem.Shell.QuickPanelClient/Types Tizen.WindowSystem.Shell.QuickPanelClient/Types::Unknown

+ /// <since_tizen>8</since_tizen
+ Tizen.WindowSystem.Shell.QuickPanelClient/VisibleState

+ /// <since_tizen>8</since_tizen
+ static Tizen.WindowSystem.Shell.QuickPanelClient/VisibleState Tizen.WindowSystem.Shell.QuickPanelClient/VisibleState::Hidden

+ /// <since_tizen>8</since_tizen
+ static Tizen.WindowSystem.Shell.QuickPanelClient/VisibleState Tizen.WindowSystem.Shell.QuickPanelClient/VisibleState::Shown

+ /// <since_tizen>8</since_tizen
+ static Tizen.WindowSystem.Shell.QuickPanelClient/VisibleState Tizen.WindowSystem.Shell.QuickPanelClient/VisibleState::Unknown

+ /// <since_tizen>8</since_tizen
+ Tizen.WindowSystem.Shell.TizenShell

+ /// <since_tizen>8</since_tizen
+ System.Void Tizen.WindowSystem.Shell.TizenShell::.ctor()

+ /// <since_tizen>8</since_tizen
+ System.Void Tizen.WindowSystem.Shell.TizenShell::Dispose()

+ /// <since_tizen>none</since_tizen
+ System.Void Tizen.WindowSystem.Shell.TizenShell::Dispose(System.Boolean)

+ /// <since_tizen>8</since_tizen
+ Tizen.WindowSystem.Shell.WindowOrientation

+ /// <since_tizen>none</since_tizen
+ static Tizen.WindowSystem.Shell.WindowOrientation Tizen.WindowSystem.Shell.WindowOrientation::Landscape

+ /// <since_tizen>none</since_tizen
+ static Tizen.WindowSystem.Shell.WindowOrientation Tizen.WindowSystem.Shell.WindowOrientation::LandscapeInverse

+ /// <since_tizen>none</since_tizen
+ static Tizen.WindowSystem.Shell.WindowOrientation Tizen.WindowSystem.Shell.WindowOrientation::Portrait

+ /// <since_tizen>none</since_tizen
+ static Tizen.WindowSystem.Shell.WindowOrientation Tizen.WindowSystem.Shell.WindowOrientation::PortraitInverse

Internal API Changed

Added: 182, Removed: 0, Changed: 0

Copy link
Contributor

@myroot myroot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

리뷰를 중간에 하다가 멈췄는데,
현재 리펙토링이 단순하게 IDisposable패턴만 수정하고 나머지 부분에 대해서는 리펙토링이 안된것 같습니다.

#6184
이 PR은 이전에 InputGesture에 대해서 리팩토링이 필요한 부분에 대해서 리뷰는 했지만,
릴리즈 시점상 그리고 API변경을 유발하기 때문에 실제로 리뷰대로 리펙토링을 못했던 PR입니다.

이 PR을 참고하여 리팩토링할 부분에 대해서 검토가 더 필요합니다.

Comment on lines +107 to +108
int res = Interop.KVMService.Destroy(_kvmService);
_kvmService = IntPtr.Zero;
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

unmanaged resource인 _kvmServer가 있는데, 소멸자가 없는 것 같습니다.

https://learn.microsoft.com/en-us/dotnet/fundamentals/runtime-libraries/system-object-finalize

The Finalize method is used to perform cleanup operations on unmanaged resources held by the current object before the object is destroyed.

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

소멸자로 인해 GC Thread에서 Dispose()되는 경우에 대한 문제가 있을까요?

/// <exception cref="ArgumentException">Thrown when failed of invalid argument.</exception>
public List<string> GetSourceMimetypes()
{
int res = Interop.KVMService.GetSourceMimetypes(_kvmService, out string[] mimetypes, out int mimeTypeCount);
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

이 코드는 동작이 되는 건지 확인이 필요할 것 같네요,

TZSH_EXPORT int
	tzsh_kvm_service_get_source_mimetypes(tzsh_kvm_service_h service, char ***mime_types, int *mime_type_count)

이런 함수를 호출하는건데, mime_types는 문자열(char*)의 배열(char**)의 포인터(char***) 그리고 여기에 배열이 새롭게 할당되는 것이라서 자동 marshal로는 안될것 같네요

@JoonghyunCho
Copy link
Member Author

Created a new PR #7459

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

ACR Required API14 Platform : Tizen 11.0 / TFM: net8.0-tizen11.0 Internal API Changed

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants