Patch title: Release 90 bulk changes
Abstract:
File: /linux/input/mouse.pli
Key:
    Removed line
    Added line
   
module "/pliant/language/unsafe.pli"
module "/pliant/language/stream.pli"
module "/pliant/fullpliant/this_computer.pli"
module "/pliant/linux/kernel/device.pli"

module "/pliant/language/unsafe.pli"
module "/pliant/language/stream.pli"
module "/pliant/fullpliant/this_computer.pli"
module "/pliant/linux/kernel/device.pli"

constant verbose false

gvar Stream mouse
gvar Stream mouse
gvar Int mouse_x mouse_y
gvar Int mouse_x mouse_y mouse_z mouse_buttons
gvar Int size_x size_y
gvar Float divisor
gvar Int size_x size_y
gvar Float divisor
gvar CBool extended

if not (this_computer:env:"hardware":"mouse":"divisor" parse
  divisor := 1
if (this_computer:env:"hardware":"screen":"horizontal_resolu
  mouse_x := cast size_x\2*divisor Int ; mouse_y := cast siz
else
  size_x := 2^12 ; size_y := 2^12
  mouse_x := 0 ; mouse_y := 0

if not (this_computer:env:"hardware":"mouse":"divisor" parse
  divisor := 1
if (this_computer:env:"hardware":"screen":"horizontal_resolu
  mouse_x := cast size_x\2*divisor Int ; mouse_y := cast siz
else
  size_x := 2^12 ; size_y := 2^12
  mouse_x := 0 ; mouse_y := 0
mouse_z := 0 ; mouse_buttons := 0
extended := false


function mouse_read x y buttons
  arg_w Int x y buttons
  if mouse=failure
    var Str device := this_computer:env:"hardware":"mouse":"
    if device=""
      device := "device:/psaux"
    kernel_make_device device
    mouse open device in+safe
  part again
    mouse raw_read addressof:(var uInt8 c) 1
    if (c .and. 8)=0
      restart again
  mouse raw_read addressof:(var uInt8 x8) 1
  mouse raw_read addressof:(var uInt8 y8) 1
  if (c .and. 0C0h)=0
    var Int move_x := (shunt (c .and. 10h)<>0 -256 0) .or. x
    var Int move_y := (shunt (c .and. 20h)<>0 -256 0) .or. y
    mouse_x := min (max mouse_x+move_x 0) (cast (size_x-1)*d
    mouse_y := min (max mouse_y-move_y 0) (cast (size_y-1)*d
  x := cast mouse_x/divisor Int ; y := cast mouse_y/divisor 
  


function desable s
  arg_rw Stream s
  var uInt8 cmd := 0F5h ; s raw_write addressof:cmd 1
  s raw_read addressof:(var uInt8 ack) 1
  if ack<>0FAh
    console "mouse desable acked with " (cast ack Int) eol

function enable s
  arg_rw Stream s
  var uInt8 cmd := 0F4h ; s raw_write addressof:cmd 1
  s raw_read addressof:(var uInt8 ack) 1
  if ack<>0FAh
    console "mouse enable acked with " (cast ack Int) eol

function set_sample_rate s rate -> status
  arg_rw Stream s ; arg Int rate ; arg Status status
  var uInt8 cmd := 0F3h ; s raw_write addressof:cmd 1
  s raw_read addressof:(var uInt8 ack) 1
  if ack<>0FAh
    console "ack is " (cast ack Int) eol
    return failure
  var uInt8 cmd := rate ; s raw_write addressof:cmd 1
  s raw_read addressof:(var uInt8 ack) 1
  if ack<>0FAh
    return failure
  status := success

function get_id s -> id
  arg_rw Stream s ; arg Int id
  var uInt8 cmd := 0F2h ; s raw_write addressof:cmd 1
  s raw_read addressof:(var uInt8 ack) 1
  if ack<>0FAh
    return undefined
  s raw_read addressof:(var uInt8 ack) 1
  id := ack

function mouse_read x y buttons -> key
  arg_w Int x y buttons ; arg Str key
  if mouse_z=0
    if mouse=failure
      var Str device := this_computer:env:"hardware":"mouse":"linux_device"
      if device=""
        device := "device:/psaux"
      kernel_make_device device
      mouse open device in+out+safe
      if mouse=failure
        console "failed to open mouse device " device eol
      desable mouse
      if (set_sample_rate mouse 200)=success and (set_sample_rate mouse 200)=success and (set_sample_rate mouse 80)=success
        var Int id := get_id mouse
        if id=4
          if verbose
            console "switching to mouse extended mode" eol
          extended := true
        eif verbose
          console "mouse model is " id eol
      eif verbose
        console "failed to setup mouse" eol
      enable mouse
    part again
      mouse raw_read addressof:(var uInt8 c) 1
      if (c .and. 8)=0
        restart again
    mouse raw_read addressof:(var uInt8 x8) 1
    mouse raw_read addressof:(var uInt8 y8) 1
    if extended
      mouse raw_read addressof:(var uInt8 z8) 1
    if (c .and. 0C0h)=0
      var Int move_x := (shunt (c .and. 10h)<>0 -256 0) .or. x8
      var Int move_y := (shunt (c .and. 20h)<>0 -256 0) .or. y8
      mouse_x := min (max mouse_x+move_x 0) (cast (size_x-1)*divisor Int)
      mouse_y := min (max mouse_y-move_y 0) (cast (size_y-1)*divisor Int)
      mouse_buttons := c .and. 7
      if extended
        mouse_buttons := mouse_buttons .or. (z8 .and. 30h)\2
        mouse_z := shunt (z8 .and. 08h)<>0 (-16 .or. (z8 .and. 0Fh)) (z8 .and. 0Fh)
  x := cast mouse_x/divisor Int ; y := cast mouse_y/divisor Int ; buttons := mouse_buttons
  if mouse_z<0
    key := "up" ; mouse_z += 1
  eif mouse_z>0
    key := "down" ; mouse_z -= 1
  else
    key := ""

export mouse_read
export mouse_read