static void write_dir( FILE* of, GMenuTreeDirectory* dir ) { GSList* l; const char* cstr; char* str; fprintf( of, "+%s\n", gmenu_tree_directory_get_menu_id( dir ) ); fprintf( of, "%s\n", gmenu_tree_directory_get_name( dir ) ); cstr = gmenu_tree_directory_get_comment( dir ); fprintf( of, "%s\n", cstr ? cstr : "" ); cstr = gmenu_tree_directory_get_icon( dir ); fprintf( of, "%s\n", cstr ? cstr : "" ); if( gmenu_tree_directory_get_desktop_file_path( dir ) ) { /* get basename of its desktop file. */ str = g_path_get_basename( gmenu_tree_directory_get_desktop_file_path( dir ) ); fprintf( of, "%s\n", str ); g_free( str ); /* get the location of its desktop file. */ str = g_path_get_dirname( gmenu_tree_directory_get_desktop_file_path( dir ) ); fprintf( of, "%d\n", dirname_index( str ) ); g_free( str ); } else { fprintf( of, "\n-1\n" ); } // fprintf( of, "\n" ); /* end of item info */ for( l = gmenu_tree_directory_get_contents(dir); l; l = l->next ) { GMenuTreeItem* item = (GMenuTreeItem*)l->data; GMenuTreeItemType type = gmenu_tree_item_get_type(item); if( type == GMENU_TREE_ITEM_DIRECTORY ) { write_dir( of, (GMenuTreeDirectory*)item ); } else if( type == GMENU_TREE_ITEM_ENTRY ) { write_entry( of, (GMenuTreeEntry*)item ); } else if( type == GMENU_TREE_ITEM_SEPARATOR ) fputs( "-\n", of ); } fputs( "\n", of ); }
int main() { auto tree=gmenu_tree_new(menu_name, GMENU_TREE_FLAGS_NONE); //no need flags, defaults is good enough { char lang[locale_size]; //here we get system locale string strcpy(lang,getenv("LANG")); char* country=0; //and parse it to 3 strings - lang, country, modifier char* modifier=0; //char* enc=0; //it could be useful somewhere else. let it be commented for(int i=0;lang[i];++i){ switch(lang[i]){ case '_': lang[i]=0; country=lang+i+1; break; case '@': lang[i]=0; modifier=lang+i+1; break; case '.': lang[i]=0; //enc=lang+i+1; break; } } { int loc_i=0; //current locale index if(*lang&&country&&modifier){ strcpy(locales[loc_i++]+4,(std::string("[")+lang+"_"+country+"@"+modifier+"]").c_str()); } if(*lang&&country){ strcpy(locales[loc_i++]+4,(std::string("[")+lang+"_"+country+"]").c_str()); } if(*lang&&modifier){ strcpy(locales[loc_i++]+4,(std::string("[")+lang+"@"+modifier+"]").c_str()); } if(*lang){ strcpy(locales[loc_i++]+4,(std::string("[")+lang+"]").c_str()); } locales[loc_i+1][0]=0; //barier to stop in case of buggy .desktop entry } } while(!gmenu_tree_load_sync(tree,NULL)){ //wait for load usleep(sync_wait_time); } qu.push(gmenu_tree_get_root_directory(tree)); //push root menu dir in queue while(!qu.empty()){ //while queue not empty, create menu for first dir auto& dir=qu.front(); { const char* name=gmenu_tree_directory_get_menu_id(dir); //menu id used as unique fvwm menu suffix printf("DestroyMenu \"FvwmMenu%s\"\n",name); printf("AddToMenu \"FvwmMenu%s\"\n",name); } auto it=gmenu_tree_directory_iter(dir); //iterator decltype(gmenu_tree_iter_next(it)) next_type; //iterator type while ((next_type=gmenu_tree_iter_next(it))!=GMENU_TREE_ITEM_INVALID){ switch (next_type){ case GMENU_TREE_ITEM_DIRECTORY:{ //add directory function popup and queue it auto cur=gmenu_tree_iter_get_directory(it); printf("+ \"%s\" Popup \"FvwmMenu%s\"\n", gmenu_tree_directory_get_name(cur), gmenu_tree_directory_get_menu_id(cur)); qu.push(cur); break; } case GMENU_TREE_ITEM_ENTRY:{ auto cur=gmenu_tree_iter_get_entry(it); auto inf=gmenu_tree_entry_get_app_info(cur); std::string exec=g_desktop_app_info_get_string(inf,"Exec"); //get exec command int index; while((index=exec.find('%'))!=-1){ //delete all % params exec.erase(index,2); } int loc_i=0; char* name=0; do{ //find localised name in standard specified order name=g_desktop_app_info_get_string(inf,locales[loc_i]); ++loc_i; }while(!name&&locales[loc_i][0]); if(name){ //if name not empty printf("+ \"%s\" Exec exec %s\n",name,exec.c_str()); //add menu entry } break; } case GMENU_TREE_ITEM_SEPARATOR:{ //add empty menu entry printf("+ \"\" Nop"); } default:{ //TODO: add other types if needed } } } gmenu_tree_iter_unref(it); //unref iterator (dunno why, but why not?) printf("\n"); //just for better readability qu.pop(); } return 0; }