aboutsummaryrefslogtreecommitdiffstats
path: root/termcast_server
diff options
context:
space:
mode:
authorJesse Luehrs <doy@tozt.net>2014-10-06 15:49:58 -0400
committerJesse Luehrs <doy@tozt.net>2014-10-06 15:49:58 -0400
commitadbfe49125bd21c25551e3d3dfd5c7bd311ca82f (patch)
tree790a69750fb1bed710223dfe81ea62604bf9e647 /termcast_server
parent3c51db7d3a67d65aa3585780d395377310401bfe (diff)
downloadpython-termcast-server-adbfe49125bd21c25551e3d3dfd5c7bd311ca82f.tar.gz
python-termcast-server-adbfe49125bd21c25551e3d3dfd5c7bd311ca82f.zip
try to send updates rather than the full screen on every frame
this is not a very intelligent method at the moment, but it should (probably?) be an improvement over the current method. it probably fails pretty miserably on scrolling though - need to figure out a better idea for that.
Diffstat (limited to 'termcast_server')
-rw-r--r--termcast_server/index.html26
-rw-r--r--termcast_server/ssh.py2
-rw-r--r--termcast_server/termcast.py34
-rw-r--r--termcast_server/web.py17
4 files changed, 66 insertions, 13 deletions
diff --git a/termcast_server/index.html b/termcast_server/index.html
index 459d9c1..7e37c06 100644
--- a/termcast_server/index.html
+++ b/termcast_server/index.html
@@ -51,7 +51,7 @@ socket.onmessage = function (e) {
menudiv.innerHTML = menu;
menudiv.style.setProperty('display', 'block');
}
- else if (type == "update_screen") {
+ else if (type == "redraw_screen") {
document.querySelector('.menu').style.setProperty('display', 'none');
var termdiv = document.querySelector('.term');
term = '<table class="screen">';
@@ -84,6 +84,30 @@ socket.onmessage = function (e) {
termdiv.innerHTML = term;
termdiv.style.setProperty('display', 'block');
}
+ else if (type == "update_screen") {
+ var termtable = document.querySelector('.term tbody');
+ data.updates.forEach(function (update) {
+ var tr = termtable.children[update.row];
+ var td = tr.children[update.col];
+ var contents = update.cell.contents;
+ if (contents == " ") {
+ contents = "&nbsp;";
+ }
+ td.innerHTML = contents;
+ if (update.cell.fgcolor) {
+ td.style.setProperty('color', colors[update.cell.fgcolor]);
+ }
+ else {
+ td.style.removeProperty('color');
+ }
+ if (update.cell.bgcolor) {
+ td.style.setProperty('background-color', colors[update.cell.bgcolor]);
+ }
+ else {
+ td.style.removeProperty('background-color');
+ }
+ })
+ }
else if (type == "streamer_disconnect") {
socket.send(JSON.stringify({"type": "request_streamer_list"}));
}
diff --git a/termcast_server/ssh.py b/termcast_server/ssh.py
index d828fca..360c3f7 100644
--- a/termcast_server/ssh.py
+++ b/termcast_server/ssh.py
@@ -106,7 +106,7 @@ class Connection(object):
else:
return self.select_stream()
- def msg_new_data(self, connection_id, prev_buf, data, screen):
+ def msg_new_data(self, connection_id, prev_buf, data, screen, updates):
if self.watching_id != connection_id:
return
diff --git a/termcast_server/termcast.py b/termcast_server/termcast.py
index 743274b..f99971d 100644
--- a/termcast_server/termcast.py
+++ b/termcast_server/termcast.py
@@ -68,17 +68,36 @@ class Handler(object):
term.append([])
for j in range(0, self.cols):
cell = self.vt.cell(i, j)
- contents = cell.contents()
- if len(contents) == 0:
- contents = " "
term[i].append({
- "contents": contents,
+ "contents": cell.contents(),
"fgcolor": cell.fgcolor().color(),
"bgcolor": cell.bgcolor().color(),
})
return term
+ def get_term_updates(self, screen):
+ changes = []
+ for i in range(0, self.rows):
+ for j in range(0, self.cols):
+ cell = self.vt.cell(i, j)
+ prev_cell = screen[i][j]
+ contents = cell.contents()
+ fgcolor = cell.fgcolor().color()
+ bgcolor = cell.bgcolor().color()
+ if contents != prev_cell["contents"] or fgcolor != prev_cell["fgcolor"] or bgcolor != prev_cell["bgcolor"]:
+ changes.append({
+ "row": i,
+ "col": j,
+ "cell": {
+ "contents": contents,
+ "fgcolor": fgcolor,
+ "bgcolor": bgcolor,
+ },
+ })
+
+ return changes
+
def total_time(self):
return self._human_readable_duration(time.time() - self.created_at)
@@ -171,13 +190,15 @@ class Connection(object):
print('*** recv failed: ' + str(e))
if len(buf) > 0:
+ prev_screen = self.handler.get_term()
self.handler.process(buf)
self.publisher.notify(
"new_data",
self.connection_id,
self.handler.buf,
buf,
- self.handler.get_term()
+ self.handler.get_term(),
+ self.handler.get_term_updates(prev_screen)
)
else:
self.publisher.notify("streamer_disconnect", self.connection_id)
@@ -192,7 +213,8 @@ class Connection(object):
self.connection_id,
self.handler.buf,
b'',
- self.handler.get_term()
+ self.handler.get_term(),
+ None
)
self.client.send(b"msg watcher connected\n")
diff --git a/termcast_server/web.py b/termcast_server/web.py
index 8b9f9e3..1c64fd4 100644
--- a/termcast_server/web.py
+++ b/termcast_server/web.py
@@ -34,14 +34,21 @@ class WebSocketHandler(tornado.websocket.WebSocketHandler):
def on_finish(self):
self.publisher.unsubscribe(self)
- def msg_new_data(self, connection_id, prev_buf, data, screen):
+ def msg_new_data(self, connection_id, prev_buf, data, screen, updates):
if self.watching_id != connection_id:
return
- reply = {
- "type": "update_screen",
- "screen": screen,
- }
+ if updates:
+ reply = {
+ "type": "update_screen",
+ "updates": updates,
+ }
+ else:
+ reply = {
+ "type": "redraw_screen",
+ "screen": screen,
+ }
+
try:
self.write_message(json.dumps(reply))
except: