+ }
+ self->hilite = TRUE;
+ self->parent->over = g_list_find(self->parent->entries, self);
+
+ } else
+ self->hilite = FALSE;
+
+ menu_entry_render(self);
+}
+
+void menu_control_keyboard_nav(unsigned int key)
+{
+ static ObMenu *current_menu = NULL;
+ ObMenuEntry *e = NULL;
+
+ ObKey obkey = OB_NUM_KEYS;
+
+ /* hrmm. could be fixed */
+ if (key == ob_keycode(OB_KEY_DOWN))
+ obkey = OB_KEY_DOWN;
+ else if (key == ob_keycode(OB_KEY_UP))
+ obkey = OB_KEY_UP;
+ else if (key == ob_keycode(OB_KEY_RIGHT)) /* fuck */
+ obkey = OB_KEY_RIGHT;
+ else if (key == ob_keycode(OB_KEY_LEFT)) /* users */
+ obkey = OB_KEY_LEFT;
+ else if (key == ob_keycode(OB_KEY_RETURN))
+ obkey = OB_KEY_RETURN;
+
+
+ if (current_menu == NULL)
+ current_menu = menu_visible->data;
+
+ switch (obkey) {
+ case OB_KEY_DOWN: {
+ if (current_menu->over) {
+ current_menu->mouseover(current_menu->over->data, FALSE);
+ current_menu->over = (current_menu->over->next != NULL ?
+ current_menu->over->next :
+ current_menu->entries);
+ }
+ else
+ current_menu->over = current_menu->entries;
+
+ if (current_menu->over)
+ current_menu->mouseover(current_menu->over->data, TRUE);
+
+ break;
+ }
+ case OB_KEY_UP: {
+ if (current_menu->over) {
+ current_menu->mouseover(current_menu->over->data, FALSE);
+ current_menu->over = (current_menu->over->prev != NULL ?
+ current_menu->over->prev :
+ g_list_last(current_menu->entries));
+ } else
+ current_menu->over = g_list_last(current_menu->entries);
+
+ if (current_menu->over)
+ current_menu->mouseover(current_menu->over->data, TRUE);
+
+ break;
+ }
+ case OB_KEY_RIGHT: {
+ if (current_menu->over == NULL)
+ return;
+ e = (ObMenuEntry *)current_menu->over->data;
+ if (e->submenu) {
+ current_menu->mouseover(e, TRUE);
+ current_menu = e->submenu;
+ current_menu->over = current_menu->entries;
+ if (current_menu->over)
+ current_menu->mouseover(current_menu->over->data, TRUE);
+ }
+ break;
+ }
+
+ case OB_KEY_RETURN: {
+ if (current_menu->over == NULL)
+ return;
+ e = (ObMenuEntry *)current_menu->over->data;
+
+ current_menu->mouseover(e, FALSE);
+ current_menu->over = NULL;
+ /* zero is enter */
+ menu_entry_fire(e, 0, 0, 0);
+ }
+
+ case OB_KEY_LEFT: {
+ if (current_menu->over != NULL) {
+ current_menu->mouseover(current_menu->over->data, FALSE);
+ current_menu->over = NULL;
+ }
+
+ current_menu->hide(current_menu);
+
+ if (current_menu->parent)
+ current_menu = current_menu->parent;
+
+ break;