[evolution-data-server] evo-I#1499 - ECredentialsPrompter: Ask for dialog parent with the auth_source
- From: Milan Crha <mcrha src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [evolution-data-server] evo-I#1499 - ECredentialsPrompter: Ask for dialog parent with the auth_source
- Date: Mon, 24 May 2021 17:58:46 +0000 (UTC)
commit 900472c52a37aa3033ee9de5a329a9da7422dee2
Author: Milan Crha <mcrha redhat com>
Date: Mon May 24 19:56:16 2021 +0200
evo-I#1499 - ECredentialsPrompter: Ask for dialog parent with the auth_source
Add a signal to ask for the credential prompt dialog parent with
the auth_source, thus the listener can decide what window to use
also by the source being asked credentials for.
Related to https://gitlab.gnome.org/GNOME/evolution/-/issues/1499
.../e-credentials-prompter-impl-oauth2.c | 2 +-
.../e-credentials-prompter-impl-password.c | 2 +-
src/libedataserverui/e-credentials-prompter.c | 61 ++++++++++++++++++++++
src/libedataserverui/e-credentials-prompter.h | 5 ++
4 files changed, 68 insertions(+), 2 deletions(-)
---
diff --git a/src/libedataserverui/e-credentials-prompter-impl-oauth2.c
b/src/libedataserverui/e-credentials-prompter-impl-oauth2.c
index df1c0964f..65b66da97 100644
--- a/src/libedataserverui/e-credentials-prompter-impl-oauth2.c
+++ b/src/libedataserverui/e-credentials-prompter-impl-oauth2.c
@@ -589,7 +589,7 @@ e_credentials_prompter_impl_oauth2_show_dialog (ECredentialsPrompterImplOAuth2 *
prompter = e_credentials_prompter_impl_get_credentials_prompter (E_CREDENTIALS_PROMPTER_IMPL
(prompter_oauth2));
g_return_val_if_fail (prompter != NULL, FALSE);
- dialog_parent = e_credentials_prompter_get_dialog_parent (prompter);
+ dialog_parent = e_credentials_prompter_get_dialog_parent_full (prompter,
prompter_oauth2->priv->auth_source);
credentials_prompter_impl_oauth2_get_prompt_strings (e_credentials_prompter_get_registry (prompter),
prompter_oauth2->priv->auth_source,
diff --git a/src/libedataserverui/e-credentials-prompter-impl-password.c
b/src/libedataserverui/e-credentials-prompter-impl-password.c
index 97c23339f..59ed3a641 100644
--- a/src/libedataserverui/e-credentials-prompter-impl-password.c
+++ b/src/libedataserverui/e-credentials-prompter-impl-password.c
@@ -219,7 +219,7 @@ e_credentials_prompter_impl_password_show_dialog (ECredentialsPrompterImplPasswo
prompter = e_credentials_prompter_impl_get_credentials_prompter (E_CREDENTIALS_PROMPTER_IMPL
(prompter_password));
g_return_val_if_fail (prompter != NULL, FALSE);
- dialog_parent = e_credentials_prompter_get_dialog_parent (prompter);
+ dialog_parent = e_credentials_prompter_get_dialog_parent_full (prompter,
prompter_password->priv->auth_source);
credentials_prompter_impl_password_get_prompt_strings (
e_credentials_prompter_get_registry (prompter),
diff --git a/src/libedataserverui/e-credentials-prompter.c b/src/libedataserverui/e-credentials-prompter.c
index 131927be8..47a661e23 100644
--- a/src/libedataserverui/e-credentials-prompter.c
+++ b/src/libedataserverui/e-credentials-prompter.c
@@ -71,6 +71,7 @@ enum {
enum {
GET_DIALOG_PARENT,
+ GET_DIALOG_PARENT_FULL,
LAST_SIGNAL
};
@@ -1157,6 +1158,28 @@ e_credentials_prompter_class_init (ECredentialsPrompterClass *class)
credentials_prompter_get_dialog_parent_accumulator, NULL, NULL,
GTK_TYPE_WINDOW, 0, G_TYPE_NONE);
+ /**
+ * ECredentialsPrompter::get-dialog-parent-full:
+ * @prompter: the #ECredentialsPrompter which emitted the signal
+ * @auth_source: (nullable): an #ESource, for which to show the credentials prompt
+ *
+ * Emitted when a new dialog will be shown, to get the right parent
+ * window for it. If the result of the call is %NULL, then it tries
+ * to get the window from the default GtkApplication.
+ *
+ * Returns: (transfer none): a #GtkWindow, to be used as a dialog parent,
+ * or %NULL.
+ *
+ * Since: 3.42
+ **/
+ signals[GET_DIALOG_PARENT_FULL] = g_signal_new (
+ "get-dialog-parent-full",
+ G_OBJECT_CLASS_TYPE (object_class),
+ G_SIGNAL_RUN_LAST,
+ /*G_STRUCT_OFFSET (ECredentialsPrompterClass, get_dialog_parent_full)*/ 0,
+ credentials_prompter_get_dialog_parent_accumulator, NULL, NULL,
+ GTK_TYPE_WINDOW, 1, E_TYPE_SOURCE);
+
/* Ensure built-in credential providers implementation types */
g_type_ensure (E_TYPE_CREDENTIALS_PROMPTER_IMPL_PASSWORD);
g_type_ensure (E_TYPE_CREDENTIALS_PROMPTER_IMPL_OAUTH2);
@@ -1397,6 +1420,44 @@ e_credentials_prompter_get_dialog_parent (ECredentialsPrompter *prompter)
return parent;
}
+/**
+ * e_credentials_prompter_get_dialog_parent_full:
+ * @prompter: an #ECredentialsPrompter
+ * @auth_source: (nullable): an #ESource
+ *
+ * Returns a #GtkWindow, which should be used as a dialog parent for the @auth_source.
+ *
+ * This is determined by an ECredentialsPrompter::get-dialog-parent-full signal emission
+ * and an ECredentialsPrompter::get-dialog-parent when the first doesn't return anything.
+ * If there is no callback registered or the current callbacks don't have any suitable
+ * window, then there's chosen the last active window from the default GApplication,
+ * if any available.
+ *
+ * Returns: (transfer none): a #GtkWindow, to be used as a dialog parent, or %NULL.
+ *
+ * Since: 3.42
+ **/
+GtkWindow *
+e_credentials_prompter_get_dialog_parent_full (ECredentialsPrompter *prompter,
+ ESource *auth_source)
+{
+ GtkWindow *parent = NULL;
+
+ g_return_val_if_fail (E_IS_CREDENTIALS_PROMPTER (prompter), NULL);
+ if (auth_source)
+ g_return_val_if_fail (E_IS_SOURCE (auth_source), NULL);
+
+ g_signal_emit (prompter, signals[GET_DIALOG_PARENT_FULL], 0, auth_source, &parent);
+
+ if (!parent)
+ g_signal_emit (prompter, signals[GET_DIALOG_PARENT], 0, &parent);
+
+ if (!parent)
+ parent = credentials_prompter_guess_dialog_parent (prompter);
+
+ return parent;
+}
+
/**
* e_credentials_prompter_register_impl:
* @prompter: an #ECredentialsPrompter
diff --git a/src/libedataserverui/e-credentials-prompter.h b/src/libedataserverui/e-credentials-prompter.h
index 6aa724c13..7750e24d7 100644
--- a/src/libedataserverui/e-credentials-prompter.h
+++ b/src/libedataserverui/e-credentials-prompter.h
@@ -120,6 +120,8 @@ struct _ECredentialsPrompterClass {
/* Signals */
GtkWindow * (*get_dialog_parent) (ECredentialsPrompter *prompter);
+ /*GtkWindow * (*get_dialog_parent_full)(ECredentialsPrompter *prompter,
+ ESource *auth_source); */
};
GType e_credentials_prompter_get_type (void) G_GNUC_CONST;
@@ -145,6 +147,9 @@ gboolean e_credentials_prompter_get_auto_prompt_disabled_for
ESource *source);
GtkWindow * e_credentials_prompter_get_dialog_parent
(ECredentialsPrompter *prompter);
+GtkWindow * e_credentials_prompter_get_dialog_parent_full
+ (ECredentialsPrompter *prompter,
+ ESource *auth_source);
gboolean e_credentials_prompter_register_impl
(ECredentialsPrompter *prompter,
const gchar *authentication_method,
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]