diff --git a/gnome/.local/share/gnome-shell/extensions/BingWallpaper@ineffable-gmail.com/metadata.json b/gnome/.local/share/gnome-shell/extensions/BingWallpaper@ineffable-gmail.com/metadata.json index 0350386..fcaf57e 100644 --- a/gnome/.local/share/gnome-shell/extensions/BingWallpaper@ineffable-gmail.com/metadata.json +++ b/gnome/.local/share/gnome-shell/extensions/BingWallpaper@ineffable-gmail.com/metadata.json @@ -8,9 +8,10 @@ "45", "46", "47", - "48" + "48", + "49" ], "url": "https://github.com/neffo/bing-wallpaper-gnome-extension", "uuid": "BingWallpaper@ineffable-gmail.com", - "version": 51 + "version": 52 } \ No newline at end of file diff --git a/gnome/.local/share/gnome-shell/extensions/EasyScreenCast@iacopodeenosee.gmail.com/Options_UI.glade b/gnome/.local/share/gnome-shell/extensions/EasyScreenCast@iacopodeenosee.gmail.com/Options_UI.glade deleted file mode 100644 index 6ee3bb3..0000000 --- a/gnome/.local/share/gnome-shell/extensions/EasyScreenCast@iacopodeenosee.gmail.com/Options_UI.glade +++ /dev/null @@ -1,1493 +0,0 @@ - - - - - 5 - - - center - stk_Main - - - - - 800 - slide-left-right - - - page0 - Options - - - borderless - - - options-grid - 18 - 15 - - - end - 4 - 1 - Recording status indicators - right - - 0 - 0 - - - - - - end - 1 - Show alerts and notifications - - 0 - 1 - - - - - - 1 - start - 1 - - 1 - 1 - - - - - - end - 1 - Show a border around the area being recorded - - 0 - 2 - - - - - - 1 - start - 1 - - 1 - 2 - - - - - - end - 1 - Enable keyboard shortcut - - 0 - 3 - - - - - - - - 1 - liststore_KeyShortcut - 0 - 0 - - - - - - - 1 - 4 - - - - - - - Both [ESC + Default] - ESC only - Default only - Not any - - - 1 - 0 - - - - - - These words will be replaced - _fpath = the absolute path of the screencast video file. -_dirpath = the absolute path of destination folder for the screencast video file. -_fname = the name of the screencast video file. - end - 1 - Command post-recording - - 0 - 9 - - - - - - 1 - These words will be replaced - _fpath = the absolute path of the screencast video file. -_dirpath = the absolute path of destination folder for the screencast video file. -_fname = the name of the screencast video file. - 1 - - 1 - 9 - - - - - - end - 1 - Execute command after recording - - 0 - 8 - - - - - - 1 - start - 0 - - 1 - 8 - - - - - - 1 - start - 1 - - 1 - 5 - - - - - - end - 1 - Draw cursor on screencast - - 0 - 5 - - - - - - 1 - end - 1 - Active shortcut - - 0 - 4 - - - - - - 1 - start - 1 - - 1 - 3 - - - - - - end - 1 - Execute command before recording - - 0 - 6 - - - - - - 1 - start - 0 - - 1 - 6 - - - - - - These words will be replaced -_dirpath = the absolute path of destination folder for the screencast video file. - end - 1 - Command pre-recording - - 0 - 7 - - - - - - 1 - These words will be replaced -_dirpath = the absolute path of destination folder for the screencast video file. - 1 - - 1 - 7 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - page1 - Quality - - - borderless - - - vertical - - - 18 - 15 - - - end - 1 - Custom GStreamer Pipeline - - 0 - 0 - - - - - - 1 - start - 1 - - 1 - 0 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 1 - 800 - slide-up-down - - - pg_Preset - PagePreset - - - start - vertical - - - center - border-box - - - start - true - 100 - - - - - end - true - 100 - - - - - - - center - 1 - 1 - 18 - 5 - 0 - 0 - bottom - - - - - center - 1 - No GSP description - - 1 - word-char - end - - - - - - - - - pg_Custom - PageCustom - - - vertical - - - center - 18 - 15 - - - end - 1 - Frames Per Second - - 0 - 0 - - - - - - 1 - start - 1 - 0 - 1 - - 1 - 0 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 1 - 10 - 0.10000000149011612 - - - 1 - - - 1 - 5 - 5 - 1 - 1 - word-char - 0 - - - - - - - GStreamer Pipeline - - - - - - - center - vertical - - - start - The extension does NOT handle the webcam and audio when you use a custom gstreamer pipeline. - - 1 - - - - - - - - - - - 1 - Official doc - 1 - 1 - http://gstreamer.freedesktop.org/documentation/plugins.html - 1 - - - - - 1 - Wiki #1 - 1 - 1 - http://processors.wiki.ti.com/index.php/Example_GStreamer_Pipelines - - - - - 1 - Wiki #2 - 1 - 1 - http://wiki.oz9aec.net/index.php/Gstreamer_Cheat_Sheet - - - - - - - - - - - - - - - - - - - - - - - - page2 - WebCam - - - borderless - - - vertical - - - center - No webcam device selected - center - - - - - - - - - center - center - 0 - - - center - end - 1 - - - - - - - - center - 1 - stk_Webcam - - - - - 1 - 1 - 800 - slide-up-down - - - pg_quality_webcam - Quality - - - 1 - True - - - 1 - 1 - 1 - liststore_QualityWebCam - 1 - horizontal - - - - - - - - - - - - pg_size_webcam - Size - - - 18 - 15 - - - end - 1 - Type of unit of measure - - 0 - 0 - - - - - - end - 1 - Width - - 0 - 1 - - - - - - end - 1 - Height - - 0 - 2 - - - - - - 1 - start - 1 - 1 - - 1 - 1 - - - - - - 1 - start - 1 - 1 - - 1 - 2 - - - - - - start - 1 - - Percentage - Pixel - - - 1 - 0 - - - - - - - - - - - - - - - - - - - pg_position_webcam - Position - - - 18 - 15 - - - end - 1 - Put the webcam in the corner - - 0 - 0 - - - - - - start - 1 - - Right-Bottom - Left-Bottom - Right-Top - Left-Top - - - 1 - 0 - - - - - - end - 1 - Margin X - - 0 - 1 - - - - - - 1 - start - 1 - 1 - - 1 - 1 - - - - - - end - 1 - Margin Y - - 0 - 2 - - - - - - 1 - start - 0 - 1 - - 1 - 2 - - - - - - end - 1 - Alpha channel - - 0 - 3 - - - - - - 1 - start - 1 - 0,00 - 0.05 - 2 - 1 - - 1 - 3 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - page3 - File - - - borderless - - - 18 - 15 - - - Select the folder where the file is saved, if not specific a folder the file will be saved in the $XDG_VIDEOS_DIR if it exists, or the home directory otherwise. - end - 1 - Destination folder - - 0 - 3 - - - - - - The filename which may contain some escape sequences - %d and %t will be replaced by the start date and time of the recording. - end - 1 - File name template - - 0 - 2 - - - - - - 1 - 1 - The filename which may contain some escape sequences - %d and %t will be replaced by the start date and time of the recording. - 1 - - 1 - 2 - - - - - - True - False - Select the folder where the file is saved, if not specific a folder the file will be saved in the $XDG_VIDEOS_DIR if it exists, or the home directory otherwise. - - 1 - 3 - - - - - - end - 1 - File container - - 0 - 0 - - - - - - end - 1 - File resolution - - 0 - 1 - - - - - - - WebM [VP8 encoder + vorbis] - WebM [VP9 encoder + vorbis] - MP4 [x264 encoder + mp3] - Mkv [x264 encoder + flac] - Ogg [Theora encoder + opus] - MP4_AAC [x264 encoder + aac] - - - 1 - 0 - - - - - - vertical - - - 1 - center - 1 - stk_FileResolution - - - - - 10 - 0 - 800 - slide-up-down - 1 - - - native - Native - - - Native area resolution - - - - - - - - - - preset - Preset - - - 5 - 18 - 15 - - - end - 1 - Preset helper - - 0 - 0 - - - - - - start - 1 - - VGA [480p] [4:3] - FWVGA [480p] [16:9] - SVGA [600p] [4:3] - SMPTE [720p] [4:3] - HD [720p] [16:9] - XGA [768p] [4:3] - HD ready [768p] [16:9] - SXGA [1024p] [5:4] - Full HD [1080p] [16:9] - UXGA [1200p] [4:3] - QHD [1440p] [16:9] - QSXGA [2048p] [5:4] - 4K [2160p] [16:9] - - - 1 - 0 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - custom - Custom - - - vertical - - - 5 - 18 - 15 - - - end - 1 - Width - - 0 - 0 - - - - - - 1 - start - 1 - - 1 - 0 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 1 - 1 - 1 - 1 - - - - - 5 - 18 - 15 - - - end - 1 - Height - - 0 - 0 - - - - - - 1 - start - 1 - - 1 - 0 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 1 - 1 - 1 - 1 - - - - - 1 - keep original aspect ratio - 1 - center - 5 - - - - - - - - - - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - page5 - Support - - - borderless - - - vertical - - - 5 - 18 - 15 - - - This option enable more debug message, to view these run this command into a terminal: -$ journalctl --since=today --no-pager | grep js -$ dbus-monitor "interface=org.gnome.Shell.Screencast" - end - 1 - Enable verbose debug - - 0 - 0 - - - - - - 1 - This option enable more debug message, to view these run this command into a terminal: -$ journalctl /usr/bin/gnome-session --since=today | grep js -$ dbus-monitor "interface=org.gnome.Shell.Screencast" - start - 1 - - 1 - 0 - - - - - - start - 5 - 0 - - extension - last Gstreamer pipeline - gnome shell - - - 1 - 1 - - - - - - This option enable more debug message, to view these run this command into a terminal: -$ journalctl --since=today --no-pager | grep js -$ dbus-monitor "interface=org.gnome.Shell.Screencast" - end - 1 - Display the log of - - 0 - 1 - - - - - - - - - - - - - - - - - - - - - - - 1 - 1 - True - - - 1 - 0 - 1 - - - - - - - 5 - 5 - - - - - center - Restore default options - 1 - 1 - - - - - - - - - - - - - - page4 - Info - - - borderless - - - vertical - - - 100 - - - - - EasyScreenCast - - - - - - - - - - center - 10 - 1 - N/A - 1 - - - - - - - - center - 15 - 15 - This extension simplifies the use of the -screen recorder included in gnome shell - center - middle - - - - - - - - This software is licensed under GPL v3 - 1 - 1 - https://github.com/EasyScreenCast/EasyScreenCast/blob/master/COPYING - - - - - Credits - 1 - 1 - https://github.com/EasyScreenCast/EasyScreenCast/graphs/contributors - - - - - How to contribute? - - - - - With a translation - 1 - 1 - https://github.com/EasyScreenCast/EasyScreenCast#translation - - - - - Reporting bugs - 1 - 1 - https://github.com/EasyScreenCast/EasyScreenCast/issues - - - - - Add code - 1 - 1 - https://github.com/EasyScreenCast/EasyScreenCast/pulls - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/gnome/.local/share/gnome-shell/extensions/EasyScreenCast@iacopodeenosee.gmail.com/convenience.js b/gnome/.local/share/gnome-shell/extensions/EasyScreenCast@iacopodeenosee.gmail.com/convenience.js deleted file mode 100644 index fca4c1e..0000000 --- a/gnome/.local/share/gnome-shell/extensions/EasyScreenCast@iacopodeenosee.gmail.com/convenience.js +++ /dev/null @@ -1,84 +0,0 @@ -/* - Copyright (c) 2011-2012, Giovanni Campagna - - Redistribution and use in source and binary forms, with or without - modification, are permitted provided that the following conditions are met: - * Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. - * Redistributions in binary form must reproduce the above copyright - notice, this list of conditions and the following disclaimer in the - documentation and/or other materials provided with the distribution. - * Neither the name of the GNOME nor the - names of its contributors may be used to endorse or promote products - derived from this software without specific prior written permission. - - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE FOR ANY - DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -*/ - -'use strict'; - -import Gio from 'gi://Gio'; - -var debugEnabled = false; - -/** - * @param {boolean} d Enable/Disable debug logging - */ -export function setDebugEnabled(d) { - debugEnabled = d; -} - -/** - * @param {string} msg the message to log - * @class - */ -export function TalkativeLog(msg) { - if (debugEnabled) - console.log(`[ESC]${msg}`); -} - -/** - * Gets the full (semantic) version of this extension. - * - *

Note: The actual value is added during build time. - * - * @returns {string} the version - */ -export function getFullVersion() { - return '1.11.1'; // FULL_VERSION -} - -/** - * Loads an icon from the extension's subdirectory "images". - * - * @param {Gio.File} extensionDir dir of the extension - * @param {string} name filename of the image - * @returns {Gio.FileIcon} the icon - */ -export function loadIcon(extensionDir, name) { - return new Gio.FileIcon({ - file: Gio.File.new_for_path( - getImagePath(extensionDir, name) - ), - }); -} - -/** - * Gets the path to the image from the extension's subdirectory "images". - * - * @param {Gio.File} extensionDir dir of the extension - * @param {string} name filename of the image - * @returns {string} the path - */ -export function getImagePath(extensionDir, name) { - return extensionDir.get_child(`images/${name}`).get_path(); -} diff --git a/gnome/.local/share/gnome-shell/extensions/EasyScreenCast@iacopodeenosee.gmail.com/display_module.js b/gnome/.local/share/gnome-shell/extensions/EasyScreenCast@iacopodeenosee.gmail.com/display_module.js deleted file mode 100644 index ceff7cc..0000000 --- a/gnome/.local/share/gnome-shell/extensions/EasyScreenCast@iacopodeenosee.gmail.com/display_module.js +++ /dev/null @@ -1,38 +0,0 @@ -'use strict'; - -/** - * @type {{_display(): Meta_Display, number_of_displays(): int}} - */ -export const DisplayApi = { - /** - * Returns the Wayland display or screen - * - * @returns {Meta.Display} - */ - _display() { - return global.display || global.screen; - }, - - /** - * @returns {int} - * @public - */ - number_displays() { - return this._display().get_n_monitors(); - }, - - /** - * @param {number} displayIndex the monitor number - * @returns {Meta.Rectangle} - */ - display_geometry_for_index(displayIndex) { - return this._display().get_monitor_geometry(displayIndex); - }, - - /** - * @param {Meta.Cursor} cursor the new cursor to set - */ - set_cursor(cursor) { - this._display().set_cursor(cursor); - }, -}; diff --git a/gnome/.local/share/gnome-shell/extensions/EasyScreenCast@iacopodeenosee.gmail.com/extension.js b/gnome/.local/share/gnome-shell/extensions/EasyScreenCast@iacopodeenosee.gmail.com/extension.js deleted file mode 100644 index 32a7c7c..0000000 --- a/gnome/.local/share/gnome-shell/extensions/EasyScreenCast@iacopodeenosee.gmail.com/extension.js +++ /dev/null @@ -1,1037 +0,0 @@ -/* - Copyright (C) 2013 Borsato Ivano - - The JavaScript code in this page is free software: you can - redistribute it and/or modify it under the terms of the GNU - General Public License (GNU GPL) as published by the Free Software - Foundation, either version 3 of the License, or (at your option) - any later version. The code is distributed WITHOUT ANY WARRANTY; - without even the implied warranty of MERCHANTABILITY or FITNESS - FOR A PARTICULAR PURPOSE. See the GNU GPL for more details. -*/ - - -'use strict'; - -import GObject from 'gi://GObject'; -import St from 'gi://St'; -import Meta from 'gi://Meta'; -import Shell from 'gi://Shell'; -// https://gitlab.gnome.org/GNOME/gnome-shell/-/blob/main/js/ui/panelMenu.js -import * as PanelMenu from 'resource:///org/gnome/shell/ui/panelMenu.js'; -import Clutter from 'gi://Clutter'; -import * as PopupMenu from 'resource:///org/gnome/shell/ui/popupMenu.js'; -import * as Slider from 'resource:///org/gnome/shell/ui/slider.js'; -import * as Main from 'resource:///org/gnome/shell/ui/main.js'; - -import {Extension, gettext as _} from 'resource:///org/gnome/shell/extensions/extension.js'; - -import * as Lib from './convenience.js'; -import * as Settings from './settings.js'; -import * as Time from './timer.js'; -import * as UtilRecorder from './utilrecorder.js'; -import * as UtilAudio from './utilaudio.js'; -import * as UtilWebcam from './utilwebcam.js'; -import * as UtilNotify from './utilnotify.js'; -import * as Selection from './selection.js'; -import * as UtilExeCmd from './utilexecmd.js'; - -var Indicator; -let timerD = null; -let timerC = null; - -let isActive = false; -let pathFile = ''; - -let keybindingConfigured = false; - -/** - * @type {EasyScreenCastIndicator} - */ -const EasyScreenCastIndicator = GObject.registerClass({ - GTypeName: 'EasyScreenCast_Indicator', -}, class EasyScreenCastIndicator extends PanelMenu.Button { - constructor(extension) { - super(null, 'EasyScreenCast_Indicator'); - - this._extension = extension; - this._settings = new Settings.Settings(this._extension.getSettings()); - Lib.setDebugEnabled(this._settings.getOption('b', Settings.VERBOSE_DEBUG_SETTING_KEY)); - this._settings._settings.connect( - `changed::${Settings.VERBOSE_DEBUG_SETTING_KEY}`, - () => { - Lib.setDebugEnabled(this._settings.getOption('b', Settings.VERBOSE_DEBUG_SETTING_KEY)); - } - ); - - this.CtrlAudio = new UtilAudio.MixerAudio(); - // CtrlWebcam is initialized lazy to avoid problems like #368 - this.CtrlWebcam = null; - - this.CtrlNotify = new UtilNotify.NotifyManager(); - this.CtrlExe = new UtilExeCmd.ExecuteStuff(this); - - // load indicator icons - this._icons = { - on: Lib.loadIcon(this._extension.dir, 'icon_recording.svg'), - onSel: Lib.loadIcon(this._extension.dir, 'icon_recordingSel.svg'), - off: Lib.loadIcon(this._extension.dir, 'icon_default.svg'), - offSel: Lib.loadIcon(this._extension.dir, 'icon_defaultSel.svg'), - }; - - // check audio - if (!this.CtrlAudio.checkAudio()) { - Lib.TalkativeLog('-*-disable audio recording'); - this._settings.setOption(Settings.INPUT_AUDIO_SOURCE_SETTING_KEY, 0); - this._settings.setOption( - Settings.ACTIVE_CUSTOM_GSP_SETTING_KEY, - Settings.getGSPstd(false) - ); - } - - // add enter/leave/click event - this.connect('enter_event', () => this.refreshIndicator(true)); - this.connect('leave_event', () => this.refreshIndicator(false)); - this.connect('button_press_event', (actor, event) => - this._onButtonPress(actor, event) - ); - - // prepare setting var - if (this._settings.getOption('i', Settings.TIME_DELAY_SETTING_KEY) > 0) - this.isDelayActive = true; - else - this.isDelayActive = false; - - - // Add the title bar icon and label for time display - this.indicatorBox = new St.BoxLayout(); - this.indicatorIcon = new St.Icon({ - gicon: this._icons.off, - icon_size: 16, - }); - this.timeLabel = new St.Label({ - text: '', - style_class: 'time-label', - y_expand: true, - y_align: Clutter.ActorAlign.CENTER, - }); - - this.indicatorBox.add_child(this.timeLabel); - this.indicatorBox.add_child(this.indicatorIcon); - - // init var - this.recorder = new UtilRecorder.CaptureVideo(); - this.AreaSelected = null; - this.TimeSlider = null; - - this._initMainMenu(); - } - - /** - * @private - */ - _initMainMenu() { - this._addStartStopMenuEntry(); - this.menu.addMenuItem(new PopupMenu.PopupSeparatorMenuItem()); - this.sub_menu_audio_recording = new PopupMenu.PopupSubMenuMenuItem(_('No audio source'), true); - this.sub_menu_audio_recording.icon.icon_name = 'audio-input-microphone-symbolic'; - this.menu.addMenuItem(this.sub_menu_audio_recording); - this._addAudioRecordingSubMenu(); - - // add sub menu webcam recording - this._addSubMenuWebCam(); - - this._addAreaRecordingSubMenu(); - this._addRecordingDelaySubMenu(); - this.menu.addMenuItem(new PopupMenu.PopupSeparatorMenuItem()); - this.menu_item_options = new PopupMenu.PopupMenuItem(_('Options')); - this.menu_item_options.actor.insert_child_at_index( - new St.Icon({ - style_class: 'popup-menu-icon', - icon_name: 'preferences-other-symbolic', - }), - 1 - ); - this.menu.addMenuItem(this.menu_item_options); - this.menu_item_options.connect('activate', () => this._openExtensionPreferences()); - } - - /** - * Set a new value for the time label. Integers are - * converted to seconds, minutes, hours. All other - * values are converted to strings. - * - * @param {string|number} newValue new value of the label. if a number, then it's the seconds passed. - * @returns {string} - */ - updateTimeLabel(newValue) { - /** - * @param {number} number a number - */ - function padZeros(number) { - if (number < 10) - number = `0${number}`; - - return number.toString(); - } - - if (typeof newValue === 'number') { - let hours = Math.floor(newValue / 3600); - newValue -= hours * 3600; - - let minutes = Math.floor(newValue / 60); - newValue -= minutes * 60; - - newValue = `${padZeros(hours)}:${padZeros(minutes)}:${padZeros(newValue)}`; - } - - this.timeLabel.set_text(newValue.toString()); - } - - /** - * Left clicking on the icon toggles the recording - * options menu. Any other mouse button will start - * the recording. - * Some submenus are refreshed to account for new - * sources. - * - * @param {Clutter.Actor} actor the actor - * @param {Clutter.Event} event a Clutter.Event - */ - _onButtonPress(actor, event) { - let button = event.get_button(); - - if (button === 1) { - Lib.TalkativeLog('-*-left click indicator'); - - this._setupExtensionMenu(); - } else { - Lib.TalkativeLog('-*-right click indicator'); - - if (this.menu.isOpen) - this.menu.close(); - - this.isShowNotify = this._settings.getOption('b', Settings.SHOW_NOTIFY_ALERT_SETTING_KEY); - this._doRecording(); - } - } - - /** - * Sets up the menu when the user opens it. - */ - _setupExtensionMenu() { - this._addAudioRecordingSubMenu(); - this._addWebcamSubMenu(); - } - - /** - * Sets up all the options for web-cams. Should only run the - * first time the icon is clicked an the CtrlWebcam is still - * null. - */ - _addWebcamSubMenu() { - if (this.CtrlWebcam === null) - this.CtrlWebcam = new UtilWebcam.HelperWebcam(_('Unspecified webcam')); - - // add sub menu webcam recording - this._populateSubMenuWebcam(); - - // start monitoring inputvideo - this.CtrlWebcam.startMonitor(); - } - - /** - * Adds individual webcam items to the webcam menu. - */ - _populateSubMenuWebcam() { - let arrMI = this._createMIWebCam(); - - this.smWebCam.menu.removeAll(); - for (let element in arrMI) - this.smWebCam.menu.addMenuItem(arrMI[element]); - - let i = this._settings.getOption('i', Settings.DEVICE_INDEX_WEBCAM_SETTING_KEY); - Lib.TalkativeLog(`-*-populated submenuwebcam. Settings i=${i}`); - - this.smWebCam.label.text = this.WebCamDevice[i]; - } - - /** - * @private - */ - _addStartStopMenuEntry() { - this.imRecordAction = new PopupMenu.PopupBaseMenuItem(); - this.RecordingLabel = new St.Label({ - text: _('Start recording'), - style_class: 'RecordAction-label', - content_gravity: Clutter.ContentGravity.CENTER, - x_expand: true, - x_align: Clutter.ActorAlign.CENTER, - }); - this.imRecordAction.actor.add_child(this.RecordingLabel); - this.imRecordAction.x_expand = true; - this.imRecordAction.x_fill = true; - this.imRecordAction.x_align = Clutter.ActorAlign.CENTER; - this.imRecordAction.connect('activate', () => { - this.isShowNotify = this._settings.getOption('b', Settings.SHOW_NOTIFY_ALERT_SETTING_KEY); - this._doRecording(); - }); - - this.menu.addMenuItem(this.imRecordAction); - } - - /** - * Refreshes the submenu for audio recording sources. - */ - _addAudioRecordingSubMenu() { - Lib.TalkativeLog('-*-reset the sub menu audio'); - // remove old menu items - this.sub_menu_audio_recording.menu.removeAll(); - - Lib.TalkativeLog('-*-add new items to sub menu audio'); - var arrMI = this._createMIAudioRec(); - for (var ele in arrMI) - this.sub_menu_audio_recording.menu.addMenuItem(arrMI[ele]); - } - - /** - * @private - */ - _addSubMenuWebCam() { - this.smWebCam = new PopupMenu.PopupSubMenuMenuItem('', true); - this.smWebCam.icon.icon_name = 'camera-web-symbolic'; - - this.menu.addMenuItem(this.smWebCam); - } - - /** - * @private - */ - _addAreaRecordingSubMenu() { - this.sub_menu_area_recording = new PopupMenu.PopupSubMenuMenuItem('', true); - this.sub_menu_area_recording.icon.icon_name = 'view-fullscreen-symbolic'; - - var arrMI = this._createMIAreaRec(); - for (var ele in arrMI) - this.sub_menu_area_recording.menu.addMenuItem(arrMI[ele]); - - this.sub_menu_area_recording.label.text = this.AreaType[this._settings.getOption('i', Settings.AREA_SCREEN_SETTING_KEY)]; - this.menu.addMenuItem(this.sub_menu_area_recording); - } - - /** - * @private - */ - _addRecordingDelaySubMenu() { - this.smDelayRec = new PopupMenu.PopupSubMenuMenuItem('', true); - this.smDelayRec.icon.icon_name = 'alarm-symbolic'; - - var arrMI = this._createMIInfoDelayRec(); - for (var ele in arrMI) - this.smDelayRec.menu.addMenuItem(arrMI[ele]); - - var secDelay = this._settings.getOption('i', Settings.TIME_DELAY_SETTING_KEY); - if (secDelay > 0) { - this.smDelayRec.label.text = - secDelay + _(' sec. delay before recording'); - } else { - this.smDelayRec.label.text = _('Start recording immediately'); - } - - this.menu.addMenuItem(this.smDelayRec); - } - - /** - * @returns {Array} - * @private - */ - _createMIAreaRec() { - this.AreaType = [ - _('Record all desktop'), - _('Record a selected monitor'), - _('Record a selected window'), - _('Record a selected area'), - ]; - - this.AreaMenuItem = new Array(this.AreaType.length); - - for (var i = 0; i < this.AreaMenuItem.length; i++) { - this.AreaMenuItem[i] = new PopupMenu.PopupMenuItem( - this.AreaType[i], - { - reactive: true, - activate: true, - hover: true, - can_focus: true, - } - ); - - (function (areaSetting, arr, item, settings) { - this.connectMI = function () { - this.connect('activate', () => { - Lib.TalkativeLog(`-*-set area recording to ${areaSetting} ${arr[areaSetting]}`); - settings.setOption(Settings.AREA_SCREEN_SETTING_KEY, areaSetting); - - item.label.text = arr[areaSetting]; - }); - }; - this.connectMI(); - }.call( - this.AreaMenuItem[i], - i, - this.AreaType, - this.sub_menu_area_recording, - this._settings - )); - } - - return this.AreaMenuItem; - } - - /** - * @returns {Array} - * @private - */ - _createMIWebCam() { - this.WebCamDevice = [_('No WebCam recording')]; - // add menu item webcam device from GST - const devices = this.CtrlWebcam.getDevicesIV(); - this.WebCamDevice.push(...this.CtrlWebcam.getNameDevices()); - Lib.TalkativeLog(`-*-webcam list: ${this.WebCamDevice}`); - this.AreaMenuItem = new Array(this.WebCamDevice.length); - - for (var i = 0; i < this.AreaMenuItem.length; i++) { - let devicePath = ''; - - // i === 0 is "No Webcam selected" - if (i > 0) { - const device = devices[i - 1]; - devicePath = device.get_properties().get_string('device.path'); - Lib.TalkativeLog(`-*-webcam i=${i} devicePath: ${devicePath}`); - } - - Lib.TalkativeLog(`-*-webcam i=${i} menu-item-text: ${this.WebCamDevice[i]}`); - this.AreaMenuItem[i] = new PopupMenu.PopupMenuItem( - this.WebCamDevice[i], - { - reactive: true, - activate: true, - hover: true, - can_focus: true, - } - ); - - (function (index, devPath, arr, item, settings) { - this.connectMI = function () { - this.connect('activate', () => { - Lib.TalkativeLog(`-*-set webcam device to ${index} ${arr[index]} devicePath=${devPath}`); - settings.setOption(Settings.DEVICE_INDEX_WEBCAM_SETTING_KEY, index); - settings.setOption(Settings.DEVICE_WEBCAM_SETTING_KEY, devPath); - item.label.text = arr[index]; - }); - }; - this.connectMI(); - }.call( - this.AreaMenuItem[i], - i, - devicePath, - this.WebCamDevice, - this.smWebCam, - this._settings - )); - } - - return this.AreaMenuItem; - } - - /** - * @returns {Array} - * @private - */ - _createMIAudioRec() { - // add std menu item - this.AudioChoice = [ - { - desc: _('No audio source'), - name: 'N/A', - port: 'N/A', - sortable: true, - resizeable: true, - }, - { - desc: _('Default audio source'), - name: 'N/A', - port: 'N/A', - sortable: true, - resizeable: true, - }, - ]; - // add menu item audio source from PA - var audioList = this.CtrlAudio.getListInputAudio(); - for (var index in audioList) - this.AudioChoice.push(audioList[index]); - - this.AudioMenuItem = new Array(this.AudioChoice.length); - - for (var i = 0; i < this.AudioChoice.length; i++) { - // create label menu - let labelMenu = this.AudioChoice[i].desc; - if (i >= 2) { - labelMenu += - _('\n - Port: ') + - this.AudioChoice[i].port + - _('\n - Name: ') + - this.AudioChoice[i].name; - } - // create submenu - this.AudioMenuItem[i] = new PopupMenu.PopupMenuItem(labelMenu, { - reactive: true, - activate: true, - hover: true, - can_focus: true, - }); - // add icon on submenu - this.AudioMenuItem[i].actor.insert_child_at_index( - new St.Icon({ - style_class: 'popup-menu-icon', - icon_name: 'audio-card-symbolic', - }), - 1 - ); - - // update choice audio from pref - if (i === this._settings.getOption('i', Settings.INPUT_AUDIO_SOURCE_SETTING_KEY)) { - Lib.TalkativeLog(`-*-get audio choice from pref ${i}`); - this.sub_menu_audio_recording.label.text = this.AudioChoice[i].desc; - } - - // add action on menu item - (function (audioIndex, arr, item, settings) { - this.connectMI = function () { - this.connect('activate', () => { - Lib.TalkativeLog(`-*-set audio choice to ${audioIndex}`); - settings.setOption(Settings.INPUT_AUDIO_SOURCE_SETTING_KEY, audioIndex); - item.label.text = arr[audioIndex].desc; - }); - }; - this.connectMI(); - }.call( - this.AudioMenuItem[i], - i, - this.AudioChoice, - this.sub_menu_audio_recording, - this._settings - )); - } - return this.AudioMenuItem; - } - - /** - * @returns {Array} - * @private - */ - _createMIInfoDelayRec() { - this.DelayTimeTitle = new PopupMenu.PopupMenuItem(_('Delay Time'), { - reactive: false, - }); - - this.DelayTimeLabel = new St.Label({ - text: - Math.floor( - this._settings.getOption('i', Settings.TIME_DELAY_SETTING_KEY) - ).toString() + _(' Sec'), - }); - this.DelayTimeTitle.actor.add_child(this.DelayTimeLabel); - // TODO this.DelayTimeTitle.align = St.Align.END; - - this.imSliderDelay = new PopupMenu.PopupBaseMenuItem({ - activate: false, - }); - this.TimeSlider = new Slider.Slider(this._settings.getOption('i', Settings.TIME_DELAY_SETTING_KEY) / 100); - this.TimeSlider.x_expand = true; - this.TimeSlider.y_expand = true; - - this.TimeSlider.connect('notify::value', item => { - this.DelayTimeLabel.set_text( - Math.floor(item.value * 100).toString() + _(' Sec') - ); - }); - - this.TimeSlider.connect('drag-end', () => this._onDelayTimeChanged()); - this.TimeSlider.connect('scroll-event', () => - this._onDelayTimeChanged() - ); - - this.imSliderDelay.actor.add_child(this.TimeSlider); - - return [this.DelayTimeTitle, this.imSliderDelay]; - } - - /** - * @private - */ - _enable() { - // enable key binding - this._enableKeybindings(); - // immediately activate/deactive shortcut on settings change - this._settings._settings.connect( - `changed::${Settings.ACTIVE_SHORTCUT_SETTING_KEY}`, - () => { - if (this._settings.getOption('b', Settings.ACTIVE_SHORTCUT_SETTING_KEY)) { - Lib.TalkativeLog('-^-shortcut changed - enabling'); - this._enableKeybindings(); - } else { - Lib.TalkativeLog('-^-shortcut changed - disabling'); - this._removeKeybindings(); - } - } - ); - - // start monitoring inputvideo - if (this.CtrlWebcam !== null) - this.CtrlWebcam.startMonitor(); - - // add indicator - this.add_child(this.indicatorBox); - } - - /** - * @private - */ - _disable() { - // remove key binding - this._removeKeybindings(); - // stop monitoring inputvideo - if (this.CtrlWebcam !== null) - this.CtrlWebcam.stopMonitor(); - // unregister mixer control - this.CtrlAudio.destroy(); - - // remove indicator - this.remove_child(this.indicatorBox); - } - - /** - * @private - */ - _doDelayAction() { - if (this.isDelayActive) { - Lib.TalkativeLog(`-*-delay recording called | delay= ${this.TimeSlider.value}`); - timerD = new Time.TimerDelay( - Math.floor(this.TimeSlider.value * 100), - this._doPreCommand, - this - ); - timerD.begin(); - } else { - Lib.TalkativeLog('-*-instant recording called'); - // start recording - this._doPreCommand(); - } - } - - /** - * @private - */ - _doPreCommand() { - if (this._settings.getOption('b', Settings.ACTIVE_PRE_CMD_SETTING_KEY)) { - Lib.TalkativeLog('-*-execute pre command'); - - const PreCmd = this._settings.getOption('s', Settings.PRE_CMD_SETTING_KEY); - - this.CtrlExe.Execute( - PreCmd, - false, - res => { - Lib.TalkativeLog(`-*-pre command final: ${res}`); - if (res === true) { - Lib.TalkativeLog('-*-pre command OK'); - this.recorder.start(); - } else { - Lib.TalkativeLog('-*-pre command ERROR'); - this.CtrlNotify.createNotify( - _('ERROR PRE COMMAND - See logs for more info'), - this._icons.off - ); - } - }, - line => { - Lib.TalkativeLog(`-*-pre command output: ${line}`); - } - ); - } else { - this.recorder.start(); - } - } - - /** - * @private - */ - _doRecording() { - // start/stop record screen - if (isActive === false) { - Lib.TalkativeLog('-*-start recording'); - - pathFile = ''; - - // get selected area - const optArea = this._settings.getOption('i', Settings.AREA_SCREEN_SETTING_KEY); - if (optArea > 0) { - Lib.TalkativeLog(`-*-type of selection of the area to record: ${optArea}`); - switch (optArea) { - case 3: - new Selection.SelectionArea(); - break; - case 2: - new Selection.SelectionWindow(); - break; - case 1: - new Selection.SelectionDesktop(); - break; - } - } else { - Lib.TalkativeLog('-*-recording full area'); - this._doDelayAction(); - } - } else { - Lib.TalkativeLog('-*-stop recording'); - isActive = false; - - this.recorder.stop(); - - if (timerC !== null) { - // stop counting rec - timerC.halt(); - timerC = null; - } - - // execute post-command - this._doPostCommand(); - } - - this.refreshIndicator(false); - } - - /** - * @private - */ - _doPostCommand() { - if (this._settings.getOption('b', Settings.ACTIVE_POST_CMD_SETTING_KEY)) { - Lib.TalkativeLog('-*-execute post command'); - - // launch cmd after registration - const tmpCmd = `/usr/bin/sh -c "${this._settings.getOption('s', Settings.POST_CMD_SETTING_KEY)}"`; - - const mapObj = { - _fpath: pathFile, - _dirpath: pathFile.substr(0, pathFile.lastIndexOf('/')), - _fname: pathFile.substr( - pathFile.lastIndexOf('/') + 1, - pathFile.length - ), - }; - - const Cmd = tmpCmd.replace(/_fpath|_dirpath|_fname/gi, match => { - return mapObj[match]; - }); - - Lib.TalkativeLog(`-*-post command:${Cmd}`); - - // execute post command - this.CtrlExe.Spawn(Cmd); - } - } - - /** - * @param {boolean} result whether the recording was successful - * @param {string} file file path of the recorded file - */ - doRecResult(result, file) { - if (result) { - isActive = true; - - Lib.TalkativeLog('-*-record OK'); - // update indicator - const indicators = this._settings.getOption('i', Settings.STATUS_INDICATORS_SETTING_KEY); - this._replaceStdIndicator(indicators === 1 || indicators === 3); - - if (this.isShowNotify) { - Lib.TalkativeLog('-*-show notify'); - // create counting notify - this.notifyCounting = this.CtrlNotify.createNotify( - _('Start Recording'), - this._icons.on - ); - this.notifyCounting.connect('destroy', () => { - Lib.TalkativeLog('-*-notification destroyed'); - this.notifyCounting = null; - }); - - // start counting rec - timerC = new Time.TimerCounting((secpassed, alertEnd) => { - this._refreshNotify(secpassed, alertEnd); - }, this); - timerC.begin(); - } - - // update path file video - pathFile = file; - Lib.TalkativeLog(`-*-update abs file path -> ${pathFile}`); - } else { - Lib.TalkativeLog('-*-record ERROR'); - - pathFile = ''; - - if (this.isShowNotify) { - Lib.TalkativeLog('-*-show error notify'); - this.CtrlNotify.createNotify( - _('ERROR RECORDER - See logs for more info'), - this._icons.off - ); - } - } - this.refreshIndicator(false); - } - - /** - * @param {number} sec the seconds passed - * @param {boolean} alertEnd whether the timer is ending - */ - _refreshNotify(sec, alertEnd) { - if (this.notifyCounting !== null && this.notifyCounting !== undefined && this.isShowNotify) { - if (alertEnd) { - this.CtrlNotify.updateNotify( - this.notifyCounting, - _(`Finish Recording / Seconds : ${sec}`), - this._icons.off, - true - ); - } else { - this.CtrlNotify.updateNotify( - this.notifyCounting, - _('Recording ... / Seconds passed : ') + sec, - this._icons.on, - false - ); - } - } - } - - /** - * @private - */ - _openExtensionPreferences() { - try { - this._extension.openPreferences(); - } catch (e) { - Lib.TalkativeLog(`Failed to open preferences: ${e}`); - } - } - - /** - * @private - */ - _onDelayTimeChanged() { - const secDelay = Math.floor(this.TimeSlider.value * 100); - this._settings.setOption(Settings.TIME_DELAY_SETTING_KEY, secDelay); - if (secDelay > 0) - this.smDelayRec.label.text = secDelay + _(' sec. delay before recording'); - else - this.smDelayRec.label.text = _('Start recording immediately'); - } - - /** - * @param {boolean} focus selects the correct icon depending on the focus state - */ - refreshIndicator(focus) { - Lib.TalkativeLog(`-*-refresh indicator -A ${isActive} -F ${focus}`); - - const indicators = this._settings.getOption('i', Settings.STATUS_INDICATORS_SETTING_KEY); - - if (isActive === true) { - if (indicators === 0 || indicators === 1) { - if (focus === true) - this.indicatorIcon.set_gicon(this._icons.onSel); - else - this.indicatorIcon.set_gicon(this._icons.on); - } else if (this._settings.getOption('b', Settings.ACTIVE_SHORTCUT_SETTING_KEY)) { - this.indicatorIcon.set_gicon(null); - } else if (focus === true) { - this.indicatorIcon.set_gicon(this._icons.onSel); - } else { - this.indicatorIcon.set_gicon(this._icons.on); - } - - this.RecordingLabel.set_text(_('Stop recording')); - } else { - if (focus === true) - this.indicatorIcon.set_gicon(this._icons.offSel); - else - this.indicatorIcon.set_gicon(this._icons.off); - - this.RecordingLabel.set_text(_('Start recording')); - } - } - - /** - * @param {boolean} OPTtemp whether to replace the standard indicator or use it - * @private - */ - _replaceStdIndicator(OPTtemp) { - if (Main.panel.statusArea === undefined) { - Lib.TalkativeLog('-*-no Main.panel.statusArea found'); - return; - } - - var stdMenu = Main.panel.statusArea.quickSettings; - if (stdMenu === undefined) { - Lib.TalkativeLog('-*-no quickSettings or aggregateMenu in Main.panel.statusArea'); - return; - } - if (stdMenu._remoteAccess === undefined) { - Lib.TalkativeLog('-*-no _remoteAccess indicator applet found'); - return; - } - var indicator = stdMenu._remoteAccess._indicator; - if (indicator === undefined) { - Lib.TalkativeLog('-*-no _indicator or _recordingIndicator found'); - return; - } - - if (OPTtemp) { - Lib.TalkativeLog('-*-replace STD indicator'); - indicator.visible = false; - } else { - Lib.TalkativeLog('-*-use STD indicator'); - indicator.visible = isActive; - } - } - - /** - * @private - */ - _enableKeybindings() { - if (this._settings.getOption('b', Settings.ACTIVE_SHORTCUT_SETTING_KEY)) { - Lib.TalkativeLog('-*-enable keybinding'); - - Main.wm.addKeybinding( - Settings.SHORTCUT_KEY_SETTING_KEY, - this._settings._settings, - Meta.KeyBindingFlags.NONE, - // available modes: https://gitlab.gnome.org/GNOME/gnome-shell/-/blob/main/src/shell-action-modes.h - Shell.ActionMode.NORMAL | - Shell.ActionMode.OVERVIEW | - Shell.ActionMode.POPUP | - Shell.ActionMode.SYSTEM_MODAL, - () => { - Lib.TalkativeLog('-*-intercept key combination'); - this._doRecording(); - } - ); - keybindingConfigured = true; - } - } - - /** - * @private - */ - _removeKeybindings() { - if (keybindingConfigured) { - Lib.TalkativeLog('-*-remove keybinding'); - Main.wm.removeKeybinding(Settings.SHORTCUT_KEY_SETTING_KEY); - keybindingConfigured = false; - } - } - - getSelectedRect() { - var recX = this._settings.getOption('i', Settings.X_POS_SETTING_KEY); - var recY = this._settings.getOption('i', Settings.Y_POS_SETTING_KEY); - var recW = this._settings.getOption('i', Settings.WIDTH_SETTING_KEY); - var recH = this._settings.getOption('i', Settings.HEIGHT_SETTING_KEY); - return [recX, recY, recW, recH]; - } - - saveSelectedRect(x, y, h, w) { - this._settings.setOption(Settings.X_POS_SETTING_KEY, x); - this._settings.setOption(Settings.Y_POS_SETTING_KEY, y); - this._settings.setOption(Settings.HEIGHT_SETTING_KEY, h); - this._settings.setOption(Settings.WIDTH_SETTING_KEY, w); - } - - getSettings() { - return this._settings; - } - - getAudioSource() { - return this.CtrlAudio.getAudioSource(); - } - - /** - * Destroy indicator - */ - destroy() { - Lib.TalkativeLog('-*-destroy indicator called'); - - if (isActive) - isActive = false; - - if (this._settings) { - this._settings.destroy(); - this._settings = null; - } - - super.destroy(); - } -}); - -export default class EasyScreenCast extends Extension { - /** - * - */ - enable() { - Lib.TalkativeLog('-*-enableExtension called'); - Lib.TalkativeLog(`-*-version: ${this.metadata.version}`); - Lib.TalkativeLog(`-*-install path: ${this.path}`); - Lib.TalkativeLog(`-*-version (package.json): ${Lib.getFullVersion()}`); - - if (Indicator === null || Indicator === undefined) { - Lib.TalkativeLog('-*-create indicator'); - - Indicator = new EasyScreenCastIndicator(this); - Main.panel.addToStatusArea('EasyScreenCast-indicator', Indicator); - } - - Indicator._enable(); - } - - /** - * - */ - disable() { - Lib.TalkativeLog('-*-disableExtension called'); - - if (timerD !== null) { - Lib.TalkativeLog('-*-timerD stopped'); - timerD.stop(); - timerD = null; - } - - // this might happen, if the extension is disabled during recording - if (timerC !== null) { - // stop counting rec - timerC.halt(); - timerC = null; - } - - - if (Indicator !== null) { - Lib.TalkativeLog('-*-indicator call destroy'); - - Indicator._disable(); - Indicator.destroy(); - Indicator = null; - } - } -} - -export {Indicator}; diff --git a/gnome/.local/share/gnome-shell/extensions/EasyScreenCast@iacopodeenosee.gmail.com/images/Icon_Info.png b/gnome/.local/share/gnome-shell/extensions/EasyScreenCast@iacopodeenosee.gmail.com/images/Icon_Info.png deleted file mode 100644 index 7f15ae8..0000000 Binary files a/gnome/.local/share/gnome-shell/extensions/EasyScreenCast@iacopodeenosee.gmail.com/images/Icon_Info.png and /dev/null differ diff --git a/gnome/.local/share/gnome-shell/extensions/EasyScreenCast@iacopodeenosee.gmail.com/images/Icon_Performance.svg b/gnome/.local/share/gnome-shell/extensions/EasyScreenCast@iacopodeenosee.gmail.com/images/Icon_Performance.svg deleted file mode 100644 index f23e320..0000000 --- a/gnome/.local/share/gnome-shell/extensions/EasyScreenCast@iacopodeenosee.gmail.com/images/Icon_Performance.svg +++ /dev/null @@ -1,45 +0,0 @@ - -image/svg+xml diff --git a/gnome/.local/share/gnome-shell/extensions/EasyScreenCast@iacopodeenosee.gmail.com/images/Icon_Quality.svg b/gnome/.local/share/gnome-shell/extensions/EasyScreenCast@iacopodeenosee.gmail.com/images/Icon_Quality.svg deleted file mode 100644 index b7e8d3d..0000000 --- a/gnome/.local/share/gnome-shell/extensions/EasyScreenCast@iacopodeenosee.gmail.com/images/Icon_Quality.svg +++ /dev/null @@ -1,45 +0,0 @@ - -image/svg+xml diff --git a/gnome/.local/share/gnome-shell/extensions/EasyScreenCast@iacopodeenosee.gmail.com/images/icon_default.svg b/gnome/.local/share/gnome-shell/extensions/EasyScreenCast@iacopodeenosee.gmail.com/images/icon_default.svg deleted file mode 100644 index ff59a8c..0000000 --- a/gnome/.local/share/gnome-shell/extensions/EasyScreenCast@iacopodeenosee.gmail.com/images/icon_default.svg +++ /dev/null @@ -1,99 +0,0 @@ - - - - - - - - - - image/svg+xml - - - - - - - - - - - - - - diff --git a/gnome/.local/share/gnome-shell/extensions/EasyScreenCast@iacopodeenosee.gmail.com/images/icon_defaultSel.svg b/gnome/.local/share/gnome-shell/extensions/EasyScreenCast@iacopodeenosee.gmail.com/images/icon_defaultSel.svg deleted file mode 100644 index 7a57f9a..0000000 --- a/gnome/.local/share/gnome-shell/extensions/EasyScreenCast@iacopodeenosee.gmail.com/images/icon_defaultSel.svg +++ /dev/null @@ -1,99 +0,0 @@ - - - - - - - - - - image/svg+xml - - - - - - - - - - - - - - diff --git a/gnome/.local/share/gnome-shell/extensions/EasyScreenCast@iacopodeenosee.gmail.com/images/icon_recording.svg b/gnome/.local/share/gnome-shell/extensions/EasyScreenCast@iacopodeenosee.gmail.com/images/icon_recording.svg deleted file mode 100644 index 0608982..0000000 --- a/gnome/.local/share/gnome-shell/extensions/EasyScreenCast@iacopodeenosee.gmail.com/images/icon_recording.svg +++ /dev/null @@ -1,99 +0,0 @@ - - - - - - - - - - image/svg+xml - - - - - - - - - - - - - - diff --git a/gnome/.local/share/gnome-shell/extensions/EasyScreenCast@iacopodeenosee.gmail.com/images/icon_recordingSel.svg b/gnome/.local/share/gnome-shell/extensions/EasyScreenCast@iacopodeenosee.gmail.com/images/icon_recordingSel.svg deleted file mode 100644 index 453444c..0000000 --- a/gnome/.local/share/gnome-shell/extensions/EasyScreenCast@iacopodeenosee.gmail.com/images/icon_recordingSel.svg +++ /dev/null @@ -1,99 +0,0 @@ - - - - - - - - - - image/svg+xml - - - - - - - - - - - - - - diff --git a/gnome/.local/share/gnome-shell/extensions/EasyScreenCast@iacopodeenosee.gmail.com/locale/ca/LC_MESSAGES/EasyScreenCast@iacopodeenosee.gmail.com.mo b/gnome/.local/share/gnome-shell/extensions/EasyScreenCast@iacopodeenosee.gmail.com/locale/ca/LC_MESSAGES/EasyScreenCast@iacopodeenosee.gmail.com.mo deleted file mode 100644 index 1e565d3..0000000 Binary files a/gnome/.local/share/gnome-shell/extensions/EasyScreenCast@iacopodeenosee.gmail.com/locale/ca/LC_MESSAGES/EasyScreenCast@iacopodeenosee.gmail.com.mo and /dev/null differ diff --git a/gnome/.local/share/gnome-shell/extensions/EasyScreenCast@iacopodeenosee.gmail.com/locale/cs/LC_MESSAGES/EasyScreenCast@iacopodeenosee.gmail.com.mo b/gnome/.local/share/gnome-shell/extensions/EasyScreenCast@iacopodeenosee.gmail.com/locale/cs/LC_MESSAGES/EasyScreenCast@iacopodeenosee.gmail.com.mo deleted file mode 100644 index ef74169..0000000 Binary files a/gnome/.local/share/gnome-shell/extensions/EasyScreenCast@iacopodeenosee.gmail.com/locale/cs/LC_MESSAGES/EasyScreenCast@iacopodeenosee.gmail.com.mo and /dev/null differ diff --git a/gnome/.local/share/gnome-shell/extensions/EasyScreenCast@iacopodeenosee.gmail.com/locale/de/LC_MESSAGES/EasyScreenCast@iacopodeenosee.gmail.com.mo b/gnome/.local/share/gnome-shell/extensions/EasyScreenCast@iacopodeenosee.gmail.com/locale/de/LC_MESSAGES/EasyScreenCast@iacopodeenosee.gmail.com.mo deleted file mode 100644 index 9f6db59..0000000 Binary files a/gnome/.local/share/gnome-shell/extensions/EasyScreenCast@iacopodeenosee.gmail.com/locale/de/LC_MESSAGES/EasyScreenCast@iacopodeenosee.gmail.com.mo and /dev/null differ diff --git a/gnome/.local/share/gnome-shell/extensions/EasyScreenCast@iacopodeenosee.gmail.com/locale/es/LC_MESSAGES/EasyScreenCast@iacopodeenosee.gmail.com.mo b/gnome/.local/share/gnome-shell/extensions/EasyScreenCast@iacopodeenosee.gmail.com/locale/es/LC_MESSAGES/EasyScreenCast@iacopodeenosee.gmail.com.mo deleted file mode 100644 index d40762a..0000000 Binary files a/gnome/.local/share/gnome-shell/extensions/EasyScreenCast@iacopodeenosee.gmail.com/locale/es/LC_MESSAGES/EasyScreenCast@iacopodeenosee.gmail.com.mo and /dev/null differ diff --git a/gnome/.local/share/gnome-shell/extensions/EasyScreenCast@iacopodeenosee.gmail.com/locale/fr/LC_MESSAGES/EasyScreenCast@iacopodeenosee.gmail.com.mo b/gnome/.local/share/gnome-shell/extensions/EasyScreenCast@iacopodeenosee.gmail.com/locale/fr/LC_MESSAGES/EasyScreenCast@iacopodeenosee.gmail.com.mo deleted file mode 100644 index 546ca3c..0000000 Binary files a/gnome/.local/share/gnome-shell/extensions/EasyScreenCast@iacopodeenosee.gmail.com/locale/fr/LC_MESSAGES/EasyScreenCast@iacopodeenosee.gmail.com.mo and /dev/null differ diff --git a/gnome/.local/share/gnome-shell/extensions/EasyScreenCast@iacopodeenosee.gmail.com/locale/it/LC_MESSAGES/EasyScreenCast@iacopodeenosee.gmail.com.mo b/gnome/.local/share/gnome-shell/extensions/EasyScreenCast@iacopodeenosee.gmail.com/locale/it/LC_MESSAGES/EasyScreenCast@iacopodeenosee.gmail.com.mo deleted file mode 100644 index 35411ef..0000000 Binary files a/gnome/.local/share/gnome-shell/extensions/EasyScreenCast@iacopodeenosee.gmail.com/locale/it/LC_MESSAGES/EasyScreenCast@iacopodeenosee.gmail.com.mo and /dev/null differ diff --git a/gnome/.local/share/gnome-shell/extensions/EasyScreenCast@iacopodeenosee.gmail.com/locale/ja/LC_MESSAGES/EasyScreenCast@iacopodeenosee.gmail.com.mo b/gnome/.local/share/gnome-shell/extensions/EasyScreenCast@iacopodeenosee.gmail.com/locale/ja/LC_MESSAGES/EasyScreenCast@iacopodeenosee.gmail.com.mo deleted file mode 100644 index 7256b66..0000000 Binary files a/gnome/.local/share/gnome-shell/extensions/EasyScreenCast@iacopodeenosee.gmail.com/locale/ja/LC_MESSAGES/EasyScreenCast@iacopodeenosee.gmail.com.mo and /dev/null differ diff --git a/gnome/.local/share/gnome-shell/extensions/EasyScreenCast@iacopodeenosee.gmail.com/locale/pt_BR/LC_MESSAGES/EasyScreenCast@iacopodeenosee.gmail.com.mo b/gnome/.local/share/gnome-shell/extensions/EasyScreenCast@iacopodeenosee.gmail.com/locale/pt_BR/LC_MESSAGES/EasyScreenCast@iacopodeenosee.gmail.com.mo deleted file mode 100644 index c88a3bc..0000000 Binary files a/gnome/.local/share/gnome-shell/extensions/EasyScreenCast@iacopodeenosee.gmail.com/locale/pt_BR/LC_MESSAGES/EasyScreenCast@iacopodeenosee.gmail.com.mo and /dev/null differ diff --git a/gnome/.local/share/gnome-shell/extensions/EasyScreenCast@iacopodeenosee.gmail.com/locale/ru/LC_MESSAGES/EasyScreenCast@iacopodeenosee.gmail.com.mo b/gnome/.local/share/gnome-shell/extensions/EasyScreenCast@iacopodeenosee.gmail.com/locale/ru/LC_MESSAGES/EasyScreenCast@iacopodeenosee.gmail.com.mo deleted file mode 100644 index 2392f4c..0000000 Binary files a/gnome/.local/share/gnome-shell/extensions/EasyScreenCast@iacopodeenosee.gmail.com/locale/ru/LC_MESSAGES/EasyScreenCast@iacopodeenosee.gmail.com.mo and /dev/null differ diff --git a/gnome/.local/share/gnome-shell/extensions/EasyScreenCast@iacopodeenosee.gmail.com/locale/uk/LC_MESSAGES/EasyScreenCast@iacopodeenosee.gmail.com.mo b/gnome/.local/share/gnome-shell/extensions/EasyScreenCast@iacopodeenosee.gmail.com/locale/uk/LC_MESSAGES/EasyScreenCast@iacopodeenosee.gmail.com.mo deleted file mode 100644 index 21ae02f..0000000 Binary files a/gnome/.local/share/gnome-shell/extensions/EasyScreenCast@iacopodeenosee.gmail.com/locale/uk/LC_MESSAGES/EasyScreenCast@iacopodeenosee.gmail.com.mo and /dev/null differ diff --git a/gnome/.local/share/gnome-shell/extensions/EasyScreenCast@iacopodeenosee.gmail.com/locale/vi/LC_MESSAGES/EasyScreenCast@iacopodeenosee.gmail.com.mo b/gnome/.local/share/gnome-shell/extensions/EasyScreenCast@iacopodeenosee.gmail.com/locale/vi/LC_MESSAGES/EasyScreenCast@iacopodeenosee.gmail.com.mo deleted file mode 100644 index 7526ab9..0000000 Binary files a/gnome/.local/share/gnome-shell/extensions/EasyScreenCast@iacopodeenosee.gmail.com/locale/vi/LC_MESSAGES/EasyScreenCast@iacopodeenosee.gmail.com.mo and /dev/null differ diff --git a/gnome/.local/share/gnome-shell/extensions/EasyScreenCast@iacopodeenosee.gmail.com/locale/zh/LC_MESSAGES/EasyScreenCast@iacopodeenosee.gmail.com.mo b/gnome/.local/share/gnome-shell/extensions/EasyScreenCast@iacopodeenosee.gmail.com/locale/zh/LC_MESSAGES/EasyScreenCast@iacopodeenosee.gmail.com.mo deleted file mode 100644 index 03ee607..0000000 Binary files a/gnome/.local/share/gnome-shell/extensions/EasyScreenCast@iacopodeenosee.gmail.com/locale/zh/LC_MESSAGES/EasyScreenCast@iacopodeenosee.gmail.com.mo and /dev/null differ diff --git a/gnome/.local/share/gnome-shell/extensions/EasyScreenCast@iacopodeenosee.gmail.com/metadata.json b/gnome/.local/share/gnome-shell/extensions/EasyScreenCast@iacopodeenosee.gmail.com/metadata.json deleted file mode 100644 index c40875d..0000000 --- a/gnome/.local/share/gnome-shell/extensions/EasyScreenCast@iacopodeenosee.gmail.com/metadata.json +++ /dev/null @@ -1,15 +0,0 @@ -{ - "_generated": "Generated by SweetTooth, do not edit", - "description": "This extension simplifies the use of the video recording function integrated in gnome shell, allows quickly to change the various settings of the desktop recording.\n\nSOURCE CODE -> https://github.com/EasyScreenCast/EasyScreenCast\n\nVIDEO -> https://youtu.be/81E9AruraKU\n\n**NOTICE**\nif an error occurs during the update is recommended to reload GNOME Shell (Alt + F2, 'r') and reload the extension's installation page.", - "gettext-domain": "EasyScreenCast@iacopodeenosee.gmail.com", - "name": "EasyScreenCast", - "settings-schema": "org.gnome.shell.extensions.EasyScreenCast", - "shell-version": [ - "46", - "47", - "48" - ], - "url": "https://github.com/EasyScreenCast/EasyScreenCast", - "uuid": "EasyScreenCast@iacopodeenosee.gmail.com", - "version": 53 -} \ No newline at end of file diff --git a/gnome/.local/share/gnome-shell/extensions/EasyScreenCast@iacopodeenosee.gmail.com/prefs.css b/gnome/.local/share/gnome-shell/extensions/EasyScreenCast@iacopodeenosee.gmail.com/prefs.css deleted file mode 100644 index 4dc0f17..0000000 --- a/gnome/.local/share/gnome-shell/extensions/EasyScreenCast@iacopodeenosee.gmail.com/prefs.css +++ /dev/null @@ -1,7 +0,0 @@ -.options-grid { - margin: 18px; -} - -.borderless { - border: none; -} diff --git a/gnome/.local/share/gnome-shell/extensions/EasyScreenCast@iacopodeenosee.gmail.com/prefs.js b/gnome/.local/share/gnome-shell/extensions/EasyScreenCast@iacopodeenosee.gmail.com/prefs.js deleted file mode 100644 index e0dd1a2..0000000 --- a/gnome/.local/share/gnome-shell/extensions/EasyScreenCast@iacopodeenosee.gmail.com/prefs.js +++ /dev/null @@ -1,1184 +0,0 @@ -/* - Copyright (C) 2013 Borsato Ivano - - The JavaScript code in this page is free software: you can - redistribute it and/or modify it under the terms of the GNU - General Public License (GNU GPL) as published by the Free Software - Foundation, either version 3 of the License, or (at your option) - any later version. The code is distributed WITHOUT ANY WARRANTY; - without even the implied warranty of MERCHANTABILITY or FITNESS - FOR A PARTICULAR PURPOSE. See the GNU GPL for more details. -*/ - -'use strict'; - -import GIRepository from 'gi://GIRepository'; -GIRepository.Repository.prepend_search_path('/usr/lib64/gnome-shell'); -GIRepository.Repository.prepend_library_path('/usr/lib64/gnome-shell'); - -import Adw from 'gi://Adw'; -import GObject from 'gi://GObject'; -import Gio from 'gi://Gio'; -import Gtk from 'gi://Gtk'; -import Gdk from 'gi://Gdk'; -import Pango from 'gi://Pango'; - -import {ExtensionPreferences, gettext as _} from 'resource:///org/gnome/Shell/Extensions/js/extensions/prefs.js'; - -import * as Lib from './convenience.js'; -import * as UtilWebcam from './utilwebcam.js'; -import * as UtilGSP from './utilgsp.js'; -import * as Settings from './settings.js'; -import * as UtilExeCmd from './utilexecmd.js'; - -const EasyScreenCastSettingsWidget = GObject.registerClass({ - GTypeName: 'EasyScreenCast_SettingsWidget', -}, class EasyScreenCastSettingsWidget extends Gtk.Box { - /** - * @param {ExtensionPreferences} prefs the prefs instance - */ - constructor(prefs) { - super(); - - this._prefs = prefs; - this._settings = new Settings.Settings(this._prefs.getSettings()); - Lib.setDebugEnabled(this._settings.getOption('b', Settings.VERBOSE_DEBUG_SETTING_KEY)); - this.CtrlExe = new UtilExeCmd.ExecuteStuff(this); - this.CtrlWebcam = new UtilWebcam.HelperWebcam(_('Unspecified webcam')); - - let cssProvider = new Gtk.CssProvider(); - cssProvider.load_from_path(`${prefs.path}/prefs.css`); - Gtk.StyleContext.add_provider_for_display( - Gdk.Display.get_default(), - cssProvider, - Gtk.STYLE_PROVIDER_PRIORITY_APPLICATION); - - // creates the ui builder and add the main resource file - let uiFilePath = `${this._prefs.path}/Options_UI.glade`; - let builder = new Gtk.Builder(); - builder.set_translation_domain(this._prefs.metadata['gettext-domain']); - - if (builder.add_from_file(uiFilePath) === 0) { - Lib.TalkativeLog(`-^-could not load the ui file: ${uiFilePath}`); - let label = new Gtk.Label({ - label: _('Could not load the preferences UI file'), - vexpand: true, - }); - - this.append(label); - } else { - Lib.TalkativeLog(`-^-UI file receive and load: ${uiFilePath}`); - - // gets the interesting builder objects - let refBoxMainContainer = builder.get_object('Main_Container'); - this.append(refBoxMainContainer); - - // setup tab options - this._initTabOptions(this, builder, this._settings._settings); - - // setup tab quality - this._initTabQuality(this, builder, this._settings._settings); - - // setup tab webcam - this._initTabWebcam(this, builder, this._settings._settings); - - // setup tab file - this._initTabFile(this, builder, this._settings._settings); - - // setup tab support - this._initTabSupport(this, builder, this._settings._settings); - - // setup tab info - this._initTabInfo(this, builder); - - // @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ - - // update GSP area - this._setStateGSP( - !this._settings.getOption('b', Settings.ACTIVE_CUSTOM_GSP_SETTING_KEY) - ); - - // update list view - this._updateRowShortcut( - this._settings.getOption('as', Settings.SHORTCUT_KEY_SETTING_KEY)[0] - ); - - // update webcam widget state - this._updateStateWebcamOptions(); - - // connect keywebcam signal - this._settings._settings.connect( - `changed::${Settings.DEVICE_INDEX_WEBCAM_SETTING_KEY}`, - () => { - Lib.TalkativeLog('-^-webcam device changed'); - - this._updateStateWebcamOptions(); - } - ); - } - } - - /** - * @param {EasyScreenCastSettingsWidget} ctx the prefs/settings widget - * @param {Gtk.Builder} gtkDB the builder that loaded the UI glade file - * @param {Gio.Settings} tmpS the current settings - * @private - */ - _initTabOptions(ctx, gtkDB, tmpS) { - // implements show timer option - let refSwitchShowNotifyAlert = gtkDB.get_object('swt_ShowNotifyAlert'); - tmpS.bind( - Settings.SHOW_NOTIFY_ALERT_SETTING_KEY, - refSwitchShowNotifyAlert, - 'active', - Gio.SettingsBindFlags.DEFAULT - ); - - // implements show area option - let refSwitchShowAreaRec = gtkDB.get_object('swt_ShowAreaRec'); - tmpS.bind( - Settings.SHOW_AREA_REC_SETTING_KEY, - refSwitchShowAreaRec, - 'active', - Gio.SettingsBindFlags.DEFAULT - ); - - // implements show indicator option - let refComboboxIndicatorsRec = gtkDB.get_object('cbt_StatusIndicatorsRec'); - tmpS.bind( - Settings.STATUS_INDICATORS_SETTING_KEY, - refComboboxIndicatorsRec, - 'active', - Gio.SettingsBindFlags.DEFAULT - ); - - // implements draw cursor option - let refSwitchDrawCursorRec = gtkDB.get_object('swt_DrawCursorRec'); - tmpS.bind( - Settings.DRAW_CURSOR_SETTING_KEY, - refSwitchDrawCursorRec, - 'active', - Gio.SettingsBindFlags.DEFAULT - ); - - // implements enable keybinding option - let refSwitchEnableShortcut = gtkDB.get_object('swt_KeyShortcut'); - tmpS.bind( - Settings.ACTIVE_SHORTCUT_SETTING_KEY, - refSwitchEnableShortcut, - 'active', - Gio.SettingsBindFlags.DEFAULT - ); - - // implements selecting alternative key combo - let refTreeviewShortcut = gtkDB.get_object('treeview_KeyShortcut'); - refTreeviewShortcut.set_sensitive(true); - ctx.Ref_liststore_Shortcut = gtkDB.get_object('liststore_KeyShortcut'); - ctx.Iter_ShortcutRow = ctx.Ref_liststore_Shortcut.append(); - - let renderer = new Gtk.CellRendererAccel({ - editable: true, - }); - renderer.connect( - 'accel-edited', - (_0, _1, key, mods, _2) => { - Lib.TalkativeLog(`-^-edited key accel: key=${key} mods=${mods}`); - - let accel = Gtk.accelerator_name(key, mods); - - ctx._updateRowShortcut(accel); - this._settings.setOption(Settings.SHORTCUT_KEY_SETTING_KEY, [accel]); - } - ); - - renderer.connect('accel-cleared', () => { - Lib.TalkativeLog('-^-cleared key accel'); - - ctx._updateRowShortcut(null); - this._settings.setOption(Settings.SHORTCUT_KEY_SETTING_KEY, []); - }); - - let column = new Gtk.TreeViewColumn(); - column.pack_start(renderer, true); - column.add_attribute( - renderer, - 'accel-key', - Settings.SHORTCUT_COLUMN_KEY - ); - column.add_attribute( - renderer, - 'accel-mods', - Settings.SHORTCUT_COLUMN_MODS - ); - - refTreeviewShortcut.append_column(column); - - // implements post execute command - let refSwitchExecutePostCmd = gtkDB.get_object('swt_executepostcmd'); - tmpS.bind( - Settings.ACTIVE_POST_CMD_SETTING_KEY, - refSwitchExecutePostCmd, - 'active', - Gio.SettingsBindFlags.DEFAULT - ); - - let refTexteditPostCmd = gtkDB.get_object('txe_postcmd'); - tmpS.bind( - Settings.POST_CMD_SETTING_KEY, - refTexteditPostCmd, - 'text', - Gio.SettingsBindFlags.DEFAULT - ); - - // implements pre execute command - let refSwitchExecutePreCmd = gtkDB.get_object('swt_executeprecmd'); - tmpS.bind( - Settings.ACTIVE_PRE_CMD_SETTING_KEY, - refSwitchExecutePreCmd, - 'active', - Gio.SettingsBindFlags.DEFAULT - ); - - let refTexteditPreCmd = gtkDB.get_object('txe_precmd'); - tmpS.bind( - Settings.PRE_CMD_SETTING_KEY, - refTexteditPreCmd, - 'text', - Gio.SettingsBindFlags.DEFAULT - ); - } - - /** - * @param {EasyScreenCastSettingsWidget} ctx the prefs/settings widget - * @param {Gtk.Builder} gtkDB the builder that loaded the UI glade file - * @param {Gio.Settings} tmpS the current settings - * @private - */ - _initTabQuality(ctx, gtkDB, tmpS) { - // implements FPS option - let refSpinnerFrameRateRec = gtkDB.get_object('spb_FrameRateRec'); - // Create an adjustment to use for the second spinbutton - let adjustment1 = new Gtk.Adjustment({ - value: 30, - lower: 1, - upper: 666, - step_increment: 1, - page_increment: 10, - }); - refSpinnerFrameRateRec.configure(adjustment1, 10, 0); - tmpS.bind( - Settings.FPS_SETTING_KEY, - refSpinnerFrameRateRec, - 'value', - Gio.SettingsBindFlags.DEFAULT - ); - - // implements command string rec option - let refTexteditPipeline = gtkDB.get_object('txe_CommandStringRec'); - let refBufferPipeline = refTexteditPipeline.get_buffer(); - tmpS.bind( - Settings.PIPELINE_REC_SETTING_KEY, - refBufferPipeline, - 'text', - Gio.SettingsBindFlags.DEFAULT - ); - - // implements label description GSP - let refLabelDescGSP = gtkDB.get_object('lbl_GSP_Description'); - refLabelDescGSP.set_text( - UtilGSP.getDescr( - this._settings.getOption('i', Settings.QUALITY_SETTING_KEY), - this._settings.getOption('i', Settings.FILE_CONTAINER_SETTING_KEY) - ) - ); - // update label description when container selection changed - this._settings._settings.connect(`changed::${Settings.FILE_CONTAINER_SETTING_KEY}`, () => { - Lib.TalkativeLog('-^- new setting for file container, update gps description'); - refLabelDescGSP.set_text( - UtilGSP.getDescr( - this._settings.getOption('i', Settings.QUALITY_SETTING_KEY), - this._settings.getOption('i', Settings.FILE_CONTAINER_SETTING_KEY) - ) - ); - }); - - - // implements quality scale option - let refScaleQuality = gtkDB.get_object('scl_Quality'); - refScaleQuality.set_valign(Gtk.Align.START); - let adjustment2 = new Gtk.Adjustment({ - value: 1, - lower: 0, - upper: 3, - step_increment: 1, - page_increment: 1, - }); - refScaleQuality.set_adjustment(adjustment2); - refScaleQuality.set_digits(1); - let ind = 0; - for (; ind < 4; ind++) - refScaleQuality.add_mark(ind, Gtk.PositionType.BOTTOM, ''); - - - refScaleQuality.set_value( - this._settings.getOption('i', Settings.QUALITY_SETTING_KEY) - ); - - let oldQualityValue = refScaleQuality.get_value(); - refScaleQuality.connect('value-changed', self => { - // not logging by default - it's too much - // Lib.TalkativeLog(`-^-value quality changed : ${self.get_value()}`); - - // round the value - let roundTmp = parseInt(self.get_value().toFixed(0)); - // not logging by default - it's too much - // Lib.TalkativeLog(`-^-value quality fixed : ${roundTmp}`); - - self.set_value(roundTmp); - - // only update labels for real changes - if (oldQualityValue !== roundTmp) { - oldQualityValue = roundTmp; - this._settings.setOption(Settings.QUALITY_SETTING_KEY, roundTmp); - - // update label descr GSP - refLabelDescGSP.set_text( - UtilGSP.getDescr( - roundTmp, - this._settings.getOption('i', Settings.FILE_CONTAINER_SETTING_KEY) - ) - ); - - // update fps - this._settings.setOption( - Settings.FPS_SETTING_KEY, - UtilGSP.getFps( - roundTmp, - this._settings.getOption('i', Settings.FILE_CONTAINER_SETTING_KEY) - ) - ); - } - }); - - // implements image for scale widget - let refImagePerformance = gtkDB.get_object('img_Performance'); - refImagePerformance.set_from_file(Lib.getImagePath(this._prefs.dir, 'Icon_Performance.svg')); - - let refImageQuality = gtkDB.get_object('img_Quality'); - refImageQuality.set_from_file(Lib.getImagePath(this._prefs.dir, 'Icon_Quality.svg')); - - // implements custom GSPipeline option - let refSwitchCustomGSP = gtkDB.get_object('swt_EnableCustomGSP'); - tmpS.bind( - Settings.ACTIVE_CUSTOM_GSP_SETTING_KEY, - refSwitchCustomGSP, - 'active', - Gio.SettingsBindFlags.DEFAULT - ); - refSwitchCustomGSP.connect('state-set', () => { - // update GSP text area - ctx._setStateGSP(this._settings.getOption('b', Settings.ACTIVE_CUSTOM_GSP_SETTING_KEY)); - }); - - ctx.Ref_stack_Quality = gtkDB.get_object('stk_Quality'); - } - - /** - * @param {EasyScreenCastSettingsWidget} ctx the prefs/settings widget - * @param {Gtk.Builder} gtkDB the builder that loaded the UI glade file - * @param {Gio.Settings} tmpS the current settings - * @private - */ - _initTabWebcam(ctx, gtkDB, tmpS) { - // implements webcam quality option: Type: GtkListStore - ctx.Ref_ListStore_QualityWebCam = gtkDB.get_object( - 'liststore_QualityWebCam' - ); - let refTreeViewQualityWebCam = gtkDB.get_object( - 'treeview_QualityWebam' - ); - // create column data - let capsColumn = new Gtk.TreeViewColumn({ - title: _('WebCam Caps'), - }); - let normalColumn = new Gtk.CellRendererText(); - capsColumn.pack_start(normalColumn, true); - capsColumn.add_attribute(normalColumn, 'text', 0); - - // insert caps column into treeview - refTreeViewQualityWebCam.insert_column(capsColumn, 0); - - // setup selection liststore - let capsSelection = refTreeViewQualityWebCam.get_selection(); - - // connect selection signal - capsSelection.connect('changed', self => { - let [isSelected,, iter] = self.get_selected(); - if (isSelected) { - let Caps = ctx.Ref_ListStore_QualityWebCam.get_value(iter, 0); - Lib.TalkativeLog(`-^-treeview row selected : ${Caps}`); - - this._settings.setOption(Settings.QUALITY_WEBCAM_SETTING_KEY, Caps); - - // update label webcam caps - ctx.Ref_Label_WebCamCaps.set_ellipsize(Pango.EllipsizeMode.END); - ctx.Ref_Label_WebCamCaps.set_text(Caps); - } - }); - - // fill combobox with quality option webcam - ctx._updateWebCamCaps(this._settings.getOption('i', Settings.DEVICE_INDEX_WEBCAM_SETTING_KEY)); - - // implements webcam corner position option - let refComboboxCornerWebCam = gtkDB.get_object('cbt_WebCamCorner'); - tmpS.bind( - Settings.CORNER_POSITION_WEBCAM_SETTING_KEY, - refComboboxCornerWebCam, - 'active', - Gio.SettingsBindFlags.DEFAULT - ); - - // implements webcam margin x position option - let refSpinnerMarginXWebCam = gtkDB.get_object('spb_WebCamMarginX'); - let adjustmentMarginX = new Gtk.Adjustment({ - value: 0, - lower: 0, - upper: 10000, - step_increment: 1, - page_increment: 10, - }); - refSpinnerMarginXWebCam.configure(adjustmentMarginX, 10, 0); - tmpS.bind( - Settings.MARGIN_X_WEBCAM_SETTING_KEY, - refSpinnerMarginXWebCam, - 'value', - Gio.SettingsBindFlags.DEFAULT - ); - - // implements webcam margin y position option - let refSpinnerMarginYWebCam = gtkDB.get_object('spb_WebCamMarginY'); - let adjustmentMarginY = new Gtk.Adjustment({ - value: 0, - lower: 0, - upper: 10000, - step_increment: 1, - page_increment: 10, - }); - refSpinnerMarginYWebCam.configure(adjustmentMarginY, 10, 0); - tmpS.bind( - Settings.MARGIN_Y_WEBCAM_SETTING_KEY, - refSpinnerMarginYWebCam, - 'value', - Gio.SettingsBindFlags.DEFAULT - ); - - // implements webcam aplha channel option - let refSpinnerAlphaWebCam = gtkDB.get_object('spb_WebCamAlpha'); - let adjustmentAlpha = new Gtk.Adjustment({ - value: 0.01, - lower: 0.0, - upper: 1.0, - step_increment: 0.05, - page_increment: 0.25, - }); - refSpinnerAlphaWebCam.configure(adjustmentAlpha, 0.25, 2); - tmpS.bind( - Settings.ALPHA_CHANNEL_WEBCAM_SETTING_KEY, - refSpinnerAlphaWebCam, - 'value', - Gio.SettingsBindFlags.DEFAULT - ); - - // implements webcam type unit dimension option - let refComboboxTypeUnitWebCam = gtkDB.get_object('cbt_WebCamUnitMeasure'); - tmpS.bind( - Settings.TYPE_UNIT_WEBCAM_SETTING_KEY, - refComboboxTypeUnitWebCam, - 'active', - Gio.SettingsBindFlags.DEFAULT - ); - - // implements webcam width option - let refSpinnerWidthWebCam = gtkDB.get_object('spb_WebCamWidth'); - let adjustmentWidth = new Gtk.Adjustment({ - value: 20, - lower: 0, - upper: 10000, - step_increment: 1, - page_increment: 10, - }); - refSpinnerWidthWebCam.configure(adjustmentWidth, 10, 0); - tmpS.bind( - Settings.WIDTH_WEBCAM_SETTING_KEY, - refSpinnerWidthWebCam, - 'value', - Gio.SettingsBindFlags.DEFAULT - ); - - // implements webcam heigth option - let refSpinnerHeightWebCam = gtkDB.get_object('spb_WebCamHeight'); - let adjustmentHeight = new Gtk.Adjustment({ - value: 10, - lower: 0, - upper: 10000, - step_increment: 1, - page_increment: 10, - }); - refSpinnerHeightWebCam.configure(adjustmentHeight, 10, 0); - tmpS.bind( - Settings.HEIGHT_WEBCAM_SETTING_KEY, - refSpinnerHeightWebCam, - 'value', - Gio.SettingsBindFlags.DEFAULT - ); - - // implements webcam stack menu chooser - ctx.Ref_StackSwitcher_WebCam = gtkDB.get_object('sts_Webcam'); - // implements webcam stack obj - ctx.Ref_StackObj_WebCam = gtkDB.get_object('stk_Webcam'); - // implements webcam stack menu chooser - ctx.Ref_Label_WebCam = gtkDB.get_object('lbl_Webcam'); - // implements webcam caps stack menu chooser - ctx.Ref_Label_WebCamCaps = gtkDB.get_object('lbl_WebcamCaps'); - } - - /** - * @param {EasyScreenCastSettingsWidget} ctx the prefs/settings widget - * @param {Gtk.Builder} gtkDB the builder that loaded the UI glade file - * @param {Gio.Settings} tmpS the current settings - * @private - */ - _initTabFile(ctx, gtkDB, tmpS) { - // implements file name string rec option - let refTexteditFileName = gtkDB.get_object('txe_FileNameRec'); - tmpS.bind( - Settings.FILE_NAME_SETTING_KEY, - refTexteditFileName, - 'text', - Gio.SettingsBindFlags.DEFAULT - ); - - // implements file container option - let refComboboxContainer = gtkDB.get_object('cbt_FileContainer'); - tmpS.bind( - Settings.FILE_CONTAINER_SETTING_KEY, - refComboboxContainer, - 'active', - Gio.SettingsBindFlags.DEFAULT - ); - - // implements file container resolution - let refStackFileResolution = gtkDB.get_object('stk_FileResolution'); - - // implements file resolution preset spinner - let refComboboxResolution = gtkDB.get_object('cbt_FileResolution'); - tmpS.bind( - Settings.FILE_RESOLUTION_TYPE_SETTING_KEY, - refComboboxResolution, - 'active', - Gio.SettingsBindFlags.DEFAULT - ); - - // intercept combobox res changed and update width/height value - refComboboxResolution.connect('changed', self => { - var activeRes = self.active; - Lib.TalkativeLog(`-^-preset combobox changed: ${activeRes}`); - if (activeRes >= 0 && activeRes < 15) { - var [h, w] = ctx._getResolutionPreset(activeRes); - - // update width/height - this._settings.setOption(Settings.FILE_RESOLUTION_HEIGHT_SETTING_KEY, h); - this._settings.setOption(Settings.FILE_RESOLUTION_WIDTH_SETTING_KEY, w); - Lib.TalkativeLog(`-^-Res changed h: ${h} w: ${w}`); - } - }); - - // load file resolution pref and upadte UI - var tmpRes = this._settings.getOption('i', Settings.FILE_RESOLUTION_TYPE_SETTING_KEY); - if (tmpRes < 0) - refStackFileResolution.set_visible_child_name('native'); - else if (tmpRes === 999) - refStackFileResolution.set_visible_child_name('custom'); - else - refStackFileResolution.set_visible_child_name('preset'); - - - // setup event on stack switcher - refStackFileResolution.connect('notify::visible-child-name', () => { - Lib.TalkativeLog('-^-stack_FR event grab'); - var page = refStackFileResolution.get_visible_child_name(); - Lib.TalkativeLog(`-^-active page -> ${page}`); - - if (page === 'native') { - // set option to -1 - this._settings.setOption(Settings.FILE_RESOLUTION_TYPE_SETTING_KEY, -1); - } else if (page === 'preset') { - // set option to fullHD 16:9 - this._settings.setOption(Settings.FILE_RESOLUTION_TYPE_SETTING_KEY, 8); - } else if (page === 'custom') { - // set option to 99 - this._settings.setOption(Settings.FILE_RESOLUTION_TYPE_SETTING_KEY, 999); - } else { - Lib.TalkativeLog('-^-page error'); - } - }); - - // implements file width option - let refSpinnerWidthRes = gtkDB.get_object('spb_ResWidth'); - let adjustmentResWidth = new Gtk.Adjustment({ - value: 640, - lower: 640, - upper: 3840, - step_increment: 1, - page_increment: 100, - }); - refSpinnerWidthRes.configure(adjustmentResWidth, 10, 0); - tmpS.bind( - Settings.FILE_RESOLUTION_WIDTH_SETTING_KEY, - refSpinnerWidthRes, - 'value', - Gio.SettingsBindFlags.DEFAULT - ); - - // implements file heigth option - let refSpinnerHeightRes = gtkDB.get_object('spb_ResHeight'); - let adjustmentResHeight = new Gtk.Adjustment({ - value: 480, - lower: 480, - upper: 2160, - step_increment: 1, - page_increment: 100, - }); - refSpinnerHeightRes.configure(adjustmentResHeight, 10, 0); - tmpS.bind( - Settings.FILE_RESOLUTION_HEIGHT_SETTING_KEY, - refSpinnerHeightRes, - 'value', - Gio.SettingsBindFlags.DEFAULT - ); - - // implements keep aspect ratio check box - let refCheckboxKeepAspectRatio = gtkDB.get_object('chb_FileResolution_kar'); - tmpS.bind( - Settings.FILE_RESOLUTION_KAR_SETTING_KEY, - refCheckboxKeepAspectRatio, - 'active', - Gio.SettingsBindFlags.DEFAULT - ); - - // implements resolution width scale option - let refScaleWidthRes = gtkDB.get_object('scl_ResWidth'); - refScaleWidthRes.set_valign(Gtk.Align.START); - refScaleWidthRes.set_adjustment(adjustmentResWidth); - refScaleWidthRes.set_digits(0); - refScaleWidthRes.set_value(this._settings.getOption('i', Settings.FILE_RESOLUTION_WIDTH_SETTING_KEY)); - - // implements resolution height scale option - let refScaleHeightRes = gtkDB.get_object('scl_ResHeight'); - refScaleHeightRes.set_valign(Gtk.Align.START); - refScaleHeightRes.set_adjustment(adjustmentResHeight); - refScaleHeightRes.set_digits(0); - refScaleHeightRes.set_value(this._settings.getOption('i', Settings.FILE_RESOLUTION_HEIGHT_SETTING_KEY)); - - // add marks on width/height file resolution - let ind = 0; - for (; ind < 13; ind++) { - var [h, w] = ctx._getResolutionPreset(ind); - refScaleWidthRes.add_mark(w, Gtk.PositionType.BOTTOM, ''); - refScaleHeightRes.add_mark(h, Gtk.PositionType.BOTTOM, ''); - } - - // implements file folder string rec option - let refFilechooserFileFolder = gtkDB.get_object('fcb_FilePathRec'); - // check state initial value - var tmpFolder = this._settings.getOption('s', Settings.FILE_FOLDER_SETTING_KEY); - Lib.TalkativeLog(`-^-folder for screencast: ${tmpFolder}`); - if (tmpFolder === '' || tmpFolder === null || tmpFolder === undefined) { - let result = null; - ctx.CtrlExe.Execute( - 'xdg-user-dir VIDEOS', - true, - (success, out) => { - Lib.TalkativeLog(`-^-CALLBACK sync S: ${success} out: ${out}`); - if (success && out !== '' && out !== undefined) - result = out.replace(/(\n)/g, ''); - }, - null - ); - - if (result !== null) { - Lib.TalkativeLog(`-^-xdg-user video: ${result}`); - tmpFolder = result; - } else { - Lib.TalkativeLog('-^-NOT SET xdg-user video'); - - ctx.CtrlExe.Execute( - '/usr/bin/sh -c "echo $HOME"', - true, - (success, out) => { - Lib.TalkativeLog(`-^-CALLBACK sync S: ${success} out: ${out}`); - if (success && out !== '' && out !== undefined) - tmpFolder = out.replace(/(\n)/g, ''); - }, - null - ); - } - - // connect keywebcam signal - this._settings._settings.connect( - `changed::${Settings.DEVICE_INDEX_WEBCAM_SETTING_KEY}`, - () => { - Lib.TalkativeLog('-^-webcam device changed'); - this._refreshWebcamOptions(); - } - ); - } - - refFilechooserFileFolder.set_label(`Selected: ${tmpFolder}`); - - refFilechooserFileFolder.connect('clicked', () => { - Lib.TalkativeLog('-^- file chooser button clicked...'); - - let dialog = new Gtk.FileChooserNative({ - 'title': 'Select folder', - 'transient-for': refFilechooserFileFolder.get_root(), - 'action': Gtk.FileChooserAction.SELECT_FOLDER, - 'accept-label': 'Ok', - 'cancel-label': 'Cancel', - }); - dialog.connect('response', (self, response) => { - if (response === Gtk.ResponseType.ACCEPT) { - var tmpPathFolder = self.get_file().get_path(); - Lib.TalkativeLog(`-^-file path get from widget : ${tmpPathFolder}`); - this._settings.setOption( - Settings.FILE_FOLDER_SETTING_KEY, - tmpPathFolder - ); - refFilechooserFileFolder.set_label(`Selected: ${tmpPathFolder}`); - } - ctx.fileChooserDialog = null; - }); - dialog.show(); - ctx.fileChooserDialog = dialog; // keep a reference to the dialog alive - }); - } - - /** - * @param {EasyScreenCastSettingsWidget} ctx the prefs/settings widget - * @param {Gtk.Builder} gtkDB the builder that loaded the UI glade file - * @param {Gio.Settings} tmpS the current settings - * @private - */ - _initTabSupport(ctx, gtkDB, tmpS) { - // implements textentry log - let refTextViewEscLog = gtkDB.get_object('txe_ContainerLog'); - let refBufferLog = refTextViewEscLog.get_buffer(); - - // implements verbose debug option - let refSwitchVerboseDebug = gtkDB.get_object('swt_VerboseDebug'); - tmpS.bind( - Settings.VERBOSE_DEBUG_SETTING_KEY, - refSwitchVerboseDebug, - 'active', - Gio.SettingsBindFlags.DEFAULT - ); - this._settings._settings.connect( - `changed::${Settings.VERBOSE_DEBUG_SETTING_KEY}`, - () => { - Lib.setDebugEnabled(this._settings.getOption('b', Settings.VERBOSE_DEBUG_SETTING_KEY)); - } - ); - - refSwitchVerboseDebug.connect('state-set', self => { - // update log display widgets - refTextViewEscLog.sensistive = self.active; - refComboboxLogChooser.sensitive = self.active; - }); - - // implements file resolution preset spinner - let refComboboxLogChooser = gtkDB.get_object('cbt_LogChooser'); - - // intercept combobox res changed and update width/height value - refComboboxLogChooser.connect('changed', self => { - const activeLog = self.active; - Lib.TalkativeLog(`-^-log combobox changed: ${activeLog}`); - switch (activeLog) { - case 0: - // clear buffer - refBufferLog.delete( - refBufferLog.get_start_iter(), - refBufferLog.get_end_iter() - ); - - ctx.CtrlExe.Execute( - 'journalctl --since "15 min ago" --output=cat --no-pager', - false, - success => { - Lib.TalkativeLog(`-^-CALLBACK async S= ${success}`); - }, - line => { - let esc = line.indexOf('[ESC]'); - if ( - line !== '' && - line !== undefined && - esc !== -1 - ) { - line += '\n'; - refBufferLog.insert( - refBufferLog.get_end_iter(), - line, - line.length - ); - } - } - ); - break; - case 1: - // clear buffer - refBufferLog.delete( - refBufferLog.get_start_iter(), - refBufferLog.get_end_iter() - ); - - ctx.CtrlExe.Execute( - 'journalctl --since "15 min ago" --output=cat --no-pager', - false, - success => { - Lib.TalkativeLog(`-^-CALLBACK async S= ${success}`); - if (success) { - if (refBufferLog.get_line_count() > 0) { - let strNOgsp = _( - 'No Gstreamer pipeline found' - ); - refBufferLog.insert( - refBufferLog.get_end_iter(), - strNOgsp, - strNOgsp.length - ); - } - } - }, - line => { - let esc = line.indexOf('-§-final GSP :'); - if ( - line !== '' && - line !== undefined && - esc !== -1 - ) { - line += '\n'; - refBufferLog.insert( - refBufferLog.get_end_iter(), - line, - line.length - ); - } - } - ); - break; - case 2: - // clear buffer - refBufferLog.delete( - refBufferLog.get_start_iter(), - refBufferLog.get_end_iter() - ); - - ctx.CtrlExe.Execute( - 'journalctl /usr/bin/gnome-shell --since "15 min ago" --output=cat --no-pager', - false, - success => { - Lib.TalkativeLog(`-^-CALLBACK async S= ${success}`); - }, - line => { - if (line !== '' && line !== undefined) { - line += '\n'; - refBufferLog.insert( - refBufferLog.get_end_iter(), - line, - line.length - ); - } - } - ); - break; - default: - break; - } - }); - - // update state of get log - refComboboxLogChooser.sensistive = this._settings.getOption('b', Settings.VERBOSE_DEBUG_SETTING_KEY); - - // implements default button action - let refButtonSetDefaultSettings = gtkDB.get_object('btn_DefaultOption'); - refButtonSetDefaultSettings.connect('clicked', () => - ctx._setDefaultsettings() - ); - } - - /** - * @param {EasyScreenCastSettingsWidget} ctx the prefs/settings widget - * @param {Gtk.Builder} gtkDB the builder that loaded the UI glade file - * @private - */ - _initTabInfo(ctx, gtkDB) { - // implements info img extension - let refImageEsc = gtkDB.get_object('img_ESC'); - refImageEsc.set_from_file(Lib.getImagePath(this._prefs.dir, 'Icon_Info.png')); - - // implements info version label - let refLabelVersion = gtkDB.get_object('lbl_Version'); - refLabelVersion.set_markup(`${_('Version: ')}${this._prefs.metadata.version} (${Lib.getFullVersion()})`); - } - - /** - * @param {number} device device index - * @private - */ - _updateWebCamCaps(device) { - Lib.TalkativeLog(`-^-webcam device index: ${device}`); - - if (device > 0) { - this._initializeWebcamHelper(); - var listCaps = this.CtrlWebcam.getListCapsDevice(device - 1); - Lib.TalkativeLog(`-^-webcam caps: ${listCaps.length}`); - if (listCaps !== null && listCaps !== undefined) { - this.Ref_ListStore_QualityWebCam.clear(); - for (var index in listCaps) { - this.Ref_ListStore_QualityWebCam.set( - this.Ref_ListStore_QualityWebCam.append(), - [0], - [listCaps[index]] - ); - } - } else { - Lib.TalkativeLog('-^-NO List Caps Webcam'); - this.Ref_ListStore_QualityWebCam.clear(); - this._settings.setOption(Settings.QUALITY_WEBCAM_SETTING_KEY, ''); - } - } else { - Lib.TalkativeLog('-^-NO Webcam recording'); - this.Ref_ListStore_QualityWebCam.clear(); - this._settings.setOption(Settings.QUALITY_WEBCAM_SETTING_KEY, ''); - } - } - - /** - * Refreshes the webcam settings. - * - * @private - */ - _refreshWebcamOptions() { - Lib.TalkativeLog('-^-refresh webcam options'); - this._initializeWebcamHelper(); - - // fill combobox with quality option webcam - this._updateWebCamCaps(this._settings.getOption('i', Settings.DEVICE_INDEX_WEBCAM_SETTING_KEY)); - - // update webcam widget state - this._updateStateWebcamOptions(); - } - - /** - * Initializes this.CtrlWebcam if it is null. - * - * @private - */ - _initializeWebcamHelper() { - if (this.CtrlWebcam === null) - this.CtrlWebcam = new UtilWebcam.HelperWebcam(_('Unspecified webcam')); - } - - /** - * @param {string} accel accelerator string parsable by Gtk.accelerator_parse, e.g. "<Super>E" - * @private - */ - _updateRowShortcut(accel) { - Lib.TalkativeLog(`-^-update row combo key accel: ${accel}`); - - let [key, mods] = [0, 0]; - - if (accel !== null && accel !== undefined) { - let ok; - [ok, key, mods] = Gtk.accelerator_parse(accel); - - if (ok !== true) { - Lib.TalkativeLog('-^-couldn\'t parse accel'); - key = 0; - mods = 0; - } - } - - Lib.TalkativeLog(`-^-key: ${key} mods: ${mods}`); - this.Ref_liststore_Shortcut.set( - this.Iter_ShortcutRow, - [Settings.SHORTCUT_COLUMN_KEY, Settings.SHORTCUT_COLUMN_MODS], - [key, mods] - ); - } - - /** - * @param {boolean} active custom or not custom GStream pipeline - * @private - */ - _setStateGSP(active) { - // update GSP text area - if (!active) { - Lib.TalkativeLog('-^-custom GSP'); - - this.Ref_stack_Quality.set_visible_child_name('pg_Custom'); - } else { - Lib.TalkativeLog('-^-NOT custom GSP'); - - this.Ref_stack_Quality.set_visible_child_name('pg_Preset'); - - var audio = false; - if (this._settings.getOption('i', Settings.INPUT_AUDIO_SOURCE_SETTING_KEY) > 0) - audio = true; - - this._settings.setOption( - Settings.PIPELINE_REC_SETTING_KEY, - Settings.getGSPstd(audio) - ); - } - } - - /** - * @private - */ - _updateStateWebcamOptions() { - Lib.TalkativeLog('-^-update webcam option widgets'); - - var tmpDev = this._settings.getOption( - 'i', - Settings.DEVICE_INDEX_WEBCAM_SETTING_KEY - ); - this._updateWebCamCaps(tmpDev); - if (tmpDev > 0) { - var arrDev = this.CtrlWebcam.getNameDevices(); - this.Ref_Label_WebCam.set_text(arrDev[tmpDev - 1]); - - // setup label webcam caps - var tmpCaps = this._settings.getOption( - 's', - Settings.QUALITY_WEBCAM_SETTING_KEY - ); - if (tmpCaps === '') { - this.Ref_Label_WebCamCaps.use_markup = true; - this.Ref_Label_WebCamCaps.set_markup( - _( - 'No Caps selected, please select one from the caps list' - ) - ); - } else { - this.Ref_Label_WebCamCaps.set_text(tmpCaps); - } - - // webcam recording show widget - this.Ref_StackSwitcher_WebCam.set_sensitive(true); - this.Ref_StackObj_WebCam.set_sensitive(true); - } else { - this.Ref_Label_WebCam.set_text(_('No webcam device selected')); - // setup label webcam caps - this.Ref_Label_WebCamCaps.set_text(_('-')); - // webcam NOT recording hide widget - this.Ref_StackSwitcher_WebCam.set_sensitive(false); - this.Ref_StackObj_WebCam.set_sensitive(false); - } - } - - /** - * @param {number} index index of the predefined resolutions - * @returns {Array} - * @private - */ - _getResolutionPreset(index) { - var arrRes = [ - [480, 640], - [480, 854], - [600, 800], - [720, 960], - [720, 1280], - [768, 1024], - [768, 1366], - [1024, 1280], - [1080, 1920], - [1200, 1600], - [1440, 2560], - [2048, 2560], - [2160, 3840], - ]; - if (index >= 0 && index < arrRes.length) - return arrRes[index]; - else - return null; - } - - /** - * function to restore default value of the settings - * - * @private - */ - _setDefaultsettings() { - Lib.TalkativeLog('-^-restore default option'); - - this._settings.setOption(Settings.SHOW_NOTIFY_ALERT_SETTING_KEY, true); - this._settings.setOption(Settings.SHOW_AREA_REC_SETTING_KEY, false); - this._settings.setOption(Settings.STATUS_INDICATORS_SETTING_KEY, 1); - this._settings.setOption(Settings.DRAW_CURSOR_SETTING_KEY, true); - this._settings.setOption(Settings.VERBOSE_DEBUG_SETTING_KEY, false); - this._settings.setOption(Settings.ACTIVE_CUSTOM_GSP_SETTING_KEY, false); - - this._settings.setOption(Settings.FPS_SETTING_KEY, 30); - this._settings.setOption(Settings.X_POS_SETTING_KEY, 0); - this._settings.setOption(Settings.Y_POS_SETTING_KEY, 0); - this._settings.setOption(Settings.WIDTH_SETTING_KEY, 600); - this._settings.setOption(Settings.HEIGHT_SETTING_KEY, 400); - - this._settings.setOption(Settings.FILE_NAME_SETTING_KEY, 'Screencast_%d_%t'); - this._settings.setOption(Settings.FILE_FOLDER_SETTING_KEY, ''); - this._settings.setOption(Settings.ACTIVE_POST_CMD_SETTING_KEY, false); - this._settings.setOption(Settings.ACTIVE_PRE_CMD_SETTING_KEY, false); - this._settings.setOption(Settings.POST_CMD_SETTING_KEY, 'xdg-open _fpath &'); - this._settings.setOption(Settings.INPUT_AUDIO_SOURCE_SETTING_KEY, 0); - this._settings.setOption(Settings.DEVICE_INDEX_WEBCAM_SETTING_KEY, 0); - this._settings.setOption(Settings.DEVICE_WEBCAM_SETTING_KEY, ''); - - this._settings.setOption(Settings.TIME_DELAY_SETTING_KEY, 0); - this._settings.setOption(Settings.FILE_CONTAINER_SETTING_KEY, 0); - this._settings.setOption(Settings.FILE_RESOLUTION_TYPE_SETTING_KEY, -1); - this._settings.setOption(Settings.QUALITY_SETTING_KEY, 1); - this._settings.setOption(Settings.QUALITY_WEBCAM_SETTING_KEY, ''); - this._settings.setOption(Settings.WIDTH_WEBCAM_SETTING_KEY, 20); - this._settings.setOption(Settings.HEIGHT_WEBCAM_SETTING_KEY, 10); - this._settings.setOption(Settings.TYPE_UNIT_WEBCAM_SETTING_KEY, 0); - this._settings.setOption(Settings.MARGIN_X_WEBCAM_SETTING_KEY, 0); - this._settings.setOption(Settings.MARGIN_Y_WEBCAM_SETTING_KEY, 0); - this._settings.setOption(Settings.ALPHA_CHANNEL_WEBCAM_SETTING_KEY, 0.75); - this._settings.setOption(Settings.CORNER_POSITION_WEBCAM_SETTING_KEY, 0); - } -}); - - -export default class EasyScreenCastPreferences extends ExtensionPreferences { - /** - * @param {Adw.PreferencesWindow} window preferences window? - * @returns {EasyScreenCastSettingsWidget} - */ - fillPreferencesWindow(window) { - window._settings = this.getSettings(); - - Lib.TalkativeLog('-^-Init pref widget'); - - const page = new Adw.PreferencesPage(); - - const group = new Adw.PreferencesGroup({ - title: _('EasyScreenCast'), - }); - page.add(group); - - const widget = new EasyScreenCastSettingsWidget(this); - group.add(widget); - - window.add(page); - } -} diff --git a/gnome/.local/share/gnome-shell/extensions/EasyScreenCast@iacopodeenosee.gmail.com/schemas/gschemas.compiled b/gnome/.local/share/gnome-shell/extensions/EasyScreenCast@iacopodeenosee.gmail.com/schemas/gschemas.compiled deleted file mode 100644 index 362d39e..0000000 Binary files a/gnome/.local/share/gnome-shell/extensions/EasyScreenCast@iacopodeenosee.gmail.com/schemas/gschemas.compiled and /dev/null differ diff --git a/gnome/.local/share/gnome-shell/extensions/EasyScreenCast@iacopodeenosee.gmail.com/schemas/org.gnome.shell.extensions.easyscreencast.gschema.xml b/gnome/.local/share/gnome-shell/extensions/EasyScreenCast@iacopodeenosee.gmail.com/schemas/org.gnome.shell.extensions.easyscreencast.gschema.xml deleted file mode 100644 index 51bbf18..0000000 --- a/gnome/.local/share/gnome-shell/extensions/EasyScreenCast@iacopodeenosee.gmail.com/schemas/org.gnome.shell.extensions.easyscreencast.gschema.xml +++ /dev/null @@ -1,200 +0,0 @@ - - - - true -

Enable show notify and alert message - Enable show notify and alert message - - - false - Enable show area screencast during recording - Enable show area screencast during recording - - - 0 - select input audio source - select input audio source - - - false - Active custom GStreamer Pipeline - Active custom GStreamer Pipeline - - - 0 - Time in seconds fot delay recording - Time in seconds fot delay recording - - - false - Enable verbose debug - Enable verbose debug - - - 0 - X position of screencasting - X position of screencasting - - - 0 - Y position of screencasting - Y position of screencasting - - - 600 - width of screencasting - width of screencasting - - - 400 - height of screencasting - height of screencasting - - - 1 - active status indicators - active status indicators - - - true - draw the cursor into screencast - draw the cursor into screencast - - - 30 - fps of screencasting - fps of screencasting - - - 'vp9enc min_quantizer=13 max_quantizer=13 cpu-used=5 deadline=1000000 threads=%T ! queue ! webmmux' - gstreamer pipeline of screencasting - gstreamer pipeline of screencasting - - - 0 - select area of screencast - select area of screencast - - - 'Screencast_%d_%t' - file name template of screencast - file name template of screencast - - - '' - file folder of screencast - file folder of screencast - - - false - enable execute pre command - enable execute pre command - - - '' - command to execute - command to execute - - - false - enable execute post command - enable execute post command - - - 'xdg-open _fpath' - command to execute - command to execute - - - - E']]]> - - - - false - Enable keyboard shortcut - Enable keyboard shortcut - - - 0 - file screencast container - file screencast container - - - -1 - file screencast resolution type - file screencast resolution type [native(-1),preset(0-99),custom(99)] - - - true - file screencast resolution Keep Aspect Ratio - file screencast resolution Keep Aspect Ratio (add borders) - - - 0 - file screencast resolution width - file screencast resolution width - - - 0 - file screencast resolution height - file screencast resolution height - - - 1 - store the quality index option - store the quality index option - - - 0 - select webcam device - select webcam device - - - "" - selected webcam device path - selected webcam device path - - - "" - select webcam quality - select webcam quality - - - 20 - width webcam - width webcam - - - 10 - height webcam - height webcam - - - 0 - type of unit of measure webcam - type of unit of measure - - - 0 - margin x from border webcam - margin x webcam - - - 0 - margin y from border webcam - margin y from border webcam - - - 0.75 - - alpha channel webcam - aplha channel webcam - - - 0 - the corner position of webcam - the corner position of webcam - - - diff --git a/gnome/.local/share/gnome-shell/extensions/EasyScreenCast@iacopodeenosee.gmail.com/selection.js b/gnome/.local/share/gnome-shell/extensions/EasyScreenCast@iacopodeenosee.gmail.com/selection.js deleted file mode 100644 index c59076c..0000000 --- a/gnome/.local/share/gnome-shell/extensions/EasyScreenCast@iacopodeenosee.gmail.com/selection.js +++ /dev/null @@ -1,508 +0,0 @@ -/* -The MIT License (MIT) -Copyright (c) 2013 otto.allmendinger@gmail.com - -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. -*/ - -'use strict'; - -import GObject from 'gi://GObject'; -import Meta from 'gi://Meta'; -import Clutter from 'gi://Clutter'; -import St from 'gi://St'; -import * as Main from 'resource:///org/gnome/shell/ui/main.js'; -import * as Signals from 'resource:///org/gnome/shell/misc/signals.js'; - -import {gettext as _} from 'resource:///org/gnome/shell/extensions/extension.js'; - -import * as Lib from './convenience.js'; -import * as Ext from './extension.js'; -import * as UtilNotify from './utilnotify.js'; -import {DisplayApi} from './display_module.js'; - -/** - * @type {Capture} - */ -class Capture extends Signals.EventEmitter { - constructor() { - super(); - Lib.TalkativeLog('-£-capture selection init'); - - this._mouseDown = false; - - this.monitor = Main.layoutManager.focusMonitor; - - this._areaSelection = new St.Widget({ - name: 'area-selection', - style_class: 'area-selection', - visible: 'true', - reactive: 'true', - x: -10, - y: -10, - }); - - Main.uiGroup.add_child(this._areaSelection); - - this._areaResolution = new St.Label({ - style_class: 'area-resolution', - text: '', - }); - this._areaResolution.opacity = 255; - this._areaResolution.set_position(0, 0); - - Main.uiGroup.add_child(this._areaResolution); - - this._grab = Main.pushModal(this._areaSelection); - - if (this._grab) { - this._signalCapturedEvent = this._areaSelection.connect( - 'captured-event', - this._onCaptureEvent.bind(this) - ); - - this._setCaptureCursor(); - } else { - Lib.TalkativeLog('-£-Main.pushModal() === false'); - } - } - - /** - * @private - */ - _setDefaultCursor() { - DisplayApi.set_cursor(Meta.Cursor.DEFAULT); - } - - /** - * @private - */ - _setCaptureCursor() { - DisplayApi.set_cursor(Meta.Cursor.CROSSHAIR); - } - - /** - * @param {Clutter.Actor} actor the actor that received the event - * @param {Clutter.Event} event a Clutter.Event - * @private - */ - _onCaptureEvent(actor, event) { - if (event.type() === Clutter.EventType.KEY_PRESS) { - if (event.get_key_symbol() === Clutter.KEY_Escape) - this._stop(); - } - - this.emit('captured-event', event); - } - - /** - * Draws a on-screen rectangle showing the area that will be captured by screen cast. - * - * @param {object} rect rectangle - * @param {number} rect.x left position in pixels - * @param {number} rect.y top position in pixels - * @param {number} rect.w width in pixels - * @param {number} rect.h height in pixels - * @param {boolean} showResolution whether to display the size of the selected area - */ - drawSelection({x, y, w, h}, showResolution) { - this._areaSelection.set_position(x, y); - this._areaSelection.set_size(w, h); - - if (showResolution && w > 100 && h > 50) { - this._areaResolution.set_text(`${w} X ${h}`); - this._areaResolution.set_position( - x + (w / 2 - this._areaResolution.width / 2), - y + (h / 2 - this._areaResolution.height / 2) - ); - } else { - this._areaResolution.set_position(0, 0); - this._areaResolution.set_text(''); - } - } - - /** - * Clear drawing selection - */ - clearSelection() { - this.drawSelection( - { - x: -10, - y: -10, - w: 0, - h: 0, - }, - false - ); - } - - /** - * @private - */ - _stop() { - Lib.TalkativeLog('-£-capture selection stop'); - - this._areaSelection.disconnect(this._signalCapturedEvent); - this._setDefaultCursor(); - Main.uiGroup.remove_child(this._areaSelection); - Main.popModal(this._grab); - Main.uiGroup.remove_child(this._areaResolution); - this._areaSelection.destroy(); - this.emit('stop'); - } - - _saveRect(x, y, h, w) { - Lib.TalkativeLog(`-£-selection x:${x} y:${y} height:${h} width:${w}`); - - Ext.Indicator.saveSelectedRect(x, y, h, w); - Ext.Indicator._doDelayAction(); - } - - toString() { - return this.GTypeName; - } -} - -export class SelectionArea extends Signals.EventEmitter { - constructor() { - super(); - Lib.TalkativeLog('-£-area selection init'); - - this._mouseDown = false; - this._capture = new Capture(); - this._capture.connect('captured-event', this._onEvent.bind(this)); - this._capture.connect('stop', () => { - this._ctrlNotify.resetAlert(); - this.emit('stop'); - }); - - this._ctrlNotify = new UtilNotify.NotifyManager(); - this._ctrlNotify.createAlert( - _('Select an area for recording or press [ESC] to abort') - ); - } - - /** - * @param {Clutter.actor} capture the actor the captured the event - * @param {Clutter.Event} event a Clutter.Event - * @private - */ - _onEvent(capture, event) { - let type = event.type(); - let [x, y] = global.get_pointer(); - - if (type === Clutter.EventType.BUTTON_PRESS) { - [this._startX, this._startY] = [x, y]; - this._mouseDown = true; - } else if (this._mouseDown) { - let rect = _getRectangle(this._startX, this._startY, x, y); - if (type === Clutter.EventType.MOTION) { - this._capture.drawSelection(rect, true); - } else if (type === Clutter.EventType.BUTTON_RELEASE) { - this._capture._stop(); - - Lib.TalkativeLog(`-£-area x: ${rect.x} y: ${rect.y} height: ${rect.h} width: ${rect.w}`); - - this._capture._saveRect(rect.x, rect.y, rect.h, rect.w); - } - } - } - - toString() { - return this.GTypeName; - } -} - -export class SelectionWindow extends Signals.EventEmitter { - constructor() { - super(); - Lib.TalkativeLog('-£-window selection init'); - - this._windows = global.get_window_actors(); - this._capture = new Capture(); - this._capture.connect('captured-event', this._onEvent.bind(this)); - this._capture.connect('stop', () => { - this._ctrlNotify.resetAlert(); - this.emit('stop'); - }); - - this._ctrlNotify = new UtilNotify.NotifyManager(); - this._ctrlNotify.createAlert( - _('Select a window for recording or press [ESC] to abort') - ); - } - - /** - * @param {Clutter.Actor} capture the actor the captured the event - * @param {Clutter.Event} event a Clutter.Event - * @private - */ - _onEvent(capture, event) { - let type = event.type(); - let [x, y] = global.get_pointer(); - - this._selectedWindow = _selectWindow(this._windows, x, y); - - if (this._selectedWindow) - this._highlightWindow(this._selectedWindow); - else - this._clearHighlight(); - - - if (type === Clutter.EventType.BUTTON_PRESS) { - if (this._selectedWindow) { - this._capture._stop(); - - let maxHeight = global.screen_height; - let maxWidth = global.screen_width; - Lib.TalkativeLog(`-£-global screen area H: ${maxHeight} W: ${maxWidth}`); - - let [w, h] = this._selectedWindow.get_size(); - let [wx, wy] = this._selectedWindow.get_position(); - - Lib.TalkativeLog(`-£-windows pre wx: ${wx} wy: ${wy} height: ${h} width: ${w}`); - - if (wx < 0) - wx = 0; - if (wy < 0) - wy = 0; - if (wx + w > maxWidth) - w = maxWidth - wx; - if (wy + h > maxHeight) - h = maxHeight - wy; - - Lib.TalkativeLog(`-£-windows post wx: ${wx} wy: ${wy} height: ${h} width: ${w}`); - - this._capture._saveRect(wx, wy, h, w); - } - } - } - - /** - * @param {Clutter.Actor} win the window to highlight - * @private - */ - _highlightWindow(win) { - let rect = _getWindowRectangle(win); - Lib.TalkativeLog(`-£-window highlight on, pos/meas: x:${rect.x} y:${rect.y} w:${rect.w} h:${rect.h}`); - this._capture.drawSelection(rect, false); - } - - /** - * @private - */ - _clearHighlight() { - Lib.TalkativeLog('-£-window highlight off'); - this._capture.clearSelection(); - } - - toString() { - return this.GTypeName; - } -} - -export class SelectionDesktop extends Signals.EventEmitter { - constructor() { - super(); - Lib.TalkativeLog('-£-desktop selection init'); - const displayCount = DisplayApi.number_displays(); - Lib.TalkativeLog(`-£-Number of monitor ${displayCount}`); - - for (let i = 0; i < displayCount; i++) { - let tmpM = DisplayApi.display_geometry_for_index(i); - Lib.TalkativeLog(`-£-monitor ${i} geometry x=${tmpM.x} y=${tmpM.y} w=${tmpM.width} h=${tmpM.height}`); - } - - this._capture = new Capture(); - this._capture.connect('captured-event', this._onEvent.bind(this)); - this._capture.connect('stop', () => { - this._ctrlNotify.resetAlert(); - this.emit('stop'); - }); - - this._ctrlNotify = new UtilNotify.NotifyManager(); - this._ctrlNotify.createAlert( - _('Select a desktop for recording or press [ESC] to abort') - ); - } - - /** - * @param {Clutter.Actor} capture the actor that captured the event - * @param {Clutter.Event} event a Clutter.Event - * @private - */ - _onEvent(capture, event) { - let type = event.type(); - - if (type === Clutter.EventType.BUTTON_PRESS) { - this._capture._stop(); - - let tmpM = Main.layoutManager.currentMonitor; - - let x = tmpM.x; - let y = tmpM.y; - let height = tmpM.height; - let width = tmpM.width; - Lib.TalkativeLog(`-£-desktop x: ${x} y: ${y} height: ${height} width: ${width}`); - - this._capture._saveRect(x, y, height, width); - } - } - - toString() { - return this.GTypeName; - } -} - -export class AreaRecording extends GObject.Object { - constructor() { - super(); - Lib.TalkativeLog('-£-area recording init'); - - this._areaRecording = new St.Widget({ - name: 'area-recording', - style_class: 'area-recording', - visible: 'true', - reactive: 'false', - x: -10, - y: -10, - }); - - let [recX, recY, recW, recH] = Ext.Indicator.getSelectedRect(); - let tmpH = Main.layoutManager.currentMonitor.height; - let tmpW = Main.layoutManager.currentMonitor.width; - - Main.uiGroup.add_child(this._areaRecording); - - Main.overview.connect('showing', () => { - Lib.TalkativeLog('-£-overview opening'); - - Main.uiGroup.remove_child(this._areaRecording); - }); - - Main.overview.connect('hidden', () => { - Lib.TalkativeLog('-£-overview closed'); - - Main.uiGroup.add_child(this._areaRecording); - }); - - if (recX + recW <= tmpW - 5 && recY + recH <= tmpH - 5) - this.drawArea(recX - 2, recY - 2, recW + 4, recH + 4); - } - - /** - * @param {number} x left position - * @param {number} y top position - * @param {number} w width - * @param {number} h height - */ - drawArea(x, y, w, h) { - Lib.TalkativeLog('-£-draw area recording'); - - this._visible = true; - this._areaRecording.set_position(x, y); - this._areaRecording.set_size(w, h); - } - - /** - * Clears the drawing area - */ - clearArea() { - Lib.TalkativeLog('-£-hide area recording'); - - this._visible = false; - this.drawArea(-10, -10, 0, 0); - } - - /** - * @returns {boolean} - */ - isVisible() { - return this._visible; - } - - toString() { - return this.GTypeName; - } -} - -/** - * @param {number} x1 left position - * @param {number} y1 top position - * @param {number} x2 right position - * @param {number} y2 bottom position - * @returns {{x: number, y: number, w: number, h: number}} - */ -function _getRectangle(x1, y1, x2, y2) { - return { - x: Math.min(x1, x2), - y: Math.min(y1, y2), - w: Math.abs(x1 - x2), - h: Math.abs(y1 - y2), - }; -} - -/** - * @param {Clutter.Actor} win a Clutter.Actor - * @returns {{x: number, y: number, w: number, h: number}} - */ -function _getWindowRectangle(win) { - let [tw, th] = win.get_size(); - let [tx, ty] = win.get_position(); - - return { - x: tx, - y: ty, - w: tw, - h: th, - }; -} - -/** - * @param {Array(Clutter.Actor)} windows all windows on the display - * @param {number} x left position - * @param {number} y top position - * @returns {Clutter.Actor} - */ -function _selectWindow(windows, x, y) { - let filtered = windows.filter(win => { - if ( - win !== undefined && - win.visible && - typeof win.get_meta_window === 'function' - ) { - Lib.TalkativeLog(`-£-selectWin x:${x} y:${y}`); - - let [w, h] = win.get_size(); - let [wx, wy] = win.get_position(); - Lib.TalkativeLog(`-£-selectWin w:${w} h:${h} wx:${wx} wy:${wy}`); - - return wx <= x && wy <= y && wx + w >= x && wy + h >= y; - } else { - return false; - } - }); - - filtered.sort((a, b) => { - return ( - a.get_meta_window().get_layer() <= b.get_meta_window().get_layer() - ); - }); - - return filtered[0]; -} diff --git a/gnome/.local/share/gnome-shell/extensions/EasyScreenCast@iacopodeenosee.gmail.com/settings.js b/gnome/.local/share/gnome-shell/extensions/EasyScreenCast@iacopodeenosee.gmail.com/settings.js deleted file mode 100644 index 5d67302..0000000 --- a/gnome/.local/share/gnome-shell/extensions/EasyScreenCast@iacopodeenosee.gmail.com/settings.js +++ /dev/null @@ -1,146 +0,0 @@ -/* - Copyright (C) 2013 Borsato Ivano - - The JavaScript code in this page is free software: you can - redistribute it and/or modify it under the terms of the GNU - General Public License (GNU GPL) as published by the Free Software - Foundation, either version 3 of the License, or (at your option) - any later version. The code is distributed WITHOUT ANY WARRANTY; - without even the implied warranty of MERCHANTABILITY or FITNESS - FOR A PARTICULAR PURPOSE. See the GNU GPL for more details. -*/ - -'use strict'; - -import GObject from 'gi://GObject'; - -// setting keys -export const INPUT_AUDIO_SOURCE_SETTING_KEY = 'input-audio-source'; -export const ACTIVE_POST_CMD_SETTING_KEY = 'execute-post-cmd'; -export const POST_CMD_SETTING_KEY = 'post-cmd'; -export const ACTIVE_PRE_CMD_SETTING_KEY = 'execute-pre-cmd'; -export const PRE_CMD_SETTING_KEY = 'pre-cmd'; -export const ACTIVE_CUSTOM_GSP_SETTING_KEY = 'active-custom-gsp'; -export const ACTIVE_SHORTCUT_SETTING_KEY = 'active-shortcut'; -export const SHORTCUT_KEY_SETTING_KEY = 'shortcut-key'; -export const TIME_DELAY_SETTING_KEY = 'delay-time'; -export const SHOW_NOTIFY_ALERT_SETTING_KEY = 'show-notify-alert'; -export const SHOW_AREA_REC_SETTING_KEY = 'show-area-rec'; -export const VERBOSE_DEBUG_SETTING_KEY = 'verbose-debug'; -export const PIPELINE_REC_SETTING_KEY = 'pipeline'; -export const FPS_SETTING_KEY = 'fps'; -export const STATUS_INDICATORS_SETTING_KEY = 'status-indicators'; -export const X_POS_SETTING_KEY = 'x-pos'; -export const Y_POS_SETTING_KEY = 'y-pos'; -export const WIDTH_SETTING_KEY = 'width-rec'; -export const HEIGHT_SETTING_KEY = 'height-rec'; -export const DRAW_CURSOR_SETTING_KEY = 'draw-cursor'; -export const AREA_SCREEN_SETTING_KEY = 'area-screen'; -export const FILE_NAME_SETTING_KEY = 'file-name'; -export const FILE_FOLDER_SETTING_KEY = 'file-folder'; -export const FILE_CONTAINER_SETTING_KEY = 'file-container'; -export const FILE_RESOLUTION_TYPE_SETTING_KEY = 'file-resolution-type'; -export const FILE_RESOLUTION_KAR_SETTING_KEY = 'file-resolution-kar'; -export const FILE_RESOLUTION_WIDTH_SETTING_KEY = 'file-resolution-width'; -export const FILE_RESOLUTION_HEIGHT_SETTING_KEY = 'file-resolution-height'; -export const QUALITY_SETTING_KEY = 'quality-index'; -export const DEVICE_INDEX_WEBCAM_SETTING_KEY = 'device-webcam-index'; -export const DEVICE_WEBCAM_SETTING_KEY = 'device-webcam'; -export const QUALITY_WEBCAM_SETTING_KEY = 'quality-webcam'; -export const WIDTH_WEBCAM_SETTING_KEY = 'width-webcam'; -export const HEIGHT_WEBCAM_SETTING_KEY = 'height-webcam'; -export const TYPE_UNIT_WEBCAM_SETTING_KEY = 'type-unit-webcam'; -export const MARGIN_X_WEBCAM_SETTING_KEY = 'margin-x-webcam'; -export const MARGIN_Y_WEBCAM_SETTING_KEY = 'margin-y-webcam'; -export const ALPHA_CHANNEL_WEBCAM_SETTING_KEY = 'alpha-channel-webcam'; -export const CORNER_POSITION_WEBCAM_SETTING_KEY = 'corner-position-webcam'; - -// shortcut tree view columns -export const SHORTCUT_COLUMN_KEY = 0; -export const SHORTCUT_COLUMN_MODS = 1; - -export const Settings = GObject.registerClass(class EasyScreenCastSettings extends GObject.Object { - constructor(settings) { - super(); - this._settings = settings; - } - - /** - * getter option - * - * @param {string} type value type of the option. one of 'b', 'i', 's', 'd', 'as' - * @param {string} key option key - * @returns {string} - */ - getOption(type, key) { - switch (type) { - case 'b': - return this._settings.get_boolean(key); - case 'i': - return this._settings.get_int(key); - case 's': - return this._settings.get_string(key); - case 'd': - return this._settings.get_double(key); - case 'as': - return this._settings.get_strv(key); - } - - return ''; - } - - /** - * setter option - * - * @param {string} key option key - * @param {boolean|number|string|double|object} option option value - * @returns {string} empty string if successful, 'ERROR' otherwise - */ - setOption(key, option) { - switch (typeof option) { - case 'boolean': - this._settings.set_boolean(key, option); - break; - - case 'number': - this._settings.set_int(key, option); - break; - - case 'string': - this._settings.set_string(key, option); - break; - - case 'double': - this._settings.set_double(key, option); - break; - - case 'object': - this._settings.set_strv(key, option); - break; - - default: - return 'ERROR'; - } - return ''; - } - - destroy() { - if (this._settings) - this._settings = null; - } -}); - - -/** - * get a standard gsp pipeline - * - * @param {boolean} audio with or without audio - * @returns {string} - */ -export function getGSPstd(audio) { - // TODO update gsp - if (audio) - return 'queue max-size-buffers=0 max-size-time=0 max-size-bytes=0 ! videorate ! vp8enc min_quantizer=0 max_quantizer=5 cpu-used=3 deadline=1000000 threads=%T ! queue max-size-buffers=0 max-size-time=0 max-size-bytes=0 ! mux. pulsesrc ! queue max-size-buffers=0 max-size-time=0 max-size-bytes=0 ! audioconvert ! vorbisenc ! queue max-size-buffers=0 max-size-time=0 max-size-bytes=0 ! mux. webmmux name=mux '; - else - return 'vp9enc min_quantizer=0 max_quantizer=5 cpu-used=3 deadline=1000000 threads=%T ! queue max-size-buffers=0 max-size-time=0 max-size-bytes=0 ! webmmux'; -} diff --git a/gnome/.local/share/gnome-shell/extensions/EasyScreenCast@iacopodeenosee.gmail.com/stylesheet.css b/gnome/.local/share/gnome-shell/extensions/EasyScreenCast@iacopodeenosee.gmail.com/stylesheet.css deleted file mode 100644 index 2802bd6..0000000 --- a/gnome/.local/share/gnome-shell/extensions/EasyScreenCast@iacopodeenosee.gmail.com/stylesheet.css +++ /dev/null @@ -1,36 +0,0 @@ -.RecordAction-label { - font-size: 15px; - font-weight: bold; -} - -.area-selection { - background-color: rgba(255, 0, 0, 0.5); - border: 2px solid rgba(255, 0, 0, 1); -} - -.area-recording { - border-style: dashed; - border: 2px rgba(255, 0, 0, 1); -} - -.alert-msg { - font-size: 40px; - font-weight: bold; - color: #ffffff; - background-color: rgba(10, 10, 10, 0.7); - border-radius: 5px; - padding: .5em; -} - -.area-resolution { - font-size: 20px; - font-weight: bold; - color: #ffffff; - background-color: rgba(0, 0, 0, 0.0); -} - -.time-label { - font-size: 14px; - padding-right: 5px; - color: #ff0000; -} diff --git a/gnome/.local/share/gnome-shell/extensions/EasyScreenCast@iacopodeenosee.gmail.com/timer.js b/gnome/.local/share/gnome-shell/extensions/EasyScreenCast@iacopodeenosee.gmail.com/timer.js deleted file mode 100644 index ca168f1..0000000 --- a/gnome/.local/share/gnome-shell/extensions/EasyScreenCast@iacopodeenosee.gmail.com/timer.js +++ /dev/null @@ -1,257 +0,0 @@ -/* - Copyright (C) 2013 Borsato Ivano - - The JavaScript code in this page is free software: you can - redistribute it and/or modify it under the terms of the GNU - General Public License (GNU GPL) as published by the Free Software - Foundation, either version 3 of the License, or (at your option) - any later version. The code is distributed WITHOUT ANY WARRANTY; - without even the implied warranty of MERCHANTABILITY or FITNESS - FOR A PARTICULAR PURPOSE. See the GNU GPL for more details. -*/ - -'use strict'; - -import GObject from 'gi://GObject'; -import GLib from 'gi://GLib'; -import * as Lib from './convenience.js'; - -/* - DELAY TIMER -*/ -let DelaySec = 0; -let timerDelayId = null; -let CallbackFuncDelay = null; -let ElapsedSec; - -/** - * @type {TimerDelay} - */ -export const TimerDelay = GObject.registerClass({ - GTypeName: 'EasyScreenCast_TimerDelay', -}, class TimerDelay extends GObject.Object { - /** - * Create a new timer - * - * @param {number} delay delay in seconds - * @param {Function} callback callback function that is called after delay seconds (without arguments) - * @param {*} scope scope for the callback - */ - constructor(delay, callback, scope) { - super(); - if (isNaN(delay)) { - Lib.TalkativeLog(`-%-delay is NOT a number :${delay}`); - } else { - Lib.TalkativeLog(`-%-init TimerDelay called - sec : ${delay}`); - - DelaySec = delay; - ElapsedSec = 1; - - this.setCallback(callback); - this.Scope = scope; - } - } - - /** - * Set the callback-function - * - * @param {Function} callback callback function that is called after delay seconds (without arguments) - */ - setCallback(callback) { - Lib.TalkativeLog('-%-setcallback TimerDelay called'); - - if ( - callback === undefined || - callback === null || - typeof callback !== 'function' - ) - throw TypeError("'callback' needs to be a function."); - - CallbackFuncDelay = callback; - } - - /** - * Set the delay time - * - * @param {number} delay delay in seconds - */ - setDelay(delay) { - Lib.TalkativeLog(`-%-setdelay TimerDelay called: ${delay}`); - - DelaySec = delay; - } - - /** - * Start or restart a new timer - */ - begin() { - Lib.TalkativeLog('-%-start TimerDelay called'); - this.stop(); - - timerDelayId = GLib.timeout_add(GLib.PRIORITY_DEFAULT, 1000, () => - this._callbackInternal() - ); - } - - /** - * Stop the current timer - */ - stop() { - Lib.TalkativeLog('-%-stop TimerDelay called'); - if (timerDelayId !== null) { - if (GLib.source_remove(timerDelayId)) { - timerDelayId = null; - - ElapsedSec = 1; - } - } - } - - /** - * A convenient way to restart the timer. - */ - restart() { - this.stop(); - this.begin(); - } - - /** - * The internal callback-function. - * - * @private - * @returns {boolean} - */ - _callbackInternal() { - Lib.TalkativeLog(`-%-internalFunction TimerDelay called | Sec = ${ElapsedSec} Sec delay = ${DelaySec}`); - if (ElapsedSec >= DelaySec) { - CallbackFuncDelay.apply(this.Scope, []); - ElapsedSec = 1; - return false; - } else { - ElapsedSec++; - return true; - } - } -}); - -/* - COUNTING TIMER -*/ -let timerCountingId = null; -let CallbackFuncCounting = null; -let isRunning = false; -let secpassed = 0; - -/** - * @type {TimerCounting} - */ -export const TimerCounting = GObject.registerClass({ - GTypeName: 'EasyScreenCast_TimerCounting', -}, class TimerCounting extends GObject.Object { - /** - * Callback for the counting timer. - * - * @callback TimerCounting~callback - * @param {number} count seconds passed - * @param {boolean} alertEnd whether the timer is ending - */ - - /** - * Create a new timer - * - * @param {TimerCounting~callback} callback callback function that is called every second - * @param {EasyScreenCast_Indicator} scope scope for the callback function. This is also used to updateTimeLabel. - */ - constructor(callback, scope) { - super(); - Lib.TalkativeLog('-%-init TimerCounting called'); - - this.setCallback(callback); - secpassed = 0; - this.Scope = scope; - } - - /** - * Set the callback-function - * - * @param {TimerCounting~callback} callback callback function that is called every second - */ - setCallback(callback) { - Lib.TalkativeLog('-%-setcallback TimerCounting called'); - - if ( - callback === undefined || - callback === null || - typeof callback !== 'function' - ) - throw TypeError("'callback' needs to be a function."); - - CallbackFuncCounting = callback; - } - - /** - * Start or restart a new timer - */ - begin() { - Lib.TalkativeLog('-%-start TimerCounting called'); - - if (isRunning) - this.stop(); - - isRunning = true; - - timerCountingId = GLib.timeout_add(GLib.PRIORITY_DEFAULT, 1000, () => - this._callbackInternal() - ); - } - - /** - * Stop the current timer - */ - stop() { - Lib.TalkativeLog('-%-stop TimerCounting called'); - - isRunning = false; - - if (timerCountingId !== null && GLib.source_remove(timerCountingId)) - timerCountingId = null; - } - - /** - * A convenient way to stop timer - */ - halt() { - isRunning = false; - } - - /** - * The internal callback-function. Calls a function that handles - * the desktop notifications and one that sets the time label next - * to the icon. - * - * @private - * @returns {boolean} - */ - _callbackInternal() { - if (isRunning === false) { - Lib.TalkativeLog('-%-finish TimerCounting '); - - CallbackFuncCounting.apply(this.Scope, [secpassed, true]); - secpassed = 0; - - this.stop(); - this.Scope.updateTimeLabel(''); - - return false; - } else { - secpassed++; - - Lib.TalkativeLog(`-%-continued TimerCounting | sec: ${secpassed}`); - - CallbackFuncCounting.apply(this.Scope, [secpassed, false]); - this.Scope.updateTimeLabel(secpassed); - - return true; - } - } -}); diff --git a/gnome/.local/share/gnome-shell/extensions/EasyScreenCast@iacopodeenosee.gmail.com/utilaudio.js b/gnome/.local/share/gnome-shell/extensions/EasyScreenCast@iacopodeenosee.gmail.com/utilaudio.js deleted file mode 100644 index b07e181..0000000 --- a/gnome/.local/share/gnome-shell/extensions/EasyScreenCast@iacopodeenosee.gmail.com/utilaudio.js +++ /dev/null @@ -1,319 +0,0 @@ -/* - Copyright (C) 2015 Borsato Ivano - - The JavaScript code in this page is free software: you can - redistribute it and/or modify it under the terms of the GNU - General Public License (GNU GPL) as published by the Free Software - Foundation, either version 3 of the License, or (at your option) - any later version. The code is distributed WITHOUT ANY WARRANTY; - without even the implied warranty of MERCHANTABILITY or FITNESS - FOR A PARTICULAR PURPOSE. See the GNU GPL for more details. -*/ - -'use strict'; - -import GObject from 'gi://GObject'; -import GIRepository from 'gi://GIRepository'; -GIRepository.Repository.prepend_search_path('/usr/lib/gnome-shell'); -GIRepository.Repository.prepend_library_path('/usr/lib/gnome-shell'); -GIRepository.Repository.prepend_search_path('/usr/lib64/gnome-shell'); -GIRepository.Repository.prepend_library_path('/usr/lib64/gnome-shell'); -import Gvc from 'gi://Gvc'; - -import * as Lib from './convenience.js'; -import * as Settings from './settings.js'; -import * as Ext from './extension.js'; - -/** - * @type {MixerAudio} - */ -export const MixerAudio = GObject.registerClass({ - GTypeName: 'EasyScreenCast_MixerAudio', -}, class MixerAudio extends GObject.Object { - constructor() { - super(); - Lib.TalkativeLog('-#-mixer constructor'); - - this._mixerControl = this._createMixerControl(); - this._isConnected = true; - this._mixerControl.connect('state-changed', () => - this._onChangeStatePAC() - ); - - // more log for debug - if (Lib.debugEnabled) { - this._mixerControl.connect('stream_added', (control, id) => { - this._onStreamAdd(control, id); - }); - this._mixerControl.connect('stream_removed', (control, id) => { - this._onStreamRemove(control, id); - }); - } - } - - /** - * @returns {Gvc.MixerControl} - * @private - */ - _createMixerControl() { - Lib.TalkativeLog('-#-mixer create'); - - // https://gitlab.gnome.org/GNOME/libgnome-volume-control - var _mixerTmp = new Gvc.MixerControl({ - name: 'ESC Mixer Control', - }); - _mixerTmp.open(); - - return _mixerTmp; - } - - _onChangeStatePAC() { - Lib.TalkativeLog('-#-mixer state changed'); - - switch (this._mixerControl.get_state()) { - case Gvc.MixerControlState.CLOSED: - Lib.TalkativeLog('-#-Mixer close'); - this._isConnected = false; - break; - case Gvc.MixerControlState.CONNECTING: - Lib.TalkativeLog('-#-Mixer connecting'); - this._isConnected = false; - break; - case Gvc.MixerControlState.FAILED: - Lib.TalkativeLog('-#-Mixer failed'); - this._isConnected = false; - break; - case Gvc.MixerControlState.READY: - Lib.TalkativeLog('-#-Mixer ready'); - this._isConnected = true; - - // more log for debug - if (Lib.debugEnabled) - this._getInfoPA(); - - break; - default: - Lib.TalkativeLog('-#-Mixer UNK'); - this._isConnected = false; - break; - } - } - - /** - * Gets a list of input audio sources. - * - * @returns {Array} - */ - getListInputAudio() { - Lib.TalkativeLog('-#-get list input audio'); - - if (this._isConnected) { - var arrayTmp = []; - - var tmpSinks = this._mixerControl.get_sinks(); - Lib.TalkativeLog(`-#-Mixer sink -> ${tmpSinks.length}`); - for (let x in tmpSinks) { - Lib.TalkativeLog(`-#-sink index: ${tmpSinks[x].index}`); - Lib.TalkativeLog(`-#-sink name: ${tmpSinks[x].name}`); - Lib.TalkativeLog( - `-#-sink description: ${tmpSinks[x].description}` - ); - Lib.TalkativeLog(`-#-sink port: ${tmpSinks[x].port}`); - - arrayTmp.push({ - desc: tmpSinks[x].description, - name: tmpSinks[x].name, - port: tmpSinks[x].port, - sortable: true, - resizeable: true, - }); - } - - var tmpSources = this._mixerControl.get_sources(); - Lib.TalkativeLog(`-#-Mixer sources -> ${tmpSources.length}`); - for (let x in tmpSources) { - Lib.TalkativeLog(`-#-source index: ${tmpSources[x].index}`); - Lib.TalkativeLog(`-#-source name: ${tmpSources[x].name}`); - Lib.TalkativeLog( - `-#-source description: ${tmpSources[x].description}` - ); - Lib.TalkativeLog(`-#-source port: ${tmpSources[x].port}`); - - arrayTmp.push({ - desc: tmpSources[x].description, - name: tmpSources[x].name, - port: tmpSources[x].port, - sortable: true, - resizeable: true, - }); - } - - Lib.TalkativeLog(`-#-MIXER SOURCE TOT -> ${arrayTmp.length}`); - - return arrayTmp; - } else { - Lib.TalkativeLog('-#-Error lib pulse NOT present or NOT respond'); - } - - return []; - } - - /** - * @returns {string} - */ - getAudioSource() { - Lib.TalkativeLog('-#-get source audio choosen'); - - var arrtmp = this.getListInputAudio(); - var index = Ext.Indicator.getSettings().getOption('i', Settings.INPUT_AUDIO_SOURCE_SETTING_KEY) - 2; - - if (index >= 0 && index < arrtmp.length) { - return arrtmp[index].name; - } else { - Lib.TalkativeLog('-#-ERROR, audio source missing'); - Ext.Indicator.getSettings().setOption(Settings.INPUT_AUDIO_SOURCE_SETTING_KEY, 0); - - return ''; - } - } - - /** - * @param {Gvc.MixerControl} control the mixer control to which the stream was added - * @param {number} id the stream id - * @private - */ - _onStreamAdd(control, id) { - Lib.TalkativeLog(`-#-mixer stream add - ID: ${id}`); - var streamTmp = control.lookup_stream_id(id); - - if ( - streamTmp.name === 'GNOME Shell' && - streamTmp.description === 'Record Stream' - ) { - Lib.TalkativeLog('-#-stream gnome recorder captured'); - - Lib.TalkativeLog(`-#-stream index: ${streamTmp.index}`); - Lib.TalkativeLog(`-#-stream card index: ${streamTmp.card_index}`); - Lib.TalkativeLog(`-#-application_ID: ${streamTmp.application_id}`); - Lib.TalkativeLog(`-#-stream name: ${streamTmp.name}`); - Lib.TalkativeLog(`-#-stream icon: ${streamTmp.icon_name}`); - Lib.TalkativeLog(`-#-stream description: ${streamTmp.description}`); - Lib.TalkativeLog(`-#-stream port: ${streamTmp.port}`); - } - } - - /** - * @param {Gvc.MixerControl} control the mixer control from where the stream was removed - * @param {number} id stream id - * @private - */ - _onStreamRemove(control, id) { - Lib.TalkativeLog(`-#-mixer stream remove - ID: ${id}`); - // note: the stream has been already removed, so - // control.lookup_stream_id(id) won't return anything - } - - /** - * @private - */ - _getInfoPA() { - var tmp = this._mixerControl.get_cards(); - Lib.TalkativeLog(`#-# mixer cards -> ${tmp.length}`); - for (let x in tmp) { - Lib.TalkativeLog(`-#-card index: ${tmp[x].index}`); - Lib.TalkativeLog(`-#-card name: ${tmp[x].name}`); - Lib.TalkativeLog(`-#-card icon: ${tmp[x].icon_name}`); - Lib.TalkativeLog(`-#-card profile: ${tmp[x].profile}`); - Lib.TalkativeLog(`-#-card human profile: ${tmp[x].human_profile}`); - } - - tmp = this._mixerControl.get_sources(); - Lib.TalkativeLog(`#-# mixer sources -> ${tmp.length}`); - for (let x in tmp) { - Lib.TalkativeLog(`-#-source index: ${tmp[x].index}`); - Lib.TalkativeLog(`-#-application_ID: ${tmp[x].application_id}`); - Lib.TalkativeLog(`-#-source name: ${tmp[x].name}`); - Lib.TalkativeLog(`-#-source icon: ${tmp[x].icon_name}`); - Lib.TalkativeLog(`-#-source description: ${tmp[x].description}`); - Lib.TalkativeLog(`-#-source port: ${tmp[x].port}`); - } - - tmp = this._mixerControl.get_source_outputs(); - Lib.TalkativeLog(`#-# mixer source output -> ${tmp.length}`); - for (let x in tmp) { - Lib.TalkativeLog(`-#-sourceouput index: ${tmp[x].index}`); - Lib.TalkativeLog(`-#-application_ID: ${tmp[x].application_id}`); - Lib.TalkativeLog(`-#-sourceouput name: ${tmp[x].name}`); - Lib.TalkativeLog(`-#-sourceoutput icon: ${tmp[x].icon_name}`); - Lib.TalkativeLog( - `-#-sourceoutput description: ${tmp[x].description}` - ); - Lib.TalkativeLog(`-#-sourceoutput port: ${tmp[x].port}`); - } - - tmp = this._mixerControl.get_sinks(); - Lib.TalkativeLog(`#-# mixer sink -> ${tmp.length}`); - for (let x in tmp) { - Lib.TalkativeLog(`-#-sink index: ${tmp[x].index}`); - Lib.TalkativeLog(`-#-application_ID: ${tmp[x].application_id}`); - Lib.TalkativeLog(`-#-sink name: ${tmp[x].name}`); - Lib.TalkativeLog(`-#-sink icon: ${tmp[x].icon_name}`); - Lib.TalkativeLog(`-#-sink description: ${tmp[x].description}`); - Lib.TalkativeLog(`-#-sink port: ${tmp[x].port}`); - } - - tmp = this._mixerControl.get_sink_inputs(); - Lib.TalkativeLog(`#-# mixer sink input -> ${tmp.length}`); - for (let x in tmp) { - Lib.TalkativeLog(`-#-sink input index: ${tmp[x].index}`); - Lib.TalkativeLog(`-#-application_ID: ${tmp[x].application_id}`); - Lib.TalkativeLog(`-#-sink input name: ${tmp[x].name}`); - Lib.TalkativeLog(`-#-sink input icon: ${tmp[x].icon_name}`); - Lib.TalkativeLog( - `-#-sink input description: ${tmp[x].description}` - ); - Lib.TalkativeLog(`-#-sink input port: ${tmp[x].port}`); - } - - tmp = this._mixerControl.get_streams(); - Lib.TalkativeLog(`#-# mixer stream -> ${tmp.length}`); - for (let x in tmp) { - Lib.TalkativeLog(`-#-STREAM index: ${tmp[x].index}`); - Lib.TalkativeLog(`-#-application_ID: ${tmp[x].application_id}`); - Lib.TalkativeLog(`-#-stream name: ${tmp[x].name}`); - Lib.TalkativeLog(`-#-stream icon: ${tmp[x].icon_name}`); - Lib.TalkativeLog(`-#-stream description: ${tmp[x].description}`); - - var tmp1 = tmp[x].get_ports(); - for (let y in tmp1) { - Lib.TalkativeLog(`-##-stream port number: ${y}`); - Lib.TalkativeLog(`-##-stream port name: ${tmp1[y].port}`); - Lib.TalkativeLog( - `-##-stream port human name: ${tmp1[y].human_port}` - ); - Lib.TalkativeLog( - `-##-stream port priority: ${tmp1[y].priority}` - ); - } - } - } - - /** - * @returns {boolean} - */ - checkAudio() { - Lib.TalkativeLog(`-#-check GVC lib presence: ${this._isConnected}`); - - return this._isConnected; - } - - /** - * Destroy mixer control - */ - destroy() { - if (this._mixerControl) { - this._mixerControl.close(); - this._mixerControl = null; - } - } -}); diff --git a/gnome/.local/share/gnome-shell/extensions/EasyScreenCast@iacopodeenosee.gmail.com/utilexecmd.js b/gnome/.local/share/gnome-shell/extensions/EasyScreenCast@iacopodeenosee.gmail.com/utilexecmd.js deleted file mode 100644 index 058b810..0000000 --- a/gnome/.local/share/gnome-shell/extensions/EasyScreenCast@iacopodeenosee.gmail.com/utilexecmd.js +++ /dev/null @@ -1,264 +0,0 @@ -/* - Copyright (C) 2017 Borsato Ivano - - The JavaScript code in this page is free software: you can - redistribute it and/or modify it under the terms of the GNU - General Public License (GNU GPL) as published by the Free Software - Foundation, either version 3 of the License, or (at your option) - any later version. The code is distributed WITHOUT ANY WARRANTY; - without even the implied warranty of MERCHANTABILITY or FITNESS - FOR A PARTICULAR PURPOSE. See the GNU GPL for more details. -*/ - -'use strict'; - -import GObject from 'gi://GObject'; -import GLib from 'gi://GLib'; -import Gio from 'gi://Gio'; -import * as Lib from './convenience.js'; - -/** - * @type {ExecuteStuff} - */ -export const ExecuteStuff = GObject.registerClass({ - GTypeName: 'EasyScreenCast_ExecuteStuff', -}, class ExecuteStuff extends GObject.Object { - /** - * @param {EasyScreenCastSettingsWidget|EasyScreenCastIndicator} scope the scope for executing callback methods - * @private - */ - constructor(scope) { - super(); - Lib.TalkativeLog(`-¶-init scope:${scope}`); - - this.Scope = scope; - this.Callback = null; - } - - /** - * @param {string} cmd the command to be executed - * @returns {*[]} - * @private - */ - _parseCmd(cmd) { - let successP, argv; - - try { - [successP, argv] = GLib.shell_parse_argv(cmd); - } catch (err) { - Lib.TalkativeLog('-¶-ERROR PARSE'); - successP = false; - } - if (successP) { - Lib.TalkativeLog(`-¶-parse: ${successP} argv: ${argv}`); - return [successP, argv]; - } else { - return [successP, null]; - } - } - - /** - * Result callback. - * - * @callback ExecuteStuff~resultCallback - * @param {boolean} result whether the executed command exited successfully or not - * @param {string} stdout (optional) output of the result, if it was executed synchronously - */ - - /** - * Line output callback for asynchronous commands. - * - * @callback ExecuteStuff~lineCallback - * @param {string} line a single line of output - */ - - /** - * @param {string} cmd the command to be executed - * @param {boolean} sync execute synchronously (wait for return) or fork a process - * @param {ExecuteStuff~resultCallback} resCb callback after the command is finished - * @param {ExecuteStuff~lineCallback} lineCb callback for stdout when command is executed asynchronosly - * @class - */ - Execute(cmd, sync, resCb, lineCb) { - Lib.TalkativeLog(`-¶-execute: ${cmd}`); - - this.CommandString = cmd; - if ( - resCb === undefined && - resCb === null && - typeof resCb !== 'function' - ) { - Lib.TalkativeLog('-¶-resCallback NEED to be a function'); - - this.Callback = null; - } else { - this.Callback = resCb; - } - - if (sync === true) { - Lib.TalkativeLog('-¶-sync execute (wait for return)'); - this._syncCmd(this.CommandString); - } else { - Lib.TalkativeLog('-¶-async execute (fork process)'); - if ( - lineCb === undefined && - lineCb === null && - typeof lineCb !== 'function' - ) { - Lib.TalkativeLog('-¶-lineCallback NEED to be a function'); - - this.lineCallback = null; - } else { - this.lineCallback = lineCb; - } - this._asyncCmd(this.CommandString); - } - } - - /** - * @param {string} cmd the command to be executed - * @returns {*} - * @class - */ - Spawn(cmd) { - let [successP, argv] = this._parseCmd(cmd); - if (successP) { - let successS, pid; - try { - [successS, pid] = GLib.spawn_async( - null, - argv, - null, - GLib.SpawnFlags.SEARCH_PATH | - GLib.SpawnFlags.DO_NOT_REAP_CHILD, - null - ); - } catch (err) { - Lib.TalkativeLog( - `-¶-ERROR SPAWN err:${err.message.toString()}` - ); - successS = false; - } - - if (successS) { - Lib.TalkativeLog(`-¶-spawn: ${successS} pid: ${pid}`); - return true; - } else { - Lib.TalkativeLog('-¶-spawn ERROR'); - return null; - } - } - return null; - } - - /** - * @param {string} cmd the command to be executed - * @private - */ - _syncCmd(cmd) { - let [successP, argv] = this._parseCmd(cmd); - let decoder = new TextDecoder(); - if (successP) { - Lib.TalkativeLog(`-¶-argv: ${argv}`); - let successS, stdOut, stdErr, exit; - try { - [successS, stdOut, stdErr, exit] = GLib.spawn_sync( - null, - argv, - null, - GLib.SpawnFlags.SEARCH_PATH, - () => {} - ); - } catch (err) { - Lib.TalkativeLog('-¶-ERROR SPAWN'); - successS = false; - } - if (successS) { - Lib.TalkativeLog(`-¶-argv: ${argv}`); - Lib.TalkativeLog(`-¶-stdOut: ${decoder.decode(stdOut)}`); - Lib.TalkativeLog(`-¶-stdErr: ${decoder.decode(stdErr)}`); - Lib.TalkativeLog(`-¶-exit: ${exit}`); - - Lib.TalkativeLog('-¶-exe RC'); - if (this.Callback !== null) { - this.Callback.apply(this.Scope, [ - true, - decoder.decode(stdOut), - ]); - } - } else { - Lib.TalkativeLog(`-¶-ERROR exe WC - exit status: ${exit}`); - if (this.Callback !== null) - this.Callback.apply(this.Scope, [false]); - } - } - } - - /** - * @param {string} cmd the command to be executed - * @private - */ - _asyncCmd(cmd) { - let [successP, argv] = this._parseCmd(cmd); - let decoder = new TextDecoder(); - if (successP) { - Lib.TalkativeLog(`-¶-argv: ${argv}`); - let successS, pid, stdIn, stdOut, stdErr; - - try { - [ - successS, - pid, - stdIn, - stdOut, - stdErr, - ] = GLib.spawn_async_with_pipes( - null, // working directory - argv, // argv - null, // envp - GLib.SpawnFlags.SEARCH_PATH, // flags - () => {} // child_setup - ); - } catch (err) { - Lib.TalkativeLog('-¶-ERROR SPAWN'); - successS = false; - } - if (successS) { - Lib.TalkativeLog(`-¶-argv: ${argv}`); - Lib.TalkativeLog(`-¶-pid: ${pid}`); - Lib.TalkativeLog(`-¶-stdIn: ${stdIn}`); - Lib.TalkativeLog(`-¶-stdOut: ${stdOut}`); - Lib.TalkativeLog(`-¶-stdErr: ${stdErr}`); - - let outReader = new Gio.DataInputStream({ - base_stream: new Gio.UnixInputStream({ - fd: stdOut, - }), - }); - let inWriter = new Gio.DataOutputStream({ - base_stream: new Gio.UnixOutputStream({ - fd: stdIn, - }), - }); - inWriter.close(null); - - let [out] = outReader.read_line(null); - while (out !== null) { - if (this.lineCallback !== null) - this.lineCallback.apply(this.Scope, [decoder.decode(out)]); - - [out] = outReader.read_line(null); - } - - if (this.Callback !== null) { - Lib.TalkativeLog('-¶-exe RC'); - this.Callback.apply(this.Scope, [true]); - } - } else { - Lib.TalkativeLog('-¶-ERROR exe WC'); - if (this.Callback !== null) - this.Callback.apply(this.Scope, [false]); - } - } - } -}); diff --git a/gnome/.local/share/gnome-shell/extensions/EasyScreenCast@iacopodeenosee.gmail.com/utilgsp.js b/gnome/.local/share/gnome-shell/extensions/EasyScreenCast@iacopodeenosee.gmail.com/utilgsp.js deleted file mode 100644 index e2bd0b9..0000000 --- a/gnome/.local/share/gnome-shell/extensions/EasyScreenCast@iacopodeenosee.gmail.com/utilgsp.js +++ /dev/null @@ -1,735 +0,0 @@ -/* - Copyright (C) 2016 Borsato Ivano - - The JavaScript code in this page is free software: you can - redistribute it and/or modify it under the terms of the GNU - General Public License (GNU GPL) as published by the Free Software - Foundation, either version 3 of the License, or (at your option) - any later version. The code is distributed WITHOUT ANY WARRANTY; - without even the implied warranty of MERCHANTABILITY or FITNESS - FOR A PARTICULAR PURPOSE. See the GNU GPL for more details. -*/ - -'use strict'; - -import * as Lib from './convenience.js'; -import * as Settings from './settings.js'; - -// CONST GSP - base -const SCREEN = - '_SCREENCAST_RES_ _ENCODER_VIDEO_ ! queue max-size-buffers=0 max-size-time=0 max-size-bytes=0 ! _CONTAINER_'; - -// CONST GSP - base plus sound -const SCREEN_SOUND = - 'queue max-size-buffers=0 max-size-time=0 max-size-bytes=0 ! _SCREENCAST_RES_ _ENCODER_VIDEO_ ! queue max-size-buffers=0 max-size-time=0 max-size-bytes=0 ! mux. pulsesrc ! audioconvert ! _ENCODER_AUDIO_ ! queue max-size-buffers=0 max-size-time=0 max-size-bytes=0 ! mux. _CONTAINER_ name=mux '; - -// CONST GSP - base plus webcam -const SCREEN_WEBCAM = - 'queue max-size-buffers=0 max-size-time=0 max-size-bytes=0 ! videomixer name=mix _WEBCAM_OPT_ ! videoconvert ! _SCREENCAST_RES_ _ENCODER_VIDEO_ ! mux. v4l2src _WEBCAM_DEV_ ! _WEBCAM_CAP_ ! videoscale ! video/x-raw, width=_WEBCAM_W_, height=_WEBCAM_H_, add-borders=false ! queue max-size-buffers=0 max-size-time=0 max-size-bytes=0 ! mix. _CONTAINER_ name=mux'; - -// CONST GSP - base plus sound and webcam stream -const SCREEN_WEBCAM_SOUND = - 'queue max-size-buffers=0 max-size-time=0 max-size-bytes=0 ! videomixer name=mix _WEBCAM_OPT_ ! videoconvert ! _SCREENCAST_RES_ _ENCODER_VIDEO_ ! mux. v4l2src _WEBCAM_DEV_ ! _WEBCAM_CAP_ ! videoscale ! video/x-raw, width=_WEBCAM_W_, height=_WEBCAM_H_, add-borders=false ! queue max-size-buffers=0 max-size-time=0 max-size-bytes=0 ! mix. pulsesrc ! audioconvert ! _ENCODER_AUDIO_ ! queue max-size-buffers=0 max-size-time=0 max-size-bytes=0 ! mux. _CONTAINER_ name=mux'; - -// @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ - -// CONST CONTAINER - WebM -const webmVP8 = { - fileExt: '.webm', - nameGSP: 'webmmux', - quality: [ - { - // quality level 0 - fps: 15, - vq: - 'vp8enc min_quantizer=13 max_quantizer=20 cpu-used=5 deadline=1000000 sharpness=2 target-bitrate=10000 threads=%T', - aq: 'vorbisenc', - descr: - 'FPS: 15 \nVideo -> VP8 Encoder:\n-min_quantizer=13\n-max_quantizer=20\n-cpu-used=5\n-deadline=1000000\n-sharpness=2\n-target-bitrate=10000\nAudio -> Vorbis Encoder', - }, - { - // quality level 1 - fps: 30, - vq: - 'vp8enc min_quantizer=4 max_quantizer=13 cpu-used=2 deadline=500000 sharpness=0 target-bitrate=15000 threads=%T', - aq: 'vorbisenc', - descr: - 'FPS: 30 \nVideo -> VP8 Encoder:\n-min_quantizer=4\n-max_quantizer=13\n-cpu-used=2\n-deadline=500000\n-sharpness=0\n-target-bitrate=15000\nAudio -> Vorbis Encoder', - }, - { - // quality level 2 - fps: 30, - vq: - 'vp8enc min_quantizer=0 max_quantizer=7 cpu-used=1 deadline=500000 sharpness=0 target-bitrate=25000 threads=%T', - aq: 'vorbisenc', - descr: - 'FPS: 30 \nVideo -> VP8 Encoder:\n-min_quantizer=0\n-max_quantizer=7\n-cpu-used=1\n-deadline=500000\n-sharpness=0\n-target-bitrate=25000\nAudio -> Vorbis Encoder', - }, - { - // quality level 3 - fps: 60, - vq: - 'vp8enc min_quantizer=0 max_quantizer=0 cpu-used=0 deadline=100000 sharpness=0 target-bitrate=40000 threads=%T', - aq: 'vorbisenc', - descr: - 'FPS: 60 \nVideo -> VP8 Encoder:\n-min_quantizer=0\n-max_quantizer=0\n-cpu-used=0\n-deadline=100000\n-sharpness=0\n-target-bitrate=40000\nAudio -> Vorbis Encoder', - }, - ], -}; - -const webmVP9 = { - fileExt: '.webm', - nameGSP: 'webmmux', - quality: [ - { - // quality level 0 - fps: 15, - vq: - 'vp9enc min_quantizer=13 max_quantizer=20 cpu-used=5 deadline=1000000 sharpness=2 target-bitrate=10000 threads=%T', - aq: 'vorbisenc', - descr: - 'FPS: 15 \nVideo -> VP9 Encoder:\n-min_quantizer=13\n-max_quantizer=20\n-cpu-used=5\n-deadline=1000000\n-sharpness=2\n-target-bitrate=10000\nAudio -> Vorbis Encoder', - }, - { - // quality level 1 - fps: 30, - vq: - 'vp9enc min_quantizer=4 max_quantizer=13 cpu-used=2 deadline=500000 sharpness=0 target-bitrate=15000 threads=%T', - aq: 'vorbisenc', - descr: - 'FPS: 30 \nVideo -> VP9 Encoder:\n-min_quantizer=4\n-max_quantizer=13\n-cpu-used=2\n-deadline=500000\n-sharpness=0\n-target-bitrate=15000\nAudio -> Vorbis Encoder', - }, - { - // quality level 2 - fps: 30, - vq: - 'vp9enc min_quantizer=0 max_quantizer=7 cpu-used=1 deadline=500000 sharpness=0 target-bitrate=25000 threads=%T', - aq: 'vorbisenc', - descr: - 'FPS: 30 \nVideo -> VP9 Encoder:\n-min_quantizer=0\n-max_quantizer=7\n-cpu-used=1\n-deadline=500000\n-sharpness=0\n-target-bitrate=25000\nAudio -> Vorbis Encoder', - }, - { - // quality level 3 - fps: 60, - vq: - 'vp9enc min_quantizer=0 max_quantizer=0 cpu-used=0 deadline=100000 sharpness=0 target-bitrate=40000 threads=%T', - aq: 'vorbisenc', - descr: - 'FPS: 60 \nVideo -> VP9 Encoder:\n-min_quantizer=0\n-max_quantizer=0\n-cpu-used=0\n-deadline=100000\n-sharpness=0\n-target-bitrate=40000\nAudio -> Vorbis Encoder', - }, - ], -}; - -// CONST CONTAINER - Mp4 -const mp4 = { - fileExt: '.mp4', - nameGSP: 'mp4mux', - quality: [ - { - // quality level 0 - fps: 15, - vq: - 'x264enc psy-tune="none" speed-preset="superfast" subme=1 qp-min=28 qp-max=40 threads=%T', - aq: 'lamemp3enc', - descr: - 'FPS: 15 \nVideo -> x264enc Encoder:\n-psy-tune="none"\n-speed-preset="superfast"\n-subme=1\n-qp-min=28\n-qp-max=40\nAudio -> Mp3 Encoder', - }, - { - // quality level 1 - fps: 30, - vq: - 'x264enc psy-tune="animation" speed-preset="fast" subme=5 qp-min=18 qp-max=28 threads=%T', - aq: 'lamemp3enc', - descr: - 'FPS: 30 \nVideo -> x264enc Encoder:\n-psy-tune="animation"\n-speed-preset="fast"\n-subme=5\n-qp-min=18\n-qp-max=28\nAudio -> Mp3 Encoder', - }, - { - // quality level 2 - fps: 30, - vq: - 'x264enc psy-tune="animation" speed-preset="medium" subme=8 qp-min=10 qp-max=18 threads=%T', - aq: 'lamemp3enc', - descr: - 'FPS: 30 \nVideo -> x264enc Encoder:\n-psy-tune="animation"\n-speed-preset="medium"\n-subme=8\n-qp-min=10\n-qp-max=18\nAudio -> Mp3 Encoder', - }, - { - // quality level 3 - fps: 60, - vq: - 'x264enc psy-tune="film" speed-preset="slower" subme=10 qp-min=0 qp-max=10 threads=%T', - aq: 'lamemp3enc', - descr: - 'FPS: 60 \nVideo -> x264enc Encoder:\n-psy-tune="film"\n-speed-preset="slower"\n-subme=10\n-qp-min=0\n-qp-max=10\nAudio -> Mp3 Encoder', - }, - ], -}; - -const mp4Aac = { - fileExt: '.mp4', - nameGSP: 'mp4mux', - quality: [ - { - // quality level 0 - fps: 15, - vq: - 'x264enc psy-tune="none" speed-preset="superfast" subme=1 qp-min=28 qp-max=40 threads=%T', - aq: 'avenc_aac', - descr: - 'FPS: 15 \nVideo -> x264enc Encoder:\n-psy-tune="none"\n-speed-preset="superfast"\n-subme=1\n-qp-min=28\n-qp-max=40\nAudio -> AAC Encoder', - }, - { - // quality level 1 - fps: 30, - vq: - 'x264enc psy-tune="animation" speed-preset="fast" subme=5 qp-min=18 qp-max=28 threads=%T', - aq: 'avenc_aac', - descr: - 'FPS: 30 \nVideo -> x264enc Encoder:\n-psy-tune="animation"\n-speed-preset="fast"\n-subme=5\n-qp-min=18\n-qp-max=28\nAudio -> AAC Encoder', - }, - { - // quality level 2 - fps: 30, - vq: - 'x264enc psy-tune="animation" speed-preset="medium" subme=8 qp-min=10 qp-max=18 threads=%T', - aq: 'avenc_aac', - descr: - 'FPS: 30 \nVideo -> x264enc Encoder:\n-psy-tune="animation"\n-speed-preset="medium"\n-subme=8\n-qp-min=10\n-qp-max=18\nAudio -> AAC Encoder', - }, - { - // quality level 3 - fps: 60, - vq: - 'x264enc psy-tune="film" speed-preset="slower" subme=10 qp-min=0 qp-max=10 threads=%T', - aq: 'avenc_aac', - descr: - 'FPS: 60 \nVideo -> x264enc Encoder:\n-psy-tune="film"\n-speed-preset="slower"\n-subme=10\n-qp-min=0\n-qp-max=10\nAudio -> AAC Encoder', - }, - ], -}; - -// CONST CONTAINER - Mkv -const mkv = { - fileExt: '.mkv', - nameGSP: 'matroskamux', - quality: [ - { - // quality level 0 - fps: 15, - vq: - 'x264enc psy-tune="none" speed-preset="superfast" subme=1 qp-min=28 qp-max=40 threads=%T', - aq: 'flacenc', - descr: - 'FPS: 15 \nVideo -> x264enc Encoder:\n-psy-tune="none"\n-speed-preset="superfast"\n-subme=1\n-qp-min=28\n-qp-max=40\nAudio -> Flac Encoder', - }, - { - // quality level 1 - fps: 30, - vq: - 'x264enc psy-tune="animation" speed-preset="fast" subme=5 qp-min=18 qp-max=28 threads=%T', - aq: 'flacenc', - descr: - 'FPS: 30 \nVideo -> x264enc Encoder:\n-psy-tune="animation"\n-speed-preset="fast"\n-subme=5\n-qp-min=18\n-qp-max=28\nAudio -> Flac Encoder', - }, - { - // quality level 2 - fps: 30, - vq: - 'x264enc psy-tune="animation" speed-preset="medium" subme=8 qp-min=10 qp-max=18 threads=%T', - aq: 'flacenc', - descr: - 'FPS: 30 \nVideo -> x264enc Encoder:\n-psy-tune="animation"\n-speed-preset="medium"\n-subme=8\n-qp-min=10\n-qp-max=18\nAudio -> Flac Encoder', - }, - { - // quality level 3 - fps: 60, - vq: - 'x264enc psy-tune="film" speed-preset="slower" subme=10 qp-min=0 qp-max=10 threads=%T', - aq: 'flacenc', - descr: - 'FPS: 60 \nVideo -> x264enc Encoder:\n-psy-tune="film"\n-speed-preset="slower"\n-subme=10\n-qp-min=0\n-qp-max=10\nAudio -> Flac Encoder', - }, - ], -}; - -// CONST CONTAINER - Ogg -const ogg = { - fileExt: '.ogg', - nameGSP: 'oggmux', - quality: [ - { - // quality level 0 - fps: 15, - vq: - 'theoraenc speed-level=3 vp3-compatible=true quality=10 bitrate=10000', - aq: 'opusenc', - descr: - 'FPS: 15 \nVideo -> Theora Encoder:\n-speed-level=3\n-vp3-compatible=true\n-quality=10\n-bitrate=10000\nAudio -> Opus Encoder', - }, - { - // quality level 1 - fps: 30, - vq: - 'theoraenc speed-level=1 vp3-compatible=false quality=30 bitrate=25000', - aq: 'opusenc', - descr: - 'FPS: 30 \nVideo -> Theora Encoder:\n-speed-level=1\n-vp3-compatible=false\n-quality=30\n-bitrate=25000\nAudio -> Opus Encoder', - }, - { - // quality level 2 - fps: 30, - vq: - 'theoraenc speed-level=0 vp3-compatible=false quality=50 bitrate=50000', - aq: 'opusenc', - descr: - 'FPS: 30 \nVideo -> Theora Encoder:\n-speed-level=0\n-vp3-compatible=false\n-quality=50\n-bitrate=50000\nAudio -> Opus Encoder', - }, - { - // quality level 3 - fps: 60, - vq: - 'theoraenc speed-level=0 vp3-compatible=false quality=60 bitrate=100000', - aq: 'opusenc', - descr: - 'FPS: 60 \nVideo -> Theora Encoder\n-speed-level=0\n-vp3-compatible=false\n-quality=60\n-bitrate=100000\nAudio -> Opus Encoder', - }, - ], -}; - -// @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ - -// CONST RESOLUTION -const RESOLUTION = [ - // NATIVE SCREENCAST RESOLUTION - '', - // PRESET/CUSTOM SCREENCAST RESOLUTION - 'videoscale ! video/x-raw, width=_RES_WIDTH_, height=_RES_HEIGHT_, add-borders=_RES_KAR_ ! ', -]; - -// @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ - -// VAR ARRAY CONTAINER -// see cbt_FileContainer in *.glade files for the combo box -const CONTAINER = [webmVP8, webmVP9, mp4, mkv, ogg, mp4Aac]; - -// @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ - -/** - * Compose GSP - * - * @param {EasyScreenCastSettings} settings the extension's settings - * @param {MixerAudio} mixer the mixer - * - * @returns {string} - */ -export function composeGSP(settings, mixer) { - Lib.TalkativeLog('-§-COMPOSE GSP'); - - let tmpGSP = ''; - - // retrieve options - let deviceWebcam = settings.getOption('s', Settings.DEVICE_WEBCAM_SETTING_KEY); - let deviceAudio = settings.getOption('i', Settings.INPUT_AUDIO_SOURCE_SETTING_KEY); - let qualityGSP = settings.getOption('i', Settings.QUALITY_SETTING_KEY); - let qualityWebcam = settings.getOption('s', Settings.QUALITY_WEBCAM_SETTING_KEY); - let resolutionType = settings.getOption('i', Settings.FILE_RESOLUTION_TYPE_SETTING_KEY); - let resolutionKAR = settings.getOption('b', Settings.FILE_RESOLUTION_KAR_SETTING_KEY); - let resolutionHeight = settings.getOption('i', Settings.FILE_RESOLUTION_HEIGHT_SETTING_KEY); - let resolutionWidth = settings.getOption('i', Settings.FILE_RESOLUTION_WIDTH_SETTING_KEY); - let container = settings.getOption('i', Settings.FILE_CONTAINER_SETTING_KEY); - - Lib.TalkativeLog( - `-§-get option||devW: ${deviceWebcam}||devA: ${deviceAudio}||Qgsp: ${qualityGSP}||Qwc: ${qualityWebcam}||Res: ${resolutionType}||Cont: ${container}` - ); - - if (deviceWebcam !== '') { - switch (deviceAudio) { - case 0: - Lib.TalkativeLog('-§- SCREEN-WEBCAM'); - - tmpGSP = SCREEN_WEBCAM; - - // replace WEBCAM_DEVICE/WEBCAM_CAPS - tmpGSP = _replaceWebcam( - tmpGSP, - deviceWebcam, - qualityWebcam, - settings - ); - - break; - case 1: - Lib.TalkativeLog('-§-SCREEN-WEBCAM-AUDIO(d)'); - - tmpGSP = SCREEN_WEBCAM_SOUND; - - // replace WEBCAM_DEVICE/WEBCAM_CAPS/ENCODER-AUDIO - tmpGSP = _replaceAudio( - _replaceWebcam(tmpGSP, deviceWebcam, qualityWebcam, settings), - true, - container, - qualityGSP, - mixer - ); - - break; - default: - Lib.TalkativeLog('-§-SCREEN-WEBCAM-AUDIO'); - - tmpGSP = SCREEN_WEBCAM_SOUND; - - // replace WEBCAM_DEVICE/WEBCAM_CAPS/ENCODER-AUDIO/AUDIO_DEVICE - tmpGSP = _replaceAudio( - _replaceWebcam(tmpGSP, deviceWebcam, qualityWebcam, settings), - false, - container, - qualityGSP, - mixer - ); - } - } else { - switch (deviceAudio) { - case 0: - Lib.TalkativeLog('-§-SCREEN'); - - tmpGSP = SCREEN; - - break; - case 1: - Lib.TalkativeLog('-§-SCREEN-AUDIO(d)'); - - tmpGSP = SCREEN_SOUND; - - // replace ENCODER-AUDIO - tmpGSP = _replaceAudio( - tmpGSP, - true, - container, - qualityGSP, - mixer - ); - - break; - default: - Lib.TalkativeLog('-§-SCREEN-AUDIO'); - - tmpGSP = SCREEN_SOUND; - - // replace ENCODER-AUDIO/AUDIO_DEVICE - tmpGSP = _replaceAudio( - tmpGSP, - false, - container, - qualityGSP, - mixer - ); - } - } - - // compose resolution string - var resolution = _composeResolution( - resolutionType, - resolutionHeight, - resolutionWidth, - resolutionKAR - ); - - // replace RESOLUTION/ENCODER-VIDEO/CONTAINER - var mapObj = { - _SCREENCAST_RES_: resolution, - _ENCODER_VIDEO_: CONTAINER[container].quality[qualityGSP].vq, - _CONTAINER_: CONTAINER[container].nameGSP, - }; - - tmpGSP = tmpGSP.replace( - /_SCREENCAST_RES_|_ENCODER_VIDEO_|_CONTAINER_/gi, - match => { - return mapObj[match]; - } - ); - - Lib.TalkativeLog(`-§-final GSP :${tmpGSP}`); - - return tmpGSP; -} - -/** - * replace audio - * - * @param {string} gspRA input pipeline to be modified - * @param {boolean} defaultAudio whether to use the default audio device - * @param {int} ConTMP selected output container. Used to determine correct audio encoder - * @param {int} QGSPtmp quality setting - * @param {MixerAudio} mixer audio mixer - * @returns {string} pipeline with audio - */ -function _replaceAudio(gspRA, defaultAudio, ConTMP, QGSPtmp, mixer) { - Lib.TalkativeLog(`-§-replace audio default->${defaultAudio}`); - // replace device/encoder - var aq = CONTAINER[ConTMP].quality[QGSPtmp].aq; - Lib.TalkativeLog(`-§-pipeline pre-audio:${gspRA} aq:${aq}`); - var audioPipeline; - - if (defaultAudio) { - Lib.TalkativeLog('-§-default audio source'); - audioPipeline = gspRA.replace(/_ENCODER_AUDIO_/gi, aq); - } else { - var audiosource = mixer.getAudioSource(); - if (audiosource === undefined) { - Lib.TalkativeLog('-§-failure combination of array audio sources'); - audioPipeline = gspRA.replace(/_ENCODER_AUDIO_/gi, aq); - } else { - Lib.TalkativeLog('-§-correct audio source assignment'); - if (audiosource.indexOf('output') !== -1) - audiosource += '.monitor'; - - var reDev = `pulsesrc device="${audiosource}"`; - - var mapObj = { - pulsesrc: reDev, - _ENCODER_AUDIO_: aq, - }; - - audioPipeline = gspRA.replace( - /pulsesrc|_ENCODER_AUDIO_/gi, - match => { - return mapObj[match]; - } - ); - } - } - - Lib.TalkativeLog(`-§-pipeline post-audio:${audioPipeline}`); - - return audioPipeline; -} - -/** - * replace webcam - * - * @param {string} gspRW input pipeline to be modified - * @param {string} device webcam device file (e.g. /dev/video0) - * @param {string} caps quality options - * @param {EasyScreenCastSettings} settings the extension's settings - * @returns {string} pipeline with webcam settings - */ -function _replaceWebcam(gspRW, device, caps, settings) { - Lib.TalkativeLog(`-§-replace webcam -> ${device} caps: ${caps}`); - - // replace device/caps - var reDev = `device=${device}`; - var reWCopt = _composeWebCamOption(settings); - var [reWCwidth, reWCheight] = _getWebCamDimension(settings); - - Lib.TalkativeLog(`-§-pipeline pre-webcam:${gspRW}`); - - var mapObj = { - _WEBCAM_DEV_: reDev, - _WEBCAM_CAP_: caps, - _WEBCAM_OPT_: reWCopt, - _WEBCAM_W_: reWCwidth, - _WEBCAM_H_: reWCheight, - }; - - var webcamPipeline = gspRW.replace( - /_WEBCAM_DEV_|_WEBCAM_CAP_|_WEBCAM_OPT_|_WEBCAM_W_|_WEBCAM_H_/gi, - match => { - return mapObj[match]; - } - ); - - Lib.TalkativeLog(`-§-pipeline post-webcam:${webcamPipeline}`); - - return webcamPipeline; -} - -/** - * replace resolution - * - * @param {int} tmpRes resolution type: native/custom - * @param {int} h custom height - * @param {int} w custom width - * @param {boolean} kar whether to keep aspect ratio - * @returns {string} pipeline part for scaling resolution - */ -function _composeResolution(tmpRes, h, w, kar) { - Lib.TalkativeLog(`-§-resolution option: ${tmpRes}`); - var strRes = RESOLUTION[0]; - var mapObj = {}; - - switch (tmpRes) { - case -1: - break; - case 999: - mapObj = { - _RES_KAR_: kar ? 'true' : 'false', - _RES_HEIGHT_: h, - _RES_WIDTH_: w, - }; - - strRes = RESOLUTION[1].replace( - /_RES_KAR_|_RES_HEIGHT_|_RES_WIDTH_/gi, - match => { - return mapObj[match]; - } - ); - break; - default: - mapObj = { - _RES_KAR_: 'true', - _RES_HEIGHT_: h, - _RES_WIDTH_: w, - }; - - strRes = RESOLUTION[1].replace( - /_RES_KAR_|_RES_WIDTH_|_RES_HEIGHT_/gi, - match => { - return mapObj[match]; - } - ); - } - - Lib.TalkativeLog(`-§-compose resolution: ${strRes}`); - return strRes; -} - -/** - * compose option webcam position - * - * @param {EasyScreenCastSettings} settings the extension's settings - * - * @returns {string} - */ -function _composeWebCamOption(settings) { - Lib.TalkativeLog('-§-compose webcam option'); - - // retrieve option webcam - var webcamAlpha = settings.getOption('d', Settings.ALPHA_CHANNEL_WEBCAM_SETTING_KEY); - var webcamMarginX = settings.getOption('i', Settings.MARGIN_X_WEBCAM_SETTING_KEY); - var webcamMarginY = settings.getOption('i', Settings.MARGIN_Y_WEBCAM_SETTING_KEY); - var webcamCornerPosition = settings.getOption('i', Settings.CORNER_POSITION_WEBCAM_SETTING_KEY); - var [webcamWidth, webcamHeight, screenWidth, screenHeight] = _getWebCamDimension(settings); - - var posX = 0; - var posY = 0; - - Lib.TalkativeLog( - `-§-alpha=${webcamAlpha} |marX=${webcamMarginX} |marY=${webcamMarginY} |corner=${webcamCornerPosition}` - ); - - // corner top-left - posX = webcamMarginX; - posY = webcamMarginY; - - switch (webcamCornerPosition) { - case 0: - // corner bottom-right - posX = Math.floor(screenWidth - (webcamWidth + webcamMarginX)); - posY = Math.floor(screenHeight - (webcamHeight + webcamMarginY)); - break; - case 1: - // corner bottom-left - posX = webcamMarginX; - posY = Math.floor(screenHeight - (webcamHeight + webcamMarginY)); - break; - case 2: - // corner top-right - posX = Math.floor(screenWidth - (webcamWidth + webcamMarginX)); - posY = webcamMarginY; - break; - default: - } - - // check valid position - if ((posX < 0 || posX > screenWidth) && (posY < 0 || posY > screenHeight)) { - Lib.TalkativeLog('-§-NOT valid position'); - posX = 0; - posY = 0; - } - - var tmpWCopt = - `sink_0::alpha=1 sink_1::alpha=${ - webcamAlpha - } sink_1::xpos=${ - posX - } sink_1::ypos=${ - posY - } `; - - Lib.TalkativeLog(`-§-posX=${posX} |posY=${posY}`); - Lib.TalkativeLog(`-§-webcam option=${tmpWCopt}`); - - return tmpWCopt; -} - -/** - * retrieve dimension webcam - * - * @param {EasyScreenCastSettings} settings the extension's settings - * - * @returns {*[]} array with webcam width,height,screen-width,screen-height - */ -function _getWebCamDimension(settings) { - Lib.TalkativeLog('-§-get webcam dimension'); - - var webcamWidth = settings.getOption('i', Settings.WIDTH_WEBCAM_SETTING_KEY); - var webcamHeight = settings.getOption('i', Settings.HEIGHT_WEBCAM_SETTING_KEY); - var webcamUnit = settings.getOption('i', Settings.TYPE_UNIT_WEBCAM_SETTING_KEY); - var screenWidth = settings.getOption('i', Settings.WIDTH_SETTING_KEY); - var screenHeight = settings.getOption('i', Settings.HEIGHT_SETTING_KEY); - - if (settings.getOption('i', Settings.AREA_SCREEN_SETTING_KEY) === 0) { - screenWidth = global.screen_width; - screenHeight = global.screen_height; - } - - Lib.TalkativeLog( - `-§-WC w=${webcamWidth} WC h=${webcamHeight} WCtype=${webcamUnit} screen W=${screenWidth} screen H=${screenHeight}` - ); - - if (webcamUnit === 0) { - webcamWidth = Math.floor((screenWidth * webcamWidth) / 100); - webcamHeight = Math.floor((screenHeight * webcamHeight) / 100); - } - - Lib.TalkativeLog(`-§-after percentage WCw=${webcamWidth} WCh=${webcamHeight}`); - - return [webcamWidth, webcamHeight, screenWidth, screenHeight]; -} - -/** - * get description - * - * @param {int} quality selected quality - * @param {int} container selected container format - * @returns {string} - */ -export function getDescr(quality, container) { - Lib.TalkativeLog(`-§-get description Q-> ${quality} C-> ${container}`); - - return CONTAINER[container].quality[quality].descr; -} - -/** - * get fps - * - * @param {int} quality selected quality - * @param {int} container selected container format - * @returns {number} - */ -export function getFps(quality, container) { - Lib.TalkativeLog(`-§-get fps Q-> ${quality} C-> ${container}`); - - return CONTAINER[container].quality[quality].fps; -} - -/** - * get file extension - * - * @param {int} container selected container format - * @returns {string} - */ -export function getFileExtension(container) { - Lib.TalkativeLog(`-§-get file extension C-> ${container}`); - - return CONTAINER[container].fileExt; -} diff --git a/gnome/.local/share/gnome-shell/extensions/EasyScreenCast@iacopodeenosee.gmail.com/utilnotify.js b/gnome/.local/share/gnome-shell/extensions/EasyScreenCast@iacopodeenosee.gmail.com/utilnotify.js deleted file mode 100644 index 90f41b0..0000000 --- a/gnome/.local/share/gnome-shell/extensions/EasyScreenCast@iacopodeenosee.gmail.com/utilnotify.js +++ /dev/null @@ -1,145 +0,0 @@ -/* - Copyright (C) 2016 Borsato Ivano - - The JavaScript code in this page is free software: you can - redistribute it and/or modify it under the terms of the GNU - General Public License (GNU GPL) as published by the Free Software - Foundation, either version 3 of the License, or (at your option) - any later version. The code is distributed WITHOUT ANY WARRANTY; - without even the implied warranty of MERCHANTABILITY or FITNESS - FOR A PARTICULAR PURPOSE. See the GNU GPL for more details. -*/ - -'use strict'; - -import GObject from 'gi://GObject'; -import * as Main from 'resource:///org/gnome/shell/ui/main.js'; -// https://gitlab.gnome.org/GNOME/gnome-shell/-/blob/main/js/ui/messageTray.js -import * as MessageTray from 'resource:///org/gnome/shell/ui/messageTray.js'; -import St from 'gi://St'; - -import * as Lib from './convenience.js'; -import * as Settings from './settings.js'; -import * as Ext from './extension.js'; - -import {gettext as _} from 'resource:///org/gnome/shell/extensions/extension.js'; - -/** - * @type {NotifyManager} - */ -export const NotifyManager = GObject.registerClass({ - GTypeName: 'EasyScreenCast_NotifyManager', -}, class NotifyManager extends GObject.Object { - /** - * Create a notify manager - */ - constructor() { - super(); - Lib.TalkativeLog('-°-init notify manager'); - this._alertWidget = null; - } - - /** - * create notify - * - * @param {string} msg the title - * @param {Gio.FileIcon} icon the icon - * @param {boolean} sound whether to play a sound - * @returns {MessageTray.Notification} - */ - createNotify(msg, icon, sound) { - Lib.TalkativeLog(`-°-create notify :${msg}`); - var source = new MessageTray.Source({ - title: _('EasyScreenCast'), - }); - var notify = new MessageTray.Notification({ - source, - title: msg, - body: null, - gicon: icon, - isTransient: false, - resident: true, - }); - - Main.messageTray.add(source); - source.addNotification(notify); - - if (sound) - notify.playSound(); - - return notify; - } - - /** - * update notify - * - * @param {MessageTray.Notification} notify the already existing notification to update - * @param {string} msg the title - * @param {Gio.FileIcon} icon the icon - * @param {boolean} sound whether to play a sound - */ - updateNotify(notify, msg, icon, sound) { - Lib.TalkativeLog('-°-update notify'); - - notify.set({ - title: msg, - body: null, - gicon: icon, - }); - - if (sound) - notify.playSound(); - } - - /** - * create alert - * - * @param {string} msg the message - */ - createAlert(msg) { - Lib.TalkativeLog(`-°-show alert tweener : ${msg}`); - if (Ext.Indicator.getSettings().getOption('b', Settings.SHOW_NOTIFY_ALERT_SETTING_KEY)) { - var monitor = Main.layoutManager.focusMonitor; - - this.resetAlert(); - this._alertWidget = new St.Label({ - style_class: 'alert-msg', - opacity: 255, - text: msg, - }); - Main.uiGroup.add_child(this._alertWidget); - - this._alertWidget.set_position( - Math.floor(monitor.width / 2 - this._alertWidget.width / 2), - Math.floor(monitor.height / 2 - this._alertWidget.height / 2) - ); - - Lib.TalkativeLog(`-°-show alert tweener : opacity=${this._alertWidget.opacity}`); - - // see org/gnome/shell/ui/environment.js#_easeActor - // TODO: for some reason, no transition is created, so the onComplete - // callback is called _immediately_ - /* - import Clutter from 'gi://Clutter'; - this._alertWidget.ease({ - opacity: 0, - duration: 400, - mode: Clutter.AnimationMode.EASE_OUT_QUAD, - onComplete: () => { - Lib.TalkativeLog(`-°-show alert tweener completed: opacity=${this._alertWidget.opacity}`); - Main.uiGroup.remove_child(this._alertWidget); - this._alertWidget = null; - }, - }); - */ - } - } - - resetAlert() { - if (this._alertWidget !== null) { - this._alertWidget.hide(); - Main.uiGroup.remove_child(this._alertWidget); - this._alertWidget = null; - } - } -}); diff --git a/gnome/.local/share/gnome-shell/extensions/EasyScreenCast@iacopodeenosee.gmail.com/utilrecorder.js b/gnome/.local/share/gnome-shell/extensions/EasyScreenCast@iacopodeenosee.gmail.com/utilrecorder.js deleted file mode 100644 index 6ab68e9..0000000 --- a/gnome/.local/share/gnome-shell/extensions/EasyScreenCast@iacopodeenosee.gmail.com/utilrecorder.js +++ /dev/null @@ -1,214 +0,0 @@ -/* - Copyright (C) 2013 Borsato Ivano - - The JavaScript code in this page is free software: you can - redistribute it and/or modify it under the terms of the GNU - General Public License (GNU GPL) as published by the Free Software - Foundation, either version 3 of the License, or (at your option) - any later version. The code is distributed WITHOUT ANY WARRANTY; - without even the implied warranty of MERCHANTABILITY or FITNESS - FOR A PARTICULAR PURPOSE. See the GNU GPL for more details. -*/ - -'use strict'; - -import GObject from 'gi://GObject'; -import Gio from 'gi://Gio'; -import GLib from 'gi://GLib'; -import {loadInterfaceXML} from 'resource:///org/gnome/shell/misc/dbusUtils.js'; -const ScreencastIface = loadInterfaceXML('org.gnome.Shell.Screencast'); - -import * as Lib from './convenience.js'; -import * as Settings from './settings.js'; -import * as Selection from './selection.js'; -import * as UtilGSP from './utilgsp.js'; -import * as Ext from './extension.js'; - -/** - * @type {CaptureVideo} - */ -export const CaptureVideo = GObject.registerClass({ - GTypeName: 'EasyScreenCast_CaptureVideo', -}, class CaptureVideo extends GObject.Object { - /** - * Create a video recorder - */ - constructor() { - super(); - Lib.TalkativeLog('-&-init recorder'); - - this.AreaSelected = null; - - // connect to d-bus service - const ScreenCastProxy = Gio.DBusProxy.makeProxyWrapper(ScreencastIface); - this._screenCastService = new ScreenCastProxy( - Gio.DBus.session, - 'org.gnome.Shell.Screencast', - '/org/gnome/Shell/Screencast', - (proxy, error) => { - if (error) - Lib.TalkativeLog(`-&-ERROR(d-bus proxy connected) - ${error.message}`); - else - Lib.TalkativeLog('-&-d-bus proxy connected'); - } - ); - } - - /** - * start recording - */ - start() { - Lib.TalkativeLog('-&-start video recording'); - this.recordingActive = false; - - let fileExt = UtilGSP.getFileExtension( - Ext.Indicator.getSettings().getOption('i', Settings.FILE_CONTAINER_SETTING_KEY) - ); - // prepare variable for screencast - let fileRec = Ext.Indicator.getSettings().getOption('s', Settings.FILE_NAME_SETTING_KEY); - - let folderRec = ''; - if (Ext.Indicator.getSettings().getOption('s', Settings.FILE_FOLDER_SETTING_KEY) !== '') - folderRec = Ext.Indicator.getSettings().getOption('s', Settings.FILE_FOLDER_SETTING_KEY); - - let pipelineRec = ''; - - if (Ext.Indicator.getSettings().getOption('b', Settings.ACTIVE_CUSTOM_GSP_SETTING_KEY)) { - pipelineRec = Ext.Indicator.getSettings().getOption( - 's', - Settings.PIPELINE_REC_SETTING_KEY - ); - } else { - // compose GSP - pipelineRec = UtilGSP.composeGSP(Ext.Indicator.getSettings(), Ext.Indicator.CtrlAudio); - } - - Lib.TalkativeLog(`-&-file template : ${fileRec}`); - fileRec = this._generateFileName(fileRec); - Lib.TalkativeLog(`-&-file final : ${fileRec}`); - const completeFileRecPath = folderRec !== '' - ? `${folderRec}/${fileRec}` - : fileRec; - Lib.TalkativeLog(`-&-file rec path complete : ${completeFileRecPath}${fileExt}`); - - // prefix with a videoconvert element - // see DEFAULT_PIPELINE in https://gitlab.gnome.org/GNOME/gnome-shell/-/blob/main/js/dbusServices/screencast/screencastService.js#L26 - // this videoconvert element was added always previously (< Gnome 40) and needs to be added now explicitly - // https://gitlab.gnome.org/GNOME/gnome-shell/-/commit/51bf7ec17617a9ed056dd563afdb98e17da07373 - pipelineRec = `videoconvert chroma-mode=GST_VIDEO_CHROMA_MODE_NONE dither=GST_VIDEO_DITHER_NONE matrix-mode=GST_VIDEO_MATRIX_MODE_OUTPUT_ONLY n-threads=%T ! queue ! ${pipelineRec}`; - Lib.TalkativeLog(`-&-pipeline : pipeline: ${pipelineRec}`); - - var optionsRec = { - 'draw-cursor': new GLib.Variant( - 'b', - Ext.Indicator.getSettings().getOption('b', Settings.DRAW_CURSOR_SETTING_KEY) - ), - framerate: new GLib.Variant( - 'i', - Ext.Indicator.getSettings().getOption('i', Settings.FPS_SETTING_KEY) - ), - pipeline: new GLib.Variant('s', pipelineRec), - }; - - if (Ext.Indicator.getSettings().getOption('i', Settings.AREA_SCREEN_SETTING_KEY) === 0) { - this._screenCastService.ScreencastRemote( - completeFileRecPath, - optionsRec, - (result, error) => { - if (error) { - Lib.TalkativeLog(`-&-ERROR(screencast execute) - ${error.message}`); - - this.stop(); - Ext.Indicator.doRecResult(false); - } else { - Lib.TalkativeLog(`-&-screencast execute - ${result[0]} - ${result[1]}`); - - let resultingFilePath = result[1]; - if (resultingFilePath.endsWith('.undefined')) { - resultingFilePath = resultingFilePath.substring(0, resultingFilePath.length - '.undefined'.length); - resultingFilePath = `${resultingFilePath}${fileExt}`; - } - this._originalFilePath = result[1]; - this._filePathWithExtension = resultingFilePath; - - Ext.Indicator.doRecResult(result[0], resultingFilePath); - } - } - ); - } else { - this._screenCastService.ScreencastAreaRemote( - Ext.Indicator.getSettings().getOption('i', Settings.X_POS_SETTING_KEY), - Ext.Indicator.getSettings().getOption('i', Settings.Y_POS_SETTING_KEY), - Ext.Indicator.getSettings().getOption('i', Settings.WIDTH_SETTING_KEY), - Ext.Indicator.getSettings().getOption('i', Settings.HEIGHT_SETTING_KEY), - completeFileRecPath, - optionsRec, - (result, error) => { - if (error) { - Lib.TalkativeLog(`-&-ERROR(screencast execute) - ${error.message}`); - - this.stop(); - Ext.Indicator.doRecResult(false); - } else { - Lib.TalkativeLog(`-&-screencast execute - ${result[0]} - ${result[1]}`); - - // draw area recording - if (Ext.Indicator.getSettings().getOption('b', Settings.SHOW_AREA_REC_SETTING_KEY)) - this.AreaSelected = new Selection.AreaRecording(); - - let resultingFilePath = result[1]; - if (resultingFilePath.endsWith('.undefined')) { - resultingFilePath = resultingFilePath.substring(0, resultingFilePath.length - '.undefined'.length); - resultingFilePath = `${resultingFilePath}${fileExt}`; - } - this._originalFilePath = result[1]; - this._filePathWithExtension = resultingFilePath; - - Ext.Indicator.doRecResult(result[0], resultingFilePath); - } - } - ); - } - } - - /** - * Stop recording - * - * @returns {boolean} - */ - stop() { - Lib.TalkativeLog('-&-stop video recording'); - - this._screenCastService.StopScreencastRemote((result, error) => { - if (error) { - Lib.TalkativeLog(`-&-ERROR(screencast stop) - ${error.message}`); - return false; - } else { - Lib.TalkativeLog(`-&-screencast stop - ${result[0]}`); - - - // rename the file... - Lib.TalkativeLog(`-&-screencast: rename ${this._originalFilePath} to ${this._filePathWithExtension}`); - const sourceFile = Gio.File.new_for_path(this._originalFilePath); - const destFile = Gio.File.new_for_path(this._filePathWithExtension); - sourceFile.move(destFile, 0, null, null); - } - - // clear area recording - if (this.AreaSelected !== null && this.AreaSelected.isVisible()) - this.AreaSelected.clearArea(); - - return true; - }); - } - - // without file extension - _generateFileName(template) { - template = template.replaceAll('%d', '%0x').replaceAll('%t', '%0X'); - const datetime = GLib.DateTime.new_now_local(); - let result = datetime.format(template); - result = result.replaceAll(' ', '_'); // remove white space - result = result.replaceAll('/', '_'); // remove path separators - return result; - } -}); diff --git a/gnome/.local/share/gnome-shell/extensions/EasyScreenCast@iacopodeenosee.gmail.com/utilwebcam.js b/gnome/.local/share/gnome-shell/extensions/EasyScreenCast@iacopodeenosee.gmail.com/utilwebcam.js deleted file mode 100644 index bdff6ff..0000000 --- a/gnome/.local/share/gnome-shell/extensions/EasyScreenCast@iacopodeenosee.gmail.com/utilwebcam.js +++ /dev/null @@ -1,326 +0,0 @@ -/* - Copyright (C) 2015 Borsato Ivano - - The JavaScript code in this page is free software: you can - redistribute it and/or modify it under the terms of the GNU - General Public License (GNU GPL) as published by the Free Software - Foundation, either version 3 of the License, or (at your option) - any later version. The code is distributed WITHOUT ANY WARRANTY; - without even the implied warranty of MERCHANTABILITY or FITNESS - FOR A PARTICULAR PURPOSE. See the GNU GPL for more details. -*/ - -'use strict'; - -import GObject from 'gi://GObject'; -import GLib from 'gi://GLib'; -import Gst from 'gi://Gst?version=1.0'; -import * as Lib from './convenience.js'; - -export const HelperWebcam = GObject.registerClass({ - GTypeName: 'EasyScreenCast_HelperWebcam', -}, class HelperWebcam extends GObject.Object { - /** - * Create a device monitor inputvideo - * - * @param {string} unspecifiedWebcamText localized text for "Unspecified Webcam" - */ - constructor(unspecifiedWebcamText) { - super(); - this._unspecified_webcam_text = unspecifiedWebcamText; - Lib.TalkativeLog('-@-init webcam'); - - var [result, _] = Gst.init_check(null); - Lib.TalkativeLog(`-@-gstreamer init result: ${result}`); - if (!result) { - Lib.TalkativeLog('-@-gstreamer init failed'); - throw new Error('GStreamer init failed'); - } - - // get gstreamer lib version - var [M, m, micro, nano] = Gst.version(); - Lib.TalkativeLog( - `-@-gstreamer version: ${M}.${m}.${micro}.${nano}` - ); - if (M === 1 && m >= 8) { - // gstreamer version equal or higher 1.8 - this.deviceMonitor = new Gst.DeviceMonitor({ - show_all: true, - }); - } else { - // gstreamer version lower 1.8 - this.deviceMonitor = new Gst.DeviceMonitor(); - } - - // get gstreamer plugin avaiable - let registry = new Gst.Registry(); - let listPI = registry.get_plugin_list(); - Lib.TalkativeLog(`-@-plugin list: ${listPI.length}`); - for (var ind in listPI) { - Lib.TalkativeLog( - `-@-plugin name: ${ - listPI[ind].get_name() - } Pfilename: ${ - listPI[ind].get_filename() - } Pdesc: ${ - listPI[ind].get_description() - } Pversion: ${ - listPI[ind].get_version() - } Pload: ${ - listPI[ind].is_loaded()}` - ); - } - - // create device monitor - if (this.deviceMonitor !== null && this.deviceMonitor !== undefined) { - Lib.TalkativeLog('-@-device monitor created'); - this.dmBus = this.deviceMonitor.get_bus(); - if (this.dmBus !== null && this.dmBus !== undefined) { - Lib.TalkativeLog('-@-dbus created'); - this.dmBus.add_watch(GLib.PRIORITY_DEFAULT, this._getMsg.bind(this)); - let caps = Gst.Caps.new_empty_simple('video/x-raw'); - this.deviceMonitor.add_filter('Video/Source', caps); - this.startMonitor(); - // update device and caps - this.refreshAllInputVideo(); - } else { - Lib.TalkativeLog('-@-ERROR dbus creation'); - } - } else { - Lib.TalkativeLog('-@-ERROR device monitor creation'); - } - } - - /** - * Callback for the DeviceMonitor watcher - * - * @param {Gst.Bus} bus the DeviceMonitor Bus of gstreamer - * @param {Gst.Message} message the message - * @returns {boolean} - */ - _getMsg(bus, message) { - Lib.TalkativeLog('-@-event getmsg'); - switch (message.type) { - case Gst.MessageType.DEVICE_ADDED: - Lib.TalkativeLog('Device added'); - - // update device and caps - this.refreshAllInputVideo(); - break; - case Gst.MessageType.DEVICE_REMOVED: - Lib.TalkativeLog('Device removed'); - - // update device and caps - this.refreshAllInputVideo(); - break; - default: - Lib.TalkativeLog('Device UNK'); - break; - } - - return GLib.SOURCE_CONTINUE; - } - - /** - * refresh all devices info - */ - refreshAllInputVideo() { - Lib.TalkativeLog('-@-refresh all video input'); - - this._listDevices = this.getDevicesIV(); - // compose devices array - this._listCaps = []; - for (var index in this._listDevices) { - this._listCaps[index] = this.getCapsForIV(this._listDevices[index].caps); - - Lib.TalkativeLog(`-@-webcam /dev/video${index} name: ${this._listDevices[index].display_name}`); - Lib.TalkativeLog(`-@-caps available: ${this._listCaps[index].length}`); - Lib.TalkativeLog(`-@-ListCaps[${index}]: ${this._listCaps[index]}`); - } - } - - /** - * get caps from device. - * A single capability might look like: video/x-raw, format=(string)YUY2, width=(int)640, height=(int)480, pixel-aspect-ratio=(fraction)1/1, framerate=(fraction)30/1 - * This encodes a single capability (fixed), but there might also be capabilities which represent options, e.g. - * video/x-raw, format=(string)YUY2, width=(int)640, height=(int)480, pixel-aspect-ratio=(fraction)1/1, framerate=(fraction) { 30/1, 25/1, 20/1 }. - *
- * The code here will take always the first option and unroll the options for framerate. - * - * @param {Gst.Caps} tmpCaps capabilities of a device - * @returns {string[]} - */ - getCapsForIV(tmpCaps) { - Lib.TalkativeLog('-@-get all caps from a input video'); - Lib.TalkativeLog(`-@-caps available before filtering for video/x-raw: ${tmpCaps.get_size()}`); - - let cleanCaps = []; - for (let i = 0; i < tmpCaps.get_size(); i++) { - let capsStructure = tmpCaps.get_structure(i); - - // only consider "video/x-raw" - if (capsStructure.get_name() === 'video/x-raw') { - Lib.TalkativeLog(`-@-cap : ${i} : original : ${capsStructure.to_string()}`); - - let tmpStr = 'video/x-raw'; - let result, number, fraction; - result = capsStructure.get_string('format'); - if (result !== null) - tmpStr += `, format=(string)${result}`; - [result, number] = capsStructure.get_int('width'); - if (result === true) - tmpStr += `, width=(int)${number}`; - [result, number] = capsStructure.get_int('height'); - if (result === true) - tmpStr += `, height=(int)${number}`; - [result, number, fraction] = capsStructure.get_fraction('pixel-aspect-ratio'); - if (result === true) - tmpStr += `, pixel-aspect-ratio=(fraction)${number}/${fraction}`; - - - if (capsStructure.has_field('framerate')) { - [result, number, fraction] = capsStructure.get_fraction('framerate'); - if (result === true) { - // a single framerate - this._addAndLogCapability(cleanCaps, i, `${tmpStr}, framerate=(fraction)${number}/${fraction}`); - } else { - // multiple framerates - - // unfortunately GstValueList is not supported in this gjs-binding - // "Error: Don't know how to convert GType GstValueList to JavaScript object" - // -> capsStructure.get_value('framerate') <- won't work - // -> capsStructure.get_list('framerate') <- only returns the numerator of the fraction - // - // therefore manually parsing the framerate values from the string representation - let framerates = capsStructure.to_string(); - framerates = framerates.substring(framerates.indexOf('framerate=(fraction){') + 21); - framerates = framerates.substring(0, framerates.indexOf('}')); - framerates.split(',').forEach(element => { - let [numerator, denominator] = element.split('/', 2); - this._addAndLogCapability(cleanCaps, i, `${tmpStr}, framerate=(fraction)${numerator.trim()}/${denominator.trim()}`); - }); - } - } else { - // no framerate at all - this._addAndLogCapability(cleanCaps, i, tmpStr); - } - } else { - Lib.TalkativeLog(`-@-cap : ${i} : skipped : ${capsStructure.to_string()}`); - } - } - return cleanCaps; - } - - /** - * Adds the capability str to the array caps, if it is not already there. Avoids duplicates. - * - * @param {Array} caps the list of capabilities - * @param {int} originalIndex index of the original capabilities list from the device - * @param {string} str the capability string to add - */ - _addAndLogCapability(caps, originalIndex, str) { - if (caps.indexOf(str) === -1) { - caps.push(str); - Lib.TalkativeLog(`-@-cap : ${originalIndex} : added cap : ${str}`); - } else { - Lib.TalkativeLog(`-@-cap : ${originalIndex} : ignore duplicated cap : ${str}`); - } - } - - /** - * get devices IV - * - * @returns {Gst.Device[]} - */ - getDevicesIV() { - Lib.TalkativeLog('-@-get devices'); - - var list = this.deviceMonitor.get_devices(); - Lib.TalkativeLog(`-@-devices number: ${list.length}`); - - // Note: - // Although the computer may have just one webcam connected to - // it, more than one GstDevice may be listed and all pointing to - // the same video device (for example /dev/video0. Each - // GstDevice is supposed to be used with a specific source, for - // example, a pipewiresrc or a v4l2src. For now, we are only - // using v4l2src. - // See also: Gst.DeviceMonitor.get_providers: pipewiredeviceprovider,decklinkdeviceprovider,v4l2deviceprovider - // CLI: "/usr/bin/gst-device-monitor-1.0 Video/Source" - // - // So, here we filter the devices, that have a device.path property, which - // means, these are only v4l2 devices - - var filtered = list.filter(device => { - let props = device.get_properties(); - let hasDevice = props != null && props.get_string('device.path') !== null; - if (props != null) - props.free(); - return hasDevice; - }); - Lib.TalkativeLog(`-@-devices number after filtering for v4l2: ${filtered.length}`); - - return filtered; - } - - /** - * get array name devices IV - * - * @returns {Array} - */ - getNameDevices() { - Lib.TalkativeLog('-@-get name devices'); - let tmpArray = []; - - for (var index in this._listDevices) { - var wcName = this._unspecified_webcam_text; - - if (this._listDevices[index].display_name !== '') - wcName = this._listDevices[index].display_name; - - tmpArray.push(wcName); - } - - Lib.TalkativeLog(`-@-list devices name: ${tmpArray}`); - return tmpArray; - } - - /** - * get array caps - * - * @param {int} index device - * @returns {string[]} - */ - getListCapsDevice(index) { - const tmpArray = this._listCaps[index]; - Lib.TalkativeLog(`-@-list caps of device: ${tmpArray}`); - return tmpArray; - } - - /** - * start listening - */ - startMonitor() { - Lib.TalkativeLog('-@-start video devicemonitor'); - this.deviceMonitor.start(); - } - - /** - * Stop listening - */ - stopMonitor() { - Lib.TalkativeLog('-@-stop video devicemonitor'); - this.disconnectSourceBus(); - this.deviceMonitor.stop(); - } - - /** - * disconect bus - */ - disconnectSourceBus() { - if (this.dmBusId) { - this.dmBus.disconnect(this.dmBusId); - this.dmBusId = 0; - } - } -}); diff --git a/gnome/.local/share/gnome-shell/extensions/Vitals@CoreCoding.com/locale/fr/LC_MESSAGES/vitals.mo b/gnome/.local/share/gnome-shell/extensions/Vitals@CoreCoding.com/locale/fr/LC_MESSAGES/vitals.mo index 5eb2d78..1260f3d 100644 Binary files a/gnome/.local/share/gnome-shell/extensions/Vitals@CoreCoding.com/locale/fr/LC_MESSAGES/vitals.mo and b/gnome/.local/share/gnome-shell/extensions/Vitals@CoreCoding.com/locale/fr/LC_MESSAGES/vitals.mo differ diff --git a/gnome/.local/share/gnome-shell/extensions/Vitals@CoreCoding.com/metadata.json b/gnome/.local/share/gnome-shell/extensions/Vitals@CoreCoding.com/metadata.json index bef804f..47a1c75 100644 --- a/gnome/.local/share/gnome-shell/extensions/Vitals@CoreCoding.com/metadata.json +++ b/gnome/.local/share/gnome-shell/extensions/Vitals@CoreCoding.com/metadata.json @@ -11,9 +11,10 @@ "45", "46", "47", - "48" + "48", + "49" ], "url": "https://github.com/corecoding/Vitals", "uuid": "Vitals@CoreCoding.com", - "version": 71 + "version": 73 } \ No newline at end of file diff --git a/gnome/.local/share/gnome-shell/extensions/Vitals@CoreCoding.com/sensors.js b/gnome/.local/share/gnome-shell/extensions/Vitals@CoreCoding.com/sensors.js index fa49d41..f310161 100644 --- a/gnome/.local/share/gnome-shell/extensions/Vitals@CoreCoding.com/sensors.js +++ b/gnome/.local/share/gnome-shell/extensions/Vitals@CoreCoding.com/sensors.js @@ -230,16 +230,20 @@ export const Sensors = GObject.registerClass({ let hertz = (sum / freqs.length) * 1000 * 1000; this._returnValue(callback, 'Frequency', hertz, 'processor', 'hertz'); - //let max_hertz = Math.getMaxOfArray(freqs) * 1000 * 1000; - //this._returnValue(callback, 'Boost', max_hertz, 'processor', 'hertz'); + let max_hertz = freqs.reduce((a, b) => Math.max(a, b)) * 1000 * 1000; + this._returnValue(callback, 'Max frequency', max_hertz, 'processor', 'hertz'); + let min_hertz = freqs.reduce((a, b) => Math.min(a, b)) * 1000 * 1000; + this._returnValue(callback, 'Min frequency', min_hertz, 'processor', 'hertz'); }).catch(err => { }); // if frequency scaling is enabled, cpu-freq reports } else if (Object.values(this._last_processor['speed']).length > 0) { let sum = this._last_processor['speed'].reduce((a, b) => a + b); let hertz = (sum / this._last_processor['speed'].length) * 1000; this._returnValue(callback, 'Frequency', hertz, 'processor', 'hertz'); - //let max_hertz = Math.getMaxOfArray(this._last_processor['speed']) * 1000; - //this._returnValue(callback, 'Boost', max_hertz, 'processor', 'hertz'); + let max_hertz = this._last_processor['speed'].reduce((a, b) => Math.max(a, b)) * 1000; + this._returnValue(callback, 'Max frequency', max_hertz, 'processor', 'hertz'); + let min_hertz = this._last_processor['speed'].reduce((a, b) => Math.min(a, b)) * 1000; + this._returnValue(callback, 'Min frequency', min_hertz, 'processor', 'hertz'); } } @@ -455,7 +459,7 @@ export const Sensors = GObject.registerClass({ this._returnValue(callback, 'Energy (now)', output['ENERGY_NOW'], 'battery', 'watt-hour'); } - if ('ENERGY_FULL' in output && 'ENERGY_NOW' in output && 'POWER_NOW' in output && output['POWER_NOW'] > 0 && 'STATUS' in output && (output['STATUS'] == 'Charging' || output['STATUS'] == 'Discharging')) { + if ('ENERGY_FULL' in output && 'ENERGY_NOW' in output && 'POWER_NOW' in output && output['POWER_NOW'] !== 0 && 'STATUS' in output && (output['STATUS'] == 'Charging' || output['STATUS'] == 'Discharging')) { let timeLeft = 0; @@ -463,7 +467,7 @@ export const Sensors = GObject.registerClass({ if (output['STATUS'] == 'Charging') { timeLeft = ((output['ENERGY_FULL'] - output['ENERGY_NOW']) / output['POWER_NOW']); } else { - timeLeft = (output['ENERGY_NOW'] / output['POWER_NOW']); + timeLeft = (output['ENERGY_NOW'] / Math.abs(output['POWER_NOW'])); } // don't process Infinity values @@ -644,7 +648,7 @@ export const Sensors = GObject.registerClass({ if(vendor === "0x1002") { // read GPU usage and create group lebel for card new FileModule.File('/sys/class/drm/card'+i+'/device/gpu_busy_percent').read().then(value => { - // create group + // create group this._returnGpuValue(callback, 'Graphics', parseInt(value) * 0.01, typeName + '-group', 'percent'); this._returnGpuValue(callback, 'Vendor', "AMD", typeName, 'string'); this._returnGpuValue(callback, 'Usage', parseInt(value) * 0.01, typeName, 'percent'); diff --git a/gnome/.local/share/gnome-shell/extensions/appindicatorsupport@rgcjonas.gmail.com/icons/hicolor/scalable/actions/custom-icons-symbolic.svg b/gnome/.local/share/gnome-shell/extensions/appindicatorsupport@rgcjonas.gmail.com/icons/hicolor/scalable/actions/custom-icons-symbolic.svg new file mode 100644 index 0000000..bfc3698 --- /dev/null +++ b/gnome/.local/share/gnome-shell/extensions/appindicatorsupport@rgcjonas.gmail.com/icons/hicolor/scalable/actions/custom-icons-symbolic.svg @@ -0,0 +1,46 @@ + + + + + + + + + + diff --git a/gnome/.local/share/gnome-shell/extensions/appindicatorsupport@rgcjonas.gmail.com/icons/hicolor/scalable/actions/general-preferences-symbolic.svg b/gnome/.local/share/gnome-shell/extensions/appindicatorsupport@rgcjonas.gmail.com/icons/hicolor/scalable/actions/general-preferences-symbolic.svg new file mode 100644 index 0000000..6334430 --- /dev/null +++ b/gnome/.local/share/gnome-shell/extensions/appindicatorsupport@rgcjonas.gmail.com/icons/hicolor/scalable/actions/general-preferences-symbolic.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/gnome/.local/share/gnome-shell/extensions/appindicatorsupport@rgcjonas.gmail.com/locale/ar/LC_MESSAGES/AppIndicatorExtension.mo b/gnome/.local/share/gnome-shell/extensions/appindicatorsupport@rgcjonas.gmail.com/locale/ar/LC_MESSAGES/AppIndicatorExtension.mo new file mode 100644 index 0000000..6c73616 Binary files /dev/null and b/gnome/.local/share/gnome-shell/extensions/appindicatorsupport@rgcjonas.gmail.com/locale/ar/LC_MESSAGES/AppIndicatorExtension.mo differ diff --git a/gnome/.local/share/gnome-shell/extensions/appindicatorsupport@rgcjonas.gmail.com/locale/cs/LC_MESSAGES/AppIndicatorExtension.mo b/gnome/.local/share/gnome-shell/extensions/appindicatorsupport@rgcjonas.gmail.com/locale/cs/LC_MESSAGES/AppIndicatorExtension.mo index 93c4c6d..4cedb41 100644 Binary files a/gnome/.local/share/gnome-shell/extensions/appindicatorsupport@rgcjonas.gmail.com/locale/cs/LC_MESSAGES/AppIndicatorExtension.mo and b/gnome/.local/share/gnome-shell/extensions/appindicatorsupport@rgcjonas.gmail.com/locale/cs/LC_MESSAGES/AppIndicatorExtension.mo differ diff --git a/gnome/.local/share/gnome-shell/extensions/appindicatorsupport@rgcjonas.gmail.com/locale/ka/LC_MESSAGES/AppIndicatorExtension.mo b/gnome/.local/share/gnome-shell/extensions/appindicatorsupport@rgcjonas.gmail.com/locale/ka/LC_MESSAGES/AppIndicatorExtension.mo new file mode 100644 index 0000000..0773c28 Binary files /dev/null and b/gnome/.local/share/gnome-shell/extensions/appindicatorsupport@rgcjonas.gmail.com/locale/ka/LC_MESSAGES/AppIndicatorExtension.mo differ diff --git a/gnome/.local/share/gnome-shell/extensions/appindicatorsupport@rgcjonas.gmail.com/locale/ru/LC_MESSAGES/AppIndicatorExtension.mo b/gnome/.local/share/gnome-shell/extensions/appindicatorsupport@rgcjonas.gmail.com/locale/ru/LC_MESSAGES/AppIndicatorExtension.mo index 46e5781..b4dfbe5 100644 Binary files a/gnome/.local/share/gnome-shell/extensions/appindicatorsupport@rgcjonas.gmail.com/locale/ru/LC_MESSAGES/AppIndicatorExtension.mo and b/gnome/.local/share/gnome-shell/extensions/appindicatorsupport@rgcjonas.gmail.com/locale/ru/LC_MESSAGES/AppIndicatorExtension.mo differ diff --git a/gnome/.local/share/gnome-shell/extensions/appindicatorsupport@rgcjonas.gmail.com/metadata.json b/gnome/.local/share/gnome-shell/extensions/appindicatorsupport@rgcjonas.gmail.com/metadata.json index 898dc6c..15be423 100644 --- a/gnome/.local/share/gnome-shell/extensions/appindicatorsupport@rgcjonas.gmail.com/metadata.json +++ b/gnome/.local/share/gnome-shell/extensions/appindicatorsupport@rgcjonas.gmail.com/metadata.json @@ -8,9 +8,10 @@ "45", "46", "47", - "48" + "48", + "49" ], "url": "https://github.com/ubuntu/gnome-shell-extension-appindicator", "uuid": "appindicatorsupport@rgcjonas.gmail.com", - "version": 60 + "version": 61 } \ No newline at end of file diff --git a/gnome/.local/share/gnome-shell/extensions/appindicatorsupport@rgcjonas.gmail.com/preferences/customIconPage.js b/gnome/.local/share/gnome-shell/extensions/appindicatorsupport@rgcjonas.gmail.com/preferences/customIconPage.js new file mode 100644 index 0000000..b132562 --- /dev/null +++ b/gnome/.local/share/gnome-shell/extensions/appindicatorsupport@rgcjonas.gmail.com/preferences/customIconPage.js @@ -0,0 +1,240 @@ +/* exported GeneralPage*/ + +import Adw from 'gi://Adw'; +import Gtk from 'gi://Gtk'; +import GObject from 'gi://GObject'; +import Gio from 'gi://Gio'; +import GLib from 'gi://GLib'; +import {gettext as _} from 'resource:///org/gnome/Shell/Extensions/js/extensions/prefs.js'; + +const IconData = GObject.registerClass({ + GTypeName: 'IconData', + Properties: { + 'id': GObject.ParamSpec.string( + 'id', + 'Id', + 'A read and write string property', + GObject.ParamFlags.READWRITE, + '' + ), + 'name': GObject.ParamSpec.string( + 'name', + 'Name', + 'A read and write string property', + GObject.ParamFlags.READWRITE, + '' + ), + 'at-name': GObject.ParamSpec.string( + 'at-name', + 'At Name', + 'A read and write string property', + GObject.ParamFlags.READWRITE, + '' + ), + + }, +}, class IconData extends GObject.Object { + constructor(props = {}) { + super(props); + } + + get id() { + if (this._id === 'undefined') + this._id = null; + return this._id; + } + + set id(value) { + if (this.id === value) + return; + + this._id = value; + this.notify('id'); + } + + get name() { + if (this._name === 'undefined') + this._name = null; + return this._name; + } + + set name(value) { + if (this.name === value) + return; + + this._name = value; + this.notify('name'); + } + + get atName() { + if (this._atName === 'undefined') + this._atName = null; + return this._atName; + } + + set atName(value) { + if (this.atName === value) + return; + + this._atName = value; + this.notify('at-name'); + } +}); + +export var CustomIconPage = GObject.registerClass( +class AppIndicatorCustomIconPage extends Adw.PreferencesPage { + _init(settings, settingsKey) { + super._init({ + title: _('Custom Icons'), + icon_name: 'custom-icons-symbolic', + name: 'Custom Icons Page', + }); + this._settings = settings; + this._settingsKey = settingsKey; + + this.group = new Adw.PreferencesGroup(); + + this.container = new Gtk.Box({ + halign: Gtk.Align.FILL, + hexpand: true, + orientation: Gtk.Orientation.VERTICAL, + }); + + this.listStore = new Gio.ListStore({ + item_type: IconData, + }); + + const initList = this._settings.get_value(this._settingsKey.CUSTOM_ICONS).deep_unpack(); + initList.forEach(pair => { + let data = new IconData({ + id: pair[0], + name: pair[1], + atName: pair[2], + }); + this.listStore.append(data); + }); + + this.listStore.append(new IconData({id: '', name: '', atName: ''})); + + this.selectionModel = new Gtk.SingleSelection({ + model: this.listStore, + }); + + this.columnView = new Gtk.ColumnView({ + hexpand: true, + model: this.selectionModel, + reorderable: false, + }); + + const columnTitles = [ + _('Indicator ID'), + _('Icon Name'), + _('Attention Icon Name'), + ]; + const indicatorIdColumn = new Gtk.ColumnViewColumn({ + title: columnTitles[0], + expand: true, + }); + const iconNameColumn = new Gtk.ColumnViewColumn({ + title: columnTitles[1], + expand: true, + }); + const attentionIconNameColumn = new Gtk.ColumnViewColumn({ + title: columnTitles[2], + expand: true, + }); + + + const factoryId = new Gtk.SignalListItemFactory(); + factoryId.connect('setup', (_widget, item) => { + const label = new Gtk.EditableLabel({text: ''}); + item.set_child(label); + }); + factoryId.connect('bind', (_widget, item) => { + const label = item.get_child(); + const data = item.get_item(); + label.set_text(data.id); + label.bind_property('text', data, 'id', GObject.BindingFlags.SYNC_CREATE); + label.connect('changed', () => this._autoSave(item)); + }); + + const factoryName = new Gtk.SignalListItemFactory(); + factoryName.connect('setup', (_widget, item) => { + const label = new Gtk.EditableLabel({text: ''}); + item.set_child(label); + }); + factoryName.connect('bind', (_widget, item) => { + const label = item.get_child(); + const data = item.get_item(); + label.set_text(data.name); + label.bind_property('text', data, 'name', GObject.BindingFlags.SYNC_CREATE); + label.connect('changed', () => this._autoSave(item)); + }); + + const factoryItName = new Gtk.SignalListItemFactory(); + factoryItName.connect('setup', (_widget, item) => { + const label = new Gtk.EditableLabel({text: ''}); + item.set_child(label); + }); + factoryItName.connect('bind', (_widget, item) => { + const label = item.get_child(); + const data = item.get_item(); + label.set_text(data.atName); + label.bind_property('text', data, 'at-name', GObject.BindingFlags.SYNC_CREATE); + label.connect('changed', () => this._autoSave(item)); + }); + + indicatorIdColumn.set_factory(factoryId); + iconNameColumn.set_factory(factoryName); + attentionIconNameColumn.set_factory(factoryItName); + + this.columnView.append_column(indicatorIdColumn); + this.columnView.append_column(iconNameColumn); + this.columnView.append_column(attentionIconNameColumn); + + this.container.append(this.columnView); + + this.group.add(this.container); + this.add(this.group); + } + + _autoSave(item) { + const storeLength = this.listStore.get_n_items(); + const newStore = []; + + for (let i = 0; i < storeLength; i++) { + const currentItem = this.listStore.get_item(i); + const id = currentItem.id; + const name = currentItem.name; + const atName = currentItem.atName; + if (id && name) + newStore.push([id, name, atName || '']); + } + + this._settings.set_value(this._settingsKey.CUSTOM_ICONS, + new GLib.Variant('a(sss)', newStore)); + + const id = item.get_item().id; + const name = item.get_item().name; + + /* dynamic new entry*/ + if (storeLength === 1 && (id || name)) + this.listStore.append(new IconData({id: '', name: '', atName: ''})); + + if (storeLength > 1) { + if ((id || name) && item.get_position() >= storeLength - 1) + this.listStore.append(new IconData({id: '', name: '', atName: ''})); + } + } + + _autoDelete(item) { + const storeLength = this.listStore.get_n_items(); + const id = item.get_item().id; + const name = item.get_item().name; + if (storeLength > 1 && !id && !name && + item.get_position() < storeLength - 1) + this.listStore.remove(item.get_position()); + } +}); + + diff --git a/gnome/.local/share/gnome-shell/extensions/appindicatorsupport@rgcjonas.gmail.com/preferences/generalPage.js b/gnome/.local/share/gnome-shell/extensions/appindicatorsupport@rgcjonas.gmail.com/preferences/generalPage.js new file mode 100644 index 0000000..d699141 --- /dev/null +++ b/gnome/.local/share/gnome-shell/extensions/appindicatorsupport@rgcjonas.gmail.com/preferences/generalPage.js @@ -0,0 +1,141 @@ +/* exported GeneralPage*/ + +import Adw from 'gi://Adw'; +import Gtk from 'gi://Gtk'; +import GObject from 'gi://GObject'; +import {gettext as _} from 'resource:///org/gnome/Shell/Extensions/js/extensions/prefs.js'; + + +export var GeneralPage = GObject.registerClass( +class AppIndicatorGeneralPage extends Adw.PreferencesPage { + _init(settings, settingsKey) { + super._init({ + title: _('General'), + icon_name: 'general-preferences-symbolic', + name: 'General Page', + }); + + this._settings = settings; + this._settingsKey = settingsKey; + + this.group = new Adw.PreferencesGroup(); // no title since only single group + + const legacyTraySwitch = new Adw.SwitchRow({ + title: _('Enable Legacy Tray Icons support'), + subtitle: _('Add X11 legacy tray icons to the panel area'), + active: this._settings.get_boolean(this._settingsKey.LEGACY_TRAY_ENABLED), + }); + + legacyTraySwitch.connect('notify::active', widget => + this._settings.set_boolean(this._settingsKey.LEGACY_TRAY_ENABLED, + widget.get_active())); + + this.group.add(legacyTraySwitch); + + this._createSpinRow({ + title: _('Opacity'), + settingsKey: this._settingsKey.ICON_OPACITY, + from: 0, + to: 255, + step: 1, + round: true, + }); + + this._createSpinRow({ + title: _('Desaturation'), + settingsKey: this._settingsKey.ICON_SATURATION, + from: 0.0, + to: 1.0, + step: 0.1, + }); + + this._createSpinRow({ + title: _('Brightness'), + settingsKey: this._settingsKey.ICON_BRIGHTNESS, + from: -1.0, + to: 1.0, + step: 0.1, + }); + + this._createSpinRow({ + title: _('Contrast'), + settingsKey: this._settingsKey.ICON_CONTRAST, + from: -1.0, + to: 1.0, + step: 0.1, + }); + + this._createSpinRow({ + title: _('Icon Size'), + settingsKey: this._settingsKey.ICON_SIZE, + from: 0, + to: 96, + step: 2, + round: true, + }); + + const alignmentList = new Gtk.StringList(); + const comboItems = [ + {pos: 'center', label: _('Center')}, + {pos: 'left', label: _('Left')}, + {pos: 'right', label: _('Right')}, + ]; + + comboItems.forEach(item => alignmentList.append(item.label)); + + const combo = new Adw.ComboRow({ + title: _('Tray Horizontal Alignment'), + model: alignmentList, + }); + const trayPos = this._settings.get_string(this._settingsKey.TRAY_POS); + combo.set_selected(comboItems.findIndex(item => trayPos === item.pos)); + + combo.connect('notify::selected', widget => this._settings.set_string( + this._settingsKey.TRAY_POS, comboItems[widget.get_selected()].pos)); + + this.group.add(combo); + this.add(this.group); + } + + _createSpinRow(args) { + let title = args.title || 'Default Title'; + let subtitle = args.subtitle || null; + let settingsKey = args.settingsKey || ''; + let from = args.from || 0; + let to = args.to || 100; + let step = args.step || 1; + let round = args.round || false; + + let spin = Adw.SpinRow.new_with_range(from, to, step); + spin.title = title; + if (subtitle !== null) + spin.subtitle = subtitle; + + if (round) + spin.set_value(this._settings.get_int(settingsKey)); + else + spin.set_value(this._settings.get_int(settingsKey)); + + + spin.connect('input', widget => { + if (round) + this._settings.set_int(settingsKey, parseInt(widget.get_value(), 10)); + else + this._settings.set_double(settingsKey, widget.get_value()); + + return false; + }); + spin.connect('output', widget => { + if (round) + this._settings.set_int(settingsKey, parseInt(widget.get_value(), 10)); + else + this._settings.set_double(settingsKey, widget.get_value()); + + return false; + }); + + this.group.add(spin); + } +}); + + diff --git a/gnome/.local/share/gnome-shell/extensions/auto-activities@CleoMenezesJr.github.io/metadata.json b/gnome/.local/share/gnome-shell/extensions/auto-activities@CleoMenezesJr.github.io/metadata.json index d65512b..22f6ffd 100644 --- a/gnome/.local/share/gnome-shell/extensions/auto-activities@CleoMenezesJr.github.io/metadata.json +++ b/gnome/.local/share/gnome-shell/extensions/auto-activities@CleoMenezesJr.github.io/metadata.json @@ -11,10 +11,10 @@ "original-author": "mi-jan-sena@proton.me", "settings-schema": "org.gnome.shell.extensions.auto-activities", "shell-version": [ - "48" + "49" ], "url": "https://github.com/CleoMenezesJr/auto-activities", "uuid": "auto-activities@CleoMenezesJr.github.io", - "version": 15, - "version-name": "48.0" + "version": 16, + "version-name": "49.0" } \ No newline at end of file diff --git a/gnome/.local/share/gnome-shell/extensions/blur-my-shell@aunetx/components/panel.js b/gnome/.local/share/gnome-shell/extensions/blur-my-shell@aunetx/components/panel.js index 4562106..a78317c 100644 --- a/gnome/.local/share/gnome-shell/extensions/blur-my-shell@aunetx/components/panel.js +++ b/gnome/.local/share/gnome-shell/extensions/blur-my-shell@aunetx/components/panel.js @@ -1,4 +1,5 @@ import St from 'gi://St'; +import GLib from 'gi://GLib'; import Meta from 'gi://Meta'; import * as Main from 'resource:///org/gnome/shell/ui/main.js'; @@ -83,23 +84,34 @@ export const PanelBlur = class PanelBlur { } blur_dtp_panels() { - // FIXME when Dash to Panel changes its size, it seems it creates new - // panels; but I can't get to delete old widgets - - // blur every panel found - global.dashToPanel.panels.forEach(p => { - this.maybe_blur_panel(p.panel); + // Defer the blurring to the next idle cycle. + // This is crucial to ensure the panel actors have been allocated their + // final size and position by the compositor, avoiding race conditions + // during extension startup. + GLib.idle_add(GLib.PRIORITY_DEFAULT_IDLE, () => { + if (!global.dashToPanel?.panels) { + return GLib.SOURCE_REMOVE; + } + + this._log("Blurring Dash to Panel panels after idle."); + + // blur every panel found + global.dashToPanel.panels.forEach(p => { + this.maybe_blur_panel(p.panel); + }); + + // if main panel is not included in the previous panels, blur it + if ( + !global.dashToPanel.panels + .map(p => p.panel) + .includes(Main.panel) + && + this.settings.dash_to_panel.BLUR_ORIGINAL_PANEL + ) + this.maybe_blur_panel(Main.panel); + + return GLib.SOURCE_REMOVE; }); - - // if main panel is not included in the previous panels, blur it - if ( - !global.dashToPanel.panels - .map(p => p.panel) - .includes(Main.panel) - && - this.settings.dash_to_panel.BLUR_ORIGINAL_PANEL - ) - this.maybe_blur_panel(Main.panel); }; /// Blur a panel only if it is not already blurred (contained in the list) @@ -438,11 +450,15 @@ export const PanelBlur = class PanelBlur { let same_monitor = actors.monitor.index == window_monitor_i; let window_vertical_pos = meta_window.get_frame_rect().y; + let window_vertical_bottom = window_vertical_pos + meta_window.get_frame_rect().height; // if so, and if in the same monitor, then it overlaps if (same_monitor && - window_vertical_pos < panel_bottom + 5 * scale + // check if panel is on top + ((panel_top === 0 && window_vertical_pos < panel_bottom + 5 * scale) || + // check if panel is at the bottom + (panel_top > 0 && window_vertical_bottom > panel_top - 5 * scale)) ) window_overlap_panel = true; }); diff --git a/gnome/.local/share/gnome-shell/extensions/blur-my-shell@aunetx/locale/af/LC_MESSAGES/blur-my-shell@aunetx.mo b/gnome/.local/share/gnome-shell/extensions/blur-my-shell@aunetx/locale/af/LC_MESSAGES/blur-my-shell@aunetx.mo index 9228b72..7fd4c31 100644 Binary files a/gnome/.local/share/gnome-shell/extensions/blur-my-shell@aunetx/locale/af/LC_MESSAGES/blur-my-shell@aunetx.mo and b/gnome/.local/share/gnome-shell/extensions/blur-my-shell@aunetx/locale/af/LC_MESSAGES/blur-my-shell@aunetx.mo differ diff --git a/gnome/.local/share/gnome-shell/extensions/blur-my-shell@aunetx/locale/ar/LC_MESSAGES/blur-my-shell@aunetx.mo b/gnome/.local/share/gnome-shell/extensions/blur-my-shell@aunetx/locale/ar/LC_MESSAGES/blur-my-shell@aunetx.mo index ccb2bb2..05ebeaa 100644 Binary files a/gnome/.local/share/gnome-shell/extensions/blur-my-shell@aunetx/locale/ar/LC_MESSAGES/blur-my-shell@aunetx.mo and b/gnome/.local/share/gnome-shell/extensions/blur-my-shell@aunetx/locale/ar/LC_MESSAGES/blur-my-shell@aunetx.mo differ diff --git a/gnome/.local/share/gnome-shell/extensions/blur-my-shell@aunetx/locale/az/LC_MESSAGES/blur-my-shell@aunetx.mo b/gnome/.local/share/gnome-shell/extensions/blur-my-shell@aunetx/locale/az/LC_MESSAGES/blur-my-shell@aunetx.mo index 4bfe928..2d37384 100644 Binary files a/gnome/.local/share/gnome-shell/extensions/blur-my-shell@aunetx/locale/az/LC_MESSAGES/blur-my-shell@aunetx.mo and b/gnome/.local/share/gnome-shell/extensions/blur-my-shell@aunetx/locale/az/LC_MESSAGES/blur-my-shell@aunetx.mo differ diff --git a/gnome/.local/share/gnome-shell/extensions/blur-my-shell@aunetx/locale/be/LC_MESSAGES/blur-my-shell@aunetx.mo b/gnome/.local/share/gnome-shell/extensions/blur-my-shell@aunetx/locale/be/LC_MESSAGES/blur-my-shell@aunetx.mo index 818a7e2..6229b38 100644 Binary files a/gnome/.local/share/gnome-shell/extensions/blur-my-shell@aunetx/locale/be/LC_MESSAGES/blur-my-shell@aunetx.mo and b/gnome/.local/share/gnome-shell/extensions/blur-my-shell@aunetx/locale/be/LC_MESSAGES/blur-my-shell@aunetx.mo differ diff --git a/gnome/.local/share/gnome-shell/extensions/blur-my-shell@aunetx/locale/bg/LC_MESSAGES/blur-my-shell@aunetx.mo b/gnome/.local/share/gnome-shell/extensions/blur-my-shell@aunetx/locale/bg/LC_MESSAGES/blur-my-shell@aunetx.mo index 1fc31e5..9d8da30 100644 Binary files a/gnome/.local/share/gnome-shell/extensions/blur-my-shell@aunetx/locale/bg/LC_MESSAGES/blur-my-shell@aunetx.mo and b/gnome/.local/share/gnome-shell/extensions/blur-my-shell@aunetx/locale/bg/LC_MESSAGES/blur-my-shell@aunetx.mo differ diff --git a/gnome/.local/share/gnome-shell/extensions/blur-my-shell@aunetx/locale/ca/LC_MESSAGES/blur-my-shell@aunetx.mo b/gnome/.local/share/gnome-shell/extensions/blur-my-shell@aunetx/locale/ca/LC_MESSAGES/blur-my-shell@aunetx.mo index c21daf4..71efa48 100644 Binary files a/gnome/.local/share/gnome-shell/extensions/blur-my-shell@aunetx/locale/ca/LC_MESSAGES/blur-my-shell@aunetx.mo and b/gnome/.local/share/gnome-shell/extensions/blur-my-shell@aunetx/locale/ca/LC_MESSAGES/blur-my-shell@aunetx.mo differ diff --git a/gnome/.local/share/gnome-shell/extensions/blur-my-shell@aunetx/locale/cs/LC_MESSAGES/blur-my-shell@aunetx.mo b/gnome/.local/share/gnome-shell/extensions/blur-my-shell@aunetx/locale/cs/LC_MESSAGES/blur-my-shell@aunetx.mo index 799f757..8f46756 100644 Binary files a/gnome/.local/share/gnome-shell/extensions/blur-my-shell@aunetx/locale/cs/LC_MESSAGES/blur-my-shell@aunetx.mo and b/gnome/.local/share/gnome-shell/extensions/blur-my-shell@aunetx/locale/cs/LC_MESSAGES/blur-my-shell@aunetx.mo differ diff --git a/gnome/.local/share/gnome-shell/extensions/blur-my-shell@aunetx/locale/da/LC_MESSAGES/blur-my-shell@aunetx.mo b/gnome/.local/share/gnome-shell/extensions/blur-my-shell@aunetx/locale/da/LC_MESSAGES/blur-my-shell@aunetx.mo index 155dcbb..b44f3c8 100644 Binary files a/gnome/.local/share/gnome-shell/extensions/blur-my-shell@aunetx/locale/da/LC_MESSAGES/blur-my-shell@aunetx.mo and b/gnome/.local/share/gnome-shell/extensions/blur-my-shell@aunetx/locale/da/LC_MESSAGES/blur-my-shell@aunetx.mo differ diff --git a/gnome/.local/share/gnome-shell/extensions/blur-my-shell@aunetx/locale/de/LC_MESSAGES/blur-my-shell@aunetx.mo b/gnome/.local/share/gnome-shell/extensions/blur-my-shell@aunetx/locale/de/LC_MESSAGES/blur-my-shell@aunetx.mo index 2b367d4..416e6ef 100644 Binary files a/gnome/.local/share/gnome-shell/extensions/blur-my-shell@aunetx/locale/de/LC_MESSAGES/blur-my-shell@aunetx.mo and b/gnome/.local/share/gnome-shell/extensions/blur-my-shell@aunetx/locale/de/LC_MESSAGES/blur-my-shell@aunetx.mo differ diff --git a/gnome/.local/share/gnome-shell/extensions/blur-my-shell@aunetx/locale/el/LC_MESSAGES/blur-my-shell@aunetx.mo b/gnome/.local/share/gnome-shell/extensions/blur-my-shell@aunetx/locale/el/LC_MESSAGES/blur-my-shell@aunetx.mo index fc3ca9b..c671ffa 100644 Binary files a/gnome/.local/share/gnome-shell/extensions/blur-my-shell@aunetx/locale/el/LC_MESSAGES/blur-my-shell@aunetx.mo and b/gnome/.local/share/gnome-shell/extensions/blur-my-shell@aunetx/locale/el/LC_MESSAGES/blur-my-shell@aunetx.mo differ diff --git a/gnome/.local/share/gnome-shell/extensions/blur-my-shell@aunetx/locale/es/LC_MESSAGES/blur-my-shell@aunetx.mo b/gnome/.local/share/gnome-shell/extensions/blur-my-shell@aunetx/locale/es/LC_MESSAGES/blur-my-shell@aunetx.mo index e7b9134..352d3bc 100644 Binary files a/gnome/.local/share/gnome-shell/extensions/blur-my-shell@aunetx/locale/es/LC_MESSAGES/blur-my-shell@aunetx.mo and b/gnome/.local/share/gnome-shell/extensions/blur-my-shell@aunetx/locale/es/LC_MESSAGES/blur-my-shell@aunetx.mo differ diff --git a/gnome/.local/share/gnome-shell/extensions/blur-my-shell@aunetx/locale/et/LC_MESSAGES/blur-my-shell@aunetx.mo b/gnome/.local/share/gnome-shell/extensions/blur-my-shell@aunetx/locale/et/LC_MESSAGES/blur-my-shell@aunetx.mo index 2719fca..a92f357 100644 Binary files a/gnome/.local/share/gnome-shell/extensions/blur-my-shell@aunetx/locale/et/LC_MESSAGES/blur-my-shell@aunetx.mo and b/gnome/.local/share/gnome-shell/extensions/blur-my-shell@aunetx/locale/et/LC_MESSAGES/blur-my-shell@aunetx.mo differ diff --git a/gnome/.local/share/gnome-shell/extensions/blur-my-shell@aunetx/locale/fi/LC_MESSAGES/blur-my-shell@aunetx.mo b/gnome/.local/share/gnome-shell/extensions/blur-my-shell@aunetx/locale/fi/LC_MESSAGES/blur-my-shell@aunetx.mo index 09c4422..4e50603 100644 Binary files a/gnome/.local/share/gnome-shell/extensions/blur-my-shell@aunetx/locale/fi/LC_MESSAGES/blur-my-shell@aunetx.mo and b/gnome/.local/share/gnome-shell/extensions/blur-my-shell@aunetx/locale/fi/LC_MESSAGES/blur-my-shell@aunetx.mo differ diff --git a/gnome/.local/share/gnome-shell/extensions/blur-my-shell@aunetx/locale/fr/LC_MESSAGES/blur-my-shell@aunetx.mo b/gnome/.local/share/gnome-shell/extensions/blur-my-shell@aunetx/locale/fr/LC_MESSAGES/blur-my-shell@aunetx.mo index 1bb85eb..a3a72a3 100644 Binary files a/gnome/.local/share/gnome-shell/extensions/blur-my-shell@aunetx/locale/fr/LC_MESSAGES/blur-my-shell@aunetx.mo and b/gnome/.local/share/gnome-shell/extensions/blur-my-shell@aunetx/locale/fr/LC_MESSAGES/blur-my-shell@aunetx.mo differ diff --git a/gnome/.local/share/gnome-shell/extensions/blur-my-shell@aunetx/locale/he/LC_MESSAGES/blur-my-shell@aunetx.mo b/gnome/.local/share/gnome-shell/extensions/blur-my-shell@aunetx/locale/he/LC_MESSAGES/blur-my-shell@aunetx.mo index abb4ac0..a140ba0 100644 Binary files a/gnome/.local/share/gnome-shell/extensions/blur-my-shell@aunetx/locale/he/LC_MESSAGES/blur-my-shell@aunetx.mo and b/gnome/.local/share/gnome-shell/extensions/blur-my-shell@aunetx/locale/he/LC_MESSAGES/blur-my-shell@aunetx.mo differ diff --git a/gnome/.local/share/gnome-shell/extensions/blur-my-shell@aunetx/locale/hi/LC_MESSAGES/blur-my-shell@aunetx.mo b/gnome/.local/share/gnome-shell/extensions/blur-my-shell@aunetx/locale/hi/LC_MESSAGES/blur-my-shell@aunetx.mo index ee819a7..d3801bb 100644 Binary files a/gnome/.local/share/gnome-shell/extensions/blur-my-shell@aunetx/locale/hi/LC_MESSAGES/blur-my-shell@aunetx.mo and b/gnome/.local/share/gnome-shell/extensions/blur-my-shell@aunetx/locale/hi/LC_MESSAGES/blur-my-shell@aunetx.mo differ diff --git a/gnome/.local/share/gnome-shell/extensions/blur-my-shell@aunetx/locale/hr/LC_MESSAGES/blur-my-shell@aunetx.mo b/gnome/.local/share/gnome-shell/extensions/blur-my-shell@aunetx/locale/hr/LC_MESSAGES/blur-my-shell@aunetx.mo index 7a2a318..45ed92c 100644 Binary files a/gnome/.local/share/gnome-shell/extensions/blur-my-shell@aunetx/locale/hr/LC_MESSAGES/blur-my-shell@aunetx.mo and b/gnome/.local/share/gnome-shell/extensions/blur-my-shell@aunetx/locale/hr/LC_MESSAGES/blur-my-shell@aunetx.mo differ diff --git a/gnome/.local/share/gnome-shell/extensions/blur-my-shell@aunetx/locale/hu/LC_MESSAGES/blur-my-shell@aunetx.mo b/gnome/.local/share/gnome-shell/extensions/blur-my-shell@aunetx/locale/hu/LC_MESSAGES/blur-my-shell@aunetx.mo index f181edb..8ca7d7e 100644 Binary files a/gnome/.local/share/gnome-shell/extensions/blur-my-shell@aunetx/locale/hu/LC_MESSAGES/blur-my-shell@aunetx.mo and b/gnome/.local/share/gnome-shell/extensions/blur-my-shell@aunetx/locale/hu/LC_MESSAGES/blur-my-shell@aunetx.mo differ diff --git a/gnome/.local/share/gnome-shell/extensions/blur-my-shell@aunetx/locale/id/LC_MESSAGES/blur-my-shell@aunetx.mo b/gnome/.local/share/gnome-shell/extensions/blur-my-shell@aunetx/locale/id/LC_MESSAGES/blur-my-shell@aunetx.mo index cf71764..cad32d5 100644 Binary files a/gnome/.local/share/gnome-shell/extensions/blur-my-shell@aunetx/locale/id/LC_MESSAGES/blur-my-shell@aunetx.mo and b/gnome/.local/share/gnome-shell/extensions/blur-my-shell@aunetx/locale/id/LC_MESSAGES/blur-my-shell@aunetx.mo differ diff --git a/gnome/.local/share/gnome-shell/extensions/blur-my-shell@aunetx/locale/it/LC_MESSAGES/blur-my-shell@aunetx.mo b/gnome/.local/share/gnome-shell/extensions/blur-my-shell@aunetx/locale/it/LC_MESSAGES/blur-my-shell@aunetx.mo index d4f5e58..b9f2303 100644 Binary files a/gnome/.local/share/gnome-shell/extensions/blur-my-shell@aunetx/locale/it/LC_MESSAGES/blur-my-shell@aunetx.mo and b/gnome/.local/share/gnome-shell/extensions/blur-my-shell@aunetx/locale/it/LC_MESSAGES/blur-my-shell@aunetx.mo differ diff --git a/gnome/.local/share/gnome-shell/extensions/blur-my-shell@aunetx/locale/ja/LC_MESSAGES/blur-my-shell@aunetx.mo b/gnome/.local/share/gnome-shell/extensions/blur-my-shell@aunetx/locale/ja/LC_MESSAGES/blur-my-shell@aunetx.mo index ae09442..12d1d52 100644 Binary files a/gnome/.local/share/gnome-shell/extensions/blur-my-shell@aunetx/locale/ja/LC_MESSAGES/blur-my-shell@aunetx.mo and b/gnome/.local/share/gnome-shell/extensions/blur-my-shell@aunetx/locale/ja/LC_MESSAGES/blur-my-shell@aunetx.mo differ diff --git a/gnome/.local/share/gnome-shell/extensions/blur-my-shell@aunetx/locale/ka/LC_MESSAGES/blur-my-shell@aunetx.mo b/gnome/.local/share/gnome-shell/extensions/blur-my-shell@aunetx/locale/ka/LC_MESSAGES/blur-my-shell@aunetx.mo index 8c7b510..f38aa09 100644 Binary files a/gnome/.local/share/gnome-shell/extensions/blur-my-shell@aunetx/locale/ka/LC_MESSAGES/blur-my-shell@aunetx.mo and b/gnome/.local/share/gnome-shell/extensions/blur-my-shell@aunetx/locale/ka/LC_MESSAGES/blur-my-shell@aunetx.mo differ diff --git a/gnome/.local/share/gnome-shell/extensions/blur-my-shell@aunetx/locale/ko/LC_MESSAGES/blur-my-shell@aunetx.mo b/gnome/.local/share/gnome-shell/extensions/blur-my-shell@aunetx/locale/ko/LC_MESSAGES/blur-my-shell@aunetx.mo index c940d4b..9088bf3 100644 Binary files a/gnome/.local/share/gnome-shell/extensions/blur-my-shell@aunetx/locale/ko/LC_MESSAGES/blur-my-shell@aunetx.mo and b/gnome/.local/share/gnome-shell/extensions/blur-my-shell@aunetx/locale/ko/LC_MESSAGES/blur-my-shell@aunetx.mo differ diff --git a/gnome/.local/share/gnome-shell/extensions/blur-my-shell@aunetx/locale/ml/LC_MESSAGES/blur-my-shell@aunetx.mo b/gnome/.local/share/gnome-shell/extensions/blur-my-shell@aunetx/locale/ml/LC_MESSAGES/blur-my-shell@aunetx.mo new file mode 100644 index 0000000..6573c2c Binary files /dev/null and b/gnome/.local/share/gnome-shell/extensions/blur-my-shell@aunetx/locale/ml/LC_MESSAGES/blur-my-shell@aunetx.mo differ diff --git a/gnome/.local/share/gnome-shell/extensions/blur-my-shell@aunetx/locale/mrh/LC_MESSAGES/blur-my-shell@aunetx.mo b/gnome/.local/share/gnome-shell/extensions/blur-my-shell@aunetx/locale/mrh/LC_MESSAGES/blur-my-shell@aunetx.mo new file mode 100644 index 0000000..cfd9fc9 Binary files /dev/null and b/gnome/.local/share/gnome-shell/extensions/blur-my-shell@aunetx/locale/mrh/LC_MESSAGES/blur-my-shell@aunetx.mo differ diff --git a/gnome/.local/share/gnome-shell/extensions/blur-my-shell@aunetx/locale/my/LC_MESSAGES/blur-my-shell@aunetx.mo b/gnome/.local/share/gnome-shell/extensions/blur-my-shell@aunetx/locale/my/LC_MESSAGES/blur-my-shell@aunetx.mo new file mode 100644 index 0000000..9123894 Binary files /dev/null and b/gnome/.local/share/gnome-shell/extensions/blur-my-shell@aunetx/locale/my/LC_MESSAGES/blur-my-shell@aunetx.mo differ diff --git a/gnome/.local/share/gnome-shell/extensions/blur-my-shell@aunetx/locale/nb_NO/LC_MESSAGES/blur-my-shell@aunetx.mo b/gnome/.local/share/gnome-shell/extensions/blur-my-shell@aunetx/locale/nb_NO/LC_MESSAGES/blur-my-shell@aunetx.mo index 2436b7c..50cdf68 100644 Binary files a/gnome/.local/share/gnome-shell/extensions/blur-my-shell@aunetx/locale/nb_NO/LC_MESSAGES/blur-my-shell@aunetx.mo and b/gnome/.local/share/gnome-shell/extensions/blur-my-shell@aunetx/locale/nb_NO/LC_MESSAGES/blur-my-shell@aunetx.mo differ diff --git a/gnome/.local/share/gnome-shell/extensions/blur-my-shell@aunetx/locale/nl/LC_MESSAGES/blur-my-shell@aunetx.mo b/gnome/.local/share/gnome-shell/extensions/blur-my-shell@aunetx/locale/nl/LC_MESSAGES/blur-my-shell@aunetx.mo index fdca051..a1a3517 100644 Binary files a/gnome/.local/share/gnome-shell/extensions/blur-my-shell@aunetx/locale/nl/LC_MESSAGES/blur-my-shell@aunetx.mo and b/gnome/.local/share/gnome-shell/extensions/blur-my-shell@aunetx/locale/nl/LC_MESSAGES/blur-my-shell@aunetx.mo differ diff --git a/gnome/.local/share/gnome-shell/extensions/blur-my-shell@aunetx/locale/nn/LC_MESSAGES/blur-my-shell@aunetx.mo b/gnome/.local/share/gnome-shell/extensions/blur-my-shell@aunetx/locale/nn/LC_MESSAGES/blur-my-shell@aunetx.mo index c872ad0..28f7c42 100644 Binary files a/gnome/.local/share/gnome-shell/extensions/blur-my-shell@aunetx/locale/nn/LC_MESSAGES/blur-my-shell@aunetx.mo and b/gnome/.local/share/gnome-shell/extensions/blur-my-shell@aunetx/locale/nn/LC_MESSAGES/blur-my-shell@aunetx.mo differ diff --git a/gnome/.local/share/gnome-shell/extensions/blur-my-shell@aunetx/locale/pl/LC_MESSAGES/blur-my-shell@aunetx.mo b/gnome/.local/share/gnome-shell/extensions/blur-my-shell@aunetx/locale/pl/LC_MESSAGES/blur-my-shell@aunetx.mo index 61ad499..0487afe 100644 Binary files a/gnome/.local/share/gnome-shell/extensions/blur-my-shell@aunetx/locale/pl/LC_MESSAGES/blur-my-shell@aunetx.mo and b/gnome/.local/share/gnome-shell/extensions/blur-my-shell@aunetx/locale/pl/LC_MESSAGES/blur-my-shell@aunetx.mo differ diff --git a/gnome/.local/share/gnome-shell/extensions/blur-my-shell@aunetx/locale/pt/LC_MESSAGES/blur-my-shell@aunetx.mo b/gnome/.local/share/gnome-shell/extensions/blur-my-shell@aunetx/locale/pt/LC_MESSAGES/blur-my-shell@aunetx.mo index 8565f59..def333f 100644 Binary files a/gnome/.local/share/gnome-shell/extensions/blur-my-shell@aunetx/locale/pt/LC_MESSAGES/blur-my-shell@aunetx.mo and b/gnome/.local/share/gnome-shell/extensions/blur-my-shell@aunetx/locale/pt/LC_MESSAGES/blur-my-shell@aunetx.mo differ diff --git a/gnome/.local/share/gnome-shell/extensions/blur-my-shell@aunetx/locale/pt_BR/LC_MESSAGES/blur-my-shell@aunetx.mo b/gnome/.local/share/gnome-shell/extensions/blur-my-shell@aunetx/locale/pt_BR/LC_MESSAGES/blur-my-shell@aunetx.mo index efcc800..a76994e 100644 Binary files a/gnome/.local/share/gnome-shell/extensions/blur-my-shell@aunetx/locale/pt_BR/LC_MESSAGES/blur-my-shell@aunetx.mo and b/gnome/.local/share/gnome-shell/extensions/blur-my-shell@aunetx/locale/pt_BR/LC_MESSAGES/blur-my-shell@aunetx.mo differ diff --git a/gnome/.local/share/gnome-shell/extensions/blur-my-shell@aunetx/locale/ro/LC_MESSAGES/blur-my-shell@aunetx.mo b/gnome/.local/share/gnome-shell/extensions/blur-my-shell@aunetx/locale/ro/LC_MESSAGES/blur-my-shell@aunetx.mo index eb69073..74b52b7 100644 Binary files a/gnome/.local/share/gnome-shell/extensions/blur-my-shell@aunetx/locale/ro/LC_MESSAGES/blur-my-shell@aunetx.mo and b/gnome/.local/share/gnome-shell/extensions/blur-my-shell@aunetx/locale/ro/LC_MESSAGES/blur-my-shell@aunetx.mo differ diff --git a/gnome/.local/share/gnome-shell/extensions/blur-my-shell@aunetx/locale/ru/LC_MESSAGES/blur-my-shell@aunetx.mo b/gnome/.local/share/gnome-shell/extensions/blur-my-shell@aunetx/locale/ru/LC_MESSAGES/blur-my-shell@aunetx.mo index 84960bb..f7ba1de 100644 Binary files a/gnome/.local/share/gnome-shell/extensions/blur-my-shell@aunetx/locale/ru/LC_MESSAGES/blur-my-shell@aunetx.mo and b/gnome/.local/share/gnome-shell/extensions/blur-my-shell@aunetx/locale/ru/LC_MESSAGES/blur-my-shell@aunetx.mo differ diff --git a/gnome/.local/share/gnome-shell/extensions/blur-my-shell@aunetx/locale/sk/LC_MESSAGES/blur-my-shell@aunetx.mo b/gnome/.local/share/gnome-shell/extensions/blur-my-shell@aunetx/locale/sk/LC_MESSAGES/blur-my-shell@aunetx.mo new file mode 100644 index 0000000..be8e9a4 Binary files /dev/null and b/gnome/.local/share/gnome-shell/extensions/blur-my-shell@aunetx/locale/sk/LC_MESSAGES/blur-my-shell@aunetx.mo differ diff --git a/gnome/.local/share/gnome-shell/extensions/blur-my-shell@aunetx/locale/sl/LC_MESSAGES/blur-my-shell@aunetx.mo b/gnome/.local/share/gnome-shell/extensions/blur-my-shell@aunetx/locale/sl/LC_MESSAGES/blur-my-shell@aunetx.mo index 0ceab79..34b6505 100644 Binary files a/gnome/.local/share/gnome-shell/extensions/blur-my-shell@aunetx/locale/sl/LC_MESSAGES/blur-my-shell@aunetx.mo and b/gnome/.local/share/gnome-shell/extensions/blur-my-shell@aunetx/locale/sl/LC_MESSAGES/blur-my-shell@aunetx.mo differ diff --git a/gnome/.local/share/gnome-shell/extensions/blur-my-shell@aunetx/locale/sv/LC_MESSAGES/blur-my-shell@aunetx.mo b/gnome/.local/share/gnome-shell/extensions/blur-my-shell@aunetx/locale/sv/LC_MESSAGES/blur-my-shell@aunetx.mo index 18fdfb2..a2db609 100644 Binary files a/gnome/.local/share/gnome-shell/extensions/blur-my-shell@aunetx/locale/sv/LC_MESSAGES/blur-my-shell@aunetx.mo and b/gnome/.local/share/gnome-shell/extensions/blur-my-shell@aunetx/locale/sv/LC_MESSAGES/blur-my-shell@aunetx.mo differ diff --git a/gnome/.local/share/gnome-shell/extensions/blur-my-shell@aunetx/locale/ta/LC_MESSAGES/blur-my-shell@aunetx.mo b/gnome/.local/share/gnome-shell/extensions/blur-my-shell@aunetx/locale/ta/LC_MESSAGES/blur-my-shell@aunetx.mo index 52334a7..8fc6e3d 100644 Binary files a/gnome/.local/share/gnome-shell/extensions/blur-my-shell@aunetx/locale/ta/LC_MESSAGES/blur-my-shell@aunetx.mo and b/gnome/.local/share/gnome-shell/extensions/blur-my-shell@aunetx/locale/ta/LC_MESSAGES/blur-my-shell@aunetx.mo differ diff --git a/gnome/.local/share/gnome-shell/extensions/blur-my-shell@aunetx/locale/tr/LC_MESSAGES/blur-my-shell@aunetx.mo b/gnome/.local/share/gnome-shell/extensions/blur-my-shell@aunetx/locale/tr/LC_MESSAGES/blur-my-shell@aunetx.mo index 3e9d533..04fce82 100644 Binary files a/gnome/.local/share/gnome-shell/extensions/blur-my-shell@aunetx/locale/tr/LC_MESSAGES/blur-my-shell@aunetx.mo and b/gnome/.local/share/gnome-shell/extensions/blur-my-shell@aunetx/locale/tr/LC_MESSAGES/blur-my-shell@aunetx.mo differ diff --git a/gnome/.local/share/gnome-shell/extensions/blur-my-shell@aunetx/locale/uk/LC_MESSAGES/blur-my-shell@aunetx.mo b/gnome/.local/share/gnome-shell/extensions/blur-my-shell@aunetx/locale/uk/LC_MESSAGES/blur-my-shell@aunetx.mo index 38b4c47..9957d99 100644 Binary files a/gnome/.local/share/gnome-shell/extensions/blur-my-shell@aunetx/locale/uk/LC_MESSAGES/blur-my-shell@aunetx.mo and b/gnome/.local/share/gnome-shell/extensions/blur-my-shell@aunetx/locale/uk/LC_MESSAGES/blur-my-shell@aunetx.mo differ diff --git a/gnome/.local/share/gnome-shell/extensions/blur-my-shell@aunetx/locale/vi/LC_MESSAGES/blur-my-shell@aunetx.mo b/gnome/.local/share/gnome-shell/extensions/blur-my-shell@aunetx/locale/vi/LC_MESSAGES/blur-my-shell@aunetx.mo index 38be0d0..385f8fa 100644 Binary files a/gnome/.local/share/gnome-shell/extensions/blur-my-shell@aunetx/locale/vi/LC_MESSAGES/blur-my-shell@aunetx.mo and b/gnome/.local/share/gnome-shell/extensions/blur-my-shell@aunetx/locale/vi/LC_MESSAGES/blur-my-shell@aunetx.mo differ diff --git a/gnome/.local/share/gnome-shell/extensions/blur-my-shell@aunetx/locale/zh_CN/LC_MESSAGES/blur-my-shell@aunetx.mo b/gnome/.local/share/gnome-shell/extensions/blur-my-shell@aunetx/locale/zh_CN/LC_MESSAGES/blur-my-shell@aunetx.mo index 41b29f7..7b84952 100644 Binary files a/gnome/.local/share/gnome-shell/extensions/blur-my-shell@aunetx/locale/zh_CN/LC_MESSAGES/blur-my-shell@aunetx.mo and b/gnome/.local/share/gnome-shell/extensions/blur-my-shell@aunetx/locale/zh_CN/LC_MESSAGES/blur-my-shell@aunetx.mo differ diff --git a/gnome/.local/share/gnome-shell/extensions/blur-my-shell@aunetx/locale/zh_TW/LC_MESSAGES/blur-my-shell@aunetx.mo b/gnome/.local/share/gnome-shell/extensions/blur-my-shell@aunetx/locale/zh_TW/LC_MESSAGES/blur-my-shell@aunetx.mo index 3a40372..20e60f5 100644 Binary files a/gnome/.local/share/gnome-shell/extensions/blur-my-shell@aunetx/locale/zh_TW/LC_MESSAGES/blur-my-shell@aunetx.mo and b/gnome/.local/share/gnome-shell/extensions/blur-my-shell@aunetx/locale/zh_TW/LC_MESSAGES/blur-my-shell@aunetx.mo differ diff --git a/gnome/.local/share/gnome-shell/extensions/blur-my-shell@aunetx/metadata.json b/gnome/.local/share/gnome-shell/extensions/blur-my-shell@aunetx/metadata.json index 7057c8d..6e059de 100644 --- a/gnome/.local/share/gnome-shell/extensions/blur-my-shell@aunetx/metadata.json +++ b/gnome/.local/share/gnome-shell/extensions/blur-my-shell@aunetx/metadata.json @@ -18,9 +18,10 @@ "shell-version": [ "46", "47", - "48" + "48", + "49" ], "url": "https://github.com/aunetx/blur-my-shell", "uuid": "blur-my-shell@aunetx", - "version": 68 + "version": 70 } \ No newline at end of file diff --git a/gnome/.local/share/gnome-shell/extensions/forge@jmmaranan.com/config/windows.json b/gnome/.local/share/gnome-shell/extensions/forge@jmmaranan.com/config/windows.json index 1e32877..0d6c3c3 100644 --- a/gnome/.local/share/gnome-shell/extensions/forge@jmmaranan.com/config/windows.json +++ b/gnome/.local/share/gnome-shell/extensions/forge@jmmaranan.com/config/windows.json @@ -8,8 +8,8 @@ { "wmClass": "jetbrains-datagrip", "wmTitle": "splash", "mode": "float" }, { "wmClass": "jetbrains-rubymine", "wmTitle": "splash", "mode": "float" }, { "wmClass": "jetbrains-idea", "wmTitle": "splash", "mode": "float" }, - { "wmClass": "Com.github.amezin.ddterm", "mode": "float" }, - { "wmClass": "Com.github.donadigo.eddy", "mode": "float" }, + { "wmClass": "com.github.amezin.ddterm", "mode": "float" }, + { "wmClass": "com.github.donadigo.eddy", "mode": "float" }, { "wmClass": "Conky", "mode": "float" }, { "wmClass": "Gnome-initial-setup", "mode": "float" }, { "wmClass": "org.gnome.Calculator", "mode": "float" }, diff --git a/gnome/.local/share/gnome-shell/extensions/forge@jmmaranan.com/lib/extension/tree.js b/gnome/.local/share/gnome-shell/extensions/forge@jmmaranan.com/lib/extension/tree.js index 0fa2981..c7cf7fe 100644 --- a/gnome/.local/share/gnome-shell/extensions/forge@jmmaranan.com/lib/extension/tree.js +++ b/gnome/.local/share/gnome-shell/extensions/forge@jmmaranan.com/lib/extension/tree.js @@ -831,6 +831,7 @@ export class Tree extends Node { let metaWindow = next.nodeValue; if (!metaWindow) return null; + const previousMetaWindow = this.extWm.focusMetaWindow; if (metaWindow.minimized) { next = this.focus(next, direction); } else { @@ -838,14 +839,18 @@ export class Tree extends Node { metaWindow.focus(global.display.get_current_time()); metaWindow.activate(global.display.get_current_time()); + const monitorArea = metaWindow.get_work_area_current_monitor(); + const ptr = this.extWm.getPointer(); + const pointerInside = Utils.rectContainsPoint(monitorArea, [ptr[0], ptr[1]]); + const monitorChanged = + !!previousMetaWindow && + previousMetaWindow.get_monitor && + previousMetaWindow.get_monitor() !== metaWindow.get_monitor(); + if (this.settings.get_boolean("move-pointer-focus-enabled")) { this.extWm.movePointerWith(next); - } else { - let monitorArea = metaWindow.get_work_area_current_monitor(); - let ptr = this.extWm.getPointer(); - if (!Utils.rectContainsPoint(monitorArea, [ptr[0], ptr[1]])) { - this.extWm.movePointerWith(next); - } + } else if (!pointerInside) { + this.extWm.movePointerWith(next, { force: monitorChanged }); } } return next; diff --git a/gnome/.local/share/gnome-shell/extensions/forge@jmmaranan.com/lib/extension/window.js b/gnome/.local/share/gnome-shell/extensions/forge@jmmaranan.com/lib/extension/window.js index b02d8d5..0126f16 100644 --- a/gnome/.local/share/gnome-shell/extensions/forge@jmmaranan.com/lib/extension/window.js +++ b/gnome/.local/share/gnome-shell/extensions/forge@jmmaranan.com/lib/extension/window.js @@ -67,8 +67,7 @@ export class WindowManager extends GObject.Object { this.prefsTitle = `Forge ${_("Settings")} - ${ !production ? "DEV" : `${PACKAGE_VERSION}-${ext.metadata.version}` }`; - this.windowProps = this.ext.configMgr.windowProps; - this.windowProps.overrides = this.windowProps.overrides.filter((override) => !override.wmId); + this.reloadWindowOverrides(); this._kbd = this.ext.keybindings; this._tree = new Tree(this); this.eventQueue = new Queue(); @@ -98,11 +97,12 @@ export class WindowManager extends GObject.Object { } addFloatOverride(metaWindow, withWmId) { - let overrides = this.windowProps.overrides; + let currentProps = this.ext.configMgr.windowProps; + let overrides = currentProps.overrides; let wmClass = metaWindow.get_wm_class(); let wmId = metaWindow.get_id(); - for (let override in overrides) { + for (let override of overrides) { // if the window is already floating if (override.wmClass === wmClass && override.mode === "float" && !override.wmTitle) return; } @@ -111,12 +111,15 @@ export class WindowManager extends GObject.Object { wmId: withWmId ? wmId : undefined, mode: "float", }); - this.windowProps.overrides = overrides; - this.ext.configMgr.windowProps = this.windowProps; + + // Save the updated overrides back to the ConfigManager + currentProps.overrides = overrides; + this.ext.configMgr.windowProps = currentProps; } removeFloatOverride(metaWindow, withWmId) { - let overrides = this.windowProps.overrides; + let currentProps = this.ext.configMgr.windowProps; + let overrides = currentProps.overrides; let wmClass = metaWindow.get_wm_class(); let wmId = metaWindow.get_id(); overrides = overrides.filter( @@ -129,8 +132,9 @@ export class WindowManager extends GObject.Object { ) ); - this.windowProps.overrides = overrides; - this.ext.configMgr.windowProps = this.windowProps; + // Save the updated overrides back to the ConfigManager + currentProps.overrides = overrides; + this.ext.configMgr.windowProps = currentProps; } toggleFloatingMode(action, metaWindow) { @@ -285,6 +289,11 @@ export class WindowManager extends GObject.Object { settings.connect("changed", (_, settingName) => { switch (settingName) { + case "window-overrides-reload-trigger": + // Reload window overrides when triggered by preferences + // This prevents the main extension from overwriting changes made by preferences + this.reloadWindowOverrides(); + break; case "focus-border-toggle": this.renderTree(settingName); break; @@ -951,9 +960,16 @@ export class WindowManager extends GObject.Object { move(metaWindow, rect) { if (!metaWindow) return; if (metaWindow.grabbed) return; - metaWindow.unmaximize(Meta.MaximizeFlags.HORIZONTAL); - metaWindow.unmaximize(Meta.MaximizeFlags.VERTICAL); - metaWindow.unmaximize(Meta.MaximizeFlags.BOTH); + try { + // GNOME 49+ + metaWindow.set_unmaximize_flags(Meta.MaximizeFlags.BOTH); + metaWindow.unmaximize(); + } catch (e) { + // pre-49 fallback + metaWindow.unmaximize(Meta.MaximizeFlags.HORIZONTAL); + metaWindow.unmaximize(Meta.MaximizeFlags.VERTICAL); + metaWindow.unmaximize(Meta.MaximizeFlags.BOTH); + } let windowActor = metaWindow.get_compositor_private(); if (!windowActor) return; @@ -1235,7 +1251,13 @@ export class WindowManager extends GObject.Object { let tilingModeEnabled = this.ext.settings.get_boolean("tiling-mode-enabled"); let gap = this.calculateGaps(nodeWindow); let maximized = () => { - return metaWindow.get_maximized() === 3 || metaWindow.is_fullscreen() || gap === 0; + try { + // GNOME 49+ + return metaWindow.is_maximized() || metaWindow.is_fullscreen() || gap === 0; + } catch (e) { + // pre-49 fallback + return metaWindow.get_maximized() === 3 || metaWindow.is_fullscreen() || gap === 0; + } }; let monitorCount = global.display.get_n_monitors(); let tiledChildren = this.tree.getTiledChildren(nodeWindow.parentNode.childNodes); @@ -1287,7 +1309,18 @@ export class WindowManager extends GObject.Object { } } - if (gap === 0 || metaWindow.get_maximized() === 1 || metaWindow.get_maximized() === 2) { + if ( + gap === 0 || + (() => { + try { + // GNOME 49+ + return metaWindow.is_maximized(); + } catch (e) { + // pre-49 fallback + return metaWindow.get_maximized() === 1 || metaWindow.get_maximized() === 2; + } + })() + ) { inset = 0; } @@ -1506,9 +1539,16 @@ export class WindowManager extends GObject.Object { { name: "window-create-queue", callback: () => { - metaWindow.unmaximize(Meta.MaximizeFlags.HORIZONTAL); - metaWindow.unmaximize(Meta.MaximizeFlags.VERTICAL); - metaWindow.unmaximize(Meta.MaximizeFlags.BOTH); + try { + // GNOME 49+ + metaWindow.set_unmaximize_flags(Meta.MaximizeFlags.BOTH); + metaWindow.unmaximize(); + } catch (e) { + // pre-49 fallback + metaWindow.unmaximize(Meta.MaximizeFlags.HORIZONTAL); + metaWindow.unmaximize(Meta.MaximizeFlags.VERTICAL); + metaWindow.unmaximize(Meta.MaximizeFlags.BOTH); + } this.renderTree("window-create", true); }, }, @@ -1727,7 +1767,17 @@ export class WindowManager extends GObject.Object { this._handleMoving(focusNodeWindow); } } else { - if (focusMetaWindow.get_maximized() === 0) { + if ( + (() => { + try { + // GNOME 49+ + return !focusMetaWindow.is_maximized(); + } catch (e) { + // pre-49 fallback + return focusMetaWindow.get_maximized() === 0; + } + })() + ) { this.renderTree(from); } } @@ -1765,9 +1815,18 @@ export class WindowManager extends GObject.Object { let monWsNoMaxWindows = activeWsNode.getNodeByType(NODE_TYPES.MONITOR).filter((monitor) => { return ( monitor.getNodeByType(NODE_TYPES.WINDOW).filter((w) => { - return ( - w.nodeValue.get_maximized() === Meta.MaximizeFlags.BOTH || w.nodeValue.is_fullscreen() - ); + return (() => { + try { + // GNOME 49+ + return w.nodeValue.is_maximized() || w.nodeValue.is_fullscreen(); + } catch (e) { + // pre-49 fallback + return ( + w.nodeValue.get_maximized() === Meta.MaximizeFlags.BOTH || + w.nodeValue.is_fullscreen() + ); + } + })(); }).length === 0 ); }); @@ -1814,9 +1873,10 @@ export class WindowManager extends GObject.Object { * This is useful for making sure that Forge calculates the attachNode * properly */ - movePointerWith(nodeWindow) { + movePointerWith(nodeWindow, { force = false } = {}) { if (!nodeWindow || !nodeWindow._data) return; - if (this.ext.settings.get_boolean("move-pointer-focus-enabled")) { + const shouldWarp = force || this.ext.settings.get_boolean("move-pointer-focus-enabled"); + if (shouldWarp) { this.storePointerLastPosition(this.lastFocusedWindow); if (this.canMovePointerInsideNodeWindow(nodeWindow)) { this.warpPointerToNodeWindow(nodeWindow); @@ -2410,7 +2470,17 @@ export class WindowManager extends GObject.Object { } this._grabCleanup(focusNodeWindow); - if (focusMetaWindow.get_maximized() === 0) { + if ( + (() => { + try { + // GNOME 49+ + return !focusMetaWindow.is_maximized(); + } catch (e) { + // pre-49 fallback + return focusMetaWindow.get_maximized() === 0; + } + })() + ) { this.renderTree("grab-op-end"); } @@ -2708,6 +2778,20 @@ export class WindowManager extends GObject.Object { return `mo${display.get_current_monitor()}`; } + /** + * Reload window overrides from the configuration file + * This is called when the preferences page modifies the overrides + */ + reloadWindowOverrides() { + // Get fresh data from the ConfigManager + const freshProps = this.ext.configMgr.windowProps; + if (freshProps) { + this.windowProps = freshProps; + this.windowProps.overrides = this.windowProps.overrides.filter((override) => !override.wmId); + Logger.info(`Reloaded ${this.windowProps.overrides.length} window overrides from file`); + } + } + floatAllWindows() { this.tree.getNodeByType(NODE_TYPES.WINDOW).forEach((w) => { if (w.isFloat()) { diff --git a/gnome/.local/share/gnome-shell/extensions/forge@jmmaranan.com/lib/prefs/appearance.js b/gnome/.local/share/gnome-shell/extensions/forge@jmmaranan.com/lib/prefs/appearance.js index 786ebaa..5a048cf 100644 --- a/gnome/.local/share/gnome-shell/extensions/forge@jmmaranan.com/lib/prefs/appearance.js +++ b/gnome/.local/share/gnome-shell/extensions/forge@jmmaranan.com/lib/prefs/appearance.js @@ -8,7 +8,6 @@ import { gettext as _ } from "resource:///org/gnome/Shell/Extensions/js/extensio // Shared state import { ConfigManager } from "../shared/settings.js"; - import { PrefsThemeManager } from "./prefs-theme-manager.js"; // Prefs UI @@ -42,8 +41,8 @@ export class AppearancePage extends PreferencesPage { constructor({ settings, dir }) { super({ title: _("Appearance"), icon_name: "brush-symbolic" }); this.settings = settings; - this.configMgr = new ConfigManager({ dir }); - this.themeMgr = new PrefsThemeManager(this); + let configMgr = new ConfigManager({ dir }); + this.themeMgr = new PrefsThemeManager({ configMgr: configMgr, settings: settings }); this.add_group({ title: _("Gaps"), description: _("Change the gap size between windows"), diff --git a/gnome/.local/share/gnome-shell/extensions/forge@jmmaranan.com/lib/prefs/floating.js b/gnome/.local/share/gnome-shell/extensions/forge@jmmaranan.com/lib/prefs/floating.js new file mode 100644 index 0000000..0206c8f --- /dev/null +++ b/gnome/.local/share/gnome-shell/extensions/forge@jmmaranan.com/lib/prefs/floating.js @@ -0,0 +1,82 @@ +// Gtk imports +import Gtk from "gi://Gtk"; +import GObject from "gi://GObject"; + +// Gnome imports +import { gettext as _ } from "resource:///org/gnome/Shell/Extensions/js/extensions/prefs.js"; + +// Extension imports +import { PreferencesPage, RemoveItemRow, ResetButton } from "./widgets.js"; +import { ConfigManager } from "../shared/settings.js"; + +export class FloatingPage extends PreferencesPage { + static { + GObject.registerClass(this); + } + + constructor({ settings, dir }) { + super({ title: _("Windows"), icon_name: "window-symbolic" }); + + this.settings = settings; + this.configMgr = new ConfigManager({ dir }); + + let overrides = this.configMgr.windowProps.overrides; + this.rows = this.loadItemsFromConfig(overrides); + + this.floatingWindowGroup = this.add_group({ + title: _("Floating Windows"), + description: _("Windows that will not be tiled"), + header_suffix: new ResetButton({ onReset: () => this.onResetHandler() }), + children: this.rows, + }); + } + + loadItemsFromConfig(overrides) { + let children = []; + for (let override of overrides) { + if (override.mode === "float") { + let itemrow = new RemoveItemRow({ + title: override.wmTitle ?? override.wmClass, + subtitle: override.wmClass, + onRemove: (item, parent) => this.onRemoveHandler(item, parent), + }); + children.push(itemrow); + } + } + return children; + } + + onRemoveHandler(item, parent) { + this.floatingWindowGroup.remove(parent); + this.rows = this.rows.filter((row) => row != parent); + const existing = this.configMgr.windowProps.overrides; + const modified = existing.filter((row) => item != row.wmClass); + this.saveOverrides(modified); + } + + saveOverrides(modified) { + if (modified) { + this.configMgr.windowProps = { + overrides: modified, + }; + // Signal the main extension to reload floating overrides + const changed = Math.floor(Date.now() / 1000); + this.settings.set_uint("window-overrides-reload-trigger", changed); + } + } + + onResetHandler() { + const defaultWindowProps = this.configMgr.loadDefaultWindowConfigContents(); + const original = defaultWindowProps.overrides; + this.saveOverrides(original); + + for (const child of this.rows) { + this.floatingWindowGroup.remove(child); + } + + this.rows = this.loadItemsFromConfig(original); + for (const item of this.rows) { + this.floatingWindowGroup.add(item); + } + } +} diff --git a/gnome/.local/share/gnome-shell/extensions/forge@jmmaranan.com/lib/prefs/settings.js b/gnome/.local/share/gnome-shell/extensions/forge@jmmaranan.com/lib/prefs/settings.js index 6f68f70..e90a640 100644 --- a/gnome/.local/share/gnome-shell/extensions/forge@jmmaranan.com/lib/prefs/settings.js +++ b/gnome/.local/share/gnome-shell/extensions/forge@jmmaranan.com/lib/prefs/settings.js @@ -17,6 +17,7 @@ import { PACKAGE_VERSION } from "resource:///org/gnome/Shell/Extensions/js/misc/ import { developers } from "./metadata.js"; function showAboutWindow(parent, { version, description: comments }) { + version = version ?? "development"; const abt = new Adw.AboutWindow({ ...(parent && { transient_for: parent }), // TODO: fetch these from github at build time @@ -136,7 +137,7 @@ export class SettingsPage extends PreferencesPage { title: _("Logger"), children: [ new DropDownRow({ - title: _("Logger Level"), + title: _("Log level"), settings, bind: "log-level", items: Object.entries(Logger.LOG_LEVELS).map(([name, id]) => ({ id, name })), diff --git a/gnome/.local/share/gnome-shell/extensions/forge@jmmaranan.com/lib/prefs/widgets.js b/gnome/.local/share/gnome-shell/extensions/forge@jmmaranan.com/lib/prefs/widgets.js index 808c540..b4c7301 100644 --- a/gnome/.local/share/gnome-shell/extensions/forge@jmmaranan.com/lib/prefs/widgets.js +++ b/gnome/.local/share/gnome-shell/extensions/forge@jmmaranan.com/lib/prefs/widgets.js @@ -22,6 +22,7 @@ export class PreferencesPage extends Adw.PreferencesPage { for (const child of children) group.add(child); if (header_suffix) group.set_header_suffix(header_suffix); this.add(group); + return group; } } @@ -87,7 +88,7 @@ export class SpinButtonRow extends Adw.ActionRow { }) { super({ title, subtitle }); const gspin = Gtk.SpinButton.new_with_range(low, high, step); - gspin.valign = Gtk.Align.CENTER; + gspin.xalign = 1; if (bind && settings) { settings.bind(bind, gspin, "value", Gio.SettingsBindFlags.DEFAULT); } else if (init) { @@ -97,6 +98,7 @@ export class SpinButtonRow extends Adw.ActionRow { }); } this.add_suffix(gspin); + this.set_css_classes(["spin"]); this.activatable_widget = gspin; } } @@ -211,15 +213,32 @@ export class DropDownRow extends Adw.ActionRow { } } +export class ClearButton extends Gtk.Button { + static { + GObject.registerClass(this); + } + constructor({ settings = undefined, bind = undefined, onClear }) { + super({ + icon_name: "edit-clear-symbolic", + tooltip_text: _("Clear shortcut"), + css_classes: ["flat", "circular"], + valign: Gtk.Align.CENTER, + }); + this.connect("clicked", () => { + onClear?.(); + }); + } +} + export class ResetButton extends Gtk.Button { static { GObject.registerClass(this); } - constructor({ settings = undefined, bind = undefined, onReset }) { super({ icon_name: "edit-undo-symbolic", - tooltip_text: _("Reset"), + tooltip_text: _("Reset to default"), + css_classes: ["flat", "circular"], valign: Gtk.Align.CENTER, }); this.connect("clicked", () => { @@ -229,6 +248,23 @@ export class ResetButton extends Gtk.Button { } } +export class RemoveButton extends Gtk.Button { + static { + GObject.registerClass(this); + } + constructor({ item, parent, onRemove }) { + super({ + icon_name: "edit-delete-symbolic", + tooltip_text: _("Remove Item"), + css_classes: ["flat", "circular"], + valign: Gtk.Align.CENTER, + }); + this.connect("clicked", () => { + onRemove?.(item, parent); + }); + } +} + export class EntryRow extends Adw.EntryRow { static { GObject.registerClass(this); @@ -247,6 +283,15 @@ export class EntryRow extends Adw.EntryRow { }); const current = map ? map.from(settings, bind) : settings.get_string(bind); this.set_text(current ?? ""); + this.add_suffix( + new ClearButton({ + settings, + bind, + onClear: () => { + this.set_text(""); + }, + }) + ); this.add_suffix( new ResetButton({ settings, @@ -266,7 +311,7 @@ export class RadioRow extends Adw.ActionRow { static orientation = Gtk.Orientation.HORIZONTAL; - static spacing = 10; + static spacing = 3; static valign = Gtk.Align.CENTER; @@ -281,6 +326,7 @@ export class RadioRow extends Adw.ActionRow { const toggle = new Gtk.ToggleButton({ label, ...(group && { group }) }); group ||= toggle; toggle.active = key === current; + toggle.set_css_classes(["flat"]); toggle.connect("clicked", () => { if (toggle.active) { settings.set_string(bind, labels[toggle.label]); @@ -291,3 +337,20 @@ export class RadioRow extends Adw.ActionRow { this.add_suffix(hbox); } } + +export class RemoveItemRow extends Adw.ActionRow { + static { + GObject.registerClass(this); + } + + constructor({ title, subtitle = "", onRemove = undefined }) { + super({ title, subtitle }); + const rmbutton = new RemoveButton({ + item: subtitle, + parent: this, + onRemove: onRemove, + }); + + this.add_suffix(rmbutton); + } +} diff --git a/gnome/.local/share/gnome-shell/extensions/forge@jmmaranan.com/lib/shared/settings.js b/gnome/.local/share/gnome-shell/extensions/forge@jmmaranan.com/lib/shared/settings.js index e92ae35..f093210 100644 --- a/gnome/.local/share/gnome-shell/extensions/forge@jmmaranan.com/lib/shared/settings.js +++ b/gnome/.local/share/gnome-shell/extensions/forge@jmmaranan.com/lib/shared/settings.js @@ -51,7 +51,6 @@ export class ConfigManager extends GObject.Object { if (defaultStylesheetFile.query_exists(null)) { return defaultStylesheetFile; } - return null; } @@ -75,7 +74,17 @@ export class ConfigManager extends GObject.Object { if (defaultWindowConfigFile.query_exists(null)) { return defaultWindowConfigFile; } + return null; + } + loadDefaultWindowConfigContents() { + const defaultSettingFile = this.defaultWindowConfigFile; + if (defaultSettingFile) { + const contents = this.loadFileContents(defaultSettingFile); + if (contents) { + return JSON.parse(contents); + } + } return null; } @@ -119,7 +128,8 @@ export class ConfigManager extends GObject.Object { get windowProps() { let windowConfigFile = this.windowConfigFile; let windowProps = null; - if (!windowConfigFile || !production) { + // if (!windowConfigFile || !production) { + if (!windowConfigFile) { windowConfigFile = this.defaultWindowConfigFile; } @@ -134,7 +144,8 @@ export class ConfigManager extends GObject.Object { set windowProps(props) { let windowConfigFile = this.windowConfigFile; - if (!windowConfigFile || !production) { + // if (!windowConfigFile || !production) { + if (!windowConfigFile) { windowConfigFile = this.defaultWindowConfigFile; } diff --git a/gnome/.local/share/gnome-shell/extensions/forge@jmmaranan.com/locale/es/LC_MESSAGES/forge.mo b/gnome/.local/share/gnome-shell/extensions/forge@jmmaranan.com/locale/es/LC_MESSAGES/forge.mo index 0d43612..bc5c6ec 100644 Binary files a/gnome/.local/share/gnome-shell/extensions/forge@jmmaranan.com/locale/es/LC_MESSAGES/forge.mo and b/gnome/.local/share/gnome-shell/extensions/forge@jmmaranan.com/locale/es/LC_MESSAGES/forge.mo differ diff --git a/gnome/.local/share/gnome-shell/extensions/forge@jmmaranan.com/locale/fr/LC_MESSAGES/forge.mo b/gnome/.local/share/gnome-shell/extensions/forge@jmmaranan.com/locale/fr/LC_MESSAGES/forge.mo index f704565..3b9a703 100644 Binary files a/gnome/.local/share/gnome-shell/extensions/forge@jmmaranan.com/locale/fr/LC_MESSAGES/forge.mo and b/gnome/.local/share/gnome-shell/extensions/forge@jmmaranan.com/locale/fr/LC_MESSAGES/forge.mo differ diff --git a/gnome/.local/share/gnome-shell/extensions/forge@jmmaranan.com/locale/it/LC_MESSAGES/forge.mo b/gnome/.local/share/gnome-shell/extensions/forge@jmmaranan.com/locale/it/LC_MESSAGES/forge.mo index 9b270f2..7b6d8b5 100644 Binary files a/gnome/.local/share/gnome-shell/extensions/forge@jmmaranan.com/locale/it/LC_MESSAGES/forge.mo and b/gnome/.local/share/gnome-shell/extensions/forge@jmmaranan.com/locale/it/LC_MESSAGES/forge.mo differ diff --git a/gnome/.local/share/gnome-shell/extensions/forge@jmmaranan.com/locale/nl/LC_MESSAGES/forge.mo b/gnome/.local/share/gnome-shell/extensions/forge@jmmaranan.com/locale/nl/LC_MESSAGES/forge.mo index ad876d9..c1495f6 100644 Binary files a/gnome/.local/share/gnome-shell/extensions/forge@jmmaranan.com/locale/nl/LC_MESSAGES/forge.mo and b/gnome/.local/share/gnome-shell/extensions/forge@jmmaranan.com/locale/nl/LC_MESSAGES/forge.mo differ diff --git a/gnome/.local/share/gnome-shell/extensions/forge@jmmaranan.com/locale/pt_BR/LC_MESSAGES/forge.mo b/gnome/.local/share/gnome-shell/extensions/forge@jmmaranan.com/locale/pt_BR/LC_MESSAGES/forge.mo index 9a0bb04..7745013 100644 Binary files a/gnome/.local/share/gnome-shell/extensions/forge@jmmaranan.com/locale/pt_BR/LC_MESSAGES/forge.mo and b/gnome/.local/share/gnome-shell/extensions/forge@jmmaranan.com/locale/pt_BR/LC_MESSAGES/forge.mo differ diff --git a/gnome/.local/share/gnome-shell/extensions/forge@jmmaranan.com/locale/tr/LC_MESSAGES/forge.mo b/gnome/.local/share/gnome-shell/extensions/forge@jmmaranan.com/locale/tr/LC_MESSAGES/forge.mo new file mode 100644 index 0000000..a6434b5 Binary files /dev/null and b/gnome/.local/share/gnome-shell/extensions/forge@jmmaranan.com/locale/tr/LC_MESSAGES/forge.mo differ diff --git a/gnome/.local/share/gnome-shell/extensions/forge@jmmaranan.com/metadata.json b/gnome/.local/share/gnome-shell/extensions/forge@jmmaranan.com/metadata.json index 0931fb2..6a2100d 100644 --- a/gnome/.local/share/gnome-shell/extensions/forge@jmmaranan.com/metadata.json +++ b/gnome/.local/share/gnome-shell/extensions/forge@jmmaranan.com/metadata.json @@ -1,6 +1,6 @@ { "_generated": "Generated by SweetTooth, do not edit", - "description": "Tiling and window manager for GNOME\n\nPlease report bugs/issues on https://github.com/forge-ext/forge/issues", + "description": "Tiling and window manager for GNOME\n- Please report bugs/issues on https://github.com/forge-ext/forge/issues\n- Needs a new maintainer.", "gettext-domain": "forge", "name": "Forge", "session-modes": [ @@ -12,9 +12,10 @@ "45", "46", "47", - "48" + "48", + "49" ], "url": "https://github.com/forge-ext/forge", "uuid": "forge@jmmaranan.com", - "version": 88 + "version": 89 } \ No newline at end of file diff --git a/gnome/.local/share/gnome-shell/extensions/forge@jmmaranan.com/prefs.js b/gnome/.local/share/gnome-shell/extensions/forge@jmmaranan.com/prefs.js index 7543127..21067a6 100644 --- a/gnome/.local/share/gnome-shell/extensions/forge@jmmaranan.com/prefs.js +++ b/gnome/.local/share/gnome-shell/extensions/forge@jmmaranan.com/prefs.js @@ -25,6 +25,7 @@ import { ExtensionPreferences } from "resource:///org/gnome/Shell/Extensions/js/ import { KeyboardPage } from "./lib/prefs/keyboard.js"; import { AppearancePage } from "./lib/prefs/appearance.js"; import { SettingsPage } from "./lib/prefs/settings.js"; +import { FloatingPage } from "./lib/prefs/floating.js"; export default class ForgeExtensionPreferences extends ExtensionPreferences { settings = this.getSettings(); @@ -45,6 +46,7 @@ export default class ForgeExtensionPreferences extends ExtensionPreferences { window.add(new SettingsPage(this)); window.add(new AppearancePage(this)); window.add(new KeyboardPage(this)); + window.add(new FloatingPage(this)); window.search_enabled = true; window.can_navigate_back = true; } diff --git a/gnome/.local/share/gnome-shell/extensions/forge@jmmaranan.com/schemas/gschemas.compiled b/gnome/.local/share/gnome-shell/extensions/forge@jmmaranan.com/schemas/gschemas.compiled index 8ac4d75..a49fd6a 100644 Binary files a/gnome/.local/share/gnome-shell/extensions/forge@jmmaranan.com/schemas/gschemas.compiled and b/gnome/.local/share/gnome-shell/extensions/forge@jmmaranan.com/schemas/gschemas.compiled differ diff --git a/gnome/.local/share/gnome-shell/extensions/forge@jmmaranan.com/schemas/org.gnome.shell.extensions.forge.gschema.xml b/gnome/.local/share/gnome-shell/extensions/forge@jmmaranan.com/schemas/org.gnome.shell.extensions.forge.gschema.xml index 3a7fb9c..c019edc 100644 --- a/gnome/.local/share/gnome-shell/extensions/forge@jmmaranan.com/schemas/org.gnome.shell.extensions.forge.gschema.xml +++ b/gnome/.local/share/gnome-shell/extensions/forge@jmmaranan.com/schemas/org.gnome.shell.extensions.forge.gschema.xml @@ -37,7 +37,7 @@ 15 - The size of the gap between windows in the workarea + The window resize increment/decrement in pixels @@ -148,6 +148,11 @@ Whether to show the tab decoration or not + + 0 + Timestamp to trigger window overrides reload + + diff --git a/gnome/.local/share/gnome-shell/extensions/gsconnect@andyholmes.github.io/config.js b/gnome/.local/share/gnome-shell/extensions/gsconnect@andyholmes.github.io/config.js index ace7500..0f26fcb 100644 --- a/gnome/.local/share/gnome-shell/extensions/gsconnect@andyholmes.github.io/config.js +++ b/gnome/.local/share/gnome-shell/extensions/gsconnect@andyholmes.github.io/config.js @@ -3,7 +3,7 @@ // SPDX-License-Identifier: GPL-2.0-or-later export default { - PACKAGE_VERSION: 62, + PACKAGE_VERSION: 71, PACKAGE_URL: 'https://github.com/GSConnect/gnome-shell-extension-gsconnect', PACKAGE_BUGREPORT: 'https://github.com/GSConnect/gnome-shell-extension-gsconnect/issues/new', PACKAGE_DATADIR: '/usr/local/share/gnome-shell/extensions/gsconnect@andyholmes.github.io', diff --git a/gnome/.local/share/gnome-shell/extensions/gsconnect@andyholmes.github.io/locale/ar/LC_MESSAGES/org.gnome.Shell.Extensions.GSConnect.mo b/gnome/.local/share/gnome-shell/extensions/gsconnect@andyholmes.github.io/locale/ar/LC_MESSAGES/org.gnome.Shell.Extensions.GSConnect.mo index 9f8f9b5..9a4b9b5 100644 Binary files a/gnome/.local/share/gnome-shell/extensions/gsconnect@andyholmes.github.io/locale/ar/LC_MESSAGES/org.gnome.Shell.Extensions.GSConnect.mo and b/gnome/.local/share/gnome-shell/extensions/gsconnect@andyholmes.github.io/locale/ar/LC_MESSAGES/org.gnome.Shell.Extensions.GSConnect.mo differ diff --git a/gnome/.local/share/gnome-shell/extensions/gsconnect@andyholmes.github.io/locale/be/LC_MESSAGES/org.gnome.Shell.Extensions.GSConnect.mo b/gnome/.local/share/gnome-shell/extensions/gsconnect@andyholmes.github.io/locale/be/LC_MESSAGES/org.gnome.Shell.Extensions.GSConnect.mo index 2c1005a..7b0b298 100644 Binary files a/gnome/.local/share/gnome-shell/extensions/gsconnect@andyholmes.github.io/locale/be/LC_MESSAGES/org.gnome.Shell.Extensions.GSConnect.mo and b/gnome/.local/share/gnome-shell/extensions/gsconnect@andyholmes.github.io/locale/be/LC_MESSAGES/org.gnome.Shell.Extensions.GSConnect.mo differ diff --git a/gnome/.local/share/gnome-shell/extensions/gsconnect@andyholmes.github.io/locale/bg/LC_MESSAGES/org.gnome.Shell.Extensions.GSConnect.mo b/gnome/.local/share/gnome-shell/extensions/gsconnect@andyholmes.github.io/locale/bg/LC_MESSAGES/org.gnome.Shell.Extensions.GSConnect.mo index c05fed9..6321ee5 100644 Binary files a/gnome/.local/share/gnome-shell/extensions/gsconnect@andyholmes.github.io/locale/bg/LC_MESSAGES/org.gnome.Shell.Extensions.GSConnect.mo and b/gnome/.local/share/gnome-shell/extensions/gsconnect@andyholmes.github.io/locale/bg/LC_MESSAGES/org.gnome.Shell.Extensions.GSConnect.mo differ diff --git a/gnome/.local/share/gnome-shell/extensions/gsconnect@andyholmes.github.io/locale/ca/LC_MESSAGES/org.gnome.Shell.Extensions.GSConnect.mo b/gnome/.local/share/gnome-shell/extensions/gsconnect@andyholmes.github.io/locale/ca/LC_MESSAGES/org.gnome.Shell.Extensions.GSConnect.mo index d8c02e0..7f091d6 100644 Binary files a/gnome/.local/share/gnome-shell/extensions/gsconnect@andyholmes.github.io/locale/ca/LC_MESSAGES/org.gnome.Shell.Extensions.GSConnect.mo and b/gnome/.local/share/gnome-shell/extensions/gsconnect@andyholmes.github.io/locale/ca/LC_MESSAGES/org.gnome.Shell.Extensions.GSConnect.mo differ diff --git a/gnome/.local/share/gnome-shell/extensions/gsconnect@andyholmes.github.io/locale/cs/LC_MESSAGES/org.gnome.Shell.Extensions.GSConnect.mo b/gnome/.local/share/gnome-shell/extensions/gsconnect@andyholmes.github.io/locale/cs/LC_MESSAGES/org.gnome.Shell.Extensions.GSConnect.mo index 5ed7092..3d1a25d 100644 Binary files a/gnome/.local/share/gnome-shell/extensions/gsconnect@andyholmes.github.io/locale/cs/LC_MESSAGES/org.gnome.Shell.Extensions.GSConnect.mo and b/gnome/.local/share/gnome-shell/extensions/gsconnect@andyholmes.github.io/locale/cs/LC_MESSAGES/org.gnome.Shell.Extensions.GSConnect.mo differ diff --git a/gnome/.local/share/gnome-shell/extensions/gsconnect@andyholmes.github.io/locale/da/LC_MESSAGES/org.gnome.Shell.Extensions.GSConnect.mo b/gnome/.local/share/gnome-shell/extensions/gsconnect@andyholmes.github.io/locale/da/LC_MESSAGES/org.gnome.Shell.Extensions.GSConnect.mo index ca0461c..a8f412e 100644 Binary files a/gnome/.local/share/gnome-shell/extensions/gsconnect@andyholmes.github.io/locale/da/LC_MESSAGES/org.gnome.Shell.Extensions.GSConnect.mo and b/gnome/.local/share/gnome-shell/extensions/gsconnect@andyholmes.github.io/locale/da/LC_MESSAGES/org.gnome.Shell.Extensions.GSConnect.mo differ diff --git a/gnome/.local/share/gnome-shell/extensions/gsconnect@andyholmes.github.io/locale/de/LC_MESSAGES/org.gnome.Shell.Extensions.GSConnect.mo b/gnome/.local/share/gnome-shell/extensions/gsconnect@andyholmes.github.io/locale/de/LC_MESSAGES/org.gnome.Shell.Extensions.GSConnect.mo index f58f461..ccc11ff 100644 Binary files a/gnome/.local/share/gnome-shell/extensions/gsconnect@andyholmes.github.io/locale/de/LC_MESSAGES/org.gnome.Shell.Extensions.GSConnect.mo and b/gnome/.local/share/gnome-shell/extensions/gsconnect@andyholmes.github.io/locale/de/LC_MESSAGES/org.gnome.Shell.Extensions.GSConnect.mo differ diff --git a/gnome/.local/share/gnome-shell/extensions/gsconnect@andyholmes.github.io/locale/es/LC_MESSAGES/org.gnome.Shell.Extensions.GSConnect.mo b/gnome/.local/share/gnome-shell/extensions/gsconnect@andyholmes.github.io/locale/es/LC_MESSAGES/org.gnome.Shell.Extensions.GSConnect.mo index 2a70df8..05bc341 100644 Binary files a/gnome/.local/share/gnome-shell/extensions/gsconnect@andyholmes.github.io/locale/es/LC_MESSAGES/org.gnome.Shell.Extensions.GSConnect.mo and b/gnome/.local/share/gnome-shell/extensions/gsconnect@andyholmes.github.io/locale/es/LC_MESSAGES/org.gnome.Shell.Extensions.GSConnect.mo differ diff --git a/gnome/.local/share/gnome-shell/extensions/gsconnect@andyholmes.github.io/locale/et/LC_MESSAGES/org.gnome.Shell.Extensions.GSConnect.mo b/gnome/.local/share/gnome-shell/extensions/gsconnect@andyholmes.github.io/locale/et/LC_MESSAGES/org.gnome.Shell.Extensions.GSConnect.mo index 2bda121..adf94d7 100644 Binary files a/gnome/.local/share/gnome-shell/extensions/gsconnect@andyholmes.github.io/locale/et/LC_MESSAGES/org.gnome.Shell.Extensions.GSConnect.mo and b/gnome/.local/share/gnome-shell/extensions/gsconnect@andyholmes.github.io/locale/et/LC_MESSAGES/org.gnome.Shell.Extensions.GSConnect.mo differ diff --git a/gnome/.local/share/gnome-shell/extensions/gsconnect@andyholmes.github.io/locale/fa/LC_MESSAGES/org.gnome.Shell.Extensions.GSConnect.mo b/gnome/.local/share/gnome-shell/extensions/gsconnect@andyholmes.github.io/locale/fa/LC_MESSAGES/org.gnome.Shell.Extensions.GSConnect.mo index 88b9784..4365a7c 100644 Binary files a/gnome/.local/share/gnome-shell/extensions/gsconnect@andyholmes.github.io/locale/fa/LC_MESSAGES/org.gnome.Shell.Extensions.GSConnect.mo and b/gnome/.local/share/gnome-shell/extensions/gsconnect@andyholmes.github.io/locale/fa/LC_MESSAGES/org.gnome.Shell.Extensions.GSConnect.mo differ diff --git a/gnome/.local/share/gnome-shell/extensions/gsconnect@andyholmes.github.io/locale/fi/LC_MESSAGES/org.gnome.Shell.Extensions.GSConnect.mo b/gnome/.local/share/gnome-shell/extensions/gsconnect@andyholmes.github.io/locale/fi/LC_MESSAGES/org.gnome.Shell.Extensions.GSConnect.mo index 0347e6e..ba5bb61 100644 Binary files a/gnome/.local/share/gnome-shell/extensions/gsconnect@andyholmes.github.io/locale/fi/LC_MESSAGES/org.gnome.Shell.Extensions.GSConnect.mo and b/gnome/.local/share/gnome-shell/extensions/gsconnect@andyholmes.github.io/locale/fi/LC_MESSAGES/org.gnome.Shell.Extensions.GSConnect.mo differ diff --git a/gnome/.local/share/gnome-shell/extensions/gsconnect@andyholmes.github.io/locale/fr/LC_MESSAGES/org.gnome.Shell.Extensions.GSConnect.mo b/gnome/.local/share/gnome-shell/extensions/gsconnect@andyholmes.github.io/locale/fr/LC_MESSAGES/org.gnome.Shell.Extensions.GSConnect.mo index c63401b..d88b0bd 100644 Binary files a/gnome/.local/share/gnome-shell/extensions/gsconnect@andyholmes.github.io/locale/fr/LC_MESSAGES/org.gnome.Shell.Extensions.GSConnect.mo and b/gnome/.local/share/gnome-shell/extensions/gsconnect@andyholmes.github.io/locale/fr/LC_MESSAGES/org.gnome.Shell.Extensions.GSConnect.mo differ diff --git a/gnome/.local/share/gnome-shell/extensions/gsconnect@andyholmes.github.io/locale/fy/LC_MESSAGES/org.gnome.Shell.Extensions.GSConnect.mo b/gnome/.local/share/gnome-shell/extensions/gsconnect@andyholmes.github.io/locale/fy/LC_MESSAGES/org.gnome.Shell.Extensions.GSConnect.mo index a67e1a3..ebd3bed 100644 Binary files a/gnome/.local/share/gnome-shell/extensions/gsconnect@andyholmes.github.io/locale/fy/LC_MESSAGES/org.gnome.Shell.Extensions.GSConnect.mo and b/gnome/.local/share/gnome-shell/extensions/gsconnect@andyholmes.github.io/locale/fy/LC_MESSAGES/org.gnome.Shell.Extensions.GSConnect.mo differ diff --git a/gnome/.local/share/gnome-shell/extensions/gsconnect@andyholmes.github.io/locale/gl/LC_MESSAGES/org.gnome.Shell.Extensions.GSConnect.mo b/gnome/.local/share/gnome-shell/extensions/gsconnect@andyholmes.github.io/locale/gl/LC_MESSAGES/org.gnome.Shell.Extensions.GSConnect.mo index 33fb285..0e8255a 100644 Binary files a/gnome/.local/share/gnome-shell/extensions/gsconnect@andyholmes.github.io/locale/gl/LC_MESSAGES/org.gnome.Shell.Extensions.GSConnect.mo and b/gnome/.local/share/gnome-shell/extensions/gsconnect@andyholmes.github.io/locale/gl/LC_MESSAGES/org.gnome.Shell.Extensions.GSConnect.mo differ diff --git a/gnome/.local/share/gnome-shell/extensions/gsconnect@andyholmes.github.io/locale/he/LC_MESSAGES/org.gnome.Shell.Extensions.GSConnect.mo b/gnome/.local/share/gnome-shell/extensions/gsconnect@andyholmes.github.io/locale/he/LC_MESSAGES/org.gnome.Shell.Extensions.GSConnect.mo index 10497da..a4d5059 100644 Binary files a/gnome/.local/share/gnome-shell/extensions/gsconnect@andyholmes.github.io/locale/he/LC_MESSAGES/org.gnome.Shell.Extensions.GSConnect.mo and b/gnome/.local/share/gnome-shell/extensions/gsconnect@andyholmes.github.io/locale/he/LC_MESSAGES/org.gnome.Shell.Extensions.GSConnect.mo differ diff --git a/gnome/.local/share/gnome-shell/extensions/gsconnect@andyholmes.github.io/locale/hu/LC_MESSAGES/org.gnome.Shell.Extensions.GSConnect.mo b/gnome/.local/share/gnome-shell/extensions/gsconnect@andyholmes.github.io/locale/hu/LC_MESSAGES/org.gnome.Shell.Extensions.GSConnect.mo index 00f8dd3..acf3213 100644 Binary files a/gnome/.local/share/gnome-shell/extensions/gsconnect@andyholmes.github.io/locale/hu/LC_MESSAGES/org.gnome.Shell.Extensions.GSConnect.mo and b/gnome/.local/share/gnome-shell/extensions/gsconnect@andyholmes.github.io/locale/hu/LC_MESSAGES/org.gnome.Shell.Extensions.GSConnect.mo differ diff --git a/gnome/.local/share/gnome-shell/extensions/gsconnect@andyholmes.github.io/locale/id/LC_MESSAGES/org.gnome.Shell.Extensions.GSConnect.mo b/gnome/.local/share/gnome-shell/extensions/gsconnect@andyholmes.github.io/locale/id/LC_MESSAGES/org.gnome.Shell.Extensions.GSConnect.mo index 0c6161a..56b32da 100644 Binary files a/gnome/.local/share/gnome-shell/extensions/gsconnect@andyholmes.github.io/locale/id/LC_MESSAGES/org.gnome.Shell.Extensions.GSConnect.mo and b/gnome/.local/share/gnome-shell/extensions/gsconnect@andyholmes.github.io/locale/id/LC_MESSAGES/org.gnome.Shell.Extensions.GSConnect.mo differ diff --git a/gnome/.local/share/gnome-shell/extensions/gsconnect@andyholmes.github.io/locale/it/LC_MESSAGES/org.gnome.Shell.Extensions.GSConnect.mo b/gnome/.local/share/gnome-shell/extensions/gsconnect@andyholmes.github.io/locale/it/LC_MESSAGES/org.gnome.Shell.Extensions.GSConnect.mo index a3cee3d..212717b 100644 Binary files a/gnome/.local/share/gnome-shell/extensions/gsconnect@andyholmes.github.io/locale/it/LC_MESSAGES/org.gnome.Shell.Extensions.GSConnect.mo and b/gnome/.local/share/gnome-shell/extensions/gsconnect@andyholmes.github.io/locale/it/LC_MESSAGES/org.gnome.Shell.Extensions.GSConnect.mo differ diff --git a/gnome/.local/share/gnome-shell/extensions/gsconnect@andyholmes.github.io/locale/ko/LC_MESSAGES/org.gnome.Shell.Extensions.GSConnect.mo b/gnome/.local/share/gnome-shell/extensions/gsconnect@andyholmes.github.io/locale/ko/LC_MESSAGES/org.gnome.Shell.Extensions.GSConnect.mo index 89f118b..8e32044 100644 Binary files a/gnome/.local/share/gnome-shell/extensions/gsconnect@andyholmes.github.io/locale/ko/LC_MESSAGES/org.gnome.Shell.Extensions.GSConnect.mo and b/gnome/.local/share/gnome-shell/extensions/gsconnect@andyholmes.github.io/locale/ko/LC_MESSAGES/org.gnome.Shell.Extensions.GSConnect.mo differ diff --git a/gnome/.local/share/gnome-shell/extensions/gsconnect@andyholmes.github.io/locale/lt/LC_MESSAGES/org.gnome.Shell.Extensions.GSConnect.mo b/gnome/.local/share/gnome-shell/extensions/gsconnect@andyholmes.github.io/locale/lt/LC_MESSAGES/org.gnome.Shell.Extensions.GSConnect.mo index 6a114a0..fbb38b5 100644 Binary files a/gnome/.local/share/gnome-shell/extensions/gsconnect@andyholmes.github.io/locale/lt/LC_MESSAGES/org.gnome.Shell.Extensions.GSConnect.mo and b/gnome/.local/share/gnome-shell/extensions/gsconnect@andyholmes.github.io/locale/lt/LC_MESSAGES/org.gnome.Shell.Extensions.GSConnect.mo differ diff --git a/gnome/.local/share/gnome-shell/extensions/gsconnect@andyholmes.github.io/locale/pl/LC_MESSAGES/org.gnome.Shell.Extensions.GSConnect.mo b/gnome/.local/share/gnome-shell/extensions/gsconnect@andyholmes.github.io/locale/pl/LC_MESSAGES/org.gnome.Shell.Extensions.GSConnect.mo index 200c8e7..917bca6 100644 Binary files a/gnome/.local/share/gnome-shell/extensions/gsconnect@andyholmes.github.io/locale/pl/LC_MESSAGES/org.gnome.Shell.Extensions.GSConnect.mo and b/gnome/.local/share/gnome-shell/extensions/gsconnect@andyholmes.github.io/locale/pl/LC_MESSAGES/org.gnome.Shell.Extensions.GSConnect.mo differ diff --git a/gnome/.local/share/gnome-shell/extensions/gsconnect@andyholmes.github.io/locale/pt/LC_MESSAGES/org.gnome.Shell.Extensions.GSConnect.mo b/gnome/.local/share/gnome-shell/extensions/gsconnect@andyholmes.github.io/locale/pt/LC_MESSAGES/org.gnome.Shell.Extensions.GSConnect.mo index 1ca99b5..cc54aa6 100644 Binary files a/gnome/.local/share/gnome-shell/extensions/gsconnect@andyholmes.github.io/locale/pt/LC_MESSAGES/org.gnome.Shell.Extensions.GSConnect.mo and b/gnome/.local/share/gnome-shell/extensions/gsconnect@andyholmes.github.io/locale/pt/LC_MESSAGES/org.gnome.Shell.Extensions.GSConnect.mo differ diff --git a/gnome/.local/share/gnome-shell/extensions/gsconnect@andyholmes.github.io/locale/pt_BR/LC_MESSAGES/org.gnome.Shell.Extensions.GSConnect.mo b/gnome/.local/share/gnome-shell/extensions/gsconnect@andyholmes.github.io/locale/pt_BR/LC_MESSAGES/org.gnome.Shell.Extensions.GSConnect.mo index 5f764ab..6273cb9 100644 Binary files a/gnome/.local/share/gnome-shell/extensions/gsconnect@andyholmes.github.io/locale/pt_BR/LC_MESSAGES/org.gnome.Shell.Extensions.GSConnect.mo and b/gnome/.local/share/gnome-shell/extensions/gsconnect@andyholmes.github.io/locale/pt_BR/LC_MESSAGES/org.gnome.Shell.Extensions.GSConnect.mo differ diff --git a/gnome/.local/share/gnome-shell/extensions/gsconnect@andyholmes.github.io/locale/ru/LC_MESSAGES/org.gnome.Shell.Extensions.GSConnect.mo b/gnome/.local/share/gnome-shell/extensions/gsconnect@andyholmes.github.io/locale/ru/LC_MESSAGES/org.gnome.Shell.Extensions.GSConnect.mo index 6c7977d..256a13f 100644 Binary files a/gnome/.local/share/gnome-shell/extensions/gsconnect@andyholmes.github.io/locale/ru/LC_MESSAGES/org.gnome.Shell.Extensions.GSConnect.mo and b/gnome/.local/share/gnome-shell/extensions/gsconnect@andyholmes.github.io/locale/ru/LC_MESSAGES/org.gnome.Shell.Extensions.GSConnect.mo differ diff --git a/gnome/.local/share/gnome-shell/extensions/gsconnect@andyholmes.github.io/locale/sr/LC_MESSAGES/org.gnome.Shell.Extensions.GSConnect.mo b/gnome/.local/share/gnome-shell/extensions/gsconnect@andyholmes.github.io/locale/sr/LC_MESSAGES/org.gnome.Shell.Extensions.GSConnect.mo index 4ef2ec0..8db5e44 100644 Binary files a/gnome/.local/share/gnome-shell/extensions/gsconnect@andyholmes.github.io/locale/sr/LC_MESSAGES/org.gnome.Shell.Extensions.GSConnect.mo and b/gnome/.local/share/gnome-shell/extensions/gsconnect@andyholmes.github.io/locale/sr/LC_MESSAGES/org.gnome.Shell.Extensions.GSConnect.mo differ diff --git a/gnome/.local/share/gnome-shell/extensions/gsconnect@andyholmes.github.io/locale/sr@latin/LC_MESSAGES/org.gnome.Shell.Extensions.GSConnect.mo b/gnome/.local/share/gnome-shell/extensions/gsconnect@andyholmes.github.io/locale/sr@latin/LC_MESSAGES/org.gnome.Shell.Extensions.GSConnect.mo index 0890f5d..ab2a5da 100644 Binary files a/gnome/.local/share/gnome-shell/extensions/gsconnect@andyholmes.github.io/locale/sr@latin/LC_MESSAGES/org.gnome.Shell.Extensions.GSConnect.mo and b/gnome/.local/share/gnome-shell/extensions/gsconnect@andyholmes.github.io/locale/sr@latin/LC_MESSAGES/org.gnome.Shell.Extensions.GSConnect.mo differ diff --git a/gnome/.local/share/gnome-shell/extensions/gsconnect@andyholmes.github.io/locale/sv/LC_MESSAGES/org.gnome.Shell.Extensions.GSConnect.mo b/gnome/.local/share/gnome-shell/extensions/gsconnect@andyholmes.github.io/locale/sv/LC_MESSAGES/org.gnome.Shell.Extensions.GSConnect.mo index cda989f..cc2aaa6 100644 Binary files a/gnome/.local/share/gnome-shell/extensions/gsconnect@andyholmes.github.io/locale/sv/LC_MESSAGES/org.gnome.Shell.Extensions.GSConnect.mo and b/gnome/.local/share/gnome-shell/extensions/gsconnect@andyholmes.github.io/locale/sv/LC_MESSAGES/org.gnome.Shell.Extensions.GSConnect.mo differ diff --git a/gnome/.local/share/gnome-shell/extensions/gsconnect@andyholmes.github.io/locale/tr/LC_MESSAGES/org.gnome.Shell.Extensions.GSConnect.mo b/gnome/.local/share/gnome-shell/extensions/gsconnect@andyholmes.github.io/locale/tr/LC_MESSAGES/org.gnome.Shell.Extensions.GSConnect.mo index 3851814..510a52a 100644 Binary files a/gnome/.local/share/gnome-shell/extensions/gsconnect@andyholmes.github.io/locale/tr/LC_MESSAGES/org.gnome.Shell.Extensions.GSConnect.mo and b/gnome/.local/share/gnome-shell/extensions/gsconnect@andyholmes.github.io/locale/tr/LC_MESSAGES/org.gnome.Shell.Extensions.GSConnect.mo differ diff --git a/gnome/.local/share/gnome-shell/extensions/gsconnect@andyholmes.github.io/locale/uk/LC_MESSAGES/org.gnome.Shell.Extensions.GSConnect.mo b/gnome/.local/share/gnome-shell/extensions/gsconnect@andyholmes.github.io/locale/uk/LC_MESSAGES/org.gnome.Shell.Extensions.GSConnect.mo index ca9ea4d..08122df 100644 Binary files a/gnome/.local/share/gnome-shell/extensions/gsconnect@andyholmes.github.io/locale/uk/LC_MESSAGES/org.gnome.Shell.Extensions.GSConnect.mo and b/gnome/.local/share/gnome-shell/extensions/gsconnect@andyholmes.github.io/locale/uk/LC_MESSAGES/org.gnome.Shell.Extensions.GSConnect.mo differ diff --git a/gnome/.local/share/gnome-shell/extensions/gsconnect@andyholmes.github.io/locale/zh_CN/LC_MESSAGES/org.gnome.Shell.Extensions.GSConnect.mo b/gnome/.local/share/gnome-shell/extensions/gsconnect@andyholmes.github.io/locale/zh_CN/LC_MESSAGES/org.gnome.Shell.Extensions.GSConnect.mo index 75b509d..8e01ca3 100644 Binary files a/gnome/.local/share/gnome-shell/extensions/gsconnect@andyholmes.github.io/locale/zh_CN/LC_MESSAGES/org.gnome.Shell.Extensions.GSConnect.mo and b/gnome/.local/share/gnome-shell/extensions/gsconnect@andyholmes.github.io/locale/zh_CN/LC_MESSAGES/org.gnome.Shell.Extensions.GSConnect.mo differ diff --git a/gnome/.local/share/gnome-shell/extensions/gsconnect@andyholmes.github.io/locale/zh_TW/LC_MESSAGES/org.gnome.Shell.Extensions.GSConnect.mo b/gnome/.local/share/gnome-shell/extensions/gsconnect@andyholmes.github.io/locale/zh_TW/LC_MESSAGES/org.gnome.Shell.Extensions.GSConnect.mo index 80d15b8..15ea8d8 100644 Binary files a/gnome/.local/share/gnome-shell/extensions/gsconnect@andyholmes.github.io/locale/zh_TW/LC_MESSAGES/org.gnome.Shell.Extensions.GSConnect.mo and b/gnome/.local/share/gnome-shell/extensions/gsconnect@andyholmes.github.io/locale/zh_TW/LC_MESSAGES/org.gnome.Shell.Extensions.GSConnect.mo differ diff --git a/gnome/.local/share/gnome-shell/extensions/gsconnect@andyholmes.github.io/metadata.json b/gnome/.local/share/gnome-shell/extensions/gsconnect@andyholmes.github.io/metadata.json index 4823ba4..f6c5cda 100644 --- a/gnome/.local/share/gnome-shell/extensions/gsconnect@andyholmes.github.io/metadata.json +++ b/gnome/.local/share/gnome-shell/extensions/gsconnect@andyholmes.github.io/metadata.json @@ -5,9 +5,10 @@ "shell-version": [ "46", "47", - "48" + "48", + "49" ], "url": "https://github.com/GSConnect/gnome-shell-extension-gsconnect/wiki", "uuid": "gsconnect@andyholmes.github.io", - "version": 62 + "version": 71 } \ No newline at end of file diff --git a/gnome/.local/share/gnome-shell/extensions/gsconnect@andyholmes.github.io/org.gnome.Shell.Extensions.GSConnect.gresource b/gnome/.local/share/gnome-shell/extensions/gsconnect@andyholmes.github.io/org.gnome.Shell.Extensions.GSConnect.gresource index 33c5344..1b02abc 100644 Binary files a/gnome/.local/share/gnome-shell/extensions/gsconnect@andyholmes.github.io/org.gnome.Shell.Extensions.GSConnect.gresource and b/gnome/.local/share/gnome-shell/extensions/gsconnect@andyholmes.github.io/org.gnome.Shell.Extensions.GSConnect.gresource differ diff --git a/gnome/.local/share/gnome-shell/extensions/gsconnect@andyholmes.github.io/preferences/device.js b/gnome/.local/share/gnome-shell/extensions/gsconnect@andyholmes.github.io/preferences/device.js index e8d30a8..3510420 100644 --- a/gnome/.local/share/gnome-shell/extensions/gsconnect@andyholmes.github.io/preferences/device.js +++ b/gnome/.local/share/gnome-shell/extensions/gsconnect@andyholmes.github.io/preferences/device.js @@ -267,6 +267,7 @@ export const Panel = GObject.registerClass({ 'sharing', 'sharing-page', 'desktop-list', 'clipboard', 'clipboard-sync', 'mousepad', 'mpris', 'systemvolume', 'share', 'share-list', 'receive-files', 'receive-directory', + 'links', 'links-list', 'launch-urls', // Battery 'battery', @@ -467,6 +468,7 @@ export const Panel = GObject.registerClass({ settings = this.pluginSettings('share'); this.actions.add_action(settings.create_action('receive-files')); + this.actions.add_action(settings.create_action('launch-urls')); settings = this.pluginSettings('sms'); this.actions.add_action(settings.create_action('legacy-sms')); diff --git a/gnome/.local/share/gnome-shell/extensions/gsconnect@andyholmes.github.io/preferences/service.js b/gnome/.local/share/gnome-shell/extensions/gsconnect@andyholmes.github.io/preferences/service.js index 9f571fb..47f12ef 100644 --- a/gnome/.local/share/gnome-shell/extensions/gsconnect@andyholmes.github.io/preferences/service.js +++ b/gnome/.local/share/gnome-shell/extensions/gsconnect@andyholmes.github.io/preferences/service.js @@ -146,7 +146,8 @@ export const Window = GObject.registerClass({ Template: 'resource:///org/gnome/Shell/Extensions/GSConnect/ui/preferences-window.ui', Children: [ // HeaderBar - 'headerbar', 'infobar', 'stack', + 'headerbar', 'stack', + 'infobar_discoverable', 'infobar_openssl', 'service-menu', 'service-edit', 'refresh-button', 'device-menu', 'prev-button', @@ -203,12 +204,21 @@ export const Window = GObject.registerClass({ // Discoverable InfoBar this.settings.bind( 'discoverable', - this.infobar, + this.infobar_discoverable, 'reveal-child', Gio.SettingsBindFlags.INVERT_BOOLEAN ); this.add_action(this.settings.create_action('discoverable')); + // OpenSSL-missing infobar + this.settings.bind( + 'missing-openssl', + this.infobar_openssl, + 'reveal-child', + Gio.SettingsBindFlags.DEFAULT + ); + this.add_action(this.settings.create_action('missing-openssl')); + // Application Menu this._initMenu(); @@ -297,7 +307,9 @@ export const Window = GObject.registerClass({ } _refresh() { - if (this.service.active && this.device_list.get_children().length < 1) { + const missing_openssl = this.settings.get_boolean('missing-openssl'); + const no_devices = this.service.active && this.device_list.get_children().length < 1; + if (missing_openssl || no_devices) { this.device_list_spinner.active = true; this.service.activate_action('refresh', null); } else { @@ -487,6 +499,14 @@ export const Window = GObject.registerClass({ this.service_edit.grab_focus(); } + _onRetryOpenssl(button, event) { + this.settings.set_boolean('enabled', false); + GLib.timeout_add_seconds(GLib.PRIORITY_DEFAULT_IDLE, 2, () => { + this.settings.set_boolean('enabled', true); + return GLib.SOURCE_REMOVE; + }); + } + /* * Context Switcher */ diff --git a/gnome/.local/share/gnome-shell/extensions/gsconnect@andyholmes.github.io/schemas/gschemas.compiled b/gnome/.local/share/gnome-shell/extensions/gsconnect@andyholmes.github.io/schemas/gschemas.compiled index 60e8035..6bbd717 100644 Binary files a/gnome/.local/share/gnome-shell/extensions/gsconnect@andyholmes.github.io/schemas/gschemas.compiled and b/gnome/.local/share/gnome-shell/extensions/gsconnect@andyholmes.github.io/schemas/gschemas.compiled differ diff --git a/gnome/.local/share/gnome-shell/extensions/gsconnect@andyholmes.github.io/schemas/org.gnome.Shell.Extensions.GSConnect.gschema.xml b/gnome/.local/share/gnome-shell/extensions/gsconnect@andyholmes.github.io/schemas/org.gnome.Shell.Extensions.GSConnect.gschema.xml index 4dfaddb..bbcb566 100644 --- a/gnome/.local/share/gnome-shell/extensions/gsconnect@andyholmes.github.io/schemas/org.gnome.Shell.Extensions.GSConnect.gschema.xml +++ b/gnome/.local/share/gnome-shell/extensions/gsconnect@andyholmes.github.io/schemas/org.gnome.Shell.Extensions.GSConnect.gschema.xml @@ -38,6 +38,9 @@ SPDX-License-Identifier: GPL-2.0-or-later true + + false + @@ -160,6 +163,9 @@ SPDX-License-Identifier: GPL-2.0-or-later "" + + false + diff --git a/gnome/.local/share/gnome-shell/extensions/gsconnect@andyholmes.github.io/service/backends/lan.js b/gnome/.local/share/gnome-shell/extensions/gsconnect@andyholmes.github.io/service/backends/lan.js index 5b8927e..fc08f3f 100644 --- a/gnome/.local/share/gnome-shell/extensions/gsconnect@andyholmes.github.io/service/backends/lan.js +++ b/gnome/.local/share/gnome-shell/extensions/gsconnect@andyholmes.github.io/service/backends/lan.js @@ -367,9 +367,12 @@ export const ChannelService = GObject.registerClass({ if (!packet.body.deviceName) throw new Error('missing deviceName'); - // Reject invalid device names - if (!Device.validateName(packet.body.deviceName)) - throw new Error(`invalid deviceName "${packet.body.deviceName}"`); + // Sanitize invalid device names + if (!Device.validateName(packet.body.deviceName)) { + const sanitized = Device.sanitizeName(packet.body.deviceName); + debug(`Sanitized invalid device name "${packet.body.deviceName}" to "${sanitized}"`); + packet.body.deviceName = sanitized; + } debug(packet); @@ -704,6 +707,25 @@ export const Channel = GObject.registerClass({ return this._authenticate(connection); } + async _exchangeIdentities() { + await this.sendPacket(this.backend.identity); + const identity = await this.readPacket(); + + if (this.identity.body.protocolVersion !== identity.body.protocolVersion) { + this.identity = null; + throw new Error(`Unexpected protocol version ${identity.protocolVersion}; ` + + `handshake started with protocol version ${this.identity.protocolVersion}`); + } + + if (this.identity.body.deviceId !== identity.body.deviceId) { + this.identity = null; + throw new Error(`Unexpected device ID "${identity.body.deviceId}"; ` + + `handshake started with device ID "${this.identity.body.deviceId}"`); + } + + this.identity = identity; + } + /** * Negotiate an incoming connection * @@ -740,17 +762,19 @@ export const Channel = GObject.registerClass({ if (!this.identity.body.deviceName) throw new Error('missing deviceName'); - // Reject invalid device names - if (!Device.validateName(this.identity.body.deviceName)) - throw new Error(`invalid deviceName "${this.identity.body.deviceName}"`); + // Sanitize invalid device names + if (!Device.validateName(this.identity.body.deviceName)) { + const sanitized = Device.sanitizeName(this.identity.body.deviceName); + debug(`Sanitized invalid device name "${this.identity.body.deviceName}" to "${sanitized}"`); + this.identity.body.deviceName = sanitized; + } this._connection = await this._encryptClient(connection); // Starting with protocol version 8, the devices are expected to // exchange identity packets again after TLS negotiation if (this.identity.body.protocolVersion >= 8) { - await this.sendPacket(this.backend.identity); - this.identity = await this.readPacket(); + await this._exchangeIdentities(); } } catch (e) { this.close(); @@ -780,8 +804,7 @@ export const Channel = GObject.registerClass({ // Starting with protocol version 8, the devices are expected to // exchange identity packets again after TLS negotiation if (this.identity.body.protocolVersion >= 8) { - await this.sendPacket(this.backend.identity); - this.identity = await this.readPacket(); + await this._exchangeIdentities(); } } catch (e) { this.close(); diff --git a/gnome/.local/share/gnome-shell/extensions/gsconnect@andyholmes.github.io/service/components/contacts.js b/gnome/.local/share/gnome-shell/extensions/gsconnect@andyholmes.github.io/service/components/contacts.js index 2ce5620..cd30c4a 100644 --- a/gnome/.local/share/gnome-shell/extensions/gsconnect@andyholmes.github.io/service/components/contacts.js +++ b/gnome/.local/share/gnome-shell/extensions/gsconnect@andyholmes.github.io/service/components/contacts.js @@ -64,7 +64,7 @@ const Store = GObject.registerClass({ /** * Parse an EContact and add it to the store. * - * @param {EBookContacts.Contact} econtact - an EContact to parse + * @param {"EBookContacts.Contact"} econtact - an EContact to parse * @param {string} [origin] - an optional origin string */ async _parseEContact(econtact, origin = 'desktop') { diff --git a/gnome/.local/share/gnome-shell/extensions/gsconnect@andyholmes.github.io/service/components/pulseaudio.js b/gnome/.local/share/gnome-shell/extensions/gsconnect@andyholmes.github.io/service/components/pulseaudio.js index 96717c2..67dd63f 100644 --- a/gnome/.local/share/gnome-shell/extensions/gsconnect@andyholmes.github.io/service/components/pulseaudio.js +++ b/gnome/.local/share/gnome-shell/extensions/gsconnect@andyholmes.github.io/service/components/pulseaudio.js @@ -15,8 +15,17 @@ let Gvc = null; try { // Add gnome-shell's typelib dir to the search path const typelibDir = GLib.build_filenamev([Config.GNOME_SHELL_LIBDIR, 'gnome-shell']); - GIRepository.Repository.prepend_search_path(typelibDir); - GIRepository.Repository.prepend_library_path(typelibDir); + + if (GIRepository.Repository.hasOwnProperty('prepend_search_path')) { + // GNOME <= 48 / GIRepository 2.0 + GIRepository.Repository.prepend_search_path(typelibDir); + GIRepository.Repository.prepend_library_path(typelibDir); + } else { + // GNOME 49+ / GIRepository 3.0 + const repo = GIRepository.Repository.dup_default(); + repo.prepend_search_path(typelibDir); + repo.prepend_library_path(typelibDir); + } Gvc = (await import('gi://Gvc')).default; } catch {} diff --git a/gnome/.local/share/gnome-shell/extensions/gsconnect@andyholmes.github.io/service/daemon.js b/gnome/.local/share/gnome-shell/extensions/gsconnect@andyholmes.github.io/service/daemon.js index f9b1f13..b241434 100755 --- a/gnome/.local/share/gnome-shell/extensions/gsconnect@andyholmes.github.io/service/daemon.js +++ b/gnome/.local/share/gnome-shell/extensions/gsconnect@andyholmes.github.io/service/daemon.js @@ -7,12 +7,18 @@ import Gdk from 'gi://Gdk?version=3.0'; import 'gi://GdkPixbuf?version=2.0'; import Gio from 'gi://Gio?version=2.0'; -import 'gi://GIRepository?version=2.0'; import GLib from 'gi://GLib?version=2.0'; import GObject from 'gi://GObject?version=2.0'; import Gtk from 'gi://Gtk?version=3.0'; import 'gi://Pango?version=1.0'; +// GNOME 49 uses GIRepository 3.0 +import('gi://GIRepository?version=3.0').catch(() => { + import('gi://GIRepository?version=2.0').catch(() => {}); +}); + +import('gi://GioUnix?version=2.0').catch(() => {}); // Set version for optional dependency + import system from 'system'; import './init.js'; @@ -21,8 +27,7 @@ import Config from '../config.js'; import Device from './device.js'; import Manager from './manager.js'; import * as ServiceUI from './ui/service.js'; - -import('gi://GioUnix?version=2.0').catch(() => {}); // Set version for optional dependency +import {MissingOpensslError} from '../utils/exceptions.js'; /** @@ -48,14 +53,14 @@ const Service = GObject.registerClass({ _migrateConfiguration() { if (!Device.validateName(this.settings.get_string('name'))) - this.settings.set('name', GLib.get_host_name().slice(0, 32)); + this.settings.set_string('name', GLib.get_host_name().slice(0, 32)); const [certPath, keyPath] = [ GLib.build_filenamev([Config.CONFIGDIR, 'certificate.pem']), GLib.build_filenamev([Config.CONFIGDIR, 'private.pem']), ]; - const certificate = Gio.TlsCertificate.new_for_paths(certPath, keyPath, - null); + + const certificate = Gio.TlsCertificate.new_for_paths(certPath, keyPath, null); if (Device.validateId(certificate.common_name)) return; @@ -92,7 +97,7 @@ const Service = GObject.registerClass({ // Notify the user const notification = Gio.Notification.new(_('Settings Migrated')); - notification.set_body(_('GSConnect has updated to support changes to the KDE Connect protocol. Some devices may need to be repaired.')); + notification.set_body(_('GSConnect has updated to support changes to the KDE Connect protocol. Some devices may need to be re-paired.')); notification.set_icon(new Gio.ThemedIcon({name: 'dialog-warning'})); notification.set_priority(Gio.NotificationPriority.HIGH); this.send_notification('settings-migrated', notification); @@ -211,8 +216,9 @@ const Service = GObject.registerClass({ * Report a service-level error * * @param {object} error - An Error or object with name, message and stack + * @param {string} [notification_id] - An optional id for the notification */ - notify_error(error) { + notify_error(error, notification_id) { try { // Always log the error logError(error); @@ -226,8 +232,12 @@ const Service = GObject.registerClass({ if (error.name === undefined) error.name = 'Error'; + if (notification_id !== undefined) + id = notification_id; + else + id = error.url || error.message.trim(); + if (error.url !== undefined) { - id = error.url; body = _('Click for help troubleshooting'); priority = Gio.NotificationPriority.URGENT; @@ -238,7 +248,6 @@ const Service = GObject.registerClass({ url: error.url, }); } else { - id = error.message.trim(); body = _('Click for more information'); priority = Gio.NotificationPriority.HIGH; @@ -298,7 +307,18 @@ const Service = GObject.registerClass({ this._initActions(); // TODO: remove after a reasonable period of time - this._migrateConfiguration(); + try { + this._migrateConfiguration(); + if (this.settings.get_boolean('missing-openssl')) + this.withdraw_notification('gsconnect-missing-openssl'); + this.settings.set_boolean('missing-openssl', false); + } catch (e) { + if (e instanceof MissingOpensslError) { + this.settings.set_boolean('missing-openssl', true); + this.notify_error(e, 'gsconnect-missing-openssl'); + } + throw e; + } this.manager.start(); } diff --git a/gnome/.local/share/gnome-shell/extensions/gsconnect@andyholmes.github.io/service/device.js b/gnome/.local/share/gnome-shell/extensions/gsconnect@andyholmes.github.io/service/device.js index 4742c64..9690730 100644 --- a/gnome/.local/share/gnome-shell/extensions/gsconnect@andyholmes.github.io/service/device.js +++ b/gnome/.local/share/gnome-shell/extensions/gsconnect@andyholmes.github.io/service/device.js @@ -144,6 +144,14 @@ const Device = GObject.registerClass({ return name.trim() && /^[^"',;:.!?()[\]<>]{1,32}$/.test(name); } + static sanitizeName(name) { + // Remove all prohibited characters + const sanitized = name.replaceAll(/["',;:.!?()[\]<>]/g, ''); + if (sanitized.length < 1) + throw new Error('No valid characters in device name!'); + return sanitized; + } + get channel() { if (this._channel === undefined) this._channel = null; diff --git a/gnome/.local/share/gnome-shell/extensions/gsconnect@andyholmes.github.io/service/init.js b/gnome/.local/share/gnome-shell/extensions/gsconnect@andyholmes.github.io/service/init.js index a024b17..e6ee47b 100644 --- a/gnome/.local/share/gnome-shell/extensions/gsconnect@andyholmes.github.io/service/init.js +++ b/gnome/.local/share/gnome-shell/extensions/gsconnect@andyholmes.github.io/service/init.js @@ -10,6 +10,7 @@ import GLib from 'gi://GLib'; import Config from '../config.js'; import {setup, setupGettext} from '../utils/setup.js'; +import {MissingOpensslError} from '../utils/exceptions.js'; // Promise Wrappers @@ -62,10 +63,22 @@ const extensionFolder = GLib.path_get_dirname(serviceFolder); setup(extensionFolder); setupGettext(); + if (Config.IS_USER) { // Infer libdir by assuming gnome-shell shares a common prefix with gjs; // assume the parent directory if it's not there - let libdir = GIRepository.Repository.get_search_path().find(path => { + let gir_paths; + + if (GIRepository.Repository.hasOwnProperty('get_search_path')) { + // GNOME <= 48 / GIRepository 2.0 + gir_paths = GIRepository.Repository.get_search_path(); + } else { + // GNOME 49+ / GIRepository 3.0 + const repo = GIRepository.Repository.dup_default(); + gir_paths = repo.get_search_path(); + } + + let libdir = gir_paths.find(path => { return path.endsWith('/gjs/girepository-1.0'); }).replace('/gjs/girepository-1.0', ''); @@ -110,7 +123,7 @@ globalThis.HAVE_GNOME = GLib.getenv('GSCONNECT_MODE')?.toLowerCase() !== 'cli' & * @param {Error|string} message - A string or Error to log * @param {string} [prefix] - An optional prefix for the warning */ -const _debugCallerMatch = new RegExp(/([^@]*)@([^:]*):([^:]*)/); +const _debugCallerMatch = new RegExp(/^([^@]+)@(.*):(\d+):(\d+)$/); // eslint-disable-next-line func-style const _debugFunc = function (error, prefix = null) { let caller, message; @@ -127,7 +140,9 @@ const _debugFunc = function (error, prefix = null) { message = `${prefix}: ${message}`; const [, func, file, line] = _debugCallerMatch.exec(caller); - const script = file.replace(Config.PACKAGE_DATADIR, ''); + let script = file.replace(Config.PACKAGE_DATADIR, ''); + if (script.startsWith('file:///')) + script = script.slice(8); GLib.log_structured('GSConnect', GLib.LogLevelFlags.LEVEL_MESSAGE, { 'MESSAGE': `[${script}:${func}:${line}]: ${message}`, @@ -338,10 +353,11 @@ GLib.Variant.prototype.full_unpack = _full_unpack; * @param {string} keyPath - Absolute path to a private key in PEM format * @param {string} commonName - A unique common name for the certificate * @returns {Gio.TlsCertificate} A TLS certificate + * @throws MissingOpensslError on missing openssl binary */ Gio.TlsCertificate.new_for_paths = function (certPath, keyPath, commonName = null) { if (GLib.find_program_in_path(Config.OPENSSL_PATH) === null) { - const error = new Error(); + const error = new MissingOpensslError(); error.name = _('OpenSSL not found'); error.url = `${Config.PACKAGE_URL}/wiki/Error#openssl-not-found`; throw error; diff --git a/gnome/.local/share/gnome-shell/extensions/gsconnect@andyholmes.github.io/service/manager.js b/gnome/.local/share/gnome-shell/extensions/gsconnect@andyholmes.github.io/service/manager.js index e4a71bd..c58769e 100644 --- a/gnome/.local/share/gnome-shell/extensions/gsconnect@andyholmes.github.io/service/manager.js +++ b/gnome/.local/share/gnome-shell/extensions/gsconnect@andyholmes.github.io/service/manager.js @@ -13,6 +13,8 @@ import Device from './device.js'; import * as LanBackend from './backends/lan.js'; +import {MissingOpensslError} from '../utils/exceptions.js'; + const DEVICE_NAME = 'org.gnome.Shell.Extensions.GSConnect.Device'; const DEVICE_PATH = '/org/gnome/Shell/Extensions/GSConnect/Device'; const DEVICE_IFACE = Config.DBUS.lookup_interface(DEVICE_NAME); @@ -102,10 +104,22 @@ const Manager = GObject.registerClass({ get certificate() { if (this._certificate === undefined) { - this._certificate = Gio.TlsCertificate.new_for_paths( - GLib.build_filenamev([Config.CONFIGDIR, 'certificate.pem']), - GLib.build_filenamev([Config.CONFIGDIR, 'private.pem']), - null); + const app = Gio.Application.get_default(); + try { + this._certificate = Gio.TlsCertificate.new_for_paths( + GLib.build_filenamev([Config.CONFIGDIR, 'certificate.pem']), + GLib.build_filenamev([Config.CONFIGDIR, 'private.pem']), + null); + if (this.settings.get_boolean('missing-openssl')) + app?.withdraw_notification('gsconnect-missing-openssl'); + this.settings.set_boolean('missing-openssl', false); + } catch (e) { + if (e instanceof MissingOpensslError) { + this.settings.set_boolean('missing-openssl', true); + app?.notify_error(e, 'gsconnect-missing-openssl'); + } + throw e; + } } return this._certificate; @@ -165,8 +179,7 @@ const Manager = GObject.registerClass({ notif.set_icon(new Gio.ThemedIcon({name: 'dialog-warning'})); notif.set_priority(Gio.NotificationPriority.HIGH); notif.set_default_action('app.preferences'); - - Gio.Application.prototype.withdraw_notification.call( + Gio.Application.prototype.send_notification.call( application, 'discovery-warning', notif diff --git a/gnome/.local/share/gnome-shell/extensions/gsconnect@andyholmes.github.io/service/plugins/mpris.js b/gnome/.local/share/gnome-shell/extensions/gsconnect@andyholmes.github.io/service/plugins/mpris.js index f3bb63a..b33ed37 100644 --- a/gnome/.local/share/gnome-shell/extensions/gsconnect@andyholmes.github.io/service/plugins/mpris.js +++ b/gnome/.local/share/gnome-shell/extensions/gsconnect@andyholmes.github.io/service/plugins/mpris.js @@ -43,8 +43,6 @@ const MPRISPlugin = GObject.registerClass({ this._transferring = new WeakSet(); this._updating = new WeakSet(); - this._queueTimers = new Map(); - this._mpris = Components.acquire('mpris'); this._playerAddedId = this._mpris.connect( @@ -78,12 +76,6 @@ const MPRISPlugin = GObject.registerClass({ disconnected() { super.disconnected(); - for (const [identity, timer] of this._queueTimers) { - if (timer) - GLib.source_remove(timer); - this._queueTimers.delete(identity); - } - for (const [identity, player] of this._players) { this._players.delete(identity); player.destroy(); @@ -267,35 +259,18 @@ const MPRISPlugin = GObject.registerClass({ } } - if (packet.body.hasOwnProperty('requestNowPlaying') || - packet.body.hasOwnProperty('requestVolume')) { - const response = this._getUpdate(player.Identity, packet); - this._sendUpdate(player, response); - } + // Information Request + let hasResponse = false; - } catch (e) { - debug(e, this.device.name); - } finally { - this._updating.delete(player); - } - } + const response = { + type: 'kdeconnect.mpris', + body: { + player: packet.body.player, + }, + }; - // Respond to information request (or push updated information) - _getUpdate(identity, packet) { - - const player = this._mpris?.getPlayer(identity); - if (!player) - return; - - const response = { - type: 'kdeconnect.mpris', - body: { - player: player.Identity, - }, - }; - - try { if (packet.body.hasOwnProperty('requestNowPlaying')) { + hasResponse = true; Object.assign(response.body, { pos: Math.floor(player.Position / 1000), @@ -356,61 +331,31 @@ const MPRISPlugin = GObject.registerClass({ } } - if (packet.body.hasOwnProperty('requestVolume')) + if (packet.body.hasOwnProperty('requestVolume')) { + hasResponse = true; response.body.volume = Math.floor(player.Volume * 100); + } - return response; + if (hasResponse) + this.device.sendPacket(response); } catch (e) { debug(e, this.device.name); + } finally { + this._updating.delete(player); } } - _sendUpdate(player, packet = null) { - if (!player || (!packet && this._updating.has(player))) - return GLib.SOURCE_REMOVE; - - debug(`Sending update for ${player.Identity}`); - this._updating.add(player); - - if (this._queueTimers.has(player.Identity)) { - const timer_id = this._queueTimers.get(player.Identity); - if (timer_id) { - debug(`Stopping timer id ${timer_id}`); - GLib.source_remove(timer_id); - } - this._queueTimers.delete(player.Identity); - } - if (!packet) { - packet = this._getUpdate(player.Identity, { - body: { - requestNowPlaying: true, - requestVolume: true, - }, - }, false); - } - this.device.sendPacket(packet); - - this._updating.delete(player); - return GLib.SOURCE_REMOVE; - } - _onPlayerChanged(mpris, player) { if (!this.settings.get_boolean('share-players')) return; - // Set a timer to send the updated state after a short delay. - // Allows further state changes to be bundled into a single packet. - if (this._queueTimers.has(player.Identity)) - return; - this._queueTimers.set(player.Identity, 0); - - const timer_id = GLib.timeout_add( - GLib.PRIORITY_DEFAULT, - 250, // ms (0.25 seconds) - this._sendUpdate.bind(this, player) - ); - this._queueTimers.set(player.Identity, timer_id); - debug(`Set update timer id ${timer_id} for ${player.Identity}`); + this._handleCommand({ + body: { + player: player.Identity, + requestNowPlaying: true, + requestVolume: true, + }, + }); } _onPlayerSeeked(mpris, player, offset) { @@ -490,11 +435,6 @@ const MPRISPlugin = GObject.registerClass({ } destroy() { - for (const [identity, timer] of this._queueTimers) { - this._queueTimers.delete(identity); - GLib.source_remove(timer); - } - if (this._mpris !== undefined) { this._mpris.disconnect(this._playerAddedId); this._mpris.disconnect(this._playerRemovedId); diff --git a/gnome/.local/share/gnome-shell/extensions/gsconnect@andyholmes.github.io/service/plugins/share.js b/gnome/.local/share/gnome-shell/extensions/gsconnect@andyholmes.github.io/service/plugins/share.js index 49a0a49..ef28893 100644 --- a/gnome/.local/share/gnome-shell/extensions/gsconnect@andyholmes.github.io/service/plugins/share.js +++ b/gnome/.local/share/gnome-shell/extensions/gsconnect@andyholmes.github.io/service/plugins/share.js @@ -71,17 +71,35 @@ const SharePlugin = GObject.registerClass({ } handlePacket(packet) { + const {filename, text, url} = packet.body; + // TODO: composite jobs (lastModified, numberOfFiles, totalPayloadSize) - if (packet.body.hasOwnProperty('filename')) { + if (filename !== undefined) { + debug(`Remote wants to share file "${filename}".`); if (this.settings.get_boolean('receive-files')) this._handleFile(packet); else this._refuseFile(packet); - } else if (packet.body.hasOwnProperty('text')) { - this._handleText(packet); - } else if (packet.body.hasOwnProperty('url')) { - this._handleUri(packet); + return; } + if (text === undefined && url === undefined) + throw new Error('Share request has invalid payload, ignoring.'); + + if (this.settings.get_boolean('launch-urls')) { + let shared_url = url; + if (url === undefined) { + const urls = URI.findUrls(text); + if (urls.length === 1) + shared_url = urls[0].url; + } + if (shared_url !== undefined) { + debug(`Launching shared URL "${shared_url}".`); + return this._handleUri(shared_url); + } + } + const message = text || url; + debug('Displaying shared message.'); + this._handleText(message); } _ensureReceiveDirectory() { @@ -232,15 +250,14 @@ const SharePlugin = GObject.registerClass({ } } - _handleUri(packet) { - const uri = packet.body.url; + _handleUri(uri) { Gio.AppInfo.launch_default_for_uri_async(uri, null, null, null); } - _handleText(packet) { + _handleText(message) { const dialog = new Gtk.MessageDialog({ text: _('Text Shared By %s').format(this.device.name), - secondary_text: URI.linkify(packet.body.text), + secondary_text: URI.linkify(message), secondary_use_markup: true, buttons: Gtk.ButtonsType.CLOSE, }); diff --git a/gnome/.local/share/gnome-shell/extensions/gsconnect@andyholmes.github.io/service/plugins/systemvolume.js b/gnome/.local/share/gnome-shell/extensions/gsconnect@andyholmes.github.io/service/plugins/systemvolume.js index 9d2aa62..388bbb2 100644 --- a/gnome/.local/share/gnome-shell/extensions/gsconnect@andyholmes.github.io/service/plugins/systemvolume.js +++ b/gnome/.local/share/gnome-shell/extensions/gsconnect@andyholmes.github.io/service/plugins/systemvolume.js @@ -2,8 +2,6 @@ // // SPDX-License-Identifier: GPL-2.0-or-later -import GIRepository from 'gi://GIRepository'; -import GLib from 'gi://GLib'; import GObject from 'gi://GObject'; import * as Components from '../components/index.js'; @@ -12,17 +10,6 @@ import * as Core from '../core.js'; import Plugin from '../plugin.js'; -let Gvc = null; -try { - // Add gnome-shell's typelib dir to the search path - const typelibDir = GLib.build_filenamev([Config.GNOME_SHELL_LIBDIR, 'gnome-shell']); - GIRepository.Repository.prepend_search_path(typelibDir); - GIRepository.Repository.prepend_library_path(typelibDir); - - Gvc = (await import('gi://Gvc')).default; -} catch {} - - export const Metadata = { label: _('System Volume'), description: _('Enable the paired device to control the system volume'), @@ -128,7 +115,7 @@ const SystemVolumePlugin = GObject.registerClass({ /** * Update the cache for @stream * - * @param {Gvc.MixerStream} stream - The stream to cache + * @param {"Gvc.MixerStream"} stream - The stream to cache * @returns {object} The updated cache object */ _updateCache(stream) { @@ -148,7 +135,7 @@ const SystemVolumePlugin = GObject.registerClass({ /** * Send the state of a local sink * - * @param {Gvc.MixerControl} mixer - The mixer that owns the stream + * @param {"Gvc.MixerControl"} mixer - The mixer that owns the stream * @param {number} id - The Id of the stream that changed */ _sendSink(mixer, id) { diff --git a/gnome/.local/share/gnome-shell/extensions/gsconnect@andyholmes.github.io/utils/exceptions.js b/gnome/.local/share/gnome-shell/extensions/gsconnect@andyholmes.github.io/utils/exceptions.js new file mode 100644 index 0000000..e4dc4af --- /dev/null +++ b/gnome/.local/share/gnome-shell/extensions/gsconnect@andyholmes.github.io/utils/exceptions.js @@ -0,0 +1,10 @@ +// SPDX-FileCopyrightText: GSConnect Developers https://github.com/GSConnect +// +// SPDX-License-Identifier: GPL-2.0-or-later + +export class MissingOpensslError extends Error { + constructor(message) { + super(message); + this.name = 'MissingOpensslError'; + } +} diff --git a/gnome/.local/share/gnome-shell/extensions/gsconnect@andyholmes.github.io/wl_clipboard.js b/gnome/.local/share/gnome-shell/extensions/gsconnect@andyholmes.github.io/wl_clipboard.js index ec7abe9..b5e847f 100644 --- a/gnome/.local/share/gnome-shell/extensions/gsconnect@andyholmes.github.io/wl_clipboard.js +++ b/gnome/.local/share/gnome-shell/extensions/gsconnect@andyholmes.github.io/wl_clipboard.js @@ -164,7 +164,7 @@ export const Clipboard = GObject.registerClass( proc.communicate_utf8_async(null, null, (proc, res) => { try { const [, stdout, stderr] = - proc.communicate_utf8_finish(res); + proc.communicate_utf8_finish(res); if (proc.get_successful()) resolve(stdout.trim().split('\n')); else @@ -194,7 +194,7 @@ export const Clipboard = GObject.registerClass( proc.communicate_utf8_async(null, null, (proc, res) => { try { const [, stdout, stderr] = - proc.communicate_utf8_finish(res); + proc.communicate_utf8_finish(res); if (proc.get_successful()) resolve(stdout); else diff --git a/gnome/.local/share/gnome-shell/extensions/impatience@gfxmonk.net/metadata.json b/gnome/.local/share/gnome-shell/extensions/impatience@gfxmonk.net/metadata.json index 4548db6..05f8853 100644 --- a/gnome/.local/share/gnome-shell/extensions/impatience@gfxmonk.net/metadata.json +++ b/gnome/.local/share/gnome-shell/extensions/impatience@gfxmonk.net/metadata.json @@ -7,9 +7,10 @@ "45", "46", "47", - "48" + "48", + "49" ], "url": "http://gfxmonk.net/dist/0install/gnome-shell-impatience.xml", "uuid": "impatience@gfxmonk.net", - "version": 28 + "version": 29 } \ No newline at end of file diff --git a/gnome/.local/share/gnome-shell/extensions/screen-rotate@shyzus.github.io/extension.js b/gnome/.local/share/gnome-shell/extensions/screen-rotate@shyzus.github.io/extension.js index 621e376..8199675 100644 --- a/gnome/.local/share/gnome-shell/extensions/screen-rotate@shyzus.github.io/extension.js +++ b/gnome/.local/share/gnome-shell/extensions/screen-rotate@shyzus.github.io/extension.js @@ -78,8 +78,10 @@ export default class ScreenAutoRotateExtension extends Extension { this._timeoutId = setTimeout(() => { this._set_hide_lock_rotate(this._settings.get_boolean('hide-lock-rotate')); - // Rotate once on start up to the orientation detected by the claimed accelerometer - this.rotate_to(this._sensor_proxy.get_accelerometer_orientation()); + if (!this._settings.get_boolean('skip-initial-rotation')) { + // Rotate once on start up to the orientation detected by the claimed accelerometer + this.rotate_to(this._sensor_proxy.get_accelerometer_orientation()); + } }, 1000); } diff --git a/gnome/.local/share/gnome-shell/extensions/screen-rotate@shyzus.github.io/metadata.json b/gnome/.local/share/gnome-shell/extensions/screen-rotate@shyzus.github.io/metadata.json index 599cb85..ef1a29f 100644 --- a/gnome/.local/share/gnome-shell/extensions/screen-rotate@shyzus.github.io/metadata.json +++ b/gnome/.local/share/gnome-shell/extensions/screen-rotate@shyzus.github.io/metadata.json @@ -15,9 +15,10 @@ "45", "46", "47", - "48" + "48", + "49" ], "url": "https://github.com/shyzus/gnome-shell-extension-screen-autorotate", "uuid": "screen-rotate@shyzus.github.io", - "version": 25 + "version": 27 } \ No newline at end of file diff --git a/gnome/.local/share/gnome-shell/extensions/screen-rotate@shyzus.github.io/prefs.js b/gnome/.local/share/gnome-shell/extensions/screen-rotate@shyzus.github.io/prefs.js index d28b383..6714cc7 100644 --- a/gnome/.local/share/gnome-shell/extensions/screen-rotate@shyzus.github.io/prefs.js +++ b/gnome/.local/share/gnome-shell/extensions/screen-rotate@shyzus.github.io/prefs.js @@ -77,6 +77,15 @@ export default class MyExtensionPreferences extends ExtensionPreferences { orientationGroup.add(setOffsetRow); + const skipInitRotationRow = new Adw.ActionRow({ + title: 'Skip initial rotation', + subtitle: 'Skip initial rotation on extension startup ensures the' + + ' last known orientation is loaded on startup and the' + + ' overview screen is not skipped.' + }); + + orientationGroup.add(skipInitRotationRow); + const enableManualFlipRow = new Adw.ActionRow({ title: 'Enable manual flip', subtitle: 'Enable a toggle in the GNOME Shell System Menu to manually flip between landscape and portrait.' @@ -132,6 +141,11 @@ export default class MyExtensionPreferences extends ExtensionPreferences { const setOffsetSpinButton = Gtk.SpinButton.new_with_range(0, 3, 1); setOffsetSpinButton.value = window._settings.get_int('orientation-offset'); + const skipInitRotationButton = new Gtk.Switch({ + active: window._settings.get_boolean('skip-initial-rotation'), + valign: Gtk.Align.CENTER + }); + const manualFlipSwitch = new Gtk.Switch({ active: window._settings.get_boolean('manual-flip'), valign: Gtk.Align.CENTER, @@ -278,6 +292,9 @@ export default class MyExtensionPreferences extends ExtensionPreferences { window._settings.bind('orientation-offset', setOffsetSpinButton, 'value', Gio.SettingsBindFlags.DEFAULT); + window._settings.bind('skip-initial-rotation', + skipInitRotationButton, 'active', Gio.SettingsBindFlags.DEFAULT); + window._settings.bind('manual-flip', manualFlipSwitch, 'active', Gio.SettingsBindFlags.DEFAULT); @@ -311,6 +328,9 @@ export default class MyExtensionPreferences extends ExtensionPreferences { setOffsetRow.add_suffix(setOffsetSpinButton); setOffsetRow.activatable_widget = setOffsetSpinButton; + skipInitRotationRow.add_suffix(skipInitRotationButton); + skipInitRotationRow.activatable_widget = skipInitRotationButton; + enableManualFlipRow.add_suffix(manualFlipSwitch); enableManualFlipRow.activatable_widget = manualFlipSwitch; diff --git a/gnome/.local/share/gnome-shell/extensions/screen-rotate@shyzus.github.io/schemas/gschemas.compiled b/gnome/.local/share/gnome-shell/extensions/screen-rotate@shyzus.github.io/schemas/gschemas.compiled index 5404d4b..960c096 100644 Binary files a/gnome/.local/share/gnome-shell/extensions/screen-rotate@shyzus.github.io/schemas/gschemas.compiled and b/gnome/.local/share/gnome-shell/extensions/screen-rotate@shyzus.github.io/schemas/gschemas.compiled differ diff --git a/gnome/.local/share/gnome-shell/extensions/screen-rotate@shyzus.github.io/schemas/org.gnome.shell.extensions.screen-rotate.gschema.xml b/gnome/.local/share/gnome-shell/extensions/screen-rotate@shyzus.github.io/schemas/org.gnome.shell.extensions.screen-rotate.gschema.xml index 56fecdb..bb0f388 100644 --- a/gnome/.local/share/gnome-shell/extensions/screen-rotate@shyzus.github.io/schemas/org.gnome.shell.extensions.screen-rotate.gschema.xml +++ b/gnome/.local/share/gnome-shell/extensions/screen-rotate@shyzus.github.io/schemas/org.gnome.shell.extensions.screen-rotate.gschema.xml @@ -75,6 +75,10 @@ false Toggle disabling the touchpad when the orientation is portrait right. + + false + Toggle skipping the initial rotation on extension startup. Will preserve last set orientation + false Toggle debug logging. diff --git a/gnome/.local/share/gnome-shell/extensions/screen-rotate@shyzus.github.io/sensorProxy.js b/gnome/.local/share/gnome-shell/extensions/screen-rotate@shyzus.github.io/sensorProxy.js index d29e098..241ce2f 100644 --- a/gnome/.local/share/gnome-shell/extensions/screen-rotate@shyzus.github.io/sensorProxy.js +++ b/gnome/.local/share/gnome-shell/extensions/screen-rotate@shyzus.github.io/sensorProxy.js @@ -40,13 +40,13 @@ export class SensorProxy { enable() { this._enabled = true; if (this._proxy === null) return; - this._proxy.call_sync('ClaimAccelerometer', null, Gio.DBusCallFlags.NONE, -1, null); + this._proxy.call('ClaimAccelerometer', null, Gio.DBusCallFlags.NONE, 100, null, null); } disable() { this._enabled = false; if (this._proxy === null) return; - this._proxy.call_sync('ReleaseAccelerometer', null, Gio.DBusCallFlags.NONE, -1, null); + this._proxy.call('ReleaseAccelerometer', null, Gio.DBusCallFlags.NONE, 100, null, null); } appeared(_connection, _name, _name_owner) { @@ -56,7 +56,7 @@ export class SensorProxy { null); this._proxy.connect('g-properties-changed', this.properties_changed.bind(this)); if (this._enabled) { - this._proxy.call_sync('ClaimAccelerometer', null, Gio.DBusCallFlags.NONE, -1, null); + this._proxy.call('ClaimAccelerometer', null, Gio.DBusCallFlags.NONE, 100, null, null); } } diff --git a/gnome/.local/share/gnome-shell/extensions/thinkpad-battery-threshold@marcosdalvarez.org/CHANGELOG.md b/gnome/.local/share/gnome-shell/extensions/thinkpad-battery-threshold@marcosdalvarez.org/CHANGELOG.md index de79e68..417230b 100644 --- a/gnome/.local/share/gnome-shell/extensions/thinkpad-battery-threshold@marcosdalvarez.org/CHANGELOG.md +++ b/gnome/.local/share/gnome-shell/extensions/thinkpad-battery-threshold@marcosdalvarez.org/CHANGELOG.md @@ -310,4 +310,30 @@ other: Other ### Other - Update translations (Italian) ### Added -- Gnome 48 support \ No newline at end of file +- Gnome 48 support + +## [v52] - 2025-07-12 +### Added +- Suggestion [#30](https://gitlab.com/marcosdalvarez/thinkpad-battery-threshold-extension/-/issues/30): The notification indicating inconsistencies between the values configured in the extension and the currently applied values now has action buttons that allow you to use the current values or use the configured ones (or defaults if they have never been configured). + +### Removed +- Support for versions older than Gnome 46 is removed. + +### Other +- Refactoring some code. + +## [v53] - 2025-07-13 +### Fixed +- Issue [#30](https://gitlab.com/marcosdalvarez/thinkpad-battery-threshold-extension/-/issues/30): The notification indicating inconsistencies between configured and currently applied values is now persistent and must be dismissed using the close button or one of the action buttons. + +## [v54] - 2025-07-18 +### Other +- Update translations + +## [v55] - 2025-07-18 +### Other +- The warning message when thresholds do not match has been modified. + +## [v56] - 2025-09-30 +### Added +- Gnome 49 support \ No newline at end of file diff --git a/gnome/.local/share/gnome-shell/extensions/thinkpad-battery-threshold@marcosdalvarez.org/libs/indicator.js b/gnome/.local/share/gnome-shell/extensions/thinkpad-battery-threshold@marcosdalvarez.org/libs/indicator.js index 45d8140..91b4708 100644 --- a/gnome/.local/share/gnome-shell/extensions/thinkpad-battery-threshold@marcosdalvarez.org/libs/indicator.js +++ b/gnome/.local/share/gnome-shell/extensions/thinkpad-battery-threshold@marcosdalvarez.org/libs/indicator.js @@ -238,6 +238,13 @@ export const ThresholdIndicator = GObject.registerClass({ this._updateIndicator(); + this._notificationSource = new MessageTray.Source({ + 'title': this._name, + 'icon': getIcon('threshold-app', false) + }); + + Main.messageTray.add(this._notificationSource); + // Driver signals this._driver.connectObject( 'notify', () => this._updateIndicator(), @@ -314,6 +321,8 @@ export const ThresholdIndicator = GObject.registerClass({ ); this.connect('destroy', () => { + this._notificationSource.destroy(); + this._notificationSource = null; this.quickSettingsItems.forEach(item => item.destroy()); this._settings.disconnectObject(this); this._settings = null; @@ -324,13 +333,7 @@ export const ThresholdIndicator = GObject.registerClass({ }); // Pending changes alert - this._driver.batteries.every(battery => { - if (battery.pendingChanges && battery.isActive) { - this._notify(_('Battery Threshold'), _('The currently set thresholds do not match the configured ones'), 'threshold-active-warning', false); - return false; - } - return true; - }); + this._pendingChangesAlert(); } /** @@ -375,36 +378,20 @@ export const ThresholdIndicator = GObject.registerClass({ /** * Show notification. * - * @param {string} msg Title * @param {string} details Message * @param {string} iconName Icon name * @param {boolean} [transient=true] Transient notification */ - _notify(msg, details, iconName, transient = true) { + _notify(details, iconName, transient = true) { if (!this._settings.get_boolean('show-notifications')) return; - if (SHELL_VERSION === 45) { - const source = new MessageTray.Source(this._name); - Main.messageTray.add(source); - const notification = new MessageTray.Notification( - source, - msg, - details, - { gicon: getIcon(iconName, true) } - ); - notification.setTransient(transient); - source.showNotification(notification); - } else { - const source = new MessageTray.Source({ 'title': this._name }); - Main.messageTray.add(source); - const notification = new MessageTray.Notification({ - source: source, - title: msg, - body: details, - isTransient: transient, - gicon: getIcon(iconName, true) - }); - source.addNotification(notification); - } + const notification = new MessageTray.Notification({ + source: this._notificationSource, + title: _('Battery Threshold'), + body: details, + isTransient: transient, + gicon: getIcon(iconName, true) + }); + this._notificationSource.addNotification(notification); } /** @@ -413,7 +400,7 @@ export const ThresholdIndicator = GObject.registerClass({ * @param {string} message Message */ _notifyError(message) { - this._notify(_('Battery Threshold'), message, 'threshold-error', false); + this._notify(message, 'threshold-error', false) } /** @@ -422,7 +409,7 @@ export const ThresholdIndicator = GObject.registerClass({ * @param {string} message Message */ _notifyEnabled(message) { - this._notify(_('Battery Threshold'), message, 'threshold-active'); + this._notify(message, 'threshold-active') } /** @@ -431,6 +418,54 @@ export const ThresholdIndicator = GObject.registerClass({ * @param {string} message Message */ _notifyDisabled(message) { - this._notify(_('Battery Threshold'), message, 'threshold-inactive'); + this._notify(message, 'threshold-inactive') + } + + /** + * Show alert when are pending values changes + */ + _pendingChangesAlert() { + let notify = false; + this._driver.batteries.every(battery => { + if (battery.pendingChanges && battery.isActive) { + notify = true; + } + return true; + }); + + if (notify) { + let message = _(`The currently configured thresholds don't match those set on the system.`); + if (SHELL_VERSION >= 48) { + // TRANSLATORS: The strings "" and "" are part of the markup language and indicate that the text between the tags will be rendered in "bold" + // TRANSLATORS: This chain joins another so it is a good idea to leave a space in front of it. + // TRANSLATORS: "Preserve battery health" is an option in Gnome settings. + message += _(` Is the Preserve battery health option enabled in Gnome settings? This mode restores its own values.`); + } + + const notification = new MessageTray.Notification({ + source: this._notificationSource, + title: _('Battery Threshold'), + body: message, + gicon: getIcon('threshold-active-warning', true), + resident: true, + urgency: MessageTray.Urgency.CRITICAL, + 'use-body-markup': true + }); + notification.addAction(_('Keep detected'), () => { + this._driver.batteries.every(battery => { + if (battery.pendingChanges && battery.isActive) { + this._settings.set_int(`start-${battery.name.toLowerCase()}`, battery.startValue); + this._settings.set_int(`end-${battery.name.toLowerCase()}`, battery.endValue); + } + return true; + }); + notification.destroy(); + }); + notification.addAction(_('Set configured'), () => { + this._driver.enableAll(); + notification.destroy(); + }); + this._notificationSource.addNotification(notification); + } } }); \ No newline at end of file diff --git a/gnome/.local/share/gnome-shell/extensions/thinkpad-battery-threshold@marcosdalvarez.org/locale/de/LC_MESSAGES/thinkpad-battery-threshold@marcosdalvarez.org.mo b/gnome/.local/share/gnome-shell/extensions/thinkpad-battery-threshold@marcosdalvarez.org/locale/de/LC_MESSAGES/thinkpad-battery-threshold@marcosdalvarez.org.mo index 7da4eac..bf72382 100644 Binary files a/gnome/.local/share/gnome-shell/extensions/thinkpad-battery-threshold@marcosdalvarez.org/locale/de/LC_MESSAGES/thinkpad-battery-threshold@marcosdalvarez.org.mo and b/gnome/.local/share/gnome-shell/extensions/thinkpad-battery-threshold@marcosdalvarez.org/locale/de/LC_MESSAGES/thinkpad-battery-threshold@marcosdalvarez.org.mo differ diff --git a/gnome/.local/share/gnome-shell/extensions/thinkpad-battery-threshold@marcosdalvarez.org/locale/es/LC_MESSAGES/thinkpad-battery-threshold@marcosdalvarez.org.mo b/gnome/.local/share/gnome-shell/extensions/thinkpad-battery-threshold@marcosdalvarez.org/locale/es/LC_MESSAGES/thinkpad-battery-threshold@marcosdalvarez.org.mo index 7aae3ff..8089d91 100644 Binary files a/gnome/.local/share/gnome-shell/extensions/thinkpad-battery-threshold@marcosdalvarez.org/locale/es/LC_MESSAGES/thinkpad-battery-threshold@marcosdalvarez.org.mo and b/gnome/.local/share/gnome-shell/extensions/thinkpad-battery-threshold@marcosdalvarez.org/locale/es/LC_MESSAGES/thinkpad-battery-threshold@marcosdalvarez.org.mo differ diff --git a/gnome/.local/share/gnome-shell/extensions/thinkpad-battery-threshold@marcosdalvarez.org/locale/it/LC_MESSAGES/thinkpad-battery-threshold@marcosdalvarez.org.mo b/gnome/.local/share/gnome-shell/extensions/thinkpad-battery-threshold@marcosdalvarez.org/locale/it/LC_MESSAGES/thinkpad-battery-threshold@marcosdalvarez.org.mo index a249e0e..02ef3ed 100644 Binary files a/gnome/.local/share/gnome-shell/extensions/thinkpad-battery-threshold@marcosdalvarez.org/locale/it/LC_MESSAGES/thinkpad-battery-threshold@marcosdalvarez.org.mo and b/gnome/.local/share/gnome-shell/extensions/thinkpad-battery-threshold@marcosdalvarez.org/locale/it/LC_MESSAGES/thinkpad-battery-threshold@marcosdalvarez.org.mo differ diff --git a/gnome/.local/share/gnome-shell/extensions/thinkpad-battery-threshold@marcosdalvarez.org/locale/pt/LC_MESSAGES/thinkpad-battery-threshold@marcosdalvarez.org.mo b/gnome/.local/share/gnome-shell/extensions/thinkpad-battery-threshold@marcosdalvarez.org/locale/pt/LC_MESSAGES/thinkpad-battery-threshold@marcosdalvarez.org.mo index da9e2ef..66a4e7a 100644 Binary files a/gnome/.local/share/gnome-shell/extensions/thinkpad-battery-threshold@marcosdalvarez.org/locale/pt/LC_MESSAGES/thinkpad-battery-threshold@marcosdalvarez.org.mo and b/gnome/.local/share/gnome-shell/extensions/thinkpad-battery-threshold@marcosdalvarez.org/locale/pt/LC_MESSAGES/thinkpad-battery-threshold@marcosdalvarez.org.mo differ diff --git a/gnome/.local/share/gnome-shell/extensions/thinkpad-battery-threshold@marcosdalvarez.org/locale/pt_BR/LC_MESSAGES/thinkpad-battery-threshold@marcosdalvarez.org.mo b/gnome/.local/share/gnome-shell/extensions/thinkpad-battery-threshold@marcosdalvarez.org/locale/pt_BR/LC_MESSAGES/thinkpad-battery-threshold@marcosdalvarez.org.mo index 91b3059..ad52426 100644 Binary files a/gnome/.local/share/gnome-shell/extensions/thinkpad-battery-threshold@marcosdalvarez.org/locale/pt_BR/LC_MESSAGES/thinkpad-battery-threshold@marcosdalvarez.org.mo and b/gnome/.local/share/gnome-shell/extensions/thinkpad-battery-threshold@marcosdalvarez.org/locale/pt_BR/LC_MESSAGES/thinkpad-battery-threshold@marcosdalvarez.org.mo differ diff --git a/gnome/.local/share/gnome-shell/extensions/thinkpad-battery-threshold@marcosdalvarez.org/locale/ta/LC_MESSAGES/thinkpad-battery-threshold@marcosdalvarez.org.mo b/gnome/.local/share/gnome-shell/extensions/thinkpad-battery-threshold@marcosdalvarez.org/locale/ta/LC_MESSAGES/thinkpad-battery-threshold@marcosdalvarez.org.mo new file mode 100644 index 0000000..87bbf26 Binary files /dev/null and b/gnome/.local/share/gnome-shell/extensions/thinkpad-battery-threshold@marcosdalvarez.org/locale/ta/LC_MESSAGES/thinkpad-battery-threshold@marcosdalvarez.org.mo differ diff --git a/gnome/.local/share/gnome-shell/extensions/thinkpad-battery-threshold@marcosdalvarez.org/metadata.json b/gnome/.local/share/gnome-shell/extensions/thinkpad-battery-threshold@marcosdalvarez.org/metadata.json index 9bd2545..31d0fcf 100644 --- a/gnome/.local/share/gnome-shell/extensions/thinkpad-battery-threshold@marcosdalvarez.org/metadata.json +++ b/gnome/.local/share/gnome-shell/extensions/thinkpad-battery-threshold@marcosdalvarez.org/metadata.json @@ -5,12 +5,12 @@ "name": "Thinkpad Battery Threshold", "settings-schema": "org.gnome.shell.extensions.thinkpad-battery-threshold", "shell-version": [ - "45", "46", "47", - "48" + "48", + "49" ], "url": "https://gitlab.com/marcosdalvarez/thinkpad-battery-threshold-extension", "uuid": "thinkpad-battery-threshold@marcosdalvarez.org", - "version": 51 + "version": 55 } \ No newline at end of file