INIT
WANTSTATE p

!DECRQM on with mouse off
PUSH "\e[?1000\$p"
  output "\e[?1000;2\$y"
PUSH "\e[?1002\$p"
  output "\e[?1002;2\$y"
PUSH "\e[?1003\$p"
  output "\e[?1003;2\$y"

!Mouse in simple button report mode
RESET
  settermprop 1 true
  settermprop 2 true
  settermprop 7 1
PUSH "\e[?1000h"
  settermprop 8 1

!Press 1
MOUSEMOVE 0,0 0
MOUSEBTN d 1 0
  output "\e[M\x20\x21\x21"

!Release 1
MOUSEBTN u 1 0
  output "\e[M\x23\x21\x21"

!Ctrl-Press 1
MOUSEBTN d 1 C
  output "\e[M\x30\x21\x21"
MOUSEBTN u 1 C
  output "\e[M\x33\x21\x21"

!Button 2
MOUSEBTN d 2 0
  output "\e[M\x21\x21\x21"
MOUSEBTN u 2 0
  output "\e[M\x23\x21\x21"

!Position
MOUSEMOVE 10,20 0
MOUSEBTN d 1 0
  output "\e[M\x20\x35\x2b"

MOUSEBTN u 1 0
  output "\e[M\x23\x35\x2b"
MOUSEMOVE 10,21 0
  # no output

!Wheel events
MOUSEBTN d 4 0
  output "\e[M\x60\x36\x2b"
MOUSEBTN d 4 0
  output "\e[M\x60\x36\x2b"
MOUSEBTN d 5 0
  output "\e[M\x61\x36\x2b"

!DECRQM on mouse button mode
PUSH "\e[?1000\$p"
  output "\e[?1000;1\$y"
PUSH "\e[?1002\$p"
  output "\e[?1002;2\$y"
PUSH "\e[?1003\$p"
  output "\e[?1003;2\$y"

!Drag events
RESET
  settermprop 1 true
  settermprop 2 true
  settermprop 7 1
PUSH "\e[?1002h"
  settermprop 8 2

MOUSEMOVE 5,5 0
MOUSEBTN d 1 0
  output "\e[M\x20\x26\x26"
MOUSEMOVE 5,6 0
  output "\e[M\x40\x27\x26"
MOUSEMOVE 6,6 0
  output "\e[M\x40\x27\x27"
MOUSEMOVE 6,6 0
  # no output
MOUSEBTN u 1 0
  output "\e[M\x23\x27\x27"
MOUSEMOVE 6,7
  # no output

!DECRQM on mouse drag mode
PUSH "\e[?1000\$p"
  output "\e[?1000;2\$y"
PUSH "\e[?1002\$p"
  output "\e[?1002;1\$y"
PUSH "\e[?1003\$p"
  output "\e[?1003;2\$y"

!Non-drag motion events
PUSH "\e[?1003h"
  settermprop 8 3

MOUSEMOVE 6,8 0
  output "\e[M\x43\x29\x27"

!DECRQM on mouse motion mode
PUSH "\e[?1000\$p"
  output "\e[?1000;2\$y"
PUSH "\e[?1002\$p"
  output "\e[?1002;2\$y"
PUSH "\e[?1003\$p"
  output "\e[?1003;1\$y"

!Bounds checking
MOUSEMOVE 300,300 0
  output "\e[M\x43\xff\xff"
MOUSEBTN d 1 0
  output "\e[M\x20\xff\xff"
MOUSEBTN u 1 0
  output "\e[M\x23\xff\xff"

!DECRQM on standard encoding mode
PUSH "\e[?1005\$p"
  output "\e[?1005;2\$y"
PUSH "\e[?1006\$p"
  output "\e[?1006;2\$y"
PUSH "\e[?1015\$p"
  output "\e[?1015;2\$y"

!UTF-8 extended encoding mode
# 300 + 32 + 1 = 333 = U+014d = \xc5\x8d
PUSH "\e[?1005h"
MOUSEBTN d 1 0
  output "\e[M\x20\xc5\x8d\xc5\x8d"
MOUSEBTN u 1 0
  output "\e[M\x23\xc5\x8d\xc5\x8d"

!DECRQM on UTF-8 extended encoding mode
PUSH "\e[?1005\$p"
  output "\e[?1005;1\$y"
PUSH "\e[?1006\$p"
  output "\e[?1006;2\$y"
PUSH "\e[?1015\$p"
  output "\e[?1015;2\$y"

!SGR extended encoding mode
PUSH "\e[?1006h"
MOUSEBTN d 1 0
  output "\e[<0;301;301M"
MOUSEBTN u 1 0
  output "\e[<0;301;301m"

!DECRQM on SGR extended encoding mode
PUSH "\e[?1005\$p"
  output "\e[?1005;2\$y"
PUSH "\e[?1006\$p"
  output "\e[?1006;1\$y"
PUSH "\e[?1015\$p"
  output "\e[?1015;2\$y"

!rxvt extended encoding mode
PUSH "\e[?1015h"
MOUSEBTN d 1 0
  output "\e[0;301;301M"
MOUSEBTN u 1 0
  output "\e[3;301;301M"

!DECRQM on rxvt extended encoding mode
PUSH "\e[?1005\$p"
  output "\e[?1005;2\$y"
PUSH "\e[?1006\$p"
  output "\e[?1006;2\$y"
PUSH "\e[?1015\$p"
  output "\e[?1015;1\$y"
