void expandRow(GtkTreeView* treeview,GtkTreeIter* iter,GtkTreePath* path,gpointer user_data)
{
	GtkTreeModel*		model;
	bool				gotchild;
	GtkTreeIter			childiter;
	char*				folder;
	GtkTreeIter*		cleariter;
	GtkTreeIter			childchild;

	model=gtk_tree_view_get_model(treeview);
	gotchild=gtk_tree_model_iter_children(model,&childiter,iter);
	gtk_tree_model_get(model,iter,COLUMN_PATHNAME,&folder,-1);
	cleariter=gtk_tree_iter_copy(&childiter);

	gtk_tree_model_iter_next(model,cleariter);
	if(gtk_tree_store_iter_is_valid((GtkTreeStore*)store,cleariter))
		while(gtk_tree_store_remove((GtkTreeStore*)store,cleariter));

	cleariter=gtk_tree_iter_copy(&childiter);
	gtk_tree_model_iter_children(model,&childchild,cleariter);
	if(gtk_tree_store_iter_is_valid((GtkTreeStore*)store,&childchild))
		gtk_tree_store_remove((GtkTreeStore*)store,&childchild);

	while(gotchild)
		{
			if(addContents(treeview,&childiter,(char*)folder))
				gotchild=gtk_tree_model_iter_next(model,&childiter);
			else
				gotchild=false;
		}
	flag=true;
}
Example #2
0
static gboolean
find_iter_for_book (AddressBookWindow *self,
                    Ekiga::BookPtr book,
                    GtkTreeIter *iter)
{
  Ekiga::Book *book_iter = NULL;
  GtkTreeModel *store = NULL;

  store = gtk_tree_view_get_model (GTK_TREE_VIEW (self->priv->tree_view));

  if (gtk_tree_model_get_iter_first (store, iter)) {

    while (gtk_tree_store_iter_is_valid (GTK_TREE_STORE (store), iter)) {

      gtk_tree_model_get (store, iter,
                          COLUMN_BOOK_POINTER, &book_iter,
                          -1);

      if (book.get () == book_iter) {

        break;
      }

      if (!gtk_tree_model_iter_next (store, iter))
        return FALSE;
    }

    return gtk_tree_store_iter_is_valid (GTK_TREE_STORE (store), iter);
  } 

  return FALSE;
}
Example #3
0
File: grid.c Project: jtfrey/slurm
/* clear extra buttons to N/A and if model then set those as white */
extern void post_setup_popup_grid_list(popup_info_t *popup_win)
{
	/* refresh the pointer */
	if (popup_win->model
	    && gtk_tree_store_iter_is_valid(GTK_TREE_STORE(popup_win->model),
					    &popup_win->iter)) {
		gtk_tree_model_get(popup_win->model, &popup_win->iter,
				   popup_win->node_inx_id,
				   &popup_win->node_inx, -1);
	} else {
		popup_win->node_inx = NULL;
	}

	if (popup_win->node_inx) {
		int j=0;
		while (popup_win->node_inx[j] >= 0) {
			change_grid_color(
				popup_win->grid_button_list,
				popup_win->node_inx[j],
				popup_win->node_inx[j+1], MAKE_WHITE, true, 0);
			j += 2;
		}
	}

	change_grid_color(popup_win->grid_button_list, -1, -1,
			  MAKE_BLACK, true, NODE_STATE_IDLE);
}
Example #4
0
static void
on_tv_cur_changed (GtkTreeView *treeview, gpointer data)
{
	GtkTreeIter iter;
	gchar *parsename = NULL;

	gtk_tree_selection_get_selected (gtk_tree_view_get_selection (treeview), NULL, &iter);

	if (gtk_tree_store_iter_is_valid (baobab.model, &iter)) {
		gtk_tree_model_get (GTK_TREE_MODEL (baobab.model), &iter,
				    COL_H_PARSENAME, &parsename, -1);
	}
}
Example #5
0
static void cm_tree_drag_data_get_cb(GtkWidget *widget, GdkDragContext *drag_context,
                                     GtkSelectionData *data, guint info, guint ltime,
                                     CookieManagerPage *cmp)
{
    GtkTreeIter iter, iter_store;
    GtkTreeSelection *selection;
    GtkTreeModel *model;
    GList *rows;
    CookieManagerPagePrivate *priv = cmp->priv;

    selection = gtk_tree_view_get_selection(GTK_TREE_VIEW(priv->treeview));
    rows = gtk_tree_selection_get_selected_rows(selection, &model);
    if (cm_list_length(rows) != 1)
    {
        cm_free_selection_list(rows, (GFunc) gtk_tree_path_free);
        return;
    }
    /* get iter */
    gtk_tree_model_get_iter(model, &iter, (GtkTreePath*) (g_list_nth_data(rows, 0)));

    gtk_tree_model_filter_convert_iter_to_child_iter(
        GTK_TREE_MODEL_FILTER(model), &iter_store, &iter);

    if (gtk_tree_store_iter_is_valid(priv->store, &iter_store))
    {
        SoupCookie *cookie;
        gchar *name;
        const gchar *text;

        gtk_tree_model_get(model, &iter,
                           COOKIE_MANAGER_COL_NAME, &name,
                           COOKIE_MANAGER_COL_COOKIE, &cookie,
                           -1);

        if (name != NULL)
        {
            GtkTreeIter parent;
            /* get the name of the parent item which should be a domain item */
            if (cookie != NULL && gtk_tree_model_iter_parent(model, &parent, &iter))
            {
                g_free(name);
                gtk_tree_model_get(model, &parent, COOKIE_MANAGER_COL_NAME, &name, -1);
            }

            text = cm_skip_leading_dot(name);
            gtk_selection_data_set_text(data, text, -1);
        }
        g_free(name);
    }
}
Example #6
0
int
clip_GTK_TREESTOREITERISVALID(ClipMachine * ClipMachineMemory)
{
   C_object *cstree = _fetch_co_arg(ClipMachineMemory);

   C_object *citer = _fetch_cobject(ClipMachineMemory, _clip_spar(ClipMachineMemory, 2));

   CHECKARG2(1, MAP_type_of_ClipVarType, NUMERIC_type_of_ClipVarType);
   CHECKCOBJ(cstree, GTK_IS_TREE_STORE(cstree->object));
   CHECKCOBJ(citer, GTK_IS_TREE_ITER(citer->object));

   gtk_tree_store_iter_is_valid(GTK_TREE_STORE(cstree->object), GTK_TREE_ITER(citer->object));

   return 0;
 err:
   return 1;
}
Example #7
0
static void
update_days_and_lines_for_log (LogviewLoglist *loglist,
                               GtkTreeIter *log, GSList *days)
{
  gboolean res;
  GtkTreeIter iter, dummy;
  GSList *l;
  int i;
  char date[200];
  Day *day;

  /* if we have some days, we can't remove all the items immediately, otherwise,
   * if the row is expanded, it will be collapsed because there are no items,
   * so we create a dummy entry, remove all the others and then remove the
   * dummy one.
   */
  res = gtk_tree_model_iter_children (GTK_TREE_MODEL (loglist->priv->model),
                                      &iter, log);
  if (res) {
    gtk_tree_store_insert_before (loglist->priv->model, &dummy, log, &iter);
    gtk_tree_store_set (loglist->priv->model, &dummy,
                        LOG_NAME, "", -1);
    do {
      gtk_tree_store_remove (loglist->priv->model, &iter);
    } while (gtk_tree_store_iter_is_valid (loglist->priv->model, &iter));
  }

  for (i = 1, l = days; l; l = l->next) {
    /* now insert all the days */
    day = l->data;

    g_date_strftime (date, 200, "%A, %e %b", day->date);

    gtk_tree_store_insert (GTK_TREE_STORE (loglist->priv->model),
                           &iter, log, i);
    gtk_tree_store_set (GTK_TREE_STORE (loglist->priv->model),
                        &iter, LOG_NAME, date, LOG_DAY, day, -1);
    i++;
  }

  if (res) {
    gtk_tree_store_remove (loglist->priv->model, &dummy);
  }
}
Example #8
0
void gtkui_cheats_remove(GtkWidget *widget, gpointer userdata) {
	// Remove a cheat from the list
	GtkTreeIter iter;
	GtkTreeModel *model;
	GtkTreeSelection *selection;
	
	// Get the selected item
	selection = gtk_tree_view_get_selection(GTK_TREE_VIEW(treeview));
	gtk_tree_selection_get_selected(selection, &model, &iter);

	// Remove the cheat
	if (gtk_tree_store_iter_is_valid(treestore, &iter)) {
		gtk_tree_store_remove(treestore, &iter);
	}
	
	//Re-initialize the cheats
	Cheats cheats(emulator);
	cheats.ClearCodes();
	
	gtk_tree_model_foreach(GTK_TREE_MODEL(model), gtkui_cheats_scan_list, NULL);
}
Example #9
0
void
vol_store_voladj(GtkTreeStore * store, GtkTreeIter * iter, float voladj) {

	if (!gtk_tree_store_iter_is_valid(store, iter)) {
		return;
	}

	if (store == music_store) { /* music store */
		track_data_t * data;
		gtk_tree_model_get(GTK_TREE_MODEL(music_store), iter, MS_COL_DATA, &data, -1);
		data->volume = voladj;
		music_store_mark_changed(iter);

	} else { /* playlist */
		playlist_data_t * data;
		char str[32];
		voladj2str(voladj, str);
		gtk_tree_model_get(GTK_TREE_MODEL(store), iter, PL_COL_DATA, &data, -1);
		data->voladj = voladj;
		gtk_tree_store_set(store, iter, PL_COL_VADJ, str, -1);
	}
}
Example #10
0
static void
multi_notebook_tab_switched (GeditMultiNotebook  *mnb,
			     GeditNotebook       *old_notebook,
			     GeditTab            *old_tab,
			     GeditNotebook       *new_notebook,
			     GeditTab            *new_tab,
			     GeditDocumentsPanel *panel)
{
	gedit_debug (DEBUG_PANEL);

	if (!panel->priv->setting_active_notebook &&
	    !_gedit_window_is_removing_tabs (panel->priv->window))
	{
		GtkTreeIter iter;

		if (get_iter_from_tab (panel, new_notebook, new_tab, &iter) &&
		    gtk_tree_store_iter_is_valid (GTK_TREE_STORE (panel->priv->model), &iter))
		{
			select_iter (panel, &iter);
		}
	}
}
static VALUE
rg_iter_is_valid_p(VALUE self, VALUE iter)
{
    return (NIL_P(iter)) ? Qfalse : 
        CBOOL2RVAL(gtk_tree_store_iter_is_valid(_SELF(self), RVAL2GTKTREEITER(iter)));
}
Example #12
0
static gboolean
get_iter_from_tab (GeditDocumentsPanel *panel,
		   GeditNotebook       *notebook,
		   GeditTab            *tab,
		   GtkTreeIter         *tab_iter)
{
	GtkTreeIter parent;
	gboolean success;
	gboolean search_notebook;

	/* Note: we cannot use the functions of the MultiNotebook
	 *       because in cases where the notebook or tab has been
	 *       removed already we will fail to get an iter.
	 */

	gedit_debug (DEBUG_PANEL);

	g_assert (notebook != NULL);
	/* tab may be NULL if just the notebook is specified */
	g_assert (tab_iter != NULL);

	search_notebook = (gedit_multi_notebook_get_n_notebooks (panel->priv->mnb) > 1);

	if (!gtk_tree_model_get_iter_first (panel->priv->model, &parent))
		return FALSE;

	success = FALSE;
	do
	{
		GtkTreeIter iter;

		if (search_notebook)
		{
			GeditNotebook *current_notebook;

			gtk_tree_model_get (panel->priv->model,
					    &parent,
					    NOTEBOOK_COLUMN, &current_notebook,
					    -1);

			if (current_notebook != NULL)
			{
				gboolean is_cur;
				is_cur = (current_notebook == notebook);

				g_object_unref (current_notebook);

				if (is_cur)
				{
					/* notebook found */
					search_notebook = FALSE;
					gtk_tree_model_iter_children (panel->priv->model, &iter, &parent);
				}
			}
		}
		else
		{
			iter = parent;
		}

		if (!search_notebook)
		{
			if (tab == NULL)
			{
				success = TRUE;
				break;
			}

			g_assert (gtk_tree_store_iter_is_valid (GTK_TREE_STORE (panel->priv->model),
								&iter));

			do
			{
				GeditTab *current_tab;

				gtk_tree_model_get (panel->priv->model,
						    &iter,
						    TAB_COLUMN, &current_tab,
						    -1);

				if (current_tab != NULL)
				{
					gboolean is_cur;

					is_cur = (current_tab == tab);
					g_object_unref (current_tab);

					if (is_cur)
					{
						*tab_iter = iter;
						success = TRUE;

						/* break 2; */
						goto out;
					}
				}
			} while (gtk_tree_model_iter_next (panel->priv->model, &iter));

			/* We already found the notebook and the tab was not found */
			g_assert (!success);
		}
	} while (gtk_tree_model_iter_next (panel->priv->model, &parent));

out:

	return success;
}
Example #13
0
static void cm_tree_selection_changed_cb(GtkTreeSelection *selection, CookieManagerPage *cmp)
{
    GList *rows;
    GtkTreeIter iter, iter_store;
    GtkTreeModel *model;
    gchar *text, *name;
    gboolean valid = TRUE;
    gboolean delete_possible = TRUE;
    guint rows_len;
    SoupCookie *cookie;
    CookieManagerPagePrivate *priv = cmp->priv;

    rows = gtk_tree_selection_get_selected_rows(selection, &model);
    rows_len = cm_list_length(rows);
    if (rows_len == 0)
    {
        valid = FALSE;
        delete_possible = FALSE;
    }
    else if (rows_len == 1)
    {
        /* get iter */
        gtk_tree_model_get_iter(model, &iter, (GtkTreePath*) (g_list_nth_data(rows, 0)));

        gtk_tree_model_filter_convert_iter_to_child_iter(GTK_TREE_MODEL_FILTER(model),
                &iter_store, &iter);
    }
    else
        valid = FALSE;

    if (valid && gtk_tree_store_iter_is_valid(priv->store, &iter_store))
    {
        gtk_tree_model_get(model, &iter, COOKIE_MANAGER_COL_COOKIE, &cookie, -1);
        if (cookie != NULL)
        {
            text = cm_get_cookie_description_text(cookie);

            gtk_label_set_markup(GTK_LABEL(priv->desc_label), text);

            g_free(text);
        }
        else
        {
            gtk_tree_model_get(model, &iter, COOKIE_MANAGER_COL_NAME, &name, -1);
            if (name != NULL)
            {
                gint cookie_count = gtk_tree_model_iter_n_children(model, &iter);

                text = cm_get_domain_description_text(name, cookie_count);
                gtk_label_set_markup(GTK_LABEL(priv->desc_label), text);

                g_free(text);
                g_free(name);
            }
        }
    }
    /* This is a bit hack'ish but we add some empty lines to get a minimum height of the
     * label at the bottom without any font size calculation. */
    if (! valid)
        gtk_label_set_text(GTK_LABEL(priv->desc_label), CM_EMPTY_LABEL_TEXT);
    cm_set_button_sensitiveness(cmp, delete_possible);

    cm_free_selection_list(rows, (GFunc) gtk_tree_path_free);
}
Example #14
0
gboolean write_menu_conf( xmlTextWriterPtr writer,
		GtkTreeStore *menu_tree, GtkTreeIter *iterator )
{
	gboolean return_value = FALSE;
	gboolean include_open = FALSE;

	gchar *name = NULL;
	gchar *desktop_id = NULL;

        gboolean default_category;

	/* Make sure we have a valid iterator */
	if (!gtk_tree_store_iter_is_valid( menu_tree, iterator) ) {
		g_warning(  "write_menu_conf: invalid iterator." );
		return FALSE;
	}


	/* Loop through the model */
	do {
		gtk_tree_model_get( GTK_TREE_MODEL( menu_tree ), iterator, 
				TREE_MODEL_NAME,
				&name,
				TREE_MODEL_DESKTOP_ID,
				&desktop_id,
                                TREE_MODEL_DEFAULT,
                                &default_category,
				-1 );

		if ( !desktop_id || strlen( desktop_id ) == 0 ) {
			/* </Include> */
			if ( include_open == TRUE ) {
				if ( xmlTextWriterEndElement( writer ) < 0 ) {
					g_warning( "write_menu_conf: "
					          "failed to end Include element." );
					goto cleanup_and_exit;
				} else {
#ifdef DEBUG
					g_debug( "write_menu_conf: </Include>" );
#endif
				}
				include_open = FALSE;
			}
	
			/* <Menu> */
			if ( xmlTextWriterStartElement( writer,
						BAD_CAST "Menu" ) < 0 ) {
				g_warning( "write_menu_conf: "
				          "failed to start Menu element." );
				goto cleanup_and_exit;
			} else {
#ifdef DEBUG
				g_debug( "write_menu_conf: <Menu>" );
#endif
			}

			/* <Name> ... </Name> */
			if ( xmlTextWriterWriteElement( writer, (const xmlChar *) "Name", (const xmlChar *) name ) < 0 ) {
				g_warning( "write_menu_conf: "
				          "failed to write Name element." );
				goto cleanup_and_exit;
			} else {
				g_debug( "write_menu_conf: <Name>%s</Name>", name );
			}

                        if (default_category)
                        {
                                g_debug ("%s is default", name);
                                xmlTextWriterWriteElement( writer, (const xmlChar *) "All", (const xmlChar *)"" );
                        }

			GtkTreeIter child_iterator;

			/* Has children.. */
			if ( gtk_tree_model_iter_children( GTK_TREE_MODEL( menu_tree ),
						&child_iterator, iterator ) ) {

				/* Recurse */
				if ( !write_menu_conf( writer, menu_tree,
							&child_iterator ) ) {
					g_warning( "write_menu_conf: failed to recurse." );
					goto cleanup_and_exit;
				}
			}

			/* </Menu> */
			if ( xmlTextWriterEndElement( writer ) < 0 ) {
				g_warning ( "write_menu_conf: "
				           "failed to end Menu element." );
				goto cleanup_and_exit;
			} else {
				g_debug( "write_menu_conf: </Menu>" );
			}

		} else if ( desktop_id && strcmp( desktop_id,
					SEPARATOR_STRING ) == 0 ) {
			/* </Include> */
			if ( include_open == TRUE ) {
				if ( xmlTextWriterEndElement( writer ) < 0 ) {
					g_warning( "write_menu_conf: "
					          "failed to end Include element." );
					goto cleanup_and_exit;
				} else {
					g_debug( "write_menu_conf: </Include>" );
				}
				include_open = FALSE;
			}

			/* <Separator/> */

			/* This returns -1 for some reason. But this seems to work 
			 * and without this it doesn't work. Oh well.. */
			xmlTextWriterWriteElement( writer, (const xmlChar *) "Separator", NULL );
			xmlTextWriterEndElement( writer );

			g_debug( "write_menu_conf: <Separator/>" );

		} else if ( desktop_id && strlen ( desktop_id ) > 0 ) {
			/* <Include> */
			if ( include_open == FALSE ) {
				if ( xmlTextWriterStartElement( writer,
						BAD_CAST "Include") < 0 ) {
					g_warning( "write_menu_conf: "
					          "failed to start Include element." );
					goto cleanup_and_exit;
				} else {
					g_debug( "write_menu_conf: <Include>" );
				}

				include_open = TRUE;
			}

			/* <Filename> ... </Filename> */
			if ( xmlTextWriterWriteElement( writer,
					(const xmlChar *) "Filename", (const xmlChar *) desktop_id ) < 0 ) {
				g_warning( "write_menu_conf: "
				          "failed to write Filename element." );
				goto cleanup_and_exit;
			} else {
				g_debug( "write_menu_conf: "
				            "<Filename>%s</Filename>", desktop_id );
			}

		} else {
			g_warning( "write_menu_conf: 'what happen?'"
			          " - 'somebody set us up the bomb!'" );
			goto cleanup_and_exit;
		}
		
		if ( name ) {
			g_free( name );
			name = NULL;
		}

		if ( desktop_id ) {
			g_free( desktop_id );
			desktop_id = NULL;
		}

	} while ( gtk_tree_model_iter_next( GTK_TREE_MODEL( menu_tree ), iterator ) );

	/* </Include> */
	if ( include_open == TRUE ) {
		if ( xmlTextWriterEndElement( writer ) < 0 ) {
			g_warning( "write_menu_conf: "
			          "failed to end Include element." );
			goto cleanup_and_exit;
		} else {
			g_debug( "write_menu_conf: </Include>" );
		}
		include_open = FALSE;
	}

	/* Great! Everything went fine! */
	return_value = TRUE;

	cleanup_and_exit:

	if ( name ) {
		g_free( name );
	}

	if ( desktop_id ) {
		g_free( desktop_id );
	}

	return return_value;
}
Example #15
0
static void read_menu_conf(const char *filename, GtkTreeStore *menu_tree,
		xmlDocPtr doc, xmlNodePtr root_element, GtkTreeIter *iterator,
		GList *desktop_files)
{
	gboolean first_level = FALSE;
	
	static GdkPixbuf *folder_icon            = NULL;
	static GdkPixbuf *folder_thumb_icon      = NULL;
	static GdkPixbuf *folder_open_icon       = NULL;
	static GdkPixbuf *folder_closed_icon     = NULL;
	
	static GdkPixbuf *emblem_expander_open   = NULL;
	static GdkPixbuf *emblem_expander_closed = NULL;

        static GtkTreeIter extras_iter;
        GList *l;

	/* Get emblems */
	if ( !emblem_expander_open ) {
		emblem_expander_open = get_icon( EMBLEM_EXPANDER_OPEN, ICON_SIZE );
	}

	if ( !emblem_expander_closed ) {
		emblem_expander_closed = get_icon( EMBLEM_EXPANDER_CLOSED, ICON_SIZE );
	}

	/* Get the folder icons */
	if ( !folder_icon ) {
		folder_icon = get_icon(ICON_FOLDER, ICON_SIZE);
		folder_thumb_icon = get_icon_with_fallback(ICON_FOLDER,
							ICON_THUMB_SIZE,
							folder_icon);
	}

	if ( !folder_open_icon ) {
		folder_open_icon = add_emblem_to_icon(
				folder_icon, emblem_expander_open );
	}

	if ( !folder_closed_icon ) {
		folder_closed_icon = add_emblem_to_icon(
				folder_icon, emblem_expander_closed );
	}

	if (doc == NULL) {
		doc = xmlReadFile(filename, NULL, 0);

		if (doc == NULL) {
			g_warning( "read_menu_conf: unable to read '%s'", filename );
			goto check_unallocated;
		}
 	        first_level = TRUE;
	}

	if (root_element == NULL) {
		root_element = xmlDocGetRootElement(doc);

		if (root_element == NULL) {
#ifdef DEBUG
			g_debug( "read_menu_conf: failed to get root element." );
#endif
			xmlFreeDoc(doc);
			goto check_unallocated;
		}
	}

	if (xmlStrcmp(root_element->name, (const xmlChar *) "Menu") != 0) {
		/* Not a menu */
#ifdef DEBUG
		g_debug( "read_menu_conf: not a menu.");
#endif
                xmlFreeDoc(doc);
		goto check_unallocated;
	}


	xmlNodePtr current_element = NULL;
	xmlChar *key;
	GtkTreeIter child_iterator;
	desktop_entry_t *item;

	/* Loop through the elements and add to parent */
	for (current_element = root_element->xmlChildrenNode;
			current_element != NULL;
			current_element = current_element->next) {

		if (strcmp((const char *) current_element->name, "Menu") == 0) {
			/* Submenu */
			gtk_tree_store_append(menu_tree, &child_iterator, iterator);

			read_menu_conf(filename,
                                       menu_tree,
                                       doc,
                                       current_element,
                                       &child_iterator,
                                       desktop_files);
		} else if (strcmp((const char *) current_element->name, "Name") == 0) {

                  key = xmlNodeListGetString(doc,
                                             current_element->xmlChildrenNode,
                                             1);


                  if (iterator &&
                      gtk_tree_store_iter_is_valid (menu_tree, iterator))
			gtk_tree_store_set(menu_tree, iterator,
					TREE_MODEL_NAME,
					key,
                                        TREE_MODEL_LOCALIZED_NAME,
                                        dgettext (GETTEXT_PACKAGE,
                                                 (gchar *)key),
					TREE_MODEL_ICON,
					folder_icon,
					TREE_MODEL_THUMB_ICON,
					folder_thumb_icon,
					TREE_MODEL_EMBLEM_EXPANDER_OPEN,
					folder_open_icon,
					TREE_MODEL_EMBLEM_EXPANDER_CLOSED,
					folder_closed_icon,
					TREE_MODEL_EXEC,
					"",
					TREE_MODEL_SERVICE,
					"",
					TREE_MODEL_DESKTOP_ID,
					"",
					TREE_MODEL_COMMENT,
					"",
                                        TREE_MODEL_DEFAULT,
                                        FALSE,
					-1);

			xmlFree(key);

                } else if (strcmp((char *)current_element->name, "All") == 0) {

                        extras_iter = *iterator;
                        gtk_tree_store_set (menu_tree, iterator,
                                            TREE_MODEL_DEFAULT,
                                            TRUE,
                                            -1);

		} else if (strcmp((const char *) current_element->name, "MergeFile") == 0) {

			/* FIXME: skip this for now */
			continue;

			key = xmlNodeListGetString(doc,
					current_element->xmlChildrenNode, 1);

			/* Relative path. prepend current dir */
			if (g_str_has_prefix((const char *) key, "/") == FALSE) {
				key = (xmlChar *) g_build_path(G_DIR_SEPARATOR_S,
						g_path_get_dirname(filename), key, NULL);
			}

			/* Recursion */
			read_menu_conf((const char *) key, menu_tree, NULL, NULL, iterator, desktop_files);

			xmlFree(key);

		} else if (strcmp((const char *) current_element->name, "Include") == 0) {

			xmlNodePtr child_element = NULL;

			for (child_element = current_element->xmlChildrenNode;
					child_element != NULL;
					child_element = child_element->next) {

				if (strcmp((const char *) child_element->name, "Filename") == 0) {

					/* Get the children */
					key = xmlNodeListGetString(doc,
							child_element->xmlChildrenNode,
							1);

					if ( !key || strlen((const char *) key) == 0) {
						xmlFree( key );
						continue;
					}

					/* Get the contents */
					item = get_desktop_item(desktop_files, (const char *) key);

					if ( !item ) {
						xmlFree( key );
						continue;
					}

                                        add_desktop_entry(item, menu_tree, iterator);
                                        xmlFree(key);
                                }
                                                            
                                else if (strcmp((char *)child_element->name, "And") == 0) {
                                  xmlNodePtr cat_element = NULL;
                                  GSList *items, *i;
                                  for (cat_element = child_element->xmlChildrenNode;
                                       cat_element != NULL;
                                       cat_element = cat_element->next) {

                                    if (strcmp((char *)cat_element->name, "Category") != 0)
                                      continue;

                                    if (!cat_element->xmlChildrenNode)
                                      continue;

                                    key = xmlNodeListGetString(doc,
                                                               cat_element->xmlChildrenNode,
                                                               1);

                                    items = get_desktop_entries_from_category (desktop_files,
                                                                               (gchar*)key);

                                    for (i = items ; i ; i = g_slist_next(i))
                                      {
                                        add_desktop_entry((desktop_entry_t *)i->data,
                                                          menu_tree,
                                                          iterator);
                                      }

                                    xmlFree(key);
                                  }
                                }
                        }

 







		} else if (strcmp((const char *) current_element->name, "Separator") == 0) {
			GtkTreeIter child_iter;
			
			gtk_tree_store_append(menu_tree,
					&child_iter, iterator);

			gtk_tree_store_set(menu_tree,
					&child_iter,
					TREE_MODEL_NAME,
					SEPARATOR_STRING,
					TREE_MODEL_ICON,
					NULL,
					TREE_MODEL_EMBLEM_EXPANDER_OPEN,
					NULL,
					TREE_MODEL_EMBLEM_EXPANDER_CLOSED,
					NULL,
					TREE_MODEL_THUMB_ICON,
					NULL,
					TREE_MODEL_EXEC,
					SEPARATOR_STRING,
					TREE_MODEL_SERVICE,
					SEPARATOR_STRING,
					TREE_MODEL_DESKTOP_ID,
					SEPARATOR_STRING,
					TREE_MODEL_COMMENT,
					SEPARATOR_STRING,
                                        TREE_MODEL_DEFAULT,
                                        FALSE,
					-1);
		}

	}
check_unallocated:

        if ( first_level )
          {
            /* The doc handle was created in this call */
            xmlFreeDoc(doc);

            l = desktop_files;
            while ( l ) {
                desktop_entry_t *item;

                item = l->data;

                if ( item->allocated == FALSE ) {
                        /* Create the extras menu if it does not exist */
                        if ( !gtk_tree_store_iter_is_valid(menu_tree, &extras_iter ) ) {

                                gtk_tree_store_append( menu_tree,
                                                       &extras_iter,
                                                       NULL );

                                gtk_tree_store_set(menu_tree,
                                                   &extras_iter,
                                                   TREE_MODEL_NAME,
                                                   EXTRAS_MENU_STRING,
                                                   TREE_MODEL_LOCALIZED_NAME,
                                                   dgettext (GETTEXT_PACKAGE,
                                                             EXTRAS_MENU_STRING),
                                                   TREE_MODEL_ICON,
                                                   folder_icon,
                                                   TREE_MODEL_THUMB_ICON,
                                                   folder_thumb_icon,
                                                   TREE_MODEL_EMBLEM_EXPANDER_OPEN,
                                                   folder_open_icon,
                                                   TREE_MODEL_EMBLEM_EXPANDER_CLOSED,
                                                   folder_closed_icon,
                                                   TREE_MODEL_EXEC,
                                                   "",
                                                   TREE_MODEL_SERVICE,
                                                   "",
                                                   TREE_MODEL_DESKTOP_ID,
                                                   "",
                                                   TREE_MODEL_DEFAULT,
                                                   TRUE,
                                                   -1 );
                        }

                        add_desktop_entry( item, menu_tree, &extras_iter );
                }

                l = l->next;
            }

            /* We don't need our reference to the folder icon pixbuf anymore */
            if ( folder_icon ) {
            g_object_unref( G_OBJECT( folder_icon ) );
            folder_icon = NULL;
            }

            if ( folder_thumb_icon ) {
            g_object_unref( G_OBJECT( folder_thumb_icon ) );
            folder_thumb_icon = NULL;
            }

            if ( folder_open_icon ) {
            g_object_unref( G_OBJECT( folder_open_icon ) );
            folder_open_icon = NULL;
            }

            if ( folder_closed_icon ) {
            g_object_unref( G_OBJECT( folder_closed_icon ) );
            folder_closed_icon = NULL;
            }
        }
	return;
}