modalDialog: add mode that leaves shell reactive

A modal dialog in the shell blocks anything but that dialog from
receiving user input. Applications within the session and other
parts of UI are rendered non-reactive.

When GDM gets changed to use the shell for its greeter, the user
list will be presented as a shell dialog. That dialog shouldn't
block access to the panel menus, etc.

This commit adds a shellReactive property that makes the ModalDialog
class continue to block access to applications, but allow the user
to interact with the shell itself.

https://bugzilla.gnome.org/show_bug.cgi?id=657082
This commit is contained in:
Ray Strode 2011-08-27 23:04:56 -04:00
parent 239a9e4816
commit db39ba3b9f

View File

@ -35,10 +35,12 @@ function ModalDialog() {
ModalDialog.prototype = { ModalDialog.prototype = {
_init: function(params) { _init: function(params) {
params = Params.parse(params, { styleClass: null }); params = Params.parse(params, { shellReactive: false,
styleClass: null });
this.state = State.CLOSED; this.state = State.CLOSED;
this._hasModal = false; this._hasModal = false;
this._shellReactive = params.shellReactive;
this._group = new St.Group({ visible: false, this._group = new St.Group({ visible: false,
x: 0, x: 0,
@ -54,26 +56,30 @@ ModalDialog.prototype = {
this._actionKeys = {}; this._actionKeys = {};
this._group.connect('key-press-event', Lang.bind(this, this._onKeyPressEvent)); this._group.connect('key-press-event', Lang.bind(this, this._onKeyPressEvent));
this._lightbox = new Lightbox.Lightbox(this._group,
{ inhibitEvents: true });
this._backgroundBin = new St.Bin(); this._backgroundBin = new St.Bin();
this._group.add_actor(this._backgroundBin); this._group.add_actor(this._backgroundBin);
this._lightbox.highlight(this._backgroundBin);
this._backgroundStack = new Shell.Stack();
this._backgroundBin.child = this._backgroundStack;
this._eventBlocker = new Clutter.Group({ reactive: true });
this._backgroundStack.add_actor(this._eventBlocker);
this._dialogLayout = new St.BoxLayout({ style_class: 'modal-dialog', this._dialogLayout = new St.BoxLayout({ style_class: 'modal-dialog',
vertical: true }); vertical: true });
if (params.styleClass != null) { if (params.styleClass != null) {
this._dialogLayout.add_style_class_name(params.styleClass); this._dialogLayout.add_style_class_name(params.styleClass);
} }
this._backgroundStack.add_actor(this._dialogLayout);
if (!this._shellReactive) {
this._lightbox = new Lightbox.Lightbox(this._group,
{ inhibitEvents: true });
this._lightbox.highlight(this._backgroundBin);
let stack = new Shell.Stack();
this._backgroundBin.child = stack;
this._eventBlocker = new Clutter.Group({ reactive: true });
stack.add_actor(this._eventBlocker);
stack.add_actor(this._dialogLayout);
} else {
this._backgroundBin.child = this._dialogLayout;
}
this.contentLayout = new St.BoxLayout({ vertical: true }); this.contentLayout = new St.BoxLayout({ vertical: true });
this._dialogLayout.add(this.contentLayout, this._dialogLayout.add(this.contentLayout,
@ -179,7 +185,8 @@ ModalDialog.prototype = {
this.state = State.OPENING; this.state = State.OPENING;
this._dialogLayout.opacity = 255; this._dialogLayout.opacity = 255;
this._lightbox.show(); if (this._lightbox)
this._lightbox.show();
this._group.opacity = 0; this._group.opacity = 0;
this._group.show(); this._group.show();
Tweener.addTween(this._group, Tweener.addTween(this._group,
@ -245,7 +252,8 @@ ModalDialog.prototype = {
global.gdk_screen.get_display().sync(); global.gdk_screen.get_display().sync();
this._hasModal = false; this._hasModal = false;
this._eventBlocker.raise_top(); if (!this._shellReactive)
this._eventBlocker.raise_top();
}, },
pushModal: function (timestamp) { pushModal: function (timestamp) {
@ -261,7 +269,8 @@ ModalDialog.prototype = {
} else } else
this._initialKeyFocus.grab_key_focus(); this._initialKeyFocus.grab_key_focus();
this._eventBlocker.lower_bottom(); if (!this._shellReactive)
this._eventBlocker.lower_bottom();
return true; return true;
}, },