#
# This file is a part of the NsCDE - Not so Common Desktop Environment
# Author: Hegel3DReloaded
# Licence: GPLv3
#

UseGettext {$NSCDE_ROOT/share/locale;NsCDE-Occupy}
WindowLocaleTitle {Occupy}
WindowSize 302 302
Colorset 22

Init
Begin
   # Pick mode out of window context initially
   If $WinName == {} Then
   Begin
      ChangeLocaleTitle 2 {Select Workspace, pick a Window.}
   End
   Else
   Begin
      ChangeTitle 2 $WinName
   End

   # First check if we are running on FVWM2 or FVWM3
   Set $FvwmMajorVersion = (GetScriptArgument 1)

   # Mode of operation
   Set $OpModeArg = (GetScriptArgument 2)

   # Dynamic current values
   Set $DeskNo = (Add (GetScriptArgument 3) 1)
   Set $PageX = (GetScriptArgument 4)
   Set $PageY = (GetScriptArgument 5)

   # Occupy counts monitors from 1, while FVWM2 is doing this from 0
   # handle this situation.
   If $FvwmMajorVersion == 2 Then
   Begin
      Set $MonitorNo = (Add (GetScriptArgument 6) 1)
   End
   Else
   Begin
      Set $MonitorNo = (GetScriptArgument 6)
   End

   # Configured workspaces, pages and monitors static arguments
   Set $DesksNo = (Add (GetScriptArgument 7) -1)
   Set $PageMatrixX = (GetScriptArgument 8)
   Set $PageMatrixY = (GetScriptArgument 9)
   Set $PagesNo = (Mult $PageMatrixX $PageMatrixY)
   Set $MonitorsNo = (GetScriptArgument 10)

   # Hide Monitor selection if we are on single monitor
   If $MonitorsNo == 1 Then
   Begin
      HideWidget 5
      Set $OpMode = 1
   End

   # Middle mouse button selects to go with the window
   Set $GoNoGo = (GetScriptArgument 11)
   If $GoNoGo == {go} Then
   Begin
      Set $GoWithWindow = 1
      ChangeValue 8 1
   End
   Else
   Begin
      Set $GoWithWindow = 0
   End

   # OpMode 1 is workspaces operation, OpMode 2 is pages mode of operation
   # OpMode 3 is monitor mode of operation. Default is workspaces (wsp).
   If $OpModeArg == {} Then
   Begin
      Set $OpMode = 1
      Set $ChangeLocaleWindowTitle = (Gettext {Occupy Workspace})
      ChangeWindowTitle $ChangeLocaleWindowTitle
   End

   If $OpModeArg == {pg} Then
   Begin
      Set $OpMode = 2
      Set $ChangeLocaleWindowTitle = (Gettext {Occupy Page})
      ChangeWindowTitle $ChangeLocaleWindowTitle
   End

   If $OpModeArg == {wsp} Then
   Begin
      Set $OpMode = 1
      Set $ChangeLocaleWindowTitle = (Gettext {Occupy Workspace})
      ChangeWindowTitle $ChangeLocaleWindowTitle
      ChangeValue 6 $DeskNo
   End

   If $MonitorsNo > 1 Then
   Begin
      If $OpModeArg == {mon} Then
      Begin
         Set $OpMode = 3
         Set $ChangeLocaleWindowTitle = (Gettext {Occupy Monitor})
         ChangeWindowTitle $ChangeLocaleWindowTitle
         ChangeValue 6 $MonitorNo
      End
   End

   # Keyboard shortcuts for navigation, toggling and action
   Key Escape A 11 1 {Quit}
   Key H A 12 1 {DisplayHelp}
   Key Help A 12 1 {DisplayHelp}
   Key F1 A 12 1 {DisplayHelp}
   Key A A 7 1 {AllToggle}
   Key Return A 1 7 {Move}
   Key Return C 1 7 {MoveGo}
   Key Down A 6 1 {Down}
   Key Up A 6 1 {Up}
   Key Space A 1 6 {ChangeOpMode}

   Set $BtnFont = (GetOutput {$NSCDE_TOOLSDIR/getfont -v -t normal -s medium -Z 14} 1 -1)
   ChangeFont 10 $BtnFont
   ChangeFont 12 $BtnFont
   ChangeFont 11 $BtnFont

   Set $LabelFont = (GetOutput {$NSCDE_TOOLSDIR/getfont -v -t normal -s medium -Z 11.5} 1 -1)
   ChangeFont 1 $LabelFont
   ChangeFont 6 $LabelFont
   ChangeFont 3 $LabelFont
   ChangeFont 4 $LabelFont
   ChangeFont 5 $LabelFont

   Set $SmallFont = (GetOutput {$NSCDE_TOOLSDIR/getfont -v -t normal -s small -Z 10.5} 1 -1)
   ChangeFont 7 $SmallFont
   ChangeFont 8 $SmallFont
   ChangeFont 2 $SmallFont

   #
   # Defaults for variables during initialization
   #

   # Not sticky
   Set $AllPages = 0
   Set $AllWorkspaces = 0
   Set $WorkspacesMode = {normal}
   Set $PagesMode = {normal}

   # Starred states of Workspaces and Pages radio buttons
   Set $StarredWspSet = 0
   Set $StarredPgSet = 0
   Set $InitialDeskNo = $DeskNo
   Set $InitialPageNoSet = 0
   Set $StarredMonSet = 0
   Set $InitialMonitorNo = $MonitorNo

   # This takes care of handling sticky windows across workspaces as well as pages
   If $OpMode == 1 Then
   Begin
      Do {WindowId $[w.id] (StickyAcrossDesks) SendToModule Occupy SendString 6 1 AllToggle}
   End
   If $OpMode == 2 Then
   Begin
      Do {WindowId $[w.id] (StickyAcrossPages) SendToModule Occupy SendString 6 1 AllToggle}
   End
   Do {WindowId $[w.id] (StickyAcrossDesks) SendToModule Occupy SendString 6 2 Run}
   Do {WindowId $[w.id] (StickyAcrossPages) SendToModule Occupy SendString 6 3 Run}

   # Locale stuff: Hack to keep leading or ending space(s)
   # which will be trimmed by LocaleTitle Widget directive.
   ChangeLocaleTitle 7 (GetTitle 7)
   ChangeLocaleTitle 8 (GetTitle 8)
End

# Upper Left static "Window" label. Serves as execution and message passing
# widget under the hood.
Widget 1
   Property
   Size 4 20
   Position 4 10
   Type ItemDraw
   Flags NoReliefString NoFocus Right
   LocaleTitle {Window:}
   Font "xft:::pixelsize=15"
   Colorset 22
   Main
      Case message of
      # Accept list of workspaces in FvwmScript List menu format
      # send signal to workspaces radio button if mode of operation
      # is workspaces
      1 :
      Begin
         Set $WorkSpaces = (LastString)
         If $OpMode == 1 Then
         Begin
            SendSignal 3 1
         End
      End
      # Same as "1 :" but for pages
      2 :
      Begin
         Set $Pages = (LastString)
         If $OpMode == 2 Then
         Begin
            SendSignal 4 1
         End
      End
      # Same as "2 :" but for monitors
      3 :
      Begin
         Set $Monitors = (LastString)
         If $OpMode == 3 Then
         Begin
            SendSignal 5 1
         End
      End
      # Accept $[w.id] from f_SendToOccupy, send it to "4 :" that will obtain
      # window name from it.
      4 :
      Begin
         Set $WinId = (LastString)
         Do {Current WindowId } $WinId { SendToModule Occupy SendString 1 5 $[w.name]}
      End
      # Get window name from "3 :", set it on widget 2
      5 :
      Begin
         Set $WinName = (LastString)

         If $WinId == {$[w.id]} Then
         Begin
            Set $WinId = {}
               Set $WinName = {}
         End
         Else
         Begin
            Set $WinNameRest = (StrCopy $WinName 30 31)
            If $WinNameRest <> {} Then
            Begin
               Set $WinName = (StrCopy $WinName 1 29) {...'}
            End

            ChangeTitle 2 $WinName
         End
      End
      # Accept keyboard shortcut SPACE to change mode of operation
      # between workspaces (1) and pages (2) ...
      6 :
      Begin
         If (LastString) == {ChangeOpMode} Then
         Begin
            If $OpMode == 1 Then
            Begin
               SendSignal 4 1
            End
            Else
            Begin
               If $OpMode == 2 Then
               Begin
                  # Avoid selecting hidden monitors selection if we are on
                  # one monitor.
                  If $MonitorsNo > 1 Then
                  Begin
                     SendSignal 5 1
                  End
                  Else
                  Begin
                     SendSignal 3 1
                  End
               End
               Else
               Begin
                  If $OpMode == 3 Then
                  Begin
                     SendSignal 3 1
                  End
               End
            End
         End
      End
      # Accept action to finally move the window or to move it and go
      # with it on that workspace and/or page
      7 :
      Begin
         If (LastString) == {Move} Then
         Begin
            SendSignal 10 1
         End
         If (LastString) == {MoveGo} Then
         Begin
            SendSignal 8 1
            SendSignal 10 1
         End
      End
End

# Window name from "1 4" goes here
Widget 2
   Property
   Size 218 20
   Position 74 10
   Type ItemDraw
   Flags NoReliefString Left
   Title {}
   Colorset 22
   Font "xft:::pixelsize=14"
End

# Toggle workspaces mode of operation
Widget 3
   Property
   Size 100 0
   Position 4 38
   Type RadioButton
   Flags NoReliefString Right
   LocaleTitle {Workspaces:}
   Font "xft:::pixelsize=15"
   Colorset 22
   Value 1
   Main
      Case message of
      SingleClic :
      Begin
         SendSignal 3 1
      End
      1 :
      Begin
         ChangeValue 4 0
         ChangeValue 5 0
         ChangeValue 3 1
         ChangeValue 7 $AllWorkspaces

         # Take care to enable "All Workspaces" checkbox which may be hidden by monitors mode.
         ShowWidget 7

         # This block takes care for putting (*) at the end of
         # Pages: label on its radio button when something is
         # changed from the initial default. Special case is 999
         # which represents sticky state. There is also procedure
         # for removing (*) when settings are put back as it was
         # initially.
         If $OpMode == 2 Then
         Begin
            Set $PagesListValue = (GetValue 6)

            If $PageNo <> {} Then
            Begin
               If $StarredPgSet <> 1 Then
               Begin
                  If $PageNo == 999 Then
                  Begin
                     Set $InitialPageNo = 999
                  End
                  Else
                  Begin
                     Set $OrigPgTitle = (GetTitle 4)
                     Set $StarredPgTitle = $OrigPgTitle {*}
                     ChangeTitle 4 $StarredPgTitle
                     Set $StarredPgSet = 1
                  End
               End
               Else
               Begin
                  If $PageNo == 999 Then
                  Begin
                     Set $InitialPageNo = 999
                  End
                  If $PageNo == $InitialPageNo Then
                  Begin
                     ChangeTitle 4 $OrigPgTitle
                     Set $StarredPgSet = 0
                  End
               End
            End
         End

         # This block takes care for putting (*) at the end of
         # Monitors: label on its radio button when something is
         # changed from the initial default. There is also procedure
         # for removing (*) when settings are put back as it was
         # initially.
         If $OpMode == 3 Then
         Begin
            Set $MonitorsListValue = (GetValue 6)

            If $StarredMonSet <> 1 Then
            Begin
               If (GetValue 6) <> $InitialMonitorNo Then
               Begin
                  Set $OrigMonTitle = (GetTitle 5)
                  Set $StarredMonTitle = $OrigMonTitle {*}
                  ChangeTitle 5 $StarredMonTitle
                  Set $StarredMonSet = 1
               End
            End
            Else
            Begin
               If $MonitorNo == $InitialMonitorNo Then
               Begin
                  ChangeTitle 5 $OrigMonTitle
                  Set $StarredMonSet = 0
               End
            End
         End

         # Normal is non-sticky, allworkspaces is sticky
         # allworkspaces DeskNo value is virtual place holder 999
         # $WorkspacesListValue puts back saved value when changing
         # mode of operation
         If $WorkspacesMode == {normal} Then
         Begin
            ChangeTitle 6 $WorkSpaces
            If $WorkspacesListValue == {} Then
            Begin
               Set $WorkspacesListValue = (GetValue 6)
            End
            ChangeValue 6 $WorkspacesListValue
         End
         Else
         Begin
            ChangeValue 7 1
            Set $DeskNo = 999
            ChangeLocaleTitle 6 { All Workspaces    }
            ChangeValue 6 1
         End

         Set $ChangeLocaleWindowTitle = (Gettext {Occupy Workspace})
         ChangeWindowTitle $ChangeLocaleWindowTitle
         ChangeLocaleTitle 7 { All Workspaces    }
         Set $OpMode = 1
      End
End

# Toggle pages mode of operation
Widget 4
   Property
   Size 100 0
   Position 4 68
   Type RadioButton
   Flags NoReliefString Right
   LocaleTitle {Pages:}
   Font "xft:::pixelsize=15"
   Colorset 22
   Value 0
   Main
      Case message of
      SingleClic :
      Begin
         SendSignal 4 1
      End
      1 :
      Begin
         ChangeValue 3 0
         ChangeValue 5 0
         ChangeValue 4 1
         ChangeValue 7 $AllPages

         # Take care to enable "All Pages" checkbox which may be hidden by monitors mode.
         ShowWidget 7

         # This block takes care for putting (*) at the end of
         # Workspaces: label on its radio button when something is
         # changed from the initial default. Special case is 999
         # which represents sticky state. There is also procedure
         # for removing (*) when settings are put back as it was
         # initially.
         If $OpMode == 1 Then
         Begin
            Set $WorkspacesListValue = (GetValue 6)

            If $DeskNo == 999 Then
            Begin
               Set $InitialDeskNo = $DeskNo
            End
            If $StarredWspSet <> 1 Then
            Begin
               If $DeskNo <> $InitialDeskNo Then
               Begin
                  Set $OrigWspTitle = (GetTitle 3)
                  Set $StarredWspTitle = $OrigWspTitle {*}
                  ChangeTitle 3 $StarredWspTitle
                  Set $StarredWspSet = 1
               End
            End
            Else
            Begin
               If $DeskNo == $InitialDeskNo Then
               Begin
                  ChangeTitle 3 $OrigWspTitle
                  Set $StarredWspSet = 0
               End
            End
         End

         # This block takes care for putting (*) at the end of
         # Monitors: label on its radio button when something is
         # changed from the initial default. There is also procedure
         # for removing (*) when settings are put back as it was
         # initially.
         If $OpMode == 3 Then
         Begin
            Set $MonitorsListValue = (GetValue 6)

            If $StarredMonSet <> 1 Then
            Begin
               If (GetValue 6) <> $InitialMonitorNo Then
               Begin
                  Set $OrigMonTitle = (GetTitle 5)
                  Set $StarredMonTitle = $OrigMonTitle {*}
                  ChangeTitle 5 $StarredMonTitle
                  Set $StarredMonSet = 1
               End
            End
            Else
            Begin
               If $MonitorNo == $InitialMonitorNo Then
               Begin
                  ChangeTitle 5 $OrigMonTitle
                  Set $StarredMonSet = 0
               End
            End
         End

         # Normal is non-sticky, allpages is sticky
         # allpages PageNo value is virtual place holder 999
         # $PagesListValue puts back saved value when changing
         # mode of operation
         If $PagesMode == {normal} Then
         Begin
            ChangeTitle 6 $Pages

            If $CurrentPageNum == {} Then
            Begin
               Set $CurrentPageNumCmd = {$NSCDE_TOOLSDIR/mkpagemenu } $PageMatrixX { } $PageMatrixY { pgnum_pgid | grep ' } $PageX { } $PageY {$'}
               Set $CurrentPageNum = (GetOutput $CurrentPageNumCmd 1 1)
               ChangeValue 6 $CurrentPageNum
            End
            Else
            Begin
               If $PagesListValue > 0 Then
               Begin
                  ChangeValue 6 $PagesListValue
               End
            End
         End
         Else
         Begin
            ChangeValue 7 1
            Set $PageNo = 999
            ChangeLocaleTitle 6 { All Pages      }
            ChangeValue 6 1
         End

         Set $ChangeLocaleWindowTitle = (Gettext {Occupy Page})
         ChangeWindowTitle $ChangeLocaleWindowTitle
         ChangeLocaleTitle 7 { All Pages      }
         Set $OpMode = 2
      End
End

# Toggle pages mode of operation
Widget 5
   Property
   Size 100 0
   Position 4 98
   Type RadioButton
   Flags NoReliefString Right
   LocaleTitle {Monitors:}
   Font "xft:::pixelsize=15"
   Colorset 22
   Value 0
   Main
      Case message of
      SingleClic :
      Begin
         SendSignal 5 1
      End
      1 :
      Begin
         ChangeValue 3 0
         ChangeValue 4 0
         ChangeValue 5 1
         ChangeTitle 6 $Monitors

         # Take care to hide "All Workspaces/Pages" checkbox.
         # The X11 does not support app window on multiple monitors.
         HideWidget 7

         If $OpMode == 1 Then
         Begin
            Set $WorkspacesListValue = (GetValue 6)

            If $DeskNo == 999 Then
            Begin
               Set $InitialDeskNo = $DeskNo
            End
            If $StarredWspSet <> 1 Then
            Begin
               If $DeskNo <> $InitialDeskNo Then
               Begin
                  Set $OrigWspTitle = (GetTitle 3)
                  Set $StarredWspTitle = $OrigWspTitle {*}
                  ChangeTitle 3 $StarredWspTitle
                  Set $StarredWspSet = 1
               End
            End
            Else
            Begin
               If $DeskNo == $InitialDeskNo Then
               Begin
                  ChangeTitle 3 $OrigWspTitle
                  Set $StarredWspSet = 0
               End
            End

         End

         If $OpMode == 2 Then
         Begin
            Set $PagesListValue = (GetValue 6)

            If $PageNo <> {} Then
            Begin
               If $StarredPgSet <> 1 Then
               Begin
                  If $PageNo == 999 Then
                  Begin
                     Set $InitialPageNo = 999
                  End
                  Else
                  Begin
                     Set $OrigPgTitle = (GetTitle 4)
                     Set $StarredPgTitle = $OrigPgTitle {*}
                     ChangeTitle 4 $StarredPgTitle
                     Set $StarredPgSet = 1
                  End
               End
               Else
               Begin
                  If $PageNo == 999 Then
                  Begin
                     Set $InitialPageNo = 999
                  End
                  If $PageNo == $InitialPageNo Then
                  Begin
                     ChangeTitle 4 $OrigPgTitle
                     Set $StarredPgSet = 0
                  End
               End
            End
         End

         If $MonitorsListValue > 0 Then
         Begin
            ChangeValue 6 $MonitorsListValue
         End
         Else
         Begin
            ChangeValue 6 $MonitorNo
         End

         Set $ChangeLocaleWindowTitle = (Gettext {Occupy Monitor})
         ChangeWindowTitle $ChangeLocaleWindowTitle
         Set $OpMode = 3
      End
End

# List of workspaces and/or pages
Widget 6
   Property
   Size 178 134
   Position 116 42
   Type List
   Flags NoReliefString
   Title {}
   Colorset 22
   Main
      Case message of
      SingleClic :
      Begin
         If $OpMode == 1 Then
         Begin
            # Set DeskNo for further processing
            Set $DeskNo = (GetValue 6)
            # Save selected item for putting it back when
            # mode is changed and then changed back
            Set $WorkspacesListValue = (GetValue 6)
         End
         If $OpMode == 2 Then
         Begin
            # Set PageNo for further processing
            Set $PageNo = (GetValue 6)

            # Set default here if $InitialPageNo was empty
            # $InitialPageNoSet serves as break
            If $InitialPageNoSet <> 1 Then
            Begin
               Set $InitialPageNo = $CurrentPageNum
               Set $InitialPageNoSet = 1
            End

            # Save selected item for putting it back when
            # mode is changed and then changed back
            Set $PagesListValue = (GetValue 6)
         End
         If $OpMode == 3 Then
         Begin
            # Set MonitorNo for further processing
            Set $MonitorNo = (GetValue 6)
         End
         # Main pick mode
         If $WinName == {} Then
         Begin
            Do {Pick () SendToModule Occupy SendString 1 4 $[w.id]}
         End
      End
      # Dispatcher for Up and Down on the list in workspaces and pages mode
      1 :
      Begin
         If $OpMode == 1 Then
         Begin
            SendSignal 6 2
         End
         If $OpMode == 2 Then
         Begin
            SendSignal 6 3
         End
         If $OpMode == 3 Then
         Begin
            SendSignal 6 4
         End
      End
      # Up and Down from keyboard on the list in workspaces mode
      2 :
      Begin
         If (LastString) == {Down} Then
         Begin
            If (GetValue 6) <= $DesksNo Then
            Begin
               Set $NextValue = (Add (GetValue 6) 1)
               ChangeValue 6 $NextValue
               Set $DeskNo = $NextValue
            End
            Else
            Begin
               ChangeValue 6 1
               Set $DeskNo = 1
            End
         End
         If (LastString) == {Up} Then
         Begin
               Set $PrevValue = (Add (GetValue 6) -1)
               If $PrevValue >= 1 Then
               Begin
                  ChangeValue 6 $PrevValue
                  Set $DeskNo = $PrevValue
               End
               Else
               Begin
                  Set $MaxDesksNoFromOne = (Add $DesksNo 1)
                  ChangeValue 6 $MaxDesksNoFromOne
                  Set $DeskNo = $MaxDesksNoFromOne
               End
         End
      End
      # Up and Down from keyboard on the list in pages mode
      3 :
      Begin
         If (LastString) == {Down} Then
         Begin
            If (GetValue 6) <= (Add $PagesNo -1) Then
            Begin
               Set $NextValue = (Add (GetValue 6) 1)
               ChangeValue 6 $NextValue
               Set $PageNo = $NextValue
            End
            Else
            Begin
               ChangeValue 6 1
               Set $PageNo = 1
            End
         End
         If (LastString) == {Up} Then
         Begin
            Set $PrevValue = (Add (GetValue 6) -1)
            If $PrevValue >= 1 Then
            Begin
               ChangeValue 6 $PrevValue
               Set $PageNo = $PrevValue
            End
            Else
            Begin
               ChangeValue 6 $PagesNo
               Set $PageNo = $PagesNo
            End
         End
      End
      # Up and Down from keyboard on the list in monitors mode
      4 :
      Begin
         If (LastString) == {Down} Then
         Begin
            If (GetValue 6) <= (Add $MonitorsNo -1) Then
            Begin
               Set $NextValue = (Add (GetValue 6) 1)
               ChangeValue 6 $NextValue
               Set $MonitorNo = $NextValue
            End
            Else
            Begin
               ChangeValue 6 1
               Set $MonitorNo = 1
            End
         End
         If (LastString) == {Up} Then
         Begin
            Set $PrevValue = (Add (GetValue 6) -1)
            If $PrevValue >= 1 Then
            Begin
               ChangeValue 6 $PrevValue
               Set $MonitorNo = $PrevValue
            End
            Else
            Begin
               ChangeValue 6 $MonitorsNo
               Set $MonitorNo = $MonitorsNo
            End
         End
      End
End

# All Workspaces / All Pages stickyness control
Widget 7
   Property
   Size 100 20
   Position 116 184
   Type CheckBox
   Value 0
   Flags NoReliefString
   Title { All Workspaces    }
   Font "xft:::pixelsize=15"
   Main
      Case message of
      SingleClic :
      Begin
         SendSignal 7 1
      End
      1 :
      Begin
         # Keyboard "A" handling
         # Workspaces mode
         If $OpMode == 1 Then
         Begin
            If (LastString) == {AllToggle} Then
            Begin
               If (GetValue 7) == 0 Then
               Begin
                  Set $AllWorkspaces = 1
               End
               Else
               Begin
                  Set $AllWorkspaces = 0
               End
               ChangeValue 7 $AllWorkspaces
            End
   
            # Called with click
            If (GetValue 7) == 1 Then
            Begin
               If $WinName == {} Then
               Begin
                  Do {Pick () SendToModule Occupy SendString 1 4 $[w.id]}
               End
   
               # Set DeskNo to 999 for sticky state, save old DeskNo into
               # OldDeskNo to get it back
               Set $OldDeskNo = $DeskNo
               Set $DeskNo = 999
               ChangeLocaleTitle 6 { All Workspaces    }
               ChangeValue 6 1
               Set $WorkspacesMode = {allworkspaces}
            End
            # Restore workspace states if sticky all workspaces is turned off
            If (GetValue 7) == 0 Then
            Begin
               ChangeTitle 6 $WorkSpaces
               ChangeValue 6 $OldDeskNo
               Set $DeskNo = $OldDeskNo
               Set $WorkspacesMode = {normal}
            End
            Set $AllWorkspaces = (GetValue 7)
         End

         # Keyboard "A" handling
         # Pages mode
         If $OpMode == 2 Then
         Begin
            If (LastString) == {AllToggle} Then
            Begin
               If (GetValue 7) == 0 Then
               Begin
                  Set $AllPages = 1
               End
               Else
               Begin
                  Set $AllPages = 0
               End
               ChangeValue 7 $AllPages
            End
   
            # Called with click
            If (GetValue 7) == 1 Then
            Begin
               If $WinName == {} Then
               Begin
                  Do {Pick () SendToModule Occupy SendString 1 4 $[w.id]}
               End
   
               # Set PageNo to 999 for sticky state, save old PageNo into
               # OldPageNo to get it back
               Set $OldPageNo = $PageNo
               Set $PageNo = 999
               ChangeLocaleTitle 6 { All Pages      }
               ChangeValue 6 1
               Set $PagesMode = {allpages}
            End
            # Restore page states if sticky all workspaces is turned off
            If (GetValue 7) == 0 Then
            Begin
               ChangeTitle 6 $Pages
               If $OldPageNo <> {} Then
               Begin
                  ChangeValue 6 $OldPageNo
               End
               Else
               Begin
                  Set $CurrentPageNumCmd = {$NSCDE_TOOLSDIR/mkpagemenu } $PageMatrixX { } $PageMatrixY { pgnum_pgid | grep ' } $PageX { } $PageY {$'}
                  Set $CurrentPageNum = (GetOutput $CurrentPageNumCmd 1 1)
                  ChangeValue 6 $CurrentPageNum
               End
               Set $PageNo = $OldPageNo
               Set $PagesMode = {normal}
            End
            Set $AllPages = (GetValue 7)
         End
      End
      # Small helpers for accepting internal SendToModule from Init for
      # sticky states handling
      2 :
      Begin
         Set $WorkspacesMode = {allworkspaces}
      End
      3 :
      Begin
         Set $PagesMode = {allpages}
      End
End

# Set "Go with the Window" property for OK button
Widget 8
   Property
   Size 100 20
   Position 116 214
   Type CheckBox
   Value 0
   Flags NoReliefString
   Title { Go with the Window}
   Font "xft:::pixelsize=15"
   Main
      Case message of
      SingleClic :
      Begin
         SendSignal 8 1
      End
      1 :
      Begin
         Set $GoWithWindow = 1
      End
End

Widget 9
   Property
   Size 298 1
   Position 2 248
   Type Rectangle
End

# Main action starter
Widget 10
   Property
   Size 80 20
   Position 8 262
   Type PushButton
   Flags NoReliefString
   LocaleTitle {OK}
   Font "xft:::pixelsize=15"
   Main
      Case message of
      SingleClic :
      Begin
         SendSignal 10 1
      End
      1 :
      Begin
         # Handle movement across monitors. This must come first because
         # it will clash and break if combined with page and desk movement
         # Occupy counts monitors from 1, while FVWM2 is doing this from 0
         # handle this situation.
         If $FvwmMajorVersion == 3 Then
         Begin
            Set $UniMonitorNo = $MonitorNo
         End
         Else
         Begin
            Set $UniMonitorNo = (Add $MonitorNo -1)
         End
         If $UniMonitorNo <> $InitialMonitorNo Then
         Begin
            # Ugly, but we need to know monitor name for FVWM3.
            Set $MonitorNameCmd = {echo '} $Monitors {' | tr '|' '\n' | egrep -n '' | sed 's/:/ /' | sed 's/^[[:digit:]] //'}
            Set $MonitorName = (GetOutput $MonitorNameCmd (GetValue 6) -1)

            If $GoWithWindow == 0 Then
            Begin
               If $FvwmMajorVersion == 3 Then
               Begin
                  Do {f_Occupy } $WinId { MoveToScreen } $MonitorName { Nop }
               End
               Else
               Begin
                  Do {f_Occupy } $WinId { MoveToScreen } $UniMonitorNo { Nop }
               End
            End
            Else
            Begin
               If $FvwmMajorVersion == 3 Then
               Begin
                  Do {f_Occupy } $WinId { MoveToScreen } $MonitorName { Nop }
               End
               Else
               Begin
                  Do {f_Occupy } $WinId { MoveToScreen } $UniMonitorNo { Nop }
               End
               # Disable GoWithWindow if crossing monitors, so GotoPage and GotoDesk
               # will not break action.
               Set $GoWithWindow = 0
               Do {Schedule 250 WindowId } $WinId { WarpToWindow 50 50}
            End
         End

         # If pages are not sticky ...
         If $PageNo <> 999 Then
         Begin
            Set $CurrentPageCmd = {$NSCDE_TOOLSDIR/mkpagemenu } $PageMatrixX { } $PageMatrixY { pgnum_pgid | grep '^} $PageNo { '}
            Set $CurrentPage = (GetOutput $CurrentPageCmd 1 -1)

            # Page info from list is empty - no $PageNo. Populate it with grepping pages X and Y strings to wind value id.
            If $CurrentPage == {} Then
            Begin
               Set $CurrentPageCmd = {$NSCDE_TOOLSDIR/mkpagemenu }
                   $PageMatrixX { } $PageMatrixY { pgnum_pgid | egrep '^[[:digit:]][[:space:]]} $PageX {[[:space:]]} $PageY {'}
               Set $CurrentPage = (GetOutput $CurrentPageCmd 1 -1)
            End

            Set $CurrentPageX = (StrCopy $CurrentPage 3 3)
            Set $CurrentPageY = (StrCopy $CurrentPage 5 5)
            If $CurrentPageX == { } Then
            Begin
               Set $CurrentPageX = (StrCopy $CurrentPage 4 4)
            End
            If $CurrentPageY == { } Then
            Begin
               Set $CurrentPageY = (StrCopy $CurrentPage 6 6)
            End

            If $GoWithWindow == 0 Then
            Begin
               Do {f_Occupy } $WinId { MoveToPage } $CurrentPageX { } $CurrentPageY { Nop }
            End
            Else
            Begin
               Do {f_Occupy } $WinId { MoveToPage } $CurrentPageX { } $CurrentPageY { GoToPage }
            End
         End

         # If workspaces are not sticky
         If $DeskNo <> 999 Then
         Begin
            If $GoWithWindow == 0 Then
            Begin
               Do {f_Occupy } $WinId { MoveToDesk 0 } (Add $DeskNo -1) { Nop }
            End
            Else
            Begin
               Do {f_Occupy } $WinId { MoveToDesk 0 } (Add $DeskNo -1) { GoToDesk }
            End
         End

         # If desks are sticky
         If $DeskNo == 999 Then
         Begin
            Do {WindowId } $WinId { StickAcrossDesks True}
         End

         # If pages are sticky
         If $PageNo == 999 Then
         Begin
            Do {WindowId } $WinId { StickAcrossPages True}
         End

         Quit
      End
End

# Quit button
Widget 11
   Property
   Size 80 20
   Position 110 262
   Type PushButton
   LocaleTitle {Dismiss}
   Font "xft:::pixelsize=15"
   Flags NoReliefString
   Main
      Case message of
      SingleClic :
      Begin
         Quit
      End
      1 :
      Begin
         Set $qstr = (LastString)
         If $qstr == {Quit} Then
         Begin
            Quit
         End
      End
End

# Help button
Widget 12
   Property
   Size 80 20
   Position 212 262
   Type PushButton
   LocaleTitle {Help}
   Font "xft:::pixelsize=15"
   Flags NoReliefString
   Main
      Case message of
      SingleClic :
      Begin
         SendSignal 12 1
      End
      1 :
      Begin
         Do {f_DisplayURL "$[gt.Occupy Workspace]" html/NsCDE-Occupy.html}
      End
End

