Merge pull request #20 from santigimeno/new_create_client

Change createClient signature
This commit is contained in:
Andrey Sidorov 2012-12-19 01:22:52 -08:00
commit 568465da52
13 changed files with 177 additions and 117 deletions

View file

@ -14,35 +14,39 @@ Windows users:
# example # example
Core requsests usage: Core requests usage:
var x11 = require('x11'); var x11 = require('x11');
var Exposure = x11.eventMask.Exposure; var Exposure = x11.eventMask.Exposure;
var PointerMotion = x11.eventMask.PointerMotion; var PointerMotion = x11.eventMask.PointerMotion;
x11.createClient(function(display) { x11.createClient(function(err, display) {
var X = display.client; if (!err) {
var root = display.screen[0].root; var X = display.client;
var wid = X.AllocID(); var root = display.screen[0].root;
X.CreateWindow( var wid = X.AllocID();
wid, root, // new window id, parent X.CreateWindow(
0, 0, 100, 100, // x, y, w, h wid, root, // new window id, parent
0, 0, 0, 0, // border, depth, class, visual 0, 0, 100, 100, // x, y, w, h
{ eventMask: Exposure|PointerMotion } // other parameters 0, 0, 0, 0, // border, depth, class, visual
); { eventMask: Exposure|PointerMotion } // other parameters
X.MapWindow(wid); );
var gc = X.AllocID(); X.MapWindow(wid);
X.CreateGC(gc, wid); var gc = X.AllocID();
X.on('event', function(ev) { X.CreateGC(gc, wid);
if (ev.type == 12) X.on('event', function(ev) {
{ if (ev.type == 12)
X.PolyText8(wid, gc, 50, 50, ['Hello, Node.JS!']); {
} X.PolyText8(wid, gc, 50, 50, ['Hello, Node.JS!']);
}); }
X.on('error', function(e) { });
console.log(e); X.on('error', function(e) {
}); console.log(e);
});
} else {
console.log(err);
}
}); });
# Screenshots # Screenshots

View file

@ -430,15 +430,18 @@ XClient.prototype.require = function(extName, callback)
ext.requireExt(this.display, callback); ext.requireExt(this.display, callback);
} }
module.exports.createClient = function(initCb, display, options) module.exports.createClient = function(options, initCb)
{ {
if (!options) if (typeof options === 'function') {
options = false; initCb = options;
options = {};
}
if (!options) options = {};
var display = options.display;
if (!display) if (!display)
display = process.env.DISPLAY; display = (process.env.DISPLAY) ? process.env.DISPLAY : ':0';
if (!display)
display = ':0';
var displayMatch = display.match(/^(?:[^:]*?\/)?(.*):(\d+)(?:.(\d+))?$/); var displayMatch = display.match(/^(?:[^:]*?\/)?(.*):(\d+)(?:.(\d+))?$/);
if (!displayMatch) if (!displayMatch)
@ -485,18 +488,25 @@ module.exports.createClient = function(initCb, display, options)
if (initCb) if (initCb)
{ {
client.on('connect', function(display) { client.on('connect', function(display) {
// Once connected don't call initCb on error, just emit
stream.removeListener('error', initCb);
stream.on('error', function(err) {
client.emit('error', err);
});
// opt-in BigReq // opt-in BigReq
if (!options.disableBigRequests) { if (!options.disableBigRequests) {
client.require('big-requests', function(BigReq) { client.require('big-requests', function(BigReq) {
BigReq.Enable(function(err, maxLen) { BigReq.Enable(function(err, maxLen) {
display.max_request_length = maxLen; display.max_request_length = maxLen;
initCb(display); initCb(undefined, display);
}); });
}); });
} else { } else {
initCb(display); initCb(undefined, display);
} }
}); });
stream.on('error', initCb);
} }
return client; return client;
} }

View file

@ -14,7 +14,8 @@ var mocha = new Mocha({
// 2 - dpms version is 1.1. // 2 - dpms version is 1.1.
// 3 - to be dpms capable. // 3 - to be dpms capable.
var run_dpms_test = function(cb) { var run_dpms_test = function(cb) {
var client = x11.createClient(function(dpy) { var client = x11.createClient(function(err, dpy) {
if (err) return cb(false);
var display = dpy; var display = dpy;
var X = display.client; var X = display.client;
X.require('dpms', function(ext) { X.require('dpms', function(ext) {
@ -42,7 +43,8 @@ var run_dpms_test = function(cb) {
}; };
var run_xtest_test = function(cb) { var run_xtest_test = function(cb) {
var client = x11.createClient(function(dpy) { var client = x11.createClient(function(err, dpy) {
if (err) return cb(false);
var display = dpy; var display = dpy;
var X = display.client; var X = display.client;
X.require('dpms', function(ext) { X.require('dpms', function(ext) {

View file

@ -1,16 +1,22 @@
var x11 = require('../lib/x11'); var x11 = require('../lib/x11');
var should = require('should'); var should = require('should');
var assert = require('assert'); var assert = require('assert');
var util = require('util');
describe('Client', function() { describe('Client', function() {
var display; var display;
beforeEach(function(done) { beforeEach(function(done) {
var client = x11.createClient(function(dpy) { var client = x11.createClient(function(err, dpy) {
display=dpy; if (!err) {
done(); display = dpy;
client.removeListener('error', done); done();
client.removeListener('error', done);
} else {
done(err);
}
}); });
client.on('error', done); client.on('error', done);
}); });
@ -26,9 +32,7 @@ describe('Client', function() {
it('uses display variable from parameter if present ignoring anvironment $DISPLAY', function(done) { it('uses display variable from parameter if present ignoring anvironment $DISPLAY', function(done) {
var disp = process.env.DISPLAY; var disp = process.env.DISPLAY;
process.env.DISPLAY = 'BOGUS DISPLAY'; process.env.DISPLAY = 'BOGUS DISPLAY';
var client = x11.createClient(function(display) { var client = x11.createClient({ display : disp }, done);
done();
}, disp);
client.on('error', done); client.on('error', done);
process.env.DISPLAY=disp; process.env.DISPLAY=disp;
}); });
@ -36,9 +40,9 @@ describe('Client', function() {
it('throws error if $DISPLAY is bogus', function(done) { it('throws error if $DISPLAY is bogus', function(done) {
try { try {
assert.throws(function() { assert.throws(function() {
var client = x11.createClient(function(display) { var client = x11.createClient({ display : 'BOGUS DISPLAY' }, function(err, display) {
done('Should not reach here'); done('Should not reach here');
}, 'BOGUS DISPLAY'); });
client.on('error', function(err) { done(); }); client.on('error', function(err) { done(); });
}, /Cannot parse display/); }, /Cannot parse display/);
done(); done();
@ -46,4 +50,11 @@ describe('Client', function() {
done(); done();
} }
}); });
it('returns error when connecting to non existent display', function(done) {
var client = x11.createClient({ display : ':44' }, function(err, display) {
assert(util.isError(err));
done();
});
});
}); });

View file

@ -6,12 +6,16 @@ describe('Client', function() {
var display; var display;
beforeEach(function(done) { beforeEach(function(done) {
var client = x11.createClient(function(dpy) { var client = x11.createClient(function(err, dpy) {
display=dpy; if (!err) {
done(); display = dpy;
client.removeListener('error', done); done();
}); client.removeListener('error', done);
client.on('error', done); } else {
done(err);
}
});
client.on('error', done);
}); });
it('should respond to ping()', function(done) { it('should respond to ping()', function(done) {

View file

@ -12,10 +12,13 @@ describe('CreateWindow request', function() {
var display; var display;
var X; var X;
beforeEach(function(done) { beforeEach(function(done) {
var client = x11.createClient(function(dpy) { var client = x11.createClient(function(err, dpy) {
display=dpy; if (!err) {
X = display.client; display = dpy;
done(); X = display.client;
}
done(err);
}); });
client.on('error', done); client.on('error', done);
}); });

View file

@ -7,10 +7,13 @@ describe('ForceScreenSaver request', function() {
var display; var display;
var X; var X;
beforeEach(function(done) { beforeEach(function(done) {
var client = x11.createClient(function(dpy) { var client = x11.createClient(function(err, dpy) {
display=dpy; if (!err) {
X = display.client; display = dpy;
done(); X = display.client;
}
done(err);
}); });
client.on('error', done); client.on('error', done);
}); });

View file

@ -7,13 +7,15 @@ describe('KillKlient request', function() {
var display; var display;
var X; var X;
beforeEach(function(done) { beforeEach(function(done) {
var client = x11.createClient(function(dpy) { var client = x11.createClient(function(err, dpy) {
display=dpy; if (!err) {
X = display.client; display = dpy;
done(); X = display.client;
}
done(err);
}); });
client.on('error', function(err) { client.on('error', function(err) {
console.log(err);
done(err); done(err);
}); });
}); });
@ -32,12 +34,16 @@ describe('KillKlient request', function() {
}); });
it('should terminate other client connection', function(done) { it('should terminate other client connection', function(done) {
x11.createClient(function(dpy) { x11.createClient(function(err, dpy) {
var otherclient = dpy.client; if (!err) {
var wnd = otherclient.AllocID(); var otherclient = dpy.client;
otherclient.CreateWindow(wnd, dpy.screen[0].root, 0, 0, 1, 1); var wnd = otherclient.AllocID();
otherclient.on('end', done); otherclient.CreateWindow(wnd, dpy.screen[0].root, 0, 0, 1, 1);
X.KillKlient(wnd); otherclient.on('end', done);
X.KillKlient(wnd);
} else {
done(err);
}
}); });
}); });

View file

@ -13,13 +13,17 @@ describe('Window property', function() {
var X; var X;
var wid; var wid;
beforeEach(function(done) { beforeEach(function(done) {
var client = x11.createClient(function(dpy) { var client = x11.createClient(function(err, dpy) {
display=dpy; if (!err) {
X = display.client; display = dpy;
wid = X.AllocID(); X = display.client;
X.CreateWindow(wid, display.screen[0].root, 0, 0, 100, 100, 0, 0, 0, 0, { eventMask: x11.eventMask.PropertyChange}); wid = X.AllocID();
done(); X.CreateWindow(wid, display.screen[0].root, 0, 0, 100, 100, 0, 0, 0, 0, { eventMask: x11.eventMask.PropertyChange});
client.removeListener('error', done); // all future errors should be attached to corresponding test 'done' done();
client.removeListener('error', done); // all future errors should be attached to corresponding test 'done'
} else {
done(err);
}
}); });
client.on('error', done); client.on('error', done);
}); });

View file

@ -8,17 +8,21 @@ describe('DPMS extension', function() {
var X; var X;
var dpms; var dpms;
before(function(done) { before(function(done) {
var client = x11.createClient(function(dpy) { var client = x11.createClient(function(err, dpy) {
display = dpy; if (!err) {
X = display.client; display = dpy;
X.require('dpms', function(ext) { X = display.client;
if (util.isError(ext)) { X.require('dpms', function(ext) {
done(ext); if (util.isError(ext)) {
} else { done(ext);
dpms = ext; } else {
done(); dpms = ext;
} done();
}); }
});
} else {
done(err);
}
}); });
client.on('error', done); client.on('error', done);

View file

@ -6,13 +6,14 @@ describe('Client', function() {
var display; var display;
beforeEach(function(done) { beforeEach(function(done) {
var client = x11.createClient(function(dpy) { var client = x11.createClient(function(err, dpy) {
display=dpy; console.log(err)
done(); display = dpy;
}); done(err);
});
}); });
it('should emit error which is instance of Error with seqence number corresponding to source request', function(done) { it('should emit error which is instance of Error with sequence number corresponding to source request', function(done) {
display.client.options.debug = true; display.client.options.debug = true;
display.client.CreateWindow(); // should emit error display.client.CreateWindow(); // should emit error
var seq = display.client.seq_num; var seq = display.client.seq_num;

View file

@ -6,10 +6,14 @@ describe('Client', function() {
var display; var display;
beforeEach(function(done) { beforeEach(function(done) {
var client = x11.createClient(function(dpy) { var client = x11.createClient(function(err, dpy) {
display=dpy; if (!err) {
done(); display = dpy;
client.removeListener('error', done); done();
client.removeListener('error', done);
} else {
done(err);
}
}); });
client.on('error', done); client.on('error', done);
}); });

View file

@ -8,17 +8,21 @@ describe('XTEST extension', function() {
var X; var X;
var xtest; var xtest;
before(function(done) { before(function(done) {
var client = x11.createClient(function(dpy) { var client = x11.createClient(function(err, dpy) {
display = dpy; if (!err) {
X = display.client; display = dpy;
X.require('xtest', function(ext) { X = display.client;
if (util.isError(ext)) { X.require('xtest', function(ext) {
done(ext); if (util.isError(ext)) {
} else { done(ext);
xtest = ext; } else {
done(); xtest = ext;
} done();
}); }
});
} else {
done(err);
}
}); });
client.on('error', done); client.on('error', done);