/*! \fn gboolean CDesktopAppChooser::m_LoadAndBuildAppsMenuTree(void) \brief To load the main application menu(.menu) file. \param[in] NONE \return TRUE or FALSE */ gboolean CDesktopAppChooser::m_LoadAndBuildAppsMenuTree(void) { GSList *directoryList = NULL; /*------------ THE ENTRY POINT !!! -------------*/ /* To open the applications .menu file. */ m_MenuTree = gmenu_tree_lookup( APPLICATIONS_MENU, GMENU_TREE_FLAGS_NONE ); /* To store the parsed direcotry contents. */ m_RootDir = gmenu_tree_get_root_directory( m_MenuTree ); /* To build the top-level tree node. */ for(directoryList = gmenu_tree_directory_get_contents( m_RootDir ); directoryList; directoryList = directoryList->next ) { GMenuTreeDirectory *tmpDir = (GMenuTreeDirectory*)directoryList->data; /* To check its type. */ if( G_UNLIKELY(gmenu_tree_item_get_type((GMenuTreeItem*)tmpDir) != GMENU_TREE_ITEM_DIRECTORY) ) continue; /* To build top-level(Directory) nodes. */ m_AddAppsMenuTopLevelNode(tmpDir); /* To build child nodes(applications). */ m_AddAppsMenuLeafNode(tmpDir); } return true; }
/** * shell_app_system_get_sections: * * return names of sections in applications menu. * * Returns: (element-type utf8) (transfer full): List of Names */ GList * shell_app_system_get_sections (ShellAppSystem *system) { GList *res = NULL; GSList *i, *contents; GMenuTreeDirectory *root; root = gmenu_tree_get_root_directory (system->priv->apps_tree); if (G_UNLIKELY (!root)) g_error ("applications.menu not found."); contents = gmenu_tree_directory_get_contents (root); for (i = contents; i; i = i->next) { GMenuTreeItem *item = i->data; if (gmenu_tree_item_get_type (item) == GMENU_TREE_ITEM_DIRECTORY) { char *name = g_strdup (gmenu_tree_directory_get_name ((GMenuTreeDirectory*)item)); g_assert (name); res = g_list_append (res, name); } gmenu_tree_item_unref (item); } g_slist_free (contents); return res; }
GeeArrayList* slingshot_backend_gmenu_entries_get_applications_for_category (GMenuTreeDirectory* category) { GeeArrayList* result = NULL; GeeArrayList* _tmp0_; GeeArrayList* entries; GMenuTreeDirectory* _tmp1_; GSList* _tmp2_ = NULL; g_return_val_if_fail (category != NULL, NULL); _tmp0_ = gee_array_list_new (G_TYPE_POINTER, (GBoxedCopyFunc) gmenu_tree_item_ref, gmenu_tree_item_unref, NULL); entries = _tmp0_; _tmp1_ = category; _tmp2_ = gmenu_tree_directory_get_contents (_tmp1_); { GSList* item_collection = NULL; GSList* item_it = NULL; item_collection = _tmp2_; for (item_it = item_collection; item_it != NULL; item_it = item_it->next) { GMenuTreeItem* _tmp3_; GMenuTreeItem* item = NULL; _tmp3_ = _gmenu_tree_item_ref0 ((GMenuTreeItem*) item_it->data); item = _tmp3_; { GMenuTreeItem* _tmp4_; GMenuTreeItemType _tmp5_ = 0; _tmp4_ = item; _tmp5_ = gmenu_tree_item_get_type (_tmp4_); switch (_tmp5_) { case GMENU_TREE_ITEM_DIRECTORY: { GeeArrayList* _tmp6_; GMenuTreeItem* _tmp7_; GeeArrayList* _tmp8_ = NULL; GeeArrayList* _tmp9_; _tmp6_ = entries; _tmp7_ = item; _tmp8_ = slingshot_backend_gmenu_entries_get_applications_for_category ((GMenuTreeDirectory*) _tmp7_); _tmp9_ = _tmp8_; gee_abstract_collection_add_all ((GeeAbstractCollection*) _tmp6_, (GeeCollection*) _tmp9_); _g_object_unref0 (_tmp9_); break; } case GMENU_TREE_ITEM_ENTRY: { GeeArrayList* _tmp10_; GMenuTreeItem* _tmp11_; _tmp10_ = entries; _tmp11_ = item; gee_abstract_collection_add ((GeeAbstractCollection*) _tmp10_, (GMenuTreeEntry*) _tmp11_); break; } default: break; } _gmenu_tree_item_unref0 (item); } } } result = entries; return result; }
GeeArrayList* slingshot_backend_gmenu_entries_get_categories (void) { GeeArrayList* result = NULL; GMenuTree* _tmp0_ = NULL; GMenuTree* _tmp1_; GMenuTree* tree; GMenuTree* _tmp2_; GMenuTreeDirectory* _tmp3_ = NULL; GMenuTreeDirectory* _tmp4_; GMenuTreeDirectory* root; GeeArrayList* _tmp5_; GeeArrayList* main_directory_entries; GMenuTreeDirectory* _tmp6_; GSList* _tmp7_ = NULL; _tmp0_ = gmenu_tree_lookup ("applications.menu", GMENU_TREE_FLAGS_INCLUDE_EXCLUDED); _tmp1_ = _gmenu_tree_ref0 (_tmp0_); tree = _tmp1_; _tmp2_ = tree; _tmp3_ = gmenu_tree_get_root_directory (_tmp2_); _tmp4_ = _gmenu_tree_item_ref0 (_tmp3_); root = _tmp4_; _tmp5_ = gee_array_list_new (G_TYPE_POINTER, (GBoxedCopyFunc) gmenu_tree_item_ref, gmenu_tree_item_unref, NULL); main_directory_entries = _tmp5_; _tmp6_ = root; _tmp7_ = gmenu_tree_directory_get_contents (_tmp6_); { GSList* item_collection = NULL; GSList* item_it = NULL; item_collection = _tmp7_; for (item_it = item_collection; item_it != NULL; item_it = item_it->next) { GMenuTreeItem* _tmp8_; GMenuTreeItem* item = NULL; _tmp8_ = _gmenu_tree_item_ref0 ((GMenuTreeItem*) item_it->data); item = _tmp8_; { GMenuTreeItem* _tmp9_; GMenuTreeItemType _tmp10_ = 0; _tmp9_ = item; _tmp10_ = gmenu_tree_item_get_type (_tmp9_); if (_tmp10_ == GMENU_TREE_ITEM_DIRECTORY) { GeeArrayList* _tmp11_; GMenuTreeItem* _tmp12_; _tmp11_ = main_directory_entries; _tmp12_ = item; gee_abstract_collection_add ((GeeAbstractCollection*) _tmp11_, (GMenuTreeDirectory*) _tmp12_); } _gmenu_tree_item_unref0 (item); } } } result = main_directory_entries; _gmenu_tree_item_unref0 (root); _gmenu_tree_unref0 (tree); return result; }
void walk_tree(GMenuTreeDirectory *root) { GSList *list = gmenu_tree_directory_get_contents(root); while (list) { const char *category; const char *application; const char *exec; switch (gmenu_tree_item_get_type (list->data)) { case GMENU_TREE_ITEM_DIRECTORY: category = gmenu_tree_directory_get_name (list->data); if (category) { printf("<menu name=\"%s\">\n", category); free((void *)category); } GMenuTreeDirectory *dir = (GMenuTreeDirectory*)list->data; walk_tree(dir); printf("</menu>\n"); break; case GMENU_TREE_ITEM_ENTRY: if (!gmenu_tree_entry_get_is_excluded(list->data) && !gmenu_tree_entry_get_is_nodisplay(list->data)) { application = gmenu_tree_entry_get_name(list->data); if (application) { exec = filter(gmenu_tree_entry_get_exec(list->data)); if (exec) { if (gmenu_tree_entry_get_launch_in_terminal(list->data)) { printf("<command name=\"%s\" execute=\"xterm -title '%s' -e '%s' &\" />\n", application, application, exec); } else { printf("<command name=\"%s\" execute=\"menuorg-execute-wrapper %s '%s'\" />\n", application, application, exec); } free((void *)application); } } } break; default: break; } list = g_slist_next(list); } }
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 ); }
static GSList * gather_entries_recurse (ShellAppSystem *monitor, GSList *apps, GHashTable *unique, GMenuTreeDirectory *root) { GSList *contents; GSList *iter; contents = gmenu_tree_directory_get_contents (root); for (iter = contents; iter; iter = iter->next) { GMenuTreeItem *item = iter->data; switch (gmenu_tree_item_get_type (item)) { case GMENU_TREE_ITEM_ENTRY: { ShellAppInfo *app = shell_app_info_new_from_tree_item (item); if (!g_hash_table_lookup (unique, shell_app_info_get_id (app))) { apps = g_slist_prepend (apps, app); g_hash_table_insert (unique, (char*)shell_app_info_get_id (app), app); } } break; case GMENU_TREE_ITEM_DIRECTORY: { GMenuTreeDirectory *dir = (GMenuTreeDirectory*)item; apps = gather_entries_recurse (monitor, apps, unique, dir); } break; default: break; } gmenu_tree_item_unref (item); } g_slist_free (contents); return apps; }
static void fill_er_up(GMenuTreeDirectory *directory, GSList**p) { GSList* data = *p; GSList *items; GSList *tmp; const char *path; char *freeme; freeme = make_path(directory); if (!strcmp(freeme, "/")) path = freeme; else path = freeme + 1; items = gmenu_tree_directory_get_contents(directory); tmp = items; while (tmp != NULL) { GMenuTreeItem *item = tmp->data; switch (gmenu_tree_item_get_type(item)) { case GMENU_TREE_ITEM_ENTRY: // print_entry (GMENU_TREE_ENTRY (item), path); add_entry(GMENU_TREE_ENTRY(item), path, &data); break; case GMENU_TREE_ITEM_DIRECTORY: { Menu_list_item * dir_item; dir_item = g_malloc(sizeof(Menu_list_item)); dir_item->item_type = MENU_ITEM_DIRECTORY; dir_item->name = gmenu_tree_directory_get_name(item); dir_item->desktop = gmenu_tree_directory_get_desktop_file_path(item); dir_item->comment = NULL; dir_item->null = NULL; dir_item->comment = gmenu_tree_directory_get_comment(item); dir_item->icon = gmenu_tree_directory_get_icon(item); dir_item->sublist = NULL; data = g_slist_append(data, dir_item); fill_er_up(GMENU_TREE_DIRECTORY(item), &dir_item->sublist); dir_item->sublist = g_slist_prepend(dir_item->sublist, get_blank()); dir_item->sublist = g_slist_append(dir_item->sublist, get_blank()); } break; case GMENU_TREE_ITEM_HEADER: // printf("GMENU_TREE_ITEM_HEADER\n"); break; case GMENU_TREE_ITEM_SEPARATOR: // printf("GMENU_TREE_ITEM_HEADER\n"); break; case GMENU_TREE_ITEM_ALIAS: // printf("GMENU_TREE_ITEM_ALIAS\n"); /* { GMenuTreeItem *aliased_item; aliased_item = gmenu_tree_alias_get_item (GMENU_TREE_ALIAS (item)); if (gmenu_tree_item_get_type (aliased_item) == GMENU_TREE_ITEM_ENTRY) print_entry (GMENU_TREE_ENTRY (aliased_item), path); }*/ break; default: g_assert_not_reached(); break; } gmenu_tree_item_unref(tmp->data); tmp = tmp->next; } g_slist_free(items); g_free(freeme); *p = data; }
static void print_directory(GMenuTreeDirectory *directory) { GSList *items; GSList *tmp; const char *path; char *freeme; freeme = make_path(directory); if (!strcmp(freeme, "/")) path = freeme; else path = freeme + 1; items = gmenu_tree_directory_get_contents(directory); tmp = items; while (tmp != NULL) { GMenuTreeItem *item = tmp->data; switch (gmenu_tree_item_get_type(item)) { case GMENU_TREE_ITEM_ENTRY: print_entry(GMENU_TREE_ENTRY(item), path); break; case GMENU_TREE_ITEM_DIRECTORY: print_directory(GMENU_TREE_DIRECTORY(item)); break; case GMENU_TREE_ITEM_HEADER: case GMENU_TREE_ITEM_SEPARATOR: break; case GMENU_TREE_ITEM_ALIAS: { GMenuTreeItem *aliased_item; aliased_item = gmenu_tree_alias_get_item(GMENU_TREE_ALIAS(item)); if (gmenu_tree_item_get_type(aliased_item) == GMENU_TREE_ITEM_ENTRY) print_entry(GMENU_TREE_ENTRY(aliased_item), path); } break; default: g_assert_not_reached(); break; } gmenu_tree_item_unref(tmp->data); tmp = tmp->next; } g_slist_free(items); g_free(freeme); }
/*! \fn gboolean CDesktopAppChooser::m_AddAppsMenuLeafNode(GMenuTreeDirectory *appsDir) \brief To create leaf nodes(applications). \param[in] appsDir \return TRUE or FALSE */ gboolean CDesktopAppChooser::m_AddAppsMenuLeafNode(GMenuTreeDirectory *appsDir) { GSList *itemList = NULL; if( G_UNLIKELY(!appsDir) ) return false; for( itemList = gmenu_tree_directory_get_contents(appsDir); itemList; itemList = itemList->next ) { GMenuTreeItem *item = (GMenuTreeItem*)itemList->data; GMenuTreeItemType type = gmenu_tree_item_get_type(item); if( type == GMENU_TREE_ITEM_DIRECTORY ) { /* To pars sub-directory items and add it to the menu tree. Here using recursive parse. */ m_AddAppsMenuLeafNode( (GMenuTreeDirectory*)item ); } else if( type == GMENU_TREE_ITEM_ENTRY ) { GdkPixbuf *pixbuf = NULL; const gchar *icon_name = gmenu_tree_entry_get_icon( (GMenuTreeEntry*)item ); APP_ITEM_INFO *appInfo = NULL; /* To determine if the current item need not to be shown. If it is, continue. */ if(gmenu_tree_entry_get_is_nodisplay( (GMenuTreeEntry*)item ) || gmenu_tree_entry_get_is_excluded( (GMenuTreeEntry*)item ) ) continue; /* To create the icon for the currently read node. */ if(icon_name) pixbuf = m_LoadIcon(icon_name, IMG_SIZE, TRUE ); else pixbuf = m_LoadIcon(DEFAULT_APP__MIME_ICON, IMG_SIZE, TRUE ); // If there has no icon name in .desktop file, using the system default icon for application. /* To create a object containing information about current leaf node. */ appInfo = new APP_ITEM_INFO ; /* Zero out the new allocated memory. */ memset(appInfo, 0x00, sizeof(APP_ITEM_INFO)); if(appInfo) { gchar *name = (gchar*)gmenu_tree_entry_get_name( (GMenuTreeEntry*)item ) ; gchar *exec = (gchar*)gmenu_tree_entry_get_exec( (GMenuTreeEntry*)item ); gchar *comment = (gchar*)gmenu_tree_entry_get_comment( (GMenuTreeEntry*)item ); #if 1 gchar *desktopfile = (gchar*)gmenu_tree_entry_get_desktop_file_path( (GMenuTreeEntry*)item ); #else gchar *desktopfile = (gchar*)gmenu_tree_entry_get_desktop_file_id( (GMenuTreeEntry*)item ); #endif if(name) appInfo->name = (gchar*)g_strdup(name); if(icon_name) appInfo->icon = (gchar*)g_strdup(icon_name); if(exec) appInfo->exec = (gchar*)g_strdup(exec); if(comment) appInfo->comment = (gchar*)g_strdup(comment); if(desktopfile) appInfo->desktopfile = (gchar*)g_strdup(desktopfile); } /* Add a tree leaf. */ gtk_tree_store_append(m_TreeStore, &m_ChildNodeIter, &m_TopLevelNodeIter); gtk_tree_store_set(m_TreeStore, &m_ChildNodeIter, COLUMN_ICON, pixbuf, COLUMN_TEXT, gmenu_tree_entry_get_name( (GMenuTreeEntry*)item ), COLUMN_NODEDATA, appInfo, -1); /* pixbuf has a referece count of "1" now, as the tree store has added its own reference. So to decrease the reference count of pixbuf. */ g_object_unref(pixbuf); } } // The end of for() return true; }
/*============================================================================= * This function processes a directory entry and all it's child nodes */ void process_directory(GMenuTreeDirectory *directory, gboolean isRoot) { int hasSeparator = 0; int hasMenu = 0; GMenuTreeItemType entryType; GSList *entryList = gmenu_tree_directory_get_contents (directory); GSList *l; if (option_do_not_use_categories == 00 && isRoot == 0 && g_slist_length(entryList) > 0) { hasMenu = 1; if (option_show_amount_of_entries == 1) { g_printf( "<menu id=\"xdg-menu-%s\" label=\"%s (%d)\">\n", gmenu_tree_directory_get_name(directory), gmenu_tree_directory_get_name(directory), g_slist_length(entryList)); } else { g_printf( "<menu id=\"xdg-menu-%s\" label=\"%s\">\n", gmenu_tree_directory_get_name(directory), gmenu_tree_directory_get_name(directory)); } } for (l = entryList; l; l = l->next) { GMenuTreeItem *item = l->data; entryType = gmenu_tree_item_get_type (GMENU_TREE_ITEM(item)); switch (entryType) { case GMENU_TREE_ITEM_DIRECTORY: if (hasSeparator) { process_separator(GMENU_TREE_SEPARATOR(item)); hasSeparator = 0; } process_directory(GMENU_TREE_DIRECTORY(item), 0); break; case GMENU_TREE_ITEM_ENTRY: if (hasSeparator) { process_separator(GMENU_TREE_SEPARATOR(item)); hasSeparator = 0; } process_entry(GMENU_TREE_ENTRY(item)); break; case GMENU_TREE_ITEM_SEPARATOR: hasSeparator = 1; break; } gmenu_tree_item_unref (item); } if (hasMenu == 1) { g_printf("</menu>\n"); } g_slist_free (entryList); }