2025-05-09 09:48:24 +02:00

89 lines
2.9 KiB
JavaScript

// Copyright 2018 Bartosz Jaroszewski
// SPDX-License-Identifier: GPL-2.0-or-later
//
// This program is free software: you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation, either version 2 of the License, or
// (at your option) any later version.
//
// This program is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU General Public License for more details.
//
// You should have received a copy of the GNU General Public License
// along with this program. If not, see <https://www.gnu.org/licenses/>.
import GnomeBluetooth from "gi://GnomeBluetooth";
import * as Signals from "resource:///org/gnome/shell/misc/signals.js";
class BluetoothController extends Signals.EventEmitter {
_client;
_deviceNotifyConnected;
_store;
_signals = [];
constructor() {
super();
this._client = new GnomeBluetooth.Client();
this._deviceNotifyConnected = /* @__PURE__ */ new Set();
this._store = this._client.get_devices();
}
enable() {
this._connectSignal(this._client, "notify::default-adapter", () => {
this._deviceNotifyConnected.clear();
this.emit("default-adapter-changed");
});
this._connectSignal(this._client, "notify::default-adapter-powered", () => {
this._deviceNotifyConnected.clear();
this.emit("default-adapter-changed");
});
this._connectSignal(this._client, "device-removed", (c, path) => {
this._deviceNotifyConnected.delete(path);
this.emit("device-deleted", path);
});
this._connectSignal(this._client, "device-added", (c, device) => {
this._connectDeviceNotify(device);
this.emit("device-inserted", device);
});
}
getDevices() {
const devices = [];
for (let i = 0; i < this._store.get_n_items(); i++) {
const device = this._store.get_item(i);
devices.push(device);
}
return devices;
}
getConnectedDevices() {
return this.getDevices().filter(({ connected }) => connected);
}
destroy() {
this._disconnectSignals();
}
_connectDeviceNotify(device) {
const path = device.get_object_path();
if (this._deviceNotifyConnected.has(path)) return;
this._deviceNotifyConnected.add(path);
this._connectSignal(device, "notify", (device2) => {
this.emit("device-changed", device2);
});
}
_connectSignal(subject, signal_name, method) {
if (!this._signals) this._signals = [];
const signal_id = subject.connect(signal_name, method);
this._signals.push({
subject,
signal_id
});
}
_disconnectSignals() {
if (!this._signals) return;
for (const signal of this._signals) {
signal.subject.disconnect(signal.signal_id);
}
this._signals = [];
}
}
export {
BluetoothController as default
};