chromebook-linux/cros-keyboard-map/keyd/data/gnome-extension-45/extension.js
2025-06-08 19:32:41 -05:00

65 lines
1.5 KiB
JavaScript

import * as Main from 'resource:///org/gnome/shell/ui/main.js';
import GLib from 'gi://GLib';
import Shell from 'gi://Shell';
import Gio from 'gi://Gio';
import { Extension } from 'resource:///org/gnome/shell/extensions/extension.js';
let file = Gio.File.new_for_path(makePipe());
let pipe = file.append_to_async(0, 0, null, on_pipe_open);
function makePipe() {
let runtime_dir = GLib.getenv('XDG_RUNTIME_DIR');
if (!runtime_dir)
runtime_dir = '/run/user/'+new TextDecoder().decode(
GLib.spawn_command_line_sync('id -u')[1]
).trim();
let path = runtime_dir + '/keyd.fifo';
GLib.spawn_command_line_sync('mkfifo ' + path);
return path;
}
function send(msg) {
if (!pipe)
return;
try {
pipe.write(msg, null);
} catch {
log('pipe closed, reopening...');
pipe = null;
file.append_to_async(0, 0, null, on_pipe_open);
}
}
function on_pipe_open(file, res) {
log('pipe opened');
pipe = file.append_to_finish(res);
}
export default class KeydExtension extends Extension {
enable() {
Shell.WindowTracker.get_default().connect('notify::focus-app', () => {
const win = global.display.focus_window;
const cls = win ? win.get_wm_class() : 'root';
const title = win ? win.get_title() : '';
send(`${cls} ${title}\n`);
});
Main.layoutManager.connectObject(
'system-modal-opened', () => {
send(`system-modal ${global.stage.get_title()}\n`);
},
this
);
GLib.spawn_command_line_async('keyd-application-mapper -d');
}
disable() {
GLib.spawn_command_line_async('pkill -f keyd-application-mapper');
}
}