mirror of
https://github.com/NixOS/nixpkgs.git
synced 2024-11-24 07:53:19 +00:00
gnome-shell: maybe fix the background corruption bug
This commit is contained in:
parent
fd900f2f8a
commit
5846a07226
@ -39,6 +39,8 @@ stdenv.mkDerivation rec {
|
||||
--prefix XDG_DATA_DIRS : "${evolution_data_server}/share:$out/share:$XDG_ICON_DIRS:$GSETTINGS_SCHEMAS_PATH"
|
||||
'';
|
||||
|
||||
patches = [ ./fix_background_corruption.patch ];
|
||||
|
||||
meta = with stdenv.lib; {
|
||||
platforms = platforms.linux;
|
||||
};
|
||||
|
@ -0,0 +1,147 @@
|
||||
commit 831bd07b0d6b7055fea8317f2cdf8fd4a408c36d
|
||||
Author: Jasper St. Pierre <jstpierre@mecheye.net>
|
||||
Date: Thu Nov 7 17:14:47 2013 -0500
|
||||
|
||||
layout: Fix several issues with the background management code
|
||||
|
||||
If monitor-changed fires at startup, it will destroy all of the
|
||||
backgrounds, but since this._isStartup is true, won't recreate any
|
||||
of them. Additionally, since _bgManagers is indexed by monitor index,
|
||||
if the primary index is not 0, it could become a sparse array (e.g.
|
||||
[undefined, undefined, primaryBackground]), and our for loop will
|
||||
crash trying to access properties of undefined.
|
||||
|
||||
Fix both of these issues by always creating background managers for
|
||||
every monitor, hiding them on startup but only showing them after
|
||||
the startup animation is complete.
|
||||
|
||||
One thing we need to watch out for is that while LayoutManager is
|
||||
constructing, Main.uiGroup / Main.layoutManager will be undefined,
|
||||
so addBackgroundMenu will fail. Fix this by passing down the uiGroup
|
||||
to the background menu code.
|
||||
|
||||
https://bugzilla.gnome.org/show_bug.cgi?id=709313
|
||||
|
||||
diff --git a/js/ui/backgroundMenu.js b/js/ui/backgroundMenu.js
|
||||
index 06e698c..dcbbb39 100644
|
||||
--- a/js/ui/backgroundMenu.js
|
||||
+++ b/js/ui/backgroundMenu.js
|
||||
@@ -13,7 +13,7 @@ const BackgroundMenu = new Lang.Class({
|
||||
Name: 'BackgroundMenu',
|
||||
Extends: PopupMenu.PopupMenu,
|
||||
|
||||
- _init: function(source) {
|
||||
+ _init: function(source, layoutManager) {
|
||||
this.parent(source, 0, St.Side.TOP);
|
||||
|
||||
this.addSettingsAction(_("Settings"), 'gnome-control-center.desktop');
|
||||
@@ -22,17 +22,17 @@ const BackgroundMenu = new Lang.Class({
|
||||
|
||||
this.actor.add_style_class_name('background-menu');
|
||||
|
||||
- Main.uiGroup.add_actor(this.actor);
|
||||
+ layoutManager.uiGroup.add_actor(this.actor);
|
||||
this.actor.hide();
|
||||
}
|
||||
});
|
||||
|
||||
-function addBackgroundMenu(actor) {
|
||||
+function addBackgroundMenu(actor, layoutManager) {
|
||||
let cursor = new St.Bin({ opacity: 0 });
|
||||
- Main.uiGroup.add_actor(cursor);
|
||||
+ layoutManager.uiGroup.add_actor(cursor);
|
||||
|
||||
actor.reactive = true;
|
||||
- actor._backgroundMenu = new BackgroundMenu(cursor);
|
||||
+ actor._backgroundMenu = new BackgroundMenu(cursor, layoutManager);
|
||||
actor._backgroundManager = new PopupMenu.PopupMenuManager({ actor: actor });
|
||||
actor._backgroundManager.addMenu(actor._backgroundMenu);
|
||||
|
||||
diff --git a/js/ui/layout.js b/js/ui/layout.js
|
||||
index 17073a6..80bae9d 100644
|
||||
--- a/js/ui/layout.js
|
||||
+++ b/js/ui/layout.js
|
||||
@@ -352,26 +352,26 @@ const LayoutManager = new Lang.Class({
|
||||
this.emit('hot-corners-changed');
|
||||
},
|
||||
|
||||
- _createBackground: function(monitorIndex) {
|
||||
+ _addBackgroundMenu: function(bgManager) {
|
||||
+ BackgroundMenu.addBackgroundMenu(bgManager.background.actor, this);
|
||||
+ },
|
||||
+
|
||||
+ _createBackgroundManager: function(monitorIndex) {
|
||||
let bgManager = new Background.BackgroundManager({ container: this._backgroundGroup,
|
||||
layoutManager: this,
|
||||
monitorIndex: monitorIndex });
|
||||
- BackgroundMenu.addBackgroundMenu(bgManager.background.actor);
|
||||
-
|
||||
- bgManager.connect('changed', Lang.bind(this, function() {
|
||||
- BackgroundMenu.addBackgroundMenu(bgManager.background.actor);
|
||||
- }));
|
||||
|
||||
- this._bgManagers[monitorIndex] = bgManager;
|
||||
+ bgManager.connect('changed', Lang.bind(this, this._addBackgroundMenu));
|
||||
+ this._addBackgroundMenu(bgManager);
|
||||
|
||||
- return bgManager.background;
|
||||
+ return bgManager;
|
||||
},
|
||||
|
||||
- _createSecondaryBackgrounds: function() {
|
||||
+ _showSecondaryBackgrounds: function() {
|
||||
for (let i = 0; i < this.monitors.length; i++) {
|
||||
if (i != this.primaryIndex) {
|
||||
- let background = this._createBackground(i);
|
||||
-
|
||||
+ let background = this._bgManagers[i].background;
|
||||
+ background.actor.show();
|
||||
background.actor.opacity = 0;
|
||||
Tweener.addTween(background.actor,
|
||||
{ opacity: 255,
|
||||
@@ -381,10 +381,6 @@ const LayoutManager = new Lang.Class({
|
||||
}
|
||||
},
|
||||
|
||||
- _createPrimaryBackground: function() {
|
||||
- this._createBackground(this.primaryIndex);
|
||||
- },
|
||||
-
|
||||
_updateBackgrounds: function() {
|
||||
let i;
|
||||
for (i = 0; i < this._bgManagers.length; i++)
|
||||
@@ -395,11 +391,12 @@ const LayoutManager = new Lang.Class({
|
||||
if (Main.sessionMode.isGreeter)
|
||||
return;
|
||||
|
||||
- if (this._startingUp)
|
||||
- return;
|
||||
-
|
||||
for (let i = 0; i < this.monitors.length; i++) {
|
||||
- this._createBackground(i);
|
||||
+ let bgManager = this._createBackgroundManager(i);
|
||||
+ this._bgManagers.push(bgManager);
|
||||
+
|
||||
+ if (i != this.primaryIndex && this._startingUp)
|
||||
+ bgManager.background.actor.hide();
|
||||
}
|
||||
},
|
||||
|
||||
@@ -595,7 +592,7 @@ const LayoutManager = new Lang.Class({
|
||||
if (Main.sessionMode.isGreeter) {
|
||||
this.panelBox.translation_y = -this.panelBox.height;
|
||||
} else {
|
||||
- this._createPrimaryBackground();
|
||||
+ this._updateBackgrounds();
|
||||
|
||||
// We need to force an update of the regions now before we scale
|
||||
// the UI group to get the coorect allocation for the struts.
|
||||
@@ -673,7 +670,7 @@ const LayoutManager = new Lang.Class({
|
||||
this.keyboardBox.show();
|
||||
|
||||
if (!Main.sessionMode.isGreeter) {
|
||||
- this._createSecondaryBackgrounds();
|
||||
+ this._showSecondaryBackgrounds();
|
||||
global.window_group.remove_clip();
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user