- self->parent = parent;
- self->open_submenu = NULL;
-
- self->entries = NULL;
- self->shown = FALSE;
- self->invalid = TRUE;
-
- /* default controllers */
- self->show = show;
- self->hide = NULL;
- self->update = update;
- self->mouseover = NULL;
- self->selected = NULL;
-
- self->plugin = NULL;
- self->plugin_data = NULL;
-
- attrib.override_redirect = TRUE;
- attrib.event_mask = FRAME_EVENTMASK;
- self->frame = createWindow(ob_root, CWOverrideRedirect|CWEventMask, &attrib);
- attrib.event_mask = TITLE_EVENTMASK;
- self->title = createWindow(self->frame, CWEventMask, &attrib);
- self->items = createWindow(self->frame, 0, &attrib);
-
- XSetWindowBorderWidth(ob_display, self->frame, theme_bwidth);
- XSetWindowBackground(ob_display, self->frame, theme_b_color->pixel);
- XSetWindowBorderWidth(ob_display, self->title, theme_bwidth);
- XSetWindowBorder(ob_display, self->frame, theme_b_color->pixel);
- XSetWindowBorder(ob_display, self->title, theme_b_color->pixel);
-
- XMapWindow(ob_display, self->title);
- XMapWindow(ob_display, self->items);
-
- self->a_title = appearance_copy(theme_a_menu_title);
- self->a_items = appearance_copy(theme_a_menu);
-
- g_hash_table_insert(window_map, &self->frame, self);
- g_hash_table_insert(window_map, &self->title, self);
- g_hash_table_insert(window_map, &self->items, self);
- g_hash_table_insert(menu_hash, g_strdup(name), self);
-
- stacking_add(MENU_AS_WINDOW(self));
- stacking_raise(MENU_AS_WINDOW(self));
+ self->data = data;
+
+ self->shortcut = parse_shortcut(title, allow_shortcut_selection,
+ &self->title, &self->shortcut_position,
+ &self->shortcut_always_show);
+
+ g_hash_table_replace(menu_hash, self->name, self);
+
+ /* Each menu has a single more_menu. When the menu spills past what
+ can fit on the screen, a new menu frame entry is created from this
+ more_menu, and a new menu frame for the submenu is created for this
+ menu, also pointing to the more_menu.
+
+ This can be done multiple times using the same more_menu.
+
+ more_menu->more_menu will always be NULL, since there is only 1 for
+ each menu. */
+ self->more_menu = g_new0(ObMenu, 1);
+ self->more_menu->name = _("More...");
+ self->more_menu->title = _("More...");
+ self->more_menu->data = data;
+ self->more_menu->shortcut = g_unichar_tolower(g_utf8_get_char("M"));