275 lines
8.2 KiB
JavaScript
275 lines
8.2 KiB
JavaScript
'use strict';
|
|
|
|
/**
|
|
* extension notification-timeout
|
|
* JavaScript Gnome extension for setting same timeout for all notifications.
|
|
*
|
|
* @author Václav Chlumský
|
|
* @copyright Copyright 2023, Václav Chlumský.
|
|
*/
|
|
|
|
/**
|
|
* @license
|
|
* The MIT License (MIT)
|
|
*
|
|
* Copyright (c) 2023 Václav Chlumský
|
|
*
|
|
* Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
* of this software and associated documentation files (the "Software"), to deal
|
|
* in the Software without restriction, including without limitation the rights
|
|
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
* copies of the Software, and to permit persons to whom the Software is
|
|
* furnished to do so, subject to the following conditions:
|
|
*
|
|
* The above copyright notice and this permission notice shall be included in
|
|
* all copies or substantial portions of the Software.
|
|
*
|
|
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
|
* THE SOFTWARE.
|
|
*/
|
|
|
|
import Gtk from 'gi://Gtk';
|
|
import Adw from 'gi://Adw';
|
|
import GObject from 'gi://GObject';
|
|
import {ExtensionPreferences, gettext as _} from 'resource:///org/gnome/Shell/Extensions/js/extensions/prefs.js';
|
|
|
|
export const PreferencesPage = GObject.registerClass({
|
|
GTypeName: 'NotificationTimeoutPrefsWidget'
|
|
}, class PreferencesPage extends GObject.Object {
|
|
_init(metadata, settings) {
|
|
super._init();
|
|
|
|
this._metadata = metadata;
|
|
this._settings = settings;
|
|
this._ignoreIdle = settings.get_boolean("ignore-idle");
|
|
this._alwaysNormal = settings.get_boolean("always-normal");
|
|
this._newTimeout = settings.get_int("timeout");
|
|
}
|
|
|
|
/**
|
|
* Build Settings page with general settings
|
|
*
|
|
* @method buildGeneralPage
|
|
* @return {Object} widget for page in notebook
|
|
*/
|
|
_buildGeneralPage() {
|
|
|
|
let top = 1;
|
|
let labelWidget = null;
|
|
|
|
let generalPage = new Gtk.Grid(
|
|
{
|
|
hexpand: true,
|
|
vexpand: true,
|
|
halign:Gtk.Align.CENTER,
|
|
valign:Gtk.Align.CENTER
|
|
}
|
|
);
|
|
|
|
/**
|
|
* Ignore idle
|
|
*/
|
|
labelWidget = new Gtk.Label(
|
|
{label: _("Ignore idle (always use timeout):")}
|
|
);
|
|
generalPage.attach(labelWidget, 1, top, 1, 1);
|
|
|
|
|
|
let ignoreIdleSwitch = new Gtk.Switch(
|
|
{
|
|
active: this._ignoreIdle,
|
|
hexpand: false,
|
|
vexpand: false,
|
|
halign:Gtk.Align.CENTER,
|
|
valign:Gtk.Align.CENTER
|
|
}
|
|
);
|
|
|
|
ignoreIdleSwitch.connect(
|
|
"notify::active",
|
|
() => {
|
|
this._ignoreIdle = ignoreIdleSwitch.get_active();
|
|
this._settings.set_boolean("ignore-idle", this._ignoreIdle);
|
|
}
|
|
)
|
|
generalPage.attach_next_to(
|
|
ignoreIdleSwitch,
|
|
labelWidget,
|
|
Gtk.PositionType.RIGHT,
|
|
1,
|
|
1
|
|
);
|
|
|
|
top++;
|
|
|
|
/**
|
|
* Notification' urgency is always normal
|
|
*/
|
|
labelWidget = new Gtk.Label(
|
|
{label: _("Timeouted notifications are always 'normal' ('critical' don't timeout):")}
|
|
);
|
|
generalPage.attach(labelWidget, 1, top, 1, 1);
|
|
|
|
|
|
let alwaysNormalSwitch = new Gtk.Switch(
|
|
{
|
|
active: this._alwaysNormal,
|
|
hexpand: false,
|
|
vexpand: false,
|
|
halign:Gtk.Align.CENTER,
|
|
valign:Gtk.Align.CENTER
|
|
}
|
|
);
|
|
|
|
alwaysNormalSwitch.connect(
|
|
"notify::active",
|
|
() => {
|
|
this._alwaysNormal = alwaysNormalSwitch.get_active();
|
|
this._settings.set_boolean("always-normal", this._alwaysNormal);
|
|
}
|
|
)
|
|
generalPage.attach_next_to(
|
|
alwaysNormalSwitch,
|
|
labelWidget,
|
|
Gtk.PositionType.RIGHT,
|
|
1,
|
|
1
|
|
);
|
|
|
|
top++;
|
|
|
|
/**
|
|
* Notification timeout
|
|
*/
|
|
labelWidget = new Gtk.Label(
|
|
{label: _("Notification timeout:")}
|
|
);
|
|
generalPage.attach(labelWidget, 1, top, 1, 1);
|
|
|
|
let timeoutComboBox = new Gtk.ComboBoxText();
|
|
|
|
timeoutComboBox.append("0", _("Don't timeout"));
|
|
timeoutComboBox.append("500", _("500 ms"));
|
|
timeoutComboBox.append("1000", _("1 s"));
|
|
timeoutComboBox.append("2000", _("2 s"));
|
|
timeoutComboBox.append("3000", _("3 s"));
|
|
timeoutComboBox.append("4000", _("4 s"));
|
|
timeoutComboBox.append("5000", _("5 s"));
|
|
timeoutComboBox.append("6000", _("6 s"));
|
|
timeoutComboBox.append("7000", _("7 s"));
|
|
timeoutComboBox.append("8000", _("8 s"));
|
|
timeoutComboBox.append("9000", _("9 s"));
|
|
timeoutComboBox.append("10000", _("10 s"));
|
|
timeoutComboBox.append("15000", _("15 s"));
|
|
timeoutComboBox.append("20000", _("20 s"));
|
|
timeoutComboBox.append("30000", _("30 s"));
|
|
timeoutComboBox.append("45000", _("45 s"));
|
|
timeoutComboBox.append("60000", _("1 min"));
|
|
timeoutComboBox.append("120000", _("2 min"));
|
|
timeoutComboBox.append("180000", _("3 min"));
|
|
timeoutComboBox.append("240000", _("4 min"));
|
|
timeoutComboBox.append("300000", _("5 min"));
|
|
timeoutComboBox.append("600000", _("10 min"));
|
|
timeoutComboBox.append("900000", _("15 min"));
|
|
timeoutComboBox.append("1800000", _("30 min"));
|
|
|
|
timeoutComboBox.set_active_id(this._newTimeout.toString());
|
|
|
|
timeoutComboBox.connect(
|
|
"changed",
|
|
() => {
|
|
this._newTimeout = parseInt(timeoutComboBox.get_active_id());
|
|
this._settings.set_int("timeout", this._newTimeout);
|
|
}
|
|
);
|
|
|
|
generalPage.attach_next_to(
|
|
timeoutComboBox,
|
|
labelWidget,
|
|
Gtk.PositionType.RIGHT,
|
|
1,
|
|
1
|
|
);
|
|
|
|
top++;
|
|
|
|
return generalPage;
|
|
}
|
|
|
|
/**
|
|
* Build About page
|
|
*
|
|
* @method buildGeneralPage
|
|
* @return {Object} widget for page in notebook
|
|
*/
|
|
_buildAboutPage() {
|
|
|
|
let aboutWidget = new Gtk.Box(
|
|
{
|
|
hexpand: true,
|
|
vexpand: true,
|
|
halign:Gtk.Align.CENTER,
|
|
valign:Gtk.Align.CENTER
|
|
}
|
|
);
|
|
|
|
let labelWidget = new Gtk.Label(
|
|
{label: `${this._metadata.name}, version: ${this._metadata.version}, Copyright (c) 2023 Václav Chlumský`}
|
|
);
|
|
|
|
aboutWidget.append(labelWidget);
|
|
|
|
return aboutWidget;
|
|
}
|
|
|
|
/**
|
|
* This function is called when the preferences window is first created to build
|
|
* and return a Gtk widget.
|
|
*
|
|
* @method buildPrefsWidget
|
|
* @return {Object} returns the prefsWidget
|
|
*/
|
|
buildPrefsWidget() {
|
|
|
|
let prefsPage = new Adw.PreferencesPage();
|
|
let prefsGroup = new Adw.PreferencesGroup();
|
|
|
|
let prefsMainBox = new Gtk.Box(
|
|
{
|
|
hexpand: true,
|
|
vexpand: true,
|
|
vexpand_set:true,
|
|
hexpand_set: true,
|
|
halign:Gtk.Align.FILL,
|
|
valign:Gtk.Align.FILL
|
|
}
|
|
);
|
|
|
|
let notebook = new Gtk.Notebook();
|
|
|
|
let pageGeneral = this._buildGeneralPage();
|
|
pageGeneral.border_width = 10;
|
|
notebook.append_page(
|
|
pageGeneral,
|
|
new Gtk.Label({label: _("General settings")})
|
|
);
|
|
|
|
let pageAbout = this._buildAboutPage()
|
|
pageAbout.border_width = 10;
|
|
notebook.append_page(
|
|
pageAbout,
|
|
Gtk.Image.new_from_icon_name("help-about", Gtk.IconSize.MENU)
|
|
);
|
|
|
|
prefsMainBox.append(notebook);
|
|
prefsGroup.add(prefsMainBox);
|
|
prefsPage.add(prefsGroup);
|
|
|
|
return prefsPage;
|
|
}
|
|
});
|