Matthias Clasen c5c398
--- /dev/null	2007-03-30 23:44:47.845290878 -0400
Matthias Clasen c5c398
+++ evince-0.8.0/shell/xdg-user-dir-lookup.c	2007-03-31 00:13:52.000000000 -0400
Matthias Clasen c5c398
@@ -0,0 +1,165 @@
Matthias Clasen c5c398
+/*
Matthias Clasen c5c398
+  This file is not licenced under the GPL like the rest of the code.
Matthias Clasen c5c398
+  Its is under the MIT license, to encourage reuse by cut-and-paste.
Matthias Clasen c5c398
+
Matthias Clasen c5c398
+  Copyright (c) 2007 Red Hat, inc
Matthias Clasen c5c398
+
Matthias Clasen c5c398
+  Permission is hereby granted, free of charge, to any person
Matthias Clasen c5c398
+  obtaining a copy of this software and associated documentation files
Matthias Clasen c5c398
+  (the "Software"), to deal in the Software without restriction,
Matthias Clasen c5c398
+  including without limitation the rights to use, copy, modify, merge,
Matthias Clasen c5c398
+  publish, distribute, sublicense, and/or sell copies of the Software,
Matthias Clasen c5c398
+  and to permit persons to whom the Software is furnished to do so,
Matthias Clasen c5c398
+  subject to the following conditions: 
Matthias Clasen c5c398
+
Matthias Clasen c5c398
+  The above copyright notice and this permission notice shall be
Matthias Clasen c5c398
+  included in all copies or substantial portions of the Software. 
Matthias Clasen c5c398
+
Matthias Clasen c5c398
+  THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
Matthias Clasen c5c398
+  EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
Matthias Clasen c5c398
+  MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
Matthias Clasen c5c398
+  NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
Matthias Clasen c5c398
+  BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
Matthias Clasen c5c398
+  ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
Matthias Clasen c5c398
+  CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
Matthias Clasen c5c398
+  SOFTWARE.
Matthias Clasen c5c398
+*/
Matthias Clasen c5c398
+
Matthias Clasen c5c398
+#include <stdio.h>
Matthias Clasen c5c398
+#include <stdlib.h>
Matthias Clasen c5c398
+#include <string.h>
Matthias Clasen c5c398
+
Matthias Clasen c5c398
+
Matthias Clasen c5c398
+static char *
Matthias Clasen c5c398
+xdg_user_dir_lookup (const char *type)
Matthias Clasen c5c398
+{
Matthias Clasen c5c398
+  FILE *file;
Matthias Clasen c5c398
+  char *home_dir, *config_home, *config_file;
Matthias Clasen c5c398
+  char buffer[512];
Matthias Clasen c5c398
+  char *user_dir;
Matthias Clasen c5c398
+  char *p, *d;
Matthias Clasen c5c398
+  int len;
Matthias Clasen c5c398
+  int relative;
Matthias Clasen c5c398
+  
Matthias Clasen c5c398
+  home_dir = getenv ("HOME");
Matthias Clasen c5c398
+
Matthias Clasen c5c398
+  if (home_dir == NULL)
Matthias Clasen c5c398
+    return strdup ("/tmp");
Matthias Clasen c5c398
+
Matthias Clasen c5c398
+  config_home = getenv ("XDG_CONFIG_HOME");
Matthias Clasen c5c398
+  if (config_home == NULL || config_home[0] == 0)
Matthias Clasen c5c398
+    {
Matthias Clasen c5c398
+      config_file = malloc (strlen (home_dir) + strlen ("/.config/user-dirs.dirs") + 1);
Matthias Clasen c5c398
+      strcpy (config_file, home_dir);
Matthias Clasen c5c398
+      strcat (config_file, "/.config/user-dirs.dirs");
Matthias Clasen c5c398
+    }
Matthias Clasen c5c398
+  else
Matthias Clasen c5c398
+    {
Matthias Clasen c5c398
+      config_file = malloc (strlen (config_home) + strlen ("/user-dirs.dirs") + 1);
Matthias Clasen c5c398
+      strcpy (config_file, config_home);
Matthias Clasen c5c398
+      strcat (config_file, "/user-dirs.dirs");
Matthias Clasen c5c398
+    }
Matthias Clasen c5c398
+
Matthias Clasen c5c398
+  file = fopen (config_file, "r");
Matthias Clasen c5c398
+  free (config_file);
Matthias Clasen c5c398
+  if (file == NULL)
Matthias Clasen c5c398
+    goto error;
Matthias Clasen c5c398
+
Matthias Clasen c5c398
+  user_dir = NULL;
Matthias Clasen c5c398
+  while (fgets (buffer, sizeof (buffer), file))
Matthias Clasen c5c398
+    {
Matthias Clasen c5c398
+      /* Remove newline at end */
Matthias Clasen c5c398
+      len = strlen (buffer);
Matthias Clasen c5c398
+      if (len > 0 && buffer[len-1] == '\n')
Matthias Clasen c5c398
+	buffer[len-1] = 0;
Matthias Clasen c5c398
+      
Matthias Clasen c5c398
+      p = buffer;
Matthias Clasen c5c398
+      while (*p == ' ' || *p == '\t')
Matthias Clasen c5c398
+	p++;
Matthias Clasen c5c398
+      
Matthias Clasen c5c398
+      if (strncmp (p, "XDG_", 4) != 0)
Matthias Clasen c5c398
+	continue;
Matthias Clasen c5c398
+      p += 4;
Matthias Clasen c5c398
+      if (strncmp (p, type, strlen (type)) != 0)
Matthias Clasen c5c398
+	continue;
Matthias Clasen c5c398
+      p += strlen (type);
Matthias Clasen c5c398
+      if (strncmp (p, "_DIR", 4) != 0)
Matthias Clasen c5c398
+	continue;
Matthias Clasen c5c398
+      p += 4;
Matthias Clasen c5c398
+
Matthias Clasen c5c398
+      while (*p == ' ' || *p == '\t')
Matthias Clasen c5c398
+	p++;
Matthias Clasen c5c398
+
Matthias Clasen c5c398
+      if (*p != '=')
Matthias Clasen c5c398
+	continue;
Matthias Clasen c5c398
+      p++;
Matthias Clasen c5c398
+      
Matthias Clasen c5c398
+      while (*p == ' ' || *p == '\t')
Matthias Clasen c5c398
+	p++;
Matthias Clasen c5c398
+
Matthias Clasen c5c398
+      if (*p != '"')
Matthias Clasen c5c398
+	continue;
Matthias Clasen c5c398
+      p++;
Matthias Clasen c5c398
+      
Matthias Clasen c5c398
+      relative = 0;
Matthias Clasen c5c398
+      if (strncmp (p, "$HOME/", 6) == 0)
Matthias Clasen c5c398
+	{
Matthias Clasen c5c398
+	  p += 6;
Matthias Clasen c5c398
+	  relative = 1;
Matthias Clasen c5c398
+	}
Matthias Clasen c5c398
+      else if (*p != '/')
Matthias Clasen c5c398
+	continue;
Matthias Clasen c5c398
+      
Matthias Clasen c5c398
+      if (relative)
Matthias Clasen c5c398
+	{
Matthias Clasen c5c398
+	  user_dir = malloc (strlen (home_dir) + 1 + strlen (p) + 1);
Matthias Clasen c5c398
+	  strcpy (user_dir, home_dir);
Matthias Clasen c5c398
+	  strcat (user_dir, "/");
Matthias Clasen c5c398
+	}
Matthias Clasen c5c398
+      else
Matthias Clasen c5c398
+	{
Matthias Clasen c5c398
+	  user_dir = malloc (strlen (p) + 1);
Matthias Clasen c5c398
+	  *user_dir = 0;
Matthias Clasen c5c398
+	}
Matthias Clasen c5c398
+      
Matthias Clasen c5c398
+      d = user_dir + strlen (user_dir);
Matthias Clasen c5c398
+      while (*p && *p != '"')
Matthias Clasen c5c398
+	{
Matthias Clasen c5c398
+	  if ((*p == '\\') && (*(p+1) != 0))
Matthias Clasen c5c398
+	    p++;
Matthias Clasen c5c398
+	  *d++ = *p++;
Matthias Clasen c5c398
+	}
Matthias Clasen c5c398
+      *d = 0;
Matthias Clasen c5c398
+    }  
Matthias Clasen c5c398
+  fclose (file);
Matthias Clasen c5c398
+
Matthias Clasen c5c398
+  if (user_dir)
Matthias Clasen c5c398
+    return user_dir;
Matthias Clasen c5c398
+
Matthias Clasen c5c398
+ error:
Matthias Clasen c5c398
+  /* Special case desktop for historical compatibility */
Matthias Clasen c5c398
+  if (strcmp (type, "DESKTOP") == 0)
Matthias Clasen c5c398
+    {
Matthias Clasen c5c398
+      user_dir = malloc (strlen (home_dir) + strlen ("/Desktop") + 1);
Matthias Clasen c5c398
+      strcpy (user_dir, home_dir);
Matthias Clasen c5c398
+      strcat (user_dir, "/Desktop");
Matthias Clasen c5c398
+      return user_dir;
Matthias Clasen c5c398
+    }
Matthias Clasen c5c398
+  else
Matthias Clasen c5c398
+    return strdup (home_dir);
Matthias Clasen c5c398
+}
Matthias Clasen c5c398
+
Matthias Clasen c5c398
+#ifdef STANDALONE
Matthias Clasen c5c398
+int
Matthias Clasen c5c398
+main (int argc, char *argv[])
Matthias Clasen c5c398
+{
Matthias Clasen c5c398
+  if (argc != 2)
Matthias Clasen c5c398
+    {
Matthias Clasen c5c398
+      fprintf (stderr, "Usage %s <dir-type>\n", argv[0]);
Matthias Clasen c5c398
+      exit (1);
Matthias Clasen c5c398
+    }
Matthias Clasen c5c398
+  
Matthias Clasen c5c398
+  printf ("%s\n", xdg_user_dir_lookup (argv[1]));
Matthias Clasen c5c398
+  return 0;
Matthias Clasen c5c398
+}
Matthias Clasen c5c398
+#endif
Matthias Clasen c5c398
--- evince-0.8.0/shell/ev-window.c.user-dirs	2007-03-31 00:11:58.000000000 -0400
Matthias Clasen c5c398
+++ evince-0.8.0/shell/ev-window.c	2007-03-31 00:11:58.000000000 -0400
Matthias Clasen c5c398
@@ -94,6 +94,8 @@
Matthias Clasen c5c398
 
Matthias Clasen c5c398
 #include <string.h>
Matthias Clasen c5c398
 
Matthias Clasen c5c398
+#include "xdg-user-dir-lookup.c"
Matthias Clasen c5c398
+
Matthias Clasen c5c398
 typedef enum {
Matthias Clasen c5c398
 	PAGE_MODE_DOCUMENT,
Matthias Clasen c5c398
 	PAGE_MODE_PASSWORD
Matthias Clasen c5c398
@@ -1491,6 +1493,13 @@
Matthias Clasen c5c398
 		gtk_file_chooser_set_uri (GTK_FILE_CHOOSER (chooser),
Matthias Clasen c5c398
 					  window->priv->uri);
Matthias Clasen c5c398
 	}
Matthias Clasen c5c398
+	else {
Matthias Clasen c5c398
+		char *folder;
Matthias Clasen c5c398
+		folder = xdg_user_dir_lookup ("DOCUMENTS");
Matthias Clasen c5c398
+		gtk_file_chooser_set_current_folder (GTK_FILE_CHOOSER (chooser),
Matthias Clasen c5c398
+						     folder);
Matthias Clasen c5c398
+		free (folder);
Matthias Clasen c5c398
+	}
Matthias Clasen c5c398
 	
Matthias Clasen c5c398
 	g_signal_connect (chooser, "response",
Matthias Clasen c5c398
 			  G_CALLBACK (file_open_dialog_response_cb),
Matthias Clasen c5c398
@@ -1920,6 +1929,7 @@
Matthias Clasen c5c398
 	GtkWidget *fc;
Matthias Clasen c5c398
 	gchar *base_name;
Matthias Clasen c5c398
 	gchar *file_name;
Matthias Clasen c5c398
+	gchar *folder;
Matthias Clasen c5c398
 
Matthias Clasen c5c398
 	fc = gtk_file_chooser_dialog_new (
Matthias Clasen c5c398
 		_("Save a Copy"),
Matthias Clasen c5c398
@@ -1934,10 +1944,13 @@
Matthias Clasen c5c398
 	gtk_file_chooser_set_do_overwrite_confirmation(GTK_FILE_CHOOSER (fc), TRUE);	
Matthias Clasen c5c398
 	file_name = gnome_vfs_format_uri_for_display (ev_window->priv->uri);
Matthias Clasen c5c398
 	base_name = g_path_get_basename (file_name);
Matthias Clasen c5c398
+        folder = xdg_user_dir_lookup ("DOCUMENTS");
Matthias Clasen c5c398
 	gtk_file_chooser_set_current_name (GTK_FILE_CHOOSER (fc), base_name);
Matthias Clasen c5c398
+        gtk_file_chooser_set_current_folder (GTK_FILE_CHOOSER (fc), folder);
Matthias Clasen c5c398
 	g_free (file_name);
Matthias Clasen c5c398
 	g_free (base_name);
Matthias Clasen c5c398
-
Matthias Clasen c5c398
+        free (folder);
Matthias Clasen c5c398
+        
Matthias Clasen c5c398
 	g_signal_connect (fc, "response",
Matthias Clasen c5c398
 			  G_CALLBACK (file_save_dialog_response_cb),
Matthias Clasen c5c398
 			  ev_window);