[gtk+] broadway: Centralize cmd parsing
- From: Alexander Larsson <alexl src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gtk+] broadway: Centralize cmd parsing
- Date: Mon, 1 Oct 2012 13:02:16 +0000 (UTC)
commit 7c876846292b6ee3ebf9c4b8946674dc293418b3
Author: Alexander Larsson <alexl redhat com>
Date: Mon Oct 1 11:30:03 2012 +0200
broadway: Centralize cmd parsing
This clean up things, as well as prepares for new message formats
such as binary websockets.
gdk/broadway/broadway.js | 154 ++++++++++++++++++++++-----------------------
1 files changed, 75 insertions(+), 79 deletions(-)
---
diff --git a/gdk/broadway/broadway.js b/gdk/broadway/broadway.js
index 90b9d53..86b605a 100644
--- a/gdk/broadway/broadway.js
+++ b/gdk/broadway/broadway.js
@@ -725,76 +725,56 @@ function cmdUngrabPointer()
doUngrab();
}
-function handleCommands(cmdObj)
+function handleCommands(cmd)
{
- var cmd = cmdObj.data;
- var i = cmdObj.pos;
-
- while (i < cmd.length) {
+ while (cmd.pos < cmd.length) {
var id, x, y, w, h, q;
- var command = cmd[i++];
- lastSerial = base64_32(cmd, i);
- i = i + 6;
+ var command = cmd.get_char();
+ lastSerial = cmd.get_32();
switch (command) {
case 's': // create new surface
- id = base64_16(cmd, i);
- i = i + 3;
- x = base64_16s(cmd, i);
- i = i + 3;
- y = base64_16s(cmd, i);
- i = i + 3;
- w = base64_16(cmd, i);
- i = i + 3;
- h = base64_16(cmd, i);
- i = i + 3;
- var isTemp = cmd[i] == '1';
- i = i + 1;
+ id = cmd.get_16();
+ x = cmd.get_16s();
+ y = cmd.get_16s();
+ w = cmd.get_16();
+ h = cmd.get_16();
+ var isTemp = cmd.get_bool();
cmdCreateSurface(id, x, y, w, h, isTemp);
break;
case 'S': // Show a surface
- id = base64_16(cmd, i);
- i = i + 3;
+ id = cmd.get_16();
cmdShowSurface(id);
break;
case 'H': // Hide a surface
- id = base64_16(cmd, i);
- i = i + 3;
+ id = cmd.get_16();
cmdHideSurface(id);
break;
case 'p': // Set transient parent
- id = base64_16(cmd, i);
- i = i + 3;
- var parentId = base64_16(cmd, i);
- i = i + 3;
+ id = cmd.get_16();
+ var parentId = cmd.get_16();
cmdSetTransientFor(id, parentId);
break;
case 'd': // Delete surface
- id = base64_16(cmd, i);
- i = i + 3;
+ id = cmd.get_16();
cmdDeleteSurface(id);
break;
case 'm': // Move a surface
- id = base64_16(cmd, i);
- i = i + 3;
- var ops = cmd.charCodeAt(i++) - 48;
+ id = cmd.get_16();
+ var ops = cmd.get_flags();
var has_pos = ops & 1;
if (has_pos) {
- x = base64_16s(cmd, i);
- i = i + 3;
- y = base64_16s(cmd, i);
- i = i + 3;
+ x = cmd.get_16s();
+ y = cmd.get_16s();
}
var has_size = ops & 2;
if (has_size) {
- w = base64_16(cmd, i);
- i = i + 3;
- h = base64_16(cmd, i);
- i = i + 3;
+ w = cmd.get_16();
+ h = cmd.get_16();
}
cmdMoveResizeSurface(id, has_pos, x, y, has_size, w, h);
break;
@@ -802,21 +782,14 @@ function handleCommands(cmdObj)
case 'i': // Put image data surface
q = new Object();
q.op = 'i';
- q.id = base64_16(cmd, i);
- i = i + 3;
- q.x = base64_16(cmd, i);
- i = i + 3;
- q.y = base64_16(cmd, i);
- i = i + 3;
- var size = base64_32(cmd, i);
- i = i + 6;
- var url = cmd.slice(i, i + size);
- i = i + size;
+ q.id = cmd.get_16();
+ q.x = cmd.get_16();
+ q.y = cmd.get_16();
+ var url = cmd.get_image_url ();
q.img = new Image();
q.img.src = url;
surfaces[q.id].drawQueue.push(q);
if (!q.img.complete) {
- cmdObj.pos = i;
q.img.onload = function() { handleOutstanding(); };
return false;
}
@@ -825,44 +798,33 @@ function handleCommands(cmdObj)
case 'b': // Copy rects
q = new Object();
q.op = 'b';
- q.id = base64_16(cmd, i);
- i = i + 3;
-
- var nrects = base64_16(cmd, i);
- i = i + 3;
+ q.id = cmd.get_16();
+ var nrects = cmd.get_16();
q.rects = [];
for (var r = 0; r < nrects; r++) {
var rect = new Object();
- rect.x = base64_16(cmd, i);
- i = i + 3;
- rect.y = base64_16(cmd, i);
- i = i + 3;
- rect.w = base64_16(cmd, i);
- i = i + 3;
- rect.h = base64_16(cmd, i);
- i = i + 3;
+ rect.x = cmd.get_16();
+ rect.y = cmd.get_16();
+ rect.w = cmd.get_16();
+ rect.h = cmd.get_16();
q.rects.push (rect);
}
- q.dx = base64_16s(cmd, i);
- i = i + 3;
- q.dy = base64_16s(cmd, i);
- i = i + 3;
+ q.dx = cmd.get_16s();
+ q.dy = cmd.get_16s();
surfaces[q.id].drawQueue.push(q);
break;
case 'f': // Flush surface
- id = base64_16(cmd, i);
- i = i + 3;
+ id = cmd.get_16();
cmdFlushSurface(id);
break;
case 'g': // Grab
- id = base64_16(cmd, i);
- i = i + 3;
- var ownerEvents = cmd[i++] == '1';
+ id = cmd.get_16();
+ var ownerEvents = cmd.get_bool ();
cmdGrabPointer(id, ownerEvents);
break;
@@ -888,13 +850,47 @@ function handleOutstanding()
}
}
+function TextCommands(message) {
+ this.data = message;
+ this.length = message.length;
+ this.pos = 0;
+}
+
+TextCommands.prototype.get_char = function() {
+ return this.data[this.pos++];
+};
+TextCommands.prototype.get_bool = function() {
+ return this.get_char() == '1';
+};
+TextCommands.prototype.get_flags = function() {
+ return this.get_char() - 48;
+}
+TextCommands.prototype.get_16 = function() {
+ var n = base64_16(this.data, this.pos);
+ this.pos = this.pos + 3;
+ return n;
+};
+TextCommands.prototype.get_16s = function() {
+ var n = base64_16s(this.data, this.pos);
+ this.pos = this.pos + 3;
+ return n;
+};
+TextCommands.prototype.get_32 = function() {
+ var n = base64_32(this.data, this.pos);
+ this.pos = this.pos + 6;
+ return n;
+};
+TextCommands.prototype.get_image_url = function() {
+ var size = this.get_32();
+ var url = this.data.slice(this.pos, this.pos + size);
+ this.pos = this.pos + size;
+ return url;
+};
+
function handleMessage(message)
{
- var cmdObj = {};
- cmdObj.data = message;
- cmdObj.pos = 0;
-
- outstandingCommands.push(cmdObj);
+ var cmd = new TextCommands(message);
+ outstandingCommands.push(cmd);
if (outstandingCommands.length == 1) {
handleOutstanding();
}
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]