From c5c3980775d8024b018973435a984383eccaf080 Mon Sep 17 00:00:00 2001 From: Matthias Clasen Date: Sat, 31 Mar 2007 04:15:21 +0000 Subject: [PATCH] add xdg-user-dirs support --- evince-0.8.0-user-dirs.patch | 216 +++++++++++++++++++++++++++++++++++ evince.spec | 7 +- 2 files changed, 222 insertions(+), 1 deletion(-) create mode 100644 evince-0.8.0-user-dirs.patch diff --git a/evince-0.8.0-user-dirs.patch b/evince-0.8.0-user-dirs.patch new file mode 100644 index 0000000..8c94315 --- /dev/null +++ b/evince-0.8.0-user-dirs.patch @@ -0,0 +1,216 @@ +--- /dev/null 2007-03-30 23:44:47.845290878 -0400 ++++ evince-0.8.0/shell/xdg-user-dir-lookup.c 2007-03-31 00:13:52.000000000 -0400 +@@ -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 ++#include ++#include ++ ++ ++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 \n", argv[0]); ++ exit (1); ++ } ++ ++ printf ("%s\n", xdg_user_dir_lookup (argv[1])); ++ return 0; ++} ++#endif +--- evince-0.8.0/shell/ev-window.c.user-dirs 2007-03-31 00:11:58.000000000 -0400 ++++ evince-0.8.0/shell/ev-window.c 2007-03-31 00:11:58.000000000 -0400 +@@ -94,6 +94,8 @@ + + #include + ++#include "xdg-user-dir-lookup.c" ++ + typedef enum { + PAGE_MODE_DOCUMENT, + PAGE_MODE_PASSWORD +@@ -1491,6 +1493,13 @@ + 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), +@@ -1920,6 +1929,7 @@ + GtkWidget *fc; + gchar *base_name; + gchar *file_name; ++ gchar *folder; + + fc = gtk_file_chooser_dialog_new ( + _("Save a Copy"), +@@ -1934,10 +1944,13 @@ + 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/evince.spec b/evince.spec index cdb99aa..54b6e07 100644 --- a/evince.spec +++ b/evince.spec @@ -4,7 +4,7 @@ Name: evince Version: 0.8.0 -Release: 1%{?dist} +Release: 2%{?dist} Summary: Document viewer License: GPL @@ -12,6 +12,7 @@ Group: Applications/Publishing URL: http://www.gnome.org/projects/evince/ Source0: http://ftp.gnome.org/pub/GNOME/sources/%{name}/0.8/%{name}-%{version}.tar.bz2 Patch0: evince-0.6.0-print-error.patch +Patch1: evince-0.8.0-user-dirs.patch BuildRoot: %{_tmppath}/%{name}-%{version}-%{release}-root-%(%{__id_u} -n) BuildRequires: gtk2-devel >= %{gtk2_version} @@ -45,6 +46,7 @@ evince is a GNOME-based document viewer. %prep %setup -q %patch0 -p1 -b .print-error +%patch1 -p1 -b .user-dirs %build %configure --disable-static --disable-scrollkeeper @@ -139,6 +141,9 @@ fi %changelog +* Sat Mar 31 2007 Matthias Clasen - 0.8.0-2 +- Add support for xdg-user-dirs + * Tue Mar 13 2007 Matthias Clasen - 0.8.0-1 - Update to 0.8.0 - Use desktop-file-install