/*! \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;
}
Example #3
0
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;
}
Example #4
0
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;
}
Example #5
0
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' &amp;\" />\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);
  }
}
Example #6
0
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;
}
Example #8
0
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;
}
Example #9
0
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;
}
Example #11
0
/*=============================================================================
 * 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);
}