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

UseGettext {$NSCDE_ROOT/share/locale;NsCDE-WSM}
WindowTitle {WSM}
WindowSize 260 70
Colorset 52

Init
Begin
   # Argv 1 == Number of desks
   # Argv 2 == Number of pages
   Set $DeskNo = (GetScriptArgument 1)
   Set $PageMatrixX = (GetScriptArgument 2)
   Set $PageMatrixY = (GetScriptArgument 3)
   Set $PagesXY = $PageMatrixX {x} $PageMatrixY

   # Nothing to do if $DeskNo < 2 (Sandbox mode?), exit program
   If $DeskNo < 2 Then
   Begin
      Quit
   End

   # Default DeskNo and PageNo
   If $DeskNo == {} Then
   Begin
      Do {Echo Warning: DeskNo and/or PageNo are not set. Using 4 as default.}
      Set $DeskNo = 4
      Set $PageMatrixX = 2
      Set $PageMatrixY = 2
   End

   # Multiply Pages X and Y to get number of pages
   Set $PageNo = (Mult $PageMatrixX $PageMatrixY)

   # For debugging and development
   # Set $DeskNo = 2
   # Set $DeskNo = 4
   # Set $DeskNo = 6
   # Set $DeskNo = 8

   # Configuration file
   Set $ConfFile = {$FVWM_USERDIR/WSM.conf}

   # Font size/type setup
   If $DeskNo < 8 Then
   Begin
      If $DeskNo > 4 Then
      Begin
         # Font for 6 buttons variant
         Set $MainFontRegularOut = (GetOutput {$NSCDE_TOOLSDIR/getfont -v -t normal -s medium -Z 16} 1 -1)
      End
      Else
      Begin
         # Font for 2 and/or 4 buttons variant
         Set $MainFontRegularOut = (GetOutput {$NSCDE_TOOLSDIR/getfont -v -t normal -s large -Z 16} 1 -1)
      End
   End
   Else
   Begin
      # Font for 8 or more buttons variant
      Set $MainFontRegularOut = (GetOutput {$NSCDE_TOOLSDIR/getfont -v -t normal -s small -Z 12} 1 -1)
   End
   Set $MainFontRegular = {Shadow=1 0 SE:} $MainFontRegularOut

   # Button names for desks
   Set $btnname = 0
   While $btnname < $DeskNo Do
   Begin
      Set $btnname = (Add $btnname 1) 
      Set $NameDeskOut = {egrep '^WSP:} $btnname {:.*' "} $ConfFile {" 2>/dev/null | cut -d":" -f3 | tail -1}
      Set $NameDesk = (GetOutput $NameDeskOut 1 -1)

      # Populate runtime info about workspaces.
      # WSM.conf will be written if some workspace is renamed.
      If $NameDesk == {} Then
      Begin
         If $btnname == 1 Then
            Set $NameDesk = (Gettext {One})
         If $btnname == 2 Then
            Set $NameDesk = (Gettext {Two})
         If $btnname == 3 Then
            Set $NameDesk = (Gettext {Three})
         If $btnname == 4 Then
            Set $NameDesk = (Gettext {Four})
         If $btnname == 5 Then
            Set $NameDesk = (Gettext {Five})
         If $btnname == 6 Then
            Set $NameDesk = (Gettext {Six})
         If $btnname == 7 Then
            Set $NameDesk = (Gettext {Seven})
         If $btnname == 8 Then
            Set $NameDesk = (Gettext {Eight})
      End

      # Button Menu
      Set $NameDeskStr = { } $NameDesk {|} (Gettext {Workspace}) { } $NameDesk {:} (Gettext {|Rename ...|Manage ...|Go to Page ...|Local Pager|Windows ...})

      ChangeFont $btnname $MainFontRegular
      ChangeTitle $btnname $NameDeskStr

      # Refresh runtime
      Do {DesktopName } (Add $btnname -1) { } $NameDesk

      If $btnname == 1 Then
         ChangeColorset $btnname 40
      If $btnname == 2 Then
         ChangeColorset $btnname 42
      If $btnname == 3 Then
         ChangeColorset $btnname 44
      If $btnname == 4 Then
         ChangeColorset $btnname 46
      If $btnname == 5 Then
         ChangeColorset $btnname 40
      If $btnname == 6 Then
         ChangeColorset $btnname 42
      If $btnname == 7 Then
         ChangeColorset $btnname 44
      If $btnname == 8 Then
         ChangeColorset $btnname 46
   End

   Do {f_SendToPGM}
   Do {SendToModule WSM SendString 40 10 $[desk.n]$[page.nx]$[page.ny]}

   # Shortcut keys for renaming desks
   Key Space C 41 2 {EnterRename}
   Key Return C 41 3 {ReturnFromRename}
   Key F1 A 41 6 {KeyHelp}
   Key Help A 41 6 {KeyHelp}

   # Button number and position setup according to DeskNo
   SendSignal 41 1

   # For avoiding turned on button when past button was active and pressed again
   # Value: Desk Button Number. Start value is meaningless.
   Set $BtnPressed = 0

   # Set background color (widget 30) to colorset 22 if $[infostore.wsmcolored] is 1
   Do {Test (EnvMatch infostore.wsmcolored 1) SendToModule WSM SendString 30 1 wsmcolored}

   # Used in routine 2: of Widget 30:
   # Set selected border sizes and positions for all possible
   # desk combinations which can be configured for WSM.
   If $DeskNo < 4 Then
   Begin
      Set $SelectDeskSizeH = 256
      Set $SelectDeskSizeV = 30

      Set $SelectPos1H = 2
      Set $SelectPos1V = 4
      Set $SelectPos2H = 2
      Set $SelectPos2V = 37
   End

   If $DeskNo == 4 Then
   Begin
      Set $SelectDeskSizeH = 128
      Set $SelectDeskSizeV = 32

      Set $SelectPos1H = 0
      Set $SelectPos1V = 1
      Set $SelectPos2H = 132
      Set $SelectPos2V = 1
      Set $SelectPos3H = 0
      Set $SelectPos3V = 36
      Set $SelectPos4H = 132
      Set $SelectPos4V = 36
   End

   If $DeskNo == 6 Then
   Begin
      Set $SelectDeskSizeH = 86
      Set $SelectDeskSizeV = 30

      Set $SelectPos1H = 0
      Set $SelectPos1V = 3
      Set $SelectPos2H = 87
      Set $SelectPos2V = 3
      Set $SelectPos3H = 174
      Set $SelectPos3V = 3
      Set $SelectPos4H = 0
      Set $SelectPos4V = 36
      Set $SelectPos5H = 87
      Set $SelectPos5V = 36
      Set $SelectPos6H = 174
      Set $SelectPos6V = 36
   End

   If $DeskNo == 8 Then
   Begin
      Set $SelectDeskSizeH = 64
      Set $SelectDeskSizeV = 30

      Set $SelectPos1H = 0
      Set $SelectPos1V = 3
      Set $SelectPos2H = 65
      Set $SelectPos2V = 3
      Set $SelectPos3H = 130
      Set $SelectPos3V = 3
      Set $SelectPos4H = 195
      Set $SelectPos4V = 3
      Set $SelectPos5H = 0
      Set $SelectPos5V = 37
      Set $SelectPos6H = 65
      Set $SelectPos6V = 37
      Set $SelectPos7H = 130
      Set $SelectPos7V = 37
      Set $SelectPos8H = 195
      Set $SelectPos8V = 37
   End

   # Prepare selector widget for $DeskNo configuration.
   ChangeSize 31 $SelectDeskSizeH $SelectDeskSizeV
End

# Worker widget 30
# 1 :
# If $[infostore.wsmcolored] is set, this will be activated
# so Workspace Manager will be colored with colorset 22 as
# this is the case in some historical visual appereances
# of CDE. String "wsmcolored" sets colorset to 22, while
# string if received, reverts to colorset 23.
#
# 2 :
# Set hilighted desk button, restore previous hilighted.
#
# 3 :
# Called by PushButton 1-8 clicks to trigger select
Widget 30
Property
    Flags NoReliefString NoFocus
    Position 0 0
    Size 260 70
    Type ItemDraw
    Title {}
    Colorset 23
    Main
       Case message of
       1 :
       Begin
          If (LastString) == {wsmcolored} Then
          Begin
             ChangeColorset 30 22
          End
          If (LastString) == {wsmclassic} Then
          Begin
             ChangeColorset 30 23
          End
       End
       2 :
       Begin
          If (LastString) == {unclick} Then
          Begin
             # Moving select frame (Widget 31 across buttons)
             If $CurrDesk == 1 Then
                ChangePosition 31 $SelectPos1H $SelectPos1V
             If $CurrDesk == 2 Then
                ChangePosition 31 $SelectPos2H $SelectPos2V
             If $CurrDesk == 3 Then
                ChangePosition 31 $SelectPos3H $SelectPos3V
             If $CurrDesk == 4 Then
                ChangePosition 31 $SelectPos4H $SelectPos4V
             If $CurrDesk == 5 Then
                ChangePosition 31 $SelectPos5H $SelectPos5V
             If $CurrDesk == 6 Then
                ChangePosition 31 $SelectPos6H $SelectPos6V
             If $CurrDesk == 7 Then
                ChangePosition 31 $SelectPos7H $SelectPos7V
             If $CurrDesk == 8 Then
                ChangePosition 31 $SelectPos8H $SelectPos8V

             ShowWidget 31
          End
          If (LastString) == {unselect} Then
          Begin
             HideWidget 31
          End
       End
       3 :
       Begin
          Do {f_ClearFrontPanelPressed}
          Do {Schedule 10 InfoStoreAdd fplastpressed FpWSM}
          Do {f_UnclickScript 50 WSM 30 2 unclick}
       End
End

# Select frame around PushButton. Moved around and resized by routines in widget 30.
Widget 31
Property
    Position 0 0
    Size 127 30
    Type ItemDraw
    Title {}
    Flags NoReliefString Hidden NoFocus
    Colorset 2
End

Widget 21
Property
    Flags NoReliefString NoFocus
    Position 1 2
    Size 126 29
    Type ItemDraw
    Title {}
    Icon NsCDE/WSM4BackBtn1.xpm
    Colorset 53
End

Widget 22
Property
    Flags NoReliefString NoFocus
    Position 133 2
    Size 126 29
    Type ItemDraw
    Title {}
    Icon NsCDE/WSM4BackBtn2.xpm
    Colorset 53
End

Widget 23
Property
    Flags NoReliefString NoFocus
    Position 1 37
    Size 126 29
    Type ItemDraw
    Title {}
    Icon NsCDE/WSM4BackBtn3.xpm
    Colorset 53
End

Widget 24
Property
    Flags NoReliefString NoFocus
    Position 133 37
    Size 126 29
    Type ItemDraw
    Title {}
    Icon NsCDE/WSM4BackBtn4.xpm
    Colorset 53
End

Widget 25
Property
    Flags NoReliefString Hidden NoFocus
    Position 1 38
    Size 64 29
    Type ItemDraw
    Title {}
    Icon NsCDE/WSM6BackBtn1.xpm
    Colorset 53
End

Widget 26
Property
    Flags NoReliefString Hidden NoFocus
    Position 66 38
    Size 61 29
    Type ItemDraw
    Title {}
    Icon NsCDE/WSM6BackBtn2.xpm
    Colorset 53
End

Widget 27
Property
    Flags NoReliefString Hidden NoFocus
    Position 131 38
    Size 62 29
    Type ItemDraw
    Title {}
    Icon NsCDE/WSM8BackBtn3.xpm
    Colorset 53
End

Widget 28
Property
    Flags NoReliefString Hidden NoFocus
    Position 196 38
    Size 62 29
    Type ItemDraw
    Title {}
    Icon NsCDE/WSM8BackBtn4.xpm
    Colorset 53
End

Widget 1
Property
    Position 2 3
    Size 124 26
    Type PushButton
    Title {||||||}
    Flags NoReliefString Left
    Colorset 1
    Font "xft:::pixelsize=14"
    Main
       Case message of
       SingleClic :
       Begin
          SendSignal 30 3

          If (GetValue 1) == 1 Then
          Begin
             If $BtnPressed == 1 Then
             Begin
                Do {SendToModule WSM SendString 40 10 $[desk.n]$[page.nx]$[page.ny]}
             End
             Set $BtnPressed = 1
             ChangeColorset 1 41
             If $CurrDesk <> $BtnPressed Then
             Begin
                Do {f_GotoDeskAndPage 0 } (Add $BtnPressed -1)
             End
             Else
             Begin
                Do {f_SameWspActionForWSM}
             End
          End
          Else
          Begin
             Do {SendToModule WSM SendString 41 4 } (GetValue 1) { 1 }
             ChangeColorset 1 40
          End
       End
End

Widget 2
Property
    Position 134 3
    Size 124 26
    Type PushButton
    Title {||||||}
    Flags NoReliefString Left
    Colorset 1
    Font "xft:::pixelsize=14"
    Main
       Case message of
       SingleClic :
       Begin
          SendSignal 30 3

          If (GetValue 2) == 1 Then
          Begin
             If $BtnPressed == 2 Then
             Begin
                Do {SendToModule WSM SendString 40 10 $[desk.n]$[page.nx]$[page.ny]}
             End
             Set $BtnPressed = 2
             ChangeColorset 2 43
             If $CurrDesk <> $BtnPressed Then
             Begin
                Do {f_GotoDeskAndPage 0 } (Add $BtnPressed -1)
             End
             Else
             Begin
                Do {f_SameWspActionForWSM}
             End
          End
          Else
          Begin
             Do {SendToModule WSM SendString 41 4 } (GetValue 2) { 2 }
             ChangeColorset 2 42
          End
       End
End

Widget 3
Property
    Position 2 38
    Size 124 26
    Type PushButton
    Title {||||||}
    Flags NoReliefString Left
    Colorset 1
    Font "xft:::pixelsize=14"
    Main
       Case message of
       SingleClic :
       Begin
          SendSignal 30 3

          If (GetValue 3) == 1 Then
          Begin
             If $BtnPressed == 3 Then
             Begin
                Do {SendToModule WSM SendString 40 10 $[desk.n]$[page.nx]$[page.ny]}
             End
             Set $BtnPressed = 3
             ChangeColorset 3 45
             If $CurrDesk <> $BtnPressed Then
             Begin
                Do {f_GotoDeskAndPage 0 } (Add $BtnPressed -1)
             End
             Else
             Begin
                Do {f_SameWspActionForWSM}
             End
          End
          Else
          Begin
             Do {SendToModule WSM SendString 41 4 } (GetValue 3) { 3 }
             ChangeColorset 3 44
          End
       End
End

Widget 4
Property
    Position 134 38
    Size 124 26
    Type PushButton
    Title {||||||}
    Flags NoReliefString Left
    Colorset 1
    Font "xft:::pixelsize=14"
    Main
       Case message of
       SingleClic :
       Begin
          SendSignal 30 3

          If (GetValue 4) == 1 Then
          Begin
             If $BtnPressed == 4 Then
             Begin
                Do {SendToModule WSM SendString 40 10 $[desk.n]$[page.nx]$[page.ny]}
             End
             Set $BtnPressed = 4
             ChangeColorset 4 47
             If $CurrDesk <> $BtnPressed Then
             Begin
                Do {f_GotoDeskAndPage 0 } (Add $BtnPressed -1)
             End
             Else
             Begin
                Do {f_SameWspActionForWSM}
             End
          End
          Else
          Begin
             Do {SendToModule WSM SendString 41 4 } (GetValue 4) { 4 }
             ChangeColorset 4 46
          End
       End
End

Widget 5
Property
    Position 2 39
    Size 60 26
    Type PushButton
    Title {||||||}
    Flags NoReliefString Hidden Left
    Colorset 1
    Font "xft:::pixelsize=14"
    Main
       Case message of
       SingleClic :
       Begin
          SendSignal 30 3

          If (GetValue 5) == 1 Then
          Begin
             If $BtnPressed == 5 Then
             Begin
                Do {SendToModule WSM SendString 40 10 $[desk.n]$[page.nx]$[page.ny]}
             End
             Set $BtnPressed = 5
             ChangeColorset 5 41
             If $CurrDesk <> $BtnPressed Then
             Begin
                Do {f_GotoDeskAndPage 0 } (Add $BtnPressed -1)
             End
             Else
             Begin
                Do {f_SameWspActionForWSM}
             End
          End
          Else
          Begin
             Do {SendToModule WSM SendString 41 4 } (GetValue 5) { 5 }
             ChangeColorset 5 40
          End
       End
End

Widget 6
Property
    Position 67 39
    Size 60 26
    Type PushButton
    Title {||||||}
    Flags NoReliefString Hidden Left
    Colorset 1
    Font "xft:::pixelsize=14"
    Main
       Case message of
       SingleClic :
       Begin
          SendSignal 30 3

          If (GetValue 6) == 1 Then
          Begin
             If $BtnPressed == 6 Then
             Begin
                Do {SendToModule WSM SendString 40 10 $[desk.n]$[page.nx]$[page.ny]}
             End
             Set $BtnPressed = 6
             ChangeColorset 6 43
             If $CurrDesk <> $BtnPressed Then
             Begin
                Do {f_GotoDeskAndPage 0 } (Add $BtnPressed -1)
             End
             Else
             Begin
                Do {f_SameWspActionForWSM}
             End
          End
          Else
          Begin
             Do {SendToModule WSM SendString 41 4 } (GetValue 6) { 6 }
             ChangeColorset 6 42
          End
       End
End

Widget 7
Property
    Position 132 39
    Size 60 26
    Type PushButton
    Title {||||||}
    Flags NoReliefString Hidden Left
    Colorset 1
    Font "xft:::pixelsize=14"
    Main
       Case message of
       SingleClic :
       Begin
          SendSignal 30 3

          If (GetValue 7) == 1 Then
          Begin
             If $BtnPressed == 7 Then
             Begin
                Do {SendToModule WSM SendString 40 10 $[desk.n]$[page.nx]$[page.ny]}
             End
             Set $BtnPressed = 7
             ChangeColorset 7 45
             If $CurrDesk <> $BtnPressed Then
             Begin
                Do {f_GotoDeskAndPage 0 } (Add $BtnPressed -1)
             End
             Else
             Begin
                Do {f_SameWspActionForWSM}
             End
          End
          Else
          Begin
             Do {SendToModule WSM SendString 41 4 } (GetValue 7) { 7 }
             ChangeColorset 7 44
          End
       End
End

Widget 8
Property
    Position 197 39
    Size 60 26
    Type PushButton
    Title {||||||}
    Flags NoReliefString Hidden Left
    Colorset 1
    Font "xft:::pixelsize=14"
    Main
       Case message of
       SingleClic :
       Begin
          SendSignal 30 3

          If (GetValue 8) == 1 Then
          Begin
             If $BtnPressed == 8 Then
             Begin
                Do {SendToModule WSM SendString 40 10 $[desk.n]$[page.nx]$[page.ny]}
             End
             Set $BtnPressed = 8
             ChangeColorset 8 47
             If $CurrDesk <> $BtnPressed Then
             Begin
                Do {f_GotoDeskAndPage 0 } (Add $BtnPressed -1)
             End
             Else
             Begin
                Do {f_SameWspActionForWSM}
             End
          End
          Else
          Begin
             Do {SendToModule WSM SendString 41 4 } (GetValue 8) { 8 }
             ChangeColorset 8 46
          End
       End
End

Widget 40
Property
    Flags NoReliefString Hidden NoFocus
    Position 0 0
    Size 32 32
    Type PushButton
    Title {}
    Main
    Case message of
    10 :
       Begin
          Set $DeskPageStr = (LastString)

          Set $CurrDesk = (Add (StrCopy $DeskPageStr 1 1) 1)
          Set $CurrPage = (StrCopy $DeskPageStr 2 3)

          Set $deskiter = 0
          While $deskiter < $DeskNo Do
          Begin
             Set $deskiter = (Add $deskiter 1)
             If $deskiter == $CurrDesk Then
             Begin
                If (GetValue $deskiter) == 0 Then
                Begin
                   If $deskiter == 1 Then
                      ChangeColorset $deskiter 41
                   If $deskiter == 2 Then
                      ChangeColorset $deskiter 43
                   If $deskiter == 3 Then
                      ChangeColorset $deskiter 45
                   If $deskiter == 4 Then
                      ChangeColorset $deskiter 47
                   If $deskiter == 5 Then
                      ChangeColorset $deskiter 41
                   If $deskiter == 6 Then
                      ChangeColorset $deskiter 43
                   If $deskiter == 7 Then
                      ChangeColorset $deskiter 45
                   If $deskiter == 8 Then
                      ChangeColorset $deskiter 47

                   ChangeValue $deskiter 1
                End
             End
             Else
             Begin
                If (GetValue $deskiter) == 1 Then
                Begin
                   If $deskiter == 1 Then
                      ChangeColorset $deskiter 40
                   If $deskiter == 2 Then
                      ChangeColorset $deskiter 42
                   If $deskiter == 3 Then
                      ChangeColorset $deskiter 44
                   If $deskiter == 4 Then
                      ChangeColorset $deskiter 46
                   If $deskiter == 5 Then
                      ChangeColorset $deskiter 40
                   If $deskiter == 6 Then
                      ChangeColorset $deskiter 42
                   If $deskiter == 7 Then
                      ChangeColorset $deskiter 44
                   If $deskiter == 8 Then
                      ChangeColorset $deskiter 46

                   ChangeValue $deskiter 0
                End
             End
          End
  End
End

Widget 41
Property
    Position 2 3
    Size 124 0
    Type TextField
    Title {}
    Flags NoReliefString Left Hidden
    Colorset 20
    Main
       Case message of
       1 :
       Begin
          If $DeskNo == 2 Then
          Begin
             # Hide buttons 3-4 - Resize and move remaining
             HideWidget 3
             HideWidget 4
             HideWidget 23
             HideWidget 24

             ChangeIcon 21 NsCDE/WSM2BackBtn1.xpm
             ChangeIcon 22 NsCDE/WSM2BackBtn2.xpm
             ChangeSize 1 252 26
             ChangeSize 21 254 28
             ChangeSize 2 252 26
             ChangeSize 22 254 28
             ChangePosition 1 4 6
             ChangePosition 2 4 39
             ChangePosition 21 3 5
             ChangePosition 22 3 38
          End

          If $DeskNo == 4 Then
          Begin
          End

          If $DeskNo == 6 Then
          Begin
             # Buttons 1-4 - Resize and move existing
             # Show additional two
             ChangeSize 1 82 26
             ChangeSize 2 82 26
             ChangeSize 3 82 26
             ChangeSize 4 82 26
             ChangePosition 1 2 5
             ChangePosition 2 89 5
             ChangePosition 3 176 5
             ChangePosition 4 2 38

             ShowWidget 5
             ShowWidget 6
             ChangeSize 5 82 26
             ChangeSize 6 82 26
             ChangePosition 5 89 38
             ChangePosition 6 176 38

             # Shadows 1-4 - Resize and move existing 
             # Show additional two
             ChangeIcon 21 NsCDE/WSM6BackBtn1.xpm
             ChangeIcon 22 NsCDE/WSM6BackBtn2.xpm
             ChangeIcon 23 NsCDE/WSM6BackBtn3.xpm
             ChangeIcon 24 NsCDE/WSM6BackBtn4.xpm
             ChangeSize 21 84 28
             ChangeSize 22 84 28
             ChangeSize 23 84 28
             ChangeSize 24 84 28
             ChangePosition 21 1 4
             ChangePosition 22 88 4
             ChangePosition 23 175 4
             ChangePosition 24 1 37

             ShowWidget 25
             ShowWidget 26

             ChangeSize 25 84 28
             ChangeSize 26 84 28
             ChangePosition 25 88 37
             ChangePosition 26 175 37
          End

          If $DeskNo == 8 Then
          Begin
             # Shadows 1-4 - Resize and move existing 
             # Show additional four
             ChangeSize 1 60 26
             ChangeSize 2 60 26
             ChangeSize 3 60 26
             ChangeSize 4 60 26
             ChangeSize 5 60 26
             ChangeSize 6 60 26
             ChangeSize 7 60 26
             ChangeSize 8 60 26
             ChangePosition 1 2 5
             ChangePosition 2 67 5
             ChangePosition 3 132 5
             ChangePosition 4 197 5

             ShowWidget 5
             ShowWidget 6
             ShowWidget 7
             ShowWidget 8

             # Buttons 1-4 - Resize and move existing
             # Show additional four
             ChangeIcon 21 NsCDE/WSM8BackBtn1.xpm
             ChangeIcon 22 NsCDE/WSM8BackBtn2.xpm
             ChangeIcon 23 NsCDE/WSM8BackBtn3.xpm
             ChangeIcon 24 NsCDE/WSM8BackBtn4.xpm
             ChangeIcon 25 NsCDE/WSM8BackBtn1.xpm
             ChangeIcon 26 NsCDE/WSM8BackBtn2.xpm

             ChangeSize 21 62 28
             ChangeSize 22 62 28
             ChangeSize 23 62 28
             ChangeSize 24 62 28
             ChangeSize 25 62 28
             ChangeSize 26 62 28
             ChangeSize 27 62 28
             ChangeSize 28 62 28
             ChangePosition 21 1 4
             ChangePosition 22 66 4
             ChangePosition 23 131 4
             ChangePosition 24 196 4

             ShowWidget 25
             ShowWidget 26
             ShowWidget 27
             ShowWidget 28
          End
       End

       2 : 
       Begin
          # Return $DeskToRename to initial signal, see "41 4 :" ...
          If $DeskToRename <> {} Then
          Begin
             Set $CurrDesk = $DeskToRename
          End

          If $DeskNo == 2 Then
          Begin
             ChangeSize 41 252 26

             If $CurrDesk == 1 Then
             Begin
                ChangePosition 41 4 6
                ChangeColorset 1 20
             End
             If $CurrDesk == 2 Then
             Begin
                ChangePosition 41 4 39
                ChangeColorset 2 20
             End
          End

          If $DeskNo == 4 Then
          Begin
             ChangeSize 41 124 28

             If $CurrDesk == 1 Then
             Begin
                ChangePosition 41 2 3
                ChangeColorset 1 20
             End
             If $CurrDesk == 2 Then
             Begin
                ChangePosition 41 134 3
                ChangeColorset 2 20
             End
             If $CurrDesk == 3 Then
             Begin
                ChangePosition 41 2 38
                ChangeColorset 3 20
             End
             If $CurrDesk == 4 Then
             Begin
                ChangePosition 41 134 38
                ChangeColorset 4 20
             End
          End

          If $DeskNo == 6 Then
          Begin
             ChangeSize 41 82 26

             If $CurrDesk == 1 Then
             Begin
                ChangePosition 41 2 5
                ChangeColorset 1 20
             End
             If $CurrDesk == 2 Then
             Begin
                ChangePosition 41 89 5
                ChangeColorset 2 20
             End
             If $CurrDesk == 3 Then
             Begin
                ChangePosition 41 176 5
                ChangeColorset 3 20
             End
             If $CurrDesk == 4 Then
             Begin
                ChangePosition 41 2 38
                ChangeColorset 4 20
             End
             If $CurrDesk == 5 Then
             Begin
                ChangePosition 41 89 38
                ChangeColorset 5 20
             End
             If $CurrDesk == 6 Then
             Begin
                ChangePosition 41 176 38
                ChangeColorset 6 20
             End
          End

          If $DeskNo == 8 Then
          Begin
             ChangeSize 41 60 26

             If $CurrDesk == 1 Then
             Begin
                ChangePosition 41 2 5
                ChangeColorset 1 20
             End
             If $CurrDesk == 2 Then
             Begin
                ChangePosition 41 67 5
                ChangeColorset 2 20
             End
             If $CurrDesk == 3 Then
             Begin
                ChangePosition 41 132 5
                ChangeColorset 3 20
             End
             If $CurrDesk == 4 Then
             Begin
                ChangePosition 41 197 5
                ChangeColorset 4 20
             End
             If $CurrDesk == 5 Then
             Begin
                ChangePosition 41 2 39
                ChangeColorset 5 20
             End
             If $CurrDesk == 6 Then
             Begin
                ChangePosition 41 67 39
                ChangeColorset 6 20
             End
             If $CurrDesk == 7 Then
             Begin
                ChangePosition 41 132 39
                ChangeColorset 7 20
             End
             If $CurrDesk == 8 Then
             Begin
                ChangePosition 41 197 39
                ChangeColorset 8 20
             End
          End

          ShowWidget 41
          Do {Module FvwmScript WaitNotice "$[gt.Front Panel Information]" "$[gt.Press] Ctrl+Return $[gt.to finish rename action]" "$[gt.and return to normal mode.]" 5000}
          Do {Schedule 400 All (FvwmButtons, FrontPanel, CirculateHit) Focus}
          # Nasty workaround because ForeColor of the TextField widget is not applied
          # and global value is used anyway. See Widget 42 for what is done with this
          # dummy calls.
          Do {Schedule 50 SendToModule $[infostore.WSM] SendString 41 7 workaround}
          Do {Schedule 250 SendToModule $[infostore.WSM] SendString 41 7 workaround}
          Do {Schedule 350 SendToModule $[infostore.WSM] SendString 41 7 workaround}
       End

       3 :
       Begin
          If (GetTitle 41) <> {} Then
          Begin
             Set $NewButtonLabelOut = {echo '} (GetTitle 41) {' | sed 's/://g; s/|//g; s/\$//' | tr -d '[:cntrl:]'; echo}
             Set $NewButtonLabel = (GetOutput $NewButtonLabelOut 1 -1)
             Set $OldButtonLabelOut = {egrep 'WSP:} $CurrDesk {:.*' "} $ConfFile {" 2>/dev/null}
             Set $OldButtonLabel = (GetOutput $OldButtonLabelOut 1 -1)

             If $OldButtonLabel == {} Then
             Begin
                Do {Exec exec echo 'WSP:} $CurrDesk {:} $NewButtonLabel {' >> "} $ConfFile {"}
             End
             Else
             Begin
                Do {Exec exec $[NSCDE_TOOLSDIR]/ised -c 's/^WSP:} $CurrDesk {:.*/WSP:} $CurrDesk {:} $NewButtonLabel {/g' -f "} $ConfFile {"}
             End
             Set $ShiftNewLabel = { } $NewButtonLabel (Gettext {|Workspace}) { } $NewButtonLabel (Gettext {:|Rename ...|Manage ...|Go to Page ...|Local Pager|Windows ...})
             ChangeTitle $CurrDesk $ShiftNewLabel

             If $DeskToRename == {} Then
             Begin
                If $CurrDesk == 1 Then
                   ChangeColorset $CurrDesk 41
                If $CurrDesk == 2 Then
                   ChangeColorset $CurrDesk 43
                If $CurrDesk == 3 Then
                   ChangeColorset $CurrDesk 45
                If $CurrDesk == 4 Then
                   ChangeColorset $CurrDesk 47
                If $CurrDesk == 5 Then
                   ChangeColorset $CurrDesk 41
                If $CurrDesk == 6 Then
                   ChangeColorset $CurrDesk 43
                If $CurrDesk == 7 Then
                   ChangeColorset $CurrDesk 45
                If $CurrDesk == 8 Then
                   ChangeColorset $CurrDesk 47
             End
             Else
             Begin
                If $CurrDesk == 1 Then
                   ChangeColorset $CurrDesk 40
                If $CurrDesk == 2 Then
                   ChangeColorset $CurrDesk 42
                If $CurrDesk == 3 Then
                   ChangeColorset $CurrDesk 44
                If $CurrDesk == 4 Then
                   ChangeColorset $CurrDesk 46
                If $CurrDesk == 5 Then
                   ChangeColorset $CurrDesk 40
                If $CurrDesk == 6 Then
                   ChangeColorset $CurrDesk 42
                If $CurrDesk == 7 Then
                   ChangeColorset $CurrDesk 44
                If $CurrDesk == 8 Then
                   ChangeColorset $CurrDesk 46

                # Update buttons press state as if pressed.
                Do {SendToModule WSM SendString 40 10 $[desk.n]$[page.nx]$[page.ny]}
             End

             ChangeTitle 41 {}
          End

          HideWidget 41
          Set $DeskToRename = {}

          # Update runtime.
          Do {DesktopName } (Add $CurrDesk -1) { } $NewButtonLabel
       End

       4 :
       Begin
          Set $NextDesk = (Add (StrCopy (LastString) 3 99) -1)
          Set $Action = (Add (StrCopy (LastString) 1 2) -1)
          If $Action == 1 Then
          Begin
             # $DeskToRename is somehow $NextDesk + 1, but not for GotoDesk
             Set $DeskToRename = (Add $NextDesk 1)
             Do {Next (FrontPanel, CirculateHit) Focus}
             # Do {GotoDesk 0 } $NextDesk
             WarpPointer $DeskToRename
             # WarpPointer correction
             Do {Schedule 100 CursorMove 0p -20p}
             SendSignal 41 2
          End
          If $Action == 2 Then
          Begin
             Do {f_ToggleFvwmModule FvwmScript WsPgMgr $[infostore.desknum] $[infostore.pagematrixX] $[infostore.pagematrixY]}
          End
          If $Action == 3 Then
          Begin
             Do {DestroyMenu m_WsmGoToPage}
             Do {AddToMenu m_WsmGoToPage}
             Do {PipeRead "$NSCDE_TOOLSDIR/mkpagemenu } $PageMatrixX { } $PageMatrixY { menu_custom_desk GotoDeskAndPage:0} $NextDesk {"}
             Do {ChangeMenuStyle CommonAppMenu m_WsmGoToPage}
             Do {Menu m_WsmGoToPage}
          End
          If $Action == 4 Then
          Begin
             Do {f_MoveCursorAndExec 0 -10 Module FvwmPager -transient WspLocPager } $NextDesk { } $NextDesk
          End
          If $Action == 5 Then
             # $CurrDesk is 1-based; $NextDesk is 0-based
             Do {WindowList mouse -0m -0m NoGeometry TitleForAllDesks NoCurrentDeskTitle NoNumInDeskTitle ShowPage Desk } $NextDesk
             If (Add $NextDesk 1) == $CurrDesk Then
             Begin
                If $CurrDesk == 1 Then
                   ChangeColorset $CurrDesk 41
                If $CurrDesk == 2 Then
                   ChangeColorset $CurrDesk 43
                If $CurrDesk == 3 Then
                   ChangeColorset $CurrDesk 45
                If $CurrDesk == 4 Then
                   ChangeColorset $CurrDesk 47
                If $CurrDesk == 5 Then
                   ChangeColorset $CurrDesk 41
                If $CurrDesk == 6 Then
                   ChangeColorset $CurrDesk 43
                If $CurrDesk == 7 Then
                   ChangeColorset $CurrDesk 45
                If $CurrDesk == 8 Then
                   ChangeColorset $CurrDesk 47

                ChangeValue (Add $NextDesk 1) 1
             End
       End

       5 :
       Begin
          If (StrCopy (LastString) 1 3) == {CHN} Then
          Begin
             Set $DeskToRename = (StrCopy (LastString) 4 5)
             Set $NewDeskName = (StrCopy (LastString) 6 20)
             If $NewDeskName <> {} Then
             Begin
                If $DeskToRename <> {} Then
                Begin
                   Set $NewDeskNameFull = $NewDeskName (Gettext {|Rename ...|Manage ...|Go to Page ...|Local Pager|Windows ...})
                   ChangeTitle $DeskToRename $NewDeskNameFull
                End
             End
          End
       End

       6 :
       Begin
          Do {f_DisplayURL "$[gt.Workspace Manager Help]" html/NsCDE-Workspace-Manager.html}
       End

       7 :
       # Nasty workaround because ForeColor of the TextField widget is not applied
       # and global value is used anyway. See Widget 41:2 and 42 for what is done
       # with this dummy calls.
       Begin
          If (LastString) == {workaround} Then
          Begin
             ChangeColorset 42 20
          End
       End
End

# Nasty workaround because ForeColor of the TextField widget is not
# applied and global value is used anyway. See Widget 41:1 procedure
# for what is done with this dummy widget declaration.
Widget 42
   Property
   Size 40 10
   Position 10 10
   Type PushButton
   Title {WWWWWWWWWWWWWWWWWWWWWWWWWWW}
   Flags NoReliefString Hidden NoFocus
End


