56e94f
From 1f250861fa2ec6a7117f183459e62ac285d85db6 Mon Sep 17 00:00:00 2001
56e94f
From: Marek Kasik <mkasik@redhat.com>
56e94f
Date: Tue, 2 Mar 2021 18:40:56 +0100
56e94f
Subject: [PATCH] window: Show password dialog again
56e94f
56e94f
Show password dialog when trying to open a document for which we've
56e94f
cancelled a password dialog before in recent view.
56e94f
56e94f
This is achieved by adding a signal "cancelled" to EvPasswordView since
56e94f
only successfull entering of password was signaled before by "unlock" signal.
56e94f
56e94f
We also need to unregister current document with EvApplication and clear its uri
56e94f
there to be able to open other documents in current window.
56e94f
---
56e94f
 shell/ev-application.c   | 16 ++++++++++++++++
56e94f
 shell/ev-application.h   |  1 +
56e94f
 shell/ev-password-view.c | 14 ++++++++++++++
56e94f
 shell/ev-password-view.h |  3 ++-
56e94f
 shell/ev-window.c        | 23 ++++++++++++++++++++++-
56e94f
 5 files changed, 55 insertions(+), 2 deletions(-)
56e94f
56e94f
56e94f
56e94f
From ef2d7ca9734c6a2e3ba0a80279d944352d355295 Mon Sep 17 00:00:00 2001
56e94f
From: Tom Schoonjans <Tom.Schoonjans@rfi.ac.uk>
56e94f
Date: Wed, 9 Jun 2021 06:39:48 +0100
56e94f
Subject: [PATCH] ev-application: fix compilation error when DBus is disabled
56e94f
56e94f
---
56e94f
 shell/ev-application.c | 2 ++
56e94f
 1 file changed, 2 insertions(+)
56e94f
56e94f
diff --git a/shell/ev-application.c b/shell/ev-application.c
56e94f
index 23871d9a..7a3b69ba 100644
56e94f
--- a/shell/ev-application.c
56e94f
+++ b/shell/ev-application.c
56e94f
@@ -539,6 +539,7 @@ ev_application_unregister_uri (EvApplication *application,
56e94f
 		g_error_free (error);
56e94f
 	} else {
56e94f
                 g_variant_unref (value);
56e94f
+		application->doc_registered = FALSE;
56e94f
 	}
56e94f
 }
56e94f
 #endif /* ENABLE_DBUS */
56e94f
@@ -1166,6 +1167,23 @@ ev_application_get_uri (EvApplication *application)
56e94f
 	return application->uri;
56e94f
 }
56e94f
 
56e94f
+/**
56e94f
+ * ev_application_clear_uri:
56e94f
+ * @application: The instance of the application.
56e94f
+ *
56e94f
+ * This unregisters current uri and clears it so that another document
56e94f
+ * can be opened in this instance. E.g. after cancelled password dialog
56e94f
+ * in recent view.
56e94f
+ */
56e94f
+void
56e94f
+ev_application_clear_uri (EvApplication *application)
56e94f
+{
56e94f
+#ifdef ENABLE_DBUS
56e94f
+	ev_application_unregister_uri (application, application->uri);
56e94f
+#endif
56e94f
+	g_clear_pointer (&application->uri, g_free);
56e94f
+}
56e94f
+
56e94f
 /**
56e94f
  * ev_application_get_media_keys:
56e94f
  * @application: The instance of the application.
56e94f
diff --git a/shell/ev-application.h b/shell/ev-application.h
56e94f
index 00a7a18b..f9b43ab3 100644
56e94f
--- a/shell/ev-application.h
56e94f
+++ b/shell/ev-application.h
56e94f
@@ -66,6 +66,7 @@ void	          ev_application_open_uri_list       (EvApplication   *application,
56e94f
 gboolean	  ev_application_has_window	     (EvApplication   *application);
56e94f
 guint             ev_application_get_n_windows       (EvApplication   *application);
56e94f
 const gchar *     ev_application_get_uri             (EvApplication   *application);
56e94f
+void              ev_application_clear_uri           (EvApplication   *application);
56e94f
 GObject		 *ev_application_get_media_keys	     (EvApplication   *application);
56e94f
 
56e94f
 const gchar      *ev_application_get_dot_dir         (EvApplication   *application,
56e94f
diff --git a/shell/ev-password-view.c b/shell/ev-password-view.c
56e94f
index 9a916d55..0dab3c51 100644
56e94f
--- a/shell/ev-password-view.c
56e94f
+++ b/shell/ev-password-view.c
56e94f
@@ -38,6 +38,7 @@
56e94f
 
56e94f
 enum {
56e94f
 	UNLOCK,
56e94f
+	CANCELLED,
56e94f
 	LAST_SIGNAL
56e94f
 };
56e94f
 struct _EvPasswordViewPrivate {
56e94f
@@ -91,6 +92,15 @@ ev_password_view_class_init (EvPasswordViewClass *class)
56e94f
 			      g_cclosure_marshal_VOID__VOID,
56e94f
 			      G_TYPE_NONE, 0);
56e94f
 
56e94f
+	password_view_signals[CANCELLED] =
56e94f
+		g_signal_new ("cancelled",
56e94f
+			      G_TYPE_FROM_CLASS (g_object_class),
56e94f
+			      G_SIGNAL_RUN_LAST | G_SIGNAL_ACTION,
56e94f
+			      G_STRUCT_OFFSET (EvPasswordViewClass, cancelled),
56e94f
+			      NULL, NULL,
56e94f
+			      g_cclosure_marshal_VOID__VOID,
56e94f
+			      G_TYPE_NONE, 0);
56e94f
+
56e94f
 	g_type_class_add_private (g_object_class, sizeof (EvPasswordViewPrivate));
56e94f
 
56e94f
 	g_object_class->finalize = ev_password_view_finalize;
56e94f
@@ -183,6 +193,10 @@ ev_password_dialog_got_response (GtkDialog      *dialog,
56e94f
 			g_strdup (gtk_entry_get_text (GTK_ENTRY (password_view->priv->password_entry)));
56e94f
 		
56e94f
 		g_signal_emit (password_view, password_view_signals[UNLOCK], 0);
56e94f
+	} else if (response_id == GTK_RESPONSE_CANCEL ||
56e94f
+		   response_id == GTK_RESPONSE_CLOSE ||
56e94f
+		   response_id == GTK_RESPONSE_DELETE_EVENT) {
56e94f
+		g_signal_emit (password_view, password_view_signals[CANCELLED], 0);
56e94f
 	}
56e94f
 	
56e94f
 	gtk_widget_destroy (GTK_WIDGET (dialog));
56e94f
diff --git a/shell/ev-password-view.h b/shell/ev-password-view.h
56e94f
index c3fc5bbc..e279c612 100644
56e94f
--- a/shell/ev-password-view.h
56e94f
+++ b/shell/ev-password-view.h
56e94f
@@ -40,7 +40,8 @@ struct _EvPasswordViewClass {
56e94f
 	GtkViewportClass parent_class;
56e94f
 
56e94f
 	/* signals */
56e94f
-	void (*unlock) (EvPasswordView	*self);
56e94f
+	void (*unlock)    (EvPasswordView	*self);
56e94f
+	void (*cancelled) (EvPasswordView	*self);
56e94f
 };
56e94f
 
56e94f
 GType	      ev_password_view_get_type                (void) G_GNUC_CONST;
56e94f
diff --git a/shell/ev-window.c b/shell/ev-window.c
56e94f
index 077d577d..f728fa77 100644
56e94f
--- a/shell/ev-window.c
56e94f
+++ b/shell/ev-window.c
56e94f
@@ -239,6 +239,8 @@ typedef struct {
56e94f
 
56e94f
 	/* Send to */
56e94f
 	gboolean has_mailto_handler;
56e94f
+
56e94f
+	gboolean password_view_cancelled;
56e94f
 };
56e94f
 
56e94f
 #define EV_WINDOW_GET_PRIVATE(object) \
56e94f
@@ -1804,6 +1806,7 @@ ev_window_password_view_unlock (EvWindow *ev_window)
56e94f
 	password = ev_password_view_get_password (EV_PASSWORD_VIEW (ev_window->priv->password_view));
56e94f
 	ev_job_load_set_password (EV_JOB_LOAD (ev_window->priv->load_job), password);
56e94f
 	ev_job_scheduler_push_job (ev_window->priv->load_job, EV_JOB_PRIORITY_NONE);
56e94f
+	ev_window->priv->password_view_cancelled = FALSE;
56e94f
 }
56e94f
 
56e94f
 static void
56e94f
@@ -1821,6 +1824,18 @@ ev_window_clear_load_job (EvWindow *ev_window)
56e94f
 	}
56e94f
 }
56e94f
 
56e94f
+static void
56e94f
+ev_window_password_view_cancelled (EvWindow *ev_window)
56e94f
+{
56e94f
+	EvWindowPrivate *priv = ev_window->priv;
56e94f
+
56e94f
+	priv->password_view_cancelled = TRUE;
56e94f
+	if (ev_window_is_recent_view (ev_window)) {
56e94f
+		ev_window_clear_load_job (ev_window);
56e94f
+		ev_application_clear_uri (EV_APP);
56e94f
+	}
56e94f
+}
56e94f
+
56e94f
 static void
56e94f
 ev_window_clear_reload_job (EvWindow *ev_window)
56e94f
 {
56e94f
@@ -2395,7 +2410,8 @@ ev_window_open_uri (EvWindow       *ev_window,
56e94f
 		g_strdup (search_string) : NULL;
56e94f
 
56e94f
 	if (ev_window->priv->uri &&
56e94f
-	    g_ascii_strcasecmp (ev_window->priv->uri, uri) == 0) {
56e94f
+	    g_ascii_strcasecmp (ev_window->priv->uri, uri) == 0 &&
56e94f
+	    !ev_window->priv->password_view_cancelled) {
56e94f
 		ev_window_reload_document (ev_window, dest);
56e94f
 		return;
56e94f
 	}
56e94f
@@ -7643,11 +7659,16 @@ ev_window_init (EvWindow *ev_window)
56e94f
 				     allow_links_change_zoom);
56e94f
 	ev_view_set_model (EV_VIEW (ev_window->priv->view), ev_window->priv->model);
56e94f
 
56e94f
+	ev_window->priv->password_view_cancelled = FALSE;
56e94f
 	ev_window->priv->password_view = ev_password_view_new (GTK_WINDOW (ev_window));
56e94f
 	g_signal_connect_swapped (ev_window->priv->password_view,
56e94f
 				  "unlock",
56e94f
 				  G_CALLBACK (ev_window_password_view_unlock),
56e94f
 				  ev_window);
56e94f
+	g_signal_connect_swapped (ev_window->priv->password_view,
56e94f
+				  "cancelled",
56e94f
+				  G_CALLBACK (ev_window_password_view_cancelled),
56e94f
+				  ev_window);
56e94f
 	g_signal_connect_object (ev_window->priv->view, "focus_in_event",
56e94f
 			         G_CALLBACK (view_actions_focus_in_cb),
56e94f
 				 ev_window, 0);
56e94f
-- 
56e94f
2.31.1
56e94f