[gnome-shell] autoWorkspaces: Better handle apps that open a splashscreen or dialog at startup
- From: Adel Gadllah <agadllah src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gnome-shell] autoWorkspaces: Better handle apps that open a splashscreen or dialog at startup
- Date: Tue, 1 Mar 2011 18:10:45 +0000 (UTC)
commit 102b2e2ca648fd3494a39fac9075891d97841182
Author: Adel Gadllah <adel gadllah gmail com>
Date: Wed Feb 16 17:48:41 2011 +0100
autoWorkspaces: Better handle apps that open a splashscreen or dialog at startup
Currently we remove a workspace when last window on that workspace closes,
which turned out to be too agressive as some apps open either a splashscreen
or a "I have crashed last time" dialog at startup.
Try to detect such apps and give them a chance to open their "real window(s)"
on the workspace.
https://bugzilla.gnome.org/show_bug.cgi?id=642188
js/ui/main.js | 33 ++++++++++++++++++++++++++++++---
1 files changed, 30 insertions(+), 3 deletions(-)
---
diff --git a/js/ui/main.js b/js/ui/main.js
index 873980d..2a7e225 100644
--- a/js/ui/main.js
+++ b/js/ui/main.js
@@ -224,12 +224,28 @@ function start() {
let _workspaces = [];
let _checkWorkspacesId = 0;
+/*
+ * When the last window closed on a workspace is a dialog or splash
+ * screen, we assume that it might be an initial window shown before
+ * the main window of an application, and give the app a grace period
+ * where it can map another window before we remove the workspace.
+ */
+const LAST_WINDOW_GRACE_TIME = 1000;
+
function _checkWorkspaces() {
let i;
let emptyWorkspaces = [];
- for (i = 0; i < _workspaces.length; i++)
- emptyWorkspaces[i] = true;
+ for (i = 0; i < _workspaces.length; i++) {
+ let lastRemoved = _workspaces[i]._lastRemovedWindow;
+ if (lastRemoved &&
+ (lastRemoved.get_window_type() == Meta.WindowType.SPLASHSCREEN ||
+ lastRemoved.get_window_type() == Meta.WindowType.DIALOG ||
+ lastRemoved.get_window_type() == Meta.WindowType.MODAL_DIALOG))
+ emptyWorkspaces[i] = false;
+ else
+ emptyWorkspaces[i] = true;
+ }
let windows = global.get_window_actors();
for (i = 0; i < windows.length; i++) {
@@ -258,6 +274,17 @@ function _checkWorkspaces() {
return false;
}
+function _windowRemoved(workspace, window) {
+ workspace._lastRemovedWindow = window;
+ _queueCheckWorkspaces();
+ Mainloop.timeout_add(LAST_WINDOW_GRACE_TIME, function() {
+ if (workspace._lastRemovedWindow == window) {
+ workspace._lastRemovedWindow = null;
+ _queueCheckWorkspaces();
+ }
+ });
+}
+
function _queueCheckWorkspaces() {
if (_checkWorkspacesId == 0)
_checkWorkspacesId = Meta.later_add(Meta.LaterType.BEFORE_REDRAW, _checkWorkspaces);
@@ -281,7 +308,7 @@ function _nWorkspacesChanged() {
for (w = oldNumWorkspaces; w < newNumWorkspaces; w++) {
let workspace = _workspaces[w];
workspace._windowAddedId = workspace.connect('window-added', _queueCheckWorkspaces);
- workspace._windowRemovedId = workspace.connect('window-removed', _queueCheckWorkspaces);
+ workspace._windowRemovedId = workspace.connect('window-removed', _windowRemoved);
}
} else {
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]