[Xfce4-commits] <parole:master> Implement exiting D-Bus signal to notify the plugin that the backend is exiting.
Ali Abdallah
noreply at xfce.org
Thu Nov 26 10:16:08 CET 2009
Updating branch refs/heads/master
to 6b76bf031b436d1da4ada61217fb54b1a40fc00c (commit)
from f002921a75d690d4f7cead227d5e9d9c67008bc6 (commit)
commit 6b76bf031b436d1da4ada61217fb54b1a40fc00c
Author: Ali Abdallah <ali at ali-xfce.org>
Date: Thu Nov 26 10:12:32 2009 +0100
Implement exiting D-Bus signal to notify the plugin that
the backend is exiting.
browser-plugin/media-plugin/main.c | 1 -
.../media-plugin/org.parole.media.plugin.xml | 3 ++
browser-plugin/media-plugin/parole-plugin-player.c | 39 ++++++++++++++++++--
browser-plugin/media-plugin/parole-plugin-player.h | 8 +++--
browser-plugin/plugin.cpp | 28 ++++++++++++--
browser-plugin/plugin.h | 3 +-
6 files changed, 69 insertions(+), 13 deletions(-)
diff --git a/browser-plugin/media-plugin/main.c b/browser-plugin/media-plugin/main.c
index 9004474..8a8215c 100644
--- a/browser-plugin/media-plugin/main.c
+++ b/browser-plugin/media-plugin/main.c
@@ -128,7 +128,6 @@ int main (int argc, char **argv)
g_error_free (error);
}
-
parole_plugin_player_play (player);
gtk_main ();
diff --git a/browser-plugin/media-plugin/org.parole.media.plugin.xml b/browser-plugin/media-plugin/org.parole.media.plugin.xml
index de8762a..42ed852 100644
--- a/browser-plugin/media-plugin/org.parole.media.plugin.xml
+++ b/browser-plugin/media-plugin/org.parole.media.plugin.xml
@@ -14,5 +14,8 @@
<method name="Ping">
</method>
+ <signal name="Exiting">
+ </signal>
+
</interface>
</node>
diff --git a/browser-plugin/media-plugin/parole-plugin-player.c b/browser-plugin/media-plugin/parole-plugin-player.c
index a3ced75..852d767 100644
--- a/browser-plugin/media-plugin/parole-plugin-player.c
+++ b/browser-plugin/media-plugin/parole-plugin-player.c
@@ -56,7 +56,7 @@ static void parole_plugin_player_get_property (GObject *object,
GParamSpec *pspec);
#define PAROLE_PLUGIN_PLAYER_GET_PRIVATE(o) \
-(G_TYPE_INSTANCE_GET_PRIVATE ((o), PAROLE_TYPE_PLUGINPLAYER, ParolePluginPlayerPrivate))
+(G_TYPE_INSTANCE_GET_PRIVATE ((o), PAROLE_TYPE_PLUGIN_PLAYER, ParolePluginPlayerPrivate))
static GTimer *idle_timer = NULL;
static GThread *idle_thread = NULL;
@@ -95,6 +95,14 @@ enum
PROP_URL
};
+enum
+{
+ SIG_EXITING,
+ LAST_SIGNAL
+};
+
+static guint signals [LAST_SIGNAL] = { 0 };
+
G_DEFINE_TYPE (ParolePluginPlayer, parole_plugin_player, G_TYPE_OBJECT)
static void
@@ -640,6 +648,7 @@ static gpointer *check_idle_thread (gpointer data)
if ( g_timer_elapsed (idle_timer, NULL ) > 60.f )
{
g_debug ("Idle timeout expired, exiting...");
+ g_signal_emit (player, signals [SIG_EXITING], 0);
g_debug ("Here");
gtk_main_quit ();
g_debug ("Yalla");
@@ -651,17 +660,39 @@ static gpointer *check_idle_thread (gpointer data)
}
static void
+parole_plugin_player_dispose (GObject *object)
+{
+ ParolePluginPlayer *player;
+
+ player = PAROLE_PLUGIN_PLAYER (object);
+
+ g_signal_emit (player, signals [SIG_EXITING], 0);
+
+ G_OBJECT_CLASS (parole_plugin_player_parent_class)->dispose (object);
+}
+
+static void
parole_plugin_player_class_init (ParolePluginPlayerClass *klass)
{
GObjectClass *object_class = G_OBJECT_CLASS (klass);
object_class->finalize = parole_plugin_player_finalize;
+ object_class->dispose = parole_plugin_player_dispose;
object_class->get_property = parole_plugin_player_get_property;
object_class->set_property = parole_plugin_player_set_property;
object_class->constructed = parole_plugin_player_construct;
+ signals[SIG_EXITING] =
+ g_signal_new ("exiting",
+ PAROLE_TYPE_PLUGIN_PLAYER,
+ G_SIGNAL_RUN_LAST,
+ G_STRUCT_OFFSET (ParolePluginPlayerClass, exiting),
+ NULL, NULL,
+ g_cclosure_marshal_VOID__VOID,
+ G_TYPE_NONE, 0, G_TYPE_NONE);
+
g_object_class_install_property (object_class,
PROP_PLUG,
@@ -802,8 +833,8 @@ parole_plugin_player_stop_idle (gpointer data)
player = PAROLE_PLUGIN_PLAYER (data);
- if (player->priv->gst )
- parole_gst_stop (player->priv->gst);
+ if (player->priv->gst)
+ parole_gst_terminate (player->priv->gst);
return FALSE;
}
@@ -813,7 +844,7 @@ parole_plugin_player_new (GtkWidget *plug, gchar *url)
{
ParolePluginPlayer *player = NULL;
- player = g_object_new (PAROLE_TYPE_PLUGINPLAYER,
+ player = g_object_new (PAROLE_TYPE_PLUGIN_PLAYER,
"plug", plug,
"url", url,
NULL);
diff --git a/browser-plugin/media-plugin/parole-plugin-player.h b/browser-plugin/media-plugin/parole-plugin-player.h
index d92dbf0..bc3d506 100644
--- a/browser-plugin/media-plugin/parole-plugin-player.h
+++ b/browser-plugin/media-plugin/parole-plugin-player.h
@@ -25,9 +25,9 @@
G_BEGIN_DECLS
-#define PAROLE_TYPE_PLUGINPLAYER (parole_plugin_player_get_type () )
-#define PAROLE_PLUGIN_PLAYER(o) (G_TYPE_CHECK_INSTANCE_CAST ((o), PAROLE_TYPE_PLUGINPLAYER, ParolePluginPlayer))
-#define PAROLE_IS_PLUGINPLAYER(o) (G_TYPE_CHECK_INSTANCE_TYPE ((o), PAROLE_TYPE_PLUGINPLAYER))
+#define PAROLE_TYPE_PLUGIN_PLAYER (parole_plugin_player_get_type () )
+#define PAROLE_PLUGIN_PLAYER(o) (G_TYPE_CHECK_INSTANCE_CAST ((o), PAROLE_TYPE_PLUGIN_PLAYER, ParolePluginPlayer))
+#define PAROLE_IS_PLUGIN_PLAYER(o) (G_TYPE_CHECK_INSTANCE_TYPE ((o), PAROLE_TYPE_PLUGIN_PLAYER))
typedef struct ParolePluginPlayerPrivate ParolePluginPlayerPrivate;
@@ -43,6 +43,8 @@ typedef struct
{
GObjectClass parent_class;
+ void (*exiting) (ParolePluginPlayer *player);
+
} ParolePluginPlayerClass;
GType parole_plugin_player_get_type (void) G_GNUC_CONST;
diff --git a/browser-plugin/plugin.cpp b/browser-plugin/plugin.cpp
index 3fe6603..b68859c 100644
--- a/browser-plugin/plugin.cpp
+++ b/browser-plugin/plugin.cpp
@@ -77,6 +77,7 @@ CPlugin::CPlugin (NPP pNPInstance)
url = NULL;
bus = NULL;
proxy = NULL;
+ process_exiting = FALSE;
}
void CPlugin::StopPlayer()
@@ -86,7 +87,7 @@ void CPlugin::StopPlayer()
if ( !proxy )
GetProxy ();
- if ( proxy )
+ if ( proxy && !process_exiting)
{
do
{
@@ -120,7 +121,7 @@ void CPlugin::StopPlayer()
else
break;
- } while (num_tries < 4 );
+ } while (num_tries < 4 && process_exiting != TRUE);
}
}
@@ -129,7 +130,7 @@ CPlugin::~CPlugin()
{
g_debug ("Destructor");
- if ( ping_id )
+ if ( ping_id != 0 )
g_source_remove (ping_id);
StopPlayer ();
@@ -204,6 +205,19 @@ ping_process (gpointer data)
return TRUE;
}
+
+static void
+process_exiting_cb (DBusGProxy *proxy, gpointer data)
+{
+ CPlugin *plugin;
+
+ plugin = (CPlugin *) data;
+ g_debug ("Process exiting");
+ plugin->process_exiting = TRUE;
+ g_source_remove (plugin->ping_id);
+ plugin->ping_id = 0;
+}
+
void CPlugin::GetProxy ()
{
g_return_if_fail (proxy == NULL);
@@ -221,7 +235,13 @@ void CPlugin::GetProxy ()
"org.Parole.Media.Plugin");
if ( !proxy )
g_critical ("Unable to create proxy for %s", dbus_name);
-
+ else
+ {
+ dbus_g_proxy_add_signal (proxy, "exiting", G_TYPE_INVALID);
+ dbus_g_proxy_connect_signal (proxy, "exiting",
+ G_CALLBACK (process_exiting_cb), this, NULL);
+ }
+
g_free (dbus_name);
}
}
diff --git a/browser-plugin/plugin.h b/browser-plugin/plugin.h
index f31f1e5..a89feb9 100644
--- a/browser-plugin/plugin.h
+++ b/browser-plugin/plugin.h
@@ -87,12 +87,13 @@ class CPlugin {
gchar *url;
Window window;
GPid child_pid;
- gulong ping_id;
public:
NPP mInstance;
uint16 mode;
gchar *mimetype;
+ gboolean process_exiting;
+ gulong ping_id;
};
More information about the Xfce4-commits
mailing list