Compare commits
7 Commits
citadel
...
wip/overvi
Author | SHA1 | Date | |
---|---|---|---|
|
1afb04d1e4 | ||
|
51e63233ce | ||
|
a7d7f94892 | ||
|
427f516d45 | ||
|
cbb88ffdbb | ||
|
71670bad3b | ||
|
a2e4153fa0 |
@ -2512,7 +2512,7 @@ StScrollBar StButton#vhandle:active {
|
||||
box-shadow: 0px 4px 8px rgba(0,0,0,0.9);
|
||||
}
|
||||
|
||||
#lockDialogGroup {
|
||||
#systemGroup {
|
||||
background: #2e3436 url(noise-texture.png);
|
||||
background-repeat: repeat;
|
||||
}
|
||||
|
@ -274,7 +274,7 @@ const SessionMenuButton = new Lang.Class({
|
||||
this.actor = new St.Bin({ child: this._button });
|
||||
|
||||
this._menu = new PopupMenu.PopupMenu(this._button, 0, St.Side.TOP);
|
||||
Main.uiGroup.add_actor(this._menu.actor);
|
||||
Main.layoutManager.menuGroup.add_actor(this._menu.actor);
|
||||
this._menu.actor.hide();
|
||||
|
||||
this._menu.connect('open-state-changed',
|
||||
|
@ -1525,7 +1525,7 @@ const AppIconMenu = new Lang.Class({
|
||||
}));
|
||||
source.actor.connect('destroy', Lang.bind(this, function () { this.actor.destroy(); }));
|
||||
|
||||
Main.uiGroup.add_actor(this.actor);
|
||||
Main.layoutManager.menuGroup.add_actor(this.actor);
|
||||
},
|
||||
|
||||
_redisplay: function() {
|
||||
|
@ -132,6 +132,46 @@ const BackgroundCache = new Lang.Class({
|
||||
this._removeContent(this._images, content);
|
||||
},
|
||||
|
||||
_loadImageContentInternal: function(filename, style) {
|
||||
let cancellable = new Gio.Cancellable();
|
||||
let content = new Meta.Background({ meta_screen: global.screen });
|
||||
|
||||
let info = { filename: filename,
|
||||
style: style,
|
||||
cancellable: cancellable,
|
||||
callers: [] };
|
||||
|
||||
content.load_file_async(filename, style, cancellable, Lang.bind(this, function(object, result) {
|
||||
if (cancellable.is_cancelled())
|
||||
return;
|
||||
|
||||
try {
|
||||
content.load_file_finish(result);
|
||||
} catch(e) {
|
||||
content = null;
|
||||
}
|
||||
|
||||
if (content) {
|
||||
this._monitorFile(filename);
|
||||
info.callers.forEach(Lang.bind(this, function(caller) {
|
||||
let newContent = content.copy(caller.monitorIndex, caller.effects);
|
||||
this._images.push(newContent);
|
||||
caller.onFinished(newContent);
|
||||
}));
|
||||
} else {
|
||||
info.callers.forEach(Lang.bind(this, function(caller) {
|
||||
caller.onFinished(null);
|
||||
}));
|
||||
}
|
||||
|
||||
let idx = this._pendingFileLoads.indexOf(info);
|
||||
this._pendingFileLoads.splice(idx, 1);
|
||||
}));
|
||||
|
||||
this._pendingFileLoads.push(info);
|
||||
return info;
|
||||
},
|
||||
|
||||
_loadImageContent: function(params) {
|
||||
params = Params.parse(params, { monitorIndex: 0,
|
||||
style: null,
|
||||
@ -140,67 +180,38 @@ const BackgroundCache = new Lang.Class({
|
||||
cancellable: null,
|
||||
onFinished: null });
|
||||
|
||||
let caller = { monitorIndex: params.monitorIndex,
|
||||
effects: params.effects,
|
||||
cancellable: params.cancellable,
|
||||
onFinished: params.onFinished };
|
||||
|
||||
let info = null;
|
||||
for (let i = 0; i < this._pendingFileLoads.length; i++) {
|
||||
if (this._pendingFileLoads[i].filename == params.filename &&
|
||||
this._pendingFileLoads[i].style == params.style) {
|
||||
this._pendingFileLoads[i].callers.push({ shouldCopy: true,
|
||||
monitorIndex: params.monitorIndex,
|
||||
effects: params.effects,
|
||||
onFinished: params.onFinished });
|
||||
return;
|
||||
let pendingLoad = this._pendingFileLoads[i];
|
||||
if (pendingLoad.filename == params.filename && pendingLoad.style == params.style) {
|
||||
info = pendingLoad;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
this._pendingFileLoads.push({ filename: params.filename,
|
||||
style: params.style,
|
||||
callers: [{ shouldCopy: false,
|
||||
monitorIndex: params.monitorIndex,
|
||||
effects: params.effects,
|
||||
onFinished: params.onFinished }] });
|
||||
if (!info)
|
||||
info = this._loadImageContentInternal(params.filename, params.style);
|
||||
|
||||
let content = new Meta.Background({ meta_screen: global.screen,
|
||||
monitor: params.monitorIndex,
|
||||
effects: params.effects });
|
||||
info.callers.push(caller);
|
||||
|
||||
content.load_file_async(params.filename,
|
||||
params.style,
|
||||
params.cancellable,
|
||||
Lang.bind(this,
|
||||
function(object, result) {
|
||||
try {
|
||||
content.load_file_finish(result);
|
||||
if (caller.cancellable) {
|
||||
caller.cancellable.connect(Lang.bind(this, function() {
|
||||
let idx = info.callers.indexOf(caller);
|
||||
info.callers.splice(idx, 1);
|
||||
|
||||
this._monitorFile(params.filename);
|
||||
this._images.push(content);
|
||||
} catch(e) {
|
||||
content = null;
|
||||
}
|
||||
if (info.callers.length == 0) {
|
||||
info.cancellable.cancel();
|
||||
|
||||
for (let i = 0; i < this._pendingFileLoads.length; i++) {
|
||||
let pendingLoad = this._pendingFileLoads[i];
|
||||
if (pendingLoad.filename != params.filename ||
|
||||
pendingLoad.style != params.style)
|
||||
continue;
|
||||
|
||||
for (let j = 0; j < pendingLoad.callers.length; j++) {
|
||||
if (pendingLoad.callers[j].onFinished) {
|
||||
let newContent;
|
||||
|
||||
if (content && pendingLoad.callers[j].shouldCopy) {
|
||||
newContent = content.copy(pendingLoad.callers[j].monitorIndex,
|
||||
pendingLoad.callers[j].effects);
|
||||
this._images.push(newContent);
|
||||
} else {
|
||||
newContent = content;
|
||||
}
|
||||
|
||||
pendingLoad.callers[j].onFinished(newContent);
|
||||
}
|
||||
}
|
||||
|
||||
this._pendingFileLoads.splice(i, 1);
|
||||
}
|
||||
}));
|
||||
let idx = this._pendingFileLoads.indexOf(info);
|
||||
this._pendingFileLoads.splice(idx, 1);
|
||||
}
|
||||
}));
|
||||
}
|
||||
},
|
||||
|
||||
getImageContent: function(params) {
|
||||
@ -250,7 +261,6 @@ const BackgroundCache = new Lang.Class({
|
||||
monitorIndex: params.monitorIndex,
|
||||
cancellable: params.cancellable,
|
||||
onFinished: params.onFinished });
|
||||
|
||||
}
|
||||
},
|
||||
|
||||
@ -624,31 +634,6 @@ const Background = new Lang.Class({
|
||||
});
|
||||
Signals.addSignalMethods(Background.prototype);
|
||||
|
||||
const SystemBackground = new Lang.Class({
|
||||
Name: 'SystemBackground',
|
||||
|
||||
_init: function() {
|
||||
this._cache = getBackgroundCache();
|
||||
this.actor = new Meta.BackgroundActor();
|
||||
|
||||
this._cache.getImageContent({ style: GDesktopEnums.BackgroundStyle.WALLPAPER,
|
||||
filename: global.datadir + '/theme/noise-texture.png',
|
||||
effects: Meta.BackgroundEffects.NONE,
|
||||
onFinished: Lang.bind(this, function(content) {
|
||||
this.actor.content = content;
|
||||
this.emit('loaded');
|
||||
})
|
||||
});
|
||||
|
||||
this.actor.connect('destroy', Lang.bind(this, this._onDestroy));
|
||||
},
|
||||
|
||||
_onDestroy: function() {
|
||||
this._cache.removeImageContent(this.actor.content);
|
||||
},
|
||||
});
|
||||
Signals.addSignalMethods(SystemBackground.prototype);
|
||||
|
||||
const Animation = new Lang.Class({
|
||||
Name: 'Animation',
|
||||
|
||||
|
@ -22,7 +22,7 @@ const BackgroundMenu = new Lang.Class({
|
||||
|
||||
this.actor.add_style_class_name('background-menu');
|
||||
|
||||
layoutManager.uiGroup.add_actor(this.actor);
|
||||
layoutManager.menuGroup.add_actor(this.actor);
|
||||
this.actor.hide();
|
||||
}
|
||||
});
|
||||
|
12
js/ui/dnd.js
12
js/ui/dnd.js
@ -46,7 +46,7 @@ let dragMonitors = [];
|
||||
function _getEventHandlerActor() {
|
||||
if (!eventHandlerActor) {
|
||||
eventHandlerActor = new Clutter.Actor({ width: 0, height: 0 });
|
||||
Main.uiGroup.add_actor(eventHandlerActor);
|
||||
Main.layoutManager.sessionGroup.add_actor(eventHandlerActor);
|
||||
// We connect to 'event' rather than 'captured-event' because the capturing phase doesn't happen
|
||||
// when you've grabbed the pointer.
|
||||
eventHandlerActor.connect('event',
|
||||
@ -236,7 +236,7 @@ const _Draggable = new Lang.Class({
|
||||
|
||||
if (this.actor._delegate && this.actor._delegate.getDragActor) {
|
||||
this._dragActor = this.actor._delegate.getDragActor();
|
||||
Main.uiGroup.add_child(this._dragActor);
|
||||
Main.layoutManager.sessionGroup.add_child(this._dragActor);
|
||||
this._dragActor.raise_top();
|
||||
Shell.util_set_hidden_from_pick(this._dragActor, true);
|
||||
|
||||
@ -276,7 +276,7 @@ const _Draggable = new Lang.Class({
|
||||
this._dragOrigScale = this._dragActor.scale_x;
|
||||
|
||||
// Set the actor's scale such that it will keep the same
|
||||
// transformed size when it's reparented to the uiGroup
|
||||
// transformed size when it's reparented to the sessionGroup
|
||||
let [scaledWidth, scaledHeight] = this.actor.get_transformed_size();
|
||||
this._dragActor.set_scale(scaledWidth / this.actor.width,
|
||||
scaledHeight / this.actor.height);
|
||||
@ -286,7 +286,7 @@ const _Draggable = new Lang.Class({
|
||||
this._dragOffsetY = actorStageY - this._dragStartY;
|
||||
|
||||
this._dragOrigParent.remove_actor(this._dragActor);
|
||||
Main.uiGroup.add_child(this._dragActor);
|
||||
Main.layoutManager.sessionGroup.add_child(this._dragActor);
|
||||
this._dragActor.raise_top();
|
||||
Shell.util_set_hidden_from_pick(this._dragActor, true);
|
||||
}
|
||||
@ -448,7 +448,7 @@ const _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.get_parent() == Main.layoutManager.sessionGroup) {
|
||||
if (this._restoreOnSuccess) {
|
||||
this._restoreDragActor(event.get_time());
|
||||
return true;
|
||||
@ -557,7 +557,7 @@ const _Draggable = new Lang.Class({
|
||||
|
||||
_onAnimationComplete : function (dragActor, eventTime) {
|
||||
if (this._dragOrigParent) {
|
||||
Main.uiGroup.remove_child(this._dragActor);
|
||||
Main.layoutManager.sessionGroup.remove_child(this._dragActor);
|
||||
this._dragOrigParent.add_actor(this._dragActor);
|
||||
dragActor.set_scale(this._dragOrigScale, this._dragOrigScale);
|
||||
dragActor.set_position(this._dragOrigX, this._dragOrigY);
|
||||
|
144
js/ui/layout.js
144
js/ui/layout.js
@ -162,9 +162,9 @@ const LayoutManager = new Lang.Class({
|
||||
this._startingUp = true;
|
||||
|
||||
// Normally, the stage is always covered so Clutter doesn't need to clear
|
||||
// it; however it becomes visible during the startup animation
|
||||
// See the comment below for a longer explanation
|
||||
// it; however it becomes visible when using the magnifier.
|
||||
global.stage.color = DEFAULT_BACKGROUND_COLOR;
|
||||
global.stage.no_clear_hint = true;
|
||||
|
||||
// Set up stage hierarchy to group all UI actors under one container.
|
||||
this.uiGroup = new Shell.GenericContainer({ name: 'uiGroup' });
|
||||
@ -184,29 +184,27 @@ const LayoutManager = new Lang.Class({
|
||||
let height = global.stage.height;
|
||||
[alloc.min_size, alloc.natural_size] = [height, height];
|
||||
});
|
||||
global.stage.add_child(this.uiGroup);
|
||||
|
||||
this.systemGroup = new St.Widget({ name: 'systemGroup',
|
||||
layout_manager: new Clutter.BinLayout() });
|
||||
this.uiGroup.add_actor(this.systemGroup);
|
||||
|
||||
this.sessionGroup = new St.Widget({ name: 'sessionGroup' });
|
||||
this.uiGroup.add_child(this.sessionGroup);
|
||||
|
||||
global.stage.remove_actor(global.window_group);
|
||||
this.uiGroup.add_actor(global.window_group);
|
||||
|
||||
global.stage.add_child(this.uiGroup);
|
||||
this.sessionGroup.add_actor(global.window_group);
|
||||
|
||||
this.overviewGroup = new St.Widget({ name: 'overviewGroup',
|
||||
visible: false });
|
||||
this.addChrome(this.overviewGroup);
|
||||
|
||||
this.screenShieldGroup = new St.Widget({ name: 'screenShieldGroup',
|
||||
visible: false,
|
||||
clip_to_allocation: true,
|
||||
layout_manager: new Clutter.BinLayout(),
|
||||
});
|
||||
this.addChrome(this.screenShieldGroup);
|
||||
|
||||
this.panelBox = new St.BoxLayout({ name: 'panelBox',
|
||||
vertical: true });
|
||||
this.addChrome(this.panelBox, { affectsStruts: true,
|
||||
trackFullscreen: true });
|
||||
this.panelBox.connect('allocation-changed',
|
||||
Lang.bind(this, this._panelBoxChanged));
|
||||
this.uiGroup.add_child(this.screenShieldGroup);
|
||||
|
||||
this.trayBox = new St.Widget({ name: 'trayBox',
|
||||
layout_manager: new Clutter.BinLayout() });
|
||||
@ -219,13 +217,39 @@ const LayoutManager = new Lang.Class({
|
||||
this.addChrome(this.keyboardBox);
|
||||
this._keyboardHeightNotifyId = 0;
|
||||
|
||||
this.osdGroup = new St.Widget();
|
||||
this.sessionGroup.add_child(this.osdGroup);
|
||||
|
||||
this.switcherPopupGroup = new St.Widget();
|
||||
this.sessionGroup.add_child(this.switcherPopupGroup);
|
||||
|
||||
this.dialogGroup = new St.Widget();
|
||||
this.sessionGroup.add_child(this.dialogGroup);
|
||||
|
||||
// A dummy actor that tracks the mouse or text cursor, based on the
|
||||
// position set in setDummyCursorPosition.
|
||||
this.dummyCursor = new St.Widget({ width: 0, height: 0 });
|
||||
this.uiGroup.add_actor(this.dummyCursor);
|
||||
this.uiGroup.add_child(this.dummyCursor);
|
||||
|
||||
global.stage.remove_actor(global.top_window_group);
|
||||
this.uiGroup.add_actor(global.top_window_group);
|
||||
// The panel group isn't in the session, as it needs to go above the screen
|
||||
// shield, and it isn't animated in the login animation.
|
||||
this.panelGroup = new St.Widget({ name: 'panelGroup' });
|
||||
this.uiGroup.add_child(this.panelGroup);
|
||||
this._trackActor(this.panelGroup, { affectsStruts: true,
|
||||
trackFullscreen: true });
|
||||
this.panelGroup.connect('allocation-changed',
|
||||
Lang.bind(this, this._panelGroupChanged));
|
||||
|
||||
this.overlayGroup = new St.Widget({ name: 'overlayGroup' });
|
||||
this.uiGroup.add_child(this.overlayGroup);
|
||||
|
||||
this.menuGroup = new St.Widget();
|
||||
this.overlayGroup.add_child(this.menuGroup);
|
||||
|
||||
this._topSessionGroup = new St.Widget();
|
||||
this.overlayGroup.add_child(this._topSessionGroup);
|
||||
global.stage.remove_child(global.top_window_group);
|
||||
this._topSessionGroup.add_child(global.top_window_group);
|
||||
|
||||
this._backgroundGroup = new Meta.BackgroundGroup();
|
||||
global.window_group.add_child(this._backgroundGroup);
|
||||
@ -247,8 +271,7 @@ const LayoutManager = new Lang.Class({
|
||||
// This is called by Main after everything else is constructed
|
||||
init: function() {
|
||||
Main.sessionMode.connect('updated', Lang.bind(this, this._sessionUpdated));
|
||||
|
||||
this._loadBackground();
|
||||
this._prepareStartupAnimation();
|
||||
},
|
||||
|
||||
showOverview: function() {
|
||||
@ -257,6 +280,9 @@ const LayoutManager = new Lang.Class({
|
||||
this._inOverview = true;
|
||||
this._updateVisibility();
|
||||
this._updateRegions();
|
||||
|
||||
global.window_group.hide();
|
||||
global.top_window_group.hide();
|
||||
},
|
||||
|
||||
hideOverview: function() {
|
||||
@ -265,6 +291,9 @@ const LayoutManager = new Lang.Class({
|
||||
this._inOverview = false;
|
||||
this._updateVisibility();
|
||||
this._queueUpdateRegions();
|
||||
|
||||
global.window_group.show();
|
||||
global.top_window_group.show();
|
||||
},
|
||||
|
||||
_sessionUpdated: function() {
|
||||
@ -306,7 +335,7 @@ const LayoutManager = new Lang.Class({
|
||||
});
|
||||
this.hotCorners = [];
|
||||
|
||||
let size = this.panelBox.height;
|
||||
let size = this.panelGroup.height;
|
||||
|
||||
// build new hot corners
|
||||
for (let i = 0; i < this.monitors.length; i++) {
|
||||
@ -406,11 +435,11 @@ const LayoutManager = new Lang.Class({
|
||||
},
|
||||
|
||||
_updateBoxes: function() {
|
||||
this.screenShieldGroup.set_position(0, 0);
|
||||
this.screenShieldGroup.set_size(global.screen_width, global.screen_height);
|
||||
this.systemGroup.set_position(0, 0);
|
||||
this.systemGroup.set_size(global.screen_width, global.screen_height);
|
||||
|
||||
this.panelBox.set_position(this.primaryMonitor.x, this.primaryMonitor.y);
|
||||
this.panelBox.set_size(this.primaryMonitor.width, -1);
|
||||
this.panelGroup.set_position(this.primaryMonitor.x, this.primaryMonitor.y);
|
||||
this.panelGroup.set_size(this.primaryMonitor.width, -1);
|
||||
|
||||
if (this.keyboardIndex < 0)
|
||||
this.keyboardIndex = this.primaryIndex;
|
||||
@ -420,10 +449,10 @@ const LayoutManager = new Lang.Class({
|
||||
this.trayBox.set_size(this.bottomMonitor.width, -1);
|
||||
},
|
||||
|
||||
_panelBoxChanged: function() {
|
||||
_panelGroupChanged: function() {
|
||||
this._updatePanelBarrier();
|
||||
|
||||
let size = this.panelBox.height;
|
||||
let size = this.panelGroup.height;
|
||||
this.hotCorners.forEach(function(corner) {
|
||||
if (corner)
|
||||
corner.setBarrierSize(size);
|
||||
@ -436,12 +465,12 @@ const LayoutManager = new Lang.Class({
|
||||
this._rightPanelBarrier = null;
|
||||
}
|
||||
|
||||
if (this.panelBox.height) {
|
||||
if (this.panelGroup.height) {
|
||||
let primary = this.primaryMonitor;
|
||||
|
||||
this._rightPanelBarrier = new Meta.Barrier({ display: global.display,
|
||||
x1: primary.x + primary.width, y1: primary.y,
|
||||
x2: primary.x + primary.width, y2: primary.y + this.panelBox.height,
|
||||
x2: primary.x + primary.width, y2: primary.y + this.panelGroup.height,
|
||||
directions: Meta.BarrierDirection.NEGATIVE_X });
|
||||
}
|
||||
},
|
||||
@ -547,25 +576,6 @@ const LayoutManager = new Lang.Class({
|
||||
return this._keyboardIndex;
|
||||
},
|
||||
|
||||
_loadBackground: function() {
|
||||
this._systemBackground = new Background.SystemBackground();
|
||||
this._systemBackground.actor.hide();
|
||||
|
||||
global.stage.insert_child_below(this._systemBackground.actor, null);
|
||||
|
||||
let constraint = new Clutter.BindConstraint({ source: global.stage,
|
||||
coordinate: Clutter.BindCoordinate.ALL });
|
||||
this._systemBackground.actor.add_constraint(constraint);
|
||||
|
||||
let signalId = this._systemBackground.connect('loaded', Lang.bind(this, function() {
|
||||
this._systemBackground.disconnect(signalId);
|
||||
this._systemBackground.actor.show();
|
||||
global.stage.show();
|
||||
|
||||
this._prepareStartupAnimation();
|
||||
}));
|
||||
},
|
||||
|
||||
// Startup Animations
|
||||
//
|
||||
// We have two different animations, depending on whether we're a greeter
|
||||
@ -586,6 +596,8 @@ const LayoutManager = new Lang.Class({
|
||||
// screen. So, we set no_clear_hint at the end of the animation.
|
||||
|
||||
_prepareStartupAnimation: function() {
|
||||
global.stage.show();
|
||||
|
||||
// During the initial transition, add a simple actor to block all events,
|
||||
// so they don't get delivered to X11 windows that have been transformed.
|
||||
this._coverPane = new Clutter.Actor({ opacity: 0,
|
||||
@ -595,7 +607,7 @@ const LayoutManager = new Lang.Class({
|
||||
this.addChrome(this._coverPane);
|
||||
|
||||
if (Main.sessionMode.isGreeter) {
|
||||
this.panelBox.translation_y = -this.panelBox.height;
|
||||
this.panelGroup.translation_y = -this.panelGroup.height;
|
||||
} else {
|
||||
this._updateBackgrounds();
|
||||
|
||||
@ -610,10 +622,10 @@ const LayoutManager = new Lang.Class({
|
||||
let x = monitor.x + monitor.width / 2.0;
|
||||
let y = monitor.y + monitor.height / 2.0;
|
||||
|
||||
this.uiGroup.set_pivot_point(x / global.screen_width,
|
||||
y / global.screen_height);
|
||||
this.uiGroup.scale_x = this.uiGroup.scale_y = 0.75;
|
||||
this.uiGroup.opacity = 0;
|
||||
this.sessionGroup.set_pivot_point(x / global.screen_width,
|
||||
y / global.screen_height);
|
||||
this.sessionGroup.scale_x = this.sessionGroup.scale_y = 0.75;
|
||||
this.sessionGroup.opacity = 0;
|
||||
global.window_group.set_clip(monitor.x, monitor.y, monitor.width, monitor.height);
|
||||
}
|
||||
|
||||
@ -639,7 +651,7 @@ const LayoutManager = new Lang.Class({
|
||||
},
|
||||
|
||||
_startupAnimationGreeter: function() {
|
||||
Tweener.addTween(this.panelBox,
|
||||
Tweener.addTween(this.panelGroup,
|
||||
{ translation_y: 0,
|
||||
time: STARTUP_ANIMATION_TIME,
|
||||
transition: 'easeOutQuad',
|
||||
@ -648,7 +660,7 @@ const LayoutManager = new Lang.Class({
|
||||
},
|
||||
|
||||
_startupAnimationSession: function() {
|
||||
Tweener.addTween(this.uiGroup,
|
||||
Tweener.addTween(this.sessionGroup,
|
||||
{ scale_x: 1,
|
||||
scale_y: 1,
|
||||
opacity: 255,
|
||||
@ -659,16 +671,9 @@ const LayoutManager = new Lang.Class({
|
||||
},
|
||||
|
||||
_startupAnimationComplete: function() {
|
||||
// At this point, the UI group is covering everything, so
|
||||
// we no longer need to clear the stage
|
||||
global.stage.no_clear_hint = true;
|
||||
|
||||
this._coverPane.destroy();
|
||||
this._coverPane = null;
|
||||
|
||||
this._systemBackground.actor.destroy();
|
||||
this._systemBackground = null;
|
||||
|
||||
this._startingUp = false;
|
||||
|
||||
this.trayBox.show();
|
||||
@ -758,9 +763,9 @@ const LayoutManager = new Lang.Class({
|
||||
// monitor (it will be hidden whenever a fullscreen window is visible,
|
||||
// and shown otherwise)
|
||||
addChrome: function(actor, params) {
|
||||
this.uiGroup.add_actor(actor);
|
||||
if (this.uiGroup.contains(global.top_window_group))
|
||||
this.uiGroup.set_child_below_sibling(actor, global.top_window_group);
|
||||
this.sessionGroup.add_actor(actor);
|
||||
if (this.sessionGroup.contains(global.top_window_group))
|
||||
this.sessionGroup.set_child_below_sibling(actor, global.top_window_group);
|
||||
this._trackActor(actor, params);
|
||||
},
|
||||
|
||||
@ -811,7 +816,7 @@ const LayoutManager = new Lang.Class({
|
||||
//
|
||||
// Removes @actor from the chrome
|
||||
removeChrome: function(actor) {
|
||||
this.uiGroup.remove_actor(actor);
|
||||
this.sessionGroup.remove_actor(actor);
|
||||
this._untrackActor(actor);
|
||||
},
|
||||
|
||||
@ -859,9 +864,6 @@ const LayoutManager = new Lang.Class({
|
||||
_updateVisibility: function() {
|
||||
let windowsVisible = Main.sessionMode.hasWindows && !this._inOverview;
|
||||
|
||||
global.window_group.visible = windowsVisible;
|
||||
global.top_window_group.visible = windowsVisible;
|
||||
|
||||
for (let i = 0; i < this._trackedActors.length; i++) {
|
||||
let actorData = this._trackedActors[i], visible;
|
||||
if (!actorData.trackFullscreen)
|
||||
@ -1080,9 +1082,9 @@ const HotCorner = new Lang.Class({
|
||||
this._ripple2 = new St.BoxLayout({ style_class: 'ripple-box', opacity: 0, visible: false });
|
||||
this._ripple3 = new St.BoxLayout({ style_class: 'ripple-box', opacity: 0, visible: false });
|
||||
|
||||
layoutManager.uiGroup.add_actor(this._ripple1);
|
||||
layoutManager.uiGroup.add_actor(this._ripple2);
|
||||
layoutManager.uiGroup.add_actor(this._ripple3);
|
||||
layoutManager.sessionGroup.add_actor(this._ripple1);
|
||||
layoutManager.sessionGroup.add_actor(this._ripple2);
|
||||
layoutManager.sessionGroup.add_actor(this._ripple3);
|
||||
},
|
||||
|
||||
setBarrierSize: function(size) {
|
||||
|
@ -503,7 +503,7 @@ const Inspector = new Lang.Class({
|
||||
let container = new Shell.GenericContainer({ width: 0,
|
||||
height: 0 });
|
||||
container.connect('allocate', Lang.bind(this, this._allocate));
|
||||
Main.uiGroup.add_actor(container);
|
||||
Main.layoutManager.sessionGroup.add_actor(container);
|
||||
|
||||
let eventHandler = new St.BoxLayout({ name: 'LookingGlassDialog',
|
||||
vertical: false,
|
||||
@ -801,16 +801,14 @@ const LookingGlass = new Lang.Class({
|
||||
this._updateFont();
|
||||
|
||||
// We want it to appear to slide out from underneath the panel
|
||||
Main.uiGroup.add_actor(this.actor);
|
||||
Main.uiGroup.set_child_below_sibling(this.actor,
|
||||
Main.layoutManager.panelBox);
|
||||
Main.layoutManager.panelBox.connect('allocation-changed',
|
||||
Lang.bind(this, this._queueResize));
|
||||
Main.layoutManager.sessionGroup.add_actor(this.actor);
|
||||
Main.layoutManager.panelGroup.connect('allocation-changed',
|
||||
Lang.bind(this, this._queueResize));
|
||||
Main.layoutManager.keyboardBox.connect('allocation-changed',
|
||||
Lang.bind(this, this._queueResize));
|
||||
|
||||
this._objInspector = new ObjInspector(this);
|
||||
Main.uiGroup.add_actor(this._objInspector.actor);
|
||||
Main.layoutManager.sessionGroup.add_actor(this._objInspector.actor);
|
||||
this._objInspector.actor.hide();
|
||||
|
||||
let toolbar = new St.BoxLayout({ name: 'Toolbar' });
|
||||
@ -1037,7 +1035,7 @@ const LookingGlass = new Lang.Class({
|
||||
let availableHeight = primary.height - Main.layoutManager.keyboardBox.height;
|
||||
let myHeight = Math.min(primary.height * 0.7, availableHeight * 0.9);
|
||||
this.actor.x = primary.x + (primary.width - myWidth) / 2;
|
||||
this._hiddenY = primary.y + Main.layoutManager.panelBox.height - myHeight - 4; // -4 to hide the top corners
|
||||
this._hiddenY = primary.y + Main.layoutManager.panelGroup.height - myHeight - 4; // -4 to hide the top corners
|
||||
this._targetY = this._hiddenY + myHeight;
|
||||
this.actor.y = this._hiddenY;
|
||||
this.actor.width = myWidth;
|
||||
|
@ -1184,7 +1184,7 @@ const ZoomRegion = new Lang.Class({
|
||||
|
||||
// Clone the group that contains all of UI on the screen. This is the
|
||||
// chrome, the windows, etc.
|
||||
this._uiGroupClone = new Clutter.Clone({ source: Main.uiGroup });
|
||||
this._uiGroupClone = new Clutter.Clone({ source: Main.layoutManager.uiGroup });
|
||||
mainGroup.add_actor(this._uiGroupClone);
|
||||
|
||||
// Add either the given mouseSourceActor to the ZoomRegion, or a clone of
|
||||
|
@ -64,7 +64,6 @@ let screencastService = null;
|
||||
let modalCount = 0;
|
||||
let keybindingMode = Shell.KeyBindingMode.NONE;
|
||||
let modalActorFocusStack = [];
|
||||
let uiGroup = null;
|
||||
let magnifier = null;
|
||||
let xdndHandler = null;
|
||||
let keyboard = null;
|
||||
@ -150,11 +149,6 @@ function _initializeUI() {
|
||||
// Setup the stage hierarchy early
|
||||
layoutManager = new Layout.LayoutManager();
|
||||
|
||||
// Various parts of the codebase still refers to Main.uiGroup
|
||||
// instead using the layoutManager. This keeps that code
|
||||
// working until it's updated.
|
||||
uiGroup = layoutManager.uiGroup;
|
||||
|
||||
screencastService = new Screencast.ScreencastService();
|
||||
xdndHandler = new XdndHandler.XdndHandler();
|
||||
ctrlAltTabManager = new CtrlAltTab.CtrlAltTabManager();
|
||||
@ -172,6 +166,19 @@ function _initializeUI() {
|
||||
windowAttentionHandler = new WindowAttentionHandler.WindowAttentionHandler();
|
||||
componentManager = new Components.ComponentManager();
|
||||
|
||||
if (sessionMode.isGreeter && screenShield) {
|
||||
layoutManager.connect('startup-prepared', function() {
|
||||
screenShield.showDialog();
|
||||
});
|
||||
}
|
||||
|
||||
layoutManager.connect('startup-complete', function() {
|
||||
if (keybindingMode == Shell.KeyBindingMode.NONE)
|
||||
keybindingMode = Shell.KeyBindingMode.NORMAL;
|
||||
if (screenShield)
|
||||
screenShield.lockIfWasLocked();
|
||||
});
|
||||
|
||||
layoutManager.init();
|
||||
overview.init();
|
||||
|
||||
@ -202,21 +209,6 @@ function _initializeUI() {
|
||||
|
||||
ExtensionDownloader.init();
|
||||
ExtensionSystem.init();
|
||||
|
||||
if (sessionMode.isGreeter && screenShield) {
|
||||
layoutManager.connect('startup-prepared', function() {
|
||||
screenShield.showDialog();
|
||||
});
|
||||
}
|
||||
|
||||
layoutManager.connect('startup-complete', function() {
|
||||
if (keybindingMode == Shell.KeyBindingMode.NONE) {
|
||||
keybindingMode = Shell.KeyBindingMode.NORMAL;
|
||||
}
|
||||
if (screenShield) {
|
||||
screenShield.lockIfWasLocked();
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
function _loadDefaultStylesheet() {
|
||||
|
@ -1611,7 +1611,7 @@ const MessageTrayMenu = new Lang.Class({
|
||||
this._accountManager.prepare_async(null, Lang.bind(this, this._onIMPresenceChanged));
|
||||
|
||||
this.actor.hide();
|
||||
Main.layoutManager.addChrome(this.actor);
|
||||
Main.layoutManager.menuGroup.add_child(this.actor);
|
||||
|
||||
this._busyItem = new PopupMenu.PopupSwitchMenuItem(_("Notifications"));
|
||||
this._busyItem.connect('toggled', Lang.bind(this, this._updatePresence));
|
||||
@ -2512,7 +2512,7 @@ const MessageTray = new Lang.Class({
|
||||
let cloneSource = Main.overview.visible ? Main.layoutManager.overviewGroup : global.window_group;
|
||||
this._desktopClone = new Clutter.Clone({ source: cloneSource,
|
||||
clip: new Clutter.Geometry(this._bottomMonitorGeometry) });
|
||||
Main.uiGroup.insert_child_above(this._desktopClone, cloneSource);
|
||||
Main.layoutManager.sessionGroup.insert_child_above(this._desktopClone, cloneSource);
|
||||
this._desktopClone.x = 0;
|
||||
this._desktopClone.y = 0;
|
||||
this._desktopClone.show();
|
||||
|
@ -41,7 +41,7 @@ const ModalDialog = new Lang.Class({
|
||||
_init: function(params) {
|
||||
params = Params.parse(params, { shellReactive: false,
|
||||
styleClass: null,
|
||||
parentActor: Main.uiGroup,
|
||||
parentActor: Main.layoutManager.dialogGroup,
|
||||
keybindingMode: Shell.KeyBindingMode.SYSTEM_MODAL,
|
||||
shouldFadeIn: true,
|
||||
destroyOnClose: true });
|
||||
|
@ -110,7 +110,7 @@ const OsdWindow = new Lang.Class({
|
||||
Lang.bind(this, this._monitorsChanged));
|
||||
this._monitorsChanged();
|
||||
|
||||
Main.uiGroup.add_child(this.actor);
|
||||
Main.layoutManager.osdGroup.add_child(this.actor);
|
||||
},
|
||||
|
||||
setIcon: function(icon) {
|
||||
|
@ -622,7 +622,7 @@ const Overview = new Lang.Class({
|
||||
this.animationInProgress = true;
|
||||
this.visibleTarget = false;
|
||||
|
||||
this.viewSelector.zoomFromOverview();
|
||||
this.viewSelector.leaveOverview();
|
||||
|
||||
// Make other elements fade out.
|
||||
Tweener.addTween(this._stack,
|
||||
|
@ -901,7 +901,7 @@ const Panel = new Lang.Class({
|
||||
this.actor.remove_style_pseudo_class('overview');
|
||||
}));
|
||||
|
||||
Main.layoutManager.panelBox.add(this.actor);
|
||||
Main.layoutManager.panelGroup.add_child(this.actor);
|
||||
Main.ctrlAltTabManager.addGroup(this.actor, _("Top Bar"), 'emblem-system-symbolic',
|
||||
{ sortGroup: CtrlAltTab.SortGroup.TOP });
|
||||
|
||||
|
@ -130,7 +130,7 @@ const Button = new Lang.Class({
|
||||
this.menu.connect('open-state-changed', Lang.bind(this, this._onOpenStateChanged));
|
||||
this.menu.actor.connect('key-press-event', Lang.bind(this, this._onMenuKeyPress));
|
||||
|
||||
Main.uiGroup.add_actor(this.menu.actor);
|
||||
Main.layoutManager.menuGroup.add_child(this.menu.actor);
|
||||
this.menu.actor.hide();
|
||||
}
|
||||
},
|
||||
|
@ -456,8 +456,6 @@ const ScreenShield = new Lang.Class({
|
||||
Name: 'ScreenShield',
|
||||
|
||||
_init: function() {
|
||||
this.actor = Main.layoutManager.screenShieldGroup;
|
||||
|
||||
this._lockScreenState = MessageTray.State.HIDDEN;
|
||||
this._lockScreenGroup = new St.Widget({ x_expand: true,
|
||||
y_expand: true,
|
||||
@ -466,6 +464,7 @@ const ScreenShield = new Lang.Class({
|
||||
name: 'lockScreenGroup',
|
||||
visible: false,
|
||||
});
|
||||
|
||||
this._lockScreenGroup.connect('key-press-event',
|
||||
Lang.bind(this, this._onLockScreenKeyPress));
|
||||
this._lockScreenGroup.connect('scroll-event',
|
||||
@ -516,10 +515,9 @@ const ScreenShield = new Lang.Class({
|
||||
reactive: true,
|
||||
pivot_point: new Clutter.Point({ x: 0.5, y: 0.5 }),
|
||||
name: 'lockDialogGroup' });
|
||||
Main.layoutManager.systemGroup.add_child(this._lockDialogGroup);
|
||||
|
||||
this.actor.add_actor(this._lockDialogGroup);
|
||||
this.actor.add_actor(this._lockScreenGroup);
|
||||
|
||||
Main.layoutManager.screenShieldGroup.add_child(this._lockScreenGroup);
|
||||
this._presence = new GnomeSession.Presence(Lang.bind(this, function(proxy, error) {
|
||||
if (error) {
|
||||
logError(error, 'Error while reading gnome-session presence');
|
||||
@ -577,19 +575,27 @@ const ScreenShield = new Lang.Class({
|
||||
// The "long" lightbox is used for the longer (20 seconds) fade from session
|
||||
// to idle status, the "short" is used for quickly fading to black when locking
|
||||
// manually
|
||||
this._longLightbox = new Lightbox.Lightbox(Main.uiGroup,
|
||||
this._longLightbox = new Lightbox.Lightbox(Main.layoutManager.overlayGroup,
|
||||
{ inhibitEvents: true,
|
||||
fadeFactor: 1 });
|
||||
this._longLightbox.connect('shown', Lang.bind(this, this._onLongLightboxShown));
|
||||
this._shortLightbox = new Lightbox.Lightbox(Main.uiGroup,
|
||||
this._shortLightbox = new Lightbox.Lightbox(Main.layoutManager.overlayGroup,
|
||||
{ inhibitEvents: true,
|
||||
fadeFactor: 1 });
|
||||
this._shortLightbox.connect('shown', Lang.bind(this, this._onShortLightboxShown));
|
||||
|
||||
Main.layoutManager.connect('monitors-changed', Lang.bind(this, this._monitorsChanged));
|
||||
this._monitorsChanged();
|
||||
|
||||
this.idleMonitor = Meta.IdleMonitor.get_core();
|
||||
this._cursorTracker = Meta.CursorTracker.get_for_screen(global.screen);
|
||||
},
|
||||
|
||||
_monitorsChanged: function() {
|
||||
this._longLightbox.actor.set_size(global.screen_width, global.screen_height);
|
||||
this._shortLightbox.actor.set_size(global.screen_width, global.screen_height);
|
||||
},
|
||||
|
||||
_createBackground: function(monitorIndex) {
|
||||
let monitor = Main.layoutManager.monitors[monitorIndex];
|
||||
let widget = new St.Widget({ style_class: 'screen-shield-background',
|
||||
@ -647,14 +653,14 @@ const ScreenShield = new Lang.Class({
|
||||
if (this._isModal)
|
||||
return true;
|
||||
|
||||
this._isModal = Main.pushModal(this.actor, { keybindingMode: Shell.KeyBindingMode.LOCK_SCREEN });
|
||||
this._isModal = Main.pushModal(this._lockDialogGroup, { keybindingMode: Shell.KeyBindingMode.LOCK_SCREEN });
|
||||
if (this._isModal)
|
||||
return true;
|
||||
|
||||
// We failed to get a pointer grab, it means that
|
||||
// something else has it. Try with a keyboard grab only
|
||||
this._isModal = Main.pushModal(this.actor, { options: Meta.ModalOptions.POINTER_ALREADY_GRABBED,
|
||||
keybindingMode: Shell.KeyBindingMode.LOCK_SCREEN });
|
||||
this._isModal = Main.pushModal(this._lockDialogGroup, { options: Meta.ModalOptions.POINTER_ALREADY_GRABBED,
|
||||
keybindingMode: Shell.KeyBindingMode.LOCK_SCREEN });
|
||||
return this._isModal;
|
||||
},
|
||||
|
||||
@ -912,7 +918,7 @@ const ScreenShield = new Lang.Class({
|
||||
return false;
|
||||
}));
|
||||
|
||||
this.actor.show();
|
||||
this._lockDialogGroup.show();
|
||||
this._isGreeter = Main.sessionMode.isGreeter;
|
||||
this._isLocked = true;
|
||||
if (this._ensureUnlockDialog(true, true))
|
||||
@ -1002,6 +1008,7 @@ const ScreenShield = new Lang.Class({
|
||||
return;
|
||||
|
||||
this._ensureLockScreen();
|
||||
this._lockDialogGroup.hide();
|
||||
this._lockDialogGroup.scale_x = 1;
|
||||
this._lockDialogGroup.scale_y = 1;
|
||||
|
||||
@ -1100,8 +1107,10 @@ const ScreenShield = new Lang.Class({
|
||||
}));
|
||||
this._cursorTracker.set_pointer_visible(false);
|
||||
|
||||
this._lockScreenState = MessageTray.State.SHOWN;
|
||||
this._lockDialogGroup.show();
|
||||
this._lockScreenGroup.fixed_position_set = false;
|
||||
this._lockScreenState = MessageTray.State.SHOWN;
|
||||
Main.layoutManager.sessionGroup.hide();
|
||||
this._lockScreenScrollCounter = 0;
|
||||
|
||||
if (params.fadeToBlack && params.animateFade) {
|
||||
@ -1224,10 +1233,11 @@ const ScreenShield = new Lang.Class({
|
||||
this._dialog.popModal();
|
||||
|
||||
if (this._isModal) {
|
||||
Main.popModal(this.actor);
|
||||
Main.popModal(this._lockDialogGroup);
|
||||
this._isModal = false;
|
||||
}
|
||||
|
||||
Main.layoutManager.sessionGroup.show();
|
||||
Tweener.addTween(this._lockDialogGroup, {
|
||||
scale_x: 0,
|
||||
scale_y: 0,
|
||||
@ -1246,7 +1256,7 @@ const ScreenShield = new Lang.Class({
|
||||
|
||||
this._longLightbox.hide();
|
||||
this._shortLightbox.hide();
|
||||
this.actor.hide();
|
||||
this._lockScreenGroup.hide();
|
||||
|
||||
if (this._becameActiveId != 0) {
|
||||
this.idleMonitor.remove_watch(this._becameActiveId);
|
||||
@ -1270,7 +1280,7 @@ const ScreenShield = new Lang.Class({
|
||||
if (this._activationTime == 0)
|
||||
this._activationTime = GLib.get_monotonic_time();
|
||||
|
||||
this.actor.show();
|
||||
this._lockScreenGroup.show();
|
||||
|
||||
if (Main.sessionMode.currentMode != 'unlock-dialog' &&
|
||||
Main.sessionMode.currentMode != 'lock-screen') {
|
||||
|
@ -146,7 +146,7 @@ const SelectArea = new Lang.Class({
|
||||
reactive: true,
|
||||
x: 0,
|
||||
y: 0 });
|
||||
Main.uiGroup.add_actor(this._group);
|
||||
Main.layoutManager.osdGroup.add_actor(this._group);
|
||||
|
||||
this._group.connect('button-press-event',
|
||||
Lang.bind(this, this._onButtonPress));
|
||||
@ -259,9 +259,9 @@ const Flashspot = new Lang.Class({
|
||||
Extends: Lightbox.Lightbox,
|
||||
|
||||
_init: function(area) {
|
||||
this.parent(Main.uiGroup, { inhibitEvents: true,
|
||||
width: area.width,
|
||||
height: area.height });
|
||||
this.parent(Main.layoutManager.osdGroup, { inhibitEvents: true,
|
||||
width: area.width,
|
||||
height: area.height });
|
||||
|
||||
this.actor.style_class = 'flashspot';
|
||||
this.actor.set_position(area.x, area.y);
|
||||
|
@ -36,7 +36,7 @@ const EntryMenu = new Lang.Class({
|
||||
|
||||
this._passwordItem = null;
|
||||
|
||||
Main.uiGroup.add_actor(this.actor);
|
||||
Main.layoutManager.menuGroup.add_actor(this.actor);
|
||||
this.actor.hide();
|
||||
},
|
||||
|
||||
|
@ -54,7 +54,7 @@ const SwitcherPopup = new Lang.Class({
|
||||
this.actor.connect('allocate', Lang.bind(this, this._allocate));
|
||||
this.actor.connect('destroy', Lang.bind(this, this._onDestroy));
|
||||
|
||||
Main.uiGroup.add_actor(this.actor);
|
||||
Main.layoutManager.switcherPopupGroup.add_child(this.actor);
|
||||
|
||||
this._haveModal = false;
|
||||
this._modifierMask = 0;
|
||||
|
@ -118,13 +118,11 @@ const ViewSelector = new Lang.Class({
|
||||
this._stageKeyPressId = 0;
|
||||
Main.overview.connect('showing', Lang.bind(this,
|
||||
function () {
|
||||
this._resetShowAppsButton();
|
||||
this._stageKeyPressId = global.stage.connect('key-press-event',
|
||||
Lang.bind(this, this._onStageKeyPress));
|
||||
}));
|
||||
Main.overview.connect('hiding', Lang.bind(this,
|
||||
function () {
|
||||
this._resetShowAppsButton();
|
||||
if (this._stageKeyPressId != 0) {
|
||||
global.stage.disconnect(this._stageKeyPressId);
|
||||
this._stageKeyPressId = 0;
|
||||
@ -160,19 +158,26 @@ const ViewSelector = new Lang.Class({
|
||||
show: function() {
|
||||
this.reset();
|
||||
|
||||
this._showAppsBlocked = true;
|
||||
this._showAppsButton.checked = false;
|
||||
this._showAppsBlocked = false;
|
||||
|
||||
this._workspacesPage.opacity = 255;
|
||||
this._workspacesDisplay.show();
|
||||
this._activePage = null;
|
||||
this._showPage(this._workspacesPage);
|
||||
this._syncActivePage();
|
||||
|
||||
if (!this._workspacesDisplay.activeWorkspaceHasMaximizedWindows())
|
||||
Main.overview.fadeOutDesktop();
|
||||
},
|
||||
|
||||
zoomFromOverview: function() {
|
||||
this._workspacesDisplay.zoomFromOverview();
|
||||
|
||||
leaveOverview: function() {
|
||||
if (!this._workspacesDisplay.activeWorkspaceHasMaximizedWindows())
|
||||
Main.overview.fadeInDesktop();
|
||||
|
||||
// If we're not on the windows page, don't zoom back the primary monitor.
|
||||
let zoomPrimary = (this._activePage == this._workspacesPage);
|
||||
this._workspacesDisplay.leaveOverview(zoomPrimary);
|
||||
},
|
||||
|
||||
setWorkspacesFullGeometry: function(geom) {
|
||||
@ -181,6 +186,9 @@ const ViewSelector = new Lang.Class({
|
||||
|
||||
hide: function() {
|
||||
this._workspacesDisplay.hide();
|
||||
if (this._activePage)
|
||||
this._activePage.hide();
|
||||
this._activePage = null;
|
||||
},
|
||||
|
||||
_addPage: function(actor, name, a11yIcon, params) {
|
||||
@ -215,13 +223,13 @@ const ViewSelector = new Lang.Class({
|
||||
this._activePage.navigate_focus(null, Gtk.DirectionType.TAB_FORWARD, false);
|
||||
this._activePage.show();
|
||||
Tweener.addTween(this._activePage,
|
||||
{ opacity: 255,
|
||||
time: OverviewControls.SIDE_CONTROLS_ANIMATION_TIME,
|
||||
transition: 'easeOutQuad'
|
||||
});
|
||||
{ opacity: 255,
|
||||
time: OverviewControls.SIDE_CONTROLS_ANIMATION_TIME,
|
||||
transition: 'easeOutQuad'
|
||||
});
|
||||
},
|
||||
|
||||
_showPage: function(page, noFade) {
|
||||
_setActivePage: function(page) {
|
||||
if (page == this._activePage)
|
||||
return;
|
||||
|
||||
@ -229,7 +237,7 @@ const ViewSelector = new Lang.Class({
|
||||
this._activePage = page;
|
||||
this.emit('page-changed');
|
||||
|
||||
if (oldPage && !noFade)
|
||||
if (oldPage)
|
||||
Tweener.addTween(oldPage,
|
||||
{ opacity: 0,
|
||||
time: OverviewControls.SIDE_CONTROLS_ANIMATION_TIME,
|
||||
@ -248,20 +256,25 @@ const ViewSelector = new Lang.Class({
|
||||
page.navigate_focus(null, Gtk.DirectionType.TAB_FORWARD, false);
|
||||
},
|
||||
|
||||
_onShowAppsButtonToggled: function() {
|
||||
if (this._showAppsBlocked)
|
||||
return;
|
||||
|
||||
this._showPage(this._showAppsButton.checked ?
|
||||
this._appsPage : this._workspacesPage);
|
||||
_getActivePage: function() {
|
||||
if (this._searchActive)
|
||||
return this._searchPage;
|
||||
else if (this._showAppsButton.checked)
|
||||
return this._appsPage;
|
||||
else
|
||||
return this._workspacesPage;
|
||||
},
|
||||
|
||||
_resetShowAppsButton: function() {
|
||||
this._showAppsBlocked = true;
|
||||
this._showAppsButton.checked = false;
|
||||
this._showAppsBlocked = false;
|
||||
_syncActivePage: function() {
|
||||
let activePage = this._getActivePage();
|
||||
if (activePage == this._activePage)
|
||||
return;
|
||||
this._setActivePage(activePage);
|
||||
},
|
||||
|
||||
this._showPage(this._workspacesPage, true);
|
||||
_onShowAppsButtonToggled: function() {
|
||||
if (!this._showAppsBlocked)
|
||||
this._syncActivePage();
|
||||
},
|
||||
|
||||
_onStageKeyPress: function(actor, event) {
|
||||
@ -287,20 +300,6 @@ const ViewSelector = new Lang.Class({
|
||||
return Clutter.EVENT_PROPAGATE;
|
||||
},
|
||||
|
||||
_searchCancelled: function() {
|
||||
this._showPage(this._showAppsButton.checked ? this._appsPage
|
||||
: this._workspacesPage);
|
||||
|
||||
// Leave the entry focused when it doesn't have any text;
|
||||
// when replacing a selected search term, Clutter emits
|
||||
// two 'text-changed' signals, one for deleting the previous
|
||||
// text and one for the new one - the second one is handled
|
||||
// incorrectly when we remove focus
|
||||
// (https://bugzilla.gnome.org/show_bug.cgi?id=636341) */
|
||||
if (this._text.text != '')
|
||||
this.reset();
|
||||
},
|
||||
|
||||
reset: function () {
|
||||
global.stage.set_key_focus(null);
|
||||
|
||||
@ -391,8 +390,18 @@ const ViewSelector = new Lang.Class({
|
||||
}
|
||||
|
||||
this._entry.set_secondary_icon(null);
|
||||
this._searchCancelled();
|
||||
|
||||
// Leave the entry focused when it doesn't have any text;
|
||||
// when replacing a selected search term, Clutter emits
|
||||
// two 'text-changed' signals, one for deleting the previous
|
||||
// text and one for the new one - the second one is handled
|
||||
// incorrectly when we remove focus
|
||||
// (https://bugzilla.gnome.org/show_bug.cgi?id=636341) */
|
||||
if (this._text.text != '')
|
||||
this.reset();
|
||||
}
|
||||
|
||||
this._syncActivePage();
|
||||
},
|
||||
|
||||
_onKeyPress: function(entry, event) {
|
||||
@ -459,9 +468,7 @@ const ViewSelector = new Lang.Class({
|
||||
this._searchTimeoutId = 0;
|
||||
|
||||
let terms = getTermsForSearchString(this._entry.get_text());
|
||||
|
||||
this._searchResults.setTerms(terms);
|
||||
this._showPage(this._searchPage);
|
||||
|
||||
return GLib.SOURCE_REMOVE;
|
||||
},
|
||||
|
@ -1521,34 +1521,39 @@ const Workspace = new Lang.Class({
|
||||
this._recalculateWindowPositions(WindowPositionFlags.ANIMATE | WindowPositionFlags.INITIAL);
|
||||
},
|
||||
|
||||
// Animates the return from Overview mode
|
||||
zoomFromOverview : function() {
|
||||
_leavingOverview: function() {
|
||||
let currentWorkspace = global.screen.get_active_workspace();
|
||||
if (this.metaWorkspace != null && this.metaWorkspace != currentWorkspace)
|
||||
return false;
|
||||
|
||||
this.leavingOverview = true;
|
||||
this._overviewHiddenId = Main.overview.connect('hidden', Lang.bind(this,
|
||||
this._doneLeavingOverview));
|
||||
|
||||
for (let i = 0; i < this._windows.length; i++) {
|
||||
let clone = this._windows[i];
|
||||
Tweener.removeTweens(clone.actor);
|
||||
|
||||
let overlay = this._windowOverlays[i];
|
||||
if (overlay)
|
||||
overlay.hide();
|
||||
}
|
||||
|
||||
if (this._repositionWindowsId > 0) {
|
||||
Mainloop.source_remove(this._repositionWindowsId);
|
||||
this._repositionWindowsId = 0;
|
||||
}
|
||||
this._overviewHiddenId = Main.overview.connect('hidden', Lang.bind(this,
|
||||
this._doneLeavingOverview));
|
||||
|
||||
if (this.metaWorkspace != null && this.metaWorkspace != currentWorkspace)
|
||||
return true;
|
||||
},
|
||||
|
||||
// Animates the return from Overview mode
|
||||
zoomFromOverview : function() {
|
||||
if (!this._leavingOverview())
|
||||
return;
|
||||
|
||||
// Position and scale the windows.
|
||||
for (let i = 0; i < this._windows.length; i++) {
|
||||
let clone = this._windows[i];
|
||||
let overlay = this._windowOverlays[i];
|
||||
|
||||
if (overlay)
|
||||
overlay.hide();
|
||||
|
||||
if (clone.metaWindow.showing_on_its_workspace()) {
|
||||
let [origX, origY] = clone.getOriginalPosition();
|
||||
@ -1575,6 +1580,31 @@ const Workspace = new Lang.Class({
|
||||
}
|
||||
},
|
||||
|
||||
fadeFromOverview: function() {
|
||||
if (!this._leavingOverview())
|
||||
return;
|
||||
|
||||
for (let i = 0; i < this._windows.length; i++) {
|
||||
let clone = this._windows[i];
|
||||
|
||||
if (clone.metaWindow.showing_on_its_workspace()) {
|
||||
clone.actor.x = clone.origX;
|
||||
clone.actor.y = clone.origY;
|
||||
clone.actor.scale_x = 1.0;
|
||||
clone.actor.scale_y = 1.0;
|
||||
clone.actor.opacity = 0;
|
||||
|
||||
Tweener.addTween(clone.actor,
|
||||
{ opacity: 255,
|
||||
time: Overview.ANIMATION_TIME,
|
||||
transition: 'easeOutQuad'
|
||||
});
|
||||
} else {
|
||||
clone.actor.hide();
|
||||
}
|
||||
}
|
||||
},
|
||||
|
||||
destroy : function() {
|
||||
this.actor.destroy();
|
||||
},
|
||||
|
@ -25,7 +25,7 @@ const WorkspaceSwitcherPopup = new Lang.Class({
|
||||
width: global.screen_width,
|
||||
height: global.screen_height,
|
||||
style_class: 'workspace-switcher-group' });
|
||||
Main.uiGroup.add_actor(this.actor);
|
||||
Main.layoutManager.osdGroup.add_child(this.actor);
|
||||
|
||||
this._container = new St.BoxLayout({ style_class: 'workspace-switcher-container' });
|
||||
this._list = new Shell.GenericContainer({ style_class: 'workspace-switcher' });
|
||||
|
@ -145,11 +145,22 @@ const WorkspacesView = new Lang.Class({
|
||||
this._updateWorkspaceActors(false);
|
||||
},
|
||||
|
||||
zoomFromOverview: function() {
|
||||
_leaveOverview: function() {
|
||||
this.actor.remove_clip();
|
||||
},
|
||||
|
||||
for (let w = 0; w < this._workspaces.length; w++)
|
||||
this._workspaces[w].zoomFromOverview();
|
||||
zoomFromOverview: function() {
|
||||
this._leaveOverview();
|
||||
this._workspaces.forEach(function(w) {
|
||||
w.zoomFromOverview();
|
||||
});
|
||||
},
|
||||
|
||||
fadeFromOverview: function() {
|
||||
this._leaveOverview();
|
||||
this._workspaces.forEach(function(w) {
|
||||
w.fadeFromOverview();
|
||||
});
|
||||
},
|
||||
|
||||
syncStacking: function(stackIndices) {
|
||||
@ -365,6 +376,10 @@ const ExtraWorkspaceView = new Lang.Class({
|
||||
this._workspace.zoomFromOverview();
|
||||
},
|
||||
|
||||
fadeFromOverview: function() {
|
||||
this._workspace.fadeFromOverview();
|
||||
},
|
||||
|
||||
syncStacking: function(stackIndices) {
|
||||
this._workspace.syncStacking(stackIndices);
|
||||
},
|
||||
@ -466,9 +481,18 @@ const WorkspacesDisplay = new Lang.Class({
|
||||
this._scrollEventId = Main.overview.connect('scroll-event', Lang.bind(this, this._onScrollEvent));
|
||||
},
|
||||
|
||||
zoomFromOverview: function() {
|
||||
for (let i = 0; i < this._workspacesViews.length; i++)
|
||||
this._workspacesViews[i].zoomFromOverview();
|
||||
leaveOverview: function(zoomPrimary) {
|
||||
for (let i = 0; i < this._workspacesViews.length; i++) {
|
||||
let view = this._workspacesViews[i];
|
||||
if (i == this._primaryIndex) {
|
||||
if (zoomPrimary)
|
||||
view.zoomFromOverview();
|
||||
else
|
||||
view.fadeFromOverview();
|
||||
} else {
|
||||
view.zoomFromOverview();
|
||||
}
|
||||
}
|
||||
},
|
||||
|
||||
hide: function() {
|
||||
|
@ -18,7 +18,7 @@ const XdndHandler = new Lang.Class({
|
||||
|
||||
// Used as a drag actor in case we don't have a cursor window clone
|
||||
this._dummy = new Clutter.Actor({ width: 1, height: 1, opacity: 0 });
|
||||
Main.uiGroup.add_actor(this._dummy);
|
||||
Main.layoutManager.sessionGroup.add_actor(this._dummy);
|
||||
this._dummy.hide();
|
||||
|
||||
if (!Meta.is_wayland_compositor())
|
||||
@ -69,7 +69,7 @@ const XdndHandler = new Lang.Class({
|
||||
source: cursorWindow});
|
||||
|
||||
this._cursorWindowClone = new Clutter.Clone({ source: cursorWindow });
|
||||
Main.uiGroup.add_actor(this._cursorWindowClone);
|
||||
Main.layoutManager.sessionGroup.add_actor(this._cursorWindowClone);
|
||||
|
||||
// Make sure that the clone has the same position as the source
|
||||
this._cursorWindowClone.add_constraint(constraint_position);
|
||||
|
Loading…
Reference in New Issue
Block a user