From b7566793b771f4680ac2148933cebd80f57b10a6 Mon Sep 17 00:00:00 2001 From: George Kiagiadakis <george.kiagiadakis@collabora.com> Date: Sun, 29 Mar 2020 11:17:16 +0300 Subject: [PATCH] session-item: make WpSiTransition more generic to reuse it in _default_export() --- lib/wp/session-item.c | 95 ++++++++++++++++++++++++------------------- 1 file changed, 53 insertions(+), 42 deletions(-) diff --git a/lib/wp/session-item.c b/lib/wp/session-item.c index 5c88a0cf..d23c806e 100644 --- a/lib/wp/session-item.c +++ b/lib/wp/session-item.c @@ -16,6 +16,55 @@ #include "error.h" #include "wpenums.h" +struct _WpSiTransition +{ + WpTransition parent; + guint (*get_next_step) (WpSessionItem * self, WpTransition * transition, + guint step); + void (*execute_step) (WpSessionItem * self, WpTransition * transition, + guint step); +}; + +G_DECLARE_FINAL_TYPE (WpSiTransition, wp_si_transition, + WP, SI_TRANSITION, WpTransition); +G_DEFINE_TYPE (WpSiTransition, wp_si_transition, WP_TYPE_TRANSITION) + +static void +wp_si_transition_init (WpSiTransition * transition) {} + +static guint +wp_si_transition_get_next_step (WpTransition * transition, guint step) +{ + WpSiTransition *self = WP_SI_TRANSITION (transition); + WpSessionItem *item = wp_transition_get_source_object (transition); + + g_return_val_if_fail (self->get_next_step, WP_TRANSITION_STEP_ERROR); + + step = self->get_next_step (item, transition, step); + + g_return_val_if_fail (step == WP_TRANSITION_STEP_NONE || self->execute_step, + WP_TRANSITION_STEP_ERROR); + return step; +} + +static void +wp_si_transition_execute_step (WpTransition * transition, guint step) +{ + WpSiTransition *self = WP_SI_TRANSITION (transition); + WpSessionItem *item = wp_transition_get_source_object (transition); + self->execute_step (item, transition, step); +} + +static void +wp_si_transition_class_init (WpSiTransitionClass * klass) +{ + WpTransitionClass *transition_class = (WpTransitionClass *) klass; + + transition_class->get_next_step = wp_si_transition_get_next_step; + transition_class->execute_step = wp_si_transition_execute_step; +} + + typedef struct _WpSessionItemPrivate WpSessionItemPrivate; struct _WpSessionItemPrivate { @@ -312,48 +361,6 @@ wp_session_item_get_configuration (WpSessionItem * self) return WP_SESSION_ITEM_GET_CLASS (self)->get_configuration (self); } -typedef WpTransition WpSiTransition; -typedef WpTransitionClass WpSiTransitionClass; - -G_DEFINE_TYPE (WpSiTransition, wp_si_transition, WP_TYPE_TRANSITION) - -static void -wp_si_transition_init (WpSiTransition * transition) {} - -static guint -wp_si_transition_get_next_step (WpTransition * transition, guint step) -{ - WpSessionItem *item = wp_transition_get_source_object (transition); - g_return_val_if_fail ( - WP_SESSION_ITEM_GET_CLASS (item)->get_next_step, - WP_TRANSITION_STEP_ERROR); - - step = WP_SESSION_ITEM_GET_CLASS (item)->get_next_step (item, - transition, step); - - g_return_val_if_fail ( - step == WP_TRANSITION_STEP_NONE || - WP_SESSION_ITEM_GET_CLASS (item)->execute_step, - WP_TRANSITION_STEP_ERROR); - return step; -} - -static void -wp_si_transition_execute_step (WpTransition * transition, guint step) -{ - WpSessionItem *item = wp_transition_get_source_object (transition); - WP_SESSION_ITEM_GET_CLASS (item)->execute_step (item, transition, step); -} - -static void -wp_si_transition_class_init (WpSiTransitionClass * klass) -{ - WpTransitionClass *transition_class = (WpTransitionClass *) klass; - - transition_class->get_next_step = wp_si_transition_get_next_step; - transition_class->execute_step = wp_si_transition_execute_step; -} - static void on_transition_completed (WpTransition * transition, GParamSpec * pspec, WpSessionItem * self) @@ -408,6 +415,10 @@ wp_session_item_activate (WpSessionItem * self, priv->flags |= WP_SI_FLAG_ACTIVATING; g_signal_emit (self, signals[SIGNAL_FLAGS_CHANGED], 0, priv->flags); + WP_SI_TRANSITION (transition)->get_next_step = + WP_SESSION_ITEM_GET_CLASS (self)->get_next_step; + WP_SI_TRANSITION (transition)->execute_step = + WP_SESSION_ITEM_GET_CLASS (self)->execute_step; wp_transition_advance (transition); } -- GitLab