dialog: Fix setting buttons as initial key focus

Commit 1c7a3ee61b broke setting the initial key focus for default
buttons added via addButton(). Fix this by allowing the dialog class
to provide a different default widget to ModalDialog than the entire
dialog itself.

https://bugzilla.gnome.org/show_bug.cgi?id=788282
This commit is contained in:
Florian Müllner 2017-09-28 12:38:33 +02:00
parent 1939e22c22
commit 0b02f757f8
2 changed files with 10 additions and 4 deletions

View File

@ -15,6 +15,7 @@ var Dialog = new Lang.Class({
this.parent({ layout_manager: new Clutter.BinLayout() }); this.parent({ layout_manager: new Clutter.BinLayout() });
this.connect('destroy', Lang.bind(this, this._onDestroy)); this.connect('destroy', Lang.bind(this, this._onDestroy));
this._initialKeyFocus = null;
this._pressedKey = null; this._pressedKey = null;
this._buttonKeys = {}; this._buttonKeys = {};
this._createDialog(); this._createDialog();
@ -86,6 +87,10 @@ var Dialog = new Lang.Class({
return Clutter.EVENT_PROPAGATE; return Clutter.EVENT_PROPAGATE;
}, },
get initialKeyFocus() {
return this._initialKeyFocus || this;
},
addContent: function (actor) { addContent: function (actor) {
this.contentLayout.add (actor, { expand: true }); this.contentLayout.add (actor, { expand: true });
}, },
@ -116,7 +121,7 @@ var Dialog = new Lang.Class({
if (isDefault) if (isDefault)
button.add_style_pseudo_class('default'); button.add_style_pseudo_class('default');
if (!this._initialKeyFocusDestroyId) if (this._initialKeyFocus == null || isDefault)
this._initialKeyFocus = button; this._initialKeyFocus = button;
for (let i in keys) for (let i in keys)

View File

@ -84,7 +84,7 @@ var ModalDialog = new Lang.Class({
} }
global.focus_manager.add_group(this.dialogLayout); global.focus_manager.add_group(this.dialogLayout);
this._initialKeyFocus = this.dialogLayout; this._initialKeyFocus = null;
this._initialKeyFocusDestroyId = 0; this._initialKeyFocusDestroyId = 0;
this._savedKeyFocus = null; this._savedKeyFocus = null;
}, },
@ -157,7 +157,7 @@ var ModalDialog = new Lang.Class({
this._initialKeyFocus = actor; this._initialKeyFocus = actor;
this._initialKeyFocusDestroyId = actor.connect('destroy', Lang.bind(this, function() { this._initialKeyFocusDestroyId = actor.connect('destroy', Lang.bind(this, function() {
this._initialKeyFocus = this.dialogLayout; this._initialKeyFocus = null;
this._initialKeyFocusDestroyId = 0; this._initialKeyFocusDestroyId = 0;
})); }));
}, },
@ -237,7 +237,8 @@ var ModalDialog = new Lang.Class({
this._savedKeyFocus.grab_key_focus(); this._savedKeyFocus.grab_key_focus();
this._savedKeyFocus = null; this._savedKeyFocus = null;
} else { } else {
this._initialKeyFocus.grab_key_focus(); let focus = this._initialKeyFocus || this.dialogLayout.initialKeyFocus;
focus.grab_key_focus();
} }
if (!this._shellReactive) if (!this._shellReactive)