static GList*
thunar_uca_provider_get_folder_actions (ThunarxMenuProvider *menu_provider,
                                        GtkWidget           *window,
                                        ThunarxFileInfo     *folder)
{
  GList *actions;
  GList  files;
  GList *lp;

  /* fake a file list... */
  files.data = folder;
  files.next = NULL;
  files.prev = NULL;

  /* ...and use the get_file_actions() method */
  actions = thunarx_menu_provider_get_file_actions (menu_provider, window, &files);

  /* mark the actions, so we can properly detect the working directory */
  for (lp = actions; lp != NULL; lp = lp->next)
    g_object_set_qdata (G_OBJECT (lp->data), thunar_uca_folder_quark, GUINT_TO_POINTER (TRUE));

  return actions;
}
int
get_actions_page (ThunarxProviderFactory* f,
		  GList *flist,
		  gboolean dirs_as_files,
		  GtkWindow *win,
		  const char *class_name,
		  GtkWidget **page,
		  char *title,
		  int tlen)
{
  GList *ps, *lp, *files, *dirs, *fas, *das, *as;
  GtkWidget *vbox;

  files = NULL;
  dirs = NULL;

  if (! dirs_as_files)
    {
      for (flist; flist != NULL; flist = flist->next)
	{
	  if (thunarx_file_info_is_directory(THUNARX_FILE_INFO(flist->data)))
	    {
	      dirs = g_list_append(dirs, flist->data);
	    }
	  else
	    {
	      files = g_list_append(files, flist->data);
	    }
	}
    }
  else
    {
      files = flist;
    }

  ps = thunarx_provider_factory_list_providers(f, THUNARX_TYPE_MENU_PROVIDER);

  snprintf(title, tlen, "Choose an action for the %i selected object(s)\n",
	   g_list_length(files) + g_list_length(dirs));
  
  *page = gtk_frame_new (title);
  gtk_container_set_border_width (GTK_CONTAINER(*page), 10);
  vbox = gtk_vbox_new(TRUE, 10);
  gtk_container_set_border_width (GTK_CONTAINER(vbox), 10);
  gtk_container_add(GTK_CONTAINER(*page), GTK_WIDGET(vbox));

  fas = NULL;
  das = NULL;
  for (lp = ps; lp != NULL; lp = lp->next)
    {
      GList *dp, *as;
      if (strncmp(class_name, G_OBJECT_TYPE_NAME(lp->data), 256) == 0) {
	as = thunarx_menu_provider_get_file_actions(lp->data,
						    GTK_WIDGET(win),
						    files);
	fas = g_list_merge(fas, as);
	for (dp = dirs; dp != NULL; dp = dp->next)
	  {
	    GList *as;
	    as = thunarx_menu_provider_get_folder_actions(lp->data,
							  GTK_WIDGET(win),
							  dp->data);
	    das = g_list_merge(das, as);
	    g_list_foreach (as, (GFunc) g_object_unref, NULL);
	    g_list_free (as);
	  }
	g_list_foreach (as, (GFunc) g_object_unref, NULL);
	g_list_free (as);
      }
    }

  g_list_foreach (ps, (GFunc) g_object_unref, NULL);
  g_list_free (ps);

  fas = g_list_merge(fas, das);
  g_list_foreach (das, (GFunc) g_object_unref, NULL);
  g_list_free (das);
  
  if (g_list_length(fas) > 0)
    {
      GList *ap;

      for (ap = fas; ap != NULL; ap = ap->next)
	{
	  GtkWidget *b;

	  b = gtk_button_new ();
	  gtk_action_connect_proxy (GTK_ACTION(ap->data), b);
	  gtk_container_add(GTK_CONTAINER(vbox), GTK_WIDGET(b));
	  g_signal_connect_object (G_OBJECT(b),
				   "clicked",
				   G_CALLBACK(gtk_widget_destroy),
				   win,
				   G_CONNECT_AFTER | G_CONNECT_SWAPPED);
	}
      return 1;
    }
  else
    {
      gtk_container_add(GTK_CONTAINER(vbox), gtk_label_new ("No actions available"));
      return 1;
    }
}