Marble/MarbleDBus: Difference between revisions

From KDE TechBase
(New page: == Scripting Marble from the shell using D-BUS == As MarbleWidget and MarbleMap provide their full amount of methods as a D-BUS Interface you can easily script Marble from the command lin...)
 
m (Ochurlaud moved page Projects/Marble/MarbleDBus to Marble/MarbleDBus)
 
(12 intermediate revisions by 4 users not shown)
Line 1: Line 1:
== Scripting Marble from the shell using D-BUS ==
== Scripting Marble from the shell using D-BUS ==


As MarbleWidget and MarbleMap provide their full amount of methods as a D-BUS Interface you can easily script Marble from the command line.
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 <b>qdbus</b> 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.
 
<syntaxhighlight lang="text">
marble_pid="$(pidof marble)"
</syntaxhighlight>
 
 
Then you can pass this PID to the actual qdbus call
 
<syntaxhighlight lang="text">
qdbus org.kde.marble-$marble_pid /MarbleWidget
</syntaxhighlight>
 
 
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
</syntaxhighlight>
 
 
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'
</syntaxhighlight>
 
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"
</syntaxhighlight>
 
Move to a place, specified by longitude and latitude
<syntaxhighlight lang="text">
MCALL org.kde.MarbleWidget.centerOn 8.8 53.2
</syntaxhighlight>
 
Set the zoom
<syntaxhighlight lang="text">
MCALL org.kde.MarbleWidget.zoomView 2000
</syntaxhighlight>
 
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
</syntaxhighlight>
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
</syntaxhighlight>
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')
</syntaxhighlight>
 
<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
</syntaxhighlight>

Latest revision as of 21:01, 10 March 2016

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)"


Then you can pass this PID to the actual qdbus call

qdbus org.kde.marble-$marble_pid /MarbleWidget


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.

qdbus org.kde.marble-$marble_pid /MarbleWidget org.kde.MarbleWidget.zoomIn


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

As a convenient tool you can use qdbusviewer 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

marble_pid="$(pidof marble)"
alias MCALL='qdbus org.kde.marble-${marble_pid} /MarbleWidget'

Changing map themes can be done via

MCALL org.kde.MarbleWidget.setMapThemeId "earth/srtm/srtm.dgml"
MCALL org.kde.MarbleWidget.setMapThemeId "earth/openstreetmap/openstreetmap.dgml"

Move to a place, specified by longitude and latitude

MCALL org.kde.MarbleWidget.centerOn 8.8 53.2

Set the zoom

MCALL org.kde.MarbleWidget.zoomView 2000

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.

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

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

MCALL org.kde.MarbleWidget.openGpxFile /tmp/test.gpx

but gives: "Invalid number of parameters". This might be a bug on the qdbus side.



Trouble shooting

No MarbleWidget or MarbleMap

Problem: Neither the MarbleMap nor the MarbleWidget interfaces are available in my installation, and qdbus complains:

org.freedesktop.DBus.Error.UnknownObject (No such object path '/MarbleWidget')

Solution: 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:

cmake -DBUILD_WITH_DBUS=ON ../marble