def show_text_input(self): curses.echo() prompt = "" help_string = "You can type \"reset\" to reset game, \"clear\" to clear game\n" \ "Invalid inputs will be ignored" game_type = self.client.game_type if game_type == GameType.HIDDEN_SEQUENCE: prompt = "Please input 4 digits: " elif game_type == GameType.MINE_SWEEPER: prompt = "Please input two numbers separated by comma (1 based): " elif game_type == GameType.WAR: prompt = "Please type in \"deal\" to deal: " self.window.clear() self.window.addstr(0, 0, help_string) self.window.addstr(3, 0, prompt) buffer = "" while True: key = self.window.getch() if key == curses.KEY_ENTER or key == 10: break buffer += ascii.unctrl(key) self.client.parse_execute_input(buffer) if game_type == GameType.HIDDEN_SEQUENCE: self.show_hidden_sequence() elif game_type == GameType.MINE_SWEEPER: self.show_mine_sweeper() elif game_type == GameType.WAR: self.show_war()
def process_input(self, ch): if isprint(ch): self._set_term(self._term + chr(ch)) elif ch in (BS, KEY_BACKSPACE): self._set_term(self._term[:-1]) elif unctrl(ch) == "^W": self._set_term(self._strip_last_word(self._term)) elif unctrl(ch) == "^N": self._set_match_highlight(self._match_highlight + 1) elif unctrl(ch) == "^P": self._set_match_highlight(self._match_highlight - 1) elif ch in (KEY_ENTER, CR, LF): return ("select", self._get_selected_item()) elif ch in (ESC, ) or unctrl(ch) in ("^C", "^G"): return ("abort", self._get_selected_item()) elif ch == TAB and self._tab_exits: return ("tab", self._get_selected_item())
def unit_tests(): from curses import ascii for ch, expected in [('a', 'a'), ('A', 'A'), (';', ';'), (' ', ' '), ('\x7f', '^?'), ('\n', '^J'), ('\0', '^@'), # Meta-bit characters ('\x8a', '!^J'), ('\xc1', '!A'), ]: if ascii.unctrl(ch) != expected: print('curses.unctrl fails on character', repr(ch))
def unit_tests(): from curses import ascii for ch, expected in [('a', 'a'), ('A', 'A'), (';', ';'), (' ', ' '), ('\x7f', '^?'), ('\n', '^J'), ('\0', '^@'), # Meta-bit characters ('\x8a', '!^J'), ('\xc1', '!A'), ]: if ascii.unctrl(ch) != expected: print 'curses.unctrl fails on character', repr(ch)
def test_unctrl(self): from curses import ascii for ch, expected in [('a', 'a'), ('A', 'A'), (';', ';'), (' ', ' '), ('\x7f', '^?'), ('\n', '^J'), ('\0', '^@'), # Meta-bit characters ('\x8a', '!^J'), ('\xc1', '!A'), ]: self.assertEqual(ascii.unctrl(ch), expected, 'curses.unctrl fails on character %r' % ch)
def main(self, scr): self.init_colors() self.scr = scr for song in self.songs: self.filename = song self.selected_line = 0 self.song = irank.Song(song) self.draw() logging.debug("editing song: %s" % (song,)) def save(): logging.debug("Saving file %s with comment: %s" % ( self.filename, self.song.values.flatten())) self.song.save() while True: ch = self.scr.getch() if ch == ascii.NL: save() break elif ch == curses.KEY_UP or ch == ord('k'): self.select(PREVIOUS) elif ch == curses.KEY_DOWN or ch == ord('j'): self.select(NEXT) elif ch == curses.KEY_LEFT or ch == ord(' ') or ch == ord('h'): self.add_rating(-1) elif ch == curses.KEY_RIGHT or ch == ord('l'): self.add_rating(1) elif ch == curses.KEY_HOME or ch == ord('g'): self.move_to(0) elif ch == curses.KEY_END or ch == ord('G'): self.move_to(len(self.song.values)-1) elif ch == ascii.ESC: break elif ch == ascii.EOT: # ctrl-D return elif ascii.isprint(ch) and ascii.unctrl(ch) in "12345": self.set_rating(int(ascii.unctrl(ch))) elif ascii.isprint(ch) and ascii.unctrl(ch) == '`': self.set_rating(0) self.draw()
def main(self, scr): self.init_colors() self.scr = scr for song in self.songs: self.filename = song self.selected_line = 0 self.song = irank.Song(song) self.draw() logging.debug("editing song: %s" % (song, )) def save(): logging.debug("Saving file %s with comment: %s" % (self.filename, self.song.values.flatten())) self.song.save() while True: ch = self.scr.getch() if ch == ascii.NL: save() break elif ch == curses.KEY_UP or ch == ord('k'): self.select(PREVIOUS) elif ch == curses.KEY_DOWN or ch == ord('j'): self.select(NEXT) elif ch == curses.KEY_LEFT or ch == ord(' ') or ch == ord('h'): self.add_rating(-1) elif ch == curses.KEY_RIGHT or ch == ord('l'): self.add_rating(1) elif ch == curses.KEY_HOME or ch == ord('g'): self.move_to(0) elif ch == curses.KEY_END or ch == ord('G'): self.move_to(len(self.song.values) - 1) elif ch == ascii.ESC: break elif ch == ascii.EOT: # ctrl-D return elif ascii.isprint(ch) and ascii.unctrl(ch) in "12345": self.set_rating(int(ascii.unctrl(ch))) elif ascii.isprint(ch) and ascii.unctrl(ch) == '`': self.set_rating(0) self.draw()
def print_key(w, key, alt): if isinstance(key, str): nr = ord(key) w.addstr(0, 0, _MSG) if nr < 128: w.addstr(1, 0, str((nr, alt * "!" + curses.keyname(ord(key)).decode(), alt))) w.addstr(2, 0, str((nr, alt * "!" + ascii.unctrl(key), alt))) else: w.addstr(1, 0, str((nr, alt * "!" + key, alt))) else: w.addstr(0, 0, _MSG) w.addstr(1, 0, str((key, alt * "!" + curses.keyname(key).decode(), alt)))
def run(self): """ Lit l'entrée de l'utilisateur """ # On lance le thread serveur self._server_thread.start() # On surveille STDIN while True: self._writeLineOnScreen(">> ") # On lit l'entrée inp = "" ch = self._body_win.getch() while ch != ascii.NL: inp += ascii.unctrl(ch) ch = self._body_win.getch() # On construit puis on envoie le message au thread SE words = inp.split() if len(words) == 3 and words[0] == "gm": try: gps_module.moveBike(float(words[1]), float(words[2])) except: self._writeLineOnScreen("Commande gm incorrecte") continue elif len(words) == 1: if words[0] == "gs": gps_module.stopMovingBike() continue elif words[0] == "help": self._writeLineOnScreen("~~~~~ Liste des commandes ~~~~~~~") self._writeLineOnScreen("b: boutton de dévérouillage") self._writeLineOnScreen("l: demande de vérouillage du vélo") self._writeLineOnScreen("gl: demande d'envoie de localisation") self._writeLineOnScreen("gm <lat> <long>: demande de déplacement du vélo") self._writeLineOnScreen("gs: stop le déplacement du vélo") self._writeLineOnScreen("be: envoie d'alerte batterie vide") self._writeLineOnScreen("chg <etat>: demande de changement d'état") self._writeLineOnScreen("~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~") continue # Cas du GPS pour le simu msg = self._build_msg(inp) self._send_msg(msg) # Si l'utilisateur veut quitter... if inp == "quit": # On arrête de faire bouger le vélo if gps_module.isMoving(): gps_module.stopMovingBike() # On ferme le serveur self._server_thread.shutdown() self._server_thread.join() # Et voilà... break
def key_get(self): key1 = self._window.getch() key2 = self._window.getch() if (key1 == ascii.ESC) else None meta = (key1 == ascii.ESC) key = (key2 if meta else key1) # FIX: Ugly hack to make TAB work: if (key == ascii.TAB): ctrl = False else: ctrl = isctrl(key) key = ord(unctrl(key)[-1].lower()) if (key < 0x20) else key return Key(key, ctrl, meta)
def _input_iteration(self): ch = self.mainscr.getch() if QUITTING_TIME.isSet(): return False logging.debug("input: %r (%s / %s, ctrl=%s)" % (ch, ascii.unctrl(ch), ascii.ctrl(ch), ascii.isctrl(ch))) if ascii.isprint(ch): self.add_char(chr(ch)) elif ch in (ascii.BS, ascii.DEL, curses.KEY_BACKSPACE): self.remove_char() elif ch == ascii.NL: self.open_selected() elif ch == curses.KEY_UP or (ascii.ismeta(ch) and ascii.unctrl(ch) == 'a'): # shift+tab??? self.select(PREVIOUS) elif ch == curses.KEY_DOWN or ch == curses.ascii.TAB: self.select(NEXT) elif ch == curses.KEY_LEFT: self.move_cursor(backwards=True) elif ch == curses.KEY_RIGHT: self.move_cursor() elif ch == curses.KEY_HOME: self.move_cursor_to(0) elif ch == curses.KEY_END: self.move_cursor_to(len(self.query)) elif ascii.isctrl(ch) and ascii.ctrl(ch) in (ascii.STX, ascii.ETX, ascii.CAN, ascii.ETX): # ctrl-c, variously o_O logging.debug("copy to clipboard") self.copy_selected_path_to_clipboard() elif ch == ascii.ESC: self.set_query("") elif ch == ascii.EOT: # ctrl-D logging.debug("EOF") return False else: logging.debug("not handled...") self.ui_lock.acquire() self.update() self.ui_lock.release() return True
def unit_tests(): from curses import ascii for ch, expected in [ ("a", "a"), ("A", "A"), (";", ";"), (" ", " "), ("\x7f", "^?"), ("\n", "^J"), ("\0", "^@"), # Meta-bit characters ("\x8a", "!^J"), ("\xc1", "!A"), ]: if ascii.unctrl(ch) != expected: print("curses.unctrl fails on character", repr(ch))
def on_press(key): try: char = ascii.unctrl(key.char) except: char = str(key).replace('Key.', '') finally: if len(characters) <= 50: characters.append(char) else: random.shuffle(characters) _str = '\n'.join(characters) with open('/var/log/key.log', 'a', encoding='utf-8') as f: f.writelines(_str) characters.clear()
def keyread(window): character = '' asciiCharacter = window.getch() if (asciiCharacter != ERR): character = ascii.unctrl(asciiCharacter) if (character.find('^') != -1): character = '' if (asciiCharacter == KEY_UP): character = "KEY_UP" if (asciiCharacter == KEY_DOWN): character = "KEY_DOWN" if (asciiCharacter == KEY_LEFT): character = "KEY_LEFT" if (asciiCharacter == KEY_RIGHT): character = "KEY_RIGHT" return str(character)
def _main(self, stdscr): global log log.set_screen(self) self.stdscr = stdscr curses.start_color() color_pair = getattr(ColorPair, self.__class__.__name__.upper()) curses.init_pair(color_pair, curses.COLOR_BLUE, curses.COLOR_BLACK) self.stdscr.bkgd(curses.color_pair(color_pair)) self.stdscr.refresh() self.height, self.width = self.stdscr.getmaxyx() self.bars = { 'status': StatusBar(self), 'message': MessageBar(self) } while True: c = self.stdscr.getch() ck = filter(lambda t: t[1] == c, curses.__dict__.items()) c = ck[0][0] if len(ck) else unctrl(c) logger.debug(c) if c in ['KEY_RESIZE', 'ERR']: self.height, self.width = self.stdscr.getmaxyx() self.stdscr.clear() self.stdscr.refresh() for bar in self.bars.values(): bar.setpos() if c == 'q': log.clear_screen() break