def edit_str(self, target, c, is_num=False): # detect backspace if c in [8, 127, 263] and target: target = target[:-1] elif not is_num or curses.unctrl(c) in '0123456789.': target += curses.unctrl(c) return target
def edit_str(self, target, c, is_num=False): chars = '0123456789.' if is_num else '0123456789.:;,!?abcdefghigklmnoprstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ' if curses.unctrl(c) in chars: target += curses.unctrl(c) elif c==263 and target: target = target[:-1] return target
def mainLoop(screen): mon.monitor(screen) screen.displayTime(mon.config.startTime) screen.displaySummary(mon.config.getStatusStats()) if mon.config.finalizeFinished(): screen.displayFinalResult(mon.config.finalJob) if mon.submitReady: if len(mon.submitList) == 0: screen.resetSubmit(mon.config.getJobsNumberReady()) else: screen.resetSubmit(len(mon.submitList)) for job in mon.generateJobs(): mon.submit(job) screen.displaySubmit(job.jobID, job.index) screen.repaint() k = screen.getch() if k != -1: if screen.stdscr != None: if curses.unctrl(k) == "^R": mon.reSubmitFailed() if curses.unctrl(k) == "^T": screen.setWaitingTime() if curses.unctrl(k) == "^G": mon.submitInit()
def keyPressed(self, key): if curses.unctrl(key) == "K": return DCommands(DCommands.Kill) elif curses.unctrl(key) == "r": return DCommands(DCommands.Refresh) return MyWindow.keyPressed(self, key)
def main_command(self): c = self.stdscr.getch() print c if c == curses.KEY_RIGHT: self.tab = (self.tab + 1) % self.num_tabs elif c == curses.KEY_LEFT: self.tab = (self.tab - 1) % self.num_tabs elif c == curses.KEY_DOWN: self.pos += 1 elif c == curses.KEY_UP: self.pos -= 1 elif c == 9: self.pos += 1 # tab elif curses.unctrl(c) in ["^W", "^C", "^X", "^Q"]: self.tab = -1 elif curses.unctrl(c) in ["^N"]: self.network_dialog() elif curses.unctrl(c) == "^S": self.settings_dialog() else: return c if self.pos < 0: self.pos = 0 if self.pos >= self.maxpos: self.pos = self.maxpos - 1
def edit_str(self, target, c, is_num=False): chars = '0123456789.' if is_num else '0123456789.:;,!?abcdefghigklmnoprstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ' if curses.unctrl(c) in chars: target += curses.unctrl(c) elif c == 263 and target: target = target[:-1] return target
def keyPressed(self, key): if key == curses.KEY_LEFT: return DCommands(DCommands.Back) elif curses.unctrl(key) == "^R": return DCommands(DCommands.Refresh) elif curses.unctrl(key) == "^G": return DCommands(DCommands.Submit) elif curses.unctrl(key) == "^K": return DCommands(DCommands.Switch) elif curses.unctrl(key) == "^T": self.setWaitingTime() return MyWindow.keyPressed(self, key)
def main_command(self): c = self.stdscr.getch() if c == curses.KEY_RIGHT: self.tab = (self.tab + 1)%self.num_tabs elif c == curses.KEY_LEFT: self.tab = (self.tab - 1)%self.num_tabs elif c == curses.KEY_DOWN: self.pos +=1 elif c == curses.KEY_UP: self.pos -= 1 elif c == 9: self.pos +=1 # tab elif curses.unctrl(c) in ['^W', '^C', '^X', '^Q']: self.tab = -1 elif curses.unctrl(c) in ['^N']: self.network_dialog() elif curses.unctrl(c) == '^S': self.settings_dialog() else: return c if self.pos<0: self.pos=0 if self.pos>=self.maxpos: self.pos=self.maxpos - 1
def main_command(self): c = self.stdscr.getch() if c == curses.KEY_RIGHT: self.tab = (self.tab + 1) % self.num_tabs elif c == curses.KEY_LEFT: self.tab = (self.tab - 1) % self.num_tabs elif c == curses.KEY_DOWN: self.pos += 1 elif c == curses.KEY_UP: self.pos -= 1 elif c == 9: self.pos += 1 # tab elif curses.unctrl(c) in ['^W', '^C', '^X', '^Q']: self.tab = -1 elif curses.unctrl(c) in ['^N']: self.network_dialog() elif curses.unctrl(c) == '^S': self.settings_dialog() else: return c if self.pos < 0: self.pos = 0 if self.pos >= self.maxpos: self.pos = self.maxpos - 1
def potato(bananascreen): """ Curses is controlled from here. This might be called 'the loop' in a game. game loop: http://gameprogrammingpatterns.com/game-loop.html """ curses.textpad.rectangle(bananascreen,0,0,10,10) keypress = int() # 113 is the lowercase 'q' key. while keypress != 113: keypress = bananascreen.getch() print curses.unctrl(keypress), keypress
def potato(bananascreen): """ Curses is controlled from here. This might be called 'the loop' in a game. game loop: http://gameprogrammingpatterns.com/game-loop.html """ curses.textpad.rectangle(bananascreen, 0, 0, 10, 10) keypress = int() # 113 is the lowercase 'q' key. while keypress != 113: keypress = bananascreen.getch() print curses.unctrl(keypress), keypress
def potato(bananawindow): """ Curses is controlled from here. This might be called 'the loop' in a game. """ def background(): """ Writes the default background each screen rewrite. """ bananawindow.border() bananawindow.bkgdset('+') winheight, winwidth = bananawindow.getmaxyx() winheight_str = str(winheight) winwidth_str = str(winwidth) bananawindow.addstr(winheight - 2, winwidth - 10, winheight_str) bananawindow.addstr(winheight - 2, winwidth - 10 + len(winheight_str), "," + winwidth_str) background() keypress = int() # 113 is the lowercase 'q' key. while curses.keyname(keypress) != '^D': keypress = bananawindow.getch() bananawindow.erase() background() # Lets actually add the character to the screen now. bananawindow.addch(1, 10, keypress) bananawindow.addstr(2, 10, curses.unctrl(keypress)) bananawindow.addstr(3, 10, curses.keyname(keypress))
def potato(bananawindow): """ Curses is controlled from here. This might be called 'the loop' in a game. """ def background(): """ Writes the default background each screen rewrite. """ bananawindow.border() bananawindow.bkgdset('+') winheight, winwidth = bananawindow.getmaxyx() winheight_str = str(winheight) winwidth_str = str(winwidth) bananawindow.addstr(winheight-2, winwidth-10, winheight_str) bananawindow.addstr(winheight-2, winwidth-10+len(winheight_str), ","+winwidth_str) background() keypress = int() # 113 is the lowercase 'q' key. while curses.keyname(keypress) != '^D': keypress = bananawindow.getch() bananawindow.erase() background() # Lets actually add the character to the screen now. bananawindow.addch(1,10,keypress) bananawindow.addstr(2,10,curses.unctrl(keypress)) bananawindow.addstr(3,10,curses.keyname(keypress))
def draw(self, disp): disp.inv.clear() for i in range(self.max_inv): if i in self.eqp: color = curses.A_BOLD | curses.color_pair(2) else: color = curses.A_NORMAL | curses.color_pair(2) if self.charges[i] > 0: disp.inv.addstr( "%s %s %d\n" % (curses.unctrl(ord('a') + i), items[self.inv[i]]['name'], self.charges[i]), color) else: disp.inv.addstr( "%s %s\n" % (curses.unctrl(ord('a') + i), items[self.inv[i]]['name']), color)
def _handle_input(self, c): if c == 27: # escape self._wc.end_input(True) elif c == 10: # enter self._wc.end_input() elif c == 127: # backspace self._wc.backspace() elif c in range(32, 127): self._wc.input_char(curses.unctrl(c).decode("utf-8"))
def loop(): draw() inp = scr.getch(root.cursor_r,root.cursor_c) dummy_allkeys = [False]*(keys.K_MAX+1)#curses wont tell us what other keys are pressed at any moment if inp in curses2sdl: lemon.handle(lemon.KeypressEvent(dummy_allkeys, False, curses2sdl[inp], 0)) else: lemon.handle(lemon.KeypressEvent(dummy_allkeys, unichr(inp), 0, 0)) log(inp, c.unctrl(inp))
def handlekeypressed(self, keypressed, opts): """ Perform actions based on pressed keys. Return true to exit the main loop. """ if keypressed in ["k", "KEY_UP"]: self.uparrowevent() if keypressed in ["K", "KEY_PPAGE"]: self.uparrowshiftevent() elif keypressed in ["j", "KEY_DOWN"]: self.downarrowevent() elif keypressed in ["J", "KEY_NPAGE"]: self.downarrowshiftevent() elif keypressed in ["l", "KEY_RIGHT"]: self.rightarrowevent() elif keypressed in ["h", "KEY_LEFT"]: self.leftarrowevent() elif keypressed in ["H", "KEY_SLEFT"]: self.leftarrowshiftevent() elif keypressed in ["q"]: raise util.Abort(_('user quit')) elif keypressed in ['a']: self.toggleamend(opts) elif keypressed in ["c"]: if self.confirmcommit(): opts['commit'] = True return True elif keypressed in ["s"]: opts['commit'] = False if self.confirmcommit(stage=True): opts['commit'] = False return True elif keypressed in ["r"]: if self.confirmcommit(review=True): opts['commit'] = True opts['crecord_reviewpatch'] = True return True elif keypressed in [' ']: self.toggleapply() elif keypressed in ['A']: self.toggleall() elif keypressed in ["f"]: self.togglefolded() elif keypressed in ["F"]: self.togglefolded(foldParent=True) elif keypressed in ["?"]: self.helpwindow() self.stdscr.clear() self.stdscr.refresh() elif curses.unctrl(keypressed) in ["^L"]: # scroll the current line to the top of the screen self.scrolllines(self.selecteditemstartline) return False
def confirm(self): self.stdscr.nodelay(False) try: k = self.stdscr.getkey() if curses.unctrl(k)=="d": curses.cbreak() return True except: pass curses.cbreak() return False
def input_idnp(): stdscr = panouri.stdscr() stdscr.keypad(1) stdscr.clear() h, w = stdscr.getmaxyx() idnp = '' while True: stdscr.clear() stdscr.addstr(h // 2, w // 2, "IDNP:") stdscr.addstr(h // 2 + 1, w // 2 - 4, idnp) char = stdscr.get_wch() if isinstance(char, str) and char.isprintable(): idnp += char elif str(curses.unctrl(char)) == "b\'^H\'": # Daca backspace este apasat, sterge un char. idnp = idnp[:-1] elif str(curses.unctrl(char)) == "b\'^J\'": # Daca este apasat enter, then submit. stdscr.clear() panouri.panou_content().clear() content.alerta("Iau datele, te rog asteapta!") return check(idnp) else: continue # Daca este apasata o alta tasta neprintabila, nu fa nimic.
def get_char_list(s): ret_list = [] while True: try: key = s.get_wch() except curses.error: # No input, this means a timeout occurs. return ret_list except ValueError: # invalid input log.debug('Invalid character entered.') return ret_list # Set to non-blocking. We try to read more bytes. If there are no # more data to read, it will immediately timeout and return with the # data we have so far s.timeout(0) if isinstance(key, int): ret_list.append(curses.keyname(key).decode()) else: if curses.ascii.isctrl(key): key = curses.unctrl(key).decode() # Here special cases for alt keys, where we get a ^[ and then a second char if key == '^[': try: part = s.get_wch() if part == '[': # CTRL+arrow and meta+arrow keys have a long format part += s.get_wch() + s.get_wch() + s.get_wch( ) + s.get_wch() except curses.error: pass except ValueError: # invalid input log.debug('Invalid character entered.') else: key = 'M-%s' % part # and an even more special case for keys like # ctrl+arrows, where we get ^[, then [, then a third # char. if key == 'M-[': try: part = s.get_wch() except curses.error: pass except ValueError: log.debug('Invalid character entered.') else: key = '%s-%s' % (key, part) if key == '\x7f' or key == '\x08': key = '^?' elif key == '\r': key = '^M' ret_list.append(key)
def get_char_list(s): ret_list = [] while True: try: key = s.get_wch() except curses.error: # No input, this means a timeout occurs. return ret_list except ValueError: # invalid input log.debug('Invalid character entered.') return ret_list # Set to non-blocking. We try to read more bytes. If there are no # more data to read, it will immediately timeout and return with the # data we have so far s.timeout(0) if isinstance(key, int): ret_list.append(curses.keyname(key).decode()) else: if curses.ascii.isctrl(key): key = curses.unctrl(key).decode() # Here special cases for alt keys, where we get a ^[ and then a second char if key == '^[': try: part = s.get_wch() if part == '[': # CTRL+arrow and meta+arrow keys have a long format part += s.get_wch() + s.get_wch() + s.get_wch() + s.get_wch() except curses.error: pass except ValueError: # invalid input log.debug('Invalid character entered.') else: key = 'M-%s' % part # and an even more special case for keys like # ctrl+arrows, where we get ^[, then [, then a third # char. if key == 'M-[': try: part = s.get_wch() except curses.error: pass except ValueError: log.debug('Invalid character entered.') else: key = '%s-%s' % (key, part) if key == '\x7f' or key == '\x08': key = '^?' elif key == '\r': key = '^M' ret_list.append(key)
def mainLoop(): global screen screen.repaint() k = screen.getch() if k != -1: if curses.unctrl(k) == "^W": screen.switchList() elif k == curses.KEY_DOWN: screen.currList.goDown() elif k == curses.KEY_UP: screen.currList.goUp() elif curses.unctrl(k) == " ": screen.currList.select() elif curses.unctrl(k) == "c": copy() elif curses.unctrl(k) == "d": delete() elif k == curses.KEY_RIGHT: levelDown() elif k == curses.KEY_LEFT: levelUp() elif curses.unctrl(k) == "^D": sys.exit(0)
def write(self, data): '''Write data at the current cursor position''' assert self.offset + self.cursor.y < len(self.lines) if isinstance(data, bytes): data = data.decode('utf8', 'replace') log.debug('write: %r', data) replay.info('%d:WRITE %s', time.time(), json.dumps(data)) current = '' while data: c = data[0] remove = 1 if c == '\x1b': self._write_line(current) remove = self._control_seq(data) current = '' elif c == '\a': curses.beep() elif c == '\b': self._write_line(current) self.cursor.x = max(0, self.cursor.x - 1) current = '' elif c == '\t': current = self._expand_tab(current) elif c == '\n': self._write_line(current) self._cursor_newline(real=True) current = '' elif c == '\r': self._write_line(current) self.cursor.x = 0 current = '' else: if unicodedata.category(c) in ('Cc', 'Cf', 'Cn', 'Cs'): # control characters c = curses.unctrl(ord(c)).decode('utf8') current += c data = data[remove:] self._write_line(current) self._log_state()
def get_keys(self) -> Tuple[int, str]: keys = repeat_factor = "" for _ in range(MAX_KEYBINDING_LENGTH): ch = self.stdscr.getch() log.info("raw ch without unctrl: %s", ch) try: key = curses.unctrl(ch).decode() except Exception: log.warning("cant uncrtl: %s", ch) break if key.isdigit(): repeat_factor += key continue keys += key # if match found or there are not any shortcut matches at all if all(p == keys or not p.startswith(keys) for p in MULTICHAR_KEYBINDINGS): break return cast(int, num(repeat_factor, default=1)), keys or "UNKNOWN"
def loop(self): while True: wch = self.main_window.get_wch() # handling escape sequences try: s = curses.unctrl(wch) if s.decode() == '^[': self.main_window.nodelay(True) while True: try: s += self._unctr(self.main_window.get_wch()) except _curses.error: break self.main_window.nodelay(False) s = s.decode() except OverflowError or LookupError or UnicodeDecodeError: print('overflow') s = wch # print(s) self.key_handler(s) self.refresh()
def module_funcs(stdscr): "Test module-level functions" for func in [curses.baudrate, curses.beep, curses.can_change_color, curses.cbreak, curses.def_prog_mode, curses.doupdate, curses.filter, curses.flash, curses.flushinp, curses.has_colors, curses.has_ic, curses.has_il, curses.isendwin, curses.killchar, curses.longname, curses.nocbreak, curses.noecho, curses.nonl, curses.noqiflush, curses.noraw, curses.reset_prog_mode, curses.termattrs, curses.termname, curses.erasechar, curses.getsyx]: func() # Functions that actually need arguments if curses.tigetstr("cnorm"): curses.curs_set(1) curses.delay_output(1) curses.echo() ; curses.echo(1) f = tempfile.TemporaryFile() stdscr.putwin(f) f.seek(0) curses.getwin(f) f.close() curses.halfdelay(1) curses.intrflush(1) curses.meta(1) curses.napms(100) curses.newpad(50,50) win = curses.newwin(5,5) win = curses.newwin(5,5, 1,1) curses.nl() ; curses.nl(1) curses.putp('abc') curses.qiflush() curses.raw() ; curses.raw(1) curses.setsyx(5,5) curses.tigetflag('hc') curses.tigetnum('co') curses.tigetstr('cr') curses.tparm('cr') curses.typeahead(sys.__stdin__.fileno()) curses.unctrl('a') curses.ungetch('a') curses.use_env(1) # Functions only available on a few platforms if curses.has_colors(): curses.start_color() curses.init_pair(2, 1,1) curses.color_content(1) curses.color_pair(2) curses.pair_content(curses.COLOR_PAIRS - 1) curses.pair_number(0) if hasattr(curses, 'use_default_colors'): curses.use_default_colors() if hasattr(curses, 'keyname'): curses.keyname(13) if hasattr(curses, 'has_key'): curses.has_key(13) if hasattr(curses, 'getmouse'): (availmask, oldmask) = curses.mousemask(curses.BUTTON1_PRESSED) # availmask indicates that mouse stuff not available. if availmask != 0: curses.mouseinterval(10) # just verify these don't cause errors m = curses.getmouse() curses.ungetmouse(*m)
def edit_str(self, target, c, is_num=False): if c==263 and target: target = target[:-1] elif not is_num or curses.unctrl(c) in '0123456789.': target += curses.unctrl(c) return target
#
def main(screen): """Main text editor loop.""" buffer = [""] while True: key = screen.getkey() y, x = screen.getyx() if len(key) == 1 and curses.unctrl(key) == b"^X": break elif len(key) == 1 and curses.unctrl(key) == b"^P": screen.addstr(10, 0, "\n".join(buffer)) elif key == "KEY_BACKSPACE": if x == 0: if y != 0: x = len(buffer[y - 1]) buffer[y - 1] += buffer[y] buffer[y:] = buffer[y + 1 :] screen.clear() y -= 1 else: buffer[y] = buffer[y][: x - 1] + buffer[y][x:] x -= 1 screen.delch(y, x) elif key == "KEY_DC": if x == len(buffer[y]): if y != len(buffer) - 1: buffer[y] += buffer[y + 1] buffer[y + 1 :] = buffer[y + 2 :] screen.clear() else: buffer[y] = buffer[y][:x] + buffer[y][x + 1 :] screen.clear() elif key == "KEY_LEFT": if x == 0: if y != 0: y -= 1 x = len(buffer[y]) else: x -= 1 elif key == "KEY_RIGHT": if x == len(buffer[y]): if y != len(buffer) - 1: x = 0 y += 1 else: x += 1 elif key == "KEY_UP": if y != 0: y -= 1 x = min(x, len(buffer[y])) elif key == "KEY_DOWN": if y != len(buffer) - 1: y += 1 x = min(x, len(buffer[y])) elif key == "KEY_HOME": x = 0 elif key == "KEY_END": x = len(buffer[y]) elif key in string.printable: if key == "\t": key = " " * 4 if key == "\n": buffer.insert(y + 1, buffer[y][x:]) buffer[y] = buffer[y][:x] y += 1 x = 0 else: buffer[y] = buffer[y][:x] + key + buffer[y][x:] x += len(key) else: pass screen.addstr(0, 0, "\n".join(buffer)) screen.move(y, x)
def main(stdscr): global _x, _y, width, height init_colors() _x = 0 _y = 0 width = curses.COLS height = curses.LINES - 5 # titlebar titlebar_win = make_titlebar() titlebar_win.refresh() # content window content_win = make_contentwin(height, width) content_win.refresh(_y, _x, 1, 0, height - 1, width - 1) # statusbar statusbar_win = make_statusbar() statusbar_win.refresh() # inputbar inputbar_win = make_inputbar() inputbar_win.refresh() # main input buffer input_buffer = "" arrow = '➤' light = '⚡' content_win.addstr("test :" + arrow + ": test") content_win.refresh() while True: # move to own thread time.sleep(0.01) ch = inputbar_win.getch() if (-1 == ch): continue elif (curses.ascii.isprint(ch)): inputbar_win.addch(chr(ch)) input_buffer += chr(ch) elif ch == curses.KEY_BACKSPACE or ch == curses.ascii.BS or ch == curses.ascii.DEL: inputbar_win.delch(inputbar_win.getyx()[0], inputbar_win.getyx()[1] - 1) input_buffer = input_buffer[:-1] elif ch == curses.KEY_UP: inputbar_win.addstr("<KEY_UP>") elif ch == curses.ascii.DLE: inputbar_win.addstr("<DLE>") #CTRL+P elif ch == curses.ascii.SO: inputbar_win.addstr("<SO>") #CTRL+N elif ch == curses.ascii.TAB: inputbar_win.addstr("<TAB>") elif ch == curses.ascii.NAK: #CTRL+U inputbar_win.addstr("<CTRL+U>") elif ch == curses.ascii.ESC: inputbar_win.addstr("<ESC>") elif ch == curses.ascii.NL or ch == curses.KEY_ENTER: inputbar_win.erase() inputbar_win.addstr('[channel] ') if input_buffer == "populate": content_win = populate(content_win) elif input_buffer == "next": _x = width elif input_buffer == "prev": _x = 0 else: input_buffer += "\n" content_win.addstr(input_buffer) content_win.refresh(_y, _x, 1, 0, height - 1, width - 1) input_buffer = "" elif curses.ascii.isctrl(ch): inputbar_win.addstr("<CTRL> %d [%s]" % (ch, curses.unctrl(ch))) inputbar_win.refresh() time.sleep(8)
def parse(cls, value): if value == curses.KEY_BACKSPACE: return Key(Key.BACKSPACE, True) elif value == curses.KEY_DC: return Key(Key.DELETE, True) elif value == curses.KEY_LEFT: return Key(Key.LEFT, True) elif value == curses.KEY_RIGHT: return Key(Key.RIGHT, True) elif value == curses.KEY_UP: return Key(Key.UP, True) elif value == curses.KEY_DOWN: return Key(Key.DOWN, True) elif value == curses.KEY_END: return Key(Key.END, True) elif value == curses.KEY_HOME: return Key(Key.HOME, True) elif value == curses.KEY_NPAGE: return Key(Key.PGDN, True) elif value == curses.KEY_PPAGE: return Key(Key.PGUP, True) elif value == curses.KEY_F1: return Key(Key.F1, True) elif value == curses.KEY_F2: return Key(Key.F2, True) elif value == curses.KEY_F3: return Key(Key.F3, True) elif value == curses.KEY_F4: return Key(Key.F4, True) elif value == curses.KEY_F5: return Key(Key.F5, True) elif value == curses.KEY_F6: return Key(Key.F6, True) elif value == curses.KEY_F7: return Key(Key.F7, True) elif value == curses.KEY_F8: return Key(Key.F8, True) elif value == curses.KEY_F9: return Key(Key.F9, True) elif value == curses.KEY_F10: return Key(Key.F10, True) elif value == curses.KEY_F11: return Key(Key.F11, True) elif value == curses.KEY_F12: return Key(Key.F12, True) elif value == curses.KEY_RESIZE: return Key(Key.RESIZE, True) elif isinstance(value, int): # no idea what key that is return Key('', True) elif isinstance(value, str): try: ctrlkey = str(curses.unctrl(value), 'ascii') except OverflowError: # some unicode, you probably want to see it return Key(value, False) if value in "\n\r": return Key(Key.RETURN, special=True) if value == ' ': return Key(Key.SPACE) if value == "\t": return Key(Key.TAB) if ctrlkey in ['^H', '^?']: return Key(Key.BACKSPACE, special=True) if ctrlkey == '^[': return Key(Key.ESCAPE, True) if ctrlkey != value: return Key(ctrlkey[1:], True) else: return Key(value)
def app(stdscr): global scrmap, osz, URI focus = 'mouse' goto('http://info.cern.ch') stdscr.nodelay(True) eval_cache = {} if curses.has_colors() and curses.COLORS >= 8 and curses.COLOR_PAIRS >= 64: for i in range(8): for j in range(8): if i + j: curses.init_pair(i + j * 8, i, j) while stdscr.getch() > -1: pass while True: ender = False evtrsp = [] size = stdscr.getmaxyx() document.cssize = (size[0] - MG_TOP - MG_BOTTOM, size[1]) clickz = False if tuple(size) != osz: osz = tuple(size) scrmap = [[{} for _ in xrange(size[0]-4)] for _ in xrange(size[1])] kin = -2 while kin != -1: if kin == 27: focus = 'mouse' if focus == 'mouse': curses.curs_set(False) if kin == curses.KEY_UP: mouse[1] -= 1 if kin == curses.KEY_DOWN: mouse[1] += 1 if kin == curses.KEY_LEFT: mouse[0] -= 1 if kin == curses.KEY_RIGHT: mouse[0] += 1 if kin in (curses.KEY_ENTER, 10, 13): clickz = True if mouse[1] == 1 and mouse[0] > 10 and mouse[0] < size[1] - 10: focus = 'uri' elif focus == 'uri': curses.curs_set(True) mouse[1] = 1 if mouse[0] > len(URI) + 11: mouse[0] = len(URI) + 11 cpos = mouse[0] - 11 if kin == curses.KEY_LEFT: mouse[0] -= 1 elif kin == curses.KEY_RIGHT: mouse[0] += 1 elif kin in (curses.KEY_BACKSPACE, 127, 27): mouse[0] -= 1 URI = URI[:cpos-1] + URI[cpos:] elif kin in (curses.KEY_ENTER, 10, 13): ender = True focus = 'mouse' elif kin > 0: p = curses.unctrl(kin) if len(p) == 1: URI = URI[:cpos] + p + URI[cpos:] mouse[0] += 1 kin = stdscr.getch() if mouse[0] < 0 : mouse[0] = 0 elif mouse[0] > size[1] - 1: mouse[0] = size[1] - 1 if mouse[1] < 1 : mouse[1] = 1 elif mouse[1] > size[0] - 1: mouse[1] = size[0] - 1 document.tick(evtrsp) stdscr.addstr(0, 0, (u'{:^%i}' % size[1]).format(browser_name).encode(encoding), curses.A_BOLD | cp(white, blue)) stdscr.addstr(1, 0, (u' [<=] [>] [{:<%i}|reload] ' % (size[1] - 20)).format(URI).encode(encoding), curses.A_BOLD | cp(black, white)) stdscr.addstr(2, 0, (u'{:^%i}' % size[1]).format(document.getTitle()).encode(encoding), curses.A_UNDERLINE | cp(black, white)) try: stdscr.addstr(size[0]-1, 0, ' ' * size[1], cp(black, white)) except curses.error: pass def setpxcb(xy, c, f, e): if xy[0] >= 0 and xy[1] >= 0 and xy[0] < size[1] and xy[1] < size[0] - (MG_TOP + MG_BOTTOM): scrmap[xy[0]][xy[1]]['e'] = e cpn = curses.pair_number(scrmap[xy[0]][xy[1]].get('a', 0)) f = f.format(fg = cpn % 8, bg = cpn // 8) if f in eval_cache: fp = eval_cache[f] else: eval_cache[f] = eval(f) fp = eval_cache[f] scrmap[xy[0]][xy[1]]['a'] = fp stdscr.addstr(xy[1]+MG_TOP, xy[0], c.encode(encoding), fp) for x in range(size[1]): for y in range(size[0]): setpxcb((x,y), ' ', 'cp(0,%s)'%document.__dict__.get('bgc', 'white'), document) document.getElementsByTagName('body')[0].render(setpxcb, [0,0]) if focus == 'mouse': try: E = scrmap[mouse[0]][mouse[1]-3]['e'] if mouse[1] >= MG_TOP and mouse[1] < size[0] - MG_BOTTOM else None mp = ( css_constants.cursors.get(E.CSS().get('cursor'), css_constants.cursors['default']) if mouse[1] >= MG_TOP and mouse[1] < size[0] - MG_BOTTOM else css_constants.cursors['default'] ) stdscr.addstr(mouse[1], mouse[0], mp, cp(black, white)) if clickz and E: E.click(evtrsp) except curses.error: pass else: stdscr.move(mouse[1], mouse[0]) for e in evtrsp: eval(e) if ender: goto(URI) stdscr.refresh()
def _unctr(char): try: unctr = curses.unctrl(char) return unctr except OverflowError: return ''
def main(stdscr): # Clear screen c = 0 # worker = 0 # devices = 1 msg = "" cmd = 0 curses.init_pair(1, curses.COLOR_RED, curses.COLOR_BLACK) stdscr.timeout(200) exit = False while not exit: now = time.time() rows, cols = stdscr.getmaxyx() cfg["rows"] = rows cfg["cols"] = cols stdscr.addstr(0, 4, str(c)) stdscr.addstr(0, 10, "Screen %dx%d Lab: %s Select: %d" % (cols, rows, cfg["lab"]["name"], cfg["select"])) # print help stdscr.addstr(0, rows - 2, "HELP: UP DOWN TAB") if cfg["tab"] == 1: stdscr.addstr(1, 0, "DEVICE HELP: h+[u]") if cfg["tab"] == 2: stdscr.addstr(1, 0, "JOB HELP: v") stdscr.addstr(2, 0, msg) if cfg["tab"] != 2: cfg["sjob"] = None y = 3 if cfg["workers"]["enable"]: update_workers() check_limits() stdscr.addstr(y, 0, "Workers %d-%d/%d (refresh %d/%d)" % ( 1, cfg["workers"]["count"], cfg["workers"]["count"], now - cache["workers"]["time"], cfg["workers"]["refresh"] )) y += 1 cfg["wpad"].refresh(0, 0, y, 0, rows - 1, cols - 1) y += cfg["workers"]["count"] + 1 # devices if cfg["devices"]["enable"]: update_devices() y_max = rows - 15 cfg["devices"]["display"] = y_max - y if cfg["devices"]["display"] > cfg["devices"]["count"]: cfg["devices"]["display"] = cfg["devices"]["count"] stdscr.addstr(y, 0, "Devices %d-%d/%d (refresh %d/%d)" % ( cfg["devices"]["offset"] + 1, cfg["devices"]["display"] + cfg["devices"]["offset"], cfg["devices"]["max"], now - cache["device"]["time"], cfg["devices"]["refresh"] )) y += 1 #verify that select is printable check_limits() cfg["dpad"].refresh(cfg["devices"]["offset"], 0, y, 0, y_max, cols - 1) y += cfg["devices"]["display"] if cfg["jobs"]["enable"]: update_jobs() cfg["jpad"].refresh(0, 0, y, 0, rows - 1, cols - 1) if cfg["vjob"] != None: update_job(cfg["vjob"]) stdscr.refresh() if cfg["vjob"] != None: wj[cfg["vjob"]]["wjob"].box("=", "-") wj[cfg["vjob"]]["wjob"].refresh() wj[cfg["vjob"]]["vjpad"].refresh(cfg["vjob_off"], 0, 9, 9, rows - 9, cols - 9) #curses.doupdate() y += 1 msg = "" c = stdscr.getch() if c == curses.KEY_UP: cfg["select"] -= 1 if cfg["tab"] == 1: cache["device"]["redraw"] = True elif cfg["tab"] == 0: cache["workers"]["redraw"] = True else: cache["jobs"]["redraw"] = True elif c == curses.KEY_DOWN: cfg["select"] += 1 if cfg["tab"] == 1: cache["device"]["redraw"] = True elif cfg["tab"] == 0: cache["workers"]["redraw"] = True else: cache["jobs"]["redraw"] = True elif c == curses.KEY_PPAGE: if cfg["tab"] == 1: #scroll devices cfg["devices"]["offset"] -= 5 cache["device"]["redraw"] = True if cfg["devices"]["offset"] < 0: cfg["devices"]["offset"] = 0 if cfg["select"] > cfg["devices"]["offset"] + cfg["devices"]["display"]: cfg["select"] = cfg["devices"]["offset"] + cfg["devices"]["display"] else: # scroll job output cfg["vjob_off"] -= 100 elif c == curses.KEY_NPAGE: if cfg["tab"] == 1: #scroll devices cfg["devices"]["offset"] += 5 cache["device"]["redraw"] = True if cfg["devices"]["offset"] > cfg["devices"]["max"] - 20: cfg["devices"]["offset"] = 0 if cfg["select"] < cfg["devices"]["offset"]: cfg["select"] = cfg["devices"]["offset"] else: # scroll job output cfg["vjob_off"] += 100 elif c == ord(" "): if cfg["tab"] == 1: if cfg["sdev"] in cfg["devices"]["select"]: cfg["devices"]["select"].remove(cfg["sdev"]) else: cfg["devices"]["select"].append(cfg["sdev"]) elif c == 9: # TAB if cfg["tab"] == 0: cfg["tab"] = 1 cache["workers"]["redraw"] = True cache["device"]["redraw"] = True msg = "Switched to devices tab" elif cfg["tab"] == 1: cfg["tab"] = 2 cache["device"]["redraw"] = True cache["jobs"]["redraw"] = True msg = "Switched to jobs tab" else: cfg["tab"] = 0 cache["jobs"]["redraw"] = True cache["workers"]["redraw"] = True msg = "Switched to worker tab" elif cmd > 0: # want a subcommand if cmd == ord('h'): if c == ord('u'): msg = "Set %s to unknow" % cfg["sdev"] cfg["lserver"].scheduler.devices.update(cfg["sdev"], None, None, None, None, 'UNKNOWN') cache["device"]["time"] = 0 cmd = 0 elif c == ord('m'): msg = "Set %s to maintenance" % cfg["sdev"] cfg["lserver"].scheduler.devices.update(cfg["sdev"], None, None, None, None, 'MAINTENANCE') cache["device"]["time"] = 0 cmd = 0 elif c > 0: cmd = 0 msg = "Invalid health %s" % curses.unctrl(c) elif cmd == ord('l'): if c == ord('n'): cmd = 0 msg = switch_lab() else: cmd = 0 msg = "Invalid subcomand %s" % curses.unctrl(c) elif c == ord('w'): # worker window cfg["workers"]["enable"] = not cfg["workers"]["enable"] msg = "Windows worker" elif c == ord('j'): # jobs window cfg["jobs"]["enable"] = not cfg["jobs"]["enable"] msg = "Windows jobs" elif c == ord('l'): # lab switch cmd = c msg = "lab switch: Next or lab number" elif c == ord('h'): if cfg["tab"] == 1: cmd = c msg = "Set health of %s to " % cfg["sdev"] else: msg = "Invalid" cmd = 0 elif c == ord('x'): cmd = 0 cfg["vjob"] = None if cfg["vjpad"] != None: cfg["vjpad"].clear() elif c == ord('r'): if cfg["tab"] == 0: cache["workers"]["time"] = 0 elif cfg["tab"] == 1: cache["device"]["time"] = 0 else: cache["jobs"]["time"] = 0 elif c == ord('R'): #refresh all cache["workers"]["time"] = 0 cache["device"]["time"] = 0 cache["jobs"]["time"] = 0 msg = "Refresh all" elif c == ord('v'): if cfg["tab"] == 2: msg = "View job %s" % cfg["sjob"] cfg["vjob"] = cfg["sjob"] else: msg = "Invalid" if cfg["vjob_off"] < 0: cfg["vjob_off"] = 0 msg = "STOP" if cfg["tab"] > 2: cfg["tab"] = 0 if cfg["tab"] == 0 and not cfg["workers"]["enable"]: cfg["tab"] = 1 if c == 27 or c == ord('q'): exit = True check_limits()
def main(stdscr): global _x, _y, width, height init_colors() _x = 0 _y = 0 width = curses.COLS height = curses.LINES-5 # titlebar titlebar_win = make_titlebar() titlebar_win.refresh() # content window content_win = make_contentwin(height, width) content_win.refresh(_y, _x, 1, 0, height-1, width-1) # statusbar statusbar_win = make_statusbar() statusbar_win.refresh() # inputbar inputbar_win = make_inputbar() inputbar_win.refresh() # main input buffer input_buffer = "" arrow = '➤' light = '⚡' content_win.addstr("test :"+arrow+": test") content_win.refresh() while True: # move to own thread time.sleep(0.01) ch = inputbar_win.getch() if(-1 == ch): continue elif(curses.ascii.isprint(ch)): inputbar_win.addch(chr(ch)) input_buffer += chr(ch) elif ch == curses.KEY_BACKSPACE or ch == curses.ascii.BS or ch == curses.ascii.DEL: inputbar_win.delch(inputbar_win.getyx()[0], inputbar_win.getyx()[1]-1) input_buffer = input_buffer[:-1] elif ch == curses.KEY_UP: inputbar_win.addstr("<KEY_UP>") elif ch == curses.ascii.DLE: inputbar_win.addstr("<DLE>") #CTRL+P elif ch == curses.ascii.SO: inputbar_win.addstr("<SO>") #CTRL+N elif ch == curses.ascii.TAB: inputbar_win.addstr("<TAB>") elif ch == curses.ascii.NAK: #CTRL+U inputbar_win.addstr("<CTRL+U>") elif ch == curses.ascii.ESC: inputbar_win.addstr("<ESC>") elif ch == curses.ascii.NL or ch == curses.KEY_ENTER: inputbar_win.erase() inputbar_win.addstr('[channel] ') if input_buffer == "populate": content_win = populate(content_win) elif input_buffer == "next": _x = width elif input_buffer == "prev": _x = 0 else: input_buffer += "\n" content_win.addstr(input_buffer) content_win.refresh(_y, _x, 1, 0, height-1, width-1) input_buffer = "" elif curses.ascii.isctrl(ch): inputbar_win.addstr("<CTRL> %d [%s]" % (ch, curses.unctrl(ch))) inputbar_win.refresh() time.sleep(8)
def do_thing(char, screen): print curses.unctrl(char)