/* [gtk thread] */ static gboolean do_insert_menu_item_at(gpointer data) { ARGS *args = lock_args(data); if (!args->item->extra1) { args->item->extra1 = build_menu_item(args->item); } gtk_menu_shell_insert(GTK_MENU_SHELL(args->item->parent->extra1), args->item->extra1, args->i); return release_args(data); }
/* [gtk thread] */ static void build_menu(GtkWidget *gmenu, ALLEGRO_MENU *amenu) { size_t i; for (i = 0; i < _al_vector_size(&amenu->items); ++i) { ALLEGRO_MENU_ITEM *aitem = * (ALLEGRO_MENU_ITEM **) _al_vector_ref(&amenu->items, i); GtkWidget *gitem = build_menu_item(aitem); gtk_menu_shell_append(GTK_MENU_SHELL(gmenu), gitem); } }
/* [gtk thread] */ static gboolean do_update_menu_item_at(gpointer data) { ARGS *args = lock_args(data); GtkWidget *gitem; gtk_widget_destroy(args->item->extra1); args->item->extra1 = NULL; gitem = build_menu_item(args->item); gtk_menu_shell_insert(GTK_MENU_SHELL(args->item->parent->extra1), gitem, args->i); return release_args(args); }
void MainMenu::init_entries() { // Update locale m_locale = setlocale(LC_ALL, NULL); int pos = m_locale.rpos('_'); if(pos>0) m_locale.sub_delete(pos, m_locale.length()-pos); if(m_locale=="C" || m_locale=="POSIX") m_locale.clear(); const char *file = fl_find_config_file("ede_mainmenu.xml", true); struct stat s; if(lstat(file, &s) == 0) { if(!m_modified) m_modified = s.st_mtime; if(m_modified != s.st_mtime) { //file has changed.. m_modified = s.st_mtime; clear(); } } if(children()>0) return; FILE *fp = fopen(file, "r"); if(!fp) { Fl::warning("Menu not found, creating default.."); try { Fl_Buffer buf; buf.append(default_menu, strlen(default_menu)); buf.save_file(file); } catch(Fl_Exception &e) { Fl::warning(e.text()); } fp = fopen(file, "r"); if(!fp) Fl::fatal("Cannot write default menu."); } Fl_XmlLocator locator; Fl_XmlDoc *doc=0; if(fp) { try { doc = Fl_XmlParser::create_dom(fp, &locator, false); } catch(Fl_XmlException &exp) { Fl_String error(exp.text()); error += "\n\n"; error += Fl_XmlLocator::error_line(file, *exp.locator()); error += '\n'; Fl::warning(error); } } fclose(fp); if(!doc) { // One more try! try { Fl_Buffer buf; buf.append(default_menu, strlen(default_menu)); doc = Fl_XmlParser::create_dom(buf.data(), buf.bytes(), &locator, false); } catch(Fl_Exception &e) { Fl::fatal("Cannot open menu! [%s]", e.text().c_str()); } } if(doc) { begin(); Fl_XmlNode *node = doc->root_node(); if(node) { for(uint n=0; n<node->children(); n++) { Fl_XmlNode *np = node->child(n); if((np->is_element() || np->is_leaf()) && np->name()=="Item") build_menu_item(np); } } end(); } }
void MainMenu::build_menu_item(Fl_XmlNode *node) { if(!node) return; int type = str_to_type(node->get_attribute("Type")); if(type==ITEM_NONE) return; Fl_Widget *w=0; EItemGroup *g=0; EItem *i=0; switch(type) { case ITEM_EXEC: i = new EItem(this); i->callback((Fl_Callback*)cb_exec_item); set_exec(i, node->get_attribute("Exec")); i->image(run_pix); w = (Fl_Widget *)i; break; case ITEM_APPDIR: g = new EItemGroup(this, APP_GROUP); g->image(programs_pix); g->dir(get_item_dir(node)); break; case ITEM_SUBDIR: g = new EItemGroup(this, APP_GROUP); g->image(programs_pix); break; case ITEM_FILEBROWSER: g = new EItemGroup(this, BROWSER_GROUP); g->dir(get_item_dir(node)); g->image(find_pix); break; case ITEM_DIVIDER: w = (Fl_Widget *)new Fl_Menu_Divider(); break; } if(g) { g->begin(); w = (Fl_Widget*)g; } Fl_Image *im=0; if(node->has_attribute("Icon")) { im = find_image(node->get_attribute("Icon")); } else { Fl_String im_path(node->get_attribute("Exec")); im_path += ".png"; im = find_image(im_path); } if(im) w->image(im); Fl_String label = get_item_name(node); w->label(label); for(uint n=0; n<node->children(); n++) { Fl_XmlNode *np = node->child(n); if((np->is_element() || np->is_leaf()) && np->name()=="Item") build_menu_item(np); } if(w->is_group()) ((Fl_Group*)w)->end(); }