{
    "title": "StickyWindows configuration",
    "description": "Schema describing the sticky windows configuration in Glue42 Desktop",
    "type": "object",
    "additionalProperties": false,
    "properties": {
        "qtWindowClassnameRegex": {
            "description": "Regex for detecting Qt windows.",
            "type": "string",
            "default": "Qt.*?QWindow.*?"
        },
        "targetMode": {
            "description": "Property that changes the functional behavior depending on the selected platform.",
            "type": "string",
            "enum": [
                "Glue",
                "Connect",
                "Default"
            ],
            "default": "Connect"
        },
        "identity": {
            "description": "Used for inter-process communication filtering.",
            "type": "string"
        },
        "snapDistance": {
            "description": "Distance in pixels at which windows will snap (stick) together and form a window group. The snap distance value must be in the range of 5 to 20.",
            "type": "integer",
            "default": 20
        },
        "approachingDistance": {
            "description": "Distance in pixels at which the approaching edges of windows will be highlighted. The minimum approaching distance should be three times higher than the snap distance.",
            "type": "integer",
            "default": 50
        },
        "edgeDistance": {
            "description": "Distance in pixels between the edges of snapped windows. The edge distance value must be in the range of 0 to 10.",
            "type": "integer",
            "default": 4
        },
        "reverseAltSnapping": {
            "description": "If set to `true`, snapping windows will be enabled only when the `ALT` key is pressed. If set to `false`, snapping windows will be disabled when the `ALT` key is pressed.",
            "type": "boolean",
            "default": false
        },
        "reverseAltTabDrop": {
            "description": "If set to `true`, dropping windows in tab groups will be enabled only when the `ALT` key is pressed. If set to `false`, dropping windows in tab groups will be disabled when the `ALT` key is pressed.",
            "type": "boolean",
            "default": false
        },
        "reverseAltWorkspaceDrop": {
            "description": "If set to `true`, dropping windows in Workspaces will be enabled only when the `ALT` key is pressed. If set to `false`, dropping windows in Workspaces will be disabled when the `ALT` key is pressed.",
            "type": "boolean",
            "default": false
        },
        "snapToScreenEdges": {
            "description": "If `true`, will enable snapping to the screen edges.",
            "type": "boolean",
            "default": true
        },
        "autoSnap": {
            "description": "If `true`, windows will be snapped automatically at the end of the snapping operation (on mouse up). Windows are snapped to the approaching edges (if any).",
            "type": "boolean",
            "default": true
        },
        "autoCollapse": {
            "description": "If `true`, windows that will go out of the screen when moved or resized will be collapsed automatically.",
            "type": "boolean",
            "default": false
        },
        "autoArrange": {
            "description": "If `true`, the remaining windows in a window group will be rearranged automatically when a window from the group is removed.",
            "type": "boolean",
            "default": false
        },
        "autoAlign": {
            "description": "If `true`, when a window is added to a window group, it will be aligned automatically to the neighboring windows.",
            "type": "boolean",
            "default": true
        },
        "hideGroupCaption": {
            "description": "If `true`, the window group header will be hidden. Valid for all types of apps (native and web).",
            "type": "boolean",
            "default": false
        },
        "groupCaptionHeight": {
            "description": "Initial height in pixels for the window group header. Should match the value defined in the CSS/HTML - if it doesn't, will be matched at runtime.",
            "type": "integer",
            "default": 30
        },
        "groupBorderSize": {
            "description": "Initial size in pixels for the window group border. Should match the value defined in the CSS/HTML - if it doesn't, will be matched at runtime.",
            "type": "integer",
            "default": 0
        },
        "autoRemoveWindows": {
            "description": "If `true`, local windows will be removed automatically when they are destroyed.",
            "type": "boolean",
            "default": false
        },
        "unlockWithLongMousePress": {
            "description": "If `true`, will enable unlocking windows from window groups on a long mouse press.",
            "type": "boolean",
            "default": true
        },
        "unlockTimeout": {
            "description": "Interval in milliseconds to wait before unlocking windows from the window group on a long mouse press.",
            "type": "integer",
            "default": 1000
        },
        "unlockTolerance": {
            "description": "Distance in pixels allowed for the mouse to move from its initial position before unlocking the window from the window group becomes unavailable.",
            "type": "integer",
            "default": 5
        },
        "minimumWindowSize": {
            "description": "Minimum window size (width and height) in pixels which will be used if no minimum width or height is set by the user. If the value is 0 (or less), this setting will be ignored.",
            "type": "integer",
            "default": 0
        },
        "movingGroupsFromTopWindowOnly": {
            "description": "If `true`, moving a window group will be allowed only from the top window and from the window group header.",
            "type": "boolean",
            "default": true
        },
        "enableCrossProcess": {
            "description": "If `true`, will enable communication between different processes that use io.Connect Windows. This is used to allow .NET and Java apps to use io.Connect Windows.",
            "type": "boolean",
            "default": false
        },
        "sizingMode": {
            "description": "Mode for resizing windows within a window group. If set to `\"Proportional\"`, moving an inner border of a window group will resize the windows proportionally, without changing the size of the entire window group. If set to `\"Single\"`, moving an inner border will result in a push/pull resize of the entire group.",
            "type": "string",
            "enum": [
                "Single",
                "Proportional",
                "Default"
            ],
            "default": "Single"
        },
        "groupMaximizedMode": {
            "description": "Defines the behavior of windows with size restrictions that will be violated during resize operations with Windows gestures. If set to `\"Proportional\"`, the proportions of all windows in the group will be preserved relatively to the size of the restricted window. If set to `\"Fill\"`, the group will be resized in a way that all windows unrestricted in size will fill as much space as possible left free by any size-restricted window. Currently, only rectangular groups without holes are supported.",
            "type": "string",
            "enum": [
                "Proportional",
                "Fill",
                "Default"
            ],
            "default": "Proportional"
        },
        "collapseExpandMode": {
            "description": "Defines the behavior of the neighbour windows when a window is collapsed and expanded. If set to `\"Proportional\"` the bottom neighbour will attempt to compensate the height delta and to preserve the overall group height.",
            "type": "string",
            "enum": [
                "Single",
                "Proportional",
                "Default"
            ],
            "default": "Single"
        },
        "hideSwimlaneFrameCaption": {
            "description": "If `true`, will hide the Swimlane frame window header.",
            "type": "boolean",
            "default": false
        },
        "enableSwimlaneFrameDropShadow": {
            "description": "If `true`, will enable drop shadow sizing border around the Swimlane frame window.",
            "type": "boolean",
            "default": false
        },
        "enableWindowGroupsDropShadow": {
            "description": "If `true`, will enable drop shadow borders for io.Connect Window groups.",
            "type": "boolean",
            "default": false
        },
        "enableWindowGroupsCaptionEdit": {
            "description": "If `true`, will enable editing the caption in the header of io.Connect Window groups.",
            "type": "boolean",
            "default": true
        },
        "enableWindowsCaptionEdit": {
            "description": "If `true`, will enable editing the caption in the header of io.Connect Windows. Valid only for tab and flat windows.",
            "type": "boolean",
            "default": true
        },
        "rendererTransparencyMode": {
            "description": "Specifies how to handle the transparency of the HTML elements that determine the bounds of app windows in io.Connect Window groups and Workspaces. These HTML elements are placed over the app windows and must be transparent in order for the app windows to be visible and for the mouse clicks to reach the app windows. For Windows 7 use `\"Regions\"`, for Windows 8+ use `\"KeyColor\"` (selects a color that will always be transparent) or `Transparent` (enables true transparency). Using `\"Auto\"` will select `\"KeyColor\"` or `\"Regions\"` depending on your OS.",
            "type": "string",
            "enum": [
                "Auto",
                "Transparent",
                "KeyColor",
                "Regions",
                "Default"
            ],
            "default": "Auto"
        },
        "rendererTransparencyKeyColor": {
            "description": "Specifies the color that will always be transparent when `\"rendererTransparencyMode\"` is set to `\"KeyColor\"`.",
            "type": "string",
            "default": "#FD12EF"
        },
        "groupType": {
            "description": "Specifies the implementation type of the io.Connect Window group. If set to `\"Classic\"`, group decorations (tabs, captions, etc.) are implemented with WPF components and the theme properties (colors, sizes, etc.) are set via the `themes.json` file. If set to `\"Web\"`, decorations are implemented with HTML elements and the theme properties are set via CSS.",
            "type": "string",
            "enum": [
                "Classic",
                "Web"
            ],
            "default": "Classic"
        },
        "flydownShowDelay": {
            "description": "Delay in milliseconds before showing flydown windows after the user hovers over a flydown zone.",
            "type": "integer",
            "default": 200
        },
        "flydownChangeDelay": {
            "description": "Delay in milliseconds allowing the callback for handling the flydown window to return a result when changing the flydown zone.",
            "type": "integer",
            "default": 150
        },
        "flydownHideDelay": {
            "description": "Delay in milliseconds before hiding the flydown window (e.g., when the user moves the cursor out of the flydown zone).",
            "type": "integer",
            "default": 400
        },
        "flydownHideCheckInterval": {
            "description": "Interval in milliseconds at which the system will check whether the flydown window should be hidden. Its value should be less than the value of `\"flydownHideDelay\"`, otherwise the flydown window will be hidden at the end of the interval specified here and not at the end of the delay specified in `\"flydownHideDelay\"`.",
            "type": "integer",
            "default": 100
        },
        "enableStickiness": {
            "description": "If `true`, will enable io.Connect Windows to stick together forming window groups.",
            "type": "boolean",
            "default": true
        },
        "alignBordersWhenExpanding": {
            "description": "If `true`, the framework will attempt to align the borders of all affected windows when a collapsed window is expanded.",
            "type": "boolean",
            "default": true
        },
        "tabs": {
            "type": "object",
            "additionalProperties": false,
            "properties": {
                "buttonsAlwaysVisible": {
                    "description": "If `true`, the buttons in a tab group will be always visible. Otherwise, they will show only on hover.",
                    "type": "boolean",
                    "default": false
                },
                "flatWhenSingle": {
                    "description": "If `true`, the tab window will look as a flat window (without a tab header) when it's single. Tabs will appear automatically when you add one or more tab windows to it.",
                    "type": "boolean",
                    "default": false
                }
            }
        }
    }
}