diff --git a/libsecret/secret-prompt.c b/libsecret/secret-prompt.c
index 61c1e14..8d84b7f 100644
--- a/libsecret/secret-prompt.c
+++ b/libsecret/secret-prompt.c
@@ -125,7 +125,7 @@ _secret_prompt_instance (SecretService *service,
/**
* secret_prompt_run:
* @self: a prompt
- * @window_id: XWindow id for parent window to be transient for
+ * @window_id: (allow-none): string form of XWindow id for parent window to be transient for
* @cancellable: optional cancellation object
* @return_type: the variant type of the prompt result
* @error: location to place an error on failure
@@ -135,10 +135,11 @@ _secret_prompt_instance (SecretService *service,
* action the prompt is completing, and is defined in the Secret Service DBus
* API specification.
*
- * If @window_id is non-zero then it is used as an XWindow id. The Secret
- * Service can make its prompt transient for the window with this id. In some
- * Secret Service implementations this is not possible, so the behavior
- * depending on this should degrade gracefully.
+ * If @window_id is non-null then it is used as an XWindow id on Linux. The API
+ * expects this id to be converted to a string using the %d
+ * printf format. The Secret Service can make its prompt transient for the window
+ * with this id. In some Secret Service implementations this is not possible, so
+ * the behavior depending on this should degrade gracefully.
*
* This runs the dialog in a recursive mainloop. When run from a user interface
* thread, this means the user interface will remain responsive. Care should be
@@ -149,7 +150,7 @@ _secret_prompt_instance (SecretService *service,
*/
GVariant *
secret_prompt_run (SecretPrompt *self,
- gulong window_id,
+ const gchar *window_id,
GCancellable *cancellable,
const GVariantType *return_type,
GError **error)
@@ -184,7 +185,7 @@ secret_prompt_run (SecretPrompt *self,
/**
* secret_prompt_perform_sync:
* @self: a prompt
- * @window_id: XWindow id for parent window to be transient for
+ * @window_id: (allow-none): string form of XWindow id for parent window to be transient for
* @cancellable: optional cancellation object
* @return_type: the variant type of the prompt result
* @error: location to place an error on failure
@@ -194,10 +195,11 @@ secret_prompt_run (SecretPrompt *self,
* action the prompt is completing, and is defined in the Secret Service DBus
* API specification.
*
- * If @window_id is non-zero then it is used as an XWindow id. The Secret
- * Service can make its prompt transient for the window with this id. In some
- * Secret Service implementations this is not possible, so the behavior
- * depending on this should degrade gracefully.
+ * If @window_id is non-null then it is used as an XWindow id on Linux. The API
+ * expects this id to be converted to a string using the %d
+ * printf format. The Secret Service can make its prompt transient for the window
+ * with this id. In some Secret Service implementations this is not possible,
+ * so the behavior depending on this should degrade gracefully.
*
* This method may block indefinitely and should not be used in user interface
* threads.
@@ -206,7 +208,7 @@ secret_prompt_run (SecretPrompt *self,
*/
GVariant *
secret_prompt_perform_sync (SecretPrompt *self,
- gulong window_id,
+ const gchar *window_id,
GCancellable *cancellable,
const GVariantType *return_type,
GError **error)
@@ -411,7 +413,7 @@ on_prompt_cancelled (GCancellable *cancellable,
/**
* secret_prompt_perform:
* @self: a prompt
- * @window_id: XWindow id for parent window to be transient for
+ * @window_id: (allow-none): string form of XWindow id for parent window to be transient for
* @return_type: the variant type of the prompt result
* @cancellable: optional cancellation object
* @callback: called when the operation completes
@@ -420,16 +422,17 @@ on_prompt_cancelled (GCancellable *cancellable,
* Runs a prompt and performs the prompting. Returns %TRUE if the prompt
* was completed and not dismissed.
*
- * If @window_id is non-zero then it is used as an XWindow id. The Secret
- * Service can make its prompt transient for the window with this id. In some
- * Secret Service implementations this is not possible, so the behavior
- * depending on this should degrade gracefully.
+ * If @window_id is non-null then it is used as an XWindow id on Linux. The API
+ * expects this id to be converted to a string using the %d
+ * printf format. The Secret Service can make its prompt transient for the window
+ * with this id. In some Secret Service implementations this is not possible, so
+ * the behavior depending on this should degrade gracefully.
*
* This method will return immediately and complete asynchronously.
*/
void
secret_prompt_perform (SecretPrompt *self,
- gulong window_id,
+ const gchar *window_id,
const GVariantType *return_type,
GCancellable *cancellable,
GAsyncReadyCallback callback,
@@ -441,7 +444,6 @@ secret_prompt_perform (SecretPrompt *self,
const gchar *object_path;
gboolean prompted;
GDBusProxy *proxy;
- gchar *window;
g_return_if_fail (SECRET_IS_PROMPT (self));
g_return_if_fail (cancellable == NULL || G_IS_CANCELLABLE (cancellable));
@@ -463,10 +465,8 @@ secret_prompt_perform (SecretPrompt *self,
closure->return_type = return_type ? g_variant_type_copy (return_type) : NULL;
g_simple_async_result_set_op_res_gpointer (res, closure, perform_closure_free);
- if (window_id == 0)
- window = g_strdup ("");
- else
- window = g_strdup_printf ("%lu", window_id);
+ if (window_id == NULL)
+ window_id = "";
owner_name = g_dbus_proxy_get_name_owner (proxy);
object_path = g_dbus_proxy_get_object_path (proxy);
@@ -492,11 +492,10 @@ secret_prompt_perform (SecretPrompt *self,
res, NULL);
}
- g_dbus_proxy_call (proxy, "Prompt", g_variant_new ("(s)", window),
+ g_dbus_proxy_call (proxy, "Prompt", g_variant_new ("(s)", window_id),
G_DBUS_CALL_FLAGS_NO_AUTO_START, -1,
closure->call_cancellable, on_prompt_prompted, g_object_ref (res));
- g_free (window);
g_object_unref (res);
}
diff --git a/libsecret/secret-prompt.h b/libsecret/secret-prompt.h
index 7660c1c..983c741 100644
--- a/libsecret/secret-prompt.h
+++ b/libsecret/secret-prompt.h
@@ -53,19 +53,19 @@ struct _SecretPromptClass {
GType secret_prompt_get_type (void) G_GNUC_CONST;
GVariant * secret_prompt_run (SecretPrompt *self,
- gulong window_id,
+ const gchar *window_id,
GCancellable *cancellable,
const GVariantType *return_type,
GError **error);
GVariant * secret_prompt_perform_sync (SecretPrompt *self,
- gulong window_id,
+ const gchar *window_id,
GCancellable *cancellable,
const GVariantType *return_type,
GError **error);
void secret_prompt_perform (SecretPrompt *self,
- gulong window_id,
+ const gchar *window_id,
const GVariantType *return_type,
GCancellable *cancellable,
GAsyncReadyCallback callback,
diff --git a/libsecret/secret-service.c b/libsecret/secret-service.c
index 0295c89..7954b8c 100644
--- a/libsecret/secret-service.c
+++ b/libsecret/secret-service.c
@@ -304,7 +304,7 @@ secret_service_real_prompt_sync (SecretService *self,
const GVariantType *return_type,
GError **error)
{
- return secret_prompt_perform_sync (prompt, 0, cancellable, return_type, error);
+ return secret_prompt_perform_sync (prompt, NULL, cancellable, return_type, error);
}
static void
@@ -1650,7 +1650,7 @@ secret_service_load_collections_sync (SecretService *self,
*
* Override the #SecretServiceClass prompt_sync virtual method
* to change the behavior of the propmting. The default behavior is to simply
- * run secret_prompt_perform_sync() on the prompt.
+ * run secret_prompt_perform_sync() on the prompt with a %NULL window_id.
*
* Returns: (transfer full): %NULL if the prompt was dismissed or an error occurred,
* a variant result if the prompt was successful
diff --git a/libsecret/tests/test-prompt.c b/libsecret/tests/test-prompt.c
index 4093096..bc528fb 100644
--- a/libsecret/tests/test-prompt.c
+++ b/libsecret/tests/test-prompt.c
@@ -94,7 +94,7 @@ test_perform_sync (Test *test,
prompt = _secret_prompt_instance (test->service, "/org/freedesktop/secrets/prompts/simple");
- retval = secret_prompt_perform_sync (prompt, 0, NULL, NULL, &error);
+ retval = secret_prompt_perform_sync (prompt, NULL, NULL, NULL, &error);
g_assert_no_error (error);
g_assert (retval != NULL);
g_variant_unref (retval);
@@ -215,7 +215,7 @@ test_perform_fail (Test *test,
prompt = _secret_prompt_instance (test->service, "/org/freedesktop/secrets/prompts/error");
g_object_add_weak_pointer (G_OBJECT (prompt), (gpointer *)&prompt);
- retval = secret_prompt_perform_sync (prompt, 0, NULL, NULL, &error);
+ retval = secret_prompt_perform_sync (prompt, NULL, NULL, NULL, &error);
g_assert_error (error, G_DBUS_ERROR, G_DBUS_ERROR_NOT_SUPPORTED);
g_assert (retval == NULL);
@@ -234,7 +234,7 @@ test_perform_vanish (Test *test,
prompt = _secret_prompt_instance (test->service, "/org/freedesktop/secrets/prompts/vanish");
g_object_add_weak_pointer (G_OBJECT (prompt), (gpointer *)&prompt);
- retval = secret_prompt_perform_sync (prompt, 0, NULL, NULL, &error);
+ retval = secret_prompt_perform_sync (prompt, NULL, NULL, NULL, &error);
g_assert_no_error (error);
g_assert (retval == NULL);
@@ -274,7 +274,7 @@ test_prompt_window_id (Test *test,
prompt = _secret_prompt_instance (test->service, "/org/freedesktop/secrets/prompts/window");
g_object_add_weak_pointer (G_OBJECT (prompt), (gpointer *)&prompt);
- retval = secret_prompt_perform_sync (prompt, 555, NULL, G_VARIANT_TYPE_STRING, &error);
+ retval = secret_prompt_perform_sync (prompt, "555", NULL, G_VARIANT_TYPE_STRING, &error);
g_assert_no_error (error);
g_assert (retval != NULL);
g_assert_cmpstr (g_variant_get_string (retval, NULL), ==, "555");