Update charmapTTY.py
This commit is contained in:
		| @@ -1,65 +1,55 @@ | ||||
| #!/bin/python3 | ||||
| #attrib: | ||||
| #http://rampex.ihep.su/Linux/linux_howto/html/tutorials/mini/Colour-ls-6.html | ||||
| #0 = black, 1 = blue, 2 = green, 3 = cyan, 4 = red, 5 = purple, 6 = brown/yellow, 7 = white.  | ||||
| #https://github.com/jwilk/vcsapeek/blob/master/linuxvt.py | ||||
| #blink = 5 if attr & 1 else 0 | ||||
| #bold = 1 if attr & 16 else 0 | ||||
| import fcntl | ||||
| import time | ||||
| from fcntl import ioctl | ||||
| from array import array | ||||
| import struct | ||||
| import errno | ||||
| import sys | ||||
| import time | ||||
|  | ||||
|  | ||||
|  | ||||
| ttyno = 4  | ||||
| tty = open('/dev/tty%d' % ttyno, 'rb') | ||||
| vcs = open('/dev/vcsa%d' % ttyno, 'rb') | ||||
|  | ||||
| head = vcs.read(4) | ||||
| rows = int(head[0]) | ||||
| cols = int(head[1]) | ||||
|  | ||||
| s = time.time() | ||||
| charmap = {} | ||||
| def updateCharMap(screen): | ||||
|     ttyno = '4'  | ||||
|     tty = open('/dev/tty' + screen, 'rb') | ||||
|     GIO_UNIMAP = 0x4B66 | ||||
|     VT_GETHIFONTMASK = 0x560D | ||||
|     himask = array("H", (0,)) | ||||
| fcntl.ioctl(tty, VT_GETHIFONTMASK, himask) | ||||
|     ioctl(tty, VT_GETHIFONTMASK, himask) | ||||
|     hichar, = struct.unpack_from("@H", himask) | ||||
|  | ||||
|     sz = 512 | ||||
|     line = '' | ||||
|     while True: | ||||
|         try: | ||||
|             unipairs = array("H", [0]*(2*sz)) | ||||
|             unimapdesc = array("B", struct.pack("@HP", sz, unipairs.buffer_info()[0])) | ||||
|         fcntl.ioctl(tty.fileno(), GIO_UNIMAP, unimapdesc) | ||||
|             ioctl(tty.fileno(), GIO_UNIMAP, unimapdesc) | ||||
|             break | ||||
|         except IOError as e: | ||||
|             if e.errno != errno.ENOMEM: | ||||
|                 raise | ||||
|             sz *= 2 | ||||
|  | ||||
|     tty.close() | ||||
|  | ||||
|     ncodes, = struct.unpack_from("@H", unimapdesc) | ||||
|     utable = struct.unpack_from("@%dH" % (2*ncodes), unipairs) | ||||
|  | ||||
| charmap = {} | ||||
|     for u, b in zip(utable[::2], utable[1::2]): | ||||
|         if charmap.get(b) is None: | ||||
|         charmap[b] = u | ||||
|             charmap[b] = chr(u) | ||||
|  | ||||
|  | ||||
| def autoDecodeVCSA(allData): | ||||
|     allText = [] | ||||
|     allAttrib = [] | ||||
|  | ||||
|     print(time.time() -s )     | ||||
|     for y in range(rows): | ||||
|         lineText = '' | ||||
|         lineAttrib = [] | ||||
|         i = 0 | ||||
|         for x in range(cols): | ||||
|         data = vcs.read(2) | ||||
|             data = allData[i: i + 2] | ||||
|             if data == b' \x07': | ||||
|                 attr = 7 | ||||
|                 ink = 7 | ||||
|                 paper = 0 | ||||
|                 lineAttrib.append(7)              | ||||
|                 lineText += ' ' | ||||
|                 continue | ||||
|             (sh,) = struct.unpack("=H", data) | ||||
|             attr = (sh >> 8) & 0xFF | ||||
|             ch = sh & 0xFF | ||||
| @@ -72,10 +62,23 @@ for y in range(rows): | ||||
|             #    print(ink,paper) | ||||
|             if sh & hichar: | ||||
|                 ch |= 0x100 | ||||
|         lineText += chr(charmap.get(ch, u'?')) | ||||
|             try: | ||||
|                 lineText += charmap[ch]             | ||||
|             except: | ||||
|                 lineText += chr('?') | ||||
|             i += 2 | ||||
|         allText.append(lineText) | ||||
|         allAttrib.append(lineAttrib) | ||||
|     return allText, allAttrib | ||||
|  | ||||
| #print(allText) | ||||
| #print(allAttrib) | ||||
| def m(): | ||||
|     s = time.time() | ||||
|     updateCharMap('4')         | ||||
|     print(time.time() -s )     | ||||
|     vcsa = open('/dev/vcsa' + '4', 'rb') | ||||
|     head = vcsa.read(4) | ||||
|     rows = int(head[0]) | ||||
|     cols = int(head[1]) | ||||
|     text, attrib = autoDecodeVCSA(vcsa.read()) | ||||
|     print(time.time() -s ) | ||||
|      | ||||
|   | ||||
		Reference in New Issue
	
	Block a user