[gnome] Upgrade gjsosk

This commit is contained in:
2026-03-18 17:40:35 -04:00
parent e3037d237c
commit c67da4b75b
10 changed files with 799 additions and 224 deletions

View File

@ -44,6 +44,7 @@ export default class GjsOskPreferences extends ExtensionPreferences {
}
let layoutList = Object.keys(layouts);
layoutList.push("Custom")
let layoutLandscapeDrop = Gtk.DropDown.new_from_strings(layoutList);
layoutLandscapeDrop.valign = Gtk.Align.CENTER;
layoutLandscapeDrop.selected = settings.get_int("layout-landscape");
@ -63,6 +64,40 @@ export default class GjsOskPreferences extends ExtensionPreferences {
layoutPortraitRow.add_suffix(layoutPortraitDrop);
layoutPortraitRow.activatable_widget = layoutPortraitDrop;
const customLayoutRow = new Adw.EntryRow({
title: _('Custom Layout')
});
layoutRow.add_row(customLayoutRow);
customLayoutRow.set_text(settings.get_string("custom-layout"));
customLayoutRow.set_show_apply_button(true);
const createKeyboardLayoutRow = new Adw.ActionRow({
title: _('Create/edit a custom keyboard layout')
})
layoutRow.add_row(createKeyboardLayoutRow)
const layoutLink = new Gtk.LinkButton({
label: 'Keyboard Layout Editor',
uri: 'https://vishram1123.github.io/gjs-osk'
})
createKeyboardLayoutRow.add_suffix(layoutLink)
createKeyboardLayoutRow.activatable_widget = layoutLink
const disableEdgeSwipeRow = new Adw.ActionRow({
title: _('Disable Edge Swipe')
});
behaviorGroup.add(disableEdgeSwipeRow);
const disableEdgeSwipeDT = new Gtk.Switch({
active: settings.get_boolean('disable-edge-swipe'),
valign: Gtk.Align.CENTER,
});
disableEdgeSwipeRow.add_suffix(disableEdgeSwipeDT);
disableEdgeSwipeRow.activatable_widget = disableEdgeSwipeDT;
const enableDragRow = new Adw.ActionRow({
title: _('Enable Dragging')
});
@ -217,18 +252,73 @@ export default class GjsOskPreferences extends ExtensionPreferences {
defaultPosition.add_suffix(snapDrop);
defaultPosition.activatable_widget = snapDrop;
const soundPlayRow = new Adw.ActionRow({
title: _('Play sound')
const soundPlayRow = new Adw.ExpanderRow({
title: _('Play sound'),
show_enable_switch: true
});
behaviorGroup.add(soundPlayRow);
soundPlayRow.enable_expansion = settings.get_boolean('play-sound')
const soundPlayDT = new Gtk.Switch({
active: settings.get_boolean('play-sound'),
const fileRow = new Adw.ActionRow({
title: _('Sound file'),
subtitle: settings.get_string('sound-file') || _('No file selected'),
activatable: false, // prevent clicking the whole row
});
const fileButton = new Gtk.Button({
label: settings.get_string('sound-file') ? _('Clear') : _('Choose'),
valign: Gtk.Align.CENTER,
});
soundPlayRow.add_suffix(soundPlayDT);
soundPlayRow.activatable_widget = soundPlayDT;
fileRow.add_suffix(fileButton);
fileRow.activatable_widget = fileButton;
fileButton.connect('clicked', () => {
const currentPath = settings.get_string('sound-file');
if (currentPath) {
settings.set_string('sound-file', '');
fileRow.subtitle = _('No file selected');
fileButton.label = _('Choose');
} else {
const fileChooser = new Gtk.FileChooserNative({
title: _('Select OGG File'),
transient_for: window,
action: Gtk.FileChooserAction.OPEN,
accept_label: _('Open'),
cancel_label: _('Cancel'),
});
const filter = new Gtk.FileFilter();
filter.add_mime_type('audio/ogg');
filter.set_name(_('OGG files'));
fileChooser.add_filter(filter);
fileChooser.connect('response', (dlg, response) => {
if (response === Gtk.ResponseType.ACCEPT) {
const file = dlg.get_file();
if (file) {
const path = file.get_path();
settings.set_string('sound-file', path);
fileRow.subtitle = path;
fileButton.label = _('Clear');
// Optionally play the file immediately
try {
let player = global.display.get_sound_player();
player.play_from_file(path, null);
} catch (e) {
logError(e, 'Failed to play sound file');
}
}
}
dlg.destroy();
});
fileChooser.show();
}
});
soundPlayRow.add_row(fileRow);
const appearanceGroup = new Adw.PreferencesGroup({
title: _("Appearance")
@ -405,7 +495,7 @@ export default class GjsOskPreferences extends ExtensionPreferences {
context.add_class("title-1");
let another_label = new Gtk.Label({
label: _("Autorelease ") + `776e35f`
label: _("Autorelease ") + `3f0ef02`
});
let links_pref_group = new Adw.PreferencesGroup();
@ -447,6 +537,10 @@ export default class GjsOskPreferences extends ExtensionPreferences {
settings.bind("layout-landscape", layoutLandscapeDrop, "selected", 0);
settings.bind("layout-portrait", layoutPortraitDrop, "selected", 0);
customLayoutRow.connect("apply", () => {
settings.set_string("custom-layout", customLayoutRow.get_text());
});
settings.bind("disable-edge-swipe", disableEdgeSwipeDT, "active", 0);
settings.bind("enable-drag", dragEnableDT, "active", 0);
settings.bind("enable-tap-gesture", dragOpt, "selected", 0);
settings.bind("indicator-enabled", indEnabled, "active", 0);
@ -472,7 +566,7 @@ export default class GjsOskPreferences extends ExtensionPreferences {
settings.bind("outer-spacing-px", numChanger_outer, "value", 0);
settings.bind("snap-spacing-px", numChanger_snap, "value", 0)
settings.bind("round-key-corners", roundKeyCDT, "active", 0);
settings.bind("play-sound", soundPlayDT, "active", 0);
settings.bind("play-sound", soundPlayRow, "enable-expansion", 0);
settings.bind("show-icons", showIconDT, "active", 0)
settings.bind("default-snap", snapDrop, "selected", 0);
monitorDrop.connect("notify::selected", () => {
@ -492,6 +586,8 @@ export default class GjsOskPreferences extends ExtensionPreferences {
window.connect("close-request", () => {
settings.set_int("layout-landscape", layoutLandscapeDrop.selected);
settings.set_int("layout-portrait", layoutPortraitDrop.selected);
settings.set_string("custom-layout", customLayoutRow.get_text());
settings.set_boolean("disable-edge-swipe", disableEdgeSwipeDT.active);
settings.set_boolean("enable-drag", dragEnableDT.active);
settings.set_int("enable-tap-gesture", dragOpt.selected);
settings.set_boolean("indicator-enabled", indEnabled.active);
@ -513,7 +609,7 @@ export default class GjsOskPreferences extends ExtensionPreferences {
settings.set_int("outer-spacing-px", numChanger_outer.value);
settings.set_int("snap-spacing-px", numChanger_snap.value)
settings.set_boolean("round-key-corners", roundKeyCDT.active);
settings.set_boolean("play-sound", soundPlayDT.active);
settings.set_boolean("play-sound", soundPlayRow.enable_expansion);
settings.set_boolean("show-icons", showIconDT.active)
settings.set_int("default-snap", snapDrop.selected);
currentMonitorMap[monitors.length + ""] = monitors.map(m => { return m.get_connector() })[monitorDrop.selected];