From 36ea1e323af51ebdd638c6317941699eee138d83 Mon Sep 17 00:00:00 2001 From: Jay Ta'ala Date: Sun, 14 Apr 2024 08:02:16 +1000 Subject: [PATCH 01/18] Added an "About" page. --- Settings.ui | 18 ++++++++++++++++-- prefs.js | 9 +++++---- 2 files changed, 21 insertions(+), 6 deletions(-) diff --git a/Settings.ui b/Settings.ui index 92fe9556..074979ae 100644 --- a/Settings.ui +++ b/Settings.ui @@ -1827,7 +1827,21 @@ - + + + About + dialog-information-symbolic + + + never + + + + + + + + diff --git a/prefs.js b/prefs.js index bdb14cf1..f6a260d4 100644 --- a/prefs.js +++ b/prefs.js @@ -66,12 +66,13 @@ class SettingsWidget { this.builder.get_object('keybindings_page'), this.builder.get_object('winprops_page'), this.builder.get_object('advanced_page'), + this.builder.get_object('about_page'), ]; pages.forEach(page => prefsWindow.add(page)); prefsWindow.set_visible_page(pages[selectedPage]); - this.aboutButton = this.builder.get_object('about_button'); + // this.aboutButton = this.builder.get_object('about_button'); this._backgroundFilter = new Gtk.FileFilter(); this._backgroundFilter.add_pixbuf_formats(); @@ -443,9 +444,9 @@ class SettingsWidget { percentValueChanged('maximize-width-percent', 'maximize-width-percent'); // About - let versionLabel = this.builder.get_object('extension_version'); - let version = this.extension.metadata.version?.toString() ?? '?'; - versionLabel.set_text(version); + // let versionLabel = this.builder.get_object('extension_version'); + // let version = this.extension.metadata.version?.toString() ?? '?'; + // versionLabel.set_text(version); } range(n) { From 87f92f4c284c7e895a6c718805417b912395891f Mon Sep 17 00:00:00 2001 From: Jay Ta'ala Date: Sun, 14 Apr 2024 09:16:30 +1000 Subject: [PATCH 02/18] Added TextView with padding and wrapping. --- Settings.ui | 38 ++++++++++++++++++++++++++++++++++++++ prefs.js | 9 +++++++++ 2 files changed, 47 insertions(+) diff --git a/Settings.ui b/Settings.ui index 074979ae..defbe848 100644 --- a/Settings.ui +++ b/Settings.ui @@ -1834,6 +1834,44 @@ never + + + False + True + + + center + 36 + 36 + 16 + 16 + vertical + 12 + 480 + + + start + True + PaperWM Version Information + + + + + + + + False + True + 6 + 6 + 6 + 6 + + + + + + diff --git a/prefs.js b/prefs.js index f6a260d4..7f065534 100644 --- a/prefs.js +++ b/prefs.js @@ -447,6 +447,15 @@ class SettingsWidget { // let versionLabel = this.builder.get_object('extension_version'); // let version = this.extension.metadata.version?.toString() ?? '?'; // versionLabel.set_text(version); + + // build version information + const buffer = new Gtk.TextBuffer(); + buffer.set_text(JSON.stringify(this.extension.metadata), -1); + + // set text to buffer + const aboutVersionView = this.builder.get_object('about_version_textView'); + aboutVersionView.set_wrap_mode(Gtk.WrapMode.WORD_CHAR); + aboutVersionView.set_buffer(buffer); } range(n) { From cc9e3c2dc09d8845ea8aa18f6db5973524a66c76 Mon Sep 17 00:00:00 2001 From: Jay Ta'ala Date: Sun, 14 Apr 2024 14:45:24 +1000 Subject: [PATCH 03/18] WIP: generate about version information. --- prefs.js | 37 +++++++++++++++++++++++++++++++++---- 1 file changed, 33 insertions(+), 4 deletions(-) diff --git a/prefs.js b/prefs.js index 7f065534..5938bf58 100644 --- a/prefs.js +++ b/prefs.js @@ -3,9 +3,7 @@ import Gio from 'gi://Gio'; import GLib from 'gi://GLib'; import Gtk from 'gi://Gtk'; -import { - ExtensionPreferences -} from 'resource:///org/gnome/Shell/Extensions/js/extensions/prefs.js'; +import { ExtensionPreferences } from 'resource:///org/gnome/Shell/Extensions/js/extensions/prefs.js'; import * as Settings from './settings.js'; import { WorkspaceSettings } from './workspace.js'; @@ -450,7 +448,8 @@ class SettingsWidget { // build version information const buffer = new Gtk.TextBuffer(); - buffer.set_text(JSON.stringify(this.extension.metadata), -1); + + this._gatherInfo(stdout => buffer.set_text(stdout, -1)); // set text to buffer const aboutVersionView = this.builder.get_object('about_version_textView'); @@ -458,6 +457,36 @@ class SettingsWidget { aboutVersionView.set_buffer(buffer); } + async _gatherInfo(callback) { + const cb = callback ?? function() {}; + + const flags = Gio.SubprocessFlags.STDOUT_PIPE | + Gio.SubprocessFlags.STDERR_PIPE; + + const proc = new Gio.Subprocess({ + argv: ['echo', 'cheese'], + flags, + }); + proc.init(null); + + try { + await new Promise((resolve, reject) => { + proc.communicate_utf8_async(null, null, (obj, res) => { + try { + const [, stdout] = obj.communicate_utf8_finish(res); + const status = obj.get_exit_status(); + cb(stdout); + resolve([status, stdout]); + } catch (e) { + reject(e); + } + }); + }); + } catch (error) { + console.error(error); + } + } + range(n) { let r = []; for (let i = 0; i < n; i++) From 04b5a0a29b542aa260bf5ceece62dd6a46874955 Mon Sep 17 00:00:00 2001 From: Jay Ta'ala Date: Sun, 14 Apr 2024 15:05:58 +1000 Subject: [PATCH 04/18] Migrated to used dbus to get information. --- prefs.js | 67 ++++++++++++++++++++++++++++++-------------------------- 1 file changed, 36 insertions(+), 31 deletions(-) diff --git a/prefs.js b/prefs.js index 5938bf58..74242812 100644 --- a/prefs.js +++ b/prefs.js @@ -449,42 +449,47 @@ class SettingsWidget { // build version information const buffer = new Gtk.TextBuffer(); - this._gatherInfo(stdout => buffer.set_text(stdout, -1)); - - // set text to buffer - const aboutVersionView = this.builder.get_object('about_version_textView'); - aboutVersionView.set_wrap_mode(Gtk.WrapMode.WORD_CHAR); - aboutVersionView.set_buffer(buffer); - } + // dbus to get extensions + const wrapper = Gio.DBusProxy.makeProxyWrapper( + ` + + + + + + + + + + ` + ); - async _gatherInfo(callback) { - const cb = callback ?? function() {}; + const proxy = wrapper( + Gio.DBus.session, + 'org.gnome.Mutter.DisplayConfig', + '/org/gnome/Mutter/DisplayConfig', + (_proxy, error) => { + if (error) { + console.error(error); + } + } + ); + // this._gatherInfo(stdout => buffer.set_text(stdout, -1)); - const flags = Gio.SubprocessFlags.STDOUT_PIPE | - Gio.SubprocessFlags.STDERR_PIPE; + // now call it + proxy.GetCurrentStateRemote((state, error) => { + if (error) { + console.error(error); + return; + } - const proc = new Gio.Subprocess({ - argv: ['echo', 'cheese'], - flags, + buffer.set_text(JSON.stringify(state), -1); }); - proc.init(null); - try { - await new Promise((resolve, reject) => { - proc.communicate_utf8_async(null, null, (obj, res) => { - try { - const [, stdout] = obj.communicate_utf8_finish(res); - const status = obj.get_exit_status(); - cb(stdout); - resolve([status, stdout]); - } catch (e) { - reject(e); - } - }); - }); - } catch (error) { - console.error(error); - } + // set text to buffer + const aboutVersionView = this.builder.get_object('about_version_textView'); + aboutVersionView.set_wrap_mode(Gtk.WrapMode.WORD_CHAR); + aboutVersionView.set_buffer(buffer); } range(n) { From 8dfa8ae55b33a5358696157c58e02d134a07c82e Mon Sep 17 00:00:00 2001 From: Jay Ta'ala Date: Sun, 14 Apr 2024 17:52:56 +1000 Subject: [PATCH 05/18] WIP: attempting direct method call. --- prefs.js | 102 +++++++++++++++++++++++++++++++++++-------------------- 1 file changed, 66 insertions(+), 36 deletions(-) diff --git a/prefs.js b/prefs.js index 74242812..70989a2d 100644 --- a/prefs.js +++ b/prefs.js @@ -449,42 +449,44 @@ class SettingsWidget { // build version information const buffer = new Gtk.TextBuffer(); - // dbus to get extensions - const wrapper = Gio.DBusProxy.makeProxyWrapper( - ` - - - - - - - - - - ` - ); - - const proxy = wrapper( - Gio.DBus.session, - 'org.gnome.Mutter.DisplayConfig', - '/org/gnome/Mutter/DisplayConfig', - (_proxy, error) => { - if (error) { - console.error(error); - } - } - ); - // this._gatherInfo(stdout => buffer.set_text(stdout, -1)); - - // now call it - proxy.GetCurrentStateRemote((state, error) => { - if (error) { - console.error(error); - return; - } - - buffer.set_text(JSON.stringify(state), -1); - }); + this._getExtensions(); + + // // dbus to get extensions + // const wrapper = Gio.DBusProxy.makeProxyWrapper( + // ` + // + // + // + // + // + // + // + // + // + // ` + // ); + + // const proxy = wrapper( + // Gio.DBus.session, + // 'org.gnome.Shell.Extensions', + // '/org/gnome/Shell/Extensions', + // (_proxy, error) => { + // if (error) { + // console.error(error); + // } + // } + // ); + // // this._gatherInfo(stdout => buffer.set_text(stdout, -1)); + + // // now call it + // proxy.GetCurrentStateRemote((state, error) => { + // if (error) { + // console.error(error); + // return; + // } + + // buffer.set_text(JSON.stringify(state), -1); + // }); // set text to buffer const aboutVersionView = this.builder.get_object('about_version_textView'); @@ -492,6 +494,34 @@ class SettingsWidget { aboutVersionView.set_buffer(buffer); } + // gdbus call --session --dest org.gnome.Shell.Extensions --object-path /org/gnome/Shell/Extensions + // --method org.gnome.Shell.Extensions.ListExtensions + + async _getExtensions() { + try { + const reply = await Gio.DBus.session.call( + 'org.gnome.Shell.Extensions', + '/org/gnome/Shell/Extensions', + 'org.gnome.Shell.Extensions', + 'ListExtensions', + null, + null, + Gio.DBusCallFlags.NONE, + -1, + null, + _result => { + console.log(`reply returned`); + }); + + // Our method call has a reply, so we will extract it by getting the + // first child of the tuple, which is the actual method return value. + const value = reply.get_child_value(0); + console.log(value); + } catch (error) { + console.error(error); + } + } + range(n) { let r = []; for (let i = 0; i < n; i++) From 890188761c2020762c144451152a5e3d6ccd98b7 Mon Sep 17 00:00:00 2001 From: Jay Ta'ala Date: Sun, 14 Apr 2024 23:43:23 +1000 Subject: [PATCH 06/18] Working example using proxyClient. --- prefs.js | 131 ++++++++++++++++++++++++++----------------------------- 1 file changed, 63 insertions(+), 68 deletions(-) diff --git a/prefs.js b/prefs.js index 70989a2d..d91c220c 100644 --- a/prefs.js +++ b/prefs.js @@ -377,7 +377,7 @@ class SettingsWidget { let winprops = this._settings.get_value('winprops').deep_unpack() .map(p => JSON.parse(p)); // sort a little nicer - let valueFn = wp => { + let valueFn = wp => { if (wp.wm_class) { return wp.wm_class; } @@ -443,85 +443,80 @@ class SettingsWidget { // About // let versionLabel = this.builder.get_object('extension_version'); - // let version = this.extension.metadata.version?.toString() ?? '?'; + const version = this.extension.metadata['version-name'] ?? '?'; // versionLabel.set_text(version); // build version information const buffer = new Gtk.TextBuffer(); - this._getExtensions(); - - // // dbus to get extensions - // const wrapper = Gio.DBusProxy.makeProxyWrapper( - // ` - // - // - // - // - // - // - // - // - // - // ` - // ); - - // const proxy = wrapper( - // Gio.DBus.session, - // 'org.gnome.Shell.Extensions', - // '/org/gnome/Shell/Extensions', - // (_proxy, error) => { - // if (error) { - // console.error(error); - // } - // } - // ); - // // this._gatherInfo(stdout => buffer.set_text(stdout, -1)); - - // // now call it - // proxy.GetCurrentStateRemote((state, error) => { - // if (error) { - // console.error(error); - // return; - // } - - // buffer.set_text(JSON.stringify(state), -1); - // }); + // this._getVersions(); + + // dbus to get extensions + const wrapper = Gio.DBusProxy.makeProxyWrapper( + ` + + + + + + + + ` + ); + + const proxy = wrapper( + Gio.DBus.session, + 'org.gnome.Shell.Extensions', + '/org/gnome/Shell/Extensions', + (_proxy, error) => { + if (error) { + console.error(error); + } + } + ); + + // now call it + let extensions = ""; + proxy.ListExtensionsRemote((state, error) => { + if (error) { + console.error(error); + return; + } + const [ext] = state; + extensions = Object.keys(ext).map( + // e => console.log(`key=${e} value=${extensions[e].enabled.deep_unpack()}`) + k => { + return { + uuid: k, + active: ext[k].enabled.deep_unpack(), + }; + } + ) + .filter(v => v.active === true) + .map(v => `- ${v.uuid}`) + .join("\n"); + + const text = ` + Please include this information in your bug report on GitHub! + PaperWM version: ${version} + Enabled extensions: + ${extensions} + `; + + buffer.set_text( + text.split('\n') + .map(v => v.trim()) + .join('\n').trim(), + -1); + }); // set text to buffer + const aboutVersionView = this.builder.get_object('about_version_textView'); aboutVersionView.set_wrap_mode(Gtk.WrapMode.WORD_CHAR); aboutVersionView.set_buffer(buffer); } - // gdbus call --session --dest org.gnome.Shell.Extensions --object-path /org/gnome/Shell/Extensions - // --method org.gnome.Shell.Extensions.ListExtensions - - async _getExtensions() { - try { - const reply = await Gio.DBus.session.call( - 'org.gnome.Shell.Extensions', - '/org/gnome/Shell/Extensions', - 'org.gnome.Shell.Extensions', - 'ListExtensions', - null, - null, - Gio.DBusCallFlags.NONE, - -1, - null, - _result => { - console.log(`reply returned`); - }); - - // Our method call has a reply, so we will extract it by getting the - // first child of the tuple, which is the actual method return value. - const value = reply.get_child_value(0); - console.log(value); - } catch (error) { - console.error(error); - } - } - range(n) { let r = []; for (let i = 0; i < n; i++) From 6b002c8675b68fe835f51da1e9cc056606d7c018 Mon Sep 17 00:00:00 2001 From: Jay Ta'ala Date: Mon, 15 Apr 2024 18:50:36 +1000 Subject: [PATCH 07/18] Added distribution info. --- prefs.js | 3 +++ 1 file changed, 3 insertions(+) diff --git a/prefs.js b/prefs.js index d91c220c..97ca048b 100644 --- a/prefs.js +++ b/prefs.js @@ -498,6 +498,9 @@ class SettingsWidget { const text = ` Please include this information in your bug report on GitHub! + Distribution: ${GLib.get_os_info('NAME') ?? 'UNKNOWN'}, ${GLib.get_os_info('VERSION') ?? ""} + GNOME Shell: + Display server: ${Meta.is_wayland_compositor() ? 'Wayland' : "X11"} PaperWM version: ${version} Enabled extensions: ${extensions} From 0952fb3c261b4360c95ba58c11f87e82ecc71486 Mon Sep 17 00:00:00 2001 From: Jay Ta'ala Date: Mon, 15 Apr 2024 19:10:25 +1000 Subject: [PATCH 08/18] Switched to direct method call (sync). --- prefs.js | 106 +++++++++++++++++++++++-------------------------------- 1 file changed, 44 insertions(+), 62 deletions(-) diff --git a/prefs.js b/prefs.js index 97ca048b..29657754 100644 --- a/prefs.js +++ b/prefs.js @@ -442,84 +442,66 @@ class SettingsWidget { percentValueChanged('maximize-width-percent', 'maximize-width-percent'); // About - // let versionLabel = this.builder.get_object('extension_version'); - const version = this.extension.metadata['version-name'] ?? '?'; - // versionLabel.set_text(version); - // build version information const buffer = new Gtk.TextBuffer(); - - // this._getVersions(); - - // dbus to get extensions - const wrapper = Gio.DBusProxy.makeProxyWrapper( - ` - - - - - - - - ` - ); - - const proxy = wrapper( - Gio.DBus.session, - 'org.gnome.Shell.Extensions', - '/org/gnome/Shell/Extensions', - (_proxy, error) => { - if (error) { - console.error(error); - } - } - ); - - // now call it - let extensions = ""; - proxy.ListExtensionsRemote((state, error) => { - if (error) { - console.error(error); - return; - } - const [ext] = state; - extensions = Object.keys(ext).map( - // e => console.log(`key=${e} value=${extensions[e].enabled.deep_unpack()}`) - k => { - return { - uuid: k, - active: ext[k].enabled.deep_unpack(), - }; - } - ) - .filter(v => v.active === true) - .map(v => `- ${v.uuid}`) - .join("\n"); - - const text = ` + const text = ` Please include this information in your bug report on GitHub! Distribution: ${GLib.get_os_info('NAME') ?? 'UNKNOWN'}, ${GLib.get_os_info('VERSION') ?? ""} GNOME Shell: - Display server: ${Meta.is_wayland_compositor() ? 'Wayland' : "X11"} - PaperWM version: ${version} - Enabled extensions: - ${extensions} + PaperWM version: ${this.extension.metadata['version-name'] ?? '?'} + Enabled extensions: ${this._getExtensions()} `; - buffer.set_text( - text.split('\n') + buffer.set_text( + text.split('\n') .map(v => v.trim()) .join('\n').trim(), - -1); - }); + -1); // set text to buffer - const aboutVersionView = this.builder.get_object('about_version_textView'); aboutVersionView.set_wrap_mode(Gtk.WrapMode.WORD_CHAR); aboutVersionView.set_buffer(buffer); } + /** + * Returns a formatted list of currently active extensions. + * @returns String + */ + _getExtensions() { + try { + const reply = Gio.DBus.session.call_sync( + 'org.gnome.Shell', + '/org/gnome/Shell', + 'org.gnome.Shell.Extensions', + 'ListExtensions', + null, // The method arguments + new GLib.VariantType('(a{sa{sv}})'), // The expected reply type + Gio.DBusCallFlags.NONE, + -1, + null + ); + + const [ext] = reply.deep_unpack(); + const extensions = Object.keys(ext).map( + k => { + return { + uuid: k, + active: ext[k].enabled.deep_unpack(), + }; + } + ) + .filter(v => v.active === true) + .map(v => `- ${v.uuid}`) + .join("\n"); + + return `\n${extensions}`; + } catch (error) { + console.error(error); + return 'UNKNOWN'; + } + } + range(n) { let r = []; for (let i = 0; i < n; i++) From 293f3a3f8f11a0efa4252e3cf405003230322c17 Mon Sep 17 00:00:00 2001 From: Jay Ta'ala Date: Mon, 15 Apr 2024 19:27:09 +1000 Subject: [PATCH 09/18] Added version dbus call. --- prefs.js | 39 ++++++++++++++++++++++++++++++++++----- 1 file changed, 34 insertions(+), 5 deletions(-) diff --git a/prefs.js b/prefs.js index 29657754..ff3e9f46 100644 --- a/prefs.js +++ b/prefs.js @@ -445,9 +445,10 @@ class SettingsWidget { // build version information const buffer = new Gtk.TextBuffer(); const text = ` - Please include this information in your bug report on GitHub! - Distribution: ${GLib.get_os_info('NAME') ?? 'UNKNOWN'}, ${GLib.get_os_info('VERSION') ?? ""} - GNOME Shell: + Please copy/paste this information in any submitted bug report: + + Distribution: ${GLib.get_os_info('NAME') ?? 'UNKNOWN'} ${GLib.get_os_info('VERSION') ?? ""} + GNOME Shell: ${this._getGnomeVersion()} PaperWM version: ${this.extension.metadata['version-name'] ?? '?'} Enabled extensions: ${this._getExtensions()} `; @@ -464,6 +465,34 @@ class SettingsWidget { aboutVersionView.set_buffer(buffer); } + /** + * Returns a formatted list of currently active extensions. + * @returns String + */ + _getGnomeVersion() { + try { + const reply = Gio.DBus.session.call_sync( + 'org.gnome.Shell', + '/org/gnome/Shell', + 'org.freedesktop.DBus.Properties', + 'Get', + new GLib.Variant('(ss)', [ + 'org.gnome.Shell', + 'ShellVersion', + ]), + null, + Gio.DBusCallFlags.NONE, + -1, + null); + + const [version] = reply.deep_unpack(); + return version.deep_unpack(); + } catch (error) { + console.error(error); + return 'UNKNOWN'; + } + } + /** * Returns a formatted list of currently active extensions. * @returns String @@ -475,8 +504,8 @@ class SettingsWidget { '/org/gnome/Shell', 'org.gnome.Shell.Extensions', 'ListExtensions', - null, // The method arguments - new GLib.VariantType('(a{sa{sv}})'), // The expected reply type + null, + new GLib.VariantType('(a{sa{sv}})'), Gio.DBusCallFlags.NONE, -1, null From dd0b5b996075bf07043fe4696503811bd1d1fc81 Mon Sep 17 00:00:00 2001 From: Jay Ta'ala Date: Mon, 15 Apr 2024 19:49:40 +1000 Subject: [PATCH 10/18] Added a copy to clipboard button. --- Settings.ui | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/Settings.ui b/Settings.ui index defbe848..bd1fc531 100644 --- a/Settings.ui +++ b/Settings.ui @@ -1868,6 +1868,15 @@ 6 + + + Copy to Clipboard + Copies PaperWM version information to clipboard + + + From a85376ed7d3f0ec94df271f0f34417a8bd0d21ac Mon Sep 17 00:00:00 2001 From: Jay Ta'ala Date: Mon, 15 Apr 2024 20:12:23 +1000 Subject: [PATCH 11/18] Added copying. --- Settings.ui | 2 +- prefs.js | 21 +++++++++++++-------- 2 files changed, 14 insertions(+), 9 deletions(-) diff --git a/Settings.ui b/Settings.ui index bd1fc531..519b4f6f 100644 --- a/Settings.ui +++ b/Settings.ui @@ -1869,7 +1869,7 @@ - + Copy to Clipboard Copies PaperWM version information to clipboard