if polyglot#init#is_disabled(expand('<sfile>:p'), 'sway', 'syntax/swayconfig.vim')
  finish
endif

" Vim syntax file
" Language: sway config file
" Original Author: Mohamed Boughaba <mohamed dot bgb at gmail dot com>
" Maintainer: James Eapen <jamespeapen at gmail dot com>
" Version: 0.13.0
" Last Change: 2023-08-26

" References:
" http://i3wm.org/docs/userguide.html#configuring
" http://vimdoc.sourceforge.net/htmldoc/syntax.html
"
"
" For version 5.x: Clear all syntax items
" For version 6.x: Quit when a syntax file was already loaded
if version < 600
  syn clear
elsei exists("b:current_syntax")
  fini
en

scriptencoding utf-8

" Error
syn match swayConfigError /.*/

" Todo
syn keyword swayConfigTodo TODO FIXME XXX contained

" Comment
" Comments are started with a # and can only be used at the beginning of a line
syn match swayConfigComment /^\s*#.*$/ contains=swayConfigTodo

" Font
" A FreeType font description is composed by:
" a font family, a style, a weight, a variant, a stretch and a size.
syn match swayConfigFontSeparator /,/ contained
syn match swayConfigFontSeparator /:/ contained
syn keyword swayConfigFontKeyword font contained
syn match swayConfigFontNamespace /\w\+:/ contained contains=swayConfigFontSeparator
syn match swayConfigFontContent /-\?\w\+\(-\+\|\s\+\|,\)/ contained contains=swayConfigFontNamespace,swayConfigFontSeparator,swayConfigFontKeyword
syn match swayConfigFontSize /\s\=\d\+\(px\)\?\s\?$/ contained
syn match swayConfigFont /^\s*font\s\+.*$/ contains=swayConfigFontContent,swayConfigFontSeparator,swayConfigFontSize,swayConfigFontNamespace
syn match swayConfigFont /^\s*font\s\+.*\(\\\_.*\)\?$/ contains=swayConfigFontContent,swayConfigFontSeparator,swayConfigFontSize,swayConfigFontNamespace
syn match swayConfigFont /^\s*font\s\+.*\(\\\_.*\)\?[^\\]\+$/ contains=swayConfigFontContent,swayConfigFontSeparator,swayConfigFontSize,swayConfigFontNamespace
syn match swayConfigFont /^\s*font\s\+\(\(.*\\\_.*\)\|\(.*[^\\]\+$\)\)/ contains=swayConfigFontContent,swayConfigFontSeparator,swayConfigFontSize,swayConfigFontNamespace

" variables
syn match swayConfigString /\(['"]\)\(.\{-}\)\1/ contained
syn match swayConfigColor /#\w\{6}/ contained
syn match swayConfigVariableModifier /+/ contained
syn match swayConfigVariableAndModifier /+\w\+/ contained contains=swayConfigVariableModifier
syn match swayConfigVariable /\$\w\+\(\(-\w\+\)\+\)\?\(\s\|+\)\?/ contains=swayConfigVariableModifier,swayConfigVariableAndModifier
syn keyword swayConfigInitializeKeyword set contained
syn match swayConfigInitialize /^\s*set\s\+.*$/ contains=swayConfigVariable,swayConfigInitializeKeyword,swayConfigColor,swayConfigString

" yes no
syn keyword swayConfigYesNoType yes no contained

" Gaps
syn keyword swayConfigGapStyleKeyword inner outer horizontal vertical top right bottom left current all set plus minus toggle up down contained
syn match swayConfigGapStyle /^\s*\(gaps\)\s\+\(inner\|outer\|horizontal\|vertical\|left\|top\|right\|bottom\)\(\s\+\(current\|all\)\)\?\(\s\+\(set\|plus\|minus\|toggle\)\)\?\(\s\+\(-\?\d\+\|\$.*\)\)$/ contains=swayConfigGapStyleKeyword,swayConfigNumber,swayConfigVariable
syn keyword swayConfigSmartGapKeyword on inverse_outer off contained
syn match swayConfigSmartGap /^\s*smart_gaps\s\+\(on\|inverse_outer\|off\)\s\?$/ contains=swayConfigSmartGapKeyword
syn keyword swayConfigSmartBorderKeyword on no_gaps off contained
syn match swayConfigSmartBorder /^\s*smart_borders\s\+\(on\|no_gaps\|off\)\s\?$/ contains=swayConfigSmartBorderKeyword

" Keyboard bindings
syn keyword swayConfigAction toggle fullscreen restart key import kill shrink grow contained
syn keyword swayConfigAction focus move grow height width split layout resize restore reload mute unmute exit mode workspace container to output contained
syn match swayConfigModifier /\w\++\w\+\(\(+\w\+\)\+\)\?/ contained contains=swayConfigVariableModifier
syn match swayConfigNumber /\s[+-]\?\(\d\+\.\)\?\d\+/ contained
syn match swayConfigUnit /\sp\(pt\|x\)/ contained
syn match swayConfigUnitOr /\sor/ contained
syn keyword swayConfigBindKeyword bindsym bindcode bindswitch bindgesture exec gaps border contained
syn match swayConfigBindArgument /--\w\+\(\(-\w\+\)\+\)\?\s/ contained
syn match swayConfigBind /^\s*\(bindsym\|bindcode\|bindswitch\)\s\+.*$/ contains=swayConfigVariable,swayConfigBindKeyword,swayConfigVariableAndModifier,swayConfigNumber,swayConfigUnit,swayConfigUnitOr,swayConfigBindArgument,swayConfigModifier,swayConfigAction,swayConfigString,swayConfigGapStyleKeyword,swayConfigBorderStyleKeyword

" bindgestures
syn keyword swayConfigBindGestureCommand swipe pinch hold contained
syn keyword swayConfigBindGestureDirection up down left right next prev contained
syn keyword swayConfigBindGesturePinchDirection inward outward clockwise counterclockwise contained
syn match swayConfigBindGestureHold /^\s*\(bindgesture\)\s\+hold\(:[1-5]\)\?\s\+.*$/ contains=swayConfigBindKeyword,swayConfigBindGestureCommand,swayConfigBindGestureDirection,swayConfigWorkspaceKeyword,swayConfigAction
syn match swayConfigBindGestureSwipe /^\s*\(bindgesture\)\s\+swipe\(:[3-5]\)\?:\(up\|down\|left\|right\)\s\+.*$/ contains=swayConfigBindKeyword,swayConfigBindGestureCommand,swayConfigBindGestureDirection,swayConfigWorkspaceKeyword,swayConfigAction
syn match swayConfigBindGesturePinch /^\s*\(bindgesture\)\s\+pinch\(:[2-5]\)\?:\(up\|down\|left\|right\|inward\|outward\|clockwise\|counterclockwise\)\(+\(up\|down\|left\|right\|inward\|outward\|clockwise\|counterclockwise\)\)\?.*$/ contains=swayConfigBindKeyword,swayConfigBindGestureCommand,swayConfigBindGestureDirection,swayConfigBindGesturePinchDirection,swayConfigWorkspaceKeyword,swayConfigAction

" Floating
syn keyword swayConfigFloatingKeyword floating contained
syn match swayConfigFloating /^\s*floating\s\+\(enable\|disable\|toggle\)\s*$/ contains=swayConfigFloatingKeyword

syn keyword swayConfigFloatingModifier floating_modifier contained
syn match swayConfigFloatingMouseAction /^\s\?.*floating_modifier\s\S\+\s\?\(normal\|inverted\|none\)\?$/ contains=swayConfigFloatingModifier,swayConfigVariable

syn keyword swayConfigSizeSpecial x contained
syn match swayConfigNegativeSize /-/ contained
syn match swayConfigSize /-\?\d\+\s\?x\s\?-\?\d\+/ contained contains=swayConfigSizeSpecial,swayConfigNumber,swayConfigNegativeSize
syn match swayConfigFloatingSize /^\s*floating_\(maximum\|minimum\)_size\s\+-\?\d\+\s\?x\s\?-\?\d\+/ contains=swayConfigSize

" Orientation
syn keyword swayConfigOrientationKeyword vertical horizontal auto contained
syn match swayConfigOrientation /^\s*default_orientation\s\+\(vertical\|horizontal\|auto\)\s\?$/ contains=swayConfigOrientationKeyword

" Layout
syn keyword swayConfigLayoutKeyword default stacking tabbed contained
syn match swayConfigLayout /^\s*workspace_layout\s\+\(default\|stacking\|tabbed\)\s\?$/ contains=swayConfigLayoutKeyword

" Border style
syn keyword swayConfigBorderStyleKeyword none normal pixel contained
syn match swayConfigBorderStyle /^\s*\(new_window\|new_float\|default_border\|default_floating_border\)\s\+\(none\|\(normal\|pixel\)\(\s\+\d\+\)\?\(\s\+\$\w\+\(\(-\w\+\)\+\)\?\(\s\|+\)\?\)\?\)\s\?$/ contains=swayConfigBorderStyleKeyword,swayConfigNumber,swayConfigVariable

" Hide borders and edges
syn keyword swayConfigEdgeKeyword none vertical horizontal both smart smart_no_gaps contained
syn match swayConfigEdge /^\s*hide_edge_borders\s\+\(none\|vertical\|horizontal\|both\|smart\|smart_no_gaps\)\s\?$/ contains=swayConfigEdgeKeyword

" Arbitrary commands for specific windows (for_window)
syn keyword swayConfigCommandKeyword for_window contained
syn region swayConfigWindowStringSpecial start=+"+  skip=+\\"+  end=+"+ contained contains=swayConfigString
syn region swayConfigWindowCommandSpecial start="\[" end="\]" contained contains=swayConfigWindowStringSpacial,swayConfigString
syn match swayConfigArbitraryCommand /^\s*for_window\s\+.*$/ contains=swayConfigWindowCommandSpecial,swayConfigCommandKeyword,swayConfigBorderStyleKeyword,swayConfigLayoutKeyword,swayConfigOrientationKeyword,Size,swayConfigNumber

" Disable focus open opening
syn keyword swayConfigNoFocusKeyword no_focus contained
syn match swayConfigDisableFocus /^\s*no_focus\s\+.*$/ contains=swayConfigWindowCommandSpecial,swayConfigNoFocusKeyword

" Move client to specific workspace automatically
syn keyword swayConfigAssignKeyword assign contained
syn match swayConfigAssignSpecial /→/ contained
syn match swayConfigAssign /^\s*assign\s\+.*$/ contains=swayConfigAssignKeyword,swayConfigWindowCommandSpecial,swayConfigAssignSpecial

" X resources
syn keyword swayConfigResourceKeyword set_from_resource contained
syn match swayConfigResource /^\s*set_from_resource\s\+.*$/ contains=swayConfigResourceKeyword,swayConfigWindowCommandSpecial,swayConfigColor,swayConfigVariable

" Auto start applications
syn keyword swayConfigExecKeyword exec exec_always contained
syn match swayConfigNoStartupId /--no-startup-id/ contained " We are not using swayConfigBindArgument as only no-startup-id is supported here
syn match swayConfigExec /^\s*exec\(_always\)\?\s\+.*$/ contains=swayConfigExecKeyword,swayConfigNoStartupId,swayConfigString

" Input config
syn keyword swayConfigInputKeyword input contained
syn match swayConfigInput /^\s*input\s\+.*$/ contains=swayConfigInputKeyword

" Seat config
syn keyword swayConfigSeatKeyword seat contained
syn match swayConfigSeat /^\s*seat\s\+.*$/ contains=swayConfigSeatKeyword

" Automatically putting workspaces on specific screens
syn keyword swayConfigWorkspaceKeyword workspace contained
syn keyword swayConfigOutputKeyword output contained
syn match swayConfigWorkspace /^\s*workspace\s\+.*$/ contains=swayConfigWorkspaceKeyword,swayConfigNumber,swayConfigString,swayConfigOutputKeyword

" set display outputs
syn match swayConfigOutput /^\s*output\s\+.*$/ contains=swayConfigOutputKeyword

" set display focus 
syn keyword swayConfigFocusKeyword focus contained
syn keyword swayConfigFocusType output contained
syn match swayConfigFocus /^\s*focus\soutput\s.*$/ contains=swayConfigFocusKeyword,swayConfigFocusType

" Changing colors
syn keyword swayConfigClientKeyword client contained
syn keyword swayConfigClientColorKeyword focused focused_inactive focused_tab_title unfocused urgent placeholder contained
syn match swayConfigClientColor /^\s*client.\w\+\s\+.*$/ contains=swayConfigClientKeyword,swayConfigClientColorKeyword,swayConfigColor,swayConfigVariable

syn keyword swayConfigTitleAlignKeyword left center right contained
syn match swayConfigTitleAlign /^\s*title_align\s\+.*$/ contains=swayConfigTitleAlignKeyword

" Interprocess communication
syn match swayConfigInterprocessKeyword /ipc-socket/ contained
syn match swayConfigInterprocess /^\s*ipc-socket\s\+.*$/ contains=swayConfigInterprocessKeyword

" Mouse warping
syn keyword swayConfigMouseWarpingKeyword mouse_warping contained
syn keyword swayConfigMouseWarpingType output none container contained
syn match swayConfigMouseWarping /^\s*mouse_warping\s\+\(output\|container\|none\)\s\?$/ contains=swayConfigMouseWarpingKeyword,swayConfigMouseWarpingType

" Focus follows mouse
syn keyword swayConfigFocusFollowsMouseKeyword focus_follows_mouse contained
syn keyword swayConfigFocusFollowsMouseType yes no always contained
syn match swayConfigFocusFollowsMouse /^\s*focus_follows_mouse\s\+\(yes\|no\|always\)\s\?$/ contains=swayConfigFocusFollowsMouseKeyword,swayConfigFocusFollowsMouseType

" Popups during fullscreen mode
syn keyword swayConfigPopupOnFullscreenKeyword popup_during_fullscreen contained
syn keyword swayConfigPopuponFullscreenType smart ignore leave_fullscreen contained
syn match swayConfigPopupOnFullscreen /^\s*popup_during_fullscreen\s\+\w\+\s\?$/ contains=swayConfigPopupOnFullscreenKeyword,swayConfigPopupOnFullscreenType

" Focus wrapping
syn keyword swayConfigFocusWrappingKeyword focus_wrapping contained
syn keyword swayConfigFocusWrappingType yes no force workspace contained
syn match swayConfigFocusWrapping /^\s*focus_wrapping\s\+\(yes\|no\|force\|workspace\)\s\?$/ contains=swayConfigFocusWrappingType,swayConfigFocusWrappingKeyword

" Forcing Xinerama
syn keyword swayConfigForceXineramaKeyword force_xinerama contained
syn match swayConfigForceXinerama /^\s*force_xinerama\s\+\(yes\|no\)\s\?$/ contains=swayConfigYesNoType,swayConfigForceXineramaKeyword

" Automatic back-and-forth when switching to the current workspace
syn keyword swayConfigAutomaticSwitchKeyword workspace_auto_back_and_forth contained
syn match swayConfigAutomaticSwitch /^\s*workspace_auto_back_and_forth\s\+\(yes\|no\)\s\?$/ contains=swayConfigYesNoType,swayConfigAutomaticSwitchKeyword

" Delay urgency hint
syn keyword swayConfigTimeUnit ms contained
syn keyword swayConfigDelayUrgencyKeyword force_display_urgency_hint contained
syn match swayConfigDelayUrgency /^\s*force_display_urgency_hint\s\+\d\+\s\+ms\s\?$/ contains=swayConfigDelayUrgencyKeyword,swayConfigNumber,swayConfigTimeUnit

" Focus on window activation
syn keyword swayConfigFocusOnActivationKeyword focus_on_window_activation contained
syn keyword swayConfigFocusOnActivationType smart urgent focus none contained
syn match swayConfigFocusOnActivation /^\s*focus_on_window_activation\s\+\(smart\|urgent\|focus\|none\)\s\?$/  contains=swayConfigFocusOnActivationKeyword,swayConfigFocusOnActivationType

" Automatic back-and-forth when switching to the current workspace
syn keyword swayConfigDrawingMarksKeyword show_marks contained
syn match swayConfigDrawingMarks /^\s*show_marks\s\+\(yes\|no\)\s\?$/ contains=swayConfigYesNoType,swayConfigDrawingMarksKeyword

" Group mode/bar
syn keyword swayConfigBlockKeyword set bar colors i3bar_command status_command position hidden_state modifier id position background statusline tray_output tray_padding separator separator_symbol workspace_buttons strip_workspace_numbers binding_mode_indicator focused_workspace active_workspace inactive_workspace urgent_workspace binding_mode contained
syn region swayConfigBlock start=+.*s\?{$+ end=+^}$+ contains=swayConfigBlockKeyword,swayConfigString,swayConfigAction,swayConfigBind,swayConfigComment,swayConfigFont,swayConfigFocusWrappingType,swayConfigColor,swayConfigVariable,swayConfigInputKeyword,swayConfigSeatKeyword,swayConfigOutputKeyword transparent keepend extend

" Line continuation
syn region swayConfigLineCont start=/^.*\\$/ end=/^[^\\]*$/ contains=swayConfigBlockKeyword,swayConfigString,swayConfigAction,swayConfigBind,swayConfigComment,swayConfigFont,swayConfigFocusWrappingType,swayConfigColor,swayConfigVariable,swayConfigExecKeyword transparent keepend extend

" Includes with relative paths to config files
syn keyword swayConfigInclude include contained
syn match swayConfigFile /^\s\?include\s\+.*$/ contains=swayConfigInclude

" xwayland 
syn keyword swayConfigXwaylandKeyword xwayland contained
syn match swayConfigXwaylandModifier /^\s*xwayland\s\+\(enable\|disable\|force\)\s\?$/ contains=swayConfigXwaylandKeyword

" Titlebar padding
syn keyword swayConfigTitlebarPaddingKeyword titlebar_padding contained
syn match swayConfigTitlebarPadding /^\s*titlebar_padding\s\+\d\+\(\s\+\d\+\)\?\s\?$/ contains=swayConfigTitlebarPaddingKeyword,swayConfigNumber

" Define the highlighting.
let b:current_syntax = "swayconfig"
hi! def link swayConfigError                           Error
hi! def link swayConfigTodo                            Todo
hi! def link swayConfigComment                         Comment
hi! def link swayConfigFontContent                     Type
hi! def link swayConfigFocusOnActivationType           Type
hi! def link swayConfigPopupOnFullscreenType           Type
hi! def link swayConfigOrientationKeyword              Type
hi! def link swayConfigMouseWarpingType                Type
hi! def link swayConfigFocusFollowsMouseType           Type
hi! def link swayConfigGapStyleKeyword                 Type
hi! def link swayConfigTitleAlignKeyword               Type
hi! def link swayConfigSmartGapKeyword                 Type
hi! def link swayConfigSmartBorderKeyword              Type
hi! def link swayConfigLayoutKeyword                   Type
hi! def link swayConfigBorderStyleKeyword              Type
hi! def link swayConfigEdgeKeyword                     Type
hi! def link swayConfigAction                          Type
hi! def link swayConfigCommand                         Type
hi! def link swayConfigOutputKeyword                   Type
hi! def link swayConfigInputKeyword                    Type
hi! def link swayConfigSeatKeyword                     Type
hi! def link swayConfigWindowCommandSpecial            Type
hi! def link swayConfigFocusWrappingType               Type
hi! def link swayConfigYesNoType                       Type
hi! def link swayConfigUnitOr                          Type
hi! def link swayConfigClientColorKeyword              Type
hi! def link swayConfigFloating                        Type
hi! def link swayConfigBindGestureDirection            Constant
hi! def link swayConfigBindGesturePinchDirection       Constant
hi! def link swayConfigFontSize                        Constant
hi! def link swayConfigColor                           Constant
hi! def link swayConfigNumber                          Constant
hi! def link swayConfigUnit                            Constant
hi! def link swayConfigVariableAndModifier             Constant
hi! def link swayConfigTimeUnit                        Constant
hi! def link swayConfigModifier                        Constant
hi! def link swayConfigString                          Constant
hi! def link swayConfigNegativeSize                    Constant
hi! def link swayConfigFontSeparator                   Special
hi! def link swayConfigVariableModifier                Special
hi! def link swayConfigSizeSpecial                     Special
hi! def link swayConfigWindowSpecial                   Special
hi! def link swayConfigAssignSpecial                   Special
hi! def link swayConfigFontNamespace                   PreProc
hi! def link swayConfigBindArgument                    PreProc
hi! def link swayConfigNoStartupId                     PreProc
hi! def link swayConfigBindGesture                     PreProc
hi! def link swayConfigFontKeyword                     Identifier
hi! def link swayConfigBindKeyword                     Identifier
hi! def link swayConfigBindGestureCommand              Identifier
hi! def link swayConfigOrientation                     Identifier
hi! def link swayConfigGapStyle                        Identifier
hi! def link swayConfigTitleAlign                      Identifier
hi! def link swayConfigSmartGap                        Identifier
hi! def link swayConfigSmartBorder                     Identifier
hi! def link swayConfigLayout                          Identifier
hi! def link swayConfigBorderStyle                     Identifier
hi! def link swayConfigEdge                            Identifier
hi! def link swayConfigFloatingSize                    Identifier
hi! def link swayConfigCommandKeyword                  Identifier
hi! def link swayConfigNoFocusKeyword                  Identifier
hi! def link swayConfigInitializeKeyword               Identifier
hi! def link swayConfigAssignKeyword                   Identifier
hi! def link swayConfigResourceKeyword                 Identifier
hi! def link swayConfigExecKeyword                     Identifier
hi! def link swayConfigWorkspaceKeyword                Identifier
hi! def link swayConfigClientKeyword                   Identifier
hi! def link swayConfigInterprocessKeyword             Identifier
hi! def link swayConfigMouseWarpingKeyword             Identifier
hi! def link swayConfigFocusFollowsMouseKeyword        Identifier
hi! def link swayConfigPopupOnFullscreenKeyword        Identifier
hi! def link swayConfigFocusWrappingKeyword            Identifier
hi! def link swayConfigForceXineramaKeyword            Identifier
hi! def link swayConfigAutomaticSwitchKeyword          Identifier
hi! def link swayConfigDelayUrgencyKeyword             Identifier
hi! def link swayConfigFocusOnActivationKeyword        Identifier
hi! def link swayConfigDrawingMarksKeyword             Identifier
hi! def link swayConfigBlockKeyword                    Identifier
hi! def link swayConfigVariable                        Statement
hi! def link swayConfigArbitraryCommand                Type
hi! def link swayConfigInclude                         Identifier
hi! def link swayConfigFile                            Constant
hi! def link swayConfigFloatingKeyword                 Identifier
hi! def link swayConfigFloatingModifier                Identifier
hi! def link swayConfigFloatingMouseAction             Type
hi! def link swayConfigFocusKeyword                    Type
hi! def link swayConfigFocusType                       Identifier
hi! def link swayConfigXwaylandKeyword                 Identifier
hi! def link swayConfigXwaylandModifier                Type
hi! def link swayConfigTitlebarPaddingKeyword          Identifier
hi! def link swayConfigTitlebarPadding                 Type
