import gnome-shell-3.32.2-9.el8
This commit is contained in:
parent
4360abc774
commit
d641a9efb2
2
.gitignore
vendored
2
.gitignore
vendored
@ -1 +1 @@
|
||||
SOURCES/gnome-shell-3.28.3.tar.xz
|
||||
SOURCES/gnome-shell-3.32.2.tar.xz
|
||||
|
@ -1 +1 @@
|
||||
767bea7e4715fb951c74a02c26d4b4d8ddecaaaf SOURCES/gnome-shell-3.28.3.tar.xz
|
||||
331e9cf71cd1d2a4e9238d87d216da4c6f3a400e SOURCES/gnome-shell-3.32.2.tar.xz
|
||||
|
@ -1,264 +0,0 @@
|
||||
From e9130f3502e36262743a8c1a423a6740b64bcf7f Mon Sep 17 00:00:00 2001
|
||||
From: =?UTF-8?q?Jonas=20=C3=85dahl?= <jadahl@gmail.com>
|
||||
Date: Wed, 5 Sep 2018 11:15:30 +0200
|
||||
Subject: [PATCH 1/2] Add app introspection API
|
||||
|
||||
Add a D-Bus API that allows the API user to introspect the application
|
||||
state of the shell. Currently the only exposed information is list of
|
||||
running applications and which one is active (i.e. has focus).
|
||||
|
||||
https://gitlab.gnome.org/GNOME/gnome-shell/merge_requests/326
|
||||
(cherry picked from commit 10c68c6b952959d105c3126fc61f22a199e8e848)
|
||||
---
|
||||
data/meson.build | 3 +-
|
||||
data/org.gnome.Shell.Introspect.xml | 37 +++++++++
|
||||
data/org.gnome.shell.gschema.xml.in | 8 ++
|
||||
js/js-resources.gresource.xml | 1 +
|
||||
js/misc/introspect.js | 116 ++++++++++++++++++++++++++++
|
||||
js/ui/main.js | 4 +
|
||||
6 files changed, 168 insertions(+), 1 deletion(-)
|
||||
create mode 100644 data/org.gnome.Shell.Introspect.xml
|
||||
create mode 100644 js/misc/introspect.js
|
||||
|
||||
diff --git a/data/meson.build b/data/meson.build
|
||||
index 7c9807721..fee44f02e 100644
|
||||
--- a/data/meson.build
|
||||
+++ b/data/meson.build
|
||||
@@ -46,7 +46,8 @@ dbus_interfaces = [
|
||||
'org.gnome.Shell.Screencast.xml',
|
||||
'org.gnome.Shell.Screenshot.xml',
|
||||
'org.gnome.ShellSearchProvider.xml',
|
||||
- 'org.gnome.ShellSearchProvider2.xml'
|
||||
+ 'org.gnome.ShellSearchProvider2.xml',
|
||||
+ 'org.gnome.Shell.Introspect.xml'
|
||||
]
|
||||
install_data(dbus_interfaces, install_dir: ifacedir)
|
||||
|
||||
diff --git a/data/org.gnome.Shell.Introspect.xml b/data/org.gnome.Shell.Introspect.xml
|
||||
new file mode 100644
|
||||
index 000000000..10c48d635
|
||||
--- /dev/null
|
||||
+++ b/data/org.gnome.Shell.Introspect.xml
|
||||
@@ -0,0 +1,37 @@
|
||||
+<!DOCTYPE node PUBLIC
|
||||
+'-//freedesktop//DTD D-BUS Object Introspection 1.0//EN'
|
||||
+'http://www.freedesktop.org/standards/dbus/1.0/introspect.dtd'>
|
||||
+<node>
|
||||
+
|
||||
+ <!--
|
||||
+ org.gnome.Shell.Introspect:
|
||||
+ @short_description: Introspection interface
|
||||
+
|
||||
+ The interface used to introspect the state of Shell, such as running
|
||||
+ applications, currently active application, etc.
|
||||
+ -->
|
||||
+ <interface name="org.gnome.Shell.Introspect">
|
||||
+
|
||||
+ <!--
|
||||
+ RunningApplicationsChanged:
|
||||
+ @short_description: Notifies when the running applications changes
|
||||
+ -->
|
||||
+ <signal name="RunningApplicationsChanged" />
|
||||
+
|
||||
+ <!--
|
||||
+ GetRunningApplications:
|
||||
+ @short_description: Retrieves the description of all running applications
|
||||
+
|
||||
+ Each application is associated by an application ID. The details of
|
||||
+ each application consists of a varlist of keys and values. Available
|
||||
+ keys are listed below.
|
||||
+
|
||||
+ 'active-on-seats' - (as) list of seats the application is active on
|
||||
+ (a seat only has at most one active
|
||||
+ application)
|
||||
+ -->
|
||||
+ <method name="GetRunningApplications">
|
||||
+ <arg name="apps" direction="out" type="a{sa{sv}}" />
|
||||
+ </method>
|
||||
+ </interface>
|
||||
+</node>
|
||||
diff --git a/data/org.gnome.shell.gschema.xml.in b/data/org.gnome.shell.gschema.xml.in
|
||||
index 63a19032d..6917d753d 100644
|
||||
--- a/data/org.gnome.shell.gschema.xml.in
|
||||
+++ b/data/org.gnome.shell.gschema.xml.in
|
||||
@@ -90,6 +90,14 @@
|
||||
adapter is ever seen not to have devices associated to it.
|
||||
</description>
|
||||
</key>
|
||||
+ <key name="introspect" type="b">
|
||||
+ <default>false</default>
|
||||
+ <summary>Enable introspection API</summary>
|
||||
+ <description>
|
||||
+ Enables a D-Bus API that allows to introspect the application state of
|
||||
+ the shell.
|
||||
+ </description>
|
||||
+ </key>
|
||||
<child name="keybindings" schema="org.gnome.shell.keybindings"/>
|
||||
<child name="keyboard" schema="org.gnome.shell.keyboard"/>
|
||||
</schema>
|
||||
diff --git a/js/js-resources.gresource.xml b/js/js-resources.gresource.xml
|
||||
index 883b62d66..77c2c2abb 100644
|
||||
--- a/js/js-resources.gresource.xml
|
||||
+++ b/js/js-resources.gresource.xml
|
||||
@@ -18,6 +18,7 @@
|
||||
<file>misc/history.js</file>
|
||||
<file>misc/ibusManager.js</file>
|
||||
<file>misc/inputMethod.js</file>
|
||||
+ <file>misc/introspect.js</file>
|
||||
<file>misc/jsParse.js</file>
|
||||
<file>misc/keyboardManager.js</file>
|
||||
<file>misc/loginManager.js</file>
|
||||
diff --git a/js/misc/introspect.js b/js/misc/introspect.js
|
||||
new file mode 100644
|
||||
index 000000000..05ef9e637
|
||||
--- /dev/null
|
||||
+++ b/js/misc/introspect.js
|
||||
@@ -0,0 +1,116 @@
|
||||
+const Gio = imports.gi.Gio;
|
||||
+const GLib = imports.gi.GLib;
|
||||
+const Lang = imports.lang;
|
||||
+const Meta = imports.gi.Meta;
|
||||
+const Shell = imports.gi.Shell;
|
||||
+
|
||||
+const INTROSPECT_SCHEMA = 'org.gnome.shell';
|
||||
+const INTROSPECT_KEY = 'introspect';
|
||||
+const APP_WHITELIST = ['org.freedesktop.impl.portal.desktop.gtk'];
|
||||
+
|
||||
+const IntrospectDBusIface = '<node> \
|
||||
+ <interface name="org.gnome.Shell.Introspect"> \
|
||||
+ <signal name="RunningApplicationsChanged" /> \
|
||||
+ <method name="GetRunningApplications"> \
|
||||
+ <arg name="apps" direction="out" type="a{sa{sv}}" /> \
|
||||
+ </method> \
|
||||
+ </interface> \
|
||||
+</node>';
|
||||
+
|
||||
+var IntrospectService = new Lang.Class({
|
||||
+ Name: 'IntrospectService',
|
||||
+
|
||||
+ _init() {
|
||||
+ this._dbusImpl = Gio.DBusExportedObject.wrapJSObject(IntrospectDBusIface,
|
||||
+ this);
|
||||
+ this._dbusImpl.export(Gio.DBus.session, '/org/gnome/Shell/Introspect');
|
||||
+ Gio.DBus.session.own_name('org.gnome.Shell.Introspect',
|
||||
+ Gio.BusNameOwnerFlags.REPLACE,
|
||||
+ null, null);
|
||||
+
|
||||
+ this._runningApplications = {};
|
||||
+ this._runningApplicationsDirty = true;
|
||||
+ this._activeApplication = null;
|
||||
+ this._activeApplicationDirty = true;
|
||||
+
|
||||
+ this._appSystem = Shell.AppSystem.get_default();
|
||||
+ this._appSystem.connect('app-state-changed',
|
||||
+ () => {
|
||||
+ this._runningApplicationsDirty = true;
|
||||
+ this._syncRunningApplications();
|
||||
+ });
|
||||
+
|
||||
+ this._settings = new Gio.Settings({ schema_id: INTROSPECT_SCHEMA });
|
||||
+
|
||||
+ let tracker = Shell.WindowTracker.get_default();
|
||||
+ tracker.connect('notify::focus-app',
|
||||
+ () => {
|
||||
+ this._activeApplicationDirty = true;
|
||||
+ this._syncRunningApplications();
|
||||
+ });
|
||||
+
|
||||
+ this._syncRunningApplications();
|
||||
+ },
|
||||
+
|
||||
+ _isStandaloneApp(app) {
|
||||
+ let windows = app.get_windows();
|
||||
+
|
||||
+ return app.get_windows().some(w => w.transient_for == null);
|
||||
+ },
|
||||
+
|
||||
+ _isIntrospectEnabled() {
|
||||
+ return this._settings.get_boolean(INTROSPECT_KEY);
|
||||
+ },
|
||||
+
|
||||
+ _isSenderWhitelisted(sender) {
|
||||
+ return APP_WHITELIST.includes(sender);
|
||||
+ },
|
||||
+
|
||||
+ _syncRunningApplications() {
|
||||
+ let tracker = Shell.WindowTracker.get_default();
|
||||
+ let apps = this._appSystem.get_running();
|
||||
+ let seatName = "seat0";
|
||||
+ let newRunningApplications = {};
|
||||
+
|
||||
+ let newActiveApplication = null;
|
||||
+ let focusedApp = tracker.focus_app;
|
||||
+
|
||||
+ for (let app of apps) {
|
||||
+ let appInfo = {};
|
||||
+ let isAppActive = (focusedApp == app);
|
||||
+
|
||||
+ if (!this._isStandaloneApp(app))
|
||||
+ continue;
|
||||
+
|
||||
+ if (isAppActive) {
|
||||
+ appInfo['active-on-seats'] = new GLib.Variant('as', [seatName]);
|
||||
+ newActiveApplication = app.get_id();
|
||||
+ }
|
||||
+
|
||||
+ newRunningApplications[app.get_id()] = appInfo;
|
||||
+ }
|
||||
+
|
||||
+ if (this._runningApplicationsDirty ||
|
||||
+ (this._activeApplicationDirty &&
|
||||
+ this._activeApplication != newActiveApplication)) {
|
||||
+ this._runningApplications = newRunningApplications;
|
||||
+ this._activeApplication = newActiveApplication;
|
||||
+
|
||||
+ this._dbusImpl.emit_signal('RunningApplicationsChanged', null);
|
||||
+ }
|
||||
+ this._runningApplicationsDirty = false;
|
||||
+ this._activeApplicationDirty = false;
|
||||
+ },
|
||||
+
|
||||
+ GetRunningApplicationsAsync(params, invocation) {
|
||||
+ if (!this._isIntrospectEnabled() &&
|
||||
+ !this._isSenderWhitelisted(invocation.get_sender())) {
|
||||
+ invocation.return_error_literal(Gio.DBusError,
|
||||
+ Gio.DBusError.ACCESS_DENIED,
|
||||
+ 'App introspection not allowed');
|
||||
+ return;
|
||||
+ }
|
||||
+
|
||||
+ invocation.return_value(new GLib.Variant('(a{sa{sv}})', [this._runningApplications]));
|
||||
+ }
|
||||
+});
|
||||
diff --git a/js/ui/main.js b/js/ui/main.js
|
||||
index 2c54bb680..0639b5e7d 100644
|
||||
--- a/js/ui/main.js
|
||||
+++ b/js/ui/main.js
|
||||
@@ -20,6 +20,7 @@ const Environment = imports.ui.environment;
|
||||
const ExtensionSystem = imports.ui.extensionSystem;
|
||||
const ExtensionDownloader = imports.ui.extensionDownloader;
|
||||
const InputMethod = imports.misc.inputMethod;
|
||||
+const Introspect = imports.misc.introspect;
|
||||
const Keyboard = imports.ui.keyboard;
|
||||
const MessageTray = imports.ui.messageTray;
|
||||
const ModalDialog = imports.ui.modalDialog;
|
||||
@@ -82,6 +83,7 @@ var keyboard = null;
|
||||
var layoutManager = null;
|
||||
var kbdA11yDialog = null;
|
||||
var inputMethod = null;
|
||||
+var introspectService = null;
|
||||
let _startDate;
|
||||
let _defaultCssStylesheet = null;
|
||||
let _cssStylesheet = null;
|
||||
@@ -187,6 +189,8 @@ function _initializeUI() {
|
||||
windowAttentionHandler = new WindowAttentionHandler.WindowAttentionHandler();
|
||||
componentManager = new Components.ComponentManager();
|
||||
|
||||
+ introspectService = new Introspect.IntrospectService();
|
||||
+
|
||||
layoutManager.init();
|
||||
overview.init();
|
||||
|
||||
--
|
||||
2.20.1
|
||||
|
@ -1,153 +0,0 @@
|
||||
From 8b916620e32ee0b42734dd7896fe5058c8591d81 Mon Sep 17 00:00:00 2001
|
||||
From: =?UTF-8?q?Jonas=20=C3=85dahl?= <jadahl@gmail.com>
|
||||
Date: Fri, 20 Jul 2018 16:50:50 +0200
|
||||
Subject: [PATCH 1/2] Add remote access indication and control
|
||||
|
||||
Add an indicator for when there is something access the display server
|
||||
remotely. This could be 1) remote desktop, 2) screen cast or 3) remote
|
||||
control, but all effectively applications using
|
||||
org.freedesktop.portal.ScreenCast or org.gnome.portal.RemoteDesktop as
|
||||
well as gnome-remote-desktop using the corresponding org.gnome.Mutter
|
||||
APIs directly.
|
||||
|
||||
As it is now, it'll simply show a single icon for when anything is
|
||||
having an active session, and a single action "Turn off" that'll close
|
||||
every active session.
|
||||
|
||||
https://gitlab.gnome.org/GNOME/gnome-shell/merge_requests/160
|
||||
---
|
||||
js/js-resources.gresource.xml | 1 +
|
||||
js/ui/panel.js | 3 ++
|
||||
js/ui/status/remoteAccess.js | 80 +++++++++++++++++++++++++++++++++++
|
||||
3 files changed, 84 insertions(+)
|
||||
create mode 100644 js/ui/status/remoteAccess.js
|
||||
|
||||
diff --git a/js/js-resources.gresource.xml b/js/js-resources.gresource.xml
|
||||
index 883b62d66..cc1da4461 100644
|
||||
--- a/js/js-resources.gresource.xml
|
||||
+++ b/js/js-resources.gresource.xml
|
||||
@@ -130,6 +130,7 @@
|
||||
<file>ui/status/rfkill.js</file>
|
||||
<file>ui/status/volume.js</file>
|
||||
<file>ui/status/bluetooth.js</file>
|
||||
+ <file>ui/status/remoteAccess.js</file>
|
||||
<file>ui/status/screencast.js</file>
|
||||
<file>ui/status/system.js</file>
|
||||
<file>ui/status/thunderbolt.js</file>
|
||||
diff --git a/js/ui/panel.js b/js/ui/panel.js
|
||||
index d44ed9fec..53cc445f8 100644
|
||||
--- a/js/ui/panel.js
|
||||
+++ b/js/ui/panel.js
|
||||
@@ -709,6 +709,7 @@ var AggregateMenu = new Lang.Class({
|
||||
this._bluetooth = null;
|
||||
}
|
||||
|
||||
+ this._remoteAccess = new imports.ui.status.remoteAccess.RemoteAccessApplet();
|
||||
this._power = new imports.ui.status.power.Indicator();
|
||||
this._rfkill = new imports.ui.status.rfkill.Indicator();
|
||||
this._volume = new imports.ui.status.volume.Indicator();
|
||||
@@ -729,6 +730,7 @@ var AggregateMenu = new Lang.Class({
|
||||
if (this._bluetooth) {
|
||||
this._indicators.add_child(this._bluetooth.indicators);
|
||||
}
|
||||
+ this._indicators.add_child(this._remoteAccess.indicators);
|
||||
this._indicators.add_child(this._rfkill.indicators);
|
||||
this._indicators.add_child(this._volume.indicators);
|
||||
this._indicators.add_child(this._power.indicators);
|
||||
@@ -743,6 +745,7 @@ var AggregateMenu = new Lang.Class({
|
||||
if (this._bluetooth) {
|
||||
this.menu.addMenuItem(this._bluetooth.menu);
|
||||
}
|
||||
+ this.menu.addMenuItem(this._remoteAccess.menu);
|
||||
this.menu.addMenuItem(this._location.menu);
|
||||
this.menu.addMenuItem(this._rfkill.menu);
|
||||
this.menu.addMenuItem(this._power.menu);
|
||||
diff --git a/js/ui/status/remoteAccess.js b/js/ui/status/remoteAccess.js
|
||||
new file mode 100644
|
||||
index 000000000..ffa334001
|
||||
--- /dev/null
|
||||
+++ b/js/ui/status/remoteAccess.js
|
||||
@@ -0,0 +1,80 @@
|
||||
+// -*- mode: js; js-indent-level: 4; indent-tabs-mode: nil -*-
|
||||
+
|
||||
+const Lang = imports.lang;
|
||||
+const Meta = imports.gi.Meta;
|
||||
+
|
||||
+const PanelMenu = imports.ui.panelMenu;
|
||||
+const PopupMenu = imports.ui.popupMenu;
|
||||
+
|
||||
+var RemoteAccessApplet = new Lang.Class({
|
||||
+ Name: 'RemoteAccessApplet',
|
||||
+ Extends: PanelMenu.SystemIndicator,
|
||||
+
|
||||
+ _init() {
|
||||
+ this.parent();
|
||||
+
|
||||
+ let backend = Meta.get_backend();
|
||||
+ let controller = backend.get_remote_access_controller();
|
||||
+
|
||||
+ if (!controller)
|
||||
+ return;
|
||||
+
|
||||
+ // We can't possibly know about all types of screen sharing on X11, so
|
||||
+ // showing these controls on X11 might give a false sense of security.
|
||||
+ // Thus, only enable these controls when using Wayland, where we are
|
||||
+ // in control of sharing.
|
||||
+ if (!Meta.is_wayland_compositor())
|
||||
+ return;
|
||||
+
|
||||
+ this._handles = new Set();
|
||||
+ this._indicator = null;
|
||||
+ this._menuSection = null;
|
||||
+
|
||||
+ controller.connect('new-handle', (controller, handle) => {
|
||||
+ this._onNewHandle(handle);
|
||||
+ });
|
||||
+ },
|
||||
+
|
||||
+ _ensureControls() {
|
||||
+ if (this._indicator)
|
||||
+ return;
|
||||
+
|
||||
+ this._indicator = this._addIndicator();
|
||||
+ this._indicator.icon_name = 'screen-shared-symbolic';
|
||||
+ this._item =
|
||||
+ new PopupMenu.PopupSubMenuMenuItem(_("Screen is Being Shared"),
|
||||
+ true);
|
||||
+ this._item.menu.addAction(_("Turn off"),
|
||||
+ () => {
|
||||
+ for (let handle of this._handles)
|
||||
+ handle.stop();
|
||||
+ });
|
||||
+ this._item.icon.icon_name = 'screen-shared-symbolic';
|
||||
+ this.menu.addMenuItem(this._item);
|
||||
+ },
|
||||
+
|
||||
+ _sync() {
|
||||
+ if (this._handles.size == 0) {
|
||||
+ this._indicator.visible = false;
|
||||
+ this._item.actor.visible = false;
|
||||
+ } else {
|
||||
+ this._indicator.visible = true;
|
||||
+ this._item.actor.visible = true;
|
||||
+ }
|
||||
+ },
|
||||
+
|
||||
+ _onStopped(handle) {
|
||||
+ this._handles.delete(handle);
|
||||
+ this._sync();
|
||||
+ },
|
||||
+
|
||||
+ _onNewHandle(handle) {
|
||||
+ this._handles.add(handle);
|
||||
+ handle.connect('stopped', this._onStopped.bind(this));
|
||||
+
|
||||
+ if (this._handles.size == 1) {
|
||||
+ this._ensureControls();
|
||||
+ this._sync();
|
||||
+ }
|
||||
+ },
|
||||
+});
|
||||
--
|
||||
2.17.1
|
||||
|
@ -1,39 +0,0 @@
|
||||
From 8f66d508bad63412f61d2162bb05224ee1637ab1 Mon Sep 17 00:00:00 2001
|
||||
From: =?UTF-8?q?Florian=20M=C3=BCllner?= <fmuellner@gnome.org>
|
||||
Date: Fri, 16 Nov 2018 11:39:08 +0100
|
||||
Subject: [PATCH] altSwitcher: Fix error when all alternatives are disabled
|
||||
|
||||
While we do consider the case that we don't have a child to show for the
|
||||
visibility, we are still trying to move the click action unconditionally.
|
||||
|
||||
https://gitlab.gnome.org/GNOME/gnome-shell/issues/783
|
||||
---
|
||||
js/ui/status/system.js | 5 ++++-
|
||||
1 file changed, 4 insertions(+), 1 deletion(-)
|
||||
|
||||
diff --git a/js/ui/status/system.js b/js/ui/status/system.js
|
||||
index 68a0b4b5b..cd6f3d8b0 100644
|
||||
--- a/js/ui/status/system.js
|
||||
+++ b/js/ui/status/system.js
|
||||
@@ -58,6 +58,9 @@ var AltSwitcher = new Lang.Class({
|
||||
childToShow = this._standard;
|
||||
} else if (this._alternate.visible) {
|
||||
childToShow = this._alternate;
|
||||
+ } else {
|
||||
+ this.actor.hide();
|
||||
+ return;
|
||||
}
|
||||
|
||||
let childShown = this.actor.get_child();
|
||||
@@ -79,7 +82,7 @@ var AltSwitcher = new Lang.Class({
|
||||
global.sync_pointer();
|
||||
}
|
||||
|
||||
- this.actor.visible = (childToShow != null);
|
||||
+ this.actor.show();
|
||||
},
|
||||
|
||||
_onDestroy() {
|
||||
--
|
||||
2.20.1
|
||||
|
@ -0,0 +1,40 @@
|
||||
From 34e6bbeebef37ae688ca0527bde03fa26b143bb7 Mon Sep 17 00:00:00 2001
|
||||
From: Ray Strode <rstrode@redhat.com>
|
||||
Date: Thu, 27 Jun 2019 14:27:34 -0400
|
||||
Subject: [PATCH] animation: fix unintentional loop while polkit dialog is
|
||||
active
|
||||
|
||||
The polkit password dialog has a spinner that gets displayed
|
||||
while the users password is being verified.
|
||||
|
||||
Unfortunately, the spinner stop method unintentionally calls
|
||||
back into itself after the stop fade out animation is complete.
|
||||
The stop method is called at startup, so the looping begins as
|
||||
soon as the dialog is visible and continues until the dialog is
|
||||
dismissed.
|
||||
|
||||
This commit fixes the loop by having the stop method cease
|
||||
calling itself, and instead having it call the stop method on the
|
||||
superclass.
|
||||
|
||||
https://gitlab.gnome.org/GNOME/gnome-shell/merge_requests/602
|
||||
---
|
||||
js/ui/animation.js | 2 +-
|
||||
1 file changed, 1 insertion(+), 1 deletion(-)
|
||||
|
||||
diff --git a/js/ui/animation.js b/js/ui/animation.js
|
||||
index c21b22565..58d7f4018 100644
|
||||
--- a/js/ui/animation.js
|
||||
+++ b/js/ui/animation.js
|
||||
@@ -162,7 +162,7 @@ var Spinner = class extends AnimatedIcon {
|
||||
time: SPINNER_ANIMATION_TIME,
|
||||
transition: 'linear',
|
||||
onComplete: () => {
|
||||
- this.stop(false);
|
||||
+ super.stop();
|
||||
}
|
||||
});
|
||||
} else {
|
||||
--
|
||||
2.21.0
|
||||
|
@ -1,34 +0,0 @@
|
||||
From 9b8a85d42d1c74f6a0815d23a484af3883284538 Mon Sep 17 00:00:00 2001
|
||||
From: =?UTF-8?q?Florian=20M=C3=BCllner?= <fmuellner@gnome.org>
|
||||
Date: Mon, 3 Sep 2018 17:10:27 +0200
|
||||
Subject: [PATCH] app: Close all closable windows from quit()
|
||||
|
||||
There's no relation between a window being hidden from overview/taskbars
|
||||
and a window not being closable - currently we effectively disable the
|
||||
fallback quit action for any application with open transients, which
|
||||
simply doesn't make sense.
|
||||
|
||||
Instead, only exclude windows for which the close action has been
|
||||
explicitly disabled.
|
||||
|
||||
https://gitlab.gnome.org/GNOME/gnome-shell/merge_requests/217
|
||||
---
|
||||
src/shell-app.c | 2 +-
|
||||
1 file changed, 1 insertion(+), 1 deletion(-)
|
||||
|
||||
diff --git a/src/shell-app.c b/src/shell-app.c
|
||||
index 84fcc97bf..1a6d5888d 100644
|
||||
--- a/src/shell-app.c
|
||||
+++ b/src/shell-app.c
|
||||
@@ -1159,7 +1159,7 @@ shell_app_request_quit (ShellApp *app)
|
||||
{
|
||||
MetaWindow *win = iter->data;
|
||||
|
||||
- if (meta_window_is_skip_taskbar (win))
|
||||
+ if (!meta_window_can_close (win))
|
||||
continue;
|
||||
|
||||
meta_window_delete (win, shell_global_get_current_time (shell_global_get ()));
|
||||
--
|
||||
2.20.1
|
||||
|
@ -1,4 +1,4 @@
|
||||
From e4049af3ca6fa37b5d8b09e6bdcbb32e3d9b0849 Mon Sep 17 00:00:00 2001
|
||||
From 23755cc20f3c05b97f769e27553f2ab482d60137 Mon Sep 17 00:00:00 2001
|
||||
From: =?UTF-8?q?Florian=20M=C3=BCllner?= <fmuellner@gnome.org>
|
||||
Date: Wed, 20 May 2015 16:44:00 +0200
|
||||
Subject: [PATCH] app: Fall back to window title instead of WM_CLASS
|
||||
@ -11,10 +11,10 @@ a .desktop file ...
|
||||
1 file changed, 1 insertion(+), 1 deletion(-)
|
||||
|
||||
diff --git a/src/shell-app.c b/src/shell-app.c
|
||||
index dbf537ce9..84fcc97bf 100644
|
||||
index 10efa9135..7d40186c9 100644
|
||||
--- a/src/shell-app.c
|
||||
+++ b/src/shell-app.c
|
||||
@@ -265,7 +265,7 @@ shell_app_get_name (ShellApp *app)
|
||||
@@ -259,7 +259,7 @@ shell_app_get_name (ShellApp *app)
|
||||
const char *name = NULL;
|
||||
|
||||
if (window)
|
||||
@ -24,5 +24,5 @@ index dbf537ce9..84fcc97bf 100644
|
||||
name = C_("program", "Unknown");
|
||||
return name;
|
||||
--
|
||||
2.20.1
|
||||
2.21.0
|
||||
|
||||
|
@ -1,4 +1,4 @@
|
||||
From fb3165447d4dac048d0b085bf0266027da66df2c Mon Sep 17 00:00:00 2001
|
||||
From a1c35ebb8f29103035526e6f48eba4ff37551964 Mon Sep 17 00:00:00 2001
|
||||
From: =?UTF-8?q?Florian=20M=C3=BCllner?= <fmuellner@gnome.org>
|
||||
Date: Thu, 21 Jun 2018 18:03:31 +0200
|
||||
Subject: [PATCH] appDisplay: Show full app name on hover
|
||||
@ -9,10 +9,10 @@ Subject: [PATCH] appDisplay: Show full app name on hover
|
||||
2 files changed, 56 insertions(+)
|
||||
|
||||
diff --git a/data/theme/gnome-shell-sass/_common.scss b/data/theme/gnome-shell-sass/_common.scss
|
||||
index f1aaea689..5bf01a540 100644
|
||||
index 3b0d2bf04..293ea2ab9 100644
|
||||
--- a/data/theme/gnome-shell-sass/_common.scss
|
||||
+++ b/data/theme/gnome-shell-sass/_common.scss
|
||||
@@ -1402,6 +1402,14 @@ StScrollBar {
|
||||
@@ -1411,6 +1411,14 @@ StScrollBar {
|
||||
|
||||
}
|
||||
|
||||
@ -28,10 +28,10 @@ index f1aaea689..5bf01a540 100644
|
||||
width: 10px; height: 3px;
|
||||
background-color: $selected_bg_color;
|
||||
diff --git a/js/ui/appDisplay.js b/js/ui/appDisplay.js
|
||||
index 74c772d50..070057c69 100644
|
||||
index adaefa7dd..a07db6573 100644
|
||||
--- a/js/ui/appDisplay.js
|
||||
+++ b/js/ui/appDisplay.js
|
||||
@@ -1628,6 +1628,20 @@ var AppIcon = new Lang.Class({
|
||||
@@ -1478,6 +1478,20 @@ var AppIcon = class AppIcon {
|
||||
this.actor.connect('clicked', this._onClicked.bind(this));
|
||||
this.actor.connect('popup-menu', this._onKeyboardPopupMenu.bind(this));
|
||||
|
||||
@ -52,7 +52,7 @@ index 74c772d50..070057c69 100644
|
||||
this._menu = null;
|
||||
this._menuManager = new PopupMenu.PopupMenuManager(this);
|
||||
|
||||
@@ -1659,12 +1673,39 @@ var AppIcon = new Lang.Class({
|
||||
@@ -1509,12 +1523,39 @@ var AppIcon = class AppIcon {
|
||||
this.app.disconnect(this._stateChangedId);
|
||||
this._stateChangedId = 0;
|
||||
this._removeMenuTimeout();
|
||||
@ -60,11 +60,11 @@ index 74c772d50..070057c69 100644
|
||||
+ if (this._hoverText)
|
||||
+ this._hoverText.destroy();
|
||||
+ this._hoverText = null;
|
||||
},
|
||||
}
|
||||
|
||||
_createIcon(iconSize) {
|
||||
return this.app.create_icon_texture(iconSize);
|
||||
},
|
||||
}
|
||||
|
||||
+ _syncHoverText() {
|
||||
+ if (this.shouldShowTooltip()) {
|
||||
@ -87,25 +87,25 @@ index 74c772d50..070057c69 100644
|
||||
+ this._removeHoverTimeout();
|
||||
+ this._hoverText.hide();
|
||||
+ }
|
||||
+ },
|
||||
+ }
|
||||
+
|
||||
_removeMenuTimeout() {
|
||||
if (this._menuTimeoutId > 0) {
|
||||
Mainloop.source_remove(this._menuTimeoutId);
|
||||
@@ -1672,6 +1713,13 @@ var AppIcon = new Lang.Class({
|
||||
@@ -1522,6 +1563,13 @@ var AppIcon = class AppIcon {
|
||||
}
|
||||
},
|
||||
}
|
||||
|
||||
+ _removeHoverTimeout() {
|
||||
+ if (this._hoverTimeoutId > 0) {
|
||||
+ Mainloop.source_remove(this._hoverTimeoutId);
|
||||
+ this._hoverTimeoutId = 0;
|
||||
+ }
|
||||
+ },
|
||||
+ }
|
||||
+
|
||||
_updateRunningStyle() {
|
||||
if (this.app.state != Shell.AppState.STOPPED)
|
||||
this._dot.show();
|
||||
--
|
||||
2.20.1
|
||||
2.21.0
|
||||
|
||||
|
@ -1,4 +1,4 @@
|
||||
From 2d63749878c1afa7d83a44c4d5e6c1aec3414b71 Mon Sep 17 00:00:00 2001
|
||||
From 165fc5147cd2c9bf4bc10a1c5a9a940ec4ddd8d9 Mon Sep 17 00:00:00 2001
|
||||
From: Ray Strode <rstrode@redhat.com>
|
||||
Date: Tue, 15 Jan 2019 12:51:16 -0500
|
||||
Subject: [PATCH 1/4] background: refresh after suspend on wayland
|
||||
@ -11,37 +11,10 @@ We need to do it on wayland, too.
|
||||
1 file changed, 3 deletions(-)
|
||||
|
||||
diff --git a/src/shell-util.c b/src/shell-util.c
|
||||
index 70b8c0611..c43bf4cc5 100644
|
||||
index 31bb18e70..c6e5abed6 100644
|
||||
--- a/src/shell-util.c
|
||||
+++ b/src/shell-util.c
|
||||
@@ -372,63 +372,60 @@ shell_util_cursor_tracker_to_clutter (MetaCursorTracker *tracker,
|
||||
clutter_actor_show (CLUTTER_ACTOR (texture));
|
||||
clutter_texture_set_cogl_texture (texture, sprite);
|
||||
}
|
||||
else
|
||||
{
|
||||
clutter_actor_hide (CLUTTER_ACTOR (texture));
|
||||
}
|
||||
}
|
||||
|
||||
typedef const gchar *(*ShellGLGetString) (GLenum);
|
||||
|
||||
static const gchar *
|
||||
get_gl_vendor (void)
|
||||
{
|
||||
static const gchar *vendor = NULL;
|
||||
|
||||
if (!vendor)
|
||||
{
|
||||
ShellGLGetString gl_get_string;
|
||||
gl_get_string = (ShellGLGetString) cogl_get_proc_address ("glGetString");
|
||||
if (gl_get_string)
|
||||
vendor = gl_get_string (GL_VENDOR);
|
||||
}
|
||||
|
||||
return vendor;
|
||||
}
|
||||
|
||||
@@ -395,9 +395,6 @@ get_gl_vendor (void)
|
||||
gboolean
|
||||
shell_util_need_background_refresh (void)
|
||||
{
|
||||
@ -51,33 +24,6 @@ index 70b8c0611..c43bf4cc5 100644
|
||||
if (g_strcmp0 (get_gl_vendor (), "NVIDIA Corporation") == 0)
|
||||
return TRUE;
|
||||
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
static gboolean
|
||||
canvas_draw_cb (ClutterContent *content,
|
||||
cairo_t *cr,
|
||||
gint width,
|
||||
gint height,
|
||||
gpointer user_data)
|
||||
{
|
||||
cairo_surface_t *surface = user_data;
|
||||
|
||||
cairo_set_source_surface (cr, surface, 0, 0);
|
||||
cairo_paint (cr);
|
||||
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
/**
|
||||
* shell_util_get_content_for_window_actor:
|
||||
* @window_actor: a #MetaWindowActor
|
||||
* @window_rect: a #MetaRectangle
|
||||
*
|
||||
* Returns: (transfer full): a new #ClutterContent
|
||||
*/
|
||||
ClutterContent *
|
||||
shell_util_get_content_for_window_actor (MetaWindowActor *window_actor,
|
||||
--
|
||||
2.18.1
|
||||
2.21.0
|
||||
|
||||
|
@ -1,4 +1,4 @@
|
||||
From 23a06b9b965f6de4d58d3addf2a73dd7b6c15e29 Mon Sep 17 00:00:00 2001
|
||||
From 1dcae7bbba222a1c8bdfc2d76a9f716e638b0334 Mon Sep 17 00:00:00 2001
|
||||
From: Ray Strode <rstrode@redhat.com>
|
||||
Date: Thu, 8 Jun 2017 12:04:31 -0400
|
||||
Subject: [PATCH] data: install process-working.svg to filesystem
|
||||
@ -21,17 +21,17 @@ index 22bae3dd2..d5acb8d10 100644
|
||||
+
|
||||
+install_data('process-working.svg', install_dir: themedir)
|
||||
diff --git a/meson.build b/meson.build
|
||||
index 663a4d06f..353eff05a 100644
|
||||
index 21a80bcc8..0acaba705 100644
|
||||
--- a/meson.build
|
||||
+++ b/meson.build
|
||||
@@ -56,6 +56,7 @@ mozplugindir = join_paths(libdir, 'mozilla', 'plugins')
|
||||
@@ -57,6 +57,7 @@ localedir = join_paths(datadir, 'locale')
|
||||
portaldir = join_paths(datadir, 'xdg-desktop-portal', 'portals')
|
||||
schemadir = join_paths(datadir, 'glib-2.0', 'schemas')
|
||||
servicedir = join_paths(datadir, 'dbus-1', 'services')
|
||||
+themedir = join_paths(pkgdatadir, 'theme')
|
||||
|
||||
plugindir = get_variable('BROWSER_PLUGIN_DIR', mozplugindir)
|
||||
|
||||
# XXX: Once https://github.com/systemd/systemd/issues/9595 is fixed and we can
|
||||
# depend on this version, replace with something like:
|
||||
--
|
||||
2.20.1
|
||||
2.21.0
|
||||
|
||||
|
@ -1,25 +1,28 @@
|
||||
From 45730de08bf34ac5e3e55eeac843bf640af031bb Mon Sep 17 00:00:00 2001
|
||||
From d1a20dc80c3414ba4cb7bf839a25de49d30ab400 Mon Sep 17 00:00:00 2001
|
||||
From: =?UTF-8?q?Florian=20M=C3=BCllner?= <fmuellner@gnome.org>
|
||||
Date: Mon, 21 Sep 2015 20:18:12 +0200
|
||||
Subject: [PATCH] extensionSystem: Notify about extension issues on update
|
||||
|
||||
---
|
||||
js/ui/extensionSystem.js | 32 ++++++++++++++++++++++++++++++++
|
||||
1 file changed, 32 insertions(+)
|
||||
js/ui/extensionSystem.js | 34 +++++++++++++++++++++++++++++++++-
|
||||
1 file changed, 33 insertions(+), 1 deletion(-)
|
||||
|
||||
diff --git a/js/ui/extensionSystem.js b/js/ui/extensionSystem.js
|
||||
index a013a3ee7..9b6fcb60b 100644
|
||||
index 9ffdb4f3d..eb820ba4f 100644
|
||||
--- a/js/ui/extensionSystem.js
|
||||
+++ b/js/ui/extensionSystem.js
|
||||
@@ -7,6 +7,7 @@ const GLib = imports.gi.GLib;
|
||||
const Gio = imports.gi.Gio;
|
||||
const St = imports.gi.St;
|
||||
@@ -1,8 +1,9 @@
|
||||
// -*- mode: js; js-indent-level: 4; indent-tabs-mode: nil -*-
|
||||
|
||||
-const { Gio, St } = imports.gi;
|
||||
+const { Gio, GLib, St } = imports.gi;
|
||||
const Signals = imports.signals;
|
||||
|
||||
+const Config = imports.misc.config;
|
||||
const ExtensionUtils = imports.misc.extensionUtils;
|
||||
const Main = imports.ui.main;
|
||||
|
||||
@@ -306,6 +307,36 @@ function _onVersionValidationChanged() {
|
||||
@@ -312,6 +313,36 @@ function _onVersionValidationChanged() {
|
||||
}
|
||||
}
|
||||
|
||||
@ -56,7 +59,7 @@ index a013a3ee7..9b6fcb60b 100644
|
||||
function _loadExtensions() {
|
||||
global.settings.connect('changed::' + ENABLED_EXTENSIONS_KEY, onEnabledExtensionsChanged);
|
||||
global.settings.connect('changed::' + DISABLE_USER_EXTENSIONS_KEY, onEnabledExtensionsChanged);
|
||||
@@ -320,6 +351,7 @@ function _loadExtensions() {
|
||||
@@ -326,6 +357,7 @@ function _loadExtensions() {
|
||||
extension.type = ExtensionUtils.ExtensionType.SESSION_MODE;
|
||||
});
|
||||
finder.scanExtensions();
|
||||
@ -65,5 +68,5 @@ index a013a3ee7..9b6fcb60b 100644
|
||||
|
||||
function enableAllExtensions() {
|
||||
--
|
||||
2.20.1
|
||||
2.21.0
|
||||
|
||||
|
@ -1,4 +1,4 @@
|
||||
From 55bd98676e92f181c85813b1d16e92a9769c901f Mon Sep 17 00:00:00 2001
|
||||
From 720eb83ba0b0e5e37185d7e7ed86fe9175cf18f4 Mon Sep 17 00:00:00 2001
|
||||
From: Rui Matos <tiagomatos@gmail.com>
|
||||
Date: Fri, 8 Nov 2013 13:58:09 +0100
|
||||
Subject: [PATCH] extensions: Add a SESSION_MODE extension type
|
||||
@ -11,7 +11,7 @@ different way since they can't be disabled.
|
||||
2 files changed, 4 insertions(+), 1 deletion(-)
|
||||
|
||||
diff --git a/js/misc/extensionUtils.js b/js/misc/extensionUtils.js
|
||||
index 9f77b4c40..1e25da335 100644
|
||||
index cf308b31f..fb1e2b506 100644
|
||||
--- a/js/misc/extensionUtils.js
|
||||
+++ b/js/misc/extensionUtils.js
|
||||
@@ -13,7 +13,8 @@ const FileUtils = imports.misc.fileUtils;
|
||||
@ -25,10 +25,10 @@ index 9f77b4c40..1e25da335 100644
|
||||
|
||||
// Maps uuid -> metadata object
|
||||
diff --git a/js/ui/extensionSystem.js b/js/ui/extensionSystem.js
|
||||
index e35c01ab8..a013a3ee7 100644
|
||||
index 6244c39b4..9ffdb4f3d 100644
|
||||
--- a/js/ui/extensionSystem.js
|
||||
+++ b/js/ui/extensionSystem.js
|
||||
@@ -316,6 +316,8 @@ function _loadExtensions() {
|
||||
@@ -322,6 +322,8 @@ function _loadExtensions() {
|
||||
let finder = new ExtensionUtils.ExtensionFinder();
|
||||
finder.connect('extension-found', (finder, extension) => {
|
||||
loadExtension(extension);
|
||||
@ -38,5 +38,5 @@ index e35c01ab8..a013a3ee7 100644
|
||||
finder.scanExtensions();
|
||||
}
|
||||
--
|
||||
2.20.1
|
||||
2.21.0
|
||||
|
||||
|
@ -1,4 +1,4 @@
|
||||
From e2e03a9e78b63712fd2c322d4f1aaab6ba1fdc7f Mon Sep 17 00:00:00 2001
|
||||
From 592bf9b4ba879a365375a7edcb6c48258386e413 Mon Sep 17 00:00:00 2001
|
||||
From: Ray Strode <rstrode@redhat.com>
|
||||
Date: Tue, 18 Jul 2017 12:58:14 -0400
|
||||
Subject: [PATCH 1/2] gdm: add AuthList control
|
||||
@ -221,7 +221,7 @@ index 000000000..fc1c3d6e4
|
||||
+});
|
||||
+Signals.addSignalMethods(AuthList.prototype);
|
||||
diff --git a/js/js-resources.gresource.xml b/js/js-resources.gresource.xml
|
||||
index 883b62d66..58035d303 100644
|
||||
index 836d1c674..002b202f8 100644
|
||||
--- a/js/js-resources.gresource.xml
|
||||
+++ b/js/js-resources.gresource.xml
|
||||
@@ -1,6 +1,7 @@
|
||||
@ -233,5 +233,5 @@ index 883b62d66..58035d303 100644
|
||||
<file>gdm/batch.js</file>
|
||||
<file>gdm/fingerprint.js</file>
|
||||
--
|
||||
2.20.1
|
||||
2.21.0
|
||||
|
||||
|
@ -1,115 +0,0 @@
|
||||
From 1a614826eea7ba5da2796e0eb3b62a6bb7609040 Mon Sep 17 00:00:00 2001
|
||||
From: =?UTF-8?q?Florian=20M=C3=BCllner?= <fmuellner@gnome.org>
|
||||
Date: Wed, 11 Oct 2017 00:36:18 +0200
|
||||
Subject: [PATCH] global: Allow overriding the override schema
|
||||
|
||||
---
|
||||
src/main.c | 11 ++++++++++-
|
||||
src/shell-global.c | 20 +++++++++++++++++++-
|
||||
2 files changed, 29 insertions(+), 2 deletions(-)
|
||||
|
||||
diff --git a/src/main.c b/src/main.c
|
||||
index 857877b0b..6ebea4809 100644
|
||||
--- a/src/main.c
|
||||
+++ b/src/main.c
|
||||
@@ -38,6 +38,7 @@ extern GType gnome_shell_plugin_get_type (void);
|
||||
|
||||
static gboolean is_gdm_mode = FALSE;
|
||||
static char *session_mode = NULL;
|
||||
+static char *override_schema = NULL;
|
||||
static int caught_signal = 0;
|
||||
|
||||
#define DBUS_REQUEST_NAME_REPLY_PRIMARY_OWNER 1
|
||||
@@ -450,6 +451,12 @@ GOptionEntry gnome_shell_options[] = {
|
||||
N_("List possible modes"),
|
||||
NULL
|
||||
},
|
||||
+ {
|
||||
+ "override-schema", 0, 0, G_OPTION_ARG_STRING,
|
||||
+ &override_schema,
|
||||
+ N_("Override the override schema"),
|
||||
+ "SCHEMA"
|
||||
+ },
|
||||
{ NULL }
|
||||
};
|
||||
|
||||
@@ -507,7 +514,9 @@ main (int argc, char **argv)
|
||||
if (session_mode == NULL)
|
||||
session_mode = is_gdm_mode ? (char *)"gdm" : (char *)"user";
|
||||
|
||||
- _shell_global_init ("session-mode", session_mode, NULL);
|
||||
+ _shell_global_init ("session-mode", session_mode,
|
||||
+ "override-schema", override_schema,
|
||||
+ NULL);
|
||||
|
||||
shell_prefs_init ();
|
||||
|
||||
diff --git a/src/shell-global.c b/src/shell-global.c
|
||||
index c67ac4e4a..961fd3a70 100644
|
||||
--- a/src/shell-global.c
|
||||
+++ b/src/shell-global.c
|
||||
@@ -65,6 +65,7 @@ struct _ShellGlobal {
|
||||
MetaScreen *meta_screen;
|
||||
|
||||
char *session_mode;
|
||||
+ char *override_schema;
|
||||
|
||||
XserverRegion input_region;
|
||||
|
||||
@@ -96,6 +97,7 @@ enum {
|
||||
PROP_0,
|
||||
|
||||
PROP_SESSION_MODE,
|
||||
+ PROP_OVERRIDE_SCHEMA,
|
||||
PROP_SCREEN,
|
||||
PROP_DISPLAY,
|
||||
PROP_SCREEN_WIDTH,
|
||||
@@ -138,6 +140,10 @@ shell_global_set_property(GObject *object,
|
||||
g_clear_pointer (&global->session_mode, g_free);
|
||||
global->session_mode = g_ascii_strdown (g_value_get_string (value), -1);
|
||||
break;
|
||||
+ case PROP_OVERRIDE_SCHEMA:
|
||||
+ g_clear_pointer (&global->override_schema, g_free);
|
||||
+ global->override_schema = g_value_dup_string (value);
|
||||
+ break;
|
||||
case PROP_FRAME_TIMESTAMPS:
|
||||
global->frame_timestamps = g_value_get_boolean (value);
|
||||
break;
|
||||
@@ -163,6 +169,9 @@ shell_global_get_property(GObject *object,
|
||||
case PROP_SESSION_MODE:
|
||||
g_value_set_string (value, shell_global_get_session_mode (global));
|
||||
break;
|
||||
+ case PROP_OVERRIDE_SCHEMA:
|
||||
+ g_value_set_string (value, global->override_schema);
|
||||
+ break;
|
||||
case PROP_SCREEN:
|
||||
g_value_set_object (value, global->meta_screen);
|
||||
break;
|
||||
@@ -368,6 +377,13 @@ shell_global_class_init (ShellGlobalClass *klass)
|
||||
g_param_spec_string ("session-mode",
|
||||
"Session Mode",
|
||||
"The session mode to use",
|
||||
+ NULL,
|
||||
+ G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY));
|
||||
+ g_object_class_install_property (gobject_class,
|
||||
+ PROP_OVERRIDE_SCHEMA,
|
||||
+ g_param_spec_string ("override-schema",
|
||||
+ "Override Schema",
|
||||
+ "The override schema to use",
|
||||
"user",
|
||||
G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY));
|
||||
g_object_class_install_property (gobject_class,
|
||||
@@ -1360,7 +1376,9 @@ shell_global_get_overrides_settings (ShellGlobal *global)
|
||||
|
||||
if (!settings)
|
||||
{
|
||||
- if (strcmp (global->session_mode, "classic") == 0)
|
||||
+ if (global->override_schema != NULL)
|
||||
+ schema = global->override_schema;
|
||||
+ else if (strcmp (global->session_mode, "classic") == 0)
|
||||
schema = "org.gnome.shell.extensions.classic-overrides";
|
||||
else if (strcmp (global->session_mode, "user") == 0)
|
||||
schema = "org.gnome.shell.overrides";
|
||||
--
|
||||
2.20.1
|
||||
|
@ -1,65 +0,0 @@
|
||||
From d9f64462b40125d5b1728c6d276811d6c4bbfb80 Mon Sep 17 00:00:00 2001
|
||||
From: Carlos Garnacho <carlosg@gnome.org>
|
||||
Date: Tue, 23 Oct 2018 00:06:36 +0200
|
||||
Subject: [PATCH] keyboardManager: Avoid idempotent calls to
|
||||
meta_backend_set_keymap()
|
||||
|
||||
But still try to apply the keymap whenever the input sources changed. This
|
||||
is a different approach to gnome-shell#240 that still avoid redundant
|
||||
changes to the current keymap, but actually trigger one when input sources
|
||||
are added.
|
||||
|
||||
https://bugzilla.redhat.com/show_bug.cgi?id=1637418
|
||||
|
||||
Closes: https://gitlab.gnome.org/GNOME/gnome-shell/issues/691
|
||||
---
|
||||
js/misc/keyboardManager.js | 14 +++++++++-----
|
||||
1 file changed, 9 insertions(+), 5 deletions(-)
|
||||
|
||||
diff --git a/js/misc/keyboardManager.js b/js/misc/keyboardManager.js
|
||||
index ae59f0014..f4001f130 100644
|
||||
--- a/js/misc/keyboardManager.js
|
||||
+++ b/js/misc/keyboardManager.js
|
||||
@@ -52,11 +52,20 @@ var KeyboardManager = new Lang.Class({
|
||||
this._current = null;
|
||||
this._localeLayoutInfo = this._getLocaleLayout();
|
||||
this._layoutInfos = {};
|
||||
+ this._currentKeymap = null;
|
||||
},
|
||||
|
||||
_applyLayoutGroup(group) {
|
||||
let options = this._buildOptionsString();
|
||||
let [layouts, variants] = this._buildGroupStrings(group);
|
||||
+
|
||||
+ if (this._currentKeymap &&
|
||||
+ this._currentKeymap.layouts == layouts &&
|
||||
+ this._currentKeymap.variants == variants &&
|
||||
+ this._currentKeymap.options == options)
|
||||
+ return;
|
||||
+
|
||||
+ this._currentKeymap = {layouts, variants, options};
|
||||
Meta.get_backend().set_keymap(layouts, variants, options);
|
||||
},
|
||||
|
||||
@@ -89,8 +98,6 @@ var KeyboardManager = new Lang.Class({
|
||||
},
|
||||
|
||||
setUserLayouts(ids) {
|
||||
- let currentId = this._current ? this._current.id : null;
|
||||
- let currentGroupIndex = this._current ? this._current.groupIndex : null;
|
||||
this._current = null;
|
||||
this._layoutInfos = {};
|
||||
|
||||
@@ -117,9 +124,6 @@ var KeyboardManager = new Lang.Class({
|
||||
info.group = group;
|
||||
info.groupIndex = groupIndex;
|
||||
|
||||
- if (currentId == id && currentGroupIndex == groupIndex)
|
||||
- this._current = info;
|
||||
-
|
||||
i += 1;
|
||||
}
|
||||
},
|
||||
--
|
||||
2.20.1
|
||||
|
56
SOURCES/0001-layout-Make-the-hot-corner-optional.patch
Normal file
56
SOURCES/0001-layout-Make-the-hot-corner-optional.patch
Normal file
@ -0,0 +1,56 @@
|
||||
From 35cbad572120125d3b823f37d2100b2beee4c1d8 Mon Sep 17 00:00:00 2001
|
||||
From: =?UTF-8?q?Florian=20M=C3=BCllner?= <fmuellner@gnome.org>
|
||||
Date: Thu, 8 Jun 2017 17:07:56 +0200
|
||||
Subject: [PATCH] layout: Make the hot corner optional
|
||||
|
||||
Whether people love or hate the hot corner depends in large extents
|
||||
on hardware sensitivity and habits, which is hard to get right
|
||||
universally. So bite the bullet and support an option to enable or
|
||||
disable hot corners ...
|
||||
|
||||
https://bugzilla.gnome.org/show_bug.cgi?id=688320
|
||||
---
|
||||
js/ui/layout.js | 14 +++++++++++++-
|
||||
1 file changed, 13 insertions(+), 1 deletion(-)
|
||||
|
||||
diff --git a/js/ui/layout.js b/js/ui/layout.js
|
||||
index 2b3bb7442..beb4c0a5d 100644
|
||||
--- a/js/ui/layout.js
|
||||
+++ b/js/ui/layout.js
|
||||
@@ -1,6 +1,6 @@
|
||||
// -*- mode: js; js-indent-level: 4; indent-tabs-mode: nil -*-
|
||||
|
||||
-const { Clutter, GLib, GObject, Meta, Shell, St } = imports.gi;
|
||||
+const { Clutter, Gio, GLib, GObject, Meta, Shell, St } = imports.gi;
|
||||
const Signals = imports.signals;
|
||||
|
||||
const Background = imports.ui.background;
|
||||
@@ -267,6 +267,13 @@ var LayoutManager = GObject.registerClass({
|
||||
this._backgroundGroup.lower_bottom();
|
||||
this._bgManagers = [];
|
||||
|
||||
+ this._interfaceSettings = new Gio.Settings({
|
||||
+ schema_id: 'org.gnome.desktop.interface'
|
||||
+ });
|
||||
+
|
||||
+ this._interfaceSettings.connect('changed::enable-hot-corners',
|
||||
+ this._updateHotCorners.bind(this));
|
||||
+
|
||||
// Need to update struts on new workspaces when they are added
|
||||
let workspaceManager = global.workspace_manager;
|
||||
workspaceManager.connect('notify::n-workspaces',
|
||||
@@ -358,6 +365,11 @@ var LayoutManager = GObject.registerClass({
|
||||
});
|
||||
this.hotCorners = [];
|
||||
|
||||
+ if (!this._interfaceSettings.get_boolean('enable-hot-corners')) {
|
||||
+ this.emit('hot-corners-changed');
|
||||
+ return;
|
||||
+ }
|
||||
+
|
||||
let size = this.panelBox.height;
|
||||
|
||||
// build new hot corners
|
||||
--
|
||||
2.21.0
|
||||
|
@ -1,4 +1,4 @@
|
||||
From 297959c1a7bcf5e0b24c5215cfc94042da490d4f Mon Sep 17 00:00:00 2001
|
||||
From 9cfa56d4f3c5fe513630c58c09bd2421f3ca580b Mon Sep 17 00:00:00 2001
|
||||
From: Ray Strode <rstrode@redhat.com>
|
||||
Date: Mon, 26 Jun 2017 14:35:05 -0400
|
||||
Subject: [PATCH] loginDialog: make info messages themed
|
||||
@ -10,10 +10,10 @@ show up invisible.
|
||||
1 file changed, 6 insertions(+), 1 deletion(-)
|
||||
|
||||
diff --git a/data/theme/gnome-shell-sass/_common.scss b/data/theme/gnome-shell-sass/_common.scss
|
||||
index 4e82ef58b..ee643c440 100644
|
||||
index c2df28279..a382ce561 100644
|
||||
--- a/data/theme/gnome-shell-sass/_common.scss
|
||||
+++ b/data/theme/gnome-shell-sass/_common.scss
|
||||
@@ -1769,7 +1769,12 @@ StScrollBar {
|
||||
@@ -1801,7 +1801,12 @@ StScrollBar {
|
||||
.login-dialog-banner { color: darken($osd_fg_color,10%); }
|
||||
.login-dialog-button-box { spacing: 5px; }
|
||||
.login-dialog-message-warning { color: $warning_color; }
|
||||
@ -28,5 +28,5 @@ index 4e82ef58b..ee643c440 100644
|
||||
.login-dialog-not-listed-label {
|
||||
padding-left: 2px;
|
||||
--
|
||||
2.20.1
|
||||
2.21.0
|
||||
|
||||
|
@ -1,58 +0,0 @@
|
||||
From 952ad185cc54eea2e9915b8d93dded1ac0ddf8ac Mon Sep 17 00:00:00 2001
|
||||
From: =?UTF-8?q?Florian=20M=C3=BCllner?= <fmuellner@gnome.org>
|
||||
Date: Sun, 23 Sep 2018 03:06:21 +0200
|
||||
Subject: [PATCH] osdWindow: Disconnect signals on destroy
|
||||
|
||||
Since we started to show OSD windows on all monitors, OSD windows are
|
||||
destroyed when the corresponding monitor is disconnected. We shouldn't
|
||||
leave any signal handlers around in that case - they prevent the object
|
||||
from being garbage collected, and trigger warnings for accessing proper-
|
||||
ties of invalidated GObjects.
|
||||
|
||||
https://gitlab.gnome.org/GNOME/gnome-shell/issues/602
|
||||
---
|
||||
js/ui/osdWindow.js | 23 +++++++++++++++++++----
|
||||
1 file changed, 19 insertions(+), 4 deletions(-)
|
||||
|
||||
diff --git a/js/ui/osdWindow.js b/js/ui/osdWindow.js
|
||||
index a73912413..97e0498a7 100644
|
||||
--- a/js/ui/osdWindow.js
|
||||
+++ b/js/ui/osdWindow.js
|
||||
@@ -108,15 +108,30 @@ var OsdWindow = new Lang.Class({
|
||||
this._hideTimeoutId = 0;
|
||||
this._reset();
|
||||
|
||||
- Main.layoutManager.connect('monitors-changed',
|
||||
- this._relayout.bind(this));
|
||||
+ this.actor.connect('destroy', this._onDestroy.bind(this));
|
||||
+
|
||||
+ this._monitorsChangedId =
|
||||
+ Main.layoutManager.connect('monitors-changed',
|
||||
+ this._relayout.bind(this));
|
||||
let themeContext = St.ThemeContext.get_for_stage(global.stage);
|
||||
- themeContext.connect('notify::scale-factor',
|
||||
- this._relayout.bind(this));
|
||||
+ this._scaleChangedId =
|
||||
+ themeContext.connect('notify::scale-factor',
|
||||
+ this._relayout.bind(this));
|
||||
this._relayout();
|
||||
Main.uiGroup.add_child(this.actor);
|
||||
},
|
||||
|
||||
+ _onDestroy() {
|
||||
+ if (this._monitorsChangedId)
|
||||
+ Main.layoutManager.disconnect(this._monitorsChangedId);
|
||||
+ this._monitorsChangedId = 0;
|
||||
+
|
||||
+ let themeContext = St.ThemeContext.get_for_stage(global.stage);
|
||||
+ if (this._scaleChangedId)
|
||||
+ themeContext.disconnect(this._scaleChangedId);
|
||||
+ this._scaleChangedId = 0;
|
||||
+ },
|
||||
+
|
||||
setIcon(icon) {
|
||||
this._icon.gicon = icon;
|
||||
},
|
||||
--
|
||||
2.20.1
|
||||
|
@ -1,4 +1,4 @@
|
||||
From 2fbce93b61f2a59871910c46f1e99ef28146a6db Mon Sep 17 00:00:00 2001
|
||||
From aadb0e19999c339ac1d6501a2e52b363e57e26ef Mon Sep 17 00:00:00 2001
|
||||
From: Ray Strode <rstrode@redhat.com>
|
||||
Date: Wed, 15 Jan 2014 16:45:34 -0500
|
||||
Subject: [PATCH] panel: add an icon to the ActivitiesButton
|
||||
@ -10,10 +10,10 @@ Requested by brand
|
||||
2 files changed, 13 insertions(+), 1 deletion(-)
|
||||
|
||||
diff --git a/data/theme/gnome-shell-sass/_common.scss b/data/theme/gnome-shell-sass/_common.scss
|
||||
index ee643c440..f1aaea689 100644
|
||||
index a382ce561..3b0d2bf04 100644
|
||||
--- a/data/theme/gnome-shell-sass/_common.scss
|
||||
+++ b/data/theme/gnome-shell-sass/_common.scss
|
||||
@@ -776,6 +776,11 @@ StScrollBar {
|
||||
@@ -769,6 +769,11 @@ StScrollBar {
|
||||
//dimensions of the icon are hardcoded
|
||||
}
|
||||
|
||||
@ -22,14 +22,14 @@ index ee643c440..f1aaea689 100644
|
||||
+ icon-size: 1em;
|
||||
+ }
|
||||
+
|
||||
.system-status-icon,
|
||||
.app-menu-icon > StIcon,
|
||||
.popup-menu-arrow {
|
||||
&:hover {
|
||||
color: lighten($fg_color, 10%);
|
||||
}
|
||||
diff --git a/js/ui/panel.js b/js/ui/panel.js
|
||||
index 2f593247d..d1a572503 100644
|
||||
index 16484850a..ede1c2b82 100644
|
||||
--- a/js/ui/panel.js
|
||||
+++ b/js/ui/panel.js
|
||||
@@ -406,11 +406,18 @@ var ActivitiesButton = new Lang.Class({
|
||||
@@ -465,11 +465,18 @@ class ActivitiesButton extends PanelMenu.Button {
|
||||
|
||||
this.actor.name = 'panelActivities';
|
||||
|
||||
@ -50,5 +50,5 @@ index 2f593247d..d1a572503 100644
|
||||
this.actor.label_actor = this._label;
|
||||
|
||||
--
|
||||
2.20.1
|
||||
2.21.0
|
||||
|
||||
|
@ -1,4 +1,4 @@
|
||||
From 7d34369b7a011a3a0377f19d342e1663a04d6027 Mon Sep 17 00:00:00 2001
|
||||
From cacce594f07295bb1b9e0685913a287e3cea2453 Mon Sep 17 00:00:00 2001
|
||||
From: Ray Strode <rstrode@redhat.com>
|
||||
Date: Fri, 3 Jul 2015 13:54:36 -0400
|
||||
Subject: [PATCH] screenShield: unblank when inserting smartcard
|
||||
@ -13,10 +13,10 @@ action to get the screen to unblank.
|
||||
1 file changed, 3 insertions(+), 1 deletion(-)
|
||||
|
||||
diff --git a/js/ui/screenShield.js b/js/ui/screenShield.js
|
||||
index 2d8d9b3f6..ebba6c82a 100644
|
||||
index a005a206b..cd38f11fc 100644
|
||||
--- a/js/ui/screenShield.js
|
||||
+++ b/js/ui/screenShield.js
|
||||
@@ -515,8 +515,10 @@ var ScreenShield = new Lang.Class({
|
||||
@@ -513,8 +513,10 @@ var ScreenShield = class {
|
||||
this._smartcardManager = SmartcardManager.getSmartcardManager();
|
||||
this._smartcardManager.connect('smartcard-inserted',
|
||||
(manager, token) => {
|
||||
@ -29,5 +29,5 @@ index 2d8d9b3f6..ebba6c82a 100644
|
||||
|
||||
this._oVirtCredentialsManager = OVirt.getOVirtCredentialsManager();
|
||||
--
|
||||
2.20.1
|
||||
2.21.0
|
||||
|
||||
|
@ -1,4 +1,4 @@
|
||||
From f6023e2f4ae939a03bb9285e32444be909340bcf Mon Sep 17 00:00:00 2001
|
||||
From 660ebe0125b591355116934ee57b08010e05246c Mon Sep 17 00:00:00 2001
|
||||
From: Rui Matos <tiagomatos@gmail.com>
|
||||
Date: Fri, 8 Nov 2013 11:36:04 +0100
|
||||
Subject: [PATCH] shellDBus: Add a DBus method to load a single extension
|
||||
@ -6,27 +6,41 @@ Subject: [PATCH] shellDBus: Add a DBus method to load a single extension
|
||||
This allows e.g. gnome-tweak-tool to install an extension from a zip
|
||||
file and load it into the running shell.
|
||||
---
|
||||
js/ui/shellDBus.js | 20 ++++++++++++++++++++
|
||||
1 file changed, 20 insertions(+)
|
||||
.../org.gnome.Shell.Extensions.xml | 13 +++++++++++++
|
||||
js/ui/shellDBus.js | 16 ++++++++++++++++
|
||||
2 files changed, 29 insertions(+)
|
||||
|
||||
diff --git a/data/dbus-interfaces/org.gnome.Shell.Extensions.xml b/data/dbus-interfaces/org.gnome.Shell.Extensions.xml
|
||||
index 34a65af44..ce69439fc 100644
|
||||
--- a/data/dbus-interfaces/org.gnome.Shell.Extensions.xml
|
||||
+++ b/data/dbus-interfaces/org.gnome.Shell.Extensions.xml
|
||||
@@ -189,6 +189,19 @@
|
||||
-->
|
||||
<method name="CheckForUpdates"/>
|
||||
|
||||
+ <!--
|
||||
+ LoadUserExtension:
|
||||
+ @uuid: The UUID of the extension
|
||||
+ @success: Whether the operation was successful
|
||||
+
|
||||
+ Load a newly installed user extension
|
||||
+ -->
|
||||
+
|
||||
+ <method name="LoadUserExtension">
|
||||
+ <arg type="s" direction="in" name="uuid"/>
|
||||
+ <arg type="b" direction="out" name="success"/>
|
||||
+ </method>
|
||||
+
|
||||
<signal name="ExtensionStatusChanged">
|
||||
<arg type="s" name="uuid"/>
|
||||
<arg type="i" name="state"/>
|
||||
diff --git a/js/ui/shellDBus.js b/js/ui/shellDBus.js
|
||||
index c35e7f19c..3a095ae5c 100644
|
||||
index 19d07acce..112d60feb 100644
|
||||
--- a/js/ui/shellDBus.js
|
||||
+++ b/js/ui/shellDBus.js
|
||||
@@ -322,6 +322,10 @@ const GnomeShellExtensionsIface = '<node> \
|
||||
</method> \
|
||||
<method name="CheckForUpdates"> \
|
||||
</method> \
|
||||
+<method name="LoadUserExtension"> \
|
||||
+ <arg type="s" direction="in" name="uuid"/> \
|
||||
+ <arg type="b" direction="out" name="success"/> \
|
||||
+</method> \
|
||||
<property name="ShellVersion" type="s" access="read" /> \
|
||||
</interface> \
|
||||
</node>';
|
||||
@@ -424,6 +428,22 @@ var GnomeShellExtensions = new Lang.Class({
|
||||
@@ -341,6 +341,22 @@ var GnomeShellExtensions = class {
|
||||
ExtensionDownloader.checkForUpdates();
|
||||
},
|
||||
}
|
||||
|
||||
+ LoadUserExtension(uuid) {
|
||||
+ let extension = ExtensionUtils.extensions[uuid];
|
||||
@ -42,11 +56,11 @@ index c35e7f19c..3a095ae5c 100644
|
||||
+ return false;
|
||||
+ }
|
||||
+ return true;
|
||||
+ },
|
||||
+ }
|
||||
+
|
||||
ShellVersion: Config.PACKAGE_VERSION,
|
||||
|
||||
_extensionStateChanged(_, newState) {
|
||||
get ShellVersion() {
|
||||
return Config.PACKAGE_VERSION;
|
||||
}
|
||||
--
|
||||
2.20.1
|
||||
2.21.0
|
||||
|
||||
|
@ -1,4 +1,4 @@
|
||||
From fc6c039871827fb7ec26362b39b515f438122af5 Mon Sep 17 00:00:00 2001
|
||||
From 20640a92f98e2145b9b6581209c978e9f6f78801 Mon Sep 17 00:00:00 2001
|
||||
From: =?UTF-8?q?Florian=20M=C3=BCllner?= <fmuellner@gnome.org>
|
||||
Date: Tue, 14 Mar 2017 17:04:36 +0100
|
||||
Subject: [PATCH] windowMenu: Bring back workspaces submenu for static
|
||||
@ -9,24 +9,25 @@ moving to a specific workspace was intentionally left out; some people
|
||||
are quite attached to it though, so bring it back when static workspaces
|
||||
are used.
|
||||
---
|
||||
js/ui/windowMenu.js | 16 ++++++++++++++++
|
||||
1 file changed, 16 insertions(+)
|
||||
js/ui/windowMenu.js | 17 +++++++++++++++++
|
||||
1 file changed, 17 insertions(+)
|
||||
|
||||
diff --git a/js/ui/windowMenu.js b/js/ui/windowMenu.js
|
||||
index f0e564b7e..8c97a1eec 100644
|
||||
index 628f145ea..f8eb4398c 100644
|
||||
--- a/js/ui/windowMenu.js
|
||||
+++ b/js/ui/windowMenu.js
|
||||
@@ -123,6 +123,22 @@ var WindowMenu = new Lang.Class({
|
||||
@@ -115,6 +115,23 @@ var WindowMenu = class extends PopupMenu.PopupMenu {
|
||||
window.change_workspace(workspace.get_neighbor(dir));
|
||||
});
|
||||
}
|
||||
+
|
||||
+ let nWorkspaces = global.screen.n_workspaces;
|
||||
+ let { workspaceManager } = global;
|
||||
+ let nWorkspaces = workspaceManager.n_workspaces;
|
||||
+ if (nWorkspaces > 1 && !Meta.prefs_get_dynamic_workspaces()) {
|
||||
+ item = new PopupMenu.PopupSubMenuMenuItem(_("Move to another workspace"));
|
||||
+ this.addMenuItem(item);
|
||||
+
|
||||
+ let currentIndex = global.screen.get_active_workspace_index();
|
||||
+ let currentIndex = workspaceManager.get_active_workspace_index();
|
||||
+ for (let i = 0; i < nWorkspaces; i++) {
|
||||
+ let index = i;
|
||||
+ let name = Meta.prefs_get_workspace_name(i);
|
||||
@ -40,5 +41,5 @@ index f0e564b7e..8c97a1eec 100644
|
||||
}
|
||||
|
||||
--
|
||||
2.20.1
|
||||
2.21.0
|
||||
|
||||
|
@ -0,0 +1,37 @@
|
||||
From b69b404118852f7955f60d1814f5e19ad61ce449 Mon Sep 17 00:00:00 2001
|
||||
From: =?UTF-8?q?Florian=20M=C3=BCllner?= <fmuellner@gnome.org>
|
||||
Date: Fri, 12 Jul 2019 03:26:51 +0000
|
||||
Subject: [PATCH] workspacesView: Work around spurious allocation changes
|
||||
|
||||
For some reason, people are still seeing those after commit d5ebd8c8.
|
||||
While this is something we really should figure out, we can work around
|
||||
the issue by keeping the view actors hidden until the update is complete.
|
||||
|
||||
https://gitlab.gnome.org/GNOME/gnome-shell/issues/1065
|
||||
---
|
||||
js/ui/workspacesView.js | 5 +++++
|
||||
1 file changed, 5 insertions(+)
|
||||
|
||||
diff --git a/js/ui/workspacesView.js b/js/ui/workspacesView.js
|
||||
index 069937d5a..e302296a6 100644
|
||||
--- a/js/ui/workspacesView.js
|
||||
+++ b/js/ui/workspacesView.js
|
||||
@@ -666,10 +666,15 @@ var WorkspacesDisplay = class {
|
||||
this._scrollValueChanged.bind(this));
|
||||
}
|
||||
|
||||
+ // HACK: Avoid spurious allocation changes while updating views
|
||||
+ view.actor.hide();
|
||||
+
|
||||
this._workspacesViews.push(view);
|
||||
Main.layoutManager.overviewGroup.add_actor(view.actor);
|
||||
}
|
||||
|
||||
+ this._workspacesViews.forEach(v => v.actor.show());
|
||||
+
|
||||
this._updateWorkspacesFullGeometry();
|
||||
this._updateWorkspacesActualGeometry();
|
||||
}
|
||||
--
|
||||
2.21.0
|
||||
|
@ -1,4 +1,4 @@
|
||||
From 2b3f696c8cde01f23bd16b8671de536ae0e001e4 Mon Sep 17 00:00:00 2001
|
||||
From 1a546d4df199f498b838efdccf081ada8ed1960b Mon Sep 17 00:00:00 2001
|
||||
From: Ray Strode <rstrode@redhat.com>
|
||||
Date: Tue, 15 Jan 2019 12:52:49 -0500
|
||||
Subject: [PATCH 2/4] background: rebuild background, not just animation on
|
||||
@ -14,37 +14,10 @@ so we should just do a full background change.
|
||||
1 file changed, 1 insertion(+), 1 deletion(-)
|
||||
|
||||
diff --git a/js/ui/background.js b/js/ui/background.js
|
||||
index b24f82536..c61d946a4 100644
|
||||
index 06e038816..75b76a57e 100644
|
||||
--- a/js/ui/background.js
|
||||
+++ b/js/ui/background.js
|
||||
@@ -237,61 +237,61 @@ var Background = new Lang.Class({
|
||||
params = Params.parse(params, { monitorIndex: 0,
|
||||
layoutManager: Main.layoutManager,
|
||||
settings: null,
|
||||
file: null,
|
||||
style: null });
|
||||
|
||||
this.background = new Meta.Background({ meta_screen: global.screen });
|
||||
this.background._delegate = this;
|
||||
|
||||
this._settings = params.settings;
|
||||
this._file = params.file;
|
||||
this._style = params.style;
|
||||
this._monitorIndex = params.monitorIndex;
|
||||
this._layoutManager = params.layoutManager;
|
||||
this._fileWatches = {};
|
||||
this._cancellable = new Gio.Cancellable();
|
||||
this.isLoaded = false;
|
||||
|
||||
this._clock = new GnomeDesktop.WallClock();
|
||||
this._timezoneChangedId = this._clock.connect('notify::timezone',
|
||||
() => {
|
||||
if (this._animation)
|
||||
this._loadAnimation(this._animation.file);
|
||||
});
|
||||
|
||||
let loginManager = LoginManager.getLoginManager();
|
||||
this._prepareForSleepId = loginManager.connect('prepare-for-sleep',
|
||||
@@ -254,7 +254,7 @@ var Background = class Background {
|
||||
(lm, aboutToSuspend) => {
|
||||
if (aboutToSuspend)
|
||||
return;
|
||||
@ -53,33 +26,6 @@ index b24f82536..c61d946a4 100644
|
||||
});
|
||||
|
||||
this._settingsChangedSignalId = this._settings.connect('changed', () => {
|
||||
this.emit('changed');
|
||||
});
|
||||
|
||||
this._load();
|
||||
},
|
||||
|
||||
destroy() {
|
||||
this._cancellable.cancel();
|
||||
this._removeAnimationTimeout();
|
||||
|
||||
let i;
|
||||
let keys = Object.keys(this._fileWatches);
|
||||
for (i = 0; i < keys.length; i++) {
|
||||
this._cache.disconnect(this._fileWatches[keys[i]]);
|
||||
}
|
||||
this._fileWatches = null;
|
||||
|
||||
if (this._timezoneChangedId != 0)
|
||||
this._clock.disconnect(this._timezoneChangedId);
|
||||
this._timezoneChangedId = 0;
|
||||
|
||||
this._clock = null;
|
||||
|
||||
if (this._prepareForSleepId != 0)
|
||||
LoginManager.getLoginManager().disconnect(this._prepareForSleepId);
|
||||
this._prepareForSleepId = 0;
|
||||
|
||||
--
|
||||
2.18.1
|
||||
2.21.0
|
||||
|
||||
|
@ -1,4 +1,4 @@
|
||||
From 87e7f4ea023cac3b4573ea0c7012b77c588f35ae Mon Sep 17 00:00:00 2001
|
||||
From c3ab03f8721ea96df6ac91c0393ed13ba750ab7e Mon Sep 17 00:00:00 2001
|
||||
From: Ray Strode <rstrode@redhat.com>
|
||||
Date: Mon, 17 Jul 2017 16:48:03 -0400
|
||||
Subject: [PATCH 2/2] gdmUtil: enable support for GDM's ChoiceList PAM
|
||||
@ -13,18 +13,18 @@ This commit hooks up support for GDM's ChoiceList PAM extension.
|
||||
4 files changed, 114 insertions(+), 2 deletions(-)
|
||||
|
||||
diff --git a/js/gdm/authPrompt.js b/js/gdm/authPrompt.js
|
||||
index e44281117..27a55246a 100644
|
||||
index cf77b3f26..71069e93b 100644
|
||||
--- a/js/gdm/authPrompt.js
|
||||
+++ b/js/gdm/authPrompt.js
|
||||
@@ -9,6 +9,7 @@ const Signals = imports.signals;
|
||||
const St = imports.gi.St;
|
||||
@@ -4,6 +4,7 @@ const { Clutter, GLib, Pango, Shell, St } = imports.gi;
|
||||
const Signals = imports.signals;
|
||||
|
||||
const Animation = imports.ui.animation;
|
||||
+const AuthList = imports.gdm.authList;
|
||||
const Batch = imports.gdm.batch;
|
||||
const GdmUtil = imports.gdm.util;
|
||||
const Meta = imports.gi.Meta;
|
||||
@@ -61,6 +62,7 @@ var AuthPrompt = new Lang.Class({
|
||||
@@ -54,6 +55,7 @@ var AuthPrompt = class {
|
||||
|
||||
this._userVerifier.connect('ask-question', this._onAskQuestion.bind(this));
|
||||
this._userVerifier.connect('show-message', this._onShowMessage.bind(this));
|
||||
@ -32,7 +32,7 @@ index e44281117..27a55246a 100644
|
||||
this._userVerifier.connect('verification-failed', this._onVerificationFailed.bind(this));
|
||||
this._userVerifier.connect('verification-complete', this._onVerificationComplete.bind(this));
|
||||
this._userVerifier.connect('reset', this._onReset.bind(this));
|
||||
@@ -123,6 +125,28 @@ var AuthPrompt = new Lang.Class({
|
||||
@@ -116,6 +118,28 @@ var AuthPrompt = class {
|
||||
|
||||
this.actor.add(this._timedLoginIndicator);
|
||||
|
||||
@ -61,9 +61,9 @@ index e44281117..27a55246a 100644
|
||||
this._message = new St.Label({ opacity: 0,
|
||||
styleClass: 'login-dialog-message' });
|
||||
this._message.clutter_text.line_wrap = true;
|
||||
@@ -266,6 +290,21 @@ var AuthPrompt = new Lang.Class({
|
||||
@@ -258,6 +282,21 @@ var AuthPrompt = class {
|
||||
this.emit('prompted');
|
||||
},
|
||||
}
|
||||
|
||||
+ _onShowChoiceList(userVerifier, serviceName, promptMessage, choiceList) {
|
||||
+ if (this._queryingService)
|
||||
@ -78,21 +78,21 @@ index e44281117..27a55246a 100644
|
||||
+ this.setChoiceList(promptMessage, choiceList);
|
||||
+ this.updateSensitivity(true);
|
||||
+ this.emit('prompted');
|
||||
+ },
|
||||
+ }
|
||||
+
|
||||
_onOVirtUserAuthenticated() {
|
||||
if (this.verificationStatus != AuthPromptStatus.VERIFICATION_SUCCEEDED)
|
||||
this.reset();
|
||||
@@ -394,6 +433,8 @@ var AuthPrompt = new Lang.Class({
|
||||
@@ -386,6 +425,8 @@ var AuthPrompt = class {
|
||||
clear() {
|
||||
this._entry.text = '';
|
||||
this.stopSpinning();
|
||||
+ this._authList.clear();
|
||||
+ this._authList.actor.hide();
|
||||
},
|
||||
}
|
||||
|
||||
setPasswordChar(passwordChar) {
|
||||
@@ -409,12 +450,42 @@ var AuthPrompt = new Lang.Class({
|
||||
@@ -401,12 +442,42 @@ var AuthPrompt = class {
|
||||
|
||||
this._label.set_text(question);
|
||||
|
||||
@ -101,7 +101,7 @@ index e44281117..27a55246a 100644
|
||||
this._entry.show();
|
||||
|
||||
this._entry.grab_key_focus();
|
||||
},
|
||||
}
|
||||
|
||||
+ _fadeInChoiceList() {
|
||||
+ this._authList.actor.opacity = 0;
|
||||
@ -115,7 +115,7 @@ index e44281117..27a55246a 100644
|
||||
+ this._authList.actor.reactive = true;
|
||||
+ }
|
||||
+ });
|
||||
+ },
|
||||
+ }
|
||||
+
|
||||
+ setChoiceList(promptMessage, choiceList) {
|
||||
+ this._authList.clear();
|
||||
@ -130,12 +130,12 @@ index e44281117..27a55246a 100644
|
||||
+ if (this._message.text == "")
|
||||
+ this._message.hide();
|
||||
+ this._fadeInChoiceList();
|
||||
+ },
|
||||
+ }
|
||||
+
|
||||
getAnswer() {
|
||||
let text;
|
||||
|
||||
@@ -450,6 +521,7 @@ var AuthPrompt = new Lang.Class({
|
||||
@@ -442,6 +513,7 @@ var AuthPrompt = class {
|
||||
else
|
||||
this._message.remove_style_class_name('login-dialog-message-hint');
|
||||
|
||||
@ -143,20 +143,20 @@ index e44281117..27a55246a 100644
|
||||
if (message) {
|
||||
Tweener.removeTweens(this._message);
|
||||
this._message.text = message;
|
||||
@@ -465,7 +537,7 @@ var AuthPrompt = new Lang.Class({
|
||||
},
|
||||
@@ -457,7 +529,7 @@ var AuthPrompt = class {
|
||||
}
|
||||
|
||||
updateSensitivity(sensitive) {
|
||||
- this._updateNextButtonSensitivity(sensitive && (this._entry.text.length > 0 || this.verificationStatus == AuthPromptStatus.VERIFYING));
|
||||
+ this._updateNextButtonSensitivity(sensitive && !this._authList.actor.visible && (this._entry.text.length > 0 || this.verificationStatus == AuthPromptStatus.VERIFYING));
|
||||
this._entry.reactive = sensitive;
|
||||
this._entry.clutter_text.editable = sensitive;
|
||||
},
|
||||
}
|
||||
diff --git a/js/gdm/loginDialog.js b/js/gdm/loginDialog.js
|
||||
index 65d9edf1a..912c0e0ca 100644
|
||||
index 9aaa013d8..942f5a0e5 100644
|
||||
--- a/js/gdm/loginDialog.js
|
||||
+++ b/js/gdm/loginDialog.js
|
||||
@@ -418,6 +418,11 @@ var LoginDialog = new Lang.Class({
|
||||
@@ -406,6 +406,11 @@ var LoginDialog = GObject.registerClass({
|
||||
this._userManager = AccountsService.UserManager.get_default()
|
||||
this._gdmClient = new Gdm.Client();
|
||||
|
||||
@ -169,10 +169,10 @@ index 65d9edf1a..912c0e0ca 100644
|
||||
|
||||
this._settings.connect('changed::' + GdmUtil.BANNER_MESSAGE_KEY,
|
||||
diff --git a/js/gdm/util.js b/js/gdm/util.js
|
||||
index f5f9d5e5d..04a0cb9bf 100644
|
||||
index 6e940d2ab..9e249139d 100644
|
||||
--- a/js/gdm/util.js
|
||||
+++ b/js/gdm/util.js
|
||||
@@ -200,6 +200,10 @@ var ShellUserVerifier = new Lang.Class({
|
||||
@@ -192,6 +192,10 @@ var ShellUserVerifier = class {
|
||||
if (this._userVerifier) {
|
||||
this._userVerifier.run_dispose();
|
||||
this._userVerifier = null;
|
||||
@ -181,20 +181,20 @@ index f5f9d5e5d..04a0cb9bf 100644
|
||||
+ this._userVerifierChoiceList = null;
|
||||
+ }
|
||||
}
|
||||
},
|
||||
}
|
||||
|
||||
@@ -227,6 +231,10 @@ var ShellUserVerifier = new Lang.Class({
|
||||
@@ -219,6 +223,10 @@ var ShellUserVerifier = class {
|
||||
this._oVirtCredentialsManager = null;
|
||||
},
|
||||
}
|
||||
|
||||
+ selectChoice(serviceName, key) {
|
||||
+ this._userVerifierChoiceList.call_select_choice(serviceName, key, this._cancellable, null);
|
||||
+ },
|
||||
+ }
|
||||
+
|
||||
answerQuery(serviceName, answer) {
|
||||
if (!this.hasPendingMessages) {
|
||||
this._userVerifier.call_answer_query(serviceName, answer, this._cancellable, null);
|
||||
@@ -367,6 +375,11 @@ var ShellUserVerifier = new Lang.Class({
|
||||
@@ -362,6 +370,11 @@ var ShellUserVerifier = class {
|
||||
return;
|
||||
}
|
||||
|
||||
@ -206,7 +206,7 @@ index f5f9d5e5d..04a0cb9bf 100644
|
||||
this.reauthenticating = true;
|
||||
this._connectSignals();
|
||||
this._beginVerification();
|
||||
@@ -384,6 +397,11 @@ var ShellUserVerifier = new Lang.Class({
|
||||
@@ -379,6 +392,11 @@ var ShellUserVerifier = class {
|
||||
return;
|
||||
}
|
||||
|
||||
@ -218,35 +218,35 @@ index f5f9d5e5d..04a0cb9bf 100644
|
||||
this._connectSignals();
|
||||
this._beginVerification();
|
||||
this._hold.release();
|
||||
@@ -397,6 +415,9 @@ var ShellUserVerifier = new Lang.Class({
|
||||
@@ -392,6 +410,9 @@ var ShellUserVerifier = class {
|
||||
this._userVerifier.connect('conversation-stopped', this._onConversationStopped.bind(this));
|
||||
this._userVerifier.connect('reset', this._onReset.bind(this));
|
||||
this._userVerifier.connect('verification-complete', this._onVerificationComplete.bind(this));
|
||||
+
|
||||
+ if (this._userVerifierChoiceList)
|
||||
+ this._userVerifierChoiceList.connect('choice-query', this._onChoiceListQuery.bind(this));
|
||||
},
|
||||
}
|
||||
|
||||
_getForegroundService() {
|
||||
@@ -473,6 +494,13 @@ var ShellUserVerifier = new Lang.Class({
|
||||
@@ -468,6 +489,13 @@ var ShellUserVerifier = class {
|
||||
this._startService(FINGERPRINT_SERVICE_NAME);
|
||||
},
|
||||
}
|
||||
|
||||
+ _onChoiceListQuery(client, serviceName, promptMessage, list) {
|
||||
+ if (!this.serviceIsForeground(serviceName))
|
||||
+ return;
|
||||
+
|
||||
+ this.emit('show-choice-list', serviceName, promptMessage, list.deep_unpack());
|
||||
+ },
|
||||
+ }
|
||||
+
|
||||
_onInfo(client, serviceName, info) {
|
||||
if (this.serviceIsForeground(serviceName)) {
|
||||
this._queueMessage(info, MessageType.INFO);
|
||||
diff --git a/js/ui/unlockDialog.js b/js/ui/unlockDialog.js
|
||||
index 1adaf417e..b5272be20 100644
|
||||
index 5c9d46021..4b0470f4b 100644
|
||||
--- a/js/ui/unlockDialog.js
|
||||
+++ b/js/ui/unlockDialog.js
|
||||
@@ -51,7 +51,14 @@ var UnlockDialog = new Lang.Class({
|
||||
@@ -33,7 +33,14 @@ var UnlockDialog = class {
|
||||
y_expand: true });
|
||||
this.actor.add_child(this._promptBox);
|
||||
|
||||
@ -263,5 +263,5 @@ index 1adaf417e..b5272be20 100644
|
||||
this._authPrompt.connect('cancelled', this._fail.bind(this));
|
||||
this._authPrompt.connect('reset', this._onReset.bind(this));
|
||||
--
|
||||
2.20.1
|
||||
2.21.0
|
||||
|
||||
|
@ -1,136 +0,0 @@
|
||||
From 13afa15130a50aab36e7a61dea5f6d595cd978a1 Mon Sep 17 00:00:00 2001
|
||||
From: Olivier Fourdan <ofourdan@redhat.com>
|
||||
Date: Wed, 12 Dec 2018 16:02:29 +0100
|
||||
Subject: [PATCH 2/2] introspect: Add GetWindows method
|
||||
|
||||
The `GetWindows` method gives access to the list of windows for each
|
||||
application with some of their properties, so utilities such as dogtail
|
||||
can pick the window of their choice to interfere with using the provided
|
||||
window id.
|
||||
|
||||
https://gitlab.gnome.org/GNOME/gnome-shell/merge_requests/326
|
||||
(cherry picked from commit 0f45b438e2b956d3cf52622db875dedab45e49b9)
|
||||
---
|
||||
data/org.gnome.Shell.Introspect.xml | 24 ++++++++++++
|
||||
js/misc/introspect.js | 58 +++++++++++++++++++++++++++++
|
||||
2 files changed, 82 insertions(+)
|
||||
|
||||
diff --git a/data/org.gnome.Shell.Introspect.xml b/data/org.gnome.Shell.Introspect.xml
|
||||
index 10c48d635..9508681af 100644
|
||||
--- a/data/org.gnome.Shell.Introspect.xml
|
||||
+++ b/data/org.gnome.Shell.Introspect.xml
|
||||
@@ -33,5 +33,29 @@
|
||||
<method name="GetRunningApplications">
|
||||
<arg name="apps" direction="out" type="a{sa{sv}}" />
|
||||
</method>
|
||||
+
|
||||
+ <!--
|
||||
+ GetWindows:
|
||||
+ @short_description: Retrieves the current list of windows and their properties
|
||||
+
|
||||
+ A window is exposed as:
|
||||
+ * t ID: unique ID of the window
|
||||
+ * a{sv} properties: high-level properties
|
||||
+
|
||||
+ Known properties:
|
||||
+
|
||||
+ - "title" (s): (readonly) title of the window
|
||||
+ - "app-id" (s): (readonly) application ID of the window
|
||||
+ - "wm-class" (s): (readonly) class of the window
|
||||
+ - "client-type" (u): (readonly) 0 for Wayland, 1 for X11
|
||||
+ - "is-hidden" (b): (readonly) if the window is currently hidden
|
||||
+ - "has-focus" (b): (readonly) if the window currently have
|
||||
+ keyboard focus
|
||||
+ - "width" (u): (readonly) width of the window
|
||||
+ - "height" (u): (readonly) height of the window
|
||||
+ -->
|
||||
+ <method name="GetWindows">
|
||||
+ <arg name="windows" direction="out" type="a{ta{sv}}" />
|
||||
+ </method>
|
||||
</interface>
|
||||
</node>
|
||||
diff --git a/js/misc/introspect.js b/js/misc/introspect.js
|
||||
index 05ef9e637..5999fc1f0 100644
|
||||
--- a/js/misc/introspect.js
|
||||
+++ b/js/misc/introspect.js
|
||||
@@ -14,6 +14,9 @@ const IntrospectDBusIface = '<node> \
|
||||
<method name="GetRunningApplications"> \
|
||||
<arg name="apps" direction="out" type="a{sa{sv}}" /> \
|
||||
</method> \
|
||||
+ <method name="GetWindows"> \
|
||||
+ <arg name="windows" direction="out" type="a{ta{sv}}" /> \
|
||||
+ </method> \
|
||||
</interface> \
|
||||
</node>';
|
||||
|
||||
@@ -102,6 +105,17 @@ var IntrospectService = new Lang.Class({
|
||||
this._activeApplicationDirty = false;
|
||||
},
|
||||
|
||||
+ _isEligibleWindow(window) {
|
||||
+ if (window.is_override_redirect())
|
||||
+ return false;
|
||||
+
|
||||
+ let type = window.get_window_type();
|
||||
+ return (type == Meta.WindowType.NORMAL ||
|
||||
+ type == Meta.WindowType.DIALOG ||
|
||||
+ type == Meta.WindowType.MODAL_DIALOG ||
|
||||
+ type == Meta.WindowType.UTILITY);
|
||||
+ },
|
||||
+
|
||||
GetRunningApplicationsAsync(params, invocation) {
|
||||
if (!this._isIntrospectEnabled() &&
|
||||
!this._isSenderWhitelisted(invocation.get_sender())) {
|
||||
@@ -112,5 +126,49 @@ var IntrospectService = new Lang.Class({
|
||||
}
|
||||
|
||||
invocation.return_value(new GLib.Variant('(a{sa{sv}})', [this._runningApplications]));
|
||||
+ },
|
||||
+
|
||||
+ GetWindowsAsync(params, invocation) {
|
||||
+ let focusWindow = global.display.get_focus_window();
|
||||
+ let apps = this._appSystem.get_running();
|
||||
+ let windowsList = {};
|
||||
+
|
||||
+ if (!this._isIntrospectEnabled()) {
|
||||
+ invocation.return_error_literal(Gio.DBusError,
|
||||
+ Gio.DBusError.ACCESS_DENIED,
|
||||
+ 'App introspection not allowed');
|
||||
+ return;
|
||||
+ }
|
||||
+
|
||||
+ for (let app of apps) {
|
||||
+ let windows = app.get_windows();
|
||||
+ for (let window of windows) {
|
||||
+
|
||||
+ if (!this._isEligibleWindow(window))
|
||||
+ continue;
|
||||
+
|
||||
+ let windowId = window.get_id();
|
||||
+ let frameRect = window.get_frame_rect();
|
||||
+ let title = window.get_title();
|
||||
+ let wmClass = window.get_wm_class();
|
||||
+
|
||||
+ windowsList[windowId] = {
|
||||
+ 'app-id': GLib.Variant.new('s', app.get_id()),
|
||||
+ 'client-type': GLib.Variant.new('u', window.get_client_type()),
|
||||
+ 'is-hidden': GLib.Variant.new('b', window.is_hidden()),
|
||||
+ 'has-focus': GLib.Variant.new('b', (window == focusWindow)),
|
||||
+ 'width': GLib.Variant.new('u', frameRect.width),
|
||||
+ 'height': GLib.Variant.new('u', frameRect.height)
|
||||
+ };
|
||||
+
|
||||
+ // These properties may not be available for all windows:
|
||||
+ if (title != null)
|
||||
+ windowsList[windowId]['title'] = GLib.Variant.new('s', title);
|
||||
+
|
||||
+ if (wmClass != null)
|
||||
+ windowsList[windowId]['wm-class'] = GLib.Variant.new('s', wmClass);
|
||||
+ }
|
||||
+ }
|
||||
+ invocation.return_value(new GLib.Variant('(a{ta{sv}})', [windowsList]));
|
||||
}
|
||||
});
|
||||
--
|
||||
2.20.1
|
||||
|
@ -1,43 +0,0 @@
|
||||
From 31da6717085567c044322d722df5b735925583ce Mon Sep 17 00:00:00 2001
|
||||
From: =?UTF-8?q?Jonas=20=C3=85dahl?= <jadahl@gmail.com>
|
||||
Date: Fri, 27 Jul 2018 18:07:52 +0200
|
||||
Subject: [PATCH 2/2] remoteAccess: Make indicator orange
|
||||
|
||||
Make the indicator for active remote access use the warning color, to
|
||||
indicate the severity of allowing remote access.
|
||||
|
||||
This only makes the indicator icon orange; the icon in the system menu
|
||||
is still white.
|
||||
---
|
||||
data/theme/gnome-shell-sass/_common.scss | 2 ++
|
||||
js/ui/status/remoteAccess.js | 1 +
|
||||
2 files changed, 3 insertions(+)
|
||||
|
||||
diff --git a/data/theme/gnome-shell-sass/_common.scss b/data/theme/gnome-shell-sass/_common.scss
|
||||
index 2f05098df..24ac2c974 100644
|
||||
--- a/data/theme/gnome-shell-sass/_common.scss
|
||||
+++ b/data/theme/gnome-shell-sass/_common.scss
|
||||
@@ -824,6 +824,8 @@ StScrollBar {
|
||||
|
||||
.screencast-indicator { color: $warning_color; }
|
||||
|
||||
+ .remote-access-indicator { color: $warning_color; }
|
||||
+
|
||||
&.solid {
|
||||
background-color: black;
|
||||
/* transition from transparent to solid */
|
||||
diff --git a/js/ui/status/remoteAccess.js b/js/ui/status/remoteAccess.js
|
||||
index ffa334001..db94d130d 100644
|
||||
--- a/js/ui/status/remoteAccess.js
|
||||
+++ b/js/ui/status/remoteAccess.js
|
||||
@@ -41,6 +41,7 @@ var RemoteAccessApplet = new Lang.Class({
|
||||
|
||||
this._indicator = this._addIndicator();
|
||||
this._indicator.icon_name = 'screen-shared-symbolic';
|
||||
+ this._indicator.add_style_class_name('remote-access-indicator');
|
||||
this._item =
|
||||
new PopupMenu.PopupSubMenuMenuItem(_("Screen is Being Shared"),
|
||||
true);
|
||||
--
|
||||
2.17.1
|
||||
|
@ -1,4 +1,4 @@
|
||||
From fd9a803159ca7e7fbe6bee1842cc78deff0da7fa Mon Sep 17 00:00:00 2001
|
||||
From 2ebeda3385fb679df4bc13ba4b80bdeba5e2ad13 Mon Sep 17 00:00:00 2001
|
||||
From: Ray Strode <rstrode@redhat.com>
|
||||
Date: Tue, 15 Jan 2019 12:54:32 -0500
|
||||
Subject: [PATCH 3/4] st-texture-cache: purge on resume
|
||||
@ -7,42 +7,15 @@ With the proprietary nvidia driver, textures get garbled on suspend,
|
||||
so the texture cache needs to evict all textures in that situation.
|
||||
---
|
||||
js/ui/main.js | 6 +++++-
|
||||
src/st/st-texture-cache.c | 12 ++++++++++++
|
||||
src/st/st-texture-cache.c | 10 ++++++++++
|
||||
src/st/st-texture-cache.h | 1 +
|
||||
3 files changed, 18 insertions(+), 1 deletion(-)
|
||||
3 files changed, 16 insertions(+), 1 deletion(-)
|
||||
|
||||
diff --git a/js/ui/main.js b/js/ui/main.js
|
||||
index a8779bf09..faaf07399 100644
|
||||
index 061303cf3..8d1755cf1 100644
|
||||
--- a/js/ui/main.js
|
||||
+++ b/js/ui/main.js
|
||||
@@ -184,61 +184,65 @@ function _initializeUI() {
|
||||
|
||||
messageTray = new MessageTray.MessageTray();
|
||||
panel = new Panel.Panel();
|
||||
keyboard = new Keyboard.Keyboard();
|
||||
notificationDaemon = new NotificationDaemon.NotificationDaemon();
|
||||
windowAttentionHandler = new WindowAttentionHandler.WindowAttentionHandler();
|
||||
componentManager = new Components.ComponentManager();
|
||||
|
||||
introspectService = new Introspect.IntrospectService();
|
||||
|
||||
layoutManager.init();
|
||||
overview.init();
|
||||
|
||||
_a11ySettings = new Gio.Settings({ schema_id: A11Y_SCHEMA });
|
||||
|
||||
global.display.connect('overlay-key', () => {
|
||||
if (!_a11ySettings.get_boolean (STICKY_KEYS_ENABLE))
|
||||
overview.toggle();
|
||||
});
|
||||
|
||||
global.display.connect('show-restart-message', (display, message) => {
|
||||
showRestartMessage(message);
|
||||
return true;
|
||||
});
|
||||
|
||||
global.display.connect('restart', () => {
|
||||
global.reexec_self();
|
||||
@@ -200,7 +200,11 @@ function _initializeUI() {
|
||||
return true;
|
||||
});
|
||||
|
||||
@ -55,65 +28,11 @@ index a8779bf09..faaf07399 100644
|
||||
|
||||
// Provide the bus object for gnome-session to
|
||||
// initiate logouts.
|
||||
EndSessionDialog.init();
|
||||
|
||||
// We're ready for the session manager to move to the next phase
|
||||
Meta.register_with_session();
|
||||
|
||||
_startDate = new Date();
|
||||
|
||||
let perfModuleName = GLib.getenv("SHELL_PERF_MODULE");
|
||||
if (perfModuleName) {
|
||||
let perfOutput = GLib.getenv("SHELL_PERF_OUTPUT");
|
||||
let module = eval('imports.perf.' + perfModuleName + ';');
|
||||
Scripting.runPerfScript(module, perfOutput);
|
||||
}
|
||||
|
||||
ExtensionDownloader.init();
|
||||
ExtensionSystem.init();
|
||||
|
||||
if (sessionMode.isGreeter && screenShield) {
|
||||
layoutManager.connect('startup-prepared', () => {
|
||||
screenShield.showDialog();
|
||||
});
|
||||
}
|
||||
|
||||
layoutManager.connect('startup-complete', () => {
|
||||
if (actionMode == Shell.ActionMode.NONE) {
|
||||
actionMode = Shell.ActionMode.NORMAL;
|
||||
}
|
||||
diff --git a/src/st/st-texture-cache.c b/src/st/st-texture-cache.c
|
||||
index 0c794a3ab..5a3dcd81f 100644
|
||||
index cbe3afaba..40a11dd6d 100644
|
||||
--- a/src/st/st-texture-cache.c
|
||||
+++ b/src/st/st-texture-cache.c
|
||||
@@ -78,60 +78,72 @@ set_texture_cogl_texture (ClutterTexture *clutter_texture, CoglTexture *cogl_tex
|
||||
{
|
||||
clutter_texture_set_cogl_texture (clutter_texture, cogl_texture);
|
||||
g_object_set (clutter_texture, "opacity", 255, NULL);
|
||||
}
|
||||
|
||||
static void
|
||||
st_texture_cache_class_init (StTextureCacheClass *klass)
|
||||
{
|
||||
GObjectClass *gobject_class = (GObjectClass *)klass;
|
||||
|
||||
gobject_class->dispose = st_texture_cache_dispose;
|
||||
gobject_class->finalize = st_texture_cache_finalize;
|
||||
|
||||
signals[ICON_THEME_CHANGED] =
|
||||
g_signal_new ("icon-theme-changed",
|
||||
G_TYPE_FROM_CLASS (klass),
|
||||
G_SIGNAL_RUN_LAST,
|
||||
0, /* no default handler slot */
|
||||
NULL, NULL, NULL,
|
||||
G_TYPE_NONE, 0);
|
||||
|
||||
signals[TEXTURE_FILE_CHANGED] =
|
||||
g_signal_new ("texture-file-changed",
|
||||
G_TYPE_FROM_CLASS (klass),
|
||||
G_SIGNAL_RUN_LAST,
|
||||
0, /* no default handler slot */
|
||||
NULL, NULL, NULL,
|
||||
@@ -113,6 +113,16 @@ st_texture_cache_class_init (StTextureCacheClass *klass)
|
||||
G_TYPE_NONE, 1, G_TYPE_FILE);
|
||||
}
|
||||
|
||||
@ -121,9 +40,7 @@ index 0c794a3ab..5a3dcd81f 100644
|
||||
+void
|
||||
+st_texture_cache_clear (StTextureCache *cache)
|
||||
+{
|
||||
+ GHashTableIter iter;
|
||||
+ gpointer key;
|
||||
+ gpointer value;
|
||||
+ g_return_if_fail (ST_IS_TEXTURE_CACHE (cache));
|
||||
+
|
||||
+ g_hash_table_remove_all (cache->priv->keyed_cache);
|
||||
+ g_signal_emit (cache, signals[ICON_THEME_CHANGED], 0);
|
||||
@ -132,65 +49,11 @@ index 0c794a3ab..5a3dcd81f 100644
|
||||
/* Evicts all cached textures for named icons */
|
||||
static void
|
||||
st_texture_cache_evict_icons (StTextureCache *cache)
|
||||
{
|
||||
GHashTableIter iter;
|
||||
gpointer key;
|
||||
gpointer value;
|
||||
|
||||
g_hash_table_iter_init (&iter, cache->priv->keyed_cache);
|
||||
while (g_hash_table_iter_next (&iter, &key, &value))
|
||||
{
|
||||
const char *cache_key = key;
|
||||
|
||||
/* This is too conservative - it takes out all cached textures
|
||||
* for GIcons even when they aren't named icons, but it's not
|
||||
* worth the complexity of parsing the key and calling
|
||||
* g_icon_new_for_string(); icon theme changes aren't normal */
|
||||
if (g_str_has_prefix (cache_key, CACHE_PREFIX_ICON))
|
||||
g_hash_table_iter_remove (&iter);
|
||||
}
|
||||
}
|
||||
|
||||
static void
|
||||
on_icon_theme_changed (GtkIconTheme *icon_theme,
|
||||
StTextureCache *cache)
|
||||
{
|
||||
st_texture_cache_evict_icons (cache);
|
||||
g_signal_emit (cache, signals[ICON_THEME_CHANGED], 0);
|
||||
}
|
||||
|
||||
diff --git a/src/st/st-texture-cache.h b/src/st/st-texture-cache.h
|
||||
index 26f9c30ac..b87adc4d5 100644
|
||||
index 11d1c4e64..9079d1fda 100644
|
||||
--- a/src/st/st-texture-cache.h
|
||||
+++ b/src/st/st-texture-cache.h
|
||||
@@ -25,60 +25,61 @@
|
||||
#if !defined(ST_H_INSIDE) && !defined(ST_COMPILATION)
|
||||
#error "Only <st/st.h> can be included directly.h"
|
||||
#endif
|
||||
|
||||
#include <gio/gio.h>
|
||||
#include <gtk/gtk.h>
|
||||
#include <clutter/clutter.h>
|
||||
|
||||
#include <st/st-types.h>
|
||||
#include <st/st-theme-node.h>
|
||||
|
||||
#define ST_TYPE_TEXTURE_CACHE (st_texture_cache_get_type ())
|
||||
G_DECLARE_FINAL_TYPE (StTextureCache, st_texture_cache,
|
||||
ST, TEXTURE_CACHE, GObject)
|
||||
|
||||
typedef struct _StTextureCachePrivate StTextureCachePrivate;
|
||||
|
||||
struct _StTextureCache
|
||||
{
|
||||
GObject parent;
|
||||
|
||||
StTextureCachePrivate *priv;
|
||||
};
|
||||
|
||||
typedef enum {
|
||||
ST_TEXTURE_CACHE_POLICY_NONE,
|
||||
ST_TEXTURE_CACHE_POLICY_FOREVER
|
||||
@@ -53,6 +53,7 @@ typedef enum {
|
||||
} StTextureCachePolicy;
|
||||
|
||||
StTextureCache* st_texture_cache_get_default (void);
|
||||
@ -198,33 +61,6 @@ index 26f9c30ac..b87adc4d5 100644
|
||||
|
||||
ClutterActor *
|
||||
st_texture_cache_load_sliced_image (StTextureCache *cache,
|
||||
GFile *file,
|
||||
gint grid_width,
|
||||
gint grid_height,
|
||||
gint scale,
|
||||
GFunc load_callback,
|
||||
gpointer user_data);
|
||||
|
||||
ClutterActor *st_texture_cache_bind_cairo_surface_property (StTextureCache *cache,
|
||||
GObject *object,
|
||||
const char *property_name);
|
||||
|
||||
ClutterActor *st_texture_cache_load_gicon (StTextureCache *cache,
|
||||
StThemeNode *theme_node,
|
||||
GIcon *icon,
|
||||
gint size,
|
||||
gint scale);
|
||||
|
||||
ClutterActor *st_texture_cache_load_file_async (StTextureCache *cache,
|
||||
GFile *file,
|
||||
int available_width,
|
||||
int available_height,
|
||||
int scale);
|
||||
|
||||
CoglTexture *st_texture_cache_load_file_to_cogl_texture (StTextureCache *cache,
|
||||
GFile *file,
|
||||
gint scale);
|
||||
|
||||
--
|
||||
2.18.1
|
||||
2.21.0
|
||||
|
||||
|
@ -1,4 +1,4 @@
|
||||
From b440c4c529aee18ecc36a7b8a24809bc684cfe5b Mon Sep 17 00:00:00 2001
|
||||
From 055bc14c70af66fe1893dcd4c42c65662ae1f9d0 Mon Sep 17 00:00:00 2001
|
||||
From: Ray Strode <rstrode@redhat.com>
|
||||
Date: Mon, 21 Jan 2019 15:07:15 -0500
|
||||
Subject: [PATCH 4/4] background: refresh background on gl-video-memory-purged
|
||||
@ -10,119 +10,39 @@ and the signal is only emitted for NVIDIA, so use that instead.
|
||||
---
|
||||
js/ui/background.js | 9 +++++++--
|
||||
js/ui/layout.js | 12 ------------
|
||||
src/shell-util.c | 9 ---------
|
||||
3 files changed, 7 insertions(+), 23 deletions(-)
|
||||
src/shell-util.c | 27 ---------------------------
|
||||
src/shell-util.h | 2 --
|
||||
4 files changed, 7 insertions(+), 43 deletions(-)
|
||||
|
||||
diff --git a/js/ui/background.js b/js/ui/background.js
|
||||
index c61d946a4..ae7ef275e 100644
|
||||
index 75b76a57e..466cc4de7 100644
|
||||
--- a/js/ui/background.js
|
||||
+++ b/js/ui/background.js
|
||||
@@ -512,64 +512,69 @@ var SystemBackground = new Lang.Class({
|
||||
let image = cache.load(file);
|
||||
if (image.is_loaded()) {
|
||||
image = null;
|
||||
let id = GLib.idle_add(GLib.PRIORITY_DEFAULT, () => {
|
||||
this.emit('loaded');
|
||||
return GLib.SOURCE_REMOVE;
|
||||
});
|
||||
GLib.Source.set_name_by_id(id, '[gnome-shell] SystemBackground.loaded');
|
||||
} else {
|
||||
let id = image.connect('loaded', () => {
|
||||
this.emit('loaded');
|
||||
image.disconnect(id);
|
||||
image = null;
|
||||
});
|
||||
}
|
||||
},
|
||||
});
|
||||
Signals.addSignalMethods(SystemBackground.prototype);
|
||||
|
||||
var BackgroundSource = new Lang.Class({
|
||||
Name: 'BackgroundSource',
|
||||
|
||||
_init(layoutManager, settingsSchema) {
|
||||
// Allow override the background image setting for performance testing
|
||||
this._layoutManager = layoutManager;
|
||||
this._overrideImage = GLib.getenv('SHELL_BACKGROUND_IMAGE');
|
||||
this._settings = new Gio.Settings({ schema_id: settingsSchema });
|
||||
this._backgrounds = [];
|
||||
|
||||
this._monitorsChangedId = global.screen.connect('monitors-changed',
|
||||
- this._onMonitorsChanged.bind(this));
|
||||
+ this._refresh.bind(this));
|
||||
@@ -527,10 +527,15 @@ var BackgroundSource = class BackgroundSource {
|
||||
let monitorManager = Meta.MonitorManager.get();
|
||||
this._monitorsChangedId =
|
||||
monitorManager.connect('monitors-changed',
|
||||
- this._onMonitorsChanged.bind(this));
|
||||
+ this._refresh.bind(this));
|
||||
+
|
||||
+ global.display.connect('gl-video-memory-purged', () => {
|
||||
+ Meta.Background.refresh_all();
|
||||
+ this._refresh();
|
||||
+ });
|
||||
},
|
||||
+ Meta.Background.refresh_all();
|
||||
+ this._refresh();
|
||||
+ });
|
||||
}
|
||||
|
||||
- _onMonitorsChanged() {
|
||||
+ _refresh() {
|
||||
for (let monitorIndex in this._backgrounds) {
|
||||
let background = this._backgrounds[monitorIndex];
|
||||
|
||||
if (monitorIndex < this._layoutManager.monitors.length) {
|
||||
background.updateResolution();
|
||||
} else {
|
||||
background.disconnect(background._changedId);
|
||||
background.destroy();
|
||||
delete this._backgrounds[monitorIndex];
|
||||
}
|
||||
}
|
||||
},
|
||||
|
||||
getBackground(monitorIndex) {
|
||||
let file = null;
|
||||
let style;
|
||||
|
||||
// We don't watch changes to settings here,
|
||||
// instead we rely on Background to watch those
|
||||
// and emit 'changed' at the right time
|
||||
|
||||
if (this._overrideImage != null) {
|
||||
file = Gio.File.new_for_path(this._overrideImage);
|
||||
style = GDesktopEnums.BackgroundStyle.ZOOM; // Hardcode
|
||||
} else {
|
||||
style = this._settings.get_enum(BACKGROUND_STYLE_KEY);
|
||||
if (style != GDesktopEnums.BackgroundStyle.NONE) {
|
||||
let uri = this._settings.get_string(PICTURE_URI_KEY);
|
||||
file = Gio.File.new_for_commandline_arg(uri);
|
||||
}
|
||||
diff --git a/js/ui/layout.js b/js/ui/layout.js
|
||||
index 6f810395d..2cd1e5bd3 100644
|
||||
index 30e750dc5..2b3bb7442 100644
|
||||
--- a/js/ui/layout.js
|
||||
+++ b/js/ui/layout.js
|
||||
@@ -251,72 +251,60 @@ var LayoutManager = new Lang.Class({
|
||||
this.addChrome(this.keyboardBox);
|
||||
this._keyboardHeightNotifyId = 0;
|
||||
|
||||
// A dummy actor that tracks the mouse or text cursor, based on the
|
||||
// position and size set in setDummyCursorGeometry.
|
||||
this.dummyCursor = new St.Widget({ width: 0, height: 0, visible: false });
|
||||
this.uiGroup.add_actor(this.dummyCursor);
|
||||
|
||||
global.stage.remove_actor(global.top_window_group);
|
||||
this.uiGroup.add_actor(global.top_window_group);
|
||||
|
||||
let feedbackGroup = Meta.get_feedback_group_for_screen(global.screen);
|
||||
global.stage.remove_actor(feedbackGroup);
|
||||
this.uiGroup.add_actor(feedbackGroup);
|
||||
|
||||
this._backgroundGroup = new Meta.BackgroundGroup();
|
||||
global.window_group.add_child(this._backgroundGroup);
|
||||
this._backgroundGroup.lower_bottom();
|
||||
this._bgManagers = [];
|
||||
|
||||
// Need to update struts on new workspaces when they are added
|
||||
global.screen.connect('notify::n-workspaces',
|
||||
this._queueUpdateRegions.bind(this));
|
||||
global.screen.connect('restacked',
|
||||
this._windowsRestacked.bind(this));
|
||||
global.screen.connect('monitors-changed',
|
||||
this._monitorsChanged.bind(this));
|
||||
global.screen.connect('in-fullscreen-changed',
|
||||
this._updateFullscreen.bind(this));
|
||||
@@ -282,18 +282,6 @@ var LayoutManager = GObject.registerClass({
|
||||
monitorManager.connect('monitors-changed',
|
||||
this._monitorsChanged.bind(this));
|
||||
this._monitorsChanged();
|
||||
-
|
||||
- // NVIDIA drivers don't preserve FBO contents across
|
||||
@ -136,71 +56,35 @@ index 6f810395d..2cd1e5bd3 100644
|
||||
- Meta.Background.refresh_all();
|
||||
- });
|
||||
- }
|
||||
},
|
||||
}
|
||||
|
||||
// This is called by Main after everything else is constructed
|
||||
init() {
|
||||
Main.sessionMode.connect('updated', this._sessionUpdated.bind(this));
|
||||
|
||||
this._loadBackground();
|
||||
},
|
||||
|
||||
showOverview() {
|
||||
this.overviewGroup.show();
|
||||
|
||||
this._inOverview = true;
|
||||
this._updateVisibility();
|
||||
},
|
||||
|
||||
hideOverview() {
|
||||
this.overviewGroup.hide();
|
||||
|
||||
this._inOverview = false;
|
||||
this._updateVisibility();
|
||||
},
|
||||
|
||||
_sessionUpdated() {
|
||||
this._updateVisibility();
|
||||
this._queueUpdateRegions();
|
||||
},
|
||||
|
||||
_updateMonitors() {
|
||||
let screen = global.screen;
|
||||
diff --git a/src/shell-util.c b/src/shell-util.c
|
||||
index c43bf4cc5..c63c6efb7 100644
|
||||
index c6e5abed6..9c25643c6 100644
|
||||
--- a/src/shell-util.c
|
||||
+++ b/src/shell-util.c
|
||||
@@ -369,69 +369,60 @@ shell_util_cursor_tracker_to_clutter (MetaCursorTracker *tracker,
|
||||
sprite = meta_cursor_tracker_get_sprite (tracker);
|
||||
if (sprite)
|
||||
{
|
||||
clutter_actor_show (CLUTTER_ACTOR (texture));
|
||||
clutter_texture_set_cogl_texture (texture, sprite);
|
||||
}
|
||||
else
|
||||
{
|
||||
clutter_actor_hide (CLUTTER_ACTOR (texture));
|
||||
}
|
||||
}
|
||||
|
||||
typedef const gchar *(*ShellGLGetString) (GLenum);
|
||||
|
||||
static const gchar *
|
||||
get_gl_vendor (void)
|
||||
{
|
||||
static const gchar *vendor = NULL;
|
||||
|
||||
if (!vendor)
|
||||
{
|
||||
ShellGLGetString gl_get_string;
|
||||
gl_get_string = (ShellGLGetString) cogl_get_proc_address ("glGetString");
|
||||
if (gl_get_string)
|
||||
vendor = gl_get_string (GL_VENDOR);
|
||||
}
|
||||
|
||||
return vendor;
|
||||
@@ -374,33 +374,6 @@ shell_util_create_pixbuf_from_data (const guchar *data,
|
||||
(GdkPixbufDestroyNotify) g_free, NULL);
|
||||
}
|
||||
|
||||
-typedef const gchar *(*ShellGLGetString) (GLenum);
|
||||
-
|
||||
-static const gchar *
|
||||
-get_gl_vendor (void)
|
||||
-{
|
||||
- static const gchar *vendor = NULL;
|
||||
-
|
||||
- if (!vendor)
|
||||
- {
|
||||
- ShellGLGetString gl_get_string;
|
||||
- gl_get_string = (ShellGLGetString) cogl_get_proc_address ("glGetString");
|
||||
- if (gl_get_string)
|
||||
- vendor = gl_get_string (GL_VENDOR);
|
||||
- }
|
||||
-
|
||||
- return vendor;
|
||||
-}
|
||||
-
|
||||
-gboolean
|
||||
-shell_util_need_background_refresh (void)
|
||||
-{
|
||||
@ -213,33 +97,19 @@ index c43bf4cc5..c63c6efb7 100644
|
||||
static gboolean
|
||||
canvas_draw_cb (ClutterContent *content,
|
||||
cairo_t *cr,
|
||||
gint width,
|
||||
gint height,
|
||||
gpointer user_data)
|
||||
{
|
||||
cairo_surface_t *surface = user_data;
|
||||
diff --git a/src/shell-util.h b/src/shell-util.h
|
||||
index 6904f43bc..049c3fe18 100644
|
||||
--- a/src/shell-util.h
|
||||
+++ b/src/shell-util.h
|
||||
@@ -44,8 +44,6 @@ GdkPixbuf *shell_util_create_pixbuf_from_data (const guchar *data,
|
||||
int height,
|
||||
int rowstride);
|
||||
|
||||
cairo_set_source_surface (cr, surface, 0, 0);
|
||||
cairo_paint (cr);
|
||||
-gboolean shell_util_need_background_refresh (void);
|
||||
-
|
||||
ClutterContent * shell_util_get_content_for_window_actor (MetaWindowActor *window_actor,
|
||||
MetaRectangle *window_rect);
|
||||
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
/**
|
||||
* shell_util_get_content_for_window_actor:
|
||||
* @window_actor: a #MetaWindowActor
|
||||
* @window_rect: a #MetaRectangle
|
||||
*
|
||||
* Returns: (transfer full): a new #ClutterContent
|
||||
*/
|
||||
ClutterContent *
|
||||
shell_util_get_content_for_window_actor (MetaWindowActor *window_actor,
|
||||
MetaRectangle *window_rect)
|
||||
{
|
||||
ClutterActor *texture;
|
||||
ClutterContent *content;
|
||||
cairo_surface_t *surface;
|
||||
cairo_rectangle_int_t clip;
|
||||
--
|
||||
2.18.1
|
||||
2.21.0
|
||||
|
||||
|
@ -1,4 +1,4 @@
|
||||
From ca59b5fa9e089177676c0590924e734910377102 Mon Sep 17 00:00:00 2001
|
||||
From de891fadb0b40a9b6e84131b82086e42d86992a1 Mon Sep 17 00:00:00 2001
|
||||
From: Ray Strode <rstrode@redhat.com>
|
||||
Date: Tue, 19 Apr 2016 13:12:46 -0400
|
||||
Subject: [PATCH] loginDialog: allow timed login with disabled user list
|
||||
@ -12,15 +12,15 @@ It accomplishes this by putting the timed login indicator on the
|
||||
auth prompt, in that scenario.
|
||||
---
|
||||
data/theme/gnome-shell-sass/_common.scss | 4 +++
|
||||
js/gdm/authPrompt.js | 40 ++++++++++++++++++++++++
|
||||
js/gdm/loginDialog.js | 28 +++++++++++++++--
|
||||
3 files changed, 70 insertions(+), 2 deletions(-)
|
||||
js/gdm/authPrompt.js | 41 +++++++++++++++++++++++-
|
||||
js/gdm/loginDialog.js | 23 ++++++++++++-
|
||||
3 files changed, 66 insertions(+), 2 deletions(-)
|
||||
|
||||
diff --git a/data/theme/gnome-shell-sass/_common.scss b/data/theme/gnome-shell-sass/_common.scss
|
||||
index 2f05098df..4e82ef58b 100644
|
||||
index a6357baad..c2df28279 100644
|
||||
--- a/data/theme/gnome-shell-sass/_common.scss
|
||||
+++ b/data/theme/gnome-shell-sass/_common.scss
|
||||
@@ -1825,6 +1825,10 @@ StScrollBar {
|
||||
@@ -1856,6 +1856,10 @@ StScrollBar {
|
||||
padding-bottom: 12px;
|
||||
spacing: 8px;
|
||||
width: 23em;
|
||||
@ -32,18 +32,18 @@ index 2f05098df..4e82ef58b 100644
|
||||
|
||||
.login-dialog-prompt-label {
|
||||
diff --git a/js/gdm/authPrompt.js b/js/gdm/authPrompt.js
|
||||
index 89cef4d5d..e44281117 100644
|
||||
index 27eb31a89..cf77b3f26 100644
|
||||
--- a/js/gdm/authPrompt.js
|
||||
+++ b/js/gdm/authPrompt.js
|
||||
@@ -2,6 +2,7 @@
|
||||
@@ -1,6 +1,6 @@
|
||||
// -*- mode: js; js-indent-level: 4; indent-tabs-mode: nil -*-
|
||||
|
||||
const Clutter = imports.gi.Clutter;
|
||||
const Gio = imports.gi.Gio;
|
||||
+const GLib = imports.gi.GLib;
|
||||
const Lang = imports.lang;
|
||||
const Pango = imports.gi.Pango;
|
||||
-const { Clutter, Pango, Shell, St } = imports.gi;
|
||||
+const { Clutter, GLib, Pango, Shell, St } = imports.gi;
|
||||
const Signals = imports.signals;
|
||||
@@ -117,6 +118,11 @@ var AuthPrompt = new Lang.Class({
|
||||
|
||||
const Animation = imports.ui.animation;
|
||||
@@ -111,6 +111,11 @@ var AuthPrompt = class {
|
||||
|
||||
this._entry.grab_key_focus();
|
||||
|
||||
@ -55,9 +55,9 @@ index 89cef4d5d..e44281117 100644
|
||||
this._message = new St.Label({ opacity: 0,
|
||||
styleClass: 'login-dialog-message' });
|
||||
this._message.clutter_text.line_wrap = true;
|
||||
@@ -142,6 +148,40 @@ var AuthPrompt = new Lang.Class({
|
||||
@@ -135,6 +140,40 @@ var AuthPrompt = class {
|
||||
this._defaultButtonWell.add_child(this._spinner.actor);
|
||||
},
|
||||
}
|
||||
|
||||
+ showTimedLoginIndicator(time) {
|
||||
+ let hold = new Batch.Hold();
|
||||
@ -83,7 +83,7 @@ index 89cef4d5d..e44281117 100644
|
||||
+ GLib.Source.set_name_by_id(this._timedLoginTimeoutId, '[gnome-shell] this._timedLoginTimeoutId');
|
||||
+
|
||||
+ return hold;
|
||||
+ },
|
||||
+ }
|
||||
+
|
||||
+ hideTimedLoginIndicator() {
|
||||
+ if (this._timedLoginTimeoutId) {
|
||||
@ -91,16 +91,16 @@ index 89cef4d5d..e44281117 100644
|
||||
+ this._timedLoginTimeoutId = 0;
|
||||
+ }
|
||||
+ this._timedLoginIndicator.scale_x = 0.;
|
||||
+ },
|
||||
+ }
|
||||
+
|
||||
_onDestroy() {
|
||||
if (this._preemptiveAnswerWatchId) {
|
||||
this._idleMonitor.remove_watch(this._preemptiveAnswerWatchId);
|
||||
diff --git a/js/gdm/loginDialog.js b/js/gdm/loginDialog.js
|
||||
index 4a93545af..65d9edf1a 100644
|
||||
index 6c4d1357d..9aaa013d8 100644
|
||||
--- a/js/gdm/loginDialog.js
|
||||
+++ b/js/gdm/loginDialog.js
|
||||
@@ -738,6 +738,9 @@ var LoginDialog = new Lang.Class({
|
||||
@@ -734,6 +734,9 @@ var LoginDialog = GObject.registerClass({
|
||||
|
||||
if (this._authPrompt.verificationStatus == AuthPrompt.AuthPromptStatus.NOT_VERIFYING)
|
||||
this._authPrompt.reset();
|
||||
@ -108,16 +108,11 @@ index 4a93545af..65d9edf1a 100644
|
||||
+ if (this._disableUserList && this._timedLoginUserListHold)
|
||||
+ this._timedLoginUserListHold.release();
|
||||
}
|
||||
},
|
||||
}
|
||||
|
||||
@@ -1019,17 +1022,33 @@ var LoginDialog = new Lang.Class({
|
||||
},
|
||||
|
||||
_startTimedLogin(userName, delay) {
|
||||
+ this._timedLoginUserName = userName;
|
||||
this._timedLoginItem = null;
|
||||
this._timedLoginDelay = delay;
|
||||
this._timedLoginAnimationTime = delay;
|
||||
@@ -1020,9 +1023,21 @@ var LoginDialog = GObject.registerClass({
|
||||
let loginItem = null;
|
||||
let animationTime;
|
||||
|
||||
- let tasks = [() => this._waitForItemForUser(userName),
|
||||
+ let tasks = [() => {
|
||||
@ -135,37 +130,29 @@ index 4a93545af..65d9edf1a 100644
|
||||
+ if (this._disableUserList)
|
||||
+ return;
|
||||
+
|
||||
this._timedLoginItem = this._userList.getItemFromUserName(userName);
|
||||
loginItem = this._userList.getItemFromUserName(userName);
|
||||
|
||||
// If there is an animation running on the item, reset it.
|
||||
@@ -1030,6 +1045,9 @@ var LoginDialog = GObject.registerClass({
|
||||
},
|
||||
|
||||
() => {
|
||||
+ if (this._disableUserList)
|
||||
+ return;
|
||||
+
|
||||
// If we're just starting out, start on the right
|
||||
// item.
|
||||
// If we're just starting out, start on the right item.
|
||||
if (!this._userManager.is_loaded) {
|
||||
@@ -1040,6 +1059,9 @@ var LoginDialog = new Lang.Class({
|
||||
this._blockTimedLoginUntilIdle,
|
||||
this._userList.jumpToItem(loginItem);
|
||||
@@ -1051,6 +1069,9 @@ var LoginDialog = GObject.registerClass({
|
||||
},
|
||||
|
||||
() => {
|
||||
+ if (this._disableUserList)
|
||||
+ return;
|
||||
+
|
||||
this._userList.scrollToItem(this._timedLoginItem);
|
||||
},
|
||||
|
||||
@@ -1064,7 +1086,9 @@ var LoginDialog = new Lang.Class({
|
||||
if (this._timedLoginItem)
|
||||
this._timedLoginItem.hideTimedLoginIndicator();
|
||||
|
||||
- let userName = this._timedLoginItem.user.get_user_name();
|
||||
+ this._authPrompt.hideTimedLoginIndicator();
|
||||
+
|
||||
+ let userName = this._timedLoginUserName;
|
||||
|
||||
if (userName)
|
||||
this._startTimedLogin(userName, this._timedLoginDelay);
|
||||
// If idle timeout is done, make sure the timed login indicator is shown
|
||||
if (delay > _TIMED_LOGIN_IDLE_THRESHOLD &&
|
||||
this._authPrompt.actor.visible)
|
||||
--
|
||||
2.20.1
|
||||
2.21.0
|
||||
|
||||
|
@ -1,398 +0,0 @@
|
||||
From 99c77e85b3514e885641ebdc3dee3d4508e08fbf Mon Sep 17 00:00:00 2001
|
||||
From: =?UTF-8?q?Florian=20M=C3=BCllner?= <fmuellner@gnome.org>
|
||||
Date: Mon, 16 Jul 2018 23:36:38 +0000
|
||||
Subject: [PATCH 1/6] keyboard: Handle no-window case in FocusTracker
|
||||
|
||||
For windows, the cursor location needs to be adjusted by the frame
|
||||
offsets. However we cannot assume that there is a window, as the
|
||||
shell itself can have the key focus.
|
||||
|
||||
https://gitlab.gnome.org/GNOME/gnome-shell/issues/414
|
||||
|
||||
|
||||
(cherry picked from commit 0dee82fb9fa974ebdb4dd77fd85535a6edf207fd)
|
||||
---
|
||||
js/ui/keyboard.js | 18 +++++++++++++-----
|
||||
1 file changed, 13 insertions(+), 5 deletions(-)
|
||||
|
||||
diff --git a/js/ui/keyboard.js b/js/ui/keyboard.js
|
||||
index 5fcdf988a..66653d602 100644
|
||||
--- a/js/ui/keyboard.js
|
||||
+++ b/js/ui/keyboard.js
|
||||
@@ -533,17 +533,25 @@ var FocusTracker = new Lang.Class({
|
||||
},
|
||||
|
||||
_setCurrentRect(rect) {
|
||||
- let frameRect = this._currentWindow.get_frame_rect();
|
||||
- rect.x -= frameRect.x;
|
||||
- rect.y -= frameRect.y;
|
||||
+ if (this._currentWindow) {
|
||||
+ let frameRect = this._currentWindow.get_frame_rect();
|
||||
+ rect.x -= frameRect.x;
|
||||
+ rect.y -= frameRect.y;
|
||||
+ }
|
||||
|
||||
this._rect = rect;
|
||||
this.emit('position-changed');
|
||||
},
|
||||
|
||||
getCurrentRect() {
|
||||
- let frameRect = this._currentWindow.get_frame_rect();
|
||||
- let rect = { x: this._rect.x + frameRect.x, y: this._rect.y + frameRect.y, width: this._rect.width, height: this._rect.height };
|
||||
+ let rect = { x: this._rect.x, y: this._rect.y,
|
||||
+ width: this._rect.width, height: this._rect.height };
|
||||
+
|
||||
+ if (this._currentWindow) {
|
||||
+ let frameRect = this._currentWindow.get_frame_rect();
|
||||
+ rect.x += frameRect.x;
|
||||
+ rect.y += frameRect.y;
|
||||
+ }
|
||||
|
||||
return rect;
|
||||
}
|
||||
--
|
||||
2.20.1
|
||||
|
||||
|
||||
From b89224c37afc9cbedbd776bfdd27c57849669fba Mon Sep 17 00:00:00 2001
|
||||
From: Carlos Garnacho <carlosg@gnome.org>
|
||||
Date: Fri, 29 Jun 2018 17:35:39 +0200
|
||||
Subject: [PATCH 2/6] inputMethod: Handle IBusInputContext::forward-key-press
|
||||
|
||||
The input method may hint that certain keycodes should be pressed/released
|
||||
besides the textual information in ::commit. An example is hitting space
|
||||
in some IMs to commit text, where both ::commit happens, and an space is
|
||||
visibly inserted. In order to handle this properly, we must honor
|
||||
::forward-key-press.
|
||||
|
||||
In order to cater for the case that a keypress is forwarded while handling
|
||||
that same keypress in a physical keyboard, check the current event being
|
||||
handled and just forward it as-is if it matches. This is necessary to
|
||||
prevent state from being doubly set, and the second event silenced away.
|
||||
|
||||
https://gitlab.gnome.org/GNOME/gnome-shell/issues/275
|
||||
|
||||
Closes: #275
|
||||
---
|
||||
js/misc/inputMethod.js | 34 ++++++++++++++++++++++++++++++++++
|
||||
1 file changed, 34 insertions(+)
|
||||
|
||||
diff --git a/js/misc/inputMethod.js b/js/misc/inputMethod.js
|
||||
index 621483243..59b3d78d6 100644
|
||||
--- a/js/misc/inputMethod.js
|
||||
+++ b/js/misc/inputMethod.js
|
||||
@@ -15,6 +15,8 @@ var InputMethod = new Lang.Class({
|
||||
this._purpose = 0;
|
||||
this._enabled = true;
|
||||
this._currentFocus = null;
|
||||
+ this._currentEvent = null;
|
||||
+ this._doForwardEvent = false;
|
||||
this._ibus = IBus.Bus.new_async();
|
||||
this._ibus.connect('connected', this._onConnected.bind(this));
|
||||
this._ibus.connect('disconnected', this._clear.bind(this));
|
||||
@@ -25,6 +27,9 @@ var InputMethod = new Lang.Class({
|
||||
this._onSourceChanged.bind(this));
|
||||
this._currentSource = this._inputSourceManager.currentSource;
|
||||
|
||||
+ let deviceManager = Clutter.DeviceManager.get_default();
|
||||
+ this._virtualDevice = deviceManager.create_virtual_device(Clutter.InputDeviceType.KEYBOARD_DEVICE);
|
||||
+
|
||||
if (this._ibus.is_connected())
|
||||
this._onConnected();
|
||||
},
|
||||
@@ -64,6 +69,7 @@ var InputMethod = new Lang.Class({
|
||||
this._context.connect('commit-text', this._onCommitText.bind(this));
|
||||
this._context.connect('delete-surrounding-text', this._onDeleteSurroundingText.bind(this));
|
||||
this._context.connect('update-preedit-text', this._onUpdatePreeditText.bind(this));
|
||||
+ this._context.connect('forward-key-event', this._onForwardKeyEvent.bind(this));
|
||||
|
||||
this._updateCapabilities();
|
||||
},
|
||||
@@ -96,6 +102,24 @@ var InputMethod = new Lang.Class({
|
||||
this.set_preedit_text(str, pos);
|
||||
},
|
||||
|
||||
+ _onForwardKeyEvent(context, keyval, keycode, state) {
|
||||
+ let press = (state & IBus.ModifierType.RELEASE_MASK) == 0;
|
||||
+
|
||||
+ if (this._currentEvent) {
|
||||
+ // If we are handling this same event in filter_key_press(),
|
||||
+ // just let it go through, sending the same event again will
|
||||
+ // be silenced away because the key counts as pressed.
|
||||
+ if (this._currentEvent.get_key_symbol() == keyval &&
|
||||
+ (this._currentEvent.type() == Clutter.EventType.KEY_PRESS) == press) {
|
||||
+ this._doForwardEvent = true;
|
||||
+ return;
|
||||
+ }
|
||||
+ }
|
||||
+
|
||||
+ this._virtualDevice.notify_key(Clutter.get_current_event_time(), keycode,
|
||||
+ press ? Clutter.KeyState.PRESSED : Clutter.KeyState.RELEASED);
|
||||
+ },
|
||||
+
|
||||
vfunc_focus_in(focus) {
|
||||
this._currentFocus = focus;
|
||||
if (this._context) {
|
||||
@@ -197,13 +221,23 @@ var InputMethod = new Lang.Class({
|
||||
|
||||
if (event.type() == Clutter.EventType.KEY_RELEASE)
|
||||
state |= IBus.ModifierType.RELEASE_MASK;
|
||||
+
|
||||
+ this._currentEvent = event;
|
||||
+ this._doForwardEvent = false;
|
||||
+
|
||||
this._context.process_key_event_async(event.get_key_symbol(),
|
||||
event.get_key_code() - 8, // Convert XKB keycodes to evcodes
|
||||
state, -1, null,
|
||||
(context, res) => {
|
||||
try {
|
||||
let retval = context.process_key_event_async_finish(res);
|
||||
+
|
||||
+ if (this._doForwardEvent)
|
||||
+ retval = false;
|
||||
+
|
||||
this.notify_key_event(event, retval);
|
||||
+ this._doForwardEvent = false;
|
||||
+ this._currentEvent = null;
|
||||
} catch (e) {
|
||||
log('Error processing key on IM: ' + e.message);
|
||||
}
|
||||
--
|
||||
2.20.1
|
||||
|
||||
|
||||
From f8040e59811cd28d9c55d766d6f4c80cf45a226d Mon Sep 17 00:00:00 2001
|
||||
From: Takao Fujiwara <tfujiwar@redhat.com>
|
||||
Date: Tue, 21 Aug 2018 20:21:53 +0900
|
||||
Subject: [PATCH 3/6] inputMethod: Fix to hide preedit text
|
||||
|
||||
ibus_engine_update_preedit_text() should hide the pre-edit text
|
||||
when visible == false.
|
||||
|
||||
https://gitlab.gnome.org/GNOME/gnome-shell/issues/431
|
||||
---
|
||||
js/misc/inputMethod.js | 25 +++++++++++++++++++++----
|
||||
1 file changed, 21 insertions(+), 4 deletions(-)
|
||||
|
||||
diff --git a/js/misc/inputMethod.js b/js/misc/inputMethod.js
|
||||
index 59b3d78d6..320a6cc33 100644
|
||||
--- a/js/misc/inputMethod.js
|
||||
+++ b/js/misc/inputMethod.js
|
||||
@@ -17,6 +17,8 @@ var InputMethod = new Lang.Class({
|
||||
this._currentFocus = null;
|
||||
this._currentEvent = null;
|
||||
this._doForwardEvent = false;
|
||||
+ this._preeditStr = '';
|
||||
+ this._preeditPos = 0;
|
||||
this._ibus = IBus.Bus.new_async();
|
||||
this._ibus.connect('connected', this._onConnected.bind(this));
|
||||
this._ibus.connect('disconnected', this._clear.bind(this));
|
||||
@@ -69,6 +71,8 @@ var InputMethod = new Lang.Class({
|
||||
this._context.connect('commit-text', this._onCommitText.bind(this));
|
||||
this._context.connect('delete-surrounding-text', this._onDeleteSurroundingText.bind(this));
|
||||
this._context.connect('update-preedit-text', this._onUpdatePreeditText.bind(this));
|
||||
+ this._context.connect('show-preedit-text', this._onShowPreeditText.bind(this));
|
||||
+ this._context.connect('hide-preedit-text', this._onHidePreeditText.bind(this));
|
||||
this._context.connect('forward-key-event', this._onForwardKeyEvent.bind(this));
|
||||
|
||||
this._updateCapabilities();
|
||||
@@ -79,6 +83,8 @@ var InputMethod = new Lang.Class({
|
||||
this._hints = 0;
|
||||
this._purpose = 0;
|
||||
this._enabled = false;
|
||||
+ this._preeditStr = ''
|
||||
+ this._preeditPos = 0;
|
||||
},
|
||||
|
||||
_emitRequestSurrounding() {
|
||||
@@ -95,11 +101,22 @@ var InputMethod = new Lang.Class({
|
||||
},
|
||||
|
||||
_onUpdatePreeditText(context, text, pos, visible) {
|
||||
- let str = null;
|
||||
- if (visible && text != null)
|
||||
- str = text.get_text();
|
||||
+ if (text == null)
|
||||
+ return;
|
||||
+ this._preeditStr = text.get_text();
|
||||
+ this._preeditPos = pos;
|
||||
+ if (visible)
|
||||
+ this.set_preedit_text(this._preeditStr, pos);
|
||||
+ else
|
||||
+ this.set_preedit_text(null, pos);
|
||||
+ },
|
||||
+
|
||||
+ _onShowPreeditText(context) {
|
||||
+ this.set_preedit_text(this._preeditStr, this._preeditPos);
|
||||
+ },
|
||||
|
||||
- this.set_preedit_text(str, pos);
|
||||
+ _onHidePreeditText(context) {
|
||||
+ this.set_preedit_text(null, this._preeditPos);
|
||||
},
|
||||
|
||||
_onForwardKeyEvent(context, keyval, keycode, state) {
|
||||
--
|
||||
2.20.1
|
||||
|
||||
|
||||
From 43c841a6b9f79b136f8bfe34a28b5c9681006ae7 Mon Sep 17 00:00:00 2001
|
||||
From: Andrea Azzarone <andrea.azzarone@canonical.com>
|
||||
Date: Mon, 17 Sep 2018 18:00:04 +0200
|
||||
Subject: [PATCH 4/6] inputMethod: Add a null-check for text in
|
||||
vfunc_set_surrounding.
|
||||
|
||||
Fixes https://gitlab.gnome.org/GNOME/gnome-shell/issues/579
|
||||
---
|
||||
js/misc/inputMethod.js | 2 +-
|
||||
1 file changed, 1 insertion(+), 1 deletion(-)
|
||||
|
||||
diff --git a/js/misc/inputMethod.js b/js/misc/inputMethod.js
|
||||
index 320a6cc33..ec84f7277 100644
|
||||
--- a/js/misc/inputMethod.js
|
||||
+++ b/js/misc/inputMethod.js
|
||||
@@ -176,7 +176,7 @@ var InputMethod = new Lang.Class({
|
||||
},
|
||||
|
||||
vfunc_set_surrounding(text, cursor, anchor) {
|
||||
- if (this._context)
|
||||
+ if (this._context && text)
|
||||
this._context.set_surrounding_text(text, cursor, anchor);
|
||||
},
|
||||
|
||||
--
|
||||
2.20.1
|
||||
|
||||
|
||||
From 5f03edcadcada801100bab027188660fb2a4c3f6 Mon Sep 17 00:00:00 2001
|
||||
From: =?UTF-8?q?Florian=20M=C3=BCllner?= <fmuellner@gnome.org>
|
||||
Date: Tue, 11 Sep 2018 15:36:35 +0200
|
||||
Subject: [PATCH 5/6] inputMethod: Fix setting surrounding text
|
||||
|
||||
The underlying ibus method expects an object of type IBusText rather
|
||||
than a plain string.
|
||||
|
||||
https://gitlab.gnome.org/GNOME/gnome-shell/merge_requests/228
|
||||
---
|
||||
js/misc/inputMethod.js | 7 +++++--
|
||||
1 file changed, 5 insertions(+), 2 deletions(-)
|
||||
|
||||
diff --git a/js/misc/inputMethod.js b/js/misc/inputMethod.js
|
||||
index ec84f7277..7fb78178a 100644
|
||||
--- a/js/misc/inputMethod.js
|
||||
+++ b/js/misc/inputMethod.js
|
||||
@@ -176,8 +176,11 @@ var InputMethod = new Lang.Class({
|
||||
},
|
||||
|
||||
vfunc_set_surrounding(text, cursor, anchor) {
|
||||
- if (this._context && text)
|
||||
- this._context.set_surrounding_text(text, cursor, anchor);
|
||||
+ if (!this._context || !text)
|
||||
+ return;
|
||||
+
|
||||
+ let ibusText = IBus.Text.new_from_string(text);
|
||||
+ this._context.set_surrounding_text(ibusText, cursor, anchor);
|
||||
},
|
||||
|
||||
vfunc_update_content_hints(hints) {
|
||||
--
|
||||
2.20.1
|
||||
|
||||
|
||||
From 4ed4039ae031f1ed16bac2e7729c84e300f90534 Mon Sep 17 00:00:00 2001
|
||||
From: Carlos Garnacho <carlosg@gnome.org>
|
||||
Date: Thu, 27 Sep 2018 21:09:02 +0200
|
||||
Subject: [PATCH 6/6] inputMethod: Use forward_key() method to forward key
|
||||
events
|
||||
|
||||
ClutterVirtualInputDevice has the limitation that event flags won't be
|
||||
made to contain CLUTTER_EVENT_FLAG_INPUT_METHOD, possibly causing feedback
|
||||
loops.
|
||||
|
||||
As the event gets injected up the platform dependent bits, we can avoid
|
||||
care on not pressing the same key twice, we still expect coherence between
|
||||
key presses and releases from the IM though.
|
||||
|
||||
https://gitlab.gnome.org/GNOME/gnome-shell/issues/531
|
||||
---
|
||||
js/misc/inputMethod.js | 34 ++++++++--------------------------
|
||||
1 file changed, 8 insertions(+), 26 deletions(-)
|
||||
|
||||
diff --git a/js/misc/inputMethod.js b/js/misc/inputMethod.js
|
||||
index 7fb78178a..4a92dc49b 100644
|
||||
--- a/js/misc/inputMethod.js
|
||||
+++ b/js/misc/inputMethod.js
|
||||
@@ -15,8 +15,6 @@ var InputMethod = new Lang.Class({
|
||||
this._purpose = 0;
|
||||
this._enabled = true;
|
||||
this._currentFocus = null;
|
||||
- this._currentEvent = null;
|
||||
- this._doForwardEvent = false;
|
||||
this._preeditStr = '';
|
||||
this._preeditPos = 0;
|
||||
this._ibus = IBus.Bus.new_async();
|
||||
@@ -29,9 +27,6 @@ var InputMethod = new Lang.Class({
|
||||
this._onSourceChanged.bind(this));
|
||||
this._currentSource = this._inputSourceManager.currentSource;
|
||||
|
||||
- let deviceManager = Clutter.DeviceManager.get_default();
|
||||
- this._virtualDevice = deviceManager.create_virtual_device(Clutter.InputDeviceType.KEYBOARD_DEVICE);
|
||||
-
|
||||
if (this._ibus.is_connected())
|
||||
this._onConnected();
|
||||
},
|
||||
@@ -121,20 +116,16 @@ var InputMethod = new Lang.Class({
|
||||
|
||||
_onForwardKeyEvent(context, keyval, keycode, state) {
|
||||
let press = (state & IBus.ModifierType.RELEASE_MASK) == 0;
|
||||
+ state &= ~(IBus.ModifierType.RELEASE_MASK);
|
||||
|
||||
- if (this._currentEvent) {
|
||||
- // If we are handling this same event in filter_key_press(),
|
||||
- // just let it go through, sending the same event again will
|
||||
- // be silenced away because the key counts as pressed.
|
||||
- if (this._currentEvent.get_key_symbol() == keyval &&
|
||||
- (this._currentEvent.type() == Clutter.EventType.KEY_PRESS) == press) {
|
||||
- this._doForwardEvent = true;
|
||||
- return;
|
||||
- }
|
||||
- }
|
||||
+ let curEvent = Clutter.get_current_event();
|
||||
+ let time;
|
||||
+ if (curEvent)
|
||||
+ time = curEvent.get_time();
|
||||
+ else
|
||||
+ time = global.display.get_current_time_roundtrip();
|
||||
|
||||
- this._virtualDevice.notify_key(Clutter.get_current_event_time(), keycode,
|
||||
- press ? Clutter.KeyState.PRESSED : Clutter.KeyState.RELEASED);
|
||||
+ this.forward_key(keyval, keycode + 8, state & Clutter.ModifierType.MODIFIER_MASK, time, press);
|
||||
},
|
||||
|
||||
vfunc_focus_in(focus) {
|
||||
@@ -242,22 +233,13 @@ var InputMethod = new Lang.Class({
|
||||
if (event.type() == Clutter.EventType.KEY_RELEASE)
|
||||
state |= IBus.ModifierType.RELEASE_MASK;
|
||||
|
||||
- this._currentEvent = event;
|
||||
- this._doForwardEvent = false;
|
||||
-
|
||||
this._context.process_key_event_async(event.get_key_symbol(),
|
||||
event.get_key_code() - 8, // Convert XKB keycodes to evcodes
|
||||
state, -1, null,
|
||||
(context, res) => {
|
||||
try {
|
||||
let retval = context.process_key_event_async_finish(res);
|
||||
-
|
||||
- if (this._doForwardEvent)
|
||||
- retval = false;
|
||||
-
|
||||
this.notify_key_event(event, retval);
|
||||
- this._doForwardEvent = false;
|
||||
- this._currentEvent = null;
|
||||
} catch (e) {
|
||||
log('Error processing key on IM: ' + e.message);
|
||||
}
|
||||
--
|
||||
2.20.1
|
||||
|
@ -1,4 +1,4 @@
|
||||
From bd6220c0450ab117c851fb1d21ca35ceb76739f8 Mon Sep 17 00:00:00 2001
|
||||
From a57132816ac7bd93d6875fee0a6c5b273177ac8d Mon Sep 17 00:00:00 2001
|
||||
From: Ray Strode <rstrode@redhat.com>
|
||||
Date: Wed, 30 Sep 2015 12:51:24 -0400
|
||||
Subject: [PATCH 1/3] authPrompt: don't fade out auth messages if user types
|
||||
@ -12,10 +12,10 @@ front, before a password is asked.
|
||||
1 file changed, 1 insertion(+), 1 deletion(-)
|
||||
|
||||
diff --git a/js/gdm/authPrompt.js b/js/gdm/authPrompt.js
|
||||
index 481cd3a77..0ad3d2338 100644
|
||||
index d7f53a92e..d421a8856 100644
|
||||
--- a/js/gdm/authPrompt.js
|
||||
+++ b/js/gdm/authPrompt.js
|
||||
@@ -176,7 +176,7 @@ var AuthPrompt = new Lang.Class({
|
||||
@@ -169,7 +169,7 @@ var AuthPrompt = class {
|
||||
this._updateNextButtonSensitivity(this._entry.text.length > 0);
|
||||
|
||||
this._entry.clutter_text.connect('text-changed', () => {
|
||||
@ -25,10 +25,10 @@ index 481cd3a77..0ad3d2338 100644
|
||||
|
||||
this._updateNextButtonSensitivity(this._entry.text.length > 0 || this.verificationStatus == AuthPromptStatus.VERIFYING);
|
||||
--
|
||||
2.20.1
|
||||
2.21.0
|
||||
|
||||
|
||||
From 1aeff45d29983f8b0e970eb9bf15e5d19aa27903 Mon Sep 17 00:00:00 2001
|
||||
From 50af703ea95f2b73733c38e66c9c251663a51744 Mon Sep 17 00:00:00 2001
|
||||
From: Ray Strode <rstrode@redhat.com>
|
||||
Date: Wed, 30 Sep 2015 14:36:33 -0400
|
||||
Subject: [PATCH 2/3] authPrompt: don't spin unless answering question
|
||||
@ -38,10 +38,10 @@ Subject: [PATCH 2/3] authPrompt: don't spin unless answering question
|
||||
1 file changed, 1 insertion(+), 1 deletion(-)
|
||||
|
||||
diff --git a/js/gdm/authPrompt.js b/js/gdm/authPrompt.js
|
||||
index 0ad3d2338..f18ef41f2 100644
|
||||
index d421a8856..62c5bd078 100644
|
||||
--- a/js/gdm/authPrompt.js
|
||||
+++ b/js/gdm/authPrompt.js
|
||||
@@ -66,8 +66,8 @@ var AuthPrompt = new Lang.Class({
|
||||
@@ -60,8 +60,8 @@ var AuthPrompt = class {
|
||||
|
||||
this.connect('next', () => {
|
||||
this.updateSensitivity(false);
|
||||
@ -52,10 +52,10 @@ index 0ad3d2338..f18ef41f2 100644
|
||||
} else {
|
||||
this._preemptiveAnswer = this._entry.text;
|
||||
--
|
||||
2.20.1
|
||||
2.21.0
|
||||
|
||||
|
||||
From 6afeaae067b5ad280a0899bd6b10931a9b2f02e4 Mon Sep 17 00:00:00 2001
|
||||
From b89be880936ad9dd145eb43890ac72d03c37785d Mon Sep 17 00:00:00 2001
|
||||
From: Ray Strode <rstrode@redhat.com>
|
||||
Date: Mon, 5 Oct 2015 15:26:18 -0400
|
||||
Subject: [PATCH 3/3] authPrompt: stop accepting preemptive answer if user
|
||||
@ -73,10 +73,10 @@ all.
|
||||
1 file changed, 37 insertions(+)
|
||||
|
||||
diff --git a/js/gdm/authPrompt.js b/js/gdm/authPrompt.js
|
||||
index f18ef41f2..89cef4d5d 100644
|
||||
index 62c5bd078..27eb31a89 100644
|
||||
--- a/js/gdm/authPrompt.js
|
||||
+++ b/js/gdm/authPrompt.js
|
||||
@@ -10,6 +10,7 @@ const St = imports.gi.St;
|
||||
@@ -6,6 +6,7 @@ const Signals = imports.signals;
|
||||
const Animation = imports.ui.animation;
|
||||
const Batch = imports.gdm.batch;
|
||||
const GdmUtil = imports.gdm.util;
|
||||
@ -84,7 +84,7 @@ index f18ef41f2..89cef4d5d 100644
|
||||
const Params = imports.misc.params;
|
||||
const ShellEntry = imports.ui.shellEntry;
|
||||
const Tweener = imports.ui.tweener;
|
||||
@@ -47,6 +48,8 @@ var AuthPrompt = new Lang.Class({
|
||||
@@ -41,6 +42,8 @@ var AuthPrompt = class {
|
||||
this._gdmClient = gdmClient;
|
||||
this._mode = mode;
|
||||
|
||||
@ -93,7 +93,7 @@ index f18ef41f2..89cef4d5d 100644
|
||||
let reauthenticationOnly;
|
||||
if (this._mode == AuthPromptMode.UNLOCK_ONLY)
|
||||
reauthenticationOnly = true;
|
||||
@@ -71,6 +74,11 @@ var AuthPrompt = new Lang.Class({
|
||||
@@ -65,6 +68,11 @@ var AuthPrompt = class {
|
||||
this._userVerifier.answerQuery(this._queryingService, this._entry.text);
|
||||
} else {
|
||||
this._preemptiveAnswer = this._entry.text;
|
||||
@ -105,8 +105,8 @@ index f18ef41f2..89cef4d5d 100644
|
||||
}
|
||||
});
|
||||
|
||||
@@ -135,6 +143,11 @@ var AuthPrompt = new Lang.Class({
|
||||
},
|
||||
@@ -128,6 +136,11 @@ var AuthPrompt = class {
|
||||
}
|
||||
|
||||
_onDestroy() {
|
||||
+ if (this._preemptiveAnswerWatchId) {
|
||||
@ -116,9 +116,9 @@ index f18ef41f2..89cef4d5d 100644
|
||||
+
|
||||
this._userVerifier.destroy();
|
||||
this._userVerifier = null;
|
||||
},
|
||||
@@ -349,6 +362,11 @@ var AuthPrompt = new Lang.Class({
|
||||
},
|
||||
}
|
||||
@@ -342,6 +355,11 @@ var AuthPrompt = class {
|
||||
}
|
||||
|
||||
setQuestion(question) {
|
||||
+ if (this._preemptiveAnswerWatchId) {
|
||||
@ -129,9 +129,9 @@ index f18ef41f2..89cef4d5d 100644
|
||||
this._label.set_text(question);
|
||||
|
||||
this._label.show();
|
||||
@@ -434,12 +452,31 @@ var AuthPrompt = new Lang.Class({
|
||||
@@ -427,6 +445,19 @@ var AuthPrompt = class {
|
||||
}
|
||||
},
|
||||
}
|
||||
|
||||
+ _onUserStoppedTypePreemptiveAnswer() {
|
||||
+ if (!this._preemptiveAnswerWatchId ||
|
||||
@ -144,13 +144,14 @@ index f18ef41f2..89cef4d5d 100644
|
||||
+
|
||||
+ this._entry.text = '';
|
||||
+ this.updateSensitivity(false);
|
||||
+ },
|
||||
+ }
|
||||
+
|
||||
reset() {
|
||||
let oldStatus = this.verificationStatus;
|
||||
this.verificationStatus = AuthPromptStatus.NOT_VERIFYING;
|
||||
this.cancelButton.reactive = true;
|
||||
@@ -434,6 +465,12 @@ var AuthPrompt = class {
|
||||
this.nextButton.label = _("Next");
|
||||
this._preemptiveAnswer = null;
|
||||
|
||||
+ if (this._preemptiveAnswerWatchId) {
|
||||
+ this._idleMonitor.remove_watch(this._preemptiveAnswerWatchId);
|
||||
@ -162,5 +163,5 @@ index f18ef41f2..89cef4d5d 100644
|
||||
this._userVerifier.cancel();
|
||||
|
||||
--
|
||||
2.20.1
|
||||
2.21.0
|
||||
|
||||
|
@ -1,4 +1,4 @@
|
||||
From 483ac09afb6503432e48bc30a57194a490ec98c9 Mon Sep 17 00:00:00 2001
|
||||
From 8ce91c85fe052d1a9f4fed0743bceae7d9654aa0 Mon Sep 17 00:00:00 2001
|
||||
From: Ray Strode <rstrode@redhat.com>
|
||||
Date: Mon, 28 Sep 2015 10:57:02 -0400
|
||||
Subject: [PATCH 1/3] smartcardManager: add way to detect if user logged using
|
||||
@ -16,28 +16,27 @@ This commit adds the necessary api to detect that case.
|
||||
1 file changed, 7 insertions(+)
|
||||
|
||||
diff --git a/js/misc/smartcardManager.js b/js/misc/smartcardManager.js
|
||||
index 60808b371..a9a748fb3 100644
|
||||
index fda782d1e..bb43c96e7 100644
|
||||
--- a/js/misc/smartcardManager.js
|
||||
+++ b/js/misc/smartcardManager.js
|
||||
@@ -112,6 +112,13 @@ var SmartcardManager = new Lang.Class({
|
||||
return false;
|
||||
|
||||
@@ -112,5 +112,12 @@ var SmartcardManager = class {
|
||||
return true;
|
||||
+ },
|
||||
+
|
||||
}
|
||||
|
||||
+ loggedInWithToken() {
|
||||
+ if (this._loginToken)
|
||||
+ return true;
|
||||
+
|
||||
+ return false;
|
||||
}
|
||||
|
||||
});
|
||||
+ }
|
||||
+
|
||||
};
|
||||
Signals.addSignalMethods(SmartcardManager.prototype);
|
||||
--
|
||||
2.20.1
|
||||
2.21.0
|
||||
|
||||
|
||||
From 5da6b6393ac89eaae91d2b250fb432c7e1cbe676 Mon Sep 17 00:00:00 2001
|
||||
From 6decf5560d309579760e10048533d3bd9bc56c3c Mon Sep 17 00:00:00 2001
|
||||
From: Ray Strode <rstrode@redhat.com>
|
||||
Date: Mon, 28 Sep 2015 19:56:53 -0400
|
||||
Subject: [PATCH 2/3] gdm: only unlock with smartcard, if smartcard used for
|
||||
@ -50,10 +49,10 @@ gets used for unlock, too.
|
||||
1 file changed, 5 insertions(+), 2 deletions(-)
|
||||
|
||||
diff --git a/js/gdm/util.js b/js/gdm/util.js
|
||||
index 261e1e433..3d6d69c10 100644
|
||||
index 2e9935250..2b80e1dd9 100644
|
||||
--- a/js/gdm/util.js
|
||||
+++ b/js/gdm/util.js
|
||||
@@ -134,7 +134,6 @@ var ShellUserVerifier = new Lang.Class({
|
||||
@@ -126,7 +126,6 @@ var ShellUserVerifier = class {
|
||||
this._settings = new Gio.Settings({ schema_id: LOGIN_SCREEN_SCHEMA });
|
||||
this._settings.connect('changed',
|
||||
this._updateDefaultService.bind(this));
|
||||
@ -61,7 +60,7 @@ index 261e1e433..3d6d69c10 100644
|
||||
|
||||
this._fprintManager = Fprint.FprintManager();
|
||||
this._smartcardManager = SmartcardManager.getSmartcardManager();
|
||||
@@ -146,6 +145,8 @@ var ShellUserVerifier = new Lang.Class({
|
||||
@@ -138,6 +137,8 @@ var ShellUserVerifier = class {
|
||||
this.smartcardDetected = false;
|
||||
this._checkForSmartcard();
|
||||
|
||||
@ -70,8 +69,8 @@ index 261e1e433..3d6d69c10 100644
|
||||
this._smartcardInsertedId = this._smartcardManager.connect('smartcard-inserted',
|
||||
this._checkForSmartcard.bind(this));
|
||||
this._smartcardRemovedId = this._smartcardManager.connect('smartcard-removed',
|
||||
@@ -412,7 +413,9 @@ var ShellUserVerifier = new Lang.Class({
|
||||
},
|
||||
@@ -407,7 +408,9 @@ var ShellUserVerifier = class {
|
||||
}
|
||||
|
||||
_updateDefaultService() {
|
||||
- if (this._settings.get_boolean(PASSWORD_AUTHENTICATION_KEY))
|
||||
@ -82,10 +81,10 @@ index 261e1e433..3d6d69c10 100644
|
||||
else if (this._settings.get_boolean(SMARTCARD_AUTHENTICATION_KEY))
|
||||
this._defaultService = SMARTCARD_SERVICE_NAME;
|
||||
--
|
||||
2.20.1
|
||||
2.21.0
|
||||
|
||||
|
||||
From 1d6de184a8bfbd54b9472eea822380b89f70509a Mon Sep 17 00:00:00 2001
|
||||
From dd844c98c3450dd1b21bcc580b51162c1b00ed2a Mon Sep 17 00:00:00 2001
|
||||
From: Ray Strode <rstrode@redhat.com>
|
||||
Date: Mon, 28 Sep 2015 19:57:36 -0400
|
||||
Subject: [PATCH 3/3] gdm: update default service when smartcard inserted
|
||||
@ -98,10 +97,10 @@ after we get a smartcard insertion event.
|
||||
1 file changed, 2 insertions(+)
|
||||
|
||||
diff --git a/js/gdm/util.js b/js/gdm/util.js
|
||||
index 3d6d69c10..f5f9d5e5d 100644
|
||||
index 2b80e1dd9..6e940d2ab 100644
|
||||
--- a/js/gdm/util.js
|
||||
+++ b/js/gdm/util.js
|
||||
@@ -335,6 +335,8 @@ var ShellUserVerifier = new Lang.Class({
|
||||
@@ -327,6 +327,8 @@ var ShellUserVerifier = class {
|
||||
else if (this._preemptingService == SMARTCARD_SERVICE_NAME)
|
||||
this._preemptingService = null;
|
||||
|
||||
@ -109,7 +108,7 @@ index 3d6d69c10..f5f9d5e5d 100644
|
||||
+
|
||||
this.emit('smartcard-status-changed');
|
||||
}
|
||||
},
|
||||
}
|
||||
--
|
||||
2.20.1
|
||||
2.21.0
|
||||
|
||||
|
@ -1,231 +0,0 @@
|
||||
From fe9d88cf790282811719ea3343831ce5923687a3 Mon Sep 17 00:00:00 2001
|
||||
From: =?UTF-8?q?Florian=20M=C3=BCllner?= <fmuellner@gnome.org>
|
||||
Date: Mon, 21 May 2018 21:21:05 +0200
|
||||
Subject: [PATCH 1/3] closeDialog: Disable unredirection while showing
|
||||
|
||||
The dialog won't be visible when unredirection is in place (for example
|
||||
while a fullscreen window is focused), so disable unredirection while
|
||||
the dialog is up.
|
||||
|
||||
https://gitlab.gnome.org/GNOME/gnome-shell/issues/298
|
||||
---
|
||||
js/ui/closeDialog.js | 4 ++++
|
||||
1 file changed, 4 insertions(+)
|
||||
|
||||
diff --git a/js/ui/closeDialog.js b/js/ui/closeDialog.js
|
||||
index aa0b5ceaf..821480a9c 100644
|
||||
--- a/js/ui/closeDialog.js
|
||||
+++ b/js/ui/closeDialog.js
|
||||
@@ -97,6 +97,8 @@ var CloseDialog = new Lang.Class({
|
||||
if (this._dialog != null)
|
||||
return;
|
||||
|
||||
+ Meta.disable_unredirect_for_screen(global.screen);
|
||||
+
|
||||
this._addWindowEffect();
|
||||
this._initDialog();
|
||||
|
||||
@@ -117,6 +119,8 @@ var CloseDialog = new Lang.Class({
|
||||
if (this._dialog == null)
|
||||
return;
|
||||
|
||||
+ Meta.enable_unredirect_for_screen(global.screen);
|
||||
+
|
||||
let dialog = this._dialog;
|
||||
this._dialog = null;
|
||||
this._removeWindowEffect();
|
||||
--
|
||||
2.20.1
|
||||
|
||||
|
||||
From 0ba4c8fc447338740199cf0250d888716a8181fd Mon Sep 17 00:00:00 2001
|
||||
From: =?UTF-8?q?Florian=20M=C3=BCllner?= <fmuellner@gnome.org>
|
||||
Date: Mon, 21 May 2018 23:12:35 +0200
|
||||
Subject: [PATCH 2/3] closeDialog: Periodically check for window to become
|
||||
responsive again
|
||||
|
||||
The close dialog for non-responding windows is closed automatically
|
||||
when we detect that the window is responding again. However as we
|
||||
currently only ping the window in response to certain user actions
|
||||
(like focusing the window or opening the window menu), this can
|
||||
easily go undetected.
|
||||
|
||||
Address this by periodically pinging the window while the close
|
||||
dialog is shown.
|
||||
|
||||
https://gitlab.gnome.org/GNOME/gnome-shell/issues/298
|
||||
---
|
||||
js/ui/closeDialog.js | 12 ++++++++++++
|
||||
1 file changed, 12 insertions(+)
|
||||
|
||||
diff --git a/js/ui/closeDialog.js b/js/ui/closeDialog.js
|
||||
index 821480a9c..7943880d8 100644
|
||||
--- a/js/ui/closeDialog.js
|
||||
+++ b/js/ui/closeDialog.js
|
||||
@@ -2,6 +2,7 @@
|
||||
|
||||
const Clutter = imports.gi.Clutter;
|
||||
const Gio = imports.gi.Gio;
|
||||
+const GLib = imports.gi.GLib;
|
||||
const GObject = imports.gi.GObject;
|
||||
const Lang = imports.lang;
|
||||
const Meta = imports.gi.Meta;
|
||||
@@ -13,6 +14,7 @@ const Tweener = imports.ui.tweener;
|
||||
|
||||
var FROZEN_WINDOW_BRIGHTNESS = -0.3
|
||||
var DIALOG_TRANSITION_TIME = 0.15
|
||||
+var ALIVE_TIMEOUT = 5000;
|
||||
|
||||
var CloseDialog = new Lang.Class({
|
||||
Name: 'CloseDialog',
|
||||
@@ -26,6 +28,7 @@ var CloseDialog = new Lang.Class({
|
||||
this.parent();
|
||||
this._window = window;
|
||||
this._dialog = null;
|
||||
+ this._timeoutId = 0;
|
||||
},
|
||||
|
||||
get window() {
|
||||
@@ -99,6 +102,12 @@ var CloseDialog = new Lang.Class({
|
||||
|
||||
Meta.disable_unredirect_for_screen(global.screen);
|
||||
|
||||
+ this._timeoutId = GLib.timeout_add(GLib.PRIORITY_DEFAULT, ALIVE_TIMEOUT,
|
||||
+ () => {
|
||||
+ this._window.check_alive(global.display.get_current_time_roundtrip());
|
||||
+ return GLib.SOURCE_CONTINUE;
|
||||
+ });
|
||||
+
|
||||
this._addWindowEffect();
|
||||
this._initDialog();
|
||||
|
||||
@@ -121,6 +130,9 @@ var CloseDialog = new Lang.Class({
|
||||
|
||||
Meta.enable_unredirect_for_screen(global.screen);
|
||||
|
||||
+ GLib.source_remove(this._timeoutId);
|
||||
+ this._timeoutId = 0;
|
||||
+
|
||||
let dialog = this._dialog;
|
||||
this._dialog = null;
|
||||
this._removeWindowEffect();
|
||||
--
|
||||
2.20.1
|
||||
|
||||
|
||||
From 7e41beb3fca2bf4809a852cbf6699669fff4cd6f Mon Sep 17 00:00:00 2001
|
||||
From: =?UTF-8?q?Florian=20M=C3=BCllner?= <fmuellner@gnome.org>
|
||||
Date: Tue, 4 Sep 2018 13:53:24 +0200
|
||||
Subject: [PATCH 3/3] closeDialog: Untrack chrome when window loses focus
|
||||
|
||||
On X11, reactive chrome must be added to the input region in order
|
||||
to work as expected. However that region works independently from
|
||||
any window stacking, with the result that the unresponsive-app dialog
|
||||
currently blocks all input in the "covered" area, even in windows
|
||||
stacked above the unresponsive window.
|
||||
|
||||
The correct fix would be to track the unobscured parts of the dialog
|
||||
and set the input region from that, but that's quite cumbersome. So
|
||||
instead, only track chrome when the corresponding window is focused
|
||||
(or the dialog itself of course).
|
||||
|
||||
https://gitlab.gnome.org/GNOME/gnome-shell/issues/273
|
||||
---
|
||||
js/ui/closeDialog.js | 52 +++++++++++++++++++++++++++++++++++++++++---
|
||||
1 file changed, 49 insertions(+), 3 deletions(-)
|
||||
|
||||
diff --git a/js/ui/closeDialog.js b/js/ui/closeDialog.js
|
||||
index 7943880d8..c4b033230 100644
|
||||
--- a/js/ui/closeDialog.js
|
||||
+++ b/js/ui/closeDialog.js
|
||||
@@ -28,7 +28,10 @@ var CloseDialog = new Lang.Class({
|
||||
this.parent();
|
||||
this._window = window;
|
||||
this._dialog = null;
|
||||
+ this._tracked = undefined;
|
||||
this._timeoutId = 0;
|
||||
+ this._windowFocusChangedId = 0;
|
||||
+ this._keyFocusChangedId = 0;
|
||||
},
|
||||
|
||||
get window() {
|
||||
@@ -96,6 +99,37 @@ var CloseDialog = new Lang.Class({
|
||||
this.response(Meta.CloseDialogResponse.FORCE_CLOSE);
|
||||
},
|
||||
|
||||
+ _onFocusChanged() {
|
||||
+ if (Meta.is_wayland_compositor())
|
||||
+ return;
|
||||
+
|
||||
+ let focusWindow = global.display.focus_window;
|
||||
+ let keyFocus = global.stage.key_focus;
|
||||
+
|
||||
+ let shouldTrack;
|
||||
+ if (focusWindow != null)
|
||||
+ shouldTrack = focusWindow == this._window;
|
||||
+ else
|
||||
+ shouldTrack = keyFocus && this._dialog.contains(keyFocus);
|
||||
+
|
||||
+ if (this._tracked === shouldTrack)
|
||||
+ return;
|
||||
+
|
||||
+ if (shouldTrack)
|
||||
+ Main.layoutManager.trackChrome(this._dialog,
|
||||
+ { affectsInputRegion: true });
|
||||
+ else
|
||||
+ Main.layoutManager.untrackChrome(this._dialog);
|
||||
+
|
||||
+ // The buttons are broken when they aren't added to the input region,
|
||||
+ // so disable them properly in that case
|
||||
+ this._dialog.buttonLayout.get_children().forEach(b => {
|
||||
+ b.reactive = shouldTrack;
|
||||
+ });
|
||||
+
|
||||
+ this._tracked = shouldTrack;
|
||||
+ },
|
||||
+
|
||||
vfunc_show() {
|
||||
if (this._dialog != null)
|
||||
return;
|
||||
@@ -108,6 +142,14 @@ var CloseDialog = new Lang.Class({
|
||||
return GLib.SOURCE_CONTINUE;
|
||||
});
|
||||
|
||||
+ this._windowFocusChangedId =
|
||||
+ global.display.connect('notify::focus-window',
|
||||
+ this._onFocusChanged.bind(this));
|
||||
+
|
||||
+ this._keyFocusChangedId =
|
||||
+ global.stage.connect('notify::key-focus',
|
||||
+ this._onFocusChanged.bind(this));
|
||||
+
|
||||
this._addWindowEffect();
|
||||
this._initDialog();
|
||||
|
||||
@@ -118,9 +160,7 @@ var CloseDialog = new Lang.Class({
|
||||
{ scale_y: 1,
|
||||
transition: 'linear',
|
||||
time: DIALOG_TRANSITION_TIME,
|
||||
- onComplete: () => {
|
||||
- Main.layoutManager.trackChrome(this._dialog, { affectsInputRegion: true });
|
||||
- }
|
||||
+ onComplete: this._onFocusChanged.bind(this)
|
||||
});
|
||||
},
|
||||
|
||||
@@ -133,6 +173,12 @@ var CloseDialog = new Lang.Class({
|
||||
GLib.source_remove(this._timeoutId);
|
||||
this._timeoutId = 0;
|
||||
|
||||
+ global.display.disconnect(this._windowFocusChangedId)
|
||||
+ this._windowFocusChangedId = 0;
|
||||
+
|
||||
+ global.stage.disconnect(this._keyFocusChangedId);
|
||||
+ this._keyFocusChangedId = 0;
|
||||
+
|
||||
let dialog = this._dialog;
|
||||
this._dialog = null;
|
||||
this._removeWindowEffect();
|
||||
--
|
||||
2.20.1
|
||||
|
@ -1,403 +1,7 @@
|
||||
From 1c838205dcd99a0a2a901f7449197da3df7b3954 Mon Sep 17 00:00:00 2001
|
||||
From: =?UTF-8?q?Marco=20Trevisan=20=28Trevi=C3=B1o=29?= <mail@3v1n0.net>
|
||||
Date: Tue, 5 Dec 2017 22:41:17 +0100
|
||||
Subject: [PATCH 1/6] dnd: Nullify _dragActor after we've destroyed it, and
|
||||
avoid invalid access
|
||||
|
||||
We need to avoid that we use the _dragActor instance after that it has
|
||||
been destroyed or we'll get errors. We now set it to null when this
|
||||
happens, protecting any access to that.
|
||||
|
||||
Add a DragState enum-like object to keep track of the state
|
||||
instead of using booleans.
|
||||
|
||||
Remove duplicated handler on 'destroy' and just use a generic one.
|
||||
|
||||
https://bugzilla.gnome.org/show_bug.cgi?id=791233
|
||||
---
|
||||
js/ui/dnd.js | 65 +++++++++++++++++++++++++++++++---------------------
|
||||
1 file changed, 39 insertions(+), 26 deletions(-)
|
||||
|
||||
diff --git a/js/ui/dnd.js b/js/ui/dnd.js
|
||||
index a38607c24..431c60d6c 100644
|
||||
--- a/js/ui/dnd.js
|
||||
+++ b/js/ui/dnd.js
|
||||
@@ -27,6 +27,12 @@ var DragMotionResult = {
|
||||
CONTINUE: 3
|
||||
};
|
||||
|
||||
+var DragState = {
|
||||
+ INIT: 0,
|
||||
+ DRAGGING: 1,
|
||||
+ CANCELLED: 2,
|
||||
+};
|
||||
+
|
||||
var DRAG_CURSOR_MAP = {
|
||||
0: Meta.Cursor.DND_UNSUPPORTED_TARGET,
|
||||
1: Meta.Cursor.DND_COPY,
|
||||
@@ -78,6 +84,8 @@ var _Draggable = new Lang.Class({
|
||||
dragActorOpacity: undefined });
|
||||
|
||||
this.actor = actor;
|
||||
+ this._dragState = DragState.INIT;
|
||||
+
|
||||
if (!params.manualMode) {
|
||||
this.actor.connect('button-press-event',
|
||||
this._onButtonPress.bind(this));
|
||||
@@ -88,7 +96,7 @@ var _Draggable = new Lang.Class({
|
||||
this.actor.connect('destroy', () => {
|
||||
this._actorDestroyed = true;
|
||||
|
||||
- if (this._dragInProgress && this._dragCancellable)
|
||||
+ if (this._dragState == DragState.DRAGGING && this._dragCancellable)
|
||||
this._cancelDrag(global.get_current_time());
|
||||
this.disconnectAll();
|
||||
});
|
||||
@@ -100,7 +108,6 @@ var _Draggable = new Lang.Class({
|
||||
this._dragActorOpacity = params.dragActorOpacity;
|
||||
|
||||
this._buttonDown = false; // The mouse button has been pressed and has not yet been released.
|
||||
- this._dragInProgress = false; // The drag has been started, and has not been dropped or cancelled yet.
|
||||
this._animationInProgress = false; // The drag is over and the item is in the process of animating to its original position (snapping back or reverting).
|
||||
this._dragCancellable = true;
|
||||
|
||||
@@ -206,9 +213,10 @@ var _Draggable = new Lang.Class({
|
||||
(event.type() == Clutter.EventType.TOUCH_END &&
|
||||
global.display.is_pointer_emulating_sequence(event.get_event_sequence()))) {
|
||||
this._buttonDown = false;
|
||||
- if (this._dragInProgress) {
|
||||
+ if (this._dragState == DragState.DRAGGING) {
|
||||
return this._dragActorDropped(event);
|
||||
- } else if (this._dragActor != null && !this._animationInProgress) {
|
||||
+ } else if ((this._dragActor != null || this._dragState == DragState.CANCELLED) &&
|
||||
+ !this._animationInProgress) {
|
||||
// Drag must have been cancelled with Esc.
|
||||
this._dragComplete();
|
||||
return Clutter.EVENT_STOP;
|
||||
@@ -222,14 +230,14 @@ var _Draggable = new Lang.Class({
|
||||
} else if (event.type() == Clutter.EventType.MOTION ||
|
||||
(event.type() == Clutter.EventType.TOUCH_UPDATE &&
|
||||
global.display.is_pointer_emulating_sequence(event.get_event_sequence()))) {
|
||||
- if (this._dragInProgress) {
|
||||
+ if (this._dragActor && this._dragState == DragState.DRAGGING) {
|
||||
return this._updateDragPosition(event);
|
||||
- } else if (this._dragActor == null) {
|
||||
+ } else if (this._dragActor == null && this._dragState != DragState.CANCELLED) {
|
||||
return this._maybeStartDrag(event);
|
||||
}
|
||||
// We intercept KEY_PRESS event so that we can process Esc key press to cancel
|
||||
// dragging and ignore all other key presses.
|
||||
- } else if (event.type() == Clutter.EventType.KEY_PRESS && this._dragInProgress) {
|
||||
+ } else if (event.type() == Clutter.EventType.KEY_PRESS && this._dragState == DragState.DRAGGING) {
|
||||
let symbol = event.get_key_symbol();
|
||||
if (symbol == Clutter.Escape) {
|
||||
this._cancelDrag(event.get_time());
|
||||
@@ -265,7 +273,7 @@ var _Draggable = new Lang.Class({
|
||||
*/
|
||||
startDrag(stageX, stageY, time, sequence) {
|
||||
currentDraggable = this;
|
||||
- this._dragInProgress = true;
|
||||
+ this._dragState = DragState.DRAGGING;
|
||||
|
||||
// Special-case St.Button: the pointer grab messes with the internal
|
||||
// state, so force a reset to a reasonable state here
|
||||
@@ -342,6 +350,13 @@ var _Draggable = new Lang.Class({
|
||||
Shell.util_set_hidden_from_pick(this._dragActor, true);
|
||||
}
|
||||
|
||||
+ this._dragActorDestroyId = this._dragActor.connect('destroy', () => {
|
||||
+ // Cancel ongoing animation (if any)
|
||||
+ this._finishAnimation();
|
||||
+
|
||||
+ this._dragActor = null;
|
||||
+ this._dragState = DragState.CANCELLED;
|
||||
+ });
|
||||
this._dragOrigOpacity = this._dragActor.opacity;
|
||||
if (this._dragActorOpacity != undefined)
|
||||
this._dragActor.opacity = this._dragActorOpacity;
|
||||
@@ -500,7 +515,7 @@ var _Draggable = new Lang.Class({
|
||||
event.get_time())) {
|
||||
// If it accepted the drop without taking the actor,
|
||||
// handle it ourselves.
|
||||
- if (this._dragActor.get_parent() == Main.uiGroup) {
|
||||
+ if (this._dragActor && this._dragActor.get_parent() == Main.uiGroup) {
|
||||
if (this._restoreOnSuccess) {
|
||||
this._restoreDragActor(event.get_time());
|
||||
return true;
|
||||
@@ -508,7 +523,7 @@ var _Draggable = new Lang.Class({
|
||||
this._dragActor.destroy();
|
||||
}
|
||||
|
||||
- this._dragInProgress = false;
|
||||
+ this._dragState = DragState.INIT;
|
||||
global.screen.set_cursor(Meta.Cursor.DEFAULT);
|
||||
this.emit('drag-end', event.get_time(), true);
|
||||
this._dragComplete();
|
||||
@@ -557,20 +572,22 @@ var _Draggable = new Lang.Class({
|
||||
|
||||
_cancelDrag(eventTime) {
|
||||
this.emit('drag-cancelled', eventTime);
|
||||
- this._dragInProgress = false;
|
||||
- let [snapBackX, snapBackY, snapBackScale] = this._getRestoreLocation();
|
||||
+ let wasCancelled = (this._dragState == DragState.CANCELLED);
|
||||
+ this._dragState = DragState.CANCELLED;
|
||||
|
||||
- if (this._actorDestroyed) {
|
||||
+ if (this._actorDestroyed || wasCancelled) {
|
||||
global.screen.set_cursor(Meta.Cursor.DEFAULT);
|
||||
if (!this._buttonDown)
|
||||
this._dragComplete();
|
||||
this.emit('drag-end', eventTime, false);
|
||||
- if (!this._dragOrigParent)
|
||||
+ if (!this._dragOrigParent && this._dragActor)
|
||||
this._dragActor.destroy();
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
+ let [snapBackX, snapBackY, snapBackScale] = this._getRestoreLocation();
|
||||
+
|
||||
this._animateDragEnd(eventTime,
|
||||
{ x: snapBackX,
|
||||
y: snapBackY,
|
||||
@@ -581,7 +598,7 @@ var _Draggable = new Lang.Class({
|
||||
},
|
||||
|
||||
_restoreDragActor(eventTime) {
|
||||
- this._dragInProgress = false;
|
||||
+ this._dragState = DragState.INIT;
|
||||
let [restoreX, restoreY, restoreScale] = this._getRestoreLocation();
|
||||
|
||||
// fade the actor back in at its original location
|
||||
@@ -596,12 +613,6 @@ var _Draggable = new Lang.Class({
|
||||
_animateDragEnd(eventTime, params) {
|
||||
this._animationInProgress = true;
|
||||
|
||||
- // finish animation if the actor gets destroyed
|
||||
- // during it
|
||||
- this._dragActorDestroyId =
|
||||
- this._dragActor.connect('destroy',
|
||||
- this._finishAnimation.bind(this));
|
||||
-
|
||||
params['opacity'] = this._dragOrigOpacity;
|
||||
params['transition'] = 'easeOutQuad';
|
||||
params['onComplete'] = this._onAnimationComplete;
|
||||
@@ -624,9 +635,6 @@ var _Draggable = new Lang.Class({
|
||||
},
|
||||
|
||||
_onAnimationComplete(dragActor, eventTime) {
|
||||
- dragActor.disconnect(this._dragActorDestroyId);
|
||||
- this._dragActorDestroyId = 0;
|
||||
-
|
||||
if (this._dragOrigParent) {
|
||||
Main.uiGroup.remove_child(this._dragActor);
|
||||
this._dragOrigParent.add_actor(this._dragActor);
|
||||
@@ -641,7 +649,7 @@ var _Draggable = new Lang.Class({
|
||||
},
|
||||
|
||||
_dragComplete() {
|
||||
- if (!this._actorDestroyed)
|
||||
+ if (!this._actorDestroyed && this._dragActor)
|
||||
Shell.util_set_hidden_from_pick(this._dragActor, false);
|
||||
|
||||
this._ungrabEvents();
|
||||
@@ -652,7 +660,12 @@ var _Draggable = new Lang.Class({
|
||||
this._updateHoverId = 0;
|
||||
}
|
||||
|
||||
- this._dragActor = undefined;
|
||||
+ if (this._dragActor) {
|
||||
+ this._dragActor.disconnect(this._dragActorDestroyId);
|
||||
+ this._dragActor = null;
|
||||
+ }
|
||||
+
|
||||
+ this._dragState = DragState.INIT;
|
||||
currentDraggable = null;
|
||||
}
|
||||
});
|
||||
--
|
||||
2.20.1
|
||||
|
||||
|
||||
From 98fd633f3b124f72f71aa5da38df9c69121fd4ed Mon Sep 17 00:00:00 2001
|
||||
From: =?UTF-8?q?Jonas=20=C3=85dahl?= <jadahl@gmail.com>
|
||||
Date: Thu, 3 Jan 2019 11:53:13 +0100
|
||||
Subject: [PATCH 2/6] dnd: Repick target actor if destroyed mid iteration
|
||||
|
||||
The picked target actor may be destroyed (e.g. hover style change
|
||||
resulting in the ClutterTexture to be destroyed). If we don't handle
|
||||
this, GJS will abort when it sees the exception caused by Javascript
|
||||
code trying to access the destroyed target actor.
|
||||
|
||||
To handle it, listen on the 'destroy' signal on the target actor, and
|
||||
repick, so a valid actor is passed to the next motion callback.
|
||||
|
||||
Fixes: https://gitlab.gnome.org/GNOME/gnome-shell/issues/632
|
||||
---
|
||||
js/ui/dnd.js | 22 ++++++++++++++++++++--
|
||||
1 file changed, 20 insertions(+), 2 deletions(-)
|
||||
|
||||
diff --git a/js/ui/dnd.js b/js/ui/dnd.js
|
||||
index 431c60d6c..9e961a186 100644
|
||||
--- a/js/ui/dnd.js
|
||||
+++ b/js/ui/dnd.js
|
||||
@@ -411,10 +411,15 @@ var _Draggable = new Lang.Class({
|
||||
return true;
|
||||
},
|
||||
|
||||
+ _pickTargetActor() {
|
||||
+ return this._dragActor.get_stage().get_actor_at_pos(Clutter.PickMode.ALL,
|
||||
+ this._dragX, this._dragY);
|
||||
+ },
|
||||
+
|
||||
_updateDragHover() {
|
||||
this._updateHoverId = 0;
|
||||
- let target = this._dragActor.get_stage().get_actor_at_pos(Clutter.PickMode.ALL,
|
||||
- this._dragX, this._dragY);
|
||||
+ let target = this._pickTargetActor();
|
||||
+
|
||||
let dragEvent = {
|
||||
x: this._dragX,
|
||||
y: this._dragY,
|
||||
@@ -422,6 +427,18 @@ var _Draggable = new Lang.Class({
|
||||
source: this.actor._delegate,
|
||||
targetActor: target
|
||||
};
|
||||
+
|
||||
+ let targetActorDestroyHandlerId;
|
||||
+ let handleTargetActorDestroyClosure;
|
||||
+ handleTargetActorDestroyClosure = () => {
|
||||
+ target = this._pickTargetActor();
|
||||
+ dragEvent.targetActor = target;
|
||||
+ targetActorDestroyHandlerId =
|
||||
+ target.connect('destroy', handleTargetActorDestroyClosure);
|
||||
+ };
|
||||
+ targetActorDestroyHandlerId =
|
||||
+ target.connect('destroy', handleTargetActorDestroyClosure);
|
||||
+
|
||||
for (let i = 0; i < dragMonitors.length; i++) {
|
||||
let motionFunc = dragMonitors[i].dragMotion;
|
||||
if (motionFunc) {
|
||||
@@ -432,6 +449,7 @@ var _Draggable = new Lang.Class({
|
||||
}
|
||||
}
|
||||
}
|
||||
+ dragEvent.targetActor.disconnect(targetActorDestroyHandlerId);
|
||||
|
||||
while (target) {
|
||||
if (target._delegate && target._delegate.handleDragOver) {
|
||||
--
|
||||
2.20.1
|
||||
|
||||
|
||||
From 2dfae7213f0d3849dfcc38bb2fbaeaf80d4e8b19 Mon Sep 17 00:00:00 2001
|
||||
From: =?UTF-8?q?Marco=20Trevisan=20=28Trevi=C3=B1o=29?= <mail@3v1n0.net>
|
||||
Date: Wed, 4 Jul 2018 15:56:25 +0200
|
||||
Subject: [PATCH 3/6] messageList: stop syncing if closeButton has been
|
||||
destroyed
|
||||
|
||||
The _sync function for Message only updates the close button visibility,
|
||||
so we can safely stop doing that if the close button get get destroyed earlier
|
||||
(as it happens when clicking on it).
|
||||
|
||||
https://bugzilla.gnome.org/show_bug.cgi?id=791233
|
||||
---
|
||||
js/ui/messageList.js | 3 ++-
|
||||
1 file changed, 2 insertions(+), 1 deletion(-)
|
||||
|
||||
diff --git a/js/ui/messageList.js b/js/ui/messageList.js
|
||||
index aff201ed6..2d397c1d7 100644
|
||||
--- a/js/ui/messageList.js
|
||||
+++ b/js/ui/messageList.js
|
||||
@@ -362,7 +362,8 @@ var Message = new Lang.Class({
|
||||
this.setBody(body);
|
||||
|
||||
this._closeButton.connect('clicked', this.close.bind(this));
|
||||
- this.actor.connect('notify::hover', this._sync.bind(this));
|
||||
+ let actorHoverId = this.actor.connect('notify::hover', this._sync.bind(this));
|
||||
+ this._closeButton.connect('destroy', this.actor.disconnect.bind(this.actor, actorHoverId));
|
||||
this.actor.connect('clicked', this._onClicked.bind(this));
|
||||
this.actor.connect('destroy', this._onDestroy.bind(this));
|
||||
this._sync();
|
||||
--
|
||||
2.20.1
|
||||
|
||||
|
||||
From 41bde330384ba7021c96ea3d4575bfa12295dff1 Mon Sep 17 00:00:00 2001
|
||||
From: =?UTF-8?q?Marco=20Trevisan=20=28Trevi=C3=B1o=29?= <mail@3v1n0.net>
|
||||
Date: Wed, 4 Jul 2018 16:55:28 +0200
|
||||
Subject: [PATCH 4/6] automountManager: remove allowAutorun expire timeout on
|
||||
volume removal
|
||||
|
||||
If the volume is removed before AUTORUN_EXPIRE_TIMEOUT_SECS seconds, we can stop
|
||||
the timeout earlier as there's nothing to unset, while the volume instance
|
||||
won't be valid anymore.
|
||||
|
||||
https://bugzilla.gnome.org/show_bug.cgi?id=791233
|
||||
---
|
||||
js/ui/components/automountManager.js | 6 ++++++
|
||||
1 file changed, 6 insertions(+)
|
||||
|
||||
diff --git a/js/ui/components/automountManager.js b/js/ui/components/automountManager.js
|
||||
index 2d8f3f8fb..a6cd85792 100644
|
||||
--- a/js/ui/components/automountManager.js
|
||||
+++ b/js/ui/components/automountManager.js
|
||||
@@ -210,6 +210,10 @@ var AutomountManager = new Lang.Class({
|
||||
},
|
||||
|
||||
_onVolumeRemoved(monitor, volume) {
|
||||
+ if (volume._allowAutorunExpireId && volume._allowAutorunExpireId > 0) {
|
||||
+ Mainloop.source_remove(volume._allowAutorunExpireId);
|
||||
+ delete volume._allowAutorunExpireId;
|
||||
+ }
|
||||
this._volumeQueue =
|
||||
this._volumeQueue.filter(element => (element != volume));
|
||||
},
|
||||
@@ -234,8 +238,10 @@ var AutomountManager = new Lang.Class({
|
||||
_allowAutorunExpire(volume) {
|
||||
let id = Mainloop.timeout_add_seconds(AUTORUN_EXPIRE_TIMEOUT_SECS, () => {
|
||||
volume.allowAutorun = false;
|
||||
+ delete volume._allowAutorunExpireId;
|
||||
return GLib.SOURCE_REMOVE;
|
||||
});
|
||||
+ volume._allowAutorunExpireId = id;
|
||||
GLib.Source.set_name_by_id(id, '[gnome-shell] volume.allowAutorun');
|
||||
}
|
||||
});
|
||||
--
|
||||
2.20.1
|
||||
|
||||
|
||||
From f0d608cea903538683b2eaafadbdefe7ff41475e Mon Sep 17 00:00:00 2001
|
||||
From: =?UTF-8?q?Florian=20M=C3=BCllner?= <fmuellner@gnome.org>
|
||||
Date: Mon, 9 Jul 2018 13:31:26 +0200
|
||||
Subject: [PATCH 5/6] calendar: chain up to parent on _onDestroy
|
||||
|
||||
---
|
||||
js/ui/calendar.js | 2 ++
|
||||
1 file changed, 2 insertions(+)
|
||||
|
||||
diff --git a/js/ui/calendar.js b/js/ui/calendar.js
|
||||
index a46017ad0..65133d9f7 100644
|
||||
--- a/js/ui/calendar.js
|
||||
+++ b/js/ui/calendar.js
|
||||
@@ -802,6 +802,8 @@ var NotificationMessage = new Lang.Class({
|
||||
},
|
||||
|
||||
_onDestroy() {
|
||||
+ this.parent();
|
||||
+
|
||||
if (this._updatedId)
|
||||
this.notification.disconnect(this._updatedId);
|
||||
this._updatedId = 0;
|
||||
--
|
||||
2.20.1
|
||||
|
||||
|
||||
From dc75a4e785e5f19f61bfd8f58e079c0bdfd0fca8 Mon Sep 17 00:00:00 2001
|
||||
From 76eebb42ed4c76970a9debfc0cd41537923eccde Mon Sep 17 00:00:00 2001
|
||||
From: =?UTF-8?q?Marco=20Trevisan=20=28Trevi=C3=B1o=29?= <mail@3v1n0.net>
|
||||
Date: Tue, 5 Dec 2017 02:41:50 +0100
|
||||
Subject: [PATCH 6/6] tweener: Save handlers on target and remove them on
|
||||
Subject: [PATCH 1/2] tweener: Save handlers on target and remove them on
|
||||
destroy
|
||||
|
||||
Saving handlers we had using the wrapper as a property of the object and delete
|
||||
@ -411,10 +15,10 @@ https://bugzilla.gnome.org/show_bug.cgi?id=791233
|
||||
1 file changed, 50 insertions(+), 13 deletions(-)
|
||||
|
||||
diff --git a/js/ui/tweener.js b/js/ui/tweener.js
|
||||
index 1a85e2fb1..22818ba4b 100644
|
||||
index bb9ea557c..c04cede25 100644
|
||||
--- a/js/ui/tweener.js
|
||||
+++ b/js/ui/tweener.js
|
||||
@@ -69,30 +69,67 @@ function _getTweenState(target) {
|
||||
@@ -63,30 +63,67 @@ function _getTweenState(target) {
|
||||
return target.__ShellTweenerState;
|
||||
}
|
||||
|
||||
@ -496,5 +100,125 @@ index 1a85e2fb1..22818ba4b 100644
|
||||
|
||||
function _actorDestroyed(target) {
|
||||
--
|
||||
2.20.1
|
||||
2.21.0
|
||||
|
||||
|
||||
From 730f6f7d708a0cbcfcc75e4a1fba8512ac7c4c82 Mon Sep 17 00:00:00 2001
|
||||
From: Cosimo Cecchi <cosimo@endlessm.com>
|
||||
Date: Sun, 26 May 2019 08:31:07 -0700
|
||||
Subject: [PATCH 2/2] windowAttentionHandler: disconnect signals before
|
||||
destruction
|
||||
MIME-Version: 1.0
|
||||
Content-Type: text/plain; charset=UTF-8
|
||||
Content-Transfer-Encoding: 8bit
|
||||
|
||||
The 'destroy' signal is emitted at the end of the destroy() method.
|
||||
However the implementation of destroy() can end up emitting one of the
|
||||
signals we connect to on the window, causing us to re-enter destroy
|
||||
from its callback.
|
||||
That will in turn lead to some objects getting disposed twice, which
|
||||
produces a stack trace like the following one.
|
||||
|
||||
This commit fixes the issue by overriding the destroy() method instead
|
||||
of connecting to the signal, which allows us to disconnect the signal
|
||||
handlers from the window at an earlier time and avoid re-entrancy.
|
||||
|
||||
--
|
||||
|
||||
gnome-shell[1082]: Object Gio.Settings (0x7f0af8143f00), has been already deallocated — impossible to access it. This might be caused by the object having been destroyed from C code using something such as destroy(), dispose(), or remove() vfuncs.
|
||||
org.gnome.Shell.desktop[1082]: == Stack trace for context 0x5627f7d1e220 ==
|
||||
org.gnome.Shell.desktop[1082]: #0 5627f9e801a8 i resource:///org/gnome/shell/ui/messageTray.js:238 (7f0aefa9eca0 @ 22)
|
||||
org.gnome.Shell.desktop[1082]: #1 5627f9e80108 i resource:///org/gnome/shell/ui/messageTray.js:802 (7f0aefaa2ee0 @ 28)
|
||||
org.gnome.Shell.desktop[1082]: #2 5627f9e80070 i resource:///org/gnome/shell/ui/windowAttentionHandler.js:79 (7f0aef7b29d0 @ 62)
|
||||
org.gnome.Shell.desktop[1082]: #3 7fffa69fbfc0 b self-hosted:979 (7f0aefa515e0 @ 440)
|
||||
org.gnome.Shell.desktop[1082]: #4 5627f9e7ffe0 i resource:///org/gnome/shell/ui/messageTray.js:121 (7f0aefa9e1f0 @ 71)
|
||||
org.gnome.Shell.desktop[1082]: #5 5627f9e7ff38 i resource:///org/gnome/shell/ui/messageTray.js:1408 (7f0aefaa58b0 @ 22)
|
||||
org.gnome.Shell.desktop[1082]: #6 5627f9e7fe80 i resource:///org/gnome/shell/ui/messageTray.js:1237 (7f0aefaa51f0 @ 729)
|
||||
org.gnome.Shell.desktop[1082]: #7 5627f9e7fde8 i resource:///org/gnome/shell/ui/messageTray.js:1055 (7f0aefaa3d30 @ 124)
|
||||
org.gnome.Shell.desktop[1082]: #8 7fffa69ff8e0 b self-hosted:979 (7f0aefa515e0 @ 440)
|
||||
org.gnome.Shell.desktop[1082]: #9 7fffa69ff9d0 b resource:///org/gnome/gjs/modules/signals.js:142 (7f0aefccb670 @ 386)
|
||||
org.gnome.Shell.desktop[1082]: #10 5627f9e7fd58 i resource:///org/gnome/shell/ui/messageTray.js:479 (7f0aefaa0940 @ 50)
|
||||
org.gnome.Shell.desktop[1082]: #11 5627f9e7fcb8 i resource:///org/gnome/shell/ui/messageTray.js:808 (7f0aefaa2ee0 @ 99)
|
||||
org.gnome.Shell.desktop[1082]: #12 5627f9e7fc28 i resource:///org/gnome/shell/ui/windowAttentionHandler.js:69 (7f0aef7b28b0 @ 13)
|
||||
org.gnome.Shell.desktop[1082]: #13 5627f9e7fb80 i resource:///org/gnome/shell/ui/main.js:566 (7f0aefcd8820 @ 216)
|
||||
org.gnome.Shell.desktop[1082]: #14 5627f9e7fad0 i resource:///org/gnome/shell/ui/windowAttentionHandler.js:103 (7f0aef7b2c10 @ 27)
|
||||
org.gnome.Shell.desktop[1082]: #15 5627f9e7fa58 i resource:///org/gnome/shell/ui/windowAttentionHandler.js:43 (7f0aef7b2700 @ 17)
|
||||
org.gnome.Shell.desktop[1082]: #16 7fffa6a03350 b resource:///org/gnome/gjs/modules/signals.js:142 (7f0aefccb670 @ 386)
|
||||
org.gnome.Shell.desktop[1082]: #17 5627f9e7f9d0 i resource:///org/gnome/shell/ui/messageTray.js:471 (7f0aefaa08b0 @ 22)
|
||||
org.gnome.Shell.desktop[1082]: #18 5627f9e7f950 i resource:///org/gnome/shell/ui/calendar.js:752 (7f0aefaabdc0 @ 22)
|
||||
org.gnome.Shell.desktop[1082]: #19 7fffa6a048f0 b self-hosted:979 (7f0aefa515e0 @ 440)
|
||||
org.gnome.Shell.desktop[1082]: == Stack trace for context 0x5627f7d1e220 ==
|
||||
org.gnome.Shell.desktop[1082]: #0 5627f9e801a8 i resource:///org/gnome/shell/ui/messageTray.js:239 (7f0aefa9eca0 @ 42)
|
||||
org.gnome.Shell.desktop[1082]: #1 5627f9e80108 i resource:///org/gnome/shell/ui/messageTray.js:802 (7f0aefaa2ee0 @ 28)
|
||||
org.gnome.Shell.desktop[1082]: #2 5627f9e80070 i resource:///org/gnome/shell/ui/windowAttentionHandler.js:79 (7f0aef7b29d0 @ 62)
|
||||
org.gnome.Shell.desktop[1082]: #3 7fffa69fbfc0 b self-hosted:979 (7f0aefa515e0 @ 440)
|
||||
org.gnome.Shell.desktop[1082]: #4 5627f9e7ffe0 i resource:///org/gnome/shell/ui/messageTray.js:121 (7f0aefa9e1f0 @ 71)
|
||||
org.gnome.Shell.desktop[1082]: #5 5627f9e7ff38 i resource:///org/gnome/shell/ui/messageTray.js:1408 (7f0aefaa58b0 @ 22)
|
||||
org.gnome.Shell.desktop[1082]: #6 5627f9e7fe80 i resource:///org/gnome/shell/ui/messageTray.js:1237 (7f0aefaa51f0 @ 729)
|
||||
org.gnome.Shell.desktop[1082]: #7 5627f9e7fde8 i resource:///org/gnome/shell/ui/messageTray.js:1055 (7f0aefaa3d30 @ 124)
|
||||
org.gnome.Shell.desktop[1082]: #8 7fffa69ff8e0 b self-hosted:979 (7f0aefa515e0 @ 440)
|
||||
org.gnome.Shell.desktop[1082]: #9 7fffa69ff9d0 b resource:///org/gnome/gjs/modules/signals.js:142 (7f0aefccb670 @ 386)
|
||||
org.gnome.Shell.desktop[1082]: #10 5627f9e7fd58 i resource:///org/gnome/shell/ui/messageTray.js:479 (7f0aefaa0940 @ 50)
|
||||
org.gnome.Shell.desktop[1082]: #11 5627f9e7fcb8 i resource:///org/gnome/shell/ui/messageTray.js:808 (7f0aefaa2ee0 @ 99)
|
||||
org.gnome.Shell.desktop[1082]: #12 5627f9e7fc28 i resource:///org/gnome/shell/ui/windowAttentionHandler.js:69 (7f0aef7b28b0 @ 13)
|
||||
org.gnome.Shell.desktop[1082]: #13 5627f9e7fb80 i resource:///org/gnome/shell/ui/main.js:566 (7f0aefcd8820 @ 216)
|
||||
org.gnome.Shell.desktop[1082]: #14 5627f9e7fad0 i resource:///org/gnome/shell/ui/windowAttentionHandler.js:103 (7f0aef7b2c10 @ 27)
|
||||
org.gnome.Shell.desktop[1082]: #15 5627f9e7fa58 i resource:///org/gnome/shell/ui/windowAttentionHandler.js:43 (7f0aef7b2700 @ 17)
|
||||
org.gnome.Shell.desktop[1082]: #16 7fffa6a03350 b resource:///org/gnome/gjs/modules/signals.js:142 (7f0aefccb670 @ 386)
|
||||
org.gnome.Shell.desktop[1082]: #17 5627f9e7f9d0 i resource:///org/gnome/shell/ui/messageTray.js:471 (7f0aefaa08b0 @ 22)
|
||||
org.gnome.Shell.desktop[1082]: #18 5627f9e7f950 i resource:///org/gnome/shell/ui/calendar.js:752 (7f0aefaabdc0 @ 22)
|
||||
org.gnome.Shell.desktop[1082]: #19 7fffa6a048f0 b self-hosted:979 (7f0aefa515e0 @ 440)
|
||||
gnome-shell[1082]: g_object_run_dispose: assertion 'G_IS_OBJECT (object)' failed
|
||||
gnome-shell[1082]: Object Gio.Settings (0x7f0af8161750), has been already deallocated — impossible to access it. This might be caused by the object having been destroyed from C code using something such as destroy(), dispose(), or remove() vfuncs.
|
||||
gnome-shell[1082]: g_object_run_dispose: assertion 'G_IS_OBJECT (object)' failed
|
||||
|
||||
https://gitlab.gnome.org/GNOME/gnome-shell/merge_requests/555
|
||||
---
|
||||
js/ui/windowAttentionHandler.js | 17 ++++++++---------
|
||||
1 file changed, 8 insertions(+), 9 deletions(-)
|
||||
|
||||
diff --git a/js/ui/windowAttentionHandler.js b/js/ui/windowAttentionHandler.js
|
||||
index abdb8a444..a9a7111ba 100644
|
||||
--- a/js/ui/windowAttentionHandler.js
|
||||
+++ b/js/ui/windowAttentionHandler.js
|
||||
@@ -69,8 +69,6 @@ var Source = class WindowAttentionSource extends MessageTray.Source {
|
||||
() => { this.destroy(); }));
|
||||
this.signalIDs.push(this._window.connect('unmanaged',
|
||||
() => { this.destroy(); }));
|
||||
-
|
||||
- this.connect('destroy', this._onDestroy.bind(this));
|
||||
}
|
||||
|
||||
_sync() {
|
||||
@@ -79,13 +77,6 @@ var Source = class WindowAttentionSource extends MessageTray.Source {
|
||||
this.destroy();
|
||||
}
|
||||
|
||||
- _onDestroy() {
|
||||
- for(let i = 0; i < this.signalIDs.length; i++) {
|
||||
- this._window.disconnect(this.signalIDs[i]);
|
||||
- }
|
||||
- this.signalIDs = [];
|
||||
- }
|
||||
-
|
||||
_createPolicy() {
|
||||
if (this._app && this._app.get_app_info()) {
|
||||
let id = this._app.get_id().replace(/\.desktop$/,'');
|
||||
@@ -99,6 +90,14 @@ var Source = class WindowAttentionSource extends MessageTray.Source {
|
||||
return this._app.create_icon_texture(size);
|
||||
}
|
||||
|
||||
+ destroy(params) {
|
||||
+ for (let i = 0; i < this.signalIDs.length; i++)
|
||||
+ this._window.disconnect(this.signalIDs[i]);
|
||||
+ this.signalIDs = [];
|
||||
+
|
||||
+ super.destroy(params);
|
||||
+ }
|
||||
+
|
||||
open() {
|
||||
Main.activateWindow(this._window);
|
||||
}
|
||||
--
|
||||
2.21.0
|
||||
|
||||
|
@ -1,6 +1,18 @@
|
||||
--- gnome-shell-3.13.90/data/org.gnome.shell.gschema.xml.in.firefox 2014-08-20 20:28:07.601133033 +0200
|
||||
+++ gnome-shell-3.13.90/data/org.gnome.shell.gschema.xml.in 2014-08-20 20:28:41.741503518 +0200
|
||||
@@ -31,7 +31,7 @@
|
||||
From 87104647f061892525236a71f304b63609960626 Mon Sep 17 00:00:00 2001
|
||||
From: =?UTF-8?q?Florian=20M=C3=BCllner?= <fmuellner@gnome.org>
|
||||
Date: Thu, 9 Mar 2017 14:43:30 +0100
|
||||
Subject: [PATCH] appFavorites: Make firefox the default browser
|
||||
|
||||
---
|
||||
data/org.gnome.shell.gschema.xml.in | 2 +-
|
||||
js/ui/appFavorites.js | 1 +
|
||||
2 files changed, 2 insertions(+), 1 deletion(-)
|
||||
|
||||
diff --git a/data/org.gnome.shell.gschema.xml.in b/data/org.gnome.shell.gschema.xml.in
|
||||
index 24e2a75b0..2f50036d0 100644
|
||||
--- a/data/org.gnome.shell.gschema.xml.in
|
||||
+++ b/data/org.gnome.shell.gschema.xml.in
|
||||
@@ -39,7 +39,7 @@
|
||||
</description>
|
||||
</key>
|
||||
<key name="favorite-apps" type="as">
|
||||
@ -9,13 +21,18 @@
|
||||
<summary>List of desktop file IDs for favorite applications</summary>
|
||||
<description>
|
||||
The applications corresponding to these identifiers
|
||||
diff --git a/js/ui/appFavorites.js b/js/ui/appFavorites.js
|
||||
index 657e15965..1e44a1655 100644
|
||||
--- a/js/ui/appFavorites.js
|
||||
+++ b/js/ui/appFavorites.js
|
||||
@@ -31,6 +31,7 @@ const RENAMED_DESKTOP_IDS = {
|
||||
'gnotravex.desktop': 'gnome-tetravex.desktop',
|
||||
'gnotski.desktop': 'gnome-klotski.desktop',
|
||||
'gtali.desktop': 'tali.desktop',
|
||||
@@ -49,6 +49,7 @@ const RENAMED_DESKTOP_IDS = {
|
||||
'gnotski.desktop': 'org.gnome.Klotski.desktop',
|
||||
'gtali.desktop': 'org.gnome.Tali.desktop',
|
||||
'iagno.desktop': 'org.gnome.Reversi.desktop',
|
||||
+ 'mozilla-firefox.desktop': 'firefox.desktop',
|
||||
'nautilus.desktop': 'org.gnome.Nautilus.desktop',
|
||||
'polari.desktop': 'org.gnome.Polari.desktop',
|
||||
'totem.desktop': 'org.gnome.Totem.desktop',
|
||||
'org.gnome.gnome-2048.desktop': 'org.gnome.TwentyFortyEight.desktop',
|
||||
'org.gnome.taquin.desktop': 'org.gnome.Taquin.desktop',
|
||||
--
|
||||
2.21.0
|
||||
|
||||
|
@ -1,4 +1,4 @@
|
||||
From 78386767ec5e7b249186133333462d9866c6e18e Mon Sep 17 00:00:00 2001
|
||||
From d15a92aeaa075230f711921f4bcd929c49bfc97d Mon Sep 17 00:00:00 2001
|
||||
From: =?UTF-8?q?Florian=20M=C3=BCllner?= <fmuellner@gnome.org>
|
||||
Date: Thu, 9 Mar 2017 14:44:32 +0100
|
||||
Subject: [PATCH] appFavorites: Add terminal
|
||||
@ -8,7 +8,7 @@ Subject: [PATCH] appFavorites: Add terminal
|
||||
1 file changed, 1 insertion(+), 1 deletion(-)
|
||||
|
||||
diff --git a/data/org.gnome.shell.gschema.xml.in b/data/org.gnome.shell.gschema.xml.in
|
||||
index 8fb7f7291..6f1459c86 100644
|
||||
index 40526187e..9d7e011fc 100644
|
||||
--- a/data/org.gnome.shell.gschema.xml.in
|
||||
+++ b/data/org.gnome.shell.gschema.xml.in
|
||||
@@ -39,7 +39,7 @@
|
||||
@ -21,5 +21,5 @@ index 8fb7f7291..6f1459c86 100644
|
||||
<description>
|
||||
The applications corresponding to these identifiers
|
||||
--
|
||||
2.20.1
|
||||
2.21.0
|
||||
|
||||
|
@ -1,4 +1,4 @@
|
||||
From e2a0880744b7e508fba7728c6810ac43f3ea2a87 Mon Sep 17 00:00:00 2001
|
||||
From 53eba56c29c2c3f25bdfc4b73d1b9ce74ce2504b Mon Sep 17 00:00:00 2001
|
||||
From: =?UTF-8?q?Florian=20M=C3=BCllner?= <fmuellner@gnome.org>
|
||||
Date: Thu, 9 Mar 2017 14:44:03 +0100
|
||||
Subject: [PATCH] Add 'yelp' to default favorites
|
||||
@ -9,7 +9,7 @@ Help should be easily available, so add it to the default favorites.
|
||||
1 file changed, 1 insertion(+), 1 deletion(-)
|
||||
|
||||
diff --git a/data/org.gnome.shell.gschema.xml.in b/data/org.gnome.shell.gschema.xml.in
|
||||
index 868d8edc9..8fb7f7291 100644
|
||||
index 2f50036d0..40526187e 100644
|
||||
--- a/data/org.gnome.shell.gschema.xml.in
|
||||
+++ b/data/org.gnome.shell.gschema.xml.in
|
||||
@@ -39,7 +39,7 @@
|
||||
@ -22,5 +22,5 @@ index 868d8edc9..8fb7f7291 100644
|
||||
<description>
|
||||
The applications corresponding to these identifiers
|
||||
--
|
||||
2.20.1
|
||||
2.21.0
|
||||
|
||||
|
399
SOURCES/horizontal-workspace-support.patch
Normal file
399
SOURCES/horizontal-workspace-support.patch
Normal file
@ -0,0 +1,399 @@
|
||||
From b42dd3f87ad5fb6c7ee139cb0de22e0fbb393ba2 Mon Sep 17 00:00:00 2001
|
||||
From: =?UTF-8?q?Florian=20M=C3=BCllner?= <fmuellner@gnome.org>
|
||||
Date: Tue, 4 Jun 2019 19:22:26 +0000
|
||||
Subject: [PATCH 1/2] workspaceSwitcherPopup: Support horizontal layout
|
||||
|
||||
While mutter supports a variety of different grid layouts (n columns/rows,
|
||||
growing vertically or horizontally from any of the four corners), we
|
||||
hardcode a fixed vertical layout of a single column.
|
||||
|
||||
Now that mutter exposes the actual layout to us, add support for a more
|
||||
traditional horizontal layout as well.
|
||||
|
||||
https://gitlab.gnome.org/GNOME/gnome-shell/merge_requests/575
|
||||
---
|
||||
data/theme/gnome-shell-sass/_common.scss | 3 +-
|
||||
js/ui/windowManager.js | 36 ++++++++--
|
||||
js/ui/workspaceSwitcherPopup.js | 86 ++++++++++++++++++------
|
||||
3 files changed, 98 insertions(+), 27 deletions(-)
|
||||
|
||||
diff --git a/data/theme/gnome-shell-sass/_common.scss b/data/theme/gnome-shell-sass/_common.scss
|
||||
index 293ea2ab9..b1eeb0ce9 100644
|
||||
--- a/data/theme/gnome-shell-sass/_common.scss
|
||||
+++ b/data/theme/gnome-shell-sass/_common.scss
|
||||
@@ -680,7 +680,8 @@ StScrollBar {
|
||||
spacing: 8px;
|
||||
}
|
||||
|
||||
- .ws-switcher-active-up, .ws-switcher-active-down {
|
||||
+ .ws-switcher-active-up, .ws-switcher-active-down,
|
||||
+ .ws-switcher-active-left, .ws-switcher-active-right {
|
||||
height: 50px;
|
||||
background-color: $selected_bg_color;
|
||||
color: $selected_fg_color;
|
||||
diff --git a/js/ui/windowManager.js b/js/ui/windowManager.js
|
||||
index b9f5fef46..dfe1b4460 100644
|
||||
--- a/js/ui/windowManager.js
|
||||
+++ b/js/ui/windowManager.js
|
||||
@@ -2145,6 +2145,8 @@ var WindowManager = class {
|
||||
let [action,,,target] = binding.get_name().split('-');
|
||||
let newWs;
|
||||
let direction;
|
||||
+ let vertical = workspaceManager.layout_rows == -1;
|
||||
+ let rtl = Clutter.get_default_text_direction() == Clutter.TextDirection.RTL;
|
||||
|
||||
if (action == 'move') {
|
||||
// "Moving" a window to another workspace doesn't make sense when
|
||||
@@ -2157,7 +2159,12 @@ var WindowManager = class {
|
||||
}
|
||||
|
||||
if (target == 'last') {
|
||||
- direction = Meta.MotionDirection.DOWN;
|
||||
+ if (vertical)
|
||||
+ direction = Meta.MotionDirection.DOWN;
|
||||
+ else if (rtl)
|
||||
+ direction = Meta.MotionDirection.LEFT;
|
||||
+ else
|
||||
+ direction = Meta.MotionDirection.RIGHT;
|
||||
newWs = workspaceManager.get_workspace_by_index(workspaceManager.n_workspaces - 1);
|
||||
} else if (isNaN(target)) {
|
||||
// Prepend a new workspace dynamically
|
||||
@@ -2173,16 +2180,33 @@ var WindowManager = class {
|
||||
target--;
|
||||
newWs = workspaceManager.get_workspace_by_index(target);
|
||||
|
||||
- if (workspaceManager.get_active_workspace().index() > target)
|
||||
- direction = Meta.MotionDirection.UP;
|
||||
- else
|
||||
- direction = Meta.MotionDirection.DOWN;
|
||||
+ if (workspaceManager.get_active_workspace().index() > target) {
|
||||
+ if (vertical)
|
||||
+ direction = Meta.MotionDirection.UP;
|
||||
+ else if (rtl)
|
||||
+ direction = Meta.MotionDirection.RIGHT;
|
||||
+ else
|
||||
+ direction = Meta.MotionDirection.LEFT;
|
||||
+ } else {
|
||||
+ if (vertical)
|
||||
+ direction = Meta.MotionDirection.DOWN;
|
||||
+ else if (rtl)
|
||||
+ direction = Meta.MotionDirection.LEFT;
|
||||
+ else
|
||||
+ direction = Meta.MotionDirection.RIGHT;
|
||||
+ }
|
||||
}
|
||||
|
||||
- if (direction != Meta.MotionDirection.UP &&
|
||||
+ if (workspaceManager.layout_rows == -1 &&
|
||||
+ direction != Meta.MotionDirection.UP &&
|
||||
direction != Meta.MotionDirection.DOWN)
|
||||
return;
|
||||
|
||||
+ if (workspaceManager.layout_columns == -1 &&
|
||||
+ direction != Meta.MotionDirection.LEFT &&
|
||||
+ direction != Meta.MotionDirection.RIGHT)
|
||||
+ return;
|
||||
+
|
||||
if (action == 'switch')
|
||||
this.actionMoveWorkspace(newWs);
|
||||
else
|
||||
diff --git a/js/ui/workspaceSwitcherPopup.js b/js/ui/workspaceSwitcherPopup.js
|
||||
index 26404eaab..d21c5de4d 100644
|
||||
--- a/js/ui/workspaceSwitcherPopup.js
|
||||
+++ b/js/ui/workspaceSwitcherPopup.js
|
||||
@@ -17,41 +17,75 @@ class WorkspaceSwitcherPopupList extends St.Widget {
|
||||
this._itemSpacing = 0;
|
||||
this._childHeight = 0;
|
||||
this._childWidth = 0;
|
||||
+ this._orientation = global.workspace_manager.layout_rows == -1
|
||||
+ ? Clutter.Orientation.VERTICAL
|
||||
+ : Clutter.Orientation.HORIZONTAL;
|
||||
|
||||
this.connect('style-changed', () => {
|
||||
this._itemSpacing = this.get_theme_node().get_length('spacing');
|
||||
});
|
||||
}
|
||||
|
||||
- vfunc_get_preferred_height(forWidth) {
|
||||
+ _getPreferredSizeForOrientation(forSize) {
|
||||
let workArea = Main.layoutManager.getWorkAreaForMonitor(Main.layoutManager.primaryIndex);
|
||||
let themeNode = this.get_theme_node();
|
||||
|
||||
- let availHeight = workArea.height;
|
||||
- availHeight -= themeNode.get_vertical_padding();
|
||||
+ let availSize;
|
||||
+ if (this._orientation == Clutter.Orientation.HORIZONTAL)
|
||||
+ availSize = workArea.width - themeNode.get_horizontal_padding();
|
||||
+ else
|
||||
+ availSize = workArea.height - themeNode.get_vertical_padding();
|
||||
|
||||
- let height = 0;
|
||||
+ let size = 0;
|
||||
for (let child of this.get_children()) {
|
||||
let [childMinHeight, childNaturalHeight] = child.get_preferred_height(-1);
|
||||
- let [childMinWidth, childNaturalWidth] = child.get_preferred_width(childNaturalHeight);
|
||||
- height += childNaturalHeight * workArea.width / workArea.height;
|
||||
+ let height = childNaturalHeight * workArea.width / workArea.height;
|
||||
+
|
||||
+ if (this._orientation == Clutter.Orientation.HORIZONTAL) {
|
||||
+ size += height * workArea.width / workArea.height;
|
||||
+ } else {
|
||||
+ size += height;
|
||||
+ }
|
||||
}
|
||||
|
||||
let workspaceManager = global.workspace_manager;
|
||||
let spacing = this._itemSpacing * (workspaceManager.n_workspaces - 1);
|
||||
- height += spacing;
|
||||
- height = Math.min(height, availHeight);
|
||||
+ size += spacing;
|
||||
+ size = Math.min(size, availSize);
|
||||
+
|
||||
+ if (this._orientation == Clutter.Orientation.HORIZONTAL) {
|
||||
+ this._childWidth = (size - spacing) / workspaceManager.n_workspaces;
|
||||
+ return themeNode.adjust_preferred_width(size, size);
|
||||
+ } else {
|
||||
+ this._childHeight = (size - spacing) / workspaceManager.n_workspaces;
|
||||
+ return themeNode.adjust_preferred_height(size, size);
|
||||
+ }
|
||||
+ }
|
||||
+
|
||||
+ _getSizeForOppositeOrientation() {
|
||||
+ let workArea = Main.layoutManager.getWorkAreaForMonitor(Main.layoutManager.primaryIndex);
|
||||
|
||||
- this._childHeight = (height - spacing) / workspaceManager.n_workspaces;
|
||||
+ if (this._orientation == Clutter.Orientation.HORIZONTAL) {
|
||||
+ this._childHeight = Math.round(this._childWidth * workArea.height / workArea.width);
|
||||
+ return [this._childHeight, this._childHeight];
|
||||
+ } else {
|
||||
+ this._childWidth = Math.round(this._childHeight * workArea.width / workArea.height);
|
||||
+ return [this._childWidth, this._childWidth];
|
||||
+ }
|
||||
+ }
|
||||
|
||||
- return themeNode.adjust_preferred_height(height, height);
|
||||
+ vfunc_get_preferred_height(forWidth) {
|
||||
+ if (this._orientation == Clutter.Orientation.HORIZONTAL)
|
||||
+ return this._getSizeForOppositeOrientation();
|
||||
+ else
|
||||
+ return this._getPreferredSizeForOrientation(forWidth);
|
||||
}
|
||||
|
||||
vfunc_get_preferred_width(forHeight) {
|
||||
- let workArea = Main.layoutManager.getWorkAreaForMonitor(Main.layoutManager.primaryIndex);
|
||||
- this._childWidth = Math.round(this._childHeight * workArea.width / workArea.height);
|
||||
-
|
||||
- return [this._childWidth, this._childWidth];
|
||||
+ if (this._orientation == Clutter.Orientation.HORIZONTAL)
|
||||
+ return this._getPreferredSizeForOrientation(forHeight);
|
||||
+ else
|
||||
+ return this._getSizeForOppositeOrientation();
|
||||
}
|
||||
|
||||
vfunc_allocate(box, flags) {
|
||||
@@ -62,15 +96,23 @@ class WorkspaceSwitcherPopupList extends St.Widget {
|
||||
|
||||
let childBox = new Clutter.ActorBox();
|
||||
|
||||
+ let rtl = this.text_direction == Clutter.TextDirection.RTL;
|
||||
+ let x = rtl ? box.x2 - this._childWidth : box.x1;
|
||||
let y = box.y1;
|
||||
- let prevChildBoxY2 = box.y1 - this._itemSpacing;
|
||||
for (let child of this.get_children()) {
|
||||
- childBox.x1 = box.x1;
|
||||
- childBox.x2 = box.x1 + this._childWidth;
|
||||
- childBox.y1 = prevChildBoxY2 + this._itemSpacing;
|
||||
+ childBox.x1 = Math.round(x);
|
||||
+ childBox.x2 = Math.round(x + this._childWidth);
|
||||
+ childBox.y1 = Math.round(y);
|
||||
childBox.y2 = Math.round(y + this._childHeight);
|
||||
- y += this._childHeight + this._itemSpacing;
|
||||
- prevChildBoxY2 = childBox.y2;
|
||||
+
|
||||
+ if (this._orientation == Clutter.Orientation.HORIZONTAL) {
|
||||
+ if (rtl)
|
||||
+ x -= this._childWidth + this._itemSpacing;
|
||||
+ else
|
||||
+ x += this._childWidth + this._itemSpacing;
|
||||
+ } else {
|
||||
+ y += this._childHeight + this._itemSpacing;
|
||||
+ }
|
||||
child.allocate(childBox, flags);
|
||||
}
|
||||
}
|
||||
@@ -123,6 +165,10 @@ class WorkspaceSwitcherPopup extends St.Widget {
|
||||
indicator = new St.Bin({ style_class: 'ws-switcher-active-up' });
|
||||
else if(i == this._activeWorkspaceIndex && this._direction == Meta.MotionDirection.DOWN)
|
||||
indicator = new St.Bin({ style_class: 'ws-switcher-active-down' });
|
||||
+ else if(i == this._activeWorkspaceIndex && this._direction == Meta.MotionDirection.LEFT)
|
||||
+ indicator = new St.Bin({ style_class: 'ws-switcher-active-left' });
|
||||
+ else if(i == this._activeWorkspaceIndex && this._direction == Meta.MotionDirection.RIGHT)
|
||||
+ indicator = new St.Bin({ style_class: 'ws-switcher-active-right' });
|
||||
else
|
||||
indicator = new St.Bin({ style_class: 'ws-switcher-box' });
|
||||
|
||||
--
|
||||
2.21.0
|
||||
|
||||
|
||||
From 813976ff69b15ab884d44f5f6a56ae66f407acfd Mon Sep 17 00:00:00 2001
|
||||
From: =?UTF-8?q?Florian=20M=C3=BCllner?= <fmuellner@gnome.org>
|
||||
Date: Tue, 4 Jun 2019 19:49:23 +0000
|
||||
Subject: [PATCH 2/2] workspacesView: Support horizontal layout
|
||||
|
||||
Just as we did for the workspace switcher popup, support workspaces
|
||||
being laid out in a single row in the window picker.
|
||||
|
||||
Note that this takes care of the various workspace switch actions in
|
||||
the overview (scrolling, panning, touch(pad) gestures) as well as the
|
||||
switch animation, but not of the overview's workspace switcher component.
|
||||
|
||||
There are currently no plans to support other layouts there, as the
|
||||
component is inherently vertical (in fact, it was the whole reason for
|
||||
switching the layout in the first place).
|
||||
|
||||
https://gitlab.gnome.org/GNOME/gnome-shell/merge_requests/575
|
||||
---
|
||||
js/ui/workspacesView.js | 81 ++++++++++++++++++++++++++++++-----------
|
||||
1 file changed, 60 insertions(+), 21 deletions(-)
|
||||
|
||||
diff --git a/js/ui/workspacesView.js b/js/ui/workspacesView.js
|
||||
index fe06d9dae..069937d5a 100644
|
||||
--- a/js/ui/workspacesView.js
|
||||
+++ b/js/ui/workspacesView.js
|
||||
@@ -181,26 +181,32 @@ var WorkspacesView = class extends WorkspacesViewBase {
|
||||
|
||||
Tweener.removeTweens(workspace.actor);
|
||||
|
||||
- let y = (w - active) * this._fullGeometry.height;
|
||||
+ let params = {};
|
||||
+ if (workspaceManager.layout_rows == -1)
|
||||
+ params.y = (w - active) * this._fullGeometry.height;
|
||||
+ else if (this.actor.text_direction == Clutter.TextDirection.RTL)
|
||||
+ params.x = (active - w) * this._fullGeometry.width;
|
||||
+ else
|
||||
+ params.x = (w - active) * this._fullGeometry.width;
|
||||
|
||||
if (showAnimation) {
|
||||
- let params = { y: y,
|
||||
- time: WORKSPACE_SWITCH_TIME,
|
||||
- transition: 'easeOutQuad'
|
||||
- };
|
||||
+ let tweenParams = Object.assign(params, {
|
||||
+ time: WORKSPACE_SWITCH_TIME,
|
||||
+ transition: 'easeOutQuad'
|
||||
+ });
|
||||
// we have to call _updateVisibility() once before the
|
||||
// animation and once afterwards - it does not really
|
||||
// matter which tween we use, so we pick the first one ...
|
||||
if (w == 0) {
|
||||
this._updateVisibility();
|
||||
- params.onComplete = () => {
|
||||
+ tweenParams.onComplete = () => {
|
||||
this._animating = false;
|
||||
this._updateVisibility();
|
||||
};
|
||||
}
|
||||
- Tweener.addTween(workspace.actor, params);
|
||||
+ Tweener.addTween(workspace.actor, tweenParams);
|
||||
} else {
|
||||
- workspace.actor.set_position(0, y);
|
||||
+ workspace.actor.set(params);
|
||||
if (w == 0)
|
||||
this._updateVisibility();
|
||||
}
|
||||
@@ -338,22 +344,39 @@ var WorkspacesView = class extends WorkspacesViewBase {
|
||||
metaWorkspace.activate(global.get_current_time());
|
||||
}
|
||||
|
||||
- let last = this._workspaces.length - 1;
|
||||
- let firstWorkspaceY = this._workspaces[0].actor.y;
|
||||
- let lastWorkspaceY = this._workspaces[last].actor.y;
|
||||
- let workspacesHeight = lastWorkspaceY - firstWorkspaceY;
|
||||
-
|
||||
if (adj.upper == 1)
|
||||
return;
|
||||
|
||||
- let currentY = firstWorkspaceY;
|
||||
- let newY = - adj.value / (adj.upper - 1) * workspacesHeight;
|
||||
+ let last = this._workspaces.length - 1;
|
||||
+
|
||||
+ if (workspaceManager.layout_rows == -1) {
|
||||
+ let firstWorkspaceY = this._workspaces[0].actor.y;
|
||||
+ let lastWorkspaceY = this._workspaces[last].actor.y;
|
||||
+ let workspacesHeight = lastWorkspaceY - firstWorkspaceY;
|
||||
+
|
||||
+ let currentY = firstWorkspaceY;
|
||||
+ let newY = -adj.value / (adj.upper - 1) * workspacesHeight;
|
||||
|
||||
- let dy = newY - currentY;
|
||||
+ let dy = newY - currentY;
|
||||
+
|
||||
+ for (let i = 0; i < this._workspaces.length; i++) {
|
||||
+ this._workspaces[i].actor.visible = Math.abs(i - adj.value) <= 1;
|
||||
+ this._workspaces[i].actor.y += dy;
|
||||
+ }
|
||||
+ } else {
|
||||
+ let firstWorkspaceX = this._workspaces[0].actor.x;
|
||||
+ let lastWorkspaceX = this._workspaces[last].actor.x;
|
||||
+ let workspacesWidth = lastWorkspaceX - firstWorkspaceX;
|
||||
|
||||
- for (let i = 0; i < this._workspaces.length; i++) {
|
||||
- this._workspaces[i].actor.visible = Math.abs(i - adj.value) <= 1;
|
||||
- this._workspaces[i].actor.y += dy;
|
||||
+ let currentX = firstWorkspaceX;
|
||||
+ let newX = -adj.value / (adj.upper - 1) * workspacesWidth;
|
||||
+
|
||||
+ let dx = newX - currentX;
|
||||
+
|
||||
+ for (let i = 0; i < this._workspaces.length; i++) {
|
||||
+ this._workspaces[i].actor.visible = Math.abs(i - adj.value) <= 1;
|
||||
+ this._workspaces[i].actor.x += dx;
|
||||
+ }
|
||||
}
|
||||
}
|
||||
};
|
||||
@@ -504,7 +527,12 @@ var WorkspacesDisplay = class {
|
||||
_onPan(action) {
|
||||
let [dist, dx, dy] = action.get_motion_delta(0);
|
||||
let adjustment = this._scrollAdjustment;
|
||||
- adjustment.value -= (dy / this.actor.height) * adjustment.page_size;
|
||||
+ if (global.workspace_manager.layout_rows == -1)
|
||||
+ adjustment.value -= (dy / this.actor.height) * adjustment.page_size;
|
||||
+ else if (this.actor.text_direction == Clutter.TextDirection.RTL)
|
||||
+ adjustment.value += (dx / this.actor.width) * adjustment.page_size;
|
||||
+ else
|
||||
+ adjustment.value -= (dx / this.actor.width) * adjustment.page_size;
|
||||
return false;
|
||||
}
|
||||
|
||||
@@ -536,7 +564,12 @@ var WorkspacesDisplay = class {
|
||||
let workspaceManager = global.workspace_manager;
|
||||
let active = workspaceManager.get_active_workspace_index();
|
||||
let adjustment = this._scrollAdjustment;
|
||||
- adjustment.value = (active - yRel / this.actor.height) * adjustment.page_size;
|
||||
+ if (workspaceManager.layout_rows == -1)
|
||||
+ adjustment.value = (active - yRel / this.actor.height) * adjustment.page_size;
|
||||
+ else if (this.actor.text_direction == Clutter.TextDirection.RTL)
|
||||
+ adjustment.value = (active + xRel / this.actor.width) * adjustment.page_size;
|
||||
+ else
|
||||
+ adjustment.value = (active - xRel / this.actor.width) * adjustment.page_size;
|
||||
}
|
||||
|
||||
_onSwitchWorkspaceActivated(action, direction) {
|
||||
@@ -755,6 +788,12 @@ var WorkspacesDisplay = class {
|
||||
case Clutter.ScrollDirection.DOWN:
|
||||
ws = activeWs.get_neighbor(Meta.MotionDirection.DOWN);
|
||||
break;
|
||||
+ case Clutter.ScrollDirection.LEFT:
|
||||
+ ws = activeWs.get_neighbor(Meta.MotionDirection.LEFT);
|
||||
+ break;
|
||||
+ case Clutter.ScrollDirection.RIGHT:
|
||||
+ ws = activeWs.get_neighbor(Meta.MotionDirection.RIGHT);
|
||||
+ break;
|
||||
default:
|
||||
return Clutter.EVENT_PROPAGATE;
|
||||
}
|
||||
--
|
||||
2.21.0
|
||||
|
@ -1,6 +1,6 @@
|
||||
Name: gnome-shell
|
||||
Version: 3.28.3
|
||||
Release: 10%{?dist}
|
||||
Version: 3.32.2
|
||||
Release: 9%{?dist}
|
||||
Summary: Window management and application launching for GNOME
|
||||
|
||||
Group: User Interface/Desktops
|
||||
@ -8,7 +8,7 @@ License: GPLv2+
|
||||
Provides: desktop-notification-daemon
|
||||
URL: https://wiki.gnome.org/Projects/GnomeShell
|
||||
#VCS: git:git://git.gnome.org/gnome-shell
|
||||
Source0: http://download.gnome.org/sources/gnome-shell/3.28/%{name}-%{version}.tar.xz
|
||||
Source0: http://download.gnome.org/sources/gnome-shell/3.32/%{name}-%{version}.tar.xz
|
||||
|
||||
# Replace Epiphany with Firefox in the default favourite apps list
|
||||
Patch1: gnome-shell-favourite-apps-firefox.patch
|
||||
@ -32,29 +32,14 @@ Patch32: 0001-extensionSystem-Notify-about-extension-issues-on-upd.patch
|
||||
Patch33: 0001-panel-add-an-icon-to-the-ActivitiesButton.patch
|
||||
Patch34: 0001-app-Fall-back-to-window-title-instead-of-WM_CLASS.patch
|
||||
Patch35: 0001-windowMenu-Bring-back-workspaces-submenu-for-static-.patch
|
||||
Patch36: 0001-global-Allow-overriding-the-override-schema.patch
|
||||
Patch37: 0001-altSwitcher-Fix-error-when-all-alternatives-are-disa.patch
|
||||
Patch38: 0001-appDisplay-Show-full-app-name-on-hover.patch
|
||||
Patch39: 0001-app-Close-all-closable-windows-from-quit.patch
|
||||
Patch40: fix-close-dialog-annoyances.patch
|
||||
|
||||
# Backport remote access control UI from gnome 3.30
|
||||
Patch50: 0001-Add-remote-access-indication-and-control.patch
|
||||
Patch51: 0002-remoteAccess-Make-indicator-orange.patch
|
||||
|
||||
# Backport Introspect API from gnome 3.32
|
||||
Patch52: 0001-Add-app-introspection-API.patch
|
||||
Patch53: 0002-introspect-Add-GetWindows-method.patch
|
||||
Patch39: horizontal-workspace-support.patch
|
||||
Patch40: 0001-animation-fix-unintentional-loop-while-polkit-dialog.patch
|
||||
Patch41: 0001-workspacesView-Work-around-spurious-allocation-chang.patch
|
||||
Patch42: 0001-layout-Make-the-hot-corner-optional.patch
|
||||
|
||||
# Backport JS invalid access warnings (#1651894, #1663171, #1642482, #1637622)
|
||||
Patch54: fix-invalid-access-warnings.patch
|
||||
Patch55: 0001-osdWindow-Disconnect-signals-on-destroy.patch
|
||||
|
||||
# Fix added input sources working only after re-login (#1628154)
|
||||
Patch56: 0001-keyboardManager-Avoid-idempotent-calls-to-meta_backe.patch
|
||||
|
||||
# Backport IM support fixes
|
||||
Patch57: backport-im-fixes.patch
|
||||
|
||||
# suspend/resume fix on nvidia (#1663440)
|
||||
Patch10001: 0001-background-refresh-after-suspend-on-wayland.patch
|
||||
@ -67,29 +52,26 @@ Patch10004: 0004-background-refresh-background-on-gl-video-memory-pur.patch
|
||||
%define gnome_desktop_version 3.7.90
|
||||
%define glib2_version 2.56.0
|
||||
%define gobject_introspection_version 1.49.1
|
||||
%define gjs_version 1.51.90
|
||||
%define gjs_version 1.54.0
|
||||
%define gtk3_version 3.15.0
|
||||
%define json_glib_version 0.13.2
|
||||
%define mutter_version 3.28.0
|
||||
%define mutter_version 3.32
|
||||
%define polkit_version 0.100
|
||||
%define gsettings_desktop_schemas_version 3.21.3
|
||||
%define gsettings_desktop_schemas_version 3.32.0-3
|
||||
%define ibus_version 1.5.2
|
||||
%define gnome_bluetooth_version 1:3.9.0
|
||||
%define gstreamer_version 1.4.5
|
||||
|
||||
BuildRequires: gcc
|
||||
BuildRequires: meson
|
||||
BuildRequires: git
|
||||
BuildRequires: ibus-devel >= %{ibus_version}
|
||||
BuildRequires: chrpath
|
||||
BuildRequires: dbus-glib-devel
|
||||
BuildRequires: desktop-file-utils
|
||||
BuildRequires: evolution-data-server-devel >= %{eds_version}
|
||||
BuildRequires: gcr-devel
|
||||
BuildRequires: gjs-devel >= %{gjs_version}
|
||||
BuildRequires: glib2-devel >= %{glib2_version}
|
||||
BuildRequires: gobject-introspection >= %{gobject_introspection_version}
|
||||
BuildRequires: json-glib-devel >= %{json_glib_version}
|
||||
BuildRequires: upower-devel
|
||||
BuildRequires: mesa-libGL-devel
|
||||
BuildRequires: NetworkManager-libnm-devel
|
||||
BuildRequires: polkit-devel >= %{polkit_version}
|
||||
@ -102,7 +84,8 @@ BuildRequires: gtk3-devel >= %{gtk3_version}
|
||||
BuildRequires: gettext >= 0.19.6
|
||||
BuildRequires: libcanberra-devel
|
||||
BuildRequires: libcroco-devel >= %{libcroco_version}
|
||||
BuildRequires: python3-devel
|
||||
BuildRequires: pkgconfig(libsystemd)
|
||||
BuildRequires: python3
|
||||
|
||||
# for barriers
|
||||
BuildRequires: libXfixes-devel >= 5.0
|
||||
@ -132,10 +115,6 @@ Requires: gtk3%{?_isa} >= %{gtk3_version}
|
||||
Requires: libnma%{?_isa}
|
||||
# needed for loading SVG's via gdk-pixbuf
|
||||
Requires: librsvg2%{?_isa}
|
||||
# needed as it is now split from Clutter
|
||||
Requires: json-glib%{?_isa} >= %{json_glib_version}
|
||||
# For $libdir/mozilla/plugins
|
||||
Requires: mozilla-filesystem%{?_isa}
|
||||
Requires: mutter%{?_isa} >= %{mutter_version}
|
||||
Requires: upower%{?_isa}
|
||||
Requires: polkit%{?_isa} >= %{polkit_version}
|
||||
@ -154,12 +133,16 @@ Requires: gdm-libs%{?_isa}
|
||||
# needed for settings items in menus
|
||||
Requires: control-center
|
||||
# needed by some utilities
|
||||
Requires: %{__python3}
|
||||
Requires: python3%{_isa}
|
||||
# needed for the dual-GPU launch menu
|
||||
Requires: switcheroo-control
|
||||
# needed for clocks/weather integration
|
||||
Requires: geoclue2-libs%{?_isa}
|
||||
Requires: libgweather%{?_isa}
|
||||
# needed for thunderbolt support
|
||||
Requires: bolt%{?_isa}
|
||||
# Needed for launching flatpak apps etc
|
||||
Requires: xdg-desktop-portal-gtk
|
||||
|
||||
%description
|
||||
GNOME Shell provides core user interface functions for the GNOME 3 desktop,
|
||||
@ -189,20 +172,15 @@ desktop-file-validate %{buildroot}%{_datadir}/applications/org.gnome.Shell.deskt
|
||||
desktop-file-validate %{buildroot}%{_datadir}/applications/gnome-shell-extension-prefs.desktop
|
||||
desktop-file-validate %{buildroot}%{_datadir}/applications/evolution-calendar.desktop
|
||||
|
||||
%preun
|
||||
glib-compile-schemas --allow-any-name %{_datadir}/glib-2.0/schemas &> /dev/null ||:
|
||||
|
||||
%posttrans
|
||||
glib-compile-schemas --allow-any-name %{_datadir}/glib-2.0/schemas &> /dev/null ||:
|
||||
|
||||
%files -f %{name}.lang
|
||||
%license COPYING
|
||||
%doc README
|
||||
%doc README.md
|
||||
%{_bindir}/gnome-shell
|
||||
%{_bindir}/gnome-shell-extension-tool
|
||||
%{_bindir}/gnome-shell-perf-tool
|
||||
%{_bindir}/gnome-shell-extension-prefs
|
||||
%{_datadir}/glib-2.0/schemas/*.xml
|
||||
%{_datadir}/glib-2.0/schemas/00_org.gnome.shell.gschema.override
|
||||
%{_datadir}/applications/org.gnome.Shell.desktop
|
||||
%{_datadir}/applications/gnome-shell-extension-prefs.desktop
|
||||
%{_datadir}/applications/evolution-calendar.desktop
|
||||
@ -212,22 +190,27 @@ glib-compile-schemas --allow-any-name %{_datadir}/glib-2.0/schemas &> /dev/null
|
||||
%{_datadir}/dbus-1/services/org.gnome.Shell.CalendarServer.service
|
||||
%{_datadir}/dbus-1/services/org.gnome.Shell.HotplugSniffer.service
|
||||
%{_datadir}/dbus-1/services/org.gnome.Shell.PortalHelper.service
|
||||
%{_datadir}/dbus-1/interfaces/org.gnome.Shell.Extensions.xml
|
||||
%{_datadir}/dbus-1/interfaces/org.gnome.Shell.Introspect.xml
|
||||
%{_datadir}/dbus-1/interfaces/org.gnome.Shell.PadOsd.xml
|
||||
%{_datadir}/dbus-1/interfaces/org.gnome.Shell.Screencast.xml
|
||||
%{_datadir}/dbus-1/interfaces/org.gnome.Shell.Screenshot.xml
|
||||
%{_datadir}/dbus-1/interfaces/org.gnome.ShellSearchProvider.xml
|
||||
%{_datadir}/dbus-1/interfaces/org.gnome.ShellSearchProvider2.xml
|
||||
%{_datadir}/dbus-1/interfaces/org.gnome.Shell.Introspect.xml
|
||||
%{_userunitdir}/gnome-shell.service
|
||||
%{_userunitdir}/gnome-shell-wayland.target
|
||||
%{_userunitdir}/gnome-shell-x11.target
|
||||
%{_sysconfdir}/xdg/autostart/gnome-shell-overrides-migration.desktop
|
||||
# Co own directory instead of pulling in xdg-desktop-portal - we
|
||||
# are providing a backend to the portal, not depending on it
|
||||
%dir %{_datadir}/xdg-desktop-portal/portals/
|
||||
%{_datadir}/xdg-desktop-portal/portals/gnome-shell.portal
|
||||
%{_libdir}/gnome-shell/
|
||||
%{_libdir}/mozilla/plugins/*.so
|
||||
%{_libexecdir}/gnome-shell-calendar-server
|
||||
%{_libexecdir}/gnome-shell-perf-helper
|
||||
%{_libexecdir}/gnome-shell-hotplug-sniffer
|
||||
%{_libexecdir}/gnome-shell-portal-helper
|
||||
%{_libexecdir}/gnome-shell-overrides-migration.sh
|
||||
# Co own these directories instead of pulling in GConf
|
||||
# after all, we are trying to get rid of GConf with these files
|
||||
%dir %{_datadir}/GConf
|
||||
@ -236,6 +219,42 @@ glib-compile-schemas --allow-any-name %{_datadir}/glib-2.0/schemas &> /dev/null
|
||||
%{_mandir}/man1/%{name}.1.gz
|
||||
|
||||
%changelog
|
||||
* Thu Aug 15 2019 Jonas Ådahl <jadahl@redhat.com> - 3.32.2-9
|
||||
- Depend on correct gsettings-desktop-schemas version
|
||||
Related: #1704355
|
||||
|
||||
* Wed Aug 14 2019 Jonas Ådahl <jadahl@redhat.com> - 3.32.2-8
|
||||
- Depend on required gsettings-desktop-schemas version
|
||||
Related: #1704355
|
||||
|
||||
* Tue Jul 23 2019 Florian Müllner <fmuellner@redhat.com> - 3.32.2-7
|
||||
- Make the hot corner optional
|
||||
Resolves: #1704355
|
||||
|
||||
* Fri Jul 12 2019 Florian Müllner <fmuellner@redhat.com> - 3.32.2-6
|
||||
- Fix warnings triggered by spurious allocations
|
||||
Resolves: #1719279
|
||||
|
||||
* Wed Jul 10 2019 Florian Müllner <fmuellner@redhat.com> - 3.32.2-5
|
||||
- Fix infinite loop in spinner animation
|
||||
Resolves: #1725555
|
||||
|
||||
* Tue Jun 18 2019 Florian Müllner <fmuellner@redhat.com> - 3.32.2-4
|
||||
- Adjust more shortcut handlers for horizontal workspaces
|
||||
Related: #1704360
|
||||
|
||||
* Wed Jun 12 2019 Florian Müllner <fmuellner@redhat.com> - 3.32.2-3
|
||||
- Support horizontal workspaces in gestures/keybindings/animations
|
||||
Related: #1704360
|
||||
|
||||
* Fri May 31 2019 Florian Müllner <fmuellner@redhat.com> - 3.32.2-2
|
||||
- Adjust downstream patch to mutter changes
|
||||
Resolves: #1715738
|
||||
|
||||
* Thu May 23 2019 Florian Müllner <fmuellner@redhat.com> - 3.32.2-1
|
||||
- Update to 3.32.2
|
||||
Resolves: #1698520
|
||||
|
||||
* Mon Feb 11 2019 Florian Müllner <fmuellner@redhat.com> - 3.28.3-10
|
||||
- Backport another IM fix (#1668979)
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user