lee wrote:
> Michael Großer <michael.gros...@gmx.de> writes:
>> When I switch to another cluster, desk or page, I usually use the keybord.
>> Rarely, I click with the mouse into the second pager to go to another
>> page, but 99,9% of my time I use the keyboard.
>>
>> Often, I use <Win>+<Space> to pin a window to be able to move it to
>> another cluster, desk or page.
>>
>> When I debug a test session, I can use a desk bookmark. Mostly,
>> I bookmark cluster 6, desk 1, page 3 to the minus key of the numeric keypad
>> and cluster 6, desk 8, any page to the plus key of the numeric keypad.
>> Then, I press minus to step to the next test step and I press plus
>> to step to the source code that controls the automated test.
> 
> Oh, how do you do that?  I'd find that very useful because MOTT, I'm
> switching back and forth between two particular pages.

This is the include file that manages the plus / minus key feature:
0022_plus_minus.fvwm

It comes without any comments.

I wrote it in March 2016.

It uses a function named 'GotoPageExtra', which you can find here:
0006b_desktop_switching.fvwm

My two pagers are defined here:
0006_pagers.fvwm

If you still want to study something of my config,
here are my keyboard bindings:
0003_simple_keyboard_bindings.fvwm

And here are the mouse bindings:
0004_simple_mouse_bindings.fvwm

For more stuff, please ask.

Best regards,
Michael
# Bookmarks via <plus> and <minus>

Key KP_Multiply A 4 enable_plus_minus_bookmarks_soft
DestroyFunc enable_plus_minus_bookmarks_soft
AddToFunc enable_plus_minus_bookmarks_soft
+ I Key KP_Add      A N use_bookmark_plus_soft
+ I Key KP_Subtract A N use_bookmark_minus_soft

Key KP_Multiply A S4 enable_plus_minus_bookmarks_hard
DestroyFunc enable_plus_minus_bookmarks_hard
AddToFunc enable_plus_minus_bookmarks_hard
+ I Key KP_Add      A N use_bookmark_plus_hard
+ I Key KP_Subtract A N use_bookmark_minus_hard

Key KP_Divide A 4 disable_plus_minus_bookmarks
DestroyFunc disable_plus_minus_bookmarks
AddToFunc disable_plus_minus_bookmarks
+ I Key KP_Add      A N -
+ I Key KP_Subtract A N -

DestroyFunc use_bookmark_plus_soft
AddToFunc use_bookmark_plus_soft
+ I GotoDeskAndPageExtraAbsolute $[PLUS_MINUS_BOOKMARK_PLUS_DESK]

DestroyFunc use_bookmark_plus_hard
AddToFunc use_bookmark_plus_hard
+ I GotoDeskAndPageExtraAbsolute $[PLUS_MINUS_BOOKMARK_PLUS_DESK]
+ I GotoPageExtra $[PLUS_MINUS_BOOKMARK_PLUS_PAGE_X] 
$[PLUS_MINUS_BOOKMARK_PLUS_PAGE_Y]

DestroyFunc use_bookmark_minus_soft
AddToFunc use_bookmark_minus_soft
+ I GotoDeskAndPageExtraAbsolute $[PLUS_MINUS_BOOKMARK_MINUS_DESK]

DestroyFunc use_bookmark_minus_hard
AddToFunc use_bookmark_minus_hard
+ I GotoDeskAndPageExtraAbsolute $[PLUS_MINUS_BOOKMARK_MINUS_DESK]
+ I GotoPageExtra $[PLUS_MINUS_BOOKMARK_MINUS_PAGE_X] 
$[PLUS_MINUS_BOOKMARK_MINUS_PAGE_Y]

Key KP_Add A 4 set_bookmark_plus
DestroyFunc set_bookmark_plus
AddToFunc set_bookmark_plus
+ I SetEnv PLUS_MINUS_BOOKMARK_PLUS_DESK $[desk.n]
+ I SetEnv PLUS_MINUS_BOOKMARK_PLUS_PAGE_X $[page.nx]
+ I SetEnv PLUS_MINUS_BOOKMARK_PLUS_PAGE_Y $[page.ny]

Key KP_Subtract A 4 set_bookmark_minus
DestroyFunc set_bookmark_minus
AddToFunc set_bookmark_minus
+ I SetEnv PLUS_MINUS_BOOKMARK_MINUS_DESK $[desk.n]
+ I SetEnv PLUS_MINUS_BOOKMARK_MINUS_PAGE_X $[page.nx]
+ I SetEnv PLUS_MINUS_BOOKMARK_MINUS_PAGE_Y $[page.ny]

AddToFunc StartFunction
+ I SetEnv PLUS_MINUS_BOOKMARK_PLUS_DESK 0
+ I SetEnv PLUS_MINUS_BOOKMARK_PLUS_PAGE_X 0
+ I SetEnv PLUS_MINUS_BOOKMARK_PLUS_PAGE_Y 0
+ I SetEnv PLUS_MINUS_BOOKMARK_MINUS_DESK 0
+ I SetEnv PLUS_MINUS_BOOKMARK_MINUS_PAGE_X 0
+ I SetEnv PLUS_MINUS_BOOKMARK_MINUS_PAGE_Y 0
# direct jump to a viewport
Key F1  A 4 GotoPageExtra 0 0
Key F2  A 4 GotoPageExtra 1 0
Key F3  A 4 GotoPageExtra 2 0
Key F4  A 4 GotoPageExtra 3 0
Key F5  A 4 GotoPageExtra 0 1
Key F6  A 4 GotoPageExtra 1 1
Key F7  A 4 GotoPageExtra 2 1
Key F8  A 4 GotoPageExtra 3 1
Key F9  A 4 GotoPageExtra 0 2
Key F10 A 4 GotoPageExtra 1 2
Key F11 A 4 GotoPageExtra 2 2
Key F12 A 4 GotoPageExtra 3 2

# direct jump to a desktop
Key F1  A S4 GotoDeskAndPageExtraRelative  0
Key F2  A S4 GotoDeskAndPageExtraRelative  1
Key F3  A S4 GotoDeskAndPageExtraRelative  2
Key F4  A S4 GotoDeskAndPageExtraRelative  3
Key F5  A S4 GotoDeskAndPageExtraRelative  4
Key F6  A S4 GotoDeskAndPageExtraRelative  5
Key F7  A S4 GotoDeskAndPageExtraRelative  6
Key F8  A S4 GotoDeskAndPageExtraRelative  7
Key F9  A S4 GotoDeskAndPageExtraRelative  8
Key F10 A S4 GotoDeskAndPageExtraRelative  9
Key F11 A S4 GotoDeskAndPageExtraRelative 10
Key F12 A S4 GotoDeskAndPageExtraRelative 11

# direct jump to a layer
Key F1  A S4M GotoLayerExtraAbsoluteExpand 0
Key F2  A S4M GotoLayerExtraAbsoluteExpand 1
Key F3  A S4M GotoLayerExtraAbsoluteExpand 2
Key F4  A S4M GotoLayerExtraAbsoluteExpand 3
Key F5  A S4M GotoLayerExtraAbsoluteExpand 4
Key F6  A S4M GotoLayerExtraAbsoluteExpand 5

# relative jump to a viewport
Key Left  A 4 GotoPage wrapx wrapy -1p 0p
Key Right A 4 GotoPage wrapx wrapy +1p 0p
Key Up    A 4 GotoPage wrapx wrapy 0p -1p
Key Down  A 4 GotoPage wrapx wrapy 0p +1p

# relative jump to a viewport (second alternative)
Key Left  A C4 Scroll -100000 +0
Key Right A C4 Scroll +100000 +0
Key Up    A C4 Scroll +0 -100000
Key Down  A C4 Scroll +0 +100000

# relative jump to a desktop
Key Left  A S4 GotoDeskExtraRelative -1
Key Right A S4 GotoDeskExtraRelative 1
Key Up    A S4 GotoRowExtraRelative -1
Key Down  A S4 GotoRowExtraRelative 1

# relative jump to a desktop (second alternative)
Key Left  A SC4 GotoDeskExtraRelativeControl -1
Key Right A SC4 GotoDeskExtraRelativeControl 1
Key Up    A SC4 GotoDeskExtraRelativeControl -4
Key Down  A SC4 GotoDeskExtraRelativeControl 4

# jump between layer 1 (1-12), layer 2 (13-24) and layer 3 (25-36)
Key Page_Up   A S4 GotoLayerExtraRelative -1
Key Page_Down A S4 GotoLayerExtraRelative 1
Key Home      A S4 GotoLayerExtraAbsolute 0
Key End       A S4 GotoLayerExtraAbsolute 100





# initialize the page memory of the desktops
AddToFunc StartFunction
+ I PipeRead 'for LOOP in `seq 0 71`;\
              do\
                if [ "$LOOP" -lt "10" ];\
                  then LOOP="0${LOOP}";\
                fi;\
                echo "SetEnv VP_Desk${LOOP}_X 0";\
                echo "SetEnv VP_Desk${LOOP}_Y 0";\
              done'

### Exceptions:
+ I SetEnv VP_Desk11_X 3
+ I SetEnv VP_Desk11_Y 2
+ I SetEnv VP_Desk23_X 3
+ I SetEnv VP_Desk23_Y 2
+ I SetEnv VP_Desk35_X 3
+ I SetEnv VP_Desk35_Y 2

### Remainder:
+ I SetEnv VP_Current_X 0
+ I SetEnv VP_Current_Y 0
+ I SetEnv VP_TIME_ELAPSED_FOR_DESKTOP 0


# initialize the desktop memory of the rows
AddToFunc StartFunction

# official rows
+ I SetEnv Desk_Row0 0
+ I SetEnv Desk_Row1 4
+ I SetEnv Desk_Row2 11
+ I SetEnv Desk_Row3 12
+ I SetEnv Desk_Row4 16
+ I SetEnv Desk_Row5 23
+ I SetEnv Desk_Row6 24
+ I SetEnv Desk_Row7 28
+ I SetEnv Desk_Row8 35

# hidden rows
+ I SetEnv Desk_Row9 36
+ I SetEnv Desk_Row10 40
+ I SetEnv Desk_Row11 44
+ I SetEnv Desk_Row12 48
+ I SetEnv Desk_Row13 52
+ I SetEnv Desk_Row14 56
+ I SetEnv Desk_Row15 60
+ I SetEnv Desk_Row16 64
+ I SetEnv Desk_Row17 68

# current
+ I SetEnv Desk_Current 0


# initialize the row memory of the layers
AddToFunc StartFunction
+ I SetEnv Row_Layer0 0
+ I SetEnv Row_Layer1 3
+ I SetEnv Row_Layer2 8
+ I SetEnv Row_Layer3 9
+ I SetEnv Row_Layer4 12
+ I SetEnv Row_Layer5 15
+ I SetEnv Row_Current 0

# initialize the current layer
+ I SetEnv CURRENT_LAYER 0
+ I SetEnv LAYER_MAX 2





DestroyFunc GotoPageExtra
AddToFunc GotoPageExtra
+ I GotoPage $0 $1


DestroyFunc GotoDeskExtraRelative
AddToFunc GotoDeskExtraRelative
+ I SetEnv SUMMAND $0
+ I SetEnv CURRENT_DESKTOP $[desk.n]
+ I detect_current_layer
+ I PipeRead 'RESULT=`echo "scale=0; ((${CURRENT_DESKTOP}+${SUMMAND}+4)%4) + 
${Row_Current}*4" | bc`;\
              echo "SetEnv DESTINATION_DESKTOP ${RESULT}"'
+ I read_page $[DESTINATION_DESKTOP]
+ I GotoDeskAndPage $[DESTINATION_DESKTOP] $[VP_Current_X] $[VP_Current_Y]


DestroyFunc GotoDeskExtraRelativeControl
AddToFunc GotoDeskExtraRelativeControl
+ I SetEnv SUMMAND $0
+ I SetEnv CURRENT_DESKTOP $[desk.n]
+ I detect_current_layer
+ I PipeRead 'RESULT=`echo "scale=0; ((${CURRENT_DESKTOP}+${SUMMAND}+12)%12) + 
${CURRENT_LAYER}*12" | bc`;\
              echo "SetEnv DESTINATION_DESKTOP ${RESULT}"'
+ I read_page $[DESTINATION_DESKTOP]
+ I GotoDeskAndPage $[DESTINATION_DESKTOP] $[VP_Current_X] $[VP_Current_Y]


DestroyFunc GotoRowExtraRelative
AddToFunc GotoRowExtraRelative
+ I SetEnv SUMMAND $0
+ I SetEnv CURRENT_DESKTOP $[desk.n]
+ I detect_current_layer
+ I PipeRead 'RESULT=`echo "scale=0; ((${CURRENT_DESKTOP}/4+${SUMMAND}+3)%3) + 
${CURRENT_LAYER}*3" | bc`;\
              echo "SetEnv DESTINATION_ROW ${RESULT}"'
+ I read_desk $[DESTINATION_ROW]
+ I GotoDeskAndPageExtraAbsolute $[Desk_Current]


DestroyFunc GotoLayerExtraRelative
AddToFunc GotoLayerExtraRelative
+ I SetEnv SUMMAND $0
+ I detect_current_layer
+ I PipeRead 'RESULT=`echo "scale=0; ${CURRENT_LAYER}+${SUMMAND}" | bc`;\
              if [ "$RESULT" -lt "0" ];\
                then RESULT="0";\
              fi;\
              if [ "$RESULT" -gt "${LAYER_MAX}" ];\
                then RESULT="${LAYER_MAX}";\
              fi;\
              echo "SetEnv DESTINATION_LAYER ${RESULT}"'
+ I read_row $[DESTINATION_LAYER]
+ I read_desk $[Row_Current]
+ I GotoDeskAndPageExtraAbsolute $[Desk_Current]


DestroyFunc GotoLayerExtraAbsolute
AddToFunc GotoLayerExtraAbsolute
+ I SetEnv GIVEN_LAYER $0
+ I PipeRead 'if [ "$GIVEN_LAYER" -lt "0" ];\
                then GIVEN_LAYER="0";\
              fi;\
              if [ "$GIVEN_LAYER" -gt "${LAYER_MAX}" ];\
                then GIVEN_LAYER="${LAYER_MAX}";\
              fi;\
              echo "SetEnv DESTINATION_LAYER ${GIVEN_LAYER}"'
+ I read_row $[DESTINATION_LAYER]
+ I read_desk $[Row_Current]
+ I GotoDeskAndPageExtraAbsolute $[Desk_Current]


DestroyFunc GotoLayerExtraAbsoluteExpand
AddToFunc GotoLayerExtraAbsoluteExpand
+ I SetEnv TARGET_LAYER $0
+ I PipeRead 'if [ "$TARGET_LAYER" -gt "$LAYER_MAX" ];\
                then echo "SetEnv LAYER_MAX ${TARGET_LAYER}";\
              fi'
+ I GotoLayerExtraAbsolute $[TARGET_LAYER]


DestroyFunc GotoDeskAndPageExtraRelative
AddToFunc GotoDeskAndPageExtraRelative
+ I SetEnv DESTINATION_DESKTOP $0
+ I detect_current_layer
+ I PipeRead 'RESULT=`echo "scale=0; 
${CURRENT_LAYER}*12+${DESTINATION_DESKTOP}" | bc`;\
              echo "SetEnv DESTINATION_DESKTOP ${RESULT}"'
+ I SetEnv CURRENT_DESKTOP $[desk.n]
+ I read_page $[DESTINATION_DESKTOP]
+ I GotoDeskAndPage $[DESTINATION_DESKTOP] $[VP_Current_X] $[VP_Current_Y]


DestroyFunc GotoDeskAndPageExtraAbsolute
AddToFunc GotoDeskAndPageExtraAbsolute
+ I SetEnv DESTINATION_DESKTOP $0
+ I SetEnv CURRENT_DESKTOP $[desk.n]
+ I read_page $[DESTINATION_DESKTOP]
+ I GotoDeskAndPage $[DESTINATION_DESKTOP] $[VP_Current_X] $[VP_Current_Y]


# save the current page
AddToFunc FvwmEvent_new_page
#+ I Test (EnvMatch VP_TIME_ELAPSED_FOR_DESKTOP 1) rollback_viewpoint
+ I write_page $[page.nx] $[page.ny]


# load the current page
AddToFunc FvwmEvent_new_desk
+ I write_desk $[desk.n]
#+ I write_page $[page.nx] $[page.ny] ###### nachtraeglich rausgenommen, da 
eigentlich sinnlos
#+ I read_page $[desk.n]
#+ I Test (EnvMatch VP_Current_X $[page.nx], EnvMatch VP_Current_Y $[page.ny]) 
Break
#+ I Schedule 300 time_elapsed_for_desktop


#DestroyFunc time_elapsed_for_desktop
#AddToFunc time_elapsed_for_desktop
#+ I SetEnv VP_PRESERVED_X $[page.nx]
#+ I SetEnv VP_PRESERVED_Y $[page.ny]
#+ I GotoPageExtra $[VP_Current_X] $[VP_Current_Y]
#+ I SetEnv VP_TIME_ELAPSED_FOR_DESKTOP 1


#DestroyFunc rollback_viewpoint
#AddToFunc rollback_viewpoint
#+ I GotoPageExtra $[VP_PRESERVED_X] $[VP_PRESERVED_Y]
#+ I SetEnv VP_TIME_ELAPSED_FOR_DESKTOP 0








# memorize the page of the current desktop
DestroyFunc write_page
AddToFunc write_page
+ I SetEnv VP_Current_X $0
+ I SetEnv VP_Current_Y $1
+ I SetEnv CURRENT_DESKTOP $[desk.n]
+ I PipeRead 'if [ "$CURRENT_DESKTOP" -lt "10" ];\
                then CURRENT_DESKTOP="0${CURRENT_DESKTOP}";\
              fi;\
              echo "SetEnv VP_Desk${CURRENT_DESKTOP}_X $[VP_Current_X]";\
              echo "SetEnv VP_Desk${CURRENT_DESKTOP}_Y $[VP_Current_Y]"'


# remember the page of the current desktop
DestroyFunc read_page
AddToFunc read_page
+ I SetEnv CURRENT_DESKTOP $0
+ I PipeRead 'if [ "$CURRENT_DESKTOP" -lt "10" ];\
                then CURRENT_DESKTOP="0${CURRENT_DESKTOP}";\
              fi;\
              echo "SetEnv VP_Current_X $[VP_Desk${CURRENT_DESKTOP}_X]";\
              echo "SetEnv VP_Current_Y $[VP_Desk${CURRENT_DESKTOP}_Y]"'


# memorize the desktop of the current row
DestroyFunc write_desk
AddToFunc write_desk
+ I SetEnv Desk_Current $0
+ I PipeRead 'RESULT=`echo "scale=0; ${Desk_Current}/4" | bc`;\
              echo "SetEnv CURRENT_ROW ${RESULT}"'
+ I Test (EnvMatch CURRENT_ROW 0) SetEnv Desk_Row0 $[Desk_Current]
+ I Test (EnvMatch CURRENT_ROW 1) SetEnv Desk_Row1 $[Desk_Current]
+ I Test (EnvMatch CURRENT_ROW 2) SetEnv Desk_Row2 $[Desk_Current]
+ I Test (EnvMatch CURRENT_ROW 3) SetEnv Desk_Row3 $[Desk_Current]
+ I Test (EnvMatch CURRENT_ROW 4) SetEnv Desk_Row4 $[Desk_Current]
+ I Test (EnvMatch CURRENT_ROW 5) SetEnv Desk_Row5 $[Desk_Current]
+ I Test (EnvMatch CURRENT_ROW 6) SetEnv Desk_Row6 $[Desk_Current]
+ I Test (EnvMatch CURRENT_ROW 7) SetEnv Desk_Row7 $[Desk_Current]
+ I Test (EnvMatch CURRENT_ROW 8) SetEnv Desk_Row8 $[Desk_Current]

+ I Test (EnvMatch CURRENT_ROW  9) SetEnv Desk_Row9 $[Desk_Current]
+ I Test (EnvMatch CURRENT_ROW 10) SetEnv Desk_Row10 $[Desk_Current]
+ I Test (EnvMatch CURRENT_ROW 11) SetEnv Desk_Row11 $[Desk_Current]
+ I Test (EnvMatch CURRENT_ROW 12) SetEnv Desk_Row12 $[Desk_Current]
+ I Test (EnvMatch CURRENT_ROW 13) SetEnv Desk_Row13 $[Desk_Current]
+ I Test (EnvMatch CURRENT_ROW 14) SetEnv Desk_Row14 $[Desk_Current]
+ I Test (EnvMatch CURRENT_ROW 15) SetEnv Desk_Row15 $[Desk_Current]
+ I Test (EnvMatch CURRENT_ROW 16) SetEnv Desk_Row16 $[Desk_Current]
+ I Test (EnvMatch CURRENT_ROW 17) SetEnv Desk_Row17 $[Desk_Current]
+ I write_row $[CURRENT_ROW]


# remember the desktop of the current row
DestroyFunc read_desk
AddToFunc read_desk
+ I SetEnv CURRENT_ROW $0
+ I Test (EnvMatch CURRENT_ROW 0) SetEnv Desk_Current $[Desk_Row0]
+ I Test (EnvMatch CURRENT_ROW 1) SetEnv Desk_Current $[Desk_Row1]
+ I Test (EnvMatch CURRENT_ROW 2) SetEnv Desk_Current $[Desk_Row2]
+ I Test (EnvMatch CURRENT_ROW 3) SetEnv Desk_Current $[Desk_Row3]
+ I Test (EnvMatch CURRENT_ROW 4) SetEnv Desk_Current $[Desk_Row4]
+ I Test (EnvMatch CURRENT_ROW 5) SetEnv Desk_Current $[Desk_Row5]
+ I Test (EnvMatch CURRENT_ROW 6) SetEnv Desk_Current $[Desk_Row6]
+ I Test (EnvMatch CURRENT_ROW 7) SetEnv Desk_Current $[Desk_Row7]
+ I Test (EnvMatch CURRENT_ROW 8) SetEnv Desk_Current $[Desk_Row8]

+ I Test (EnvMatch CURRENT_ROW  9) SetEnv Desk_Current $[Desk_Row9]
+ I Test (EnvMatch CURRENT_ROW 10) SetEnv Desk_Current $[Desk_Row10]
+ I Test (EnvMatch CURRENT_ROW 11) SetEnv Desk_Current $[Desk_Row11]
+ I Test (EnvMatch CURRENT_ROW 12) SetEnv Desk_Current $[Desk_Row12]
+ I Test (EnvMatch CURRENT_ROW 13) SetEnv Desk_Current $[Desk_Row13]
+ I Test (EnvMatch CURRENT_ROW 14) SetEnv Desk_Current $[Desk_Row14]
+ I Test (EnvMatch CURRENT_ROW 15) SetEnv Desk_Current $[Desk_Row15]
+ I Test (EnvMatch CURRENT_ROW 16) SetEnv Desk_Current $[Desk_Row16]
+ I Test (EnvMatch CURRENT_ROW 17) SetEnv Desk_Current $[Desk_Row17]


# memorize the row of the current layer
DestroyFunc write_row
AddToFunc write_row
+ I SetEnv Row_Current $0
+ I PipeRead 'RESULT=`echo "scale=0; ${Row_Current}/3" | bc`;\
              echo "SetEnv CURRENT_LAYER ${RESULT}"'
+ I Test (EnvMatch CURRENT_LAYER 0) SetEnv Row_Layer0 $[Row_Current]
+ I Test (EnvMatch CURRENT_LAYER 1) SetEnv Row_Layer1 $[Row_Current]
+ I Test (EnvMatch CURRENT_LAYER 2) SetEnv Row_Layer2 $[Row_Current]
+ I Test (EnvMatch CURRENT_LAYER 3) SetEnv Row_Layer3 $[Row_Current]
+ I Test (EnvMatch CURRENT_LAYER 4) SetEnv Row_Layer4 $[Row_Current]
+ I Test (EnvMatch CURRENT_LAYER 5) SetEnv Row_Layer5 $[Row_Current]


# remember the row of the current layer
DestroyFunc read_row
AddToFunc read_row
+ I SetEnv CURRENT_LAYER $0
+ I Test (EnvMatch CURRENT_LAYER 0) SetEnv Row_Current $[Row_Layer0]
+ I Test (EnvMatch CURRENT_LAYER 1) SetEnv Row_Current $[Row_Layer1]
+ I Test (EnvMatch CURRENT_LAYER 2) SetEnv Row_Current $[Row_Layer2]
+ I Test (EnvMatch CURRENT_LAYER 3) SetEnv Row_Current $[Row_Layer3]
+ I Test (EnvMatch CURRENT_LAYER 4) SetEnv Row_Current $[Row_Layer4]
+ I Test (EnvMatch CURRENT_LAYER 5) SetEnv Row_Current $[Row_Layer5]








# detect the current layer
DestroyFunc detect_current_layer
AddToFunc detect_current_layer
+ I SetEnv CURRENT_DESKTOP $[desk.n]
+ I PipeRead 'RESULT=`echo "scale=0; ${CURRENT_DESKTOP}/4/3" | bc`;\
              echo "SetEnv CURRENT_LAYER ${RESULT}"'
DestroyFunc paintPagerLarge
DestroyFunc paintMinipager

# start several pagers
AddToFunc StartFunction
 + I SetEnv SAVED_DESKTOP_NUMBER_MINI 999
 + I SetEnv SAVED_DESKTOP_NUMBER_LARGE 999
# + I FvwmPager minipager 0 11
 + I paintMinipager
 + I paintPagerLarge

# the pagers get styles
Style pagerLarge Sticky, NoTitle, HandleWidth 0, StaysOnBottom, SkipMapping
Style minipager  Sticky, NoTitle, HandleWidth 0, StaysOnBottom, SkipMapping

# set the number of the viewports
DeskTopSize 4x3

# set the geometry of the pager
*pagerLarge: Geometry 400x64+100-0
*pagerLarge: Label 0 "Desk 1"
*pagerLarge: Label 1 "Desk 2"
*pagerLarge: Label 2 "Desk 3"
*pagerLarge: Label 3 "Desk 4"
*pagerLarge: Label 4 "Desk 5"
*pagerLarge: Label 5 "Desk 6"
*pagerLarge: Label 6 "Desk 7"
*pagerLarge: Label 7 "Desk 8"
*pagerLarge: Label 8 "Desk 9"
*pagerLarge: Label 9 "Desk 10"
*pagerLarge: Label 10 "Desk 11"
*pagerLarge: Label 11 "Desk 12"
*pagerLarge: Label 12 "Desk 13"
*pagerLarge: Label 13 "Desk 14"
*pagerLarge: Label 14 "Desk 15"
*pagerLarge: Label 15 "Desk 16"
*pagerLarge: Label 16 "Desk 17"
*pagerLarge: Label 17 "Desk 18"
*pagerLarge: Label 18 "Desk 19"
*pagerLarge: Label 19 "Desk 20"
*pagerLarge: Label 20 "Desk 21"
*pagerLarge: Label 21 "Desk 22"
*pagerLarge: Label 22 "Desk 23"
*pagerLarge: Label 23 "Desk 24"
*pagerLarge: Label 24 "Desk 25"
*pagerLarge: Label 25 "Desk 26"
*pagerLarge: Label 26 "Desk 27"
*pagerLarge: Label 27 "Desk 28"
*pagerLarge: Label 28 "Desk 29"
*pagerLarge: Label 29 "Desk 30"
*pagerLarge: Label 30 "Desk 31"
*pagerLarge: Label 31 "Desk 32"
*pagerLarge: Label 32 "Desk 33"
*pagerLarge: Label 33 "Desk 34"
*pagerLarge: Label 34 "Desk 35"
*pagerLarge: Label 35 "Desk 36"
*pagerLarge: Label 36 "Desk 37"
*pagerLarge: Label 37 "Desk 38"
*pagerLarge: Label 38 "Desk 39"
*pagerLarge: Label 39 "Desk 40"
*pagerLarge: Label 40 "Desk 41"
*pagerLarge: Label 41 "Desk 42"
*pagerLarge: Label 42 "Desk 43"
*pagerLarge: Label 43 "Desk 44"
*pagerLarge: Label 44 "Desk 45"
*pagerLarge: Label 45 "Desk 46"
*pagerLarge: Label 46 "Desk 47"
*pagerLarge: Label 47 "Desk 48"
*pagerLarge: Label 48 "Desk 49"
*pagerLarge: Label 49 "Desk 50"
*pagerLarge: Label 50 "Desk 51"
*pagerLarge: Label 51 "Desk 52"
*pagerLarge: Label 52 "Desk 53"
*pagerLarge: Label 53 "Desk 54"
*pagerLarge: Label 54 "Desk 55"
*pagerLarge: Label 55 "Desk 56"
*pagerLarge: Label 56 "Desk 57"
*pagerLarge: Label 57 "Desk 58"
*pagerLarge: Label 58 "Desk 59"
*pagerLarge: Label 59 "Desk 60"
*pagerLarge: Label 60 "Desk 61"
*pagerLarge: Label 61 "Desk 62"
*pagerLarge: Label 62 "Desk 63"
*pagerLarge: Label 63 "Desk 64"
*pagerLarge: Label 64 "Desk 65"
*pagerLarge: Label 65 "Desk 66"
*pagerLarge: Label 66 "Desk 67"
*pagerLarge: Label 67 "Desk 68"
*pagerLarge: Label 68 "Desk 69"
*pagerLarge: Label 69 "Desk 70"
*pagerLarge: Label 70 "Desk 71"
*pagerLarge: Label 71 "Desk 72"
#*pagerLarge: Pixmap /root/.fvwm/5_pixmaps/pager001.xpm

# set the geometry of the minipager
# *minipager: Geometry 110x44+2-0
*minipager: Geometry 110x70+2-0
*minipager: Rows 3
*minipager: NoSeparators
*minipager: Label 0 "1"
*minipager: Label 1 "2"
*minipager: Label 2 "3"
*minipager: Label 3 "4"
*minipager: Label 4 "5"
*minipager: Label 5 "6"
*minipager: Label 6 "7"
*minipager: Label 7 "8"
*minipager: Label 8 "9"
*minipager: Label 9 "10"
*minipager: Label 10 "11"
*minipager: Label 11 "12"
*minipager: Label 12 "13"
*minipager: Label 13 "14"
*minipager: Label 14 "15"
*minipager: Label 15 "16"
*minipager: Label 16 "17"
*minipager: Label 17 "18"
*minipager: Label 18 "19"
*minipager: Label 19 "20"
*minipager: Label 20 "21"
*minipager: Label 21 "22"
*minipager: Label 22 "23"
*minipager: Label 23 "24"
*minipager: Label 24 "25"
*minipager: Label 25 "26"
*minipager: Label 26 "27"
*minipager: Label 27 "28"
*minipager: Label 28 "29"
*minipager: Label 29 "30"
*minipager: Label 30 "31"
*minipager: Label 31 "32"
*minipager: Label 32 "33"
*minipager: Label 33 "34"
*minipager: Label 34 "35"
*minipager: Label 35 "36"
*minipager: Label 36 "37"
*minipager: Label 37 "38"
*minipager: Label 38 "39"
*minipager: Label 39 "40"
*minipager: Label 40 "41"
*minipager: Label 41 "42"
*minipager: Label 42 "43"
*minipager: Label 43 "44"
*minipager: Label 44 "45"
*minipager: Label 45 "46"
*minipager: Label 46 "47"
*minipager: Label 47 "48"
*minipager: Label 48 "49"
*minipager: Label 49 "50"
*minipager: Label 50 "51"
*minipager: Label 51 "52"
*minipager: Label 52 "53"
*minipager: Label 53 "54"
*minipager: Label 54 "55"
*minipager: Label 55 "56"
*minipager: Label 56 "57"
*minipager: Label 57 "58"
*minipager: Label 58 "59"
*minipager: Label 59 "60"
*minipager: Label 60 "61"
*minipager: Label 61 "62"
*minipager: Label 62 "63"
*minipager: Label 63 "64"
*minipager: Label 64 "65"
*minipager: Label 65 "66"
*minipager: Label 66 "67"
*minipager: Label 67 "68"
*minipager: Label 68 "69"
*minipager: Label 69 "70"
*minipager: Label 70 "71"
*minipager: Label 71 "72"

# define reasonable colors
*pagerLarge: Hilight #ffcc00
*pagerLarge: WindowColors #000000 #888888 #000000 #ff0000
*minipager: Hilight #ffcc00

# use skip list
*pagerLarge: UseSkipList
*minipager: UseSkipList

AddToFunc FvwmEvent_new_desk
+ I paintMinipager
+ I paintPagerLarge

AddToFunc paintMinipager
+ I PipeRead 'A=$[desk.n];\
              B=$(( A-(A%12) ));\
              C=$(( A-(A%12)+11 ));\
              if [ $SAVED_DESKTOP_NUMBER_MINI -lt $B -o 
$SAVED_DESKTOP_NUMBER_MINI -gt $C ];\
              then\
                echo "KillModule FvwmPager minipager";\
                echo "FvwmPager minipager $B $C";\
                echo "SetEnv SAVED_DESKTOP_NUMBER_MINI $A";\
              fi'

AddToFunc paintPagerLarge
+ I PipeRead 'A=$[desk.n];\
              B=$(( A-(A%4) ));\
              C=$(( A-(A%4)+3 ));\
              if [ $SAVED_DESKTOP_NUMBER_LARGE -lt $B -o 
$SAVED_DESKTOP_NUMBER_LARGE -gt $C ];\
              then\
                echo "KillModule FvwmPager pagerLarge";\
                echo "FvwmPager pagerLarge $B $C";\
                echo "SetEnv SAVED_DESKTOP_NUMBER_LARGE $A";\
              fi'

AddToFunc StartFunction
+ I Schedule Periodic 2000 crashGuardPager

DestroyFunc crashGuardPager
AddToFunc crashGuardPager
+ I All ("minipager") Nop
+ I TestRc (NoMatch) crashHandlerPager

DestroyFunc crashHandlerPager
AddToFunc crashHandlerPager
+ I SetEnv SAVED_DESKTOP_NUMBER_MINI 9999
+ I paintMinipager
# To ignore:
# L = Caps-Lock
# 2 = Num Lock
IgnoreModifiers L2

# Sets a reasonable keyboard rate
AddToFunc StartFunction I Exec exec xset r rate 250 25

# Repeats it every 10 minutes as a workaround for Debian Squeeze host systems 
that run VirtualBox guests
# and haphazardly make the keyboard slow every 1 hour or so
AddToFunc StartFunction I Schedule Periodic 600000 Exec exec xset r rate 250 25

# Maximize
Key Return WTSF123456789 4 Maximize 100 -62p
Key KP_Enter WTSF123456789 4 Maximize 100 -62p
Key KP_End A SC4 Maximize TRUE 800p 538p
Key KP_Down A SC4 Maximize TRUE 1024p 706p
Key KP_Page_Down A SC4 Maximize TRUE 1280p 962p
Key KP_Left A SC4 Maximize TRUE 1920p 1138p

# Sticky
Key Space WTSF123456789 4 Stick
Key Space WTSF123456789 S4 StickAcrossPages
Key Space WTSF123456789 C4 StickAcrossDesks

# Sets some layers
Key Plus WTSF123456789 S4 Function "raise-to-top"
Key Numbersign WTSF123456789 S4 Function "set-to-put"
Key Minus WTSF123456789 S4 Function "lower-to-bottom"

# This is useful to debug to see whether the keys work at all
#Key Plus WTSF123456789 N Exec exec xterm
#Key Numbersign WTSF123456789 N Exec exec xterm
#Key Minus WTSF123456789 N Exec exec xterm

# Shade
Key Return WTSF123456789 C4 WindowShade
Key KP_Enter WTSF123456789 C4 WindowShade
Key Return WTSF123456789 SC4 WindowShade South
Key KP_Enter WTSF123456789 SC4 WindowShade South

# Iconify
Key Return WTSF123456789 S4 Iconify
Key KP_Enter WTSF123456789 S4 Iconify



# close window
Key F4 WTSF123456789 M Delete

# function to move windows around
DestroyFunc moveTheWindow
AddToFunc moveTheWindow
+ I SetEnv BOOKMARKED_WINDOW $[w.id]
+ I Move $0 $1
+ I WindowId $[BOOKMARKED_WINDOW] WarpToWindow 50 50

# bump window to the edge
Key Left WTSF123456789 CM moveTheWindow +0 keep
Key Right WTSF123456789 CM moveTheWindow -0 keep
Key Up WTSF123456789 CM moveTheWindow keep +0
Key Down WTSF123456789 CM moveTheWindow keep -62p

# move window relatively
Key Left WTSF123456789 CM4 moveTheWindow w-10p keep
Key Right WTSF123456789 CM4 moveTheWindow w+10p keep
Key Up WTSF123456789 CM4 moveTheWindow keep w-10p
Key Down WTSF123456789 CM4 moveTheWindow keep w+10p

# resize window to the edge
Key Left WTSF123456789 SCM Maximize 100 0
Key Right WTSF123456789 SCM Maximize 100 0
Key Up WTSF123456789 SCM Maximize 0 -62p
Key Down WTSF123456789 SCM Maximize 0 100

# move mouse
Key Left A 5 CursorMove -1p 0p
Key Right A 5 CursorMove +1p 0p
Key Up A 5 CursorMove 0p -1p
Key Down A 5 CursorMove 0p +1p
Key Left A 45 CursorMove -100p 0p
Key Right A 45 CursorMove +100p 0p
Key Up A 45 CursorMove 0p -100p
Key Down A 45 CursorMove 0p +100p



# define some layer functions:
## the bottom layer is 2
## the    put layer is 4
## the    top layer is 6
AddToFunc lower-to-bottom
+ I Layer 0 2
+ I Lower
+ I Stick
+ I Stick

AddToFunc set-to-put
+ I Layer 0 4
+ I Stick
+ I Stick
+ I Raise

AddToFunc raise-to-top
+ I Layer 0 6
+ I Stick
+ I Stick
+ I Raise



# simple volume control (Master)
Key KP_Insert A 4 Exec exec amixer set Master 0%
Key KP_End A 4 Exec exec amixer set Master 10%
Key KP_Down A 4 Exec exec amixer set Master 20%
Key KP_Page_Down A 4 Exec exec amixer set Master 30%
Key KP_Left A 4 Exec exec amixer set Master 40%
Key KP_Begin A 4 Exec exec amixer set Master 50%
Key KP_Right A 4 Exec exec amixer set Master 60%
Key KP_Home A 4 Exec exec amixer set Master 70%
Key KP_Up A 4 Exec exec amixer set Master 80%
Key KP_Page_Up A 4 Exec exec amixer set Master 90%
Key KP_Delete A 4 Exec exec amixer set Master 100%

# simple volume control (PCM)
Key KP_Insert A S4 Exec exec amixer set PCM 0%
Key KP_End A S4 Exec exec amixer set PCM 10%
Key KP_Down A S4 Exec exec amixer set PCM 20%
Key KP_Page_Down A S4 Exec exec amixer set PCM 30%
Key KP_Left A S4 Exec exec amixer set PCM 40%
Key KP_Begin A S4 Exec exec amixer set PCM 50%
Key KP_Right A S4 Exec exec amixer set PCM 60%
Key KP_Home A S4 Exec exec amixer set PCM 70%
Key KP_Up A S4 Exec exec amixer set PCM 80%
Key KP_Page_Up A S4 Exec exec amixer set PCM 90%
Key KP_Delete A S4 Exec exec amixer set PCM 100%
# The functionality of the icons of the windows
Mouse 1 3 A Stick
Mouse 2 3 A StickAcrossDesks
Mouse 3 3 A StickAcrossPages
Mouse 1 5 A Function "raise-to-top"
Mouse 1 7 A Function "set-to-put"
Mouse 1 9 A Function "lower-to-bottom"
Mouse 1 8 A WindowShade
Mouse 3 8 A WindowShade South
Mouse 2 8 A FuncShadeToCorner
Mouse 1 6 A Iconify
Mouse 1 4 A Maximize 100 -62p
Mouse 2 4 A Maximize 0 -62p
Mouse 3 4 A Maximize 100 0
Mouse 1 2 A Delete


# move a window with the left mouse button
Mouse 1 WTSF123456789 4 FuncFvwmRaiseLowerExtra Move

# resize a window with the middle mouse button
Mouse 2 WTSF123456789 4 Resize

# raise a window with the right mouse button
Mouse 3 WTSF123456789 4 Raise

# tatsaechlicher Befehl wird ueber $0 weitergereicht
# "motion" (M) sorgt dafür, dass sich das Fenster nur mit
# gedrueckter Maustaste verschieben laesst
# 
# actual command is passed via $0
# "motion" (M) makes sure that the window can be moved
# only with pressed mouse button
DestroyFunc FuncFvwmRaiseLowerExtra
AddToFunc FuncFvwmRaiseLowerExtra
+ M $0

DestroyFunc FuncShadeToCorner
AddToFunc FuncShadeToCorner
+ I WindowShade SouthEast
+ I StickEast
+ I Raise

Reply via email to