/* * Copyright(c) 2019 Samsung Electronics Co., Ltd. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * */ extern alias TizenSystemInformation; using TizenSystemInformation.Tizen.System; using global::System; using System.ComponentModel; using System.Collections.Generic; using global::System.Runtime.InteropServices; using Tizen.NUI.BaseComponents; namespace Tizen.NUI { /// /// The window class is used internally for drawing.
/// The window has an orientation and indicator properties.
///
/// 3 public partial class Window : BaseHandle { private static readonly Window instance = Application.Instance?.GetWindow(); private global::System.Runtime.InteropServices.HandleRef stageCPtr; private Layer _rootLayer; private string _windowTitle; private List _childLayers = new List(); private LayoutController localController; private bool IsSupportedMultiWindow() { bool isSupported = false; Information.TryGetValue("http://tizen.org/feature/opengles.surfaceless_context", out isSupported); return isSupported; } internal Window(global::System.IntPtr cPtr, bool cMemoryOwn) : base(Interop.Window.Upcast(cPtr), cMemoryOwn) { if (Interop.Stage.IsInstalled()) { stageCPtr = new global::System.Runtime.InteropServices.HandleRef(this, Interop.Stage.GetCurrent()); localController = new LayoutController(this); NUILog.Debug("layoutController id:" + localController.GetId()); } } /// /// Creates a new Window.
/// This creates an extra window in addition to the default main window
///
/// The position and size of the Window. /// Whether Window is translucent. /// A new Window. /// 6 /// http://tizen.org/feature/opengles.surfaceless_context /// The required feature is not supported. public Window(Rectangle windowPosition = null, bool isTranslucent = false) : this(Interop.Window.New(Rectangle.getCPtr(windowPosition), "", isTranslucent), true) { if (IsSupportedMultiWindow() == false) { NUILog.Error("This device does not support surfaceless_context. So Window cannot be created. "); } if (NDalicPINVOKE.SWIGPendingException.Pending) throw NDalicPINVOKE.SWIGPendingException.Retrieve(); } /// /// Creates a new Window with a specific name.
/// This creates an extra window in addition to the default main window
///
/// The name for extra window. /// The position and size of the Window. /// Whether Window is translucent. /// A new Window. /// 6 /// http://tizen.org/feature/opengles.surfaceless_context /// The required feature is not supported. public Window(string name, Rectangle windowPosition = null, bool isTranslucent = false) : this(Interop.Window.New(Rectangle.getCPtr(windowPosition), name, isTranslucent), true) { if (IsSupportedMultiWindow() == false) { NUILog.Error("This device does not support surfaceless_context. So Window cannot be created. "); } this._windowTitle = name; if (NDalicPINVOKE.SWIGPendingException.Pending) throw NDalicPINVOKE.SWIGPendingException.Retrieve(); } /// /// Enumeration for orientation of the window is the way in which a rectangular page is oriented for normal viewing. /// /// 3 public enum WindowOrientation { /// /// Portrait orientation. The height of the display area is greater than the width. /// /// 3 Portrait = 0, /// /// Landscape orientation. A wide view area is needed. /// /// 3 Landscape = 90, /// /// Portrait inverse orientation. /// /// 3 PortraitInverse = 180, /// /// Landscape inverse orientation. /// /// 3 LandscapeInverse = 270, /// /// No orientation. It is for the preferred orientation /// Especially, NoOrientationPreference only has the effect for the preferred orientation. /// It is used to unset the preferred orientation with SetPreferredOrientation. /// [EditorBrowsable(EditorBrowsableState.Never)] NoOrientationPreference = -1 } /// /// Enumeration for the key grab mode for platform-level APIs. /// /// 3 public enum KeyGrabMode { /// /// Grabs a key only when on the top of the grabbing-window stack mode. /// Topmost = 0, /// /// Grabs a key together with the other client window(s) mode. /// Shared, /// /// Grabs a key exclusively regardless of the grabbing-window's position on the window stack with the possibility of overriding the grab by the other client window mode. /// OverrideExclusive, /// /// Grabs a key exclusively regardless of the grabbing-window's position on the window stack mode. /// Exclusive }; /// /// Enumeration for transition effect's state. /// [Obsolete("Please do not use! This will be removed. Please use Window.EffectState instead!")] [EditorBrowsable(EditorBrowsableState.Never)] public enum EffectStates { /// /// None state. /// [Obsolete("Please do not use! This will be removed. Please use Window.EffectState.None instead!")] [EditorBrowsable(EditorBrowsableState.Never)] None = 0, /// /// Transition effect is started. /// [Obsolete("Please do not use! This will be removed. Please use Window.EffectState.Start instead!")] [EditorBrowsable(EditorBrowsableState.Never)] Start, /// /// Transition effect is ended. /// [Obsolete("Please do not use! This will be removed. Please use Window.EffectState.End instead!")] [EditorBrowsable(EditorBrowsableState.Never)] End, } /// /// Enumeration for transition effect's state. /// [EditorBrowsable(EditorBrowsableState.Never)] public enum EffectState { /// /// None state. /// [EditorBrowsable(EditorBrowsableState.Never)] None = 0, /// /// Transition effect is started. /// [EditorBrowsable(EditorBrowsableState.Never)] Start, /// /// Transition effect is ended. /// [EditorBrowsable(EditorBrowsableState.Never)] End, } /// /// Enumeration for transition effect's type. /// [Obsolete("Please do not use! This will be removed. Please use Window.EffectType instead!")] [EditorBrowsable(EditorBrowsableState.Never)] public enum EffectTypes { /// /// None type. /// [Obsolete("Please do not use! This will be removed. Please use Window.EffectType.None instead!")] [EditorBrowsable(EditorBrowsableState.Never)] None = 0, /// /// Window show effect. /// [Obsolete("Please do not use! This will be removed. Please use Window.EffectType.Show instead!")] [EditorBrowsable(EditorBrowsableState.Never)] Show, /// /// Window hide effect. /// [Obsolete("Please do not use! This will be removed. Please use Window.EffectType.Hide instead!")] [EditorBrowsable(EditorBrowsableState.Never)] Hide, } /// /// Enumeration for transition effect's type. /// [EditorBrowsable(EditorBrowsableState.Never)] public enum EffectType { /// /// None type. /// [EditorBrowsable(EditorBrowsableState.Never)] None = 0, /// /// Window show effect. /// [EditorBrowsable(EditorBrowsableState.Never)] Show, /// /// Window hide effect. /// [EditorBrowsable(EditorBrowsableState.Never)] Hide, } /// /// The stage instance property (read-only).
/// Gets the current window.
///
/// 3 public static Window Instance { get { return instance; } } /// /// Gets or sets a window type. /// /// 3 public WindowType Type { get { WindowType ret = (WindowType)Interop.Window.GetType(SwigCPtr); if (NDalicPINVOKE.SWIGPendingException.Pending) throw new InvalidOperationException("FATAL: get Exception", NDalicPINVOKE.SWIGPendingException.Retrieve()); return ret; } set { Interop.Window.SetType(SwigCPtr, (int)value); if (NDalicPINVOKE.SWIGPendingException.Pending) throw NDalicPINVOKE.SWIGPendingException.Retrieve(); } } /// /// Gets/Sets a window title. /// /// 4 public string Title { get { return _windowTitle; } set { _windowTitle = value; SetClass(_windowTitle, ""); } } /// /// The rendering behavior of a Window. /// /// 5 public RenderingBehaviorType RenderingBehavior { get { return GetRenderingBehavior(); } set { SetRenderingBehavior(value); } } /// /// The window size property (read-only). /// /// 3 public Size2D Size { get { Size2D ret = GetSize(); return ret; } } /// /// The background color property. /// /// 3 public Color BackgroundColor { set { SetBackgroundColor(value); } get { Color ret = GetBackgroundColor(); return ret; } } /// /// The DPI property (read-only).
/// Retrieves the DPI of the display device to which the Window is connected.
///
/// 3 public Vector2 Dpi { get { return GetDpi(); } } /// /// The layer count property (read-only).
/// Queries the number of on-Window layers.
///
/// 3 public uint LayerCount { get { return GetLayerCount(); } } /// /// Gets or sets a size of the window. /// /// Thrown when value is null. /// 4 public Size2D WindowSize { get { return GetWindowSize(); } set { SetWindowSize(value); } } /// /// Gets or sets a position of the window. /// /// Thrown when value is null. /// 4 public Position2D WindowPosition { get { return GetPosition(); } set { SetPosition(value); } } /// /// Sets position and size of the window. This API guarantees that /// both moving and resizing of window will appear on the screen at once. /// [EditorBrowsable(EditorBrowsableState.Never)] public Rectangle WindowPositionSize { get { Position2D position = GetPosition(); Size2D size = GetSize(); Rectangle ret = new Rectangle(position.X, position.Y, size.Width, size.Height); position.Dispose(); return ret; } set { SetPositionSize(value); } } internal static Vector4 DEFAULT_BACKGROUND_COLOR { get { global::System.IntPtr cPtr = Interop.Stage.DefaultBackgroundColorGet(); Vector4 ret = (cPtr == global::System.IntPtr.Zero) ? null : new Vector4(cPtr, false); if (NDalicPINVOKE.SWIGPendingException.Pending) throw NDalicPINVOKE.SWIGPendingException.Retrieve(); return ret; } } internal static Vector4 DEBUG_BACKGROUND_COLOR { get { global::System.IntPtr cPtr = Interop.Stage.DebugBackgroundColorGet(); Vector4 ret = (cPtr == global::System.IntPtr.Zero) ? null : new Vector4(cPtr, false); if (NDalicPINVOKE.SWIGPendingException.Pending) throw NDalicPINVOKE.SWIGPendingException.Retrieve(); return ret; } } internal List LayersChildren { get { return _childLayers; } } /// /// Get the LayoutController for this Window. /// internal LayoutController LayoutController { get { return localController; } } /// /// Feed a key-event into the window. /// /// The key event to feed. /// 4 [Obsolete("Please do not use! This will be deprecated! Please use FeedKey(Key keyEvent) instead!")] public static void FeedKeyEvent(Key keyEvent) { Interop.Window.FeedKeyEvent(Key.getCPtr(keyEvent)); if (NDalicPINVOKE.SWIGPendingException.Pending) throw NDalicPINVOKE.SWIGPendingException.Retrieve(); } /// /// Sets whether the window accepts a focus or not. /// /// If a focus is accepted or not. The default is true. /// 3 public void SetAcceptFocus(bool accept) { Interop.Window.SetAcceptFocus(SwigCPtr, accept); if (NDalicPINVOKE.SWIGPendingException.Pending) throw NDalicPINVOKE.SWIGPendingException.Retrieve(); } /// /// Returns whether the window accepts a focus or not. /// /// True if the window accepts a focus, false otherwise. /// 3 public bool IsFocusAcceptable() { bool ret = Interop.Window.IsFocusAcceptable(SwigCPtr); if (NDalicPINVOKE.SWIGPendingException.Pending) throw NDalicPINVOKE.SWIGPendingException.Retrieve(); return ret; } /// /// Shows the window if it is hidden. /// /// 3 public void Show() { Interop.Window.Show(SwigCPtr); if (NDalicPINVOKE.SWIGPendingException.Pending) throw NDalicPINVOKE.SWIGPendingException.Retrieve(); } /// /// Hides the window if it is showing. /// /// 3 public void Hide() { Interop.Window.Hide(SwigCPtr); if (NDalicPINVOKE.SWIGPendingException.Pending) throw NDalicPINVOKE.SWIGPendingException.Retrieve(); } /// /// Retrieves whether the window is visible or not. /// /// True if the window is visible. /// 3 public bool IsVisible() { bool temp = Interop.Window.IsVisible(SwigCPtr); if (NDalicPINVOKE.SWIGPendingException.Pending) throw NDalicPINVOKE.SWIGPendingException.Retrieve(); return temp; } /// /// Gets the count of supported auxiliary hints of the window. /// /// The number of supported auxiliary hints. /// 3 public uint GetSupportedAuxiliaryHintCount() { uint ret = Interop.Window.GetSupportedAuxiliaryHintCount(SwigCPtr); if (NDalicPINVOKE.SWIGPendingException.Pending) throw NDalicPINVOKE.SWIGPendingException.Retrieve(); return ret; } /// /// Gets the supported auxiliary hint string of the window. /// /// The index of the supported auxiliary hint lists. /// The auxiliary hint string of the index. /// 3 public string GetSupportedAuxiliaryHint(uint index) { string ret = Interop.Window.GetSupportedAuxiliaryHint(SwigCPtr, index); if (NDalicPINVOKE.SWIGPendingException.Pending) throw NDalicPINVOKE.SWIGPendingException.Retrieve(); return ret; } /// /// Creates an auxiliary hint of the window. /// /// The auxiliary hint string. /// The value string. /// The ID of created auxiliary hint, or 0 on failure. /// 3 public uint AddAuxiliaryHint(string hint, string value) { uint ret = Interop.Window.AddAuxiliaryHint(SwigCPtr, hint, value); if (NDalicPINVOKE.SWIGPendingException.Pending) throw NDalicPINVOKE.SWIGPendingException.Retrieve(); return ret; } /// /// Removes an auxiliary hint of the window. /// /// The ID of the auxiliary hint. /// True if no error occurred, false otherwise. /// 3 public bool RemoveAuxiliaryHint(uint id) { bool ret = Interop.Window.RemoveAuxiliaryHint(SwigCPtr, id); if (NDalicPINVOKE.SWIGPendingException.Pending) throw NDalicPINVOKE.SWIGPendingException.Retrieve(); return ret; } /// /// Changes a value of the auxiliary hint. /// /// The auxiliary hint ID. /// The value string to be set. /// True if no error occurred, false otherwise. /// 3 public bool SetAuxiliaryHintValue(uint id, string value) { bool ret = Interop.Window.SetAuxiliaryHintValue(SwigCPtr, id, value); if (NDalicPINVOKE.SWIGPendingException.Pending) throw NDalicPINVOKE.SWIGPendingException.Retrieve(); return ret; } /// /// Gets a value of the auxiliary hint. /// /// The auxiliary hint ID. /// The string value of the auxiliary hint ID, or an empty string if none exists. /// 3 public string GetAuxiliaryHintValue(uint id) { string ret = Interop.Window.GetAuxiliaryHintValue(SwigCPtr, id); if (NDalicPINVOKE.SWIGPendingException.Pending) throw NDalicPINVOKE.SWIGPendingException.Retrieve(); return ret; } /// /// Gets an ID of the auxiliary hint string. /// /// The auxiliary hint string. /// The ID of auxiliary hint string, or 0 on failure. /// 3 public uint GetAuxiliaryHintId(string hint) { uint ret = Interop.Window.GetAuxiliaryHintId(SwigCPtr, hint); if (NDalicPINVOKE.SWIGPendingException.Pending) throw NDalicPINVOKE.SWIGPendingException.Retrieve(); return ret; } /// /// Sets a region to accept input events. /// /// The region to accept input events. /// 3 public void SetInputRegion(Rectangle inputRegion) { Interop.Window.SetInputRegion(SwigCPtr, Rectangle.getCPtr(inputRegion)); if (NDalicPINVOKE.SWIGPendingException.Pending) throw NDalicPINVOKE.SWIGPendingException.Retrieve(); } /// /// Sets a priority level for the specified notification window. /// /// The notification window level. /// True if no error occurred, false otherwise. /// 3 public bool SetNotificationLevel(NotificationLevel level) { bool ret = Interop.Window.SetNotificationLevel(SwigCPtr, (int)level); if (NDalicPINVOKE.SWIGPendingException.Pending) throw NDalicPINVOKE.SWIGPendingException.Retrieve(); return ret; } /// /// Gets a priority level for the specified notification window. /// /// The notification window level. /// 3 public NotificationLevel GetNotificationLevel() { NotificationLevel ret = (NotificationLevel)Interop.Window.GetNotificationLevel(SwigCPtr); if (NDalicPINVOKE.SWIGPendingException.Pending) throw NDalicPINVOKE.SWIGPendingException.Retrieve(); return ret; } /// /// Sets a transparent window's visual state to opaque.
/// If a visual state of a transparent window is opaque,
/// then the window manager could handle it as an opaque window when calculating visibility. ///
/// Whether the window's visual state is opaque. /// This will have no effect on an opaque window.
/// It doesn't change transparent window to opaque window but lets the window manager know the visual state of the window. ///
/// 3 public void SetOpaqueState(bool opaque) { Interop.Window.SetOpaqueState(SwigCPtr, opaque); if (NDalicPINVOKE.SWIGPendingException.Pending) throw NDalicPINVOKE.SWIGPendingException.Retrieve(); } /// /// Returns whether a transparent window's visual state is opaque or not. /// /// True if the window's visual state is opaque, false otherwise. /// The return value has no meaning on an opaque window. /// 3 public bool IsOpaqueState() { bool ret = Interop.Window.IsOpaqueState(SwigCPtr); if (NDalicPINVOKE.SWIGPendingException.Pending) throw NDalicPINVOKE.SWIGPendingException.Retrieve(); return ret; } /// /// Sets a window's screen off mode. /// /// The screen mode. /// True if no error occurred, false otherwise. /// 4 public bool SetScreenOffMode(ScreenOffMode screenOffMode) { bool ret = Interop.Window.SetScreenOffMode(SwigCPtr, (int)screenOffMode); if (NDalicPINVOKE.SWIGPendingException.Pending) throw NDalicPINVOKE.SWIGPendingException.Retrieve(); return ret; } /// /// Gets the screen mode of the window. /// /// The screen off mode. /// 4 public ScreenOffMode GetScreenOffMode() { ScreenOffMode ret = (ScreenOffMode)Interop.Window.GetScreenOffMode(SwigCPtr); if (NDalicPINVOKE.SWIGPendingException.Pending) throw NDalicPINVOKE.SWIGPendingException.Retrieve(); return ret; } /// /// Sets preferred brightness of the window. /// /// The preferred brightness (0 to 100). /// True if no error occurred, false otherwise. /// 3 public bool SetBrightness(int brightness) { bool ret = Interop.Window.SetBrightness(SwigCPtr, brightness); if (NDalicPINVOKE.SWIGPendingException.Pending) throw NDalicPINVOKE.SWIGPendingException.Retrieve(); return ret; } /// /// Gets the preferred brightness of the window. /// /// The preferred brightness. /// 3 public int GetBrightness() { int ret = Interop.Window.GetBrightness(SwigCPtr); if (NDalicPINVOKE.SWIGPendingException.Pending) throw NDalicPINVOKE.SWIGPendingException.Retrieve(); return ret; } /// /// Sets the window name and the class string. /// /// The name of the window. /// The class of the window. /// 4 public void SetClass(string name, string klass) { Interop.Window.SetClass(SwigCPtr, name, klass); if (NDalicPINVOKE.SWIGPendingException.Pending) throw NDalicPINVOKE.SWIGPendingException.Retrieve(); } /// /// Raises the window to the top of the window stack. /// /// 3 public void Raise() { Interop.Window.Raise(SwigCPtr); if (NDalicPINVOKE.SWIGPendingException.Pending) throw NDalicPINVOKE.SWIGPendingException.Retrieve(); } /// /// Lowers the window to the bottom of the window stack. /// /// 3 public void Lower() { Interop.Window.Lower(SwigCPtr); if (NDalicPINVOKE.SWIGPendingException.Pending) throw NDalicPINVOKE.SWIGPendingException.Retrieve(); } /// /// Activates the window to the top of the window stack even it is iconified. /// /// 3 public void Activate() { Interop.Window.Activate(SwigCPtr); if (NDalicPINVOKE.SWIGPendingException.Pending) throw NDalicPINVOKE.SWIGPendingException.Retrieve(); } /// /// Gets the default ( root ) layer. /// /// The root layer. /// 3 public Layer GetDefaultLayer() { return this.GetRootLayer(); } /// /// Add a child view to window. /// /// the child should be added to the window. /// 3 public void Add(View view) { Interop.Actor.Add(Layer.getCPtr(GetRootLayer()), View.getCPtr(view)); if (NDalicPINVOKE.SWIGPendingException.Pending) throw NDalicPINVOKE.SWIGPendingException.Retrieve(); this.GetRootLayer().AddViewToLayerList(view); // Maintain the children list in the Layer if (null != view) { view.InternalParent = this.GetRootLayer(); } } /// /// Remove a child view from window. /// /// the child to be removed. /// 3 public void Remove(View view) { Interop.Actor.Remove(Layer.getCPtr(GetRootLayer()), View.getCPtr(view)); this.GetRootLayer().RemoveViewFromLayerList(view); // Maintain the children list in the Layer if (null != view) { view.InternalParent = null; } } /// /// Retrieves the layer at a specified depth. /// /// The layer's depth index. /// The layer found at the given depth. /// 3 public Layer GetLayer(uint depth) { if (depth < LayersChildren?.Count) { Layer ret = LayersChildren?[Convert.ToInt32(depth)]; return ret; } else { return null; } } /// /// Destroy the window immediately. /// [EditorBrowsable(EditorBrowsableState.Never)] public void Destroy() { this.Dispose(); } /// /// Keep rendering for at least the given amount of time. /// /// Time to keep rendering, 0 means render at least one more frame. /// 3 public void KeepRendering(float durationSeconds) { Interop.Stage.KeepRendering(stageCPtr, durationSeconds); if (NDalicPINVOKE.SWIGPendingException.Pending) throw NDalicPINVOKE.SWIGPendingException.Retrieve(); } /// /// Grabs the key specified by a key for a window only when a window is the topmost window.
/// This function can be used for following example scenarios:
/// - Mobile - Using volume up or down as zoom up or down in camera apps.
///
/// The key code to grab. /// True if the grab succeeds. /// 3 public bool GrabKeyTopmost(int DaliKey) { bool ret = Interop.Window.GrabKeyTopmost(HandleRef.ToIntPtr(this.SwigCPtr), DaliKey); if (NDalicPINVOKE.SWIGPendingException.Pending) throw NDalicPINVOKE.SWIGPendingException.Retrieve(); return ret; } /// /// Ungrabs the key specified by a key for the window.
/// Note: If this function is called between key down and up events of a grabbed key, an application doesn't receive the key up event.
///
/// The key code to ungrab. /// True if the ungrab succeeds. /// 3 public bool UngrabKeyTopmost(int DaliKey) { bool ret = Interop.Window.UngrabKeyTopmost(HandleRef.ToIntPtr(this.SwigCPtr), DaliKey); if (NDalicPINVOKE.SWIGPendingException.Pending) throw NDalicPINVOKE.SWIGPendingException.Retrieve(); return ret; } /// /// Grabs the key specified by a key for a window in a GrabMode.
/// Details: This function can be used for following example scenarios:
/// - TV - A user might want to change the volume or channel of the background TV contents while focusing on the foregrund app.
/// - Mobile - When a user presses the Home key, the homescreen appears regardless of the current foreground app.
/// - Mobile - Using the volume up or down as zoom up or down in camera apps.
///
/// The key code to grab. /// The grab mode for the key. /// True if the grab succeeds. /// 3 public bool GrabKey(int DaliKey, KeyGrabMode GrabMode) { bool ret = Interop.Window.GrabKey(HandleRef.ToIntPtr(this.SwigCPtr), DaliKey, (int)GrabMode); if (NDalicPINVOKE.SWIGPendingException.Pending) throw NDalicPINVOKE.SWIGPendingException.Retrieve(); return ret; } /// /// Ungrabs the key specified by a key for a window.
/// Note: If this function is called between key down and up events of a grabbed key, an application doesn't receive the key up event.
///
/// The key code to ungrab. /// True if the ungrab succeeds. /// 3 public bool UngrabKey(int DaliKey) { bool ret = Interop.Window.UngrabKey(HandleRef.ToIntPtr(this.SwigCPtr), DaliKey); if (NDalicPINVOKE.SWIGPendingException.Pending) throw NDalicPINVOKE.SWIGPendingException.Retrieve(); return ret; } /// /// Sets the keyboard repeat information. /// /// The key repeat rate value in seconds. /// The key repeat delay value in seconds. /// True if setting the keyboard repeat succeeds. /// 5 public bool SetKeyboardRepeatInfo(float rate, float delay) { bool ret = Interop.Window.SetKeyboardRepeatInfo(rate, delay); if (NDalicPINVOKE.SWIGPendingException.Pending) throw NDalicPINVOKE.SWIGPendingException.Retrieve(); return ret; } /// /// Gets the keyboard repeat information. /// /// The key repeat rate value in seconds. /// The key repeat delay value in seconds. /// True if setting the keyboard repeat succeeds. /// 5 public bool GetKeyboardRepeatInfo(out float rate, out float delay) { bool ret = Interop.Window.GetKeyboardRepeatInfo(out rate, out delay); if (NDalicPINVOKE.SWIGPendingException.Pending) throw NDalicPINVOKE.SWIGPendingException.Retrieve(); return ret; } /// /// Adds a layer to the stage. /// /// Layer to add. /// Thrown when layer is null. /// 3 public void AddLayer(Layer layer) { Add(layer); } /// /// Removes a layer from the stage. /// /// Layer to remove. /// Thrown when layer is null. /// 3 public void RemoveLayer(Layer layer) { Remove(layer); } /// /// Feeds a key event into the window. /// /// The key event to feed. /// 5 public void FeedKey(Key keyEvent) { Interop.Window.FeedKeyEvent(Key.getCPtr(keyEvent)); if (NDalicPINVOKE.SWIGPendingException.Pending) throw NDalicPINVOKE.SWIGPendingException.Retrieve(); } /// /// Allows at least one more render, even when paused. /// The window should be shown, not minimised. /// /// 4 public void RenderOnce() { Interop.Window.RenderOnce(SwigCPtr); if (NDalicPINVOKE.SWIGPendingException.Pending) throw NDalicPINVOKE.SWIGPendingException.Retrieve(); } /// /// Sets whether the window is transparent or not. /// /// Whether the window is transparent or not. /// 5 public void SetTransparency(bool transparent) { Interop.Window.SetTransparency(SwigCPtr, transparent); if (NDalicPINVOKE.SWIGPendingException.Pending) throw NDalicPINVOKE.SWIGPendingException.Retrieve(); // Setting transparency of the window should request a relayout of the tree in the case the window changes from fully transparent. } /// /// Sets parent window of the window. /// After setting that, these windows do together when raise-up, lower and iconified/deiconified. /// Initially, the window is located on top of the parent. The window can go below parent by calling Lower(). /// If parent's window stack is changed by calling Raise() or Lower(), child windows are located on top of the parent again. /// /// The parent window. /// 6 /// http://tizen.org/feature/opengles.surfaceless_context /// The required feature is not supported. public void SetParent(Window parent) { if (IsSupportedMultiWindow() == false) { NUILog.Error("This device does not support surfaceless_context. So Window cannot be created. "); } Interop.Window.SetParent(SwigCPtr, Window.getCPtr(parent)); if (NDalicPINVOKE.SWIGPendingException.Pending) throw NDalicPINVOKE.SWIGPendingException.Retrieve(); } /// /// Unsets parent window of the window. /// After unsetting, the window is disconnected his parent window. /// /// 6 /// http://tizen.org/feature/opengles.surfaceless_context /// The required feature is not supported. public void Unparent() { if (IsSupportedMultiWindow() == false) { NUILog.Error("Fail to create window. because this device does not support opengles.surfaceless_context."); } Interop.Window.Unparent(SwigCPtr); if (NDalicPINVOKE.SWIGPendingException.Pending) throw NDalicPINVOKE.SWIGPendingException.Retrieve(); } /// /// Gets parent window of the window. /// /// The parent window of the window. /// 6 /// http://tizen.org/feature/opengles.surfaceless_context /// The required feature is not supported. public Window GetParent() { if (IsSupportedMultiWindow() == false) { NUILog.Error("This device does not support surfaceless_context. So Window cannot be created. "); } Window ret = Registry.GetManagedBaseHandleFromNativePtr(Interop.Window.GetParent(SwigCPtr)) as Window; if (NDalicPINVOKE.SWIGPendingException.Pending) throw NDalicPINVOKE.SWIGPendingException.Retrieve(); return ret; } /// This will be public opened in tizen_next after ACR done. Before ACR, need to be hidden as inhouse API. [EditorBrowsable(EditorBrowsableState.Never)] public void ObjectDump() { Layer rootLayer = GetRootLayer(); foreach (View view in rootLayer.Children) { view.ObjectDump(); } } internal static global::System.Runtime.InteropServices.HandleRef getCPtr(Window obj) { return (obj == null) ? new global::System.Runtime.InteropServices.HandleRef(null, global::System.IntPtr.Zero) : obj.SwigCPtr; } internal static bool IsInstalled() { bool ret = Interop.Stage.IsInstalled(); if (NDalicPINVOKE.SWIGPendingException.Pending) throw NDalicPINVOKE.SWIGPendingException.Retrieve(); return ret; } /// /// Adds an orientation to the list of available orientations. /// /// The available orientation to add /// 6 public void AddAvailableOrientation(Window.WindowOrientation orientation) { Interop.Window.AddAvailableOrientation(SwigCPtr, (int)orientation); if (NDalicPINVOKE.SWIGPendingException.Pending) throw NDalicPINVOKE.SWIGPendingException.Retrieve(); } /// /// Removes an orientation from the list of available orientations. /// /// The available orientation to remove. /// 6 public void RemoveAvailableOrientation(Window.WindowOrientation orientation) { Interop.Window.RemoveAvailableOrientation(SwigCPtr, (int)orientation); if (NDalicPINVOKE.SWIGPendingException.Pending) throw NDalicPINVOKE.SWIGPendingException.Retrieve(); } /// /// Sets a preferred orientation. /// /// The preferred orientation. /// 6 public void SetPreferredOrientation(Window.WindowOrientation orientation) { Interop.Window.SetPreferredOrientation(SwigCPtr, (int)orientation); if (NDalicPINVOKE.SWIGPendingException.Pending) throw NDalicPINVOKE.SWIGPendingException.Retrieve(); } /// /// Gets the preferred orientation. /// /// 6 /// The preferred orientation if previously set, or none. public Window.WindowOrientation GetPreferredOrientation() { Window.WindowOrientation ret = (Window.WindowOrientation)Interop.Window.GetPreferredOrientation(SwigCPtr); if (NDalicPINVOKE.SWIGPendingException.Pending) throw NDalicPINVOKE.SWIGPendingException.Retrieve(); return ret; } /// /// Gets current orientation of the window. /// /// 6 /// The current window orientation if previously set, or none. [EditorBrowsable(EditorBrowsableState.Never)] public Window.WindowOrientation GetCurrentOrientation() { Window.WindowOrientation ret = (Window.WindowOrientation)Interop.Window.GetCurrentOrientation(SwigCPtr); if (NDalicPINVOKE.SWIGPendingException.Pending) throw NDalicPINVOKE.SWIGPendingException.Retrieve(); return ret; } /// /// Sets available orientations of the window. /// This API is for setting several orientations one time. /// /// The list of orientations. /// 6 [EditorBrowsable(EditorBrowsableState.Never)] public void SetAvailableOrientations(List orientations) { PropertyArray orientationArray = new PropertyArray(); if (null != orientations) { for (int i = 0; i < orientations.Count; i++) { PropertyValue value = new PropertyValue((int)orientations[i]); orientationArray.PushBack(value); } } Interop.Window.SetAvailableOrientations(SwigCPtr, PropertyArray.getCPtr(orientationArray)); for (uint i = 0; i < orientationArray.Count(); i++) { orientationArray[i].Dispose(); } orientationArray.Dispose(); if (NDalicPINVOKE.SWIGPendingException.Pending) throw NDalicPINVOKE.SWIGPendingException.Retrieve(); } /// /// Get native window ID /// /// native window ID [EditorBrowsable(EditorBrowsableState.Never)] public int GetNativeId() { int ret = Interop.Window.GetNativeId(SwigCPtr); if (NDalicPINVOKE.SWIGPendingException.Pending) throw NDalicPINVOKE.SWIGPendingException.Retrieve(); return ret; } internal Any GetNativeHandle() { Any ret = new Any(Interop.WindowInternal.WindowGetNativeHandle(SwigCPtr), true); if (NDalicPINVOKE.SWIGPendingException.Pending) throw NDalicPINVOKE.SWIGPendingException.Retrieve(); return ret; } internal void Add(Layer layer) { if (null == layer) { throw new ArgumentNullException(nameof(layer)); } Interop.Window.Add(SwigCPtr, Layer.getCPtr(layer)); if (NDalicPINVOKE.SWIGPendingException.Pending) throw NDalicPINVOKE.SWIGPendingException.Retrieve(); LayersChildren?.Add(layer); layer.SetWindow(this); } internal void Remove(Layer layer) { if (null == layer) { throw new ArgumentNullException(nameof(layer)); } Interop.Window.Remove(SwigCPtr, Layer.getCPtr(layer)); if (NDalicPINVOKE.SWIGPendingException.Pending) throw NDalicPINVOKE.SWIGPendingException.Retrieve(); LayersChildren?.Remove(layer); layer.SetWindow(null); } internal Vector2 GetSize() { var val = new Uint16Pair(Interop.Window.GetSize(SwigCPtr), false); Vector2 ret = new Vector2(val.GetWidth(), val.GetHeight()); val.Dispose(); if (NDalicPINVOKE.SWIGPendingException.Pending) throw NDalicPINVOKE.SWIGPendingException.Retrieve(); return ret; } internal RenderTaskList GetRenderTaskList() { RenderTaskList ret = new RenderTaskList(Interop.Stage.GetRenderTaskList(stageCPtr), true); if (NDalicPINVOKE.SWIGPendingException.Pending) throw NDalicPINVOKE.SWIGPendingException.Retrieve(); return ret; } /// /// Queries the number of on-window layers. /// /// The number of layers. /// Note that a default layer is always provided (count >= 1). internal uint GetLayerCount() { if (LayersChildren == null || LayersChildren.Count < 0) return 0; return (uint)LayersChildren.Count; } internal Layer GetRootLayer() { // Window.IsInstalled() is actually true only when called from event thread and // Core has been initialized, not when Stage is ready. if (_rootLayer == null && Window.IsInstalled()) { _rootLayer = new Layer(Interop.Window.GetRootLayer(SwigCPtr), true); if (NDalicPINVOKE.SWIGPendingException.Pending) throw NDalicPINVOKE.SWIGPendingException.Retrieve(); LayersChildren?.Add(_rootLayer); _rootLayer.SetWindow(this); } return _rootLayer; } internal void SetBackgroundColor(Vector4 color) { Interop.Window.SetBackgroundColor(SwigCPtr, Vector4.getCPtr(color)); if (NDalicPINVOKE.SWIGPendingException.Pending) throw NDalicPINVOKE.SWIGPendingException.Retrieve(); } internal Vector4 GetBackgroundColor() { Vector4 ret = new Vector4(Interop.Window.GetBackgroundColor(SwigCPtr), true); if (NDalicPINVOKE.SWIGPendingException.Pending) throw NDalicPINVOKE.SWIGPendingException.Retrieve(); return ret; } internal Vector2 GetDpi() { Vector2 ret = new Vector2(Interop.Stage.GetDpi(stageCPtr), true); if (NDalicPINVOKE.SWIGPendingException.Pending) throw NDalicPINVOKE.SWIGPendingException.Retrieve(); return ret; } internal ObjectRegistry GetObjectRegistry() { ObjectRegistry ret = new ObjectRegistry(Interop.Stage.GetObjectRegistry(stageCPtr), true); if (NDalicPINVOKE.SWIGPendingException.Pending) throw NDalicPINVOKE.SWIGPendingException.Retrieve(); return ret; } internal void SetRenderingBehavior(RenderingBehaviorType renderingBehavior) { Interop.Stage.SetRenderingBehavior(stageCPtr, (int)renderingBehavior); if (NDalicPINVOKE.SWIGPendingException.Pending) throw NDalicPINVOKE.SWIGPendingException.Retrieve(); } internal RenderingBehaviorType GetRenderingBehavior() { RenderingBehaviorType ret = (RenderingBehaviorType)Interop.Stage.GetRenderingBehavior(stageCPtr); if (NDalicPINVOKE.SWIGPendingException.Pending) throw NDalicPINVOKE.SWIGPendingException.Retrieve(); return ret; } internal void SetWindowSize(Size2D size) { if (null == size) { throw new ArgumentNullException(nameof(size)); } var val = new Uint16Pair((uint)size.Width, (uint)size.Height); Interop.Window.SetSize(SwigCPtr, Uint16Pair.getCPtr(val)); val.Dispose(); if (NDalicPINVOKE.SWIGPendingException.Pending) throw NDalicPINVOKE.SWIGPendingException.Retrieve(); // Resetting Window size should request a relayout of the tree. } internal Size2D GetWindowSize() { var val = new Uint16Pair(Interop.Window.GetSize(SwigCPtr), false); Size2D ret = new Size2D(val.GetWidth(), val.GetHeight()); val.Dispose(); if (NDalicPINVOKE.SWIGPendingException.Pending) throw NDalicPINVOKE.SWIGPendingException.Retrieve(); return ret; } internal void SetPosition(Position2D position) { if (null == position) { throw new ArgumentNullException(nameof(position)); } var val = new Uint16Pair((uint)position.X, (uint)position.Y); Interop.Window.SetPosition(SwigCPtr, Uint16Pair.getCPtr(val)); val.Dispose(); if (NDalicPINVOKE.SWIGPendingException.Pending) throw NDalicPINVOKE.SWIGPendingException.Retrieve(); // Setting Position of the window should request a relayout of the tree. } internal Position2D GetPosition() { var val = new Uint16Pair(Interop.Window.GetPosition(SwigCPtr), true); Position2D ret = new Position2D(val.GetX(), val.GetY()); val.Dispose(); if (NDalicPINVOKE.SWIGPendingException.Pending) throw NDalicPINVOKE.SWIGPendingException.Retrieve(); return ret; } internal void SetPositionSize(Rectangle positionSize) { Interop.Window.SetPositionSize(SwigCPtr, Rectangle.getCPtr(positionSize)); if (NDalicPINVOKE.SWIGPendingException.Pending) throw NDalicPINVOKE.SWIGPendingException.Retrieve(); // Setting Position of the window should request a relayout of the tree. } /// /// Add FrameUpdateCallback /// [EditorBrowsable(EditorBrowsableState.Never)] public void AddFrameUpdateCallback(FrameUpdateCallbackInterface frameUpdateCallback) { frameUpdateCallback?.AddFrameUpdateCallback(stageCPtr, Layer.getCPtr(GetRootLayer())); } /// /// Remove FrameUpdateCallback /// [EditorBrowsable(EditorBrowsableState.Never)] public void RemoveFrameUpdateCallback(FrameUpdateCallbackInterface frameUpdateCallback) { frameUpdateCallback?.RemoveFrameUpdateCallback(stageCPtr); } /// /// Dispose for Window /// [EditorBrowsable(EditorBrowsableState.Never)] protected override void Dispose(DisposeTypes type) { if (disposed) { return; } if (type == DisposeTypes.Explicit) { //Called by User //Release your own managed resources here. //You should release all of your own disposable objects here. if (_rootLayer != null) { _rootLayer.Dispose(); } localController?.Dispose(); foreach (var layer in _childLayers) { if (layer != null) { layer.Dispose(); } } _childLayers.Clear(); } this.DisconnectNativeSignals(); base.Dispose(type); } /// This will not be public opened. [EditorBrowsable(EditorBrowsableState.Never)] protected override void ReleaseSwigCPtr(System.Runtime.InteropServices.HandleRef swigCPtr) { Interop.Window.DeleteWindow(swigCPtr); } private static Dictionary frameCallbackList = new Dictionary(); private static readonly object locker = new object(); private static int key = 0; private static FrameCallbackType internalHookFrameCallback = OnInternalHookFrameCallback; private struct internalHookCallbackType { public FrameCallbackType userCallback; public int frameId; } private static void OnInternalHookFrameCallback(int id) { lock (locker) { if (frameCallbackList.ContainsKey(id)) { if (frameCallbackList[id].userCallback != null) { frameCallbackList[id].userCallback.Invoke(frameCallbackList[id].frameId); frameCallbackList.Remove(id); } else { NUILog.Error($"found userCallback is NULL"); frameCallbackList.Remove(id); } } } } private int AddInterHookCallback(FrameCallbackType callback, int frameId) { if (null == callback) { throw new ArgumentNullException(nameof(callback), "FrameCallbackType should not be null"); } var assignedKey = 0; lock (locker) { key++; assignedKey = key; frameCallbackList.Add(assignedKey, new internalHookCallbackType() { userCallback = callback, frameId = frameId, }); } return assignedKey; } /// /// Type of callback which is called when the frame rendering is done by graphics driver or when the frame is displayed on display. /// /// The Id to specify the frame. It will be passed when the callback is called. [EditorBrowsable(EditorBrowsableState.Never)] public delegate void FrameCallbackType(int frameId); /// /// Adds a callback that is called when the frame rendering is done by the graphics driver. /// A callback of the following type may be used: /// /// void MyFunction( int frameId ) /// /// This callback will be deleted once it is called. /// /// Ownership of the callback is passed onto this class /// /// /// The function to call /// The Id to specify the frame. It will be passed when the callback is called. /// This exception can occur by the callback is null. [EditorBrowsable(EditorBrowsableState.Never)] public void AddFrameRenderedCallback(FrameCallbackType callback, int frameId) { var assignedKey = AddInterHookCallback(callback, frameId); Interop.WindowInternal.AddFrameRenderedCallback(SwigCPtr, new HandleRef(this, Marshal.GetFunctionPointerForDelegate(internalHookFrameCallback)), assignedKey); if (NDalicPINVOKE.SWIGPendingException.Pending) throw NDalicPINVOKE.SWIGPendingException.Retrieve(); } /// /// Adds a callback that is called when the frame is displayed on the display. /// A callback of the following type may be used: /// /// void MyFunction( int frameId ) /// /// This callback will be deleted once it is called. /// /// Ownership of the callback is passed onto this class /// /// /// The function to call /// The Id to specify the frame. It will be passed when the callback is called. /// This exception can occur by the callback is null. [EditorBrowsable(EditorBrowsableState.Never)] public void AddFramePresentedCallback(FrameCallbackType callback, int frameId) { var assignedKey = AddInterHookCallback(callback, frameId); Interop.WindowInternal.AddFramePresentedCallback(SwigCPtr, new HandleRef(this, Marshal.GetFunctionPointerForDelegate(internalHookFrameCallback)), assignedKey); if (NDalicPINVOKE.SWIGPendingException.Pending) throw NDalicPINVOKE.SWIGPendingException.Retrieve(); } } }