Files
ssh-web-launcher/extension/extension.js
2025-12-24 22:52:46 +01:00

112 lines
3.5 KiB
JavaScript

/* extension.js
* Extension GNOME Shell - Dashboard Launcher
* Ajoute une icône dans la barre supérieure pour lancer/fermer le Dashboard
* Toggle: clic = affiche, re-clic = ferme
*
* Compatible GNOME 45+ (ESM)
*/
'use strict';
import GObject from 'gi://GObject';
import St from 'gi://St';
import Gio from 'gi://Gio';
import GLib from 'gi://GLib';
import * as Main from 'resource:///org/gnome/shell/ui/main.js';
import * as PanelMenu from 'resource:///org/gnome/shell/ui/panelMenu.js';
const APP_PATH = GLib.build_filenamev(['/home/gilles/Documents/vscode/ssh-web-launcher', 'app', 'ssh-launcher-gtk.py']);
const PID_FILE = '/tmp/dashboard-launcher.pid';
const DashboardLauncherIndicator = GObject.registerClass(
class DashboardLauncherIndicator extends PanelMenu.Button {
_init() {
super._init(0.0, 'Dashboard Launcher');
// Icône dans la barre (style dashboard/grille)
this._icon = new St.Icon({
icon_name: 'view-app-grid-symbolic',
style_class: 'system-status-icon dashboard-launcher-icon',
});
this.add_child(this._icon);
// Connexion du clic
this.connect('button-press-event', this._onClick.bind(this));
}
_onClick() {
this._toggleApp();
return true;
}
_isRunning() {
// Vérifie si le dashboard est en cours d'exécution
try {
let file = Gio.File.new_for_path(PID_FILE);
if (file.query_exists(null)) {
let [success, contents] = file.load_contents(null);
if (success) {
let pid = parseInt(new TextDecoder().decode(contents).trim());
// Vérifier si le processus existe (signal 0)
try {
let checkProc = new Gio.Subprocess({
argv: ['kill', '-0', pid.toString()],
flags: Gio.SubprocessFlags.NONE,
});
checkProc.init(null);
checkProc.wait(null);
return checkProc.get_successful();
} catch (e) {
return false;
}
}
}
} catch (e) {
// Fichier n'existe pas ou erreur de lecture
}
return false;
}
_toggleApp() {
try {
if (this._isRunning()) {
// Dashboard ouvert -> le fermer avec --toggle
let subprocess = new Gio.Subprocess({
argv: ['python3', APP_PATH, '--toggle'],
flags: Gio.SubprocessFlags.NONE,
});
subprocess.init(null);
} else {
// Dashboard fermé -> l'ouvrir
let subprocess = new Gio.Subprocess({
argv: ['python3', APP_PATH],
flags: Gio.SubprocessFlags.NONE,
});
subprocess.init(null);
}
} catch (e) {
logError(e, 'Dashboard Launcher: Erreur lors du toggle');
}
}
});
export default class DashboardLauncherExtension {
constructor() {
this._indicator = null;
}
enable() {
this._indicator = new DashboardLauncherIndicator();
Main.panel.addToStatusArea('dashboard-launcher', this._indicator);
}
disable() {
if (this._indicator) {
this._indicator.destroy();
this._indicator = null;
}
}
}