data.doc = doc;
data.node = node;
data.parent = menu;
- parent = plugin_create(plugin, &data);
+
+ if (plugin_open_reopen(plugin))
+ parent = plugin_create(plugin, &data);
g_free(plugin);
} else
menu = menu_new(title, id, data ? *((ObMenu**)data) : NULL);
data.doc = doc;
data.node = node;
data.parent = menu;
- parent = plugin_create(plugin, &data);
+ if (plugin_open_reopen(plugin))
+ parent = plugin_create(plugin, &data);
g_free(plugin);
} else {
parent = menu;
{
g_assert(self != NULL);
- menu_render(self);
+ self->update(self);
self->client = client;
XUnmapWindow(ob_display, self->frame);
self->shown = FALSE;
if (self->open_submenu)
- menu_hide(self->open_submenu);
+ self->open_submenu->hide(self->open_submenu);
if (self->parent && self->parent->open_submenu == self) {
- self->over = NULL;
self->parent->open_submenu = NULL;
}
grab_pointer(FALSE, None);
}
menu_visible = g_list_remove(menu_visible, self);
+ if (self->over) {
+ ((ObMenuEntry *)self->over->data)->hilite = FALSE;
+ menu_entry_render(self->over->data);
+ self->over = NULL;
+ }
}
}
{
ObMenu *m;
- if (button > 3) return;
+ /* ignore wheel scrolling */
+ if (button == 4 || button == 5) return;
if (self->action) {
self->action->data.any.c = self->parent->client;
/* hide the whole thing */
m = self->parent;
while (m->parent) m = m->parent;
- menu_hide(m);
+ m->hide(m);
}
}
stacking_raise(MENU_AS_WINDOW(self));
self->shown = TRUE;
} else if (self->shown && self->open_submenu) {
- menu_hide(self->open_submenu);
+ self->open_submenu->hide(self->open_submenu);
}
}
e = (ObMenuEntry *) self->parent->over->data;
e->hilite = FALSE;
menu_entry_render(e);
- menu_hide(self->parent->open_submenu);
+ self->parent->open_submenu->hide(self->parent->open_submenu);
}
if (self->submenu && self->parent->open_submenu != self->submenu) {
ob_rr_theme->bwidth - ob_rr_theme->menu_overlap;
/* need to get the width. is this bad?*/
- menu_render(self->submenu);
+ self->parent->update(self->submenu);
a = screen_physical_area_monitor(self->parent->xin_area);
void menu_control_keyboard_nav(unsigned int key)
{
static ObMenu *current_menu = NULL;
+ ObMenuEntry *e = NULL;
ObKey obkey = OB_NUM_KEYS;
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;
break;
}
case OB_KEY_RIGHT: {
- ObMenuEntry *e;
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);
- } else {
- current_menu->mouseover(e, FALSE);
- current_menu->over = NULL;
-
- /* zero is enter */
- menu_entry_fire(e, 0, 0, 0);
}
break;
}
- case OB_KEY_LEFT: {
+
+ case OB_KEY_RETURN: {
if (current_menu->over == NULL)
return;
- current_menu->mouseover(current_menu->over->data, FALSE);
+ 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;
+ }
- menu_hide(current_menu);
+ current_menu->hide(current_menu);
if (current_menu->parent)
current_menu = current_menu->parent;
break;
}
+ default:
+ ((ObMenu *)menu_visible->data)->hide(menu_visible->data);
+ current_menu = NULL;
}
return;
}