+2006-11-10 Carlos Garcia Campos <carlosgc@gnome.org>
+
+ * shell/ev-application.[ch]: (get_unlink_temp_file_from_args),
+ (ev_application_open_uri_at_dest), (ev_application_open_uri):
+ * shell/ev-window.[ch]: (ev_window_clear_temp_file),
+ (ev_window_open_uri):
+ * shell/main.c: (arguments_parse):
+
+ Remove temp file created when evince is used by GTK+ in
+ preview mode. Fixes bug #365282.
+
2006-11-10 Nickolay V. Shmyrev <nshmyrev@yandex.ru>
* shell/ev-window.c: (ev_window_sidebar_visibility_changed_cb):
return dest;
}
+static gboolean
+get_unlink_temp_file_from_args (GHashTable *args)
+{
+ gboolean unlink_temp_file = FALSE;
+ GValue *value = NULL;
+
+ g_assert (args != NULL);
+
+ value = g_hash_table_lookup (args, "unlink-temp-file");
+ if (value) {
+ unlink_temp_file = g_value_get_boolean (value);
+ }
+
+ return unlink_temp_file;
+}
+
gboolean
ev_application_open_window (EvApplication *application,
GHashTable *args,
GdkScreen *screen,
EvLinkDest *dest,
EvWindowRunMode mode,
+ gboolean unlink_temp_file,
guint timestamp)
{
EvWindow *new_window;
/* We need to load uri before showing the window, so
we can restore window size without flickering */
- ev_window_open_uri (new_window, uri, dest, mode);
+ ev_window_open_uri (new_window, uri, dest, mode, unlink_temp_file);
gtk_widget_show (GTK_WIDGET (new_window));
{
EvLinkDest *dest = NULL;
EvWindowRunMode mode = EV_WINDOW_MODE_NORMAL;
+ gboolean unlink_temp_file = FALSE;
GdkScreen *screen = NULL;
if (args) {
screen = get_screen_from_args (args);
dest = get_destination_from_args (args);
mode = get_window_run_mode_from_args (args);
+ unlink_temp_file = (mode == EV_WINDOW_MODE_PREVIEW &&
+ get_unlink_temp_file_from_args (args));
}
ev_application_open_uri_at_dest (application, uri, screen,
- dest, mode, timestamp);
+ dest, mode, unlink_temp_file,
+ timestamp);
if (dest)
g_object_unref (dest);
for (l = uri_list; l != NULL; l = l->next) {
ev_application_open_uri_at_dest (application, (char *)l->data,
- screen, NULL, 0, timestamp);
+ screen, NULL, 0, FALSE,
+ timestamp);
}
}
GdkScreen *screen,
EvLinkDest *dest,
EvWindowRunMode mode,
+ gboolean unlink_temp_file,
guint32 timestamp);
void ev_application_open_uri_list (EvApplication *application,
GSList *uri_list,
#include <poppler.h>
+#include <glib/gstdio.h>
#include <glib/gi18n.h>
#include <gtk/gtk.h>
#include <gnome.h>
char *uri;
char *local_uri;
EvLinkDest *dest;
+ gboolean unlink_temp_file;
EvDocument *document;
if (ev_window->priv->local_uri) {
filename = g_filename_from_uri (ev_window->priv->local_uri, NULL, NULL);
if (filename != NULL) {
- unlink (filename);
+ g_unlink (filename);
g_free (filename);
}
g_free (ev_window->priv->local_uri);
}
}
+static void
+ev_window_clear_temp_file (EvWindow *ev_window)
+{
+ GnomeVFSURI *uri;
+ gchar *filename;
+ gchar *dir;
+
+ if (!ev_window->priv->uri)
+ return;
+
+ uri = gnome_vfs_uri_new (ev_window->priv->uri);
+ if (!gnome_vfs_uri_is_local (uri)) {
+ gnome_vfs_uri_unref (uri);
+ return;
+ }
+ gnome_vfs_uri_unref (uri);
+
+ filename = g_filename_from_uri (ev_window->priv->uri, NULL, NULL);
+ if (!filename)
+ return;
+
+ dir = g_path_get_dirname (filename);
+ if (g_ascii_strcasecmp (dir, g_get_tmp_dir ()) == 0) {
+ g_unlink (filename);
+ }
+
+ g_free (dir);
+ g_free (filename);
+}
+
/* This callback will executed when load job will be finished.
*
* Since the flow of the error dialog is very confusing, we assume that both
ev_window_open_uri (EvWindow *ev_window,
const char *uri,
EvLinkDest *dest,
- EvWindowRunMode mode)
+ EvWindowRunMode mode,
+ gboolean unlink_temp_file)
{
ev_window_close_dialogs (ev_window);
ev_window_clear_xfer_job (ev_window);
ev_window_clear_local_uri (ev_window);
ev_view_set_loading (EV_VIEW (ev_window->priv->view), TRUE);
+ ev_window->priv->unlink_temp_file =
+ (mode == EV_WINDOW_MODE_PREVIEW) ? unlink_temp_file : FALSE;
+
ev_window->priv->xfer_job = ev_job_xfer_new (uri, dest, mode);
g_signal_connect (ev_window->priv->xfer_job,
"finished",
ev_application_open_uri_at_dest (EV_APP, uri,
gtk_window_get_screen (GTK_WINDOW (window)),
- NULL, 0,
+ NULL, 0, FALSE,
GDK_CURRENT_TIME);
}
#else
uri = g_strdup (ev_window->priv->uri);
- ev_window_open_uri (ev_window, uri, NULL, 0);
+ ev_window_open_uri (ev_window, uri, NULL, 0, FALSE);
g_free (uri);
}
}
if (priv->uri) {
+ if (priv->unlink_temp_file)
+ ev_window_clear_temp_file (window);
g_free (priv->uri);
priv->uri = NULL;
}
gtk_window_get_screen (GTK_WINDOW (window)),
ev_link_action_get_dest (action),
0,
+ FALSE,
GDK_CURRENT_TIME);
g_free (uri);
void ev_window_open_uri (EvWindow *ev_window,
const char *uri,
EvLinkDest *dest,
- EvWindowRunMode mode);
+ EvWindowRunMode mode,
+ gboolean unlink_temp_file);
void ev_window_goto_dest (EvWindow *ev_window,
EvLinkDest *dest);
gboolean ev_window_is_empty (const EvWindow *ev_window);
static gboolean preview_mode = FALSE;
static gboolean fullscren_mode = FALSE;
static gboolean presentation_mode = FALSE;
+static gboolean unlink_temp_file = FALSE;
static const char **file_arguments = NULL;
static const GOptionEntry goption_options[] =
{ "fullscreen", 'f', 0, G_OPTION_ARG_NONE, &fullscren_mode, N_("Run evince in fullscreen mode"), NULL },
{ "presentation", 's', 0, G_OPTION_ARG_NONE, &presentation_mode, N_("Run evince in presentation mode"), NULL },
{ "preview", 'w', 0, G_OPTION_ARG_NONE, &preview_mode, N_("Run evince as a previewer"), NULL },
+ { "unlink-temp-file", 'u', G_OPTION_FLAG_HIDDEN, G_OPTION_ARG_NONE, &unlink_temp_file, NULL, NULL },
{ G_OPTION_REMAINING, 0, 0, G_OPTION_ARG_FILENAME_ARRAY, &file_arguments, NULL, N_("[FILE...]") },
{ NULL }
};
g_hash_table_insert (args, g_strdup ("mode"), value);
+ if (mode == EV_WINDOW_MODE_PREVIEW && unlink_temp_file) {
+ value = g_new0 (GValue, 1);
+ g_value_init (value, G_TYPE_BOOLEAN);
+ g_value_set_boolean (value, unlink_temp_file);
+
+ g_hash_table_insert (args,
+ g_strdup ("unlink-temp-file"),
+ value);
+ }
+
return args;
}