{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "title": "ApplicationSpecificConfiguration",
  "type": "object",
  "additionalProperties": {
    "$ref": "#/$defs/AscApplicationRulesOrSchema"
  },
  "$defs": {
    "ApplicationIdentifier": {
      "description": "Application identifier",
      "oneOf": [
        {
          "description": "Executable name",
          "type": "string",
          "const": "Exe"
        },
        {
          "description": "Class",
          "type": "string",
          "const": "Class"
        },
        {
          "description": "Window title",
          "type": "string",
          "const": "Title"
        },
        {
          "description": "Executable path",
          "type": "string",
          "const": "Path"
        }
      ]
    },
    "AscApplicationRules": {
      "description": "Rules that determine how an application is handled",
      "type": "object",
      "properties": {
        "floating": {
          "description": "Rules to manage specific windows as floating windows",
          "type": [
            "array",
            "null"
          ],
          "items": {
            "$ref": "#/$defs/MatchingRule"
          }
        },
        "ignore": {
          "description": "Rules to ignore specific windows",
          "type": [
            "array",
            "null"
          ],
          "items": {
            "$ref": "#/$defs/MatchingRule"
          }
        },
        "layered": {
          "description": "Rules to identify applications which have the `WS_EX_LAYERED` Extended Window Style",
          "type": [
            "array",
            "null"
          ],
          "items": {
            "$ref": "#/$defs/MatchingRule"
          }
        },
        "manage": {
          "description": "Rules to forcibly manage specific windows",
          "type": [
            "array",
            "null"
          ],
          "items": {
            "$ref": "#/$defs/MatchingRule"
          }
        },
        "object_name_change": {
          "description": "Rules to identify applications which send the `EVENT_OBJECT_NAMECHANGE` event on launch",
          "type": [
            "array",
            "null"
          ],
          "items": {
            "$ref": "#/$defs/MatchingRule"
          }
        },
        "slow_application": {
          "description": "Rules to identify applications which are slow to send initial event notifications",
          "type": [
            "array",
            "null"
          ],
          "items": {
            "$ref": "#/$defs/MatchingRule"
          }
        },
        "transparency_ignore": {
          "description": "Rules to ignore specific windows from the transparency feature",
          "type": [
            "array",
            "null"
          ],
          "items": {
            "$ref": "#/$defs/MatchingRule"
          }
        },
        "tray_and_multi_window": {
          "description": "Rules to identify applications which minimize to the tray or have multiple windows",
          "type": [
            "array",
            "null"
          ],
          "items": {
            "$ref": "#/$defs/MatchingRule"
          }
        }
      }
    },
    "AscApplicationRulesOrSchema": {
      "anyOf": [
        {
          "$ref": "#/$defs/AscApplicationRules"
        },
        {
          "type": "string"
        }
      ]
    },
    "IdWithIdentifier": {
      "description": "Rule for matching applications",
      "type": "object",
      "properties": {
        "id": {
          "description": "Target identifier",
          "type": "string"
        },
        "kind": {
          "description": "Kind of identifier to target",
          "$ref": "#/$defs/ApplicationIdentifier"
        },
        "matching_strategy": {
          "description": "Matching strategy to use",
          "anyOf": [
            {
              "$ref": "#/$defs/MatchingStrategy"
            },
            {
              "type": "null"
            }
          ]
        }
      },
      "required": [
        "kind",
        "id"
      ]
    },
    "MatchingRule": {
      "description": "Rule for matching applications",
      "anyOf": [
        {
          "description": "Simple matching rule which must evaluate to true",
          "$ref": "#/$defs/IdWithIdentifier"
        },
        {
          "description": "Composite matching rule where all conditions must evaluate to true",
          "type": "array",
          "items": {
            "$ref": "#/$defs/IdWithIdentifier"
          }
        }
      ]
    },
    "MatchingStrategy": {
      "description": "Strategy for matching identifiers",
      "oneOf": [
        {
          "description": "Should not be used, only kept for backward compatibility",
          "type": "string",
          "const": "Legacy"
        },
        {
          "description": "Equals",
          "type": "string",
          "const": "Equals"
        },
        {
          "description": "Starts With",
          "type": "string",
          "const": "StartsWith"
        },
        {
          "description": "Ends With",
          "type": "string",
          "const": "EndsWith"
        },
        {
          "description": "Contains",
          "type": "string",
          "const": "Contains"
        },
        {
          "description": "Regex",
          "type": "string",
          "const": "Regex"
        },
        {
          "description": "Does not end with",
          "type": "string",
          "const": "DoesNotEndWith"
        },
        {
          "description": "Does not start with",
          "type": "string",
          "const": "DoesNotStartWith"
        },
        {
          "description": "Does not equal",
          "type": "string",
          "const": "DoesNotEqual"
        },
        {
          "description": "Does not contain",
          "type": "string",
          "const": "DoesNotContain"
        }
      ]
    }
  }
}
