Merge pull request #11 from WebFreak001/doc-update
Documentation update & tick function
This commit is contained in:
commit
406e7d9241
1
.gitignore
vendored
1
.gitignore
vendored
|
@ -6,3 +6,4 @@ __dummy.html
|
||||||
/ddbus
|
/ddbus
|
||||||
libddbus.*
|
libddbus.*
|
||||||
__test__library__
|
__test__library__
|
||||||
|
/ddbus-test-*
|
||||||
|
|
35
Readme.md
35
Readme.md
|
@ -18,7 +18,7 @@ Before using, you will need to have the DBus C library installed on your compute
|
||||||
`ddbus` is available on [DUB](http://code.dlang.org/packages/ddbus) so you can simply include it in your `dub.json`:
|
`ddbus` is available on [DUB](http://code.dlang.org/packages/ddbus) so you can simply include it in your `dub.json`:
|
||||||
```json
|
```json
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"ddbus": "~>1.0.0"
|
"ddbus": "~>2.0.0"
|
||||||
}
|
}
|
||||||
```
|
```
|
||||||
|
|
||||||
|
@ -62,6 +62,9 @@ Setting read only properties results in a thrown `DBusException`.
|
||||||
You can register a delegate into a `MessageRouter` and a main loop in order to handle messages.
|
You can register a delegate into a `MessageRouter` and a main loop in order to handle messages.
|
||||||
After that you can request a name so that other DBus clients can connect to your program.
|
After that you can request a name so that other DBus clients can connect to your program.
|
||||||
|
|
||||||
|
You can return a `Tuple!(args)` to return multiple values (multiple out values in XML) or
|
||||||
|
return a `Variant!DBusAny` to support returning any dynamic value.
|
||||||
|
|
||||||
```d
|
```d
|
||||||
import ddbus;
|
import ddbus;
|
||||||
MessageRouter router = new MessageRouter();
|
MessageRouter router = new MessageRouter();
|
||||||
|
@ -90,8 +93,7 @@ bool gotem = requestName(conn, "ca.thume.ddbus.test");
|
||||||
simpleMainLoop(conn);
|
simpleMainLoop(conn);
|
||||||
```
|
```
|
||||||
|
|
||||||
Note that `ddbus` currently only supports a simple event loop that is really only suitable for apps that don't do
|
See the Concurrent Updates section for details how to implement this in a custom main loop.
|
||||||
anything except respond to DBus messages. Other threads handling other things concurrently may or may not work with it. See the todo section for notes on potential `vibe.d` compatibility.
|
|
||||||
|
|
||||||
## Thin(ish) Wrapper
|
## Thin(ish) Wrapper
|
||||||
|
|
||||||
|
@ -134,11 +136,36 @@ you can import the others if you want lower level control.
|
||||||
Nothing is hidden so if `ddbus` doesn't provide something you can simply import `c_lib` and use the pointers
|
Nothing is hidden so if `ddbus` doesn't provide something you can simply import `c_lib` and use the pointers
|
||||||
contained in the thin wrapper structs to do it yourself.
|
contained in the thin wrapper structs to do it yourself.
|
||||||
|
|
||||||
|
# Concurrent Updates
|
||||||
|
|
||||||
|
If you want to use the DBus connection concurrently with some other features
|
||||||
|
or library like a GUI or vibe.d you can do so by placing this code in the update/main loop:
|
||||||
|
|
||||||
|
```d
|
||||||
|
// initialize Connection conn; somewhere
|
||||||
|
// on update:
|
||||||
|
if (!conn.tick)
|
||||||
|
return;
|
||||||
|
```
|
||||||
|
|
||||||
|
Or in vibe.d:
|
||||||
|
|
||||||
|
```d
|
||||||
|
runTask({
|
||||||
|
import vibe.core.core : yield;
|
||||||
|
|
||||||
|
while (conn.tick)
|
||||||
|
yield(); // Or sleep(1.msecs);
|
||||||
|
});
|
||||||
|
```
|
||||||
|
|
||||||
|
It would be better to watch a file descriptor asynchronously in the event loop instead of checking on a timer, but that hasn't been implemented yet, see Todo.
|
||||||
|
|
||||||
# Todo
|
# Todo
|
||||||
|
|
||||||
`ddbus` should be complete for everyday use but is missing some fanciness that it easily could and should have:
|
`ddbus` should be complete for everyday use but is missing some fanciness that it easily could and should have:
|
||||||
|
|
||||||
- [vibe.d](http://vibed.org/) event loop compatibility so that calls don't block everything and more importantly, it is possible to write apps that have a DBus server and can do other things concurrently, like a GUI.
|
- Support for adding file descriptors to event loops like vibe.d so that it only wakes up when messages arrive and not on a timer.
|
||||||
- Marshaling of DBus path and file descriptor objects
|
- Marshaling of DBus path and file descriptor objects
|
||||||
- Better efficiency in some places, particularly the object wrapping allocates tons of delegates for every method.
|
- Better efficiency in some places, particularly the object wrapping allocates tons of delegates for every method.
|
||||||
|
|
||||||
|
|
6
dub.json
6
dub.json
|
@ -1,12 +1,12 @@
|
||||||
{
|
{
|
||||||
"name": "ddbus",
|
"name": "ddbus",
|
||||||
"description": "A DBus library for D",
|
"description": "A DBus library for D",
|
||||||
"homepage": "http://github.com/trishume/ddbus",
|
"homepage": "https://github.com/trishume/ddbus",
|
||||||
"copyright": "Copyright © 2015, Tristan Hume",
|
"copyright": "Copyright © 2017, Tristan Hume",
|
||||||
"license": "MIT",
|
"license": "MIT",
|
||||||
"authors": ["Tristan Hume"],
|
"authors": ["Tristan Hume"],
|
||||||
"lflags": ["-ldbus-1"],
|
"lflags": ["-ldbus-1"],
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"dunit": "~>1.0.10"
|
"dunit": "~>1.0.14"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
{
|
{
|
||||||
"fileVersion": 1,
|
"fileVersion": 1,
|
||||||
"versions": {
|
"versions": {
|
||||||
"dunit": "1.0.10"
|
"dunit": "1.0.14"
|
||||||
}
|
}
|
||||||
}
|
}
|
|
@ -31,6 +31,12 @@ void simpleMainLoop(Connection conn) {
|
||||||
while(dbus_connection_read_write_dispatch(conn.conn, -1)) {} // empty loop body
|
while(dbus_connection_read_write_dispatch(conn.conn, -1)) {} // empty loop body
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// Single tick in the DBus connection which can be used for
|
||||||
|
/// concurrent updates.
|
||||||
|
bool tick(Connection conn) {
|
||||||
|
return cast(bool) dbus_connection_read_write_dispatch(conn.conn, 0);
|
||||||
|
}
|
||||||
|
|
||||||
unittest {
|
unittest {
|
||||||
import dunit.toolkit;
|
import dunit.toolkit;
|
||||||
Connection conn = connectToBus();
|
Connection conn = connectToBus();
|
||||||
|
|
Loading…
Reference in a new issue