Enables navigation using arrow keys in notifications with buttons.

Users can now use the keyboard and mouse to navigate with buttons
interchangeably, instead of entirely using only mouse.

https://bugzilla.gnome.org/show_bug.cgi?id=630937
This commit is contained in:
Hellyna Ng 2011-01-20 13:16:47 +08:00 committed by Dan Winship
parent 33100cd204
commit 0e4a47c0aa
2 changed files with 21 additions and 1 deletions

View File

@ -921,6 +921,10 @@ StTooltip StLabel {
border: 1px solid #a1a1a1; border: 1px solid #a1a1a1;
} }
.notification-button:focus {
background-color: #666666;
}
.notification-button:active { .notification-button:active {
border: 1px solid #a1a1a1; border: 1px solid #a1a1a1;
background-color: #2b2b2b; background-color: #2b2b2b;
@ -933,6 +937,10 @@ StTooltip StLabel {
} }
.notification-icon-button:hover { .notification-icon-button:hover {
border: 2px rgba(161,161,161,0.7);
}
.notification-icon-button:focus {
background: rgba(192,192,192,0.7); background: rgba(192,192,192,0.7);
} }

View File

@ -262,6 +262,7 @@ Notification.prototype = {
this._titleFitsInBannerMode = true; this._titleFitsInBannerMode = true;
this._spacing = 0; this._spacing = 0;
this._buttonFocusManager = null;
this._hasFocus = false; this._hasFocus = false;
this._lockTrayOnFocusGrab = false; this._lockTrayOnFocusGrab = false;
// We use this._prevFocusedWindow and this._prevKeyFocusActor to return the // We use this._prevFocusedWindow and this._prevKeyFocusActor to return the
@ -504,7 +505,7 @@ Notification.prototype = {
this._buttonBox = box; this._buttonBox = box;
} }
let button = new St.Button(); let button = new St.Button({ can_focus: true });
if (this._useActionIcons && Gtk.IconTheme.get_default().has_icon(id)) { if (this._useActionIcons && Gtk.IconTheme.get_default().has_icon(id)) {
button.add_style_class_name('notification-icon-button'); button.add_style_class_name('notification-icon-button');
@ -514,8 +515,15 @@ Notification.prototype = {
button.label = label; button.label = label;
} }
if (!this._buttonFocusManager)
this._buttonFocusManager = St.FocusManager.get_for_stage(global.stage);
if (this._buttonBox.get_children().length > 0)
this._buttonFocusManager.remove_group(this._buttonBox);
this._buttonBox.add(button); this._buttonBox.add(button);
this._buttonFocusManager.add_group(this._buttonBox);
button.connect('clicked', Lang.bind(this, this._onActionInvoked, id)); button.connect('clicked', Lang.bind(this, this._onActionInvoked, id));
this._updated(); this._updated();
}, },
@ -665,6 +673,10 @@ Notification.prototype = {
this._focusActorChangedId = global.stage.connect('notify::key-focus', Lang.bind(this, this._focusActorChanged)); this._focusActorChangedId = global.stage.connect('notify::key-focus', Lang.bind(this, this._focusActorChanged));
this._hasFocus = true; this._hasFocus = true;
if (this._buttonFocusManager)
this._buttonBox.get_children()[0].grab_key_focus();
if (lockTray) if (lockTray)
Main.messageTray.lock(); Main.messageTray.lock();
}, },