endSessionDialog: fix keyboard navigation

The addition of _backgroundStack to ModalDialog broke focus
navigation, because it was interposed between the focus group root and
all of the interesting content, but since it isn't an StWidget,
st_widget_navigate_focus() was unable to navigate through it. Fix this
by moving the focus root to this._dialogLayout (inside the
_backgroundStack) instead.

Additionally, in EndSessionDialog specifically, _initialKeyFocus
wasn't being set until after opening the dialog, so it was ignored.

Also change ModalDialog.close() to clear the _savedKeyFocus that
popModal() set, so that dialogs that are repeatedly closed and
reopened will have their focus revert back to _initialKeyFocus each
time.

https://bugzilla.gnome.org/show_bug.cgi?id=646740
This commit is contained in:
Dan Winship 2011-04-06 12:54:47 -04:00
parent 42e26a8682
commit 59c3e3a179
2 changed files with 7 additions and 9 deletions

View File

@ -408,10 +408,6 @@ EndSessionDialog.prototype = {
}, },
_updateButtons: function() { _updateButtons: function() {
if (this.state != ModalDialog.State.OPENING &&
this.state != ModalDialog.State.OPENED)
return;
let dialogContent = DialogContent[this._type]; let dialogContent = DialogContent[this._type];
let buttons = [{ action: Lang.bind(this, this.cancel), let buttons = [{ action: Lang.bind(this, this.cancel),
label: _("Cancel"), label: _("Cancel"),
@ -521,11 +517,12 @@ EndSessionDialog.prototype = {
this._inhibitors.push(inhibitor); this._inhibitors.push(inhibitor);
} }
this._updateButtons();
if (!this.open(timestamp)) if (!this.open(timestamp))
throw new DBus.DBusError('org.gnome.Shell.ModalDialog.GrabError', throw new DBus.DBusError('org.gnome.Shell.ModalDialog.GrabError',
"Cannot grab pointer and keyboard"); "Cannot grab pointer and keyboard");
this._updateButtons();
this._updateContent(); this._updateContent();
let signalId = this.connect('opened', let signalId = this.connect('opened',

View File

@ -50,10 +50,6 @@ ModalDialog.prototype = {
coordinate: Clutter.BindCoordinate.POSITION | Clutter.BindCoordinate.SIZE }); coordinate: Clutter.BindCoordinate.POSITION | Clutter.BindCoordinate.SIZE });
this._group.add_constraint(constraint); this._group.add_constraint(constraint);
global.focus_manager.add_group(this._group);
this._initialKeyFocus = this._group;
this._savedKeyFocus = null;
this._group.connect('destroy', Lang.bind(this, this._onGroupDestroy)); this._group.connect('destroy', Lang.bind(this, this._onGroupDestroy));
this._actionKeys = {}; this._actionKeys = {};
@ -94,6 +90,10 @@ ModalDialog.prototype = {
{ expand: true, { expand: true,
x_align: St.Align.MIDDLE, x_align: St.Align.MIDDLE,
y_align: St.Align.END }); y_align: St.Align.END });
global.focus_manager.add_group(this._dialogLayout);
this._initialKeyFocus = this._dialogLayout;
this._savedKeyFocus = null;
}, },
setButtons: function(buttons) { setButtons: function(buttons) {
@ -195,6 +195,7 @@ ModalDialog.prototype = {
this.state = State.CLOSING; this.state = State.CLOSING;
this.popModal(timestamp); this.popModal(timestamp);
this._savedKeyFocus = null;
Tweener.addTween(this._group, Tweener.addTween(this._group,
{ opacity: 0, { opacity: 0,