event-hook: use WP_TYPE_EVENT as the type for hook interest
and also accept other types, which will match the type of the event subject
This commit is contained in:

committed by
Julian Bouzas

parent
60c5982cd0
commit
60e1f320c9
@@ -281,15 +281,34 @@ wp_interest_event_hook_runs_for_event (WpEventHook * hook, WpEvent * event)
|
|||||||
WpInterestEventHook *self = WP_INTEREST_EVENT_HOOK (hook);
|
WpInterestEventHook *self = WP_INTEREST_EVENT_HOOK (hook);
|
||||||
WpInterestEventHookPrivate *priv =
|
WpInterestEventHookPrivate *priv =
|
||||||
wp_interest_event_hook_get_instance_private (self);
|
wp_interest_event_hook_get_instance_private (self);
|
||||||
|
|
||||||
g_autoptr (WpProperties) properties = wp_event_get_properties (event);
|
g_autoptr (WpProperties) properties = wp_event_get_properties (event);
|
||||||
|
g_autoptr (GObject) subject = wp_event_get_subject (event);
|
||||||
|
GType gtype = subject ? G_OBJECT_TYPE (subject) : WP_TYPE_EVENT;
|
||||||
guint i;
|
guint i;
|
||||||
WpObjectInterest *interest = NULL;
|
WpObjectInterest *interest = NULL;
|
||||||
|
WpInterestMatch match;
|
||||||
|
|
||||||
|
const int MATCH_ALL_PROPS = (WP_INTEREST_MATCH_PW_GLOBAL_PROPERTIES |
|
||||||
|
WP_INTEREST_MATCH_PW_PROPERTIES |
|
||||||
|
WP_INTEREST_MATCH_G_PROPERTIES);
|
||||||
|
|
||||||
for (i = 0; i < priv->interests->len; i++) {
|
for (i = 0; i < priv->interests->len; i++) {
|
||||||
interest = g_ptr_array_index (priv->interests, i);
|
interest = g_ptr_array_index (priv->interests, i);
|
||||||
if (wp_object_interest_matches (interest, properties))
|
match = wp_object_interest_matches_full (interest,
|
||||||
|
WP_INTEREST_MATCH_FLAGS_CHECK_ALL,
|
||||||
|
gtype, subject, properties, properties);
|
||||||
|
|
||||||
|
/* the interest may have a GType that matches the GType of the subject
|
||||||
|
or it may have WP_TYPE_EVENT as its GType, in which case it will
|
||||||
|
match any type of subject */
|
||||||
|
if (match == WP_INTEREST_MATCH_ALL)
|
||||||
return TRUE;
|
return TRUE;
|
||||||
|
else if (subject && (match & MATCH_ALL_PROPS) == MATCH_ALL_PROPS) {
|
||||||
|
match = wp_object_interest_matches_full (interest, 0,
|
||||||
|
WP_TYPE_EVENT, NULL, NULL, NULL);
|
||||||
|
if (match & WP_INTEREST_MATCH_GTYPE)
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
return FALSE;
|
return FALSE;
|
||||||
}
|
}
|
||||||
@@ -307,7 +326,7 @@ wp_interest_event_hook_class_init (WpInterestEventHookClass * klass)
|
|||||||
/*!
|
/*!
|
||||||
* \brief Equivalent to:
|
* \brief Equivalent to:
|
||||||
* \code
|
* \code
|
||||||
* WpObjectInterest *i = wp_object_interest_new (WP_TYPE_PROPERTIES, ...);
|
* WpObjectInterest *i = wp_object_interest_new (WP_TYPE_EVENT, ...);
|
||||||
* wp_interest_event_hook_add_interest_full (self, i);
|
* wp_interest_event_hook_add_interest_full (self, i);
|
||||||
* \endcode
|
* \endcode
|
||||||
*
|
*
|
||||||
@@ -327,18 +346,18 @@ wp_interest_event_hook_add_interest (WpInterestEventHook * self, ...)
|
|||||||
g_return_if_fail (WP_IS_INTEREST_EVENT_HOOK (self));
|
g_return_if_fail (WP_IS_INTEREST_EVENT_HOOK (self));
|
||||||
|
|
||||||
va_start (args, self);
|
va_start (args, self);
|
||||||
interest = wp_object_interest_new_valist (WP_TYPE_PROPERTIES, &args);
|
interest = wp_object_interest_new_valist (WP_TYPE_EVENT, &args);
|
||||||
wp_interest_event_hook_add_interest_full (self, interest);
|
wp_interest_event_hook_add_interest_full (self, interest);
|
||||||
va_end (args);
|
va_end (args);
|
||||||
}
|
}
|
||||||
|
|
||||||
/*!
|
/*!
|
||||||
* \brief Declares interest on events. The interest must be constructed to
|
* \brief Declares interest on events. The interest must be constructed to
|
||||||
* match WP_TYPE_PROPERTIES objects and it is going to be matched against
|
* match WP_TYPE_EVENT objects and it is going to be matched against
|
||||||
* the WpEvent's properties.
|
* the WpEvent's properties.
|
||||||
*
|
*
|
||||||
* \param self the event hook
|
* \param self the event hook
|
||||||
* \param interest the event interest
|
* \param interest (transfer full): the event interest
|
||||||
*/
|
*/
|
||||||
void
|
void
|
||||||
wp_interest_event_hook_add_interest_full (WpInterestEventHook * self,
|
wp_interest_event_hook_add_interest_full (WpInterestEventHook * self,
|
||||||
|
@@ -12,6 +12,7 @@
|
|||||||
#include "global-proxy.h"
|
#include "global-proxy.h"
|
||||||
#include "session-item.h"
|
#include "session-item.h"
|
||||||
#include "proxy-interfaces.h"
|
#include "proxy-interfaces.h"
|
||||||
|
#include "event-dispatcher.h"
|
||||||
#include "log.h"
|
#include "log.h"
|
||||||
#include "error.h"
|
#include "error.h"
|
||||||
|
|
||||||
@@ -312,7 +313,8 @@ wp_object_interest_validate (WpObjectInterest * self, GError ** error)
|
|||||||
return TRUE;
|
return TRUE;
|
||||||
|
|
||||||
if (!G_TYPE_IS_OBJECT (self->gtype) && !G_TYPE_IS_INTERFACE (self->gtype) &&
|
if (!G_TYPE_IS_OBJECT (self->gtype) && !G_TYPE_IS_INTERFACE (self->gtype) &&
|
||||||
!g_type_is_a (self->gtype, WP_TYPE_PROPERTIES)) {
|
!g_type_is_a (self->gtype, WP_TYPE_PROPERTIES) &&
|
||||||
|
!g_type_is_a (self->gtype, WP_TYPE_EVENT)) {
|
||||||
g_set_error (error, WP_DOMAIN_LIBRARY, WP_LIBRARY_ERROR_INVARIANT,
|
g_set_error (error, WP_DOMAIN_LIBRARY, WP_LIBRARY_ERROR_INVARIANT,
|
||||||
"type '%s' is not a valid interest type", g_type_name (self->gtype));
|
"type '%s' is not a valid interest type", g_type_name (self->gtype));
|
||||||
return FALSE;
|
return FALSE;
|
||||||
|
Reference in New Issue
Block a user