code: def get_typed_strings(events, allow_backspace=True):
      
      backspace_name = 'delete' if _platform.system() == 'Darwin' else 'backspace'
  
      shift_pressed = False
      capslock_pressed = False
      string = ''
      for event in events:
          name = event.name
  
          # Space is the only key that we _parse_hotkey to the spelled out name
          # because of legibility. Now we have to undo that.
          if event.name == 'space':
              name = ' '
  
          if 'shift' in event.name:
              shift_pressed = event.event_type == 'down'
          elif event.name == 'caps lock' and event.event_type == 'down':
              capslock_pressed = not capslock_pressed
          elif allow_backspace and event.name == backspace_name and event.event_type == 'down':
              string = string[:-1]
          elif event.event_type == 'down':
              if len(name) == 1:
                  if shift_pressed ^ capslock_pressed:
                      name = name.upper()
                  string = string + name
              else:
                  yield string
                  string = ''
      yield string
docs: Given a sequence of events, tries to deduce what strings were typed.
      Strings are separated when a non-textual key is pressed (such as tab or
      enter). Characters are converted to uppercase according to shift and
      capslock status. If `allow_backspace` is True, backspaces remove the last
      character typed.
  
      This function is a generator, so you can pass an infinite stream of events
      and convert them to strings in real time.
  
      Note this functions is merely an heuristic. Windows for example keeps per-
      process keyboard state such as keyboard layout, and this information is not
      available for our hooks.
  
          get_type_strings(record()) #-> ['This is what', 'I recorded', '']