1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
|
#!/usr/bin/gjs
/* global imports */
const Json = imports.gi.Json;
const GLib = imports.gi.GLib;
const Gio = imports.gi.Gio;
const Lang = imports.lang;
const Mainloop = imports.mainloop;
const AccuracyLevel = {
COUNTRY: 1,
CITY: 4,
NEIGHBORHOOD: 5,
STREET: 6,
EXACT: 8
};
const ManagerIface = '<node> \
<interface name="org.freedesktop.GeoClue2.Manager"> \
<method name="GetClient"> \
<arg type="o" name="client" direction="out"/> \
</method> \
</interface> \
</node>';
const ManagerProxy = Gio.DBusProxy.makeProxyWrapper(ManagerIface);
const ClientInterface = '<node> \
<interface name="org.freedesktop.GeoClue2.Client"> \
<property name="Location" type="o" access="read"/> \
<property name="DesktopId" type="s" access="readwrite"/> \
<property name="RequestedAccuracyLevel" type="u" access="readwrite"/> \
<property name="DistanceThreshold" type="u" access="readwrite"/> \
<property name="Active" type="b" access="read"/> \
<method name="Start"/> \
<method name="Stop"/> \
<signal name="LocationUpdated"> \
<arg name="old" type="o"/> \
<arg name="new" type="o"/> \
</signal> \
</interface> \
</node>';
const ClientProxy = Gio.DBusProxy.makeProxyWrapper(ClientInterface);
const LocationInterface = '<node> \
<interface name="org.freedesktop.GeoClue2.Location"> \
<property name="Latitude" type="d" access="read"/> \
<property name="Longitude" type="d" access="read"/> \
<property name="Accuracy" type="d" access="read"/> \
<property name="Description" type="s" access="read"/> \
</interface> \
</node>';
const LocationProxy = Gio.DBusProxy.makeProxyWrapper(LocationInterface);
function get_ISS_coords() {
const API_URL = 'http://api.open-notify.org/iss-now.json';
let iss_api = Gio.file_new_for_uri(API_URL);
iss_api.load_contents_async(null, function(iss_api, result) {
let iss_coords = JSON.parse(iss_api.load_contents_finish(result)[1]);
print(Object.keys(iss_coords));
print(iss_coords.toSource());
});
}
function onLocationUpdated(proxy, sender, [oldPath, newPath]) {
let geoclueLocation = new LocationProxy(Gio.DBus.system,
"org.freedesktop.GeoClue2",
newPath);
print('location:');
print('\tlatitude = ' + geoclueLocation.Latitude);
print('\tlongitude = ' + geoclueLocation.Longitude);
print('\taccuracy = ' + geoclueLocation.Accuracy);
print('\tdescription = ' + geoclueLocation.Description);
//this._updateLocation(location);
Mainloop.quit();
}
const _managerProxy = new ManagerProxy(Gio.DBus.system,
'org.freedesktop.GeoClue2', '/org/freedesktop/GeoClue2/Manager');
const [clientAddr] = _managerProxy.GetClientSync();
const clientProxy = new ClientProxy(Gio.DBus.system,
'org.freedesktop.GeoClue2', clientAddr);
clientProxy.DesktopId = 'gnome-shell-ISS_Above';
clientProxy.DistanceThreshold = 10000;
clientProxy.RequestedAccuracyLevel = AccuracyLevel.EXACT;
let updatedId = clientProxy.connectSignal('LocationUpdated',
onLocationUpdated);
clientProxy.StartRemote();
get_ISS_coords();
Mainloop.run();
|