Example #1
0
 def use_smoothed(self):
     return self.satt and get_encoding_mode()=="utf8"
Example #2
0
def process_keyqueue(codes, more_available):
	"""
	codes -- list of key codes
	more_available -- if True then raise MoreInputRequired when in the 
		middle of a character sequence (escape/utf8/wide) and caller 
		will attempt to send more key codes on the next call.
	
	returns (list of input, list of remaining key codes).
	"""
	code = codes[0]
	if code >= 32 and code <= 126:
		key = chr(code)
		return [key], codes[1:]
	if _keyconv.has_key(code):
		return [_keyconv[code]], codes[1:]
	if code >0 and code <27:
		return ["ctrl %s" % chr(ord('a')+code-1)], codes[1:]
	if code >27 and code <32:
		return ["ctrl %s" % chr(ord('A')+code-1)], codes[1:]
	
	em = util.get_encoding_mode()
	
	if (em == 'wide' and code < 256 and  
		util.within_double_byte(chr(code),0,0)):
		if not codes[1:]:
			if more_available:
				raise MoreInputRequired()
		if codes[1:] and codes[1] < 256:
			db = chr(code)+chr(codes[1])
			if util.within_double_byte(db, 0, 1):
				return [db], codes[2:]
	if em == 'utf8' and code>127 and code<256:
		if code & 0xe0 == 0xc0: # 2-byte form
			need_more = 1
		elif code & 0xf0 == 0xe0: # 3-byte form
			need_more = 2
		elif code & 0xf8 == 0xf0: # 4-byte form
			need_more = 3
		else:
			return ["<%d>"%code], codes[1:]

		for i in range(need_more):
			if len(codes)-1 <= i:
				if more_available:
					raise MoreInputRequired()
				else:
					return ["<%d>"%code], codes[1:]
			k = codes[i+1]
			if k>256 or k&0xc0 != 0x80:
				return ["<%d>"%code], codes[1:]
		
		s = "".join([chr(c)for c in codes[:need_more+1]])
		try:
			return [s.decode("utf-8")], codes[need_more+1:]
		except UnicodeDecodeError:
			return ["<%d>"%code], codes[1:]
		
	if code >127 and code <256:
		key = chr(code)
		return [key], codes[1:]
	if code != 27:
		return ["<%d>"%code], codes[1:]

	result = input_trie.get(codes[1:], more_available)
	
	if result is not None:
		result, remaining_codes = result
		return [result], remaining_codes
	
	if codes[1:]:
		# Meta keys -- ESC+Key form
		run, remaining_codes = process_keyqueue(codes[1:], 
			more_available)
		if run[0] == "esc" or run[0].find("meta ") >= 0:
			return ['esc']+run, remaining_codes
		return ['meta '+run[0]]+run[1:], remaining_codes
		
	return ['esc'], codes[1:]
Example #3
0
def process_keyqueue(codes, more_available):
    """
	codes -- list of key codes
	more_available -- if True then raise MoreInputRequired when in the 
		middle of a character sequence (escape/utf8/wide) and caller 
		will attempt to send more key codes on the next call.
	
	returns (list of input, list of remaining key codes).
	"""
    code = codes[0]
    if code >= 32 and code <= 126:
        key = chr(code)
        return [key], codes[1:]
    if _keyconv.has_key(code):
        return [_keyconv[code]], codes[1:]
    if code > 0 and code < 27:
        return ["ctrl %s" % chr(ord('a') + code - 1)], codes[1:]
    if code > 27 and code < 32:
        return ["ctrl %s" % chr(ord('A') + code - 1)], codes[1:]

    em = util.get_encoding_mode()

    if (em == 'wide' and code < 256
            and util.within_double_byte(chr(code), 0, 0)):
        if not codes[1:]:
            if more_available:
                raise MoreInputRequired()
        if codes[1:] and codes[1] < 256:
            db = chr(code) + chr(codes[1])
            if util.within_double_byte(db, 0, 1):
                return [db], codes[2:]
    if em == 'utf8' and code > 127 and code < 256:
        if code & 0xe0 == 0xc0:  # 2-byte form
            need_more = 1
        elif code & 0xf0 == 0xe0:  # 3-byte form
            need_more = 2
        elif code & 0xf8 == 0xf0:  # 4-byte form
            need_more = 3
        else:
            return ["<%d>" % code], codes[1:]

        for i in range(need_more):
            if len(codes) - 1 <= i:
                if more_available:
                    raise MoreInputRequired()
                else:
                    return ["<%d>" % code], codes[1:]
            k = codes[i + 1]
            if k > 256 or k & 0xc0 != 0x80:
                return ["<%d>" % code], codes[1:]

        s = "".join([chr(c) for c in codes[:need_more + 1]])
        try:
            return [s.decode("utf-8")], codes[need_more + 1:]
        except UnicodeDecodeError:
            return ["<%d>" % code], codes[1:]

    if code > 127 and code < 256:
        key = chr(code)
        return [key], codes[1:]
    if code != 27:
        return ["<%d>" % code], codes[1:]

    result = input_trie.get(codes[1:], more_available)

    if result is not None:
        result, remaining_codes = result
        return [result], remaining_codes

    if codes[1:]:
        # Meta keys -- ESC+Key form
        run, remaining_codes = process_keyqueue(codes[1:], more_available)
        if run[0] == "esc" or run[0].find("meta ") >= 0:
            return ['esc'] + run, remaining_codes
        return ['meta ' + run[0]] + run[1:], remaining_codes

    return ['esc'], codes[1:]