/* * Copyright (c) 2018 Samsung Electronics Co., Ltd All Rights Reserved * * 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. */ using System; using System.Collections.Generic; using System.ComponentModel; namespace ElmSharp { /// /// Enumeration for the display rotation of window. /// /// preview [Flags] public enum DisplayRotation { /// /// Rotation value of the window is 0 degree. /// Degree_0 = 1, /// /// Rotation value of the window is 90 degrees. /// Degree_90 = 2, /// /// Rotation value of the window is 180 degrees. /// Degree_180 = 4, /// /// Rotation value of the window is 270 degrees. /// Degree_270 = 8 }; /// /// Enumeration for the indicator opacity. /// /// preview public enum StatusBarMode { /// /// Opacifies the status bar. /// Opaque = 1, /// /// Be translucent the status bar. /// /// /// Not supported. /// Translucent = 2, /// /// Transparentizes the status bar. /// Transparent = 3, } /// /// Enumeration for the keygrab modes of the window. /// /// preview [EditorBrowsable(EditorBrowsableState.Never)] public enum KeyGrabMode { /// /// Unknown keygrab mode. /// Shared = 256, /// /// Getting the grabbed-key together with the other client windows. /// Topmost = 512, /// /// Getting the grabbed-key only when the window is top of the stack. /// Exclusive = 1024, /// /// Getting the grabbed-key exclusively regardless of the window's position. /// OverrideExclusive = 2048, } /// /// Enumeration for the indicator mode. /// /// preview public enum IndicatorMode { /// /// Unknown indicator state. /// Unknown = 0, /// /// Hides the indicator. /// Hide, /// /// Shows the indicator. /// Show, }; /// /// Enumeration for the keyboard mode. /// /// preview public enum KeyboardMode { /// /// Unknown keyboard state. /// Unknown, /// /// Request to deactivate the keyboard. /// Off, /// /// Enable keyboard with default layout. /// On, /// /// Alpha (a-z) keyboard layout. /// Alpha, /// /// Numeric keyboard layout. /// Numeric, /// /// Pin keyboard layout. /// Pin, /// /// Phone keyboard layout. /// PhoneNumber, /// /// Hexadecimal numeric keyboard layout. /// Hex, /// /// Full (QWERTY) keyboard layout. /// QWERTY, /// /// Password keyboard layout. /// Password, /// /// IP keyboard layout. /// IP, /// /// Host keyboard layout. /// Host, /// /// File keyboard layout. /// File, /// /// URL keyboard layout. /// URL, /// /// Keypad layout. /// Keypad, /// /// J2ME keyboard layout. /// J2ME, }; /// /// Enumeration for the window type. /// /// preview public enum WindowType { /// /// Unknown. /// Unknown, /// /// A normal window. Indicates a normal, top-level window. Almost every window will be created with this type. /// Basic, /// /// Used for simple dialog windows. /// Dialog, /// /// For special desktop windows, like a background window holding desktop icons. /// Desktop, /// /// The window is used as a dock or panel. Usually would be kept on top of any other window by the Window Manager. /// Dock, /// /// The window is used to hold a floating toolbar, or similar. /// Toolbar, /// /// Similar to Toolbar. /// Menu, /// /// A persistent utility window, like a toolbox or palette. /// Utility, /// /// Splash window for a starting up application. /// Splash, /// /// The window is a dropdown menu, as when an entry in a menubar is clicked. /// DropdownMenu, /// /// Like DropdownMenu, but for the menu triggered by right-clicking an object. /// PopupMenu, /// /// The window is a tooltip. A short piece of explanatory text that typically appears after the mouse cursor hovers over an object for a while. /// Tooltip, /// /// A notification window, like a warning about battery life or a new e-mail received. /// Notification, /// /// A window holding the contents of a combo box. /// Combo, /// /// Used to indicate the window as a representation of an object being dragged across different windows, or even applications. /// DragAndDrop, /// /// The window is rendered onto an image buffer. No actual window is created for this type, instead the window and all of its contents will be rendered to an image buffer. /// This allows to have children windows inside a parent one just like any other object would be, and do other things like applying Evas_Map effects to it. /// InlinedImage, /// /// The window is rendered onto an image buffer and can be shown other process's plug image object. /// No actual window is created for this type, instead the window and all of its contents will be rendered to an image buffer and can be shown other process's plug image object. /// SocketImage, /// /// This window was created using a pre-existing canvas. The window widget can be deleted, but the canvas must be managed externally. /// Fake, }; /// /// Enumeration of notification window's priority level. /// /// preview public enum NotificationLevel { /// /// No (reset) notification level. This value makes the window place in normal layer. /// None = -1, /// /// Default notification level. /// Default = 10, /// /// Higher notification level than default. /// Medium = 20, /// /// Higher notification level than medium. /// High = 30, /// /// The highest notification level. /// Top = 40, }; /// /// Enumeration of screen mode. /// /// preview public enum ScreenMode { /// /// The mode which turns the screen off after a timeout. /// Default, /// /// The mode which keeps the screen turned on. /// AlwaysOn, } /// /// The Window is a container that contains the graphical user interface of a program. /// /// preview public class Window : Widget { SmartEvent _deleteRequest; SmartEvent _rotationChanged; HashSet _referenceHolder = new HashSet(); /// /// Creates and initializes a new instance of the Window class. /// /// Window name. /// preview public Window(string name) : this(null, name) { } /// /// Creates and initializes a new instance of the Window class. /// /// /// Parent widget which this window is created on. /// /// /// Window name. /// /// /// Window constructor.show window indicator, set callback /// when closing the window in any way outside the program control, /// and set callback when window rotation is changed. /// /// preview public Window(Window parent, string name) : this(parent, name, WindowType.Basic) { } /// /// Creates and initializes a new instance of the Window class. /// /// /// Parent widget which this window is created on. /// /// /// Window name. /// /// /// Window type. /// /// /// Window constructor.show window indicator, set callback /// when closing the window in any way outside the program control, /// and set callback when window rotation is changed. /// /// preview public Window(Window parent, string name, WindowType type) { Name = name; Type = type; Realize(parent); IndicatorMode = IndicatorMode.Show; _deleteRequest = new SmartEvent(this, "delete,request"); _rotationChanged = new SmartEvent(this, "wm,rotation,changed"); _deleteRequest.On += (s, e) => CloseRequested?.Invoke(this, EventArgs.Empty); _rotationChanged.On += (s, e) => RotationChanged?.Invoke(this, EventArgs.Empty); } /// /// Creates and initializes a new instance of the Window class. /// /// preview protected Window() { } /// /// CloseRequested will be triggered when window is closed. /// /// preview public event EventHandler CloseRequested; /// /// RotationChanged will be triggered when window is rotated. /// /// preview public event EventHandler RotationChanged; /// /// Sets or gets the window name. /// /// preview public string Name { get; set; } /// /// Gets the window type. /// /// preview public WindowType Type { get; } = WindowType.Basic; /// /// Gets the window size with Size value(w,h) /// /// preview public Size ScreenSize { get { int x, y, w, h; Interop.Elementary.elm_win_screen_size_get(Handle, out x, out y, out w, out h); return new Size(w, h); } } /// /// Gets the screen dpi for the screen that the window is on. /// /// preview public Point ScreenDpi { get { Point point = default(Point); Interop.Elementary.elm_win_screen_dpi_get(Handle, out point.X, out point.Y); return point; } } /// /// Gets the rotation of the window. The rotation of the window in degrees (0-360). /// /// preview public int Rotation { get { return Interop.Elementary.elm_win_rotation_get(Handle); } } /// /// Gets whether the window manager supports window rotation or not. /// /// preview public bool IsRotationSupported { get { return Interop.Elementary.elm_win_wm_rotation_supported_get(Handle); } } /// /// Sets or gets the available rotation degree. /// /// preview [Obsolete("Sorry, it's error typo of AvailableRotations, please use AvailableRotations")] public DisplayRotation AavailableRotations { get; set; } /// /// Sets or gets the available rotation degree. /// /// preview public DisplayRotation AvailableRotations { get { int[] rotations; Interop.Elementary.elm_win_wm_rotation_available_rotations_get(Handle, out rotations); if (rotations == null) { return 0; } return ConvertToDisplayRotation(rotations); } set { Interop.Elementary.elm_win_wm_rotation_available_rotations_set(Handle, ConvertDegreeArray(value)); } } /// /// Sets or gets whether the auto deletion function is enabled. /// /// /// If you enable auto deletion, the window is automatically destroyed after the signal is emitted. /// If auto deletion is disabled, the window is not destroyed and the program has to handle it. /// /// preview public bool AutoDeletion { get { return Interop.Elementary.elm_win_autodel_get(Handle); } set { Interop.Elementary.elm_win_autodel_set(Handle, value); } } /// /// Sets or gets the alpha channel state of the window. /// /// /// true if the window alpha channel is enabled, false otherwise. /// If alpha is true, the alpha channel of the canvas will be enabled possibly making parts of the window completely or partially transparent. /// /// preview public bool Alpha { get { return Interop.Elementary.elm_win_alpha_get(Handle); } set { Interop.Elementary.elm_win_alpha_set(Handle, value); } } /// /// Sets or gets the role of the window. /// /// /// The Role will be invalid if a new role is set or if the window is destroyed. /// /// preview public string Role { get { return Interop.Elementary.elm_win_role_get(Handle); } set { Interop.Elementary.elm_win_role_set(Handle, value); } } /// /// Sets or gets the mode of the status bar. /// /// preview public StatusBarMode StatusBarMode { get { return (StatusBarMode)Interop.Elementary.elm_win_indicator_opacity_get(Handle); } set { Interop.Elementary.elm_win_indicator_opacity_set(Handle, (int)value); } } /// /// Sets or gets the iconified state of the window. /// /// preview [EditorBrowsable(EditorBrowsableState.Never)] public bool Iconified { get { return Interop.Elementary.elm_win_iconified_get(RealHandle); } set { Interop.Elementary.elm_win_iconified_set(RealHandle, value); } } /// /// Gets or sets the window's indicator mode. /// /// The indicator mode. /// preview public IndicatorMode IndicatorMode { get { return Interop.Elementary.elm_win_indicator_mode_get(RealHandle); } set { Interop.Elementary.elm_win_indicator_mode_set(RealHandle, value); } } /// /// Gets or sets the aspect ratio of the window. /// /// preview public double Aspect { get { return Interop.Elementary.elm_win_aspect_get(RealHandle); } set { Interop.Elementary.elm_win_aspect_set(RealHandle, value); } } /// /// Window's autohide state. /// /// preview public bool AutoHide { get { return Interop.Elementary.elm_win_autohide_get(RealHandle); } set { Interop.Elementary.elm_win_autohide_set(RealHandle, value); } } /// /// Gets the borderless state of the window. /// This function requests the Window Manager to not draw any decoration around the window. /// /// preview public bool Borderless { get { return Interop.Elementary.elm_win_borderless_get(RealHandle); } set { Interop.Elementary.elm_win_borderless_set(RealHandle, value); } } /// /// Gets or sets the demand attention state of the window. /// /// preview public bool DemandAttention { get { return Interop.Elementary.elm_win_demand_attention_get(RealHandle); } set { Interop.Elementary.elm_win_demand_attention_set(RealHandle, value); } } /// /// Gets or sets the floating mode of the window. /// /// preview public bool FloatingMode { get { return Interop.Elementary.elm_win_floating_mode_get(RealHandle); } set { Interop.Elementary.elm_win_floating_mode_set(RealHandle, value); } } /// /// Gets or sets the animate status for the focus highlight for this window. /// This function will enable or disable the animation of focus highlight only for the given window, regardless of the global setting for it. /// /// preview public bool FocusHighlightAnimation { get { return Interop.Elementary.elm_win_focus_highlight_animate_get(RealHandle); } set { Interop.Elementary.elm_win_focus_highlight_animate_set(RealHandle, value); } } /// /// Gets or sets the enabled status for the focus highlight in the window. /// This function will enable or disable the focus highlight only for the given window, regardless of the global setting for it. /// /// preview public bool FocusHighlightEnabled { get { return Interop.Elementary.elm_win_focus_highlight_enabled_get(RealHandle); } set { Interop.Elementary.elm_win_focus_highlight_enabled_set(RealHandle, value); } } /// /// Gets or sets the style for the focus highlight on this window. /// Sets the style to use for theming the highlight of focused objects on the given window. If style is NULL, the default will be used. /// /// preview public string FocusHighlightStyle { get { return Interop.Elementary.elm_win_focus_highlight_style_get(RealHandle); } set { Interop.Elementary.elm_win_focus_highlight_style_set(RealHandle, value); } } /// /// Gets the keyboard mode of the window. /// /// preview public KeyboardMode KeyboardMode { get { return (KeyboardMode)Interop.Elementary.elm_win_keyboard_mode_get(RealHandle); } set { Interop.Elementary.elm_win_keyboard_mode_set(RealHandle, (int)value); } } /// /// Gets or sets the layer of the window. /// What this means exactly will depend on the underlying engine used. /// In the case of X11 backed engines, the value in layer has the following meanings: /// less than 3 means that the window will be placed below all others, /// more than 5 means that the window will be placed above all others, /// and anything else means that the window will be placed in the default layer. /// /// preview public override int Layer { get { return Interop.Elementary.elm_win_layer_get(RealHandle); } set { Interop.Elementary.elm_win_layer_set(RealHandle, value); } } /// /// Gets or sets the modal state of the window. /// /// preview public bool Modal { get { return Interop.Elementary.elm_win_modal_get(RealHandle); } set { Interop.Elementary.elm_win_modal_set(RealHandle, value); } } /// /// Gets or sets the noblank property of the window. /// This is a way to request the display on which the window is shown is not blank, screensave, or otherwise hidden or obscure. It is intended for use such as media playback on a television where a user may not want to be interrupted by an idle screen. /// The noblank property may have no effect if the window is iconified/minimized or hidden. /// /// preview public bool NoBlank { get { return Interop.Elementary.elm_win_noblank_get(RealHandle); } set { Interop.Elementary.elm_win_noblank_set(RealHandle, value); } } /// /// Gets the profile of the window. /// /// preview public string Profile { get { return Interop.Elementary.elm_win_profile_get(RealHandle); } set { Interop.Elementary.elm_win_profile_set(RealHandle, value); } } /// /// Gets the constraints on the maximum width and height of the window relative to the width and height of its screen. /// When this function returns true, object will never resize larger than the screen. /// /// preview public bool ScreenConstrain { get { return Interop.Elementary.elm_win_screen_constrain_get(RealHandle); } set { Interop.Elementary.elm_win_screen_constrain_set(RealHandle, value); } } /// /// Gets or sets the base size of the window. /// /// preview public Size BaseSize { get { int w, h; Interop.Elementary.elm_win_size_base_get(RealHandle, out w, out h); return new Size(w, h); } set { Interop.Elementary.elm_win_size_base_set(RealHandle, value.Width, value.Height); } } /// /// Gets or sets the step size of the window. /// /// preview public Size StepSize { get { int w, h; Interop.Elementary.elm_win_size_step_get(RealHandle, out w, out h); return new Size(w, h); } set { Interop.Elementary.elm_win_size_step_set(RealHandle, value.Width, value.Height); } } /// /// Gets the screen position X of a window. /// /// preview public int ScreenPositionX { get { int x, y; Interop.Elementary.elm_win_screen_position_get(Handle, out x, out y); return x; } } /// /// Gets the screen position Y of a window. /// /// preview public int ScreenPositionY { get { int x, y; Interop.Elementary.elm_win_screen_position_get(Handle, out x, out y); return y; } } /// /// Gets or sets the title of the window. /// /// preview public string Title { get { return Interop.Elementary.elm_win_title_get(Handle); } set { Interop.Elementary.elm_win_title_set(Handle, value); } } /// /// Gets or sets the urgent state of the window. /// /// preview public bool Urgent { get { return Interop.Elementary.elm_win_urgent_get(Handle); } set { Interop.Elementary.elm_win_urgent_set(Handle, value); } } /// /// Gets or sets the withdrawn state of the window. /// /// preview public bool Withdrawn { get { return Interop.Elementary.elm_win_withdrawn_get(Handle); } set { Interop.Elementary.elm_win_withdrawn_set(Handle, value); } } /// /// Gets or sets the priority level for the specified notification window. /// /// /// http://tizen.org/privilege/window.priority.set /// /// /// /// This can be used for a notification type window only. /// /// preview public NotificationLevel NotificationLevel { get { int level; Interop.Eutil.efl_util_get_notification_window_level(Handle, out level); return (NotificationLevel)level; } set { Interop.Eutil.efl_util_set_notification_window_level(Handle, (int)value); } } /// /// Gets or sets the window's screen mode. /// This API is useful when the application need to keep the display turned on. /// If the application set the mode to ScreenMode.AlwaysOn to its window and the window is shown wholly or partially, /// the window manager requests the display system to keep the display on as long as the window is shown. /// If the window is no longer shown, then the window manger request the display system to go back to normal operation. /// Default screen mode of window is ScreenMode.Default. /// /// /// http://tizen.org/privilege/display /// /// /// This needs the privilege. If the application which is not get the privilege use this API, the window manager generates the permission deny error. /// /// preview public ScreenMode ScreenMode { get { int mode; Interop.Eutil.efl_util_get_window_screen_mode(Handle, out mode); return (ScreenMode)mode; } set { Interop.Eutil.efl_util_set_window_screen_mode(Handle, (int)value); } } /// /// Gets or sets the user's preferred brightness of the specified window. /// This is useful when the application need to change the brightness of the screen when it is appeared on the screen. /// If the application sets the brightness 0 to 100 to its window and the application window is shown wholly or partially, /// the window manager requests the display system to change the brightness of the screen using user's preferred brightness. /// If the window is no longer shown, then the window manger request the display system to go back to default brightness. /// If the brightness is less than 0, this means to use the default screen brightness. /// /// /// http://tizen.org/privilege/display /// /// /// This needs the privilege. If the application which is not get the privilege use this API, the window manager generates the permission deny error. /// /// preview public int Brightness { get { int brightness; Interop.Eutil.efl_util_get_window_brightness(Handle, out brightness); return brightness; } set { Interop.Eutil.efl_util_set_window_brightness(Handle, value); } } /// /// Creates a socket to provide the service for the Plug widget. /// /// A service name. /// A number (any value, 0 being the common default) to differentiate multiple instances of services with the same name. /// A boolean that if true, specifies to create a system-wide service all users can connect to, otherwise the service is private to the user ID that created the service. /// If true creates successful, otherwise false. /// preview public bool CreateServiceSocket(string name, int number, bool systemWide) { return Interop.Elementary.elm_win_socket_listen(RealHandle, name, number, systemWide); } /// /// Sets the rotation of the window. /// /// The rotation of the window, in degrees (0-360), counter-clockwise. /// Resizes the window's contents so that they fit inside the current window geometry. /// preview public void SetRotation(int degree, bool resize) { if (resize) Interop.Elementary.elm_win_rotation_with_resize_set(RealHandle, degree); else Interop.Elementary.elm_win_rotation_set(RealHandle, degree); } /// /// Sets the alpha window's visual state to opaque state. /// This sets the alpha window's visual state to opaque state. /// If the alpha window sets the visual state to the opaque, /// then the window manager could handle it as the opaque window while calculating visibility. /// This will have no effect when used by a non-alpha window. /// /// preview public void SetOpaqueState() { Interop.Eutil.efl_util_set_window_opaque_state(RealHandle, 1); } /// /// Unsets the alpha window's visual state to opaque state. /// /// preview public void UnsetOpaqueState() { Interop.Eutil.efl_util_set_window_opaque_state(RealHandle, 0); } /// /// Sets the window to be skipped by focus. /// This sets the window to be skipped by normal input. /// This means the Windows Manager will be asked to not focus this window as well as omit it from things like the taskbar, pager etc. /// Call this and enable it on the window BEFORE you show it for the first time, otherwise it may have no effect. /// Use this for windows that have only output information or might only be interacted with by the mouse or fingers, and never for typing input. /// Be careful that this may have side-effects like making the window non-accessible in some cases unless the window is specially handled. Use this with care. /// /// preview public void FocusSkip(bool skip) { Interop.Elementary.elm_win_prop_focus_skip_set(Handle, skip); } /// /// Pulls up the window object. /// Places the window pointed by object at the top of the stack, so that it's not covered by any other window. /// /// preview public void PullUp() { Interop.Elementary.elm_win_raise(Handle); } /// /// Brings down the window object. /// Places the window pointed by object at the bottom of the stack, so that no other window is covered by it. /// /// preview public void BringDown() { Interop.Elementary.elm_win_lower(Handle); } /// /// This function sends a request to the Windows Manager to activate the window. /// If honored by the Windows Manager, the window receives the keyboard focus. /// /// /// This is just a request that the Windows Manager may ignore, so calling this function does not ensure /// in any way that the window is going to be the active one after it. /// /// preview public void Active() { Interop.Elementary.elm_win_activate(Handle); } /// /// Deletes the subobj as a resize object of the window object. /// This function removes the object subobj from the resize objects of the window object. /// It will not delete the object itself, which will be left unmanaged and should be deleted by the developer, manually handled, or set as child of some other container. /// /// Resize object. /// preview public void DeleteResizeObject(EvasObject obj) { Interop.Elementary.elm_win_resize_object_del(Handle, obj); } /// /// Adds an object as a resize object of the window. /// /// /// Setting an object as a resize object of the window means that the object child's size and /// position is controlled by the window directly. That is, the object is resized to match the window size /// and should never be moved or resized manually by the developer. In addition, /// resize objects of the window control the minimum size of it as well as whether it can or cannot be resized by the user. /// /// /// Resize object. /// /// preview public void AddResizeObject(EvasObject obj) { Interop.Elementary.elm_win_resize_object_add(Handle, obj); } /// /// Sets the keygrab value of the window. /// This function grabs the key of the window using grab_mode. /// /// The keyname to grab. /// According to the grabmode, it can grab key differently. /// preview [EditorBrowsable(EditorBrowsableState.Never)] public void WinKeyGrab(string keyname, KeyGrabMode mode) { Interop.Elementary.elm_win_keygrab_set(RealHandle, keyname, 0, 0, 0, mode); } /// /// Unsets the keygrab value of the window. /// This function unsets keygrab value. Ungrab key of the window. /// /// The keyname to grab. /// preview [EditorBrowsable(EditorBrowsableState.Never)] public void WinKeyUngrab(string keyname) { Interop.Elementary.elm_win_keygrab_unset(RealHandle, keyname, 0, 0); } /// /// Sets the keygrab of the window. /// /// The keyname string to set keygrab. /// preview public void KeyGrabEx(string keyname) { Interop.Elementary.eext_win_keygrab_set(RealHandle, keyname); } /// /// Unsets the keygrab of the window. /// /// The keyname string to unset keygrab. /// preview public void KeyUngrabEx(string keyname) { Interop.Elementary.eext_win_keygrab_unset(RealHandle, keyname); } /// /// Creates a widget handle. /// /// Parent EvasObject. /// Handle IntPtr. /// preview protected override IntPtr CreateHandle(EvasObject parent) { Interop.Elementary.elm_config_accel_preference_set("3d"); return Interop.Elementary.elm_win_add(parent != null ? parent.Handle : IntPtr.Zero, Name, (int)Type); } internal void AddChild(EvasObject obj) { _referenceHolder.Add(obj); } internal void RemoveChild(EvasObject obj) { _referenceHolder.Remove(obj); } static int[] ConvertDegreeArray(DisplayRotation value) { List rotations = new List(); if (value.HasFlag(DisplayRotation.Degree_0)) rotations.Add(0); if (value.HasFlag(DisplayRotation.Degree_90)) rotations.Add(90); if (value.HasFlag(DisplayRotation.Degree_180)) rotations.Add(180); if (value.HasFlag(DisplayRotation.Degree_270)) rotations.Add(270); return rotations.ToArray(); } static DisplayRotation ConvertToDisplayRotation(int[] values) { int orientation = 0; foreach (int v in values) { orientation |= (1 << (v / 90)); } return (DisplayRotation)orientation; } } }