eventloop: Remove PurpleEventLoopUiOps struct and functions

Thu, 15 Jun 2017 12:19:37 -0500

author
Mike Ruprecht <cmaiku@gmail.com>
date
Thu, 15 Jun 2017 12:19:37 -0500
changeset 38423
a7c94f7c1277
parent 38422
21407727dac8
child 38424
93a797ddc9c0

eventloop: Remove PurpleEventLoopUiOps struct and functions

Now that libpurple uses Gio, configuring the event loop to use
something other than the GLib event loop causes things to break.
This is because Gio adds sources to the GLib event loop in a way
which can't practically be overridden.

Fortunately, other event loops can still be used by driving the
GLib event loop manually. See the GLib Main Event Loop docs for
information on doing this.

This patch removes the PurpleEventLoopUiOps and its supporting
functions for setting and getting them. The remaining event loop
functions should be replaced with their GLib equivalents once
it's practical.

ChangeLog.API file | annotate | diff | comparison | revisions
doc/reference/libpurple/ui_ops.xml file | annotate | diff | comparison | revisions
libpurple/eventloop.c file | annotate | diff | comparison | revisions
libpurple/eventloop.h file | annotate | diff | comparison | revisions
--- a/ChangeLog.API	Thu Jun 15 12:13:53 2017 -0500
+++ b/ChangeLog.API	Thu Jun 15 12:19:37 2017 -0500
@@ -453,6 +453,10 @@
 		* PurpleConversationType
 		* purple_core_migrate
 		* purple_dnsquery_a_account
+		* purple_event_loop_{get|set}_ui_ops. Manually drive the GLib
+		  event loop yourself. See GLib Main Event Loop docs.
+		* PurpleEventLoopUiOps. Manually drive the GLib event loop
+		  yourself. See GLib Main Event Loop docs.
 		* purple_network_listen_family. Use purple_network_listen, instead.
 		* purple_network_listen_map_external
 		* purple_network_listen_range_family. Use purple_network_listen,
--- a/doc/reference/libpurple/ui_ops.xml	Thu Jun 15 12:13:53 2017 -0500
+++ b/doc/reference/libpurple/ui_ops.xml	Thu Jun 15 12:19:37 2017 -0500
@@ -17,7 +17,6 @@
 <listitem><link linkend="PurpleCoreUiOps"><literal>PurpleCoreUiOps</literal></link></listitem>
 <listitem><link linkend="PurpleDebugUiOps"><literal>PurpleDebugUiOps</literal></link></listitem>
 <listitem><link linkend="PurpleDnsQueryUiOps"><literal>PurpleDnsQueryUiOps</literal></link></listitem>
-<listitem><link linkend="PurpleEventLoopUiOps"><literal>PurpleEventLoopUiOps</literal></link> (without this, nothing will work and you will cry)</listitem>
 <listitem><link linkend="PurpleIdleUiOps"><literal>PurpleIdleUiOps</literal></link></listitem>
 <listitem><link linkend="PurpleNotifyUiOps"><literal>PurpleNotifyUiOps</literal></link></listitem>
 <listitem><link linkend="PurpleRequestUiOps"><literal>PurpleRequestUiOps</literal></link></listitem>
--- a/libpurple/eventloop.c	Thu Jun 15 12:13:53 2017 -0500
+++ b/libpurple/eventloop.c	Thu Jun 15 12:19:37 2017 -0500
@@ -24,8 +24,6 @@
 #define PURPLE_GLIB_READ_COND  (G_IO_IN | G_IO_HUP | G_IO_ERR)
 #define PURPLE_GLIB_WRITE_COND (G_IO_OUT | G_IO_HUP | G_IO_ERR | G_IO_NVAL)
 
-static PurpleEventLoopUiOps *eventloop_ui_ops = NULL;
-
 typedef struct _PurpleIOClosure {
 	PurpleInputFunction function;
 	guint result;
@@ -116,47 +114,3 @@
 	return pipe(pipefd);
 #endif
 }
-
-void
-purple_eventloop_set_ui_ops(PurpleEventLoopUiOps *ops)
-{
-	eventloop_ui_ops = ops;
-}
-
-PurpleEventLoopUiOps *
-purple_eventloop_get_ui_ops(void)
-{
-	g_return_val_if_fail(eventloop_ui_ops != NULL, NULL);
-
-	return eventloop_ui_ops;
-}
-
-/**************************************************************************
- * GBoxed code
- **************************************************************************/
-static PurpleEventLoopUiOps *
-purple_eventloop_ui_ops_copy(PurpleEventLoopUiOps *ops)
-{
-	PurpleEventLoopUiOps *ops_new;
-
-	g_return_val_if_fail(ops != NULL, NULL);
-
-	ops_new = g_new(PurpleEventLoopUiOps, 1);
-	*ops_new = *ops;
-
-	return ops_new;
-}
-
-GType
-purple_eventloop_ui_ops_get_type(void)
-{
-	static GType type = 0;
-
-	if (type == 0) {
-		type = g_boxed_type_register_static("PurpleEventLoopUiOps",
-				(GBoxedCopyFunc)purple_eventloop_ui_ops_copy,
-				(GBoxedFreeFunc)g_free);
-	}
-
-	return type;
-}
--- a/libpurple/eventloop.h	Thu Jun 15 12:13:53 2017 -0500
+++ b/libpurple/eventloop.h	Thu Jun 15 12:19:37 2017 -0500
@@ -31,8 +31,6 @@
 #include <glib.h>
 #include <glib-object.h>
 
-#define PURPLE_TYPE_EVENTLOOP_UI_OPS (purple_eventloop_ui_ops_get_type())
-
 /**
  * PurpleInputCondition:
  * @PURPLE_INPUT_READ:  A read condition.
@@ -57,99 +55,6 @@
  */
 typedef void (*PurpleInputFunction)(gpointer, gint, PurpleInputCondition);
 
-typedef struct _PurpleEventLoopUiOps PurpleEventLoopUiOps;
-
-/**
- * PurpleEventLoopUiOps:
- * @timeout_add: Should create a callback timer with an interval measured in
- *               milliseconds. The supplied @function should be called every
- *               @interval seconds until it returns %FALSE, after which it
- *               should not be called again.
- *               <sbr/>Analogous to g_timeout_add in glib.
- *               <sbr/>Note: On Win32, this function may be called from a thread
- *               other than the libpurple thread. You should make sure to detect
- *               this situation and to only call "function" from the libpurple
- *               thread.
- *               <sbr/>See purple_timeout_add().
- *               <sbr/>@interval: the interval in
- *                                <emphasis>milliseconds</emphasis> between
- *                                calls to @function.
- *               <sbr/>@data: arbitrary data to be passed to @function at each
- *                            call.
- *               <sbr/>Returns: a handle for the timeout, which can be passed to
- *                              @timeout_remove.
- * @timeout_remove: Should remove a callback timer. Analogous to
- *                  g_source_remove() in glib.
- *                  <sbr/>See purple_timeout_remove().
- *                  <sbr/>@handle: an identifier for a timeout, as returned by
- *                                 @timeout_add.
- *                  <sbr/>Returns: %TRUE if the timeout identified by @handle
- *                                 was found and removed.
- * @input_add: Should add an input handler. Analogous to g_io_add_watch_full()
- *             in glib.
- *                <sbr/>See purple_input_add().
- *             <sbr/>@fd:        a file descriptor to watch for events
- *             <sbr/>@cond:      a bitwise OR of events on @fd for which @func
- *                               should be called.
- *             <sbr/>@func:      a callback to fire whenever a relevant event on
- *                               @fd occurs.
- *             <sbr/>@user_data: arbitrary data to pass to @fd.
- *             <sbr/>Returns:    an identifier for this input handler, which can
- *                               be passed to @input_remove.
- * @input_remove: Should remove an input handler. Analogous to g_source_remove()
- *                in glib.
- *                <sbr/>See purple_input_remove().
- *                <sbr/>@handle: an identifier, as returned by #input_add.
- *                <sbr/>Returns: %TRUE if the input handler was found and
- *                               removed.
- * @input_get_error: If implemented, should get the current error status for an
- *                   input.
- *                   <sbr/>Implementation of this UI op is optional. Implement
- *                   it if the UI's sockets or event loop needs to customize
- *                   determination of socket error status. If unimplemented,
- *                   <literal>getsockopt(2)</literal> will be used instead.
- *                   <sbr/>See purple_input_get_error().
- * @timeout_add_seconds: If implemented, should create a callback timer with an
- *                       interval measured in seconds. Analogous to
- *                       g_timeout_add_seconds() in glib.
- *                       <sbr/>This allows UIs to group timers for better power
- *                       efficiency. For this reason, @interval may be rounded
- *                       by up to a second.
- *                       <sbr/>Implementation of this UI op is optional. If it's
- *                       not implemented, calls to purple_timeout_add_seconds()
- *                       will be serviced by @timeout_add.
- *                       <sbr/>See purple_timeout_add_seconds().
- *
- * An abstraction of an application's mainloop; libpurple will use this to
- * watch file descriptors and schedule timed callbacks.  If your application
- * uses the glib mainloop, there is an implementation of this struct in
- * <filename>libpurple/example/nullclient.c</filename> which you can use
- * verbatim.
- */
-struct _PurpleEventLoopUiOps
-{
-	/* TODO Who is responsible for freeing @data? */
-	guint (*timeout_add)(guint interval, GSourceFunc function, gpointer data);
-
-	gboolean (*timeout_remove)(guint handle);
-
-	guint (*input_add)(int fd, PurpleInputCondition cond,
-	                   PurpleInputFunction func, gpointer user_data);
-
-	gboolean (*input_remove)(guint handle);
-
-	int (*input_get_error)(int fd, int *error);
-
-	guint (*timeout_add_seconds)(guint interval, GSourceFunc function,
-	                             gpointer data);
-
-	/*< private >*/
-	void (*_purple_reserved1)(void);
-	void (*_purple_reserved2)(void);
-	void (*_purple_reserved3)(void);
-	void (*_purple_reserved4)(void);
-};
-
 G_BEGIN_DECLS
 
 /**************************************************************************/
@@ -249,36 +154,6 @@
 int
 purple_input_pipe(int pipefd[2]);
 
-
-
-/**************************************************************************/
-/* UI Registration Functions                                              */
-/**************************************************************************/
-
-/**
- * purple_eventloop_ui_ops_get_type:
- *
- * Returns: The #GType for the #PurpleEventLoopUiOps boxed structure.
- */
-GType purple_eventloop_ui_ops_get_type(void);
-
-/**
- * purple_eventloop_set_ui_ops:
- * @ops: The UI operations structure.
- *
- * Sets the UI operations structure to be used for accounts.
- */
-void purple_eventloop_set_ui_ops(PurpleEventLoopUiOps *ops);
-
-/**
- * purple_eventloop_get_ui_ops:
- *
- * Returns the UI operations structure used for accounts.
- *
- * Returns: The UI operations structure in use.
- */
-PurpleEventLoopUiOps *purple_eventloop_get_ui_ops(void);
-
 G_END_DECLS
 
 #endif /* _PURPLE_EVENTLOOP_H_ */

mercurial