menu keyboard navigation fixes, patch from Junichiro Kita

This commit is contained in:
fluxgen 2004-01-16 11:02:54 +00:00
parent 8cb258d68a
commit bc672d4a1d

View file

@ -22,7 +22,7 @@
// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER // FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
// DEALINGS IN THE SOFTWARE. // DEALINGS IN THE SOFTWARE.
// $Id: Menu.cc,v 1.52 2004/01/08 22:07:00 fluxgen Exp $ // $Id: Menu.cc,v 1.53 2004/01/16 11:02:54 fluxgen Exp $
//use GNU extensions //use GNU extensions
#ifndef _GNU_SOURCE #ifndef _GNU_SOURCE
@ -253,9 +253,6 @@ void Menu::lower() {
} }
void Menu::nextItem() { void Menu::nextItem() {
if (which_press >= 0 && which_press == static_cast<signed>(menuitems.size() - 1))
return;
int old_which_press = which_press; int old_which_press = which_press;
if (old_which_press >= 0 && if (old_which_press >= 0 &&
@ -264,25 +261,23 @@ void Menu::nextItem() {
if (menuitems[old_which_press]->submenu()) { if (menuitems[old_which_press]->submenu()) {
// we need to do this explicitly on the menu.window // we need to do this explicitly on the menu.window
// since it might hide the parent if we use Menu::hide // since it might hide the parent if we use Menu::hide
menuitems[old_which_press]->submenu()->menu.window.hide(); menuitems[old_which_press]->submenu()->internal_hide();
} }
drawItem(old_which_press, false, true, true); drawItem(old_which_press, false, true, true);
} }
// restore old in case we changed which_press // restore old in case we changed which_press
which_press = old_which_press; which_press = old_which_press;
if (which_press < 0 || which_press >= static_cast<signed>(menuitems.size())) if (which_press < 0 || which_press >= static_cast<signed>(menuitems.size() - 1))
which_press = 0; which_press = 0;
else if (which_press > 0 && which_press < static_cast<signed>(menuitems.size() - 1)) else
which_press++; which_press++;
if (menuitems[which_press] == 0) if (menuitems[which_press] == 0)
return; return;
if (menuitems[which_press]->submenu())
drawSubmenu(which_press);
else
drawItem(which_press, true, true, true); drawItem(which_press, true, true, true);
} }
@ -295,24 +290,23 @@ void Menu::prevItem() {
if (menuitems[old_which_press]->submenu()) { if (menuitems[old_which_press]->submenu()) {
// we need to do this explicitly on the menu.window // we need to do this explicitly on the menu.window
// since it might hide the parent if we use Menu::hide // since it might hide the parent if we use Menu::hide
menuitems[old_which_press]->submenu()->menu.window.hide(); menuitems[old_which_press]->submenu()->internal_hide();
} }
drawItem(old_which_press, false, true, true); drawItem(old_which_press, false, true, true);
} }
// restore old in case we changed which_press // restore old in case we changed which_press
which_press = old_which_press; which_press = old_which_press;
if (which_press < 0 || which_press >= static_cast<signed>(menuitems.size())) if (which_press <= 0 || which_press >= static_cast<signed>(menuitems.size()))
which_press = 0; which_press = menuitems.size() - 1;
else if (which_press - 1 >= 0) else if (which_press - 1 >= 0)
which_press--; which_press--;
if (menuitems[which_press] != 0) { if (menuitems[which_press] == 0)
if (menuitems[which_press]->submenu()) return;
drawSubmenu(which_press);
else
drawItem(which_press, true, true, true); drawItem(which_press, true, true, true);
}
} }
@ -324,6 +318,10 @@ void Menu::enterSubmenu() {
if (submenu == 0) if (submenu == 0)
return; return;
if (submenu->menuitems.size() == 0)
return;
drawSubmenu(which_press);
submenu->grabInputFocus(); submenu->grabInputFocus();
submenu->which_press = -1; // so we land on 0 after nextItem() submenu->which_press = -1; // so we land on 0 after nextItem()
submenu->nextItem(); submenu->nextItem();
@ -335,11 +333,14 @@ void Menu::enterParent() {
Menu *submenu = menuitems[which_press]->submenu(); Menu *submenu = menuitems[which_press]->submenu();
if (submenu) if (submenu)
submenu->menu.window.hide(); submenu->internal_hide();
drawItem(which_press, false, true, true); drawItem(which_press, false, true, true);
which_press = -1; // dont select any in this which_press = -1; // dont select any in this
// return focus to parent but keep this window open // hide self
visible = false;
menu.window.hide();
// return focus to parent
parent()->grabInputFocus(); parent()->grabInputFocus();
} }
@ -1324,7 +1325,8 @@ void Menu::keyPressEvent(XKeyEvent &event) {
break; break;
case XK_Return: case XK_Return:
// send fake button 1 click // send fake button 1 click
if (which_press >= 0 && which_press < static_cast<signed>(menuitems.size())) { if (which_press >= 0 && which_press < static_cast<signed>(menuitems.size()) &&
isItemEnabled(which_press)) {
menuitems[which_press]->click(1, event.time); menuitems[which_press]->click(1, event.time);
itemSelected(1, which_press); itemSelected(1, which_press);
m_need_update = true; m_need_update = true;