Marble/MarbleDBus

< Marble
Revision as of 20:49, 29 June 2011 by Neverendingo (Talk | contribs) (Text replace - "<code>" to "<syntaxhighlight lang="text">")

Jump to: navigation, search

Scripting Marble from the shell using D-BUS

MarbleWidget and MarbleMap provide their full amount of methods as a D-BUS Interface. Therefore you can easily create a shell-script to control Marble using the qdbus command line tool.

Before you start you need to find out the PID of the Marble process: In your script you can do it like this.

marble_pid="$(pidof marble)"
</code>


Then you can pass this PID to the actual qdbus call

<syntaxhighlight lang="text">
qdbus org.kde.marble-$marble_pid /MarbleWidget
</code>


This call returns a list of all the methods that MarbleWidget supports.
From this list you can choose the one that you'd like to call, e.g.

<syntaxhighlight lang="text">
qdbus org.kde.marble-$marble_pid /MarbleWidget org.kde.MarbleWidget.zoomIn
</code>


to zoom into the map. Note that for function calls you shouldn't pass the brackets "()".

As a convenient tool you can use <b>qdbusviewer</b> to get a graphical list of the interfaces and methods that get provided through D-BUS.


=== Further examples ===

To shorten the following dbus calls, we use
<syntaxhighlight lang="text">
marble_pid="$(pidof marble)"
alias MCALL='qdbus org.kde.marble-${marble_pid} /MarbleWidget'
</code>

Changing map themes can be done via
<syntaxhighlight lang="text">
MCALL org.kde.MarbleWidget.setMapThemeId "earth/srtm/srtm.dgml"
MCALL org.kde.MarbleWidget.setMapThemeId "earth/openstreetmap/openstreetmap.dgml"
</code>

Move to a place, specified by longitude and latitude
<syntaxhighlight lang="text">
MCALL org.kde.MarbleWidget.centerOn 8.8 53.2
</code>

Set the zoom
<syntaxhighlight lang="text">
MCALL org.kde.MarbleWidget.zoomView 2000
</code>

Note that the range of values passed to zoomView
is defined  in the .dgml files, eg for
marble/data/maps/earth/openstreetmap/openstreetmap.dgml
the range is from 900 to 4000, while for bluemarble it is from 900 to 2400.

It is also possible to retrieve parameters from marble, e.g.
<syntaxhighlight lang="text">
MCALL org.freedesktop.DBus.Properties.Get org.kde.MarbleWidget latitude
MCALL org.freedesktop.DBus.Properties.Get org.kde.MarbleWidget longitude
MCALL org.freedesktop.DBus.Properties.Get org.kde.MarbleWidget zoom
</code>
to get the current latitude, longitude or zoom.

Note that one has to go through org.freedesktop.DBus.Properties.Get
as latitude is not a method, but a property.

               
=== Things which (currently) don't work ===

Opening a gpx file should work via
<syntaxhighlight lang="text">
MCALL org.kde.MarbleWidget.openGpxFile /tmp/test.gpx
</code>
but gives: "Invalid number of parameters".
This might be a bug on  the qdbus side.

----------------
----------------

==Trouble shooting==
===No MarbleWidget or MarbleMap===
<b>Problem:</b> Neither the MarbleMap nor the MarbleWidget interfaces are available in my installation, and qdbus complains:
<syntaxhighlight lang="text">
org.freedesktop.DBus.Error.UnknownObject (No such object path '/MarbleWidget')
</code>

<b>Solution:</b> The D-BUS interface is only available in Marble trunk (and eventually in Marble >= 0.8). Additionally you need to make sure that the "BUILD_WITH_DBUS" cmake flag is set to "ON" once you are building Marble from the source code:

<syntaxhighlight lang="text">
cmake -DBUILD_WITH_DBUS=ON ../marble
</code>