]> www.fi.muni.cz Git - evince.git/commitdiff
Use the xdg-user-dirs DOCUMENTS folder as default folder when opening a
authorMatthias Clasen <mclasen@redhat.com>
Mon, 2 Apr 2007 04:47:46 +0000 (04:47 +0000)
committerMatthias Clasen <matthiasc@src.gnome.org>
Mon, 2 Apr 2007 04:47:46 +0000 (04:47 +0000)
2007-04-02  Matthias Clasen  <mclasen@redhat.com>

        * shell/ev-window.c (file_open_dialog_response_cb): Use
        the xdg-user-dirs DOCUMENTS folder as default folder when
        opening a file chooser.  (#424858)

        * shell/xdg-user-dir-lookup.c: Copy-and-pasted file from
        xdg-user-dirs.

svn path=/trunk/; revision=2392

ChangeLog
shell/ev-window.c
shell/xdg-user-dir-lookup.c [new file with mode: 0644]

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