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


constant os_KDSKBMODE 4B45h
constant os_K_RAW 0
constant os_K_XLAT 1
module "/pliant/language/unsafe.pli"
module "/pliant/language/stream.pli"
module "/pliant/language/os.pli"
module "mapping.pli"
module "/pliant/fullpliant/this_computer.pli"
module "/pliant/linux/kernel/device.pli"


constant os_KDSKBMODE 4B45h
constant os_K_RAW 0
constant os_K_XLAT 1
constant os_KDSETLED 4B32h
constant os_LED_CAP 4


function keyboard_read -> c
  arg Str c
  if not (exists events:first)
    if use_device
      if kbd=failure
        var Str device := this_computer:env:"hardware":"keyb
        if device=""
          device := "device:/tty0"
        kernel_make_device device
        kbd open device in+safe
        if kbd=success
          os_ioctl kbd:stream_handle os_TCGETS addressof:(va
          ios c_iflag := 0 # ios:c_iflag .and. .not. os_IXOF
          ios c_lflag := 0 # ios:c_lflag .and. .not. os_ISIG
          os_ioctl kbd:stream_handle os_TCSETS addressof:ios
          os_ioctl kbd:stream_handle os_KDSKBMODE (cast os_K
    else
      if first
        os_ioctl 0 os_TCGETS addressof:(var os_TermIOs ios)
        ios c_iflag := 0 # ios:c_iflag .and. .not. os_IXOFF
        ios c_lflag := 0 # ios:c_lflag .and. .not. os_ISIG .
        os_ioctl 0 os_TCSETS addressof:ios
        os_ioctl 0 os_KDSKBMODE (cast os_K_RAW Address)
        first := false
    var Str extended := ""
    if use_device
      kbd raw_read addressof:(var uInt8 ch) 1


function keyboard_read -> c
  arg Str c
  if not (exists events:first)
    if use_device
      if kbd=failure
        var Str device := this_computer:env:"hardware":"keyb
        if device=""
          device := "device:/tty0"
        kernel_make_device device
        kbd open device in+safe
        if kbd=success
          os_ioctl kbd:stream_handle os_TCGETS addressof:(va
          ios c_iflag := 0 # ios:c_iflag .and. .not. os_IXOF
          ios c_lflag := 0 # ios:c_lflag .and. .not. os_ISIG
          os_ioctl kbd:stream_handle os_TCSETS addressof:ios
          os_ioctl kbd:stream_handle os_KDSKBMODE (cast os_K
    else
      if first
        os_ioctl 0 os_TCGETS addressof:(var os_TermIOs ios)
        ios c_iflag := 0 # ios:c_iflag .and. .not. os_IXOFF
        ios c_lflag := 0 # ios:c_lflag .and. .not. os_ISIG .
        os_ioctl 0 os_TCSETS addressof:ios
        os_ioctl 0 os_KDSKBMODE (cast os_K_RAW Address)
        first := false
    var Str extended := ""
    if use_device
      kbd raw_read addressof:(var uInt8 ch) 1
      if ch=224
        extended := "b" ; kbd raw_read addressof:(var uInt8 
      if ch>=224
        extended := character "a":number+ch-224 ; kbd raw_read addressof:(var uInt8 ch) 1
    else
      os_read 0 addressof:(var uInt8 ch) 1
    else
      os_read 0 addressof:(var uInt8 ch) 1
      if ch=224
        extended := "b" ; os_read 0 addressof:(var uInt8 ch)
      if ch>=224
        extended := character "a":number+ch-224 ; os_read 0 addressof:(var uInt8 ch) 1
    var CBool pressed := (ch .and. 80h)=0
    var Str key := string:(cast (ch .and. 7Fh) Int)+extended
    events += (shunt pressed "press " "release ")+"key"+key
    var Data:KeyboardLayout l :> keyboard_database:data:layo
    var CBool pressed := (ch .and. 80h)=0
    var Str key := string:(cast (ch .and. 7Fh) Int)+extended
    events += (shunt pressed "press " "release ")+"key"+key
    var Data:KeyboardLayout l :> keyboard_database:data:layo
    if { var Data:Str k :> l:key key ; exists k }
      events += (shunt pressed "press " "release ")+k
    var Str head tail
    if { var Data:Str k :> l:key modifier+key ; exists k }
      head := "" ; tail := k
    eif { var Data:Str k :> l:key key ; exists k }
      head := modifier ; tail := k
    else
      head := "" ; tail := ""
    if { var Data:Str m :> l:modifier key ; m<>"" }
      if (shunt pressed 1 0)=(shunt (switch search m -1)=(-1
        if (modifier search m -1)=(-1)
          modifier += m+" "
      else
        modifier := replace modifier m+" " ""
    if { var Data:Str m :> l:modifier key ; m<>"" }
      if (shunt pressed 1 0)=(shunt (switch search m -1)=(-1
        if (modifier search m -1)=(-1)
          modifier += m+" "
      else
        modifier := replace modifier m+" " ""
    eif pressed and { var Data:Str s :> l:switch key ; s<>""
      if (switch search s -1)=(-1)
        switch += s+" "
      else
        switch := replace switch s+" " ""
      modifier := switch
    eif pressed
      if { var Data:Str k :> l:key modifier+key ; exists k }
        events += k
      eif { var Data:Str k :> l:key key ; exists k }
        events += modifier+k
      head := ""
    if { var Data:Str s :> l:switch key ; s<>"" }
      if pressed and key<>last
        if (switch search s -1)=(-1)
          switch += s+" "
        else
          switch := replace switch s+" " ""
        if use_device
          os_ioctl kbd:stream_handle os_KDSETLED (cast (shunt switch<>"" os_LED_CAP 0) Address)
        else
          os_ioctl 0 os_KDSETLED (cast (shunt switch<>"" os_LED_CAP 0) Address)
        modifier := switch
      head := ""
    if tail<>""
      events += (shunt pressed "press " "release ")+head+tail
      if pressed
        events += head+tail
    last := shunt pressed key ""
  if (exists events:first)
    c := events first
    events remove events:first
  else
    c := ""

export keyboard_set_layout keyboard_read
    last := shunt pressed key ""
  if (exists events:first)
    c := events first
    events remove events:first
  else
    c := ""

export keyboard_set_layout keyboard_read