Implement Purple.Ui.open_uri_async in Pidgin.Ui

Tue, 27 Aug 2024 15:56:04 -0500

author
Gary Kramlich <grim@reaperworld.com>
date
Tue, 27 Aug 2024 15:56:04 -0500
changeset 42913
3da85f0c0ee6
parent 42912
4e61e9b15844
child 42914
27c407608b6b

Implement Purple.Ui.open_uri_async in Pidgin.Ui

Testing Done:
Called in the turtles and made sure the `online help` menu item still worked.

Bugs closed: PIDGIN-17867

Reviewed at https://reviews.imfreedom.org/r/3447/

pidgin/pidginapplication.c file | annotate | diff | comparison | revisions
pidgin/pidginui.c file | annotate | diff | comparison | revisions
pidgin/pidginui.h file | annotate | diff | comparison | revisions
--- a/pidgin/pidginapplication.c	Tue Aug 27 02:04:44 2024 -0500
+++ b/pidgin/pidginapplication.c	Tue Aug 27 15:56:04 2024 -0500
@@ -444,11 +444,10 @@
                                G_GNUC_UNUSED GVariant *parameter,
                                G_GNUC_UNUSED gpointer data)
 {
-	GtkUriLauncher *launcher = NULL;
+	PurpleUi *ui = NULL;
 
-	launcher = gtk_uri_launcher_new(PURPLE_WEBSITE "help");
-	gtk_uri_launcher_launch(launcher, NULL, NULL, NULL, NULL);
-	g_clear_object(&launcher);
+	ui = purple_core_get_ui();
+	purple_ui_open_uri(ui, PURPLE_WEBSITE "help", NULL, NULL, NULL);
 }
 
 static void
--- a/pidgin/pidginui.c	Tue Aug 27 02:04:44 2024 -0500
+++ b/pidgin/pidginui.c	Tue Aug 27 15:56:04 2024 -0500
@@ -197,6 +197,61 @@
 }
 
 /******************************************************************************
+ * OpenURI Implementation
+ *****************************************************************************/
+static void
+pidgin_ui_open_uri_cb(GObject *source, GAsyncResult *result, gpointer data) {
+	GError *error = NULL;
+	GTask *task = data;
+	gboolean success = FALSE;
+
+	success = gtk_uri_launcher_launch_finish(GTK_URI_LAUNCHER(source), result,
+	                                         &error);
+
+	if(!success) {
+		g_task_return_error(task, error);
+	} else {
+		g_task_return_boolean(task, success);
+	}
+
+	g_clear_object(&source);
+	g_clear_object(&task);
+}
+
+static void
+pidgin_ui_open_uri(PurpleUi *ui, const char *uri, GCancellable *cancellable,
+                   GAsyncReadyCallback callback, gpointer data)
+{
+	GTask *task = NULL;
+	GtkUriLauncher *launcher = NULL;
+
+	if(purple_strempty(uri)) {
+		g_task_report_new_error(ui, callback, data, pidgin_ui_open_uri,
+		                        PIDGIN_UI_ERROR, 0, _("No URI provided"));
+
+		return;
+	}
+
+	task = g_task_new(ui, cancellable, callback, data);
+	g_task_set_source_tag(task, pidgin_ui_open_uri);
+
+	launcher = gtk_uri_launcher_new(uri);
+
+	gtk_uri_launcher_launch(launcher, NULL, cancellable, pidgin_ui_open_uri_cb,
+	                        task);
+}
+
+static gboolean
+pidgin_ui_open_uri_finish(PurpleUi *ui, GAsyncResult *result, GError **error) {
+	g_return_val_if_fail(PIDGIN_IS_UI(ui), FALSE);
+
+	g_return_val_if_fail(g_async_result_is_tagged(result, pidgin_ui_open_uri),
+	                     FALSE);
+
+	return g_task_propagate_boolean(G_TASK(result), error);
+}
+
+/******************************************************************************
  * GObject Implementation
  *****************************************************************************/
 static void
@@ -214,6 +269,9 @@
 	ui_class->get_settings_backend = pidgin_ui_get_settings_backend;
 	ui_class->get_history_adapter = pidgin_ui_get_history_adapter;
 	ui_class->get_presence_manager = pidgin_ui_get_presence_manager;
+
+	ui_class->open_uri = pidgin_ui_open_uri;
+	ui_class->open_uri_finish = pidgin_ui_open_uri_finish;
 }
 
 /******************************************************************************
--- a/pidgin/pidginui.h	Tue Aug 27 02:04:44 2024 -0500
+++ b/pidgin/pidginui.h	Tue Aug 27 15:56:04 2024 -0500
@@ -35,6 +35,8 @@
 
 G_BEGIN_DECLS
 
+#define PIDGIN_UI_ERROR (g_quark_from_static_string("pidgin-ui"))
+
 /**
  * PidginUi:
  *

mercurial