Updating branch refs/heads/master to e2d7e6f62fdf6c528e08de2ecf331d45680fd441 (commit) from b5593091bc3bfcdcf6f913a7eb76158150a0bf06 (commit)
commit e2d7e6f62fdf6c528e08de2ecf331d45680fd441 Author: Ali Abdallah <al...@xfce.org> Date: Thu Aug 13 23:01:47 2009 +0200 Handle correctly source messages, for now only for removable media parole/gmarshal.list | 1 + parole/parole-disc.c | 78 +++++++++++++++++++++++++++++++++--------------- parole/parole-disc.h | 3 +- parole/parole-gst.c | 44 +++++++++++++++++++++++++++ parole/parole-gst.h | 4 ++ parole/parole-player.c | 7 ++-- 6 files changed, 109 insertions(+), 28 deletions(-) diff --git a/parole/gmarshal.list b/parole/gmarshal.list index 3747a11..05faeae 100644 --- a/parole/gmarshal.list +++ b/parole/gmarshal.list @@ -1,3 +1,4 @@ VOID:OBJECT,ENUM VOID:OBJECT,DOUBLE VOID:OBJECT,INT +VOID:STRING,STRING diff --git a/parole/parole-disc.c b/parole/parole-disc.c index 9627716..2e997e3 100644 --- a/parole/parole-disc.c +++ b/parole/parole-disc.c @@ -42,6 +42,7 @@ #include "parole-disc.h" #include "parole-builder.h" +#include "gmarshal.h" static void parole_disc_finalize (GObject *object); @@ -71,29 +72,53 @@ typedef struct { GtkWidget *mi; gchar *uri; /*Freed in (GDestroyNotify) in the data set below*/ + gchar *device; ParoleDiscKind kind; } MountData; static void +free_mount_data (gpointer data) +{ + MountData *mount; + + mount = (MountData *) data; + + if ( mount->uri ) + g_free (mount->uri); + + if ( mount->device ) + g_free (mount->device); + + g_free (mount); +} + +static void parole_disc_media_activate_cb (GtkWidget *widget, ParoleDisc *disc) { - gchar *uri ; + MountData *data; - uri = g_object_get_data (G_OBJECT (widget), "uri"); + data = g_object_get_data (G_OBJECT (widget), "mount-data"); - g_signal_emit (G_OBJECT (disc), signals [DISC_SELECTED], 0, uri); + g_signal_emit (G_OBJECT (disc), signals [DISC_SELECTED], 0, data->uri, data->device); } static MountData * -parole_disc_get_mount_data (ParoleDisc *disc, const gchar *label, const gchar *uri, ParoleDiscKind kind) +parole_disc_get_mount_data (ParoleDisc *disc, + const gchar *label, + const gchar *uri, + const gchar *device, + ParoleDiscKind kind) { MountData *data; GtkWidget *img; data = g_new0 (MountData, 1); + data->kind = kind; + data->uri = data->device = NULL; data->uri = g_strdup (uri); + data->device = g_strdup (device); data->mi = gtk_image_menu_item_new_with_label (label); @@ -104,17 +129,18 @@ parole_disc_get_mount_data (ParoleDisc *disc, const gchar *label, const gchar *u gtk_widget_show (img); g_object_set_data_full (G_OBJECT (data->mi), - "uri", data->uri, - (GDestroyNotify) g_free); + "mount-data", data, + (GDestroyNotify) free_mount_data); gtk_menu_shell_insert (GTK_MENU_SHELL (disc->priv->media_menu), data->mi, 2); + g_signal_connect (data->mi, "activate", G_CALLBACK (parole_disc_media_activate_cb), disc); return data; } static void -parole_disc_add_mount_to_menu (ParoleDisc *disc, GMount *mount) +parole_disc_add_mount_to_menu (ParoleDisc *disc, GMount *mount, const gchar *device) { GFile *file; gchar **content_type; @@ -176,7 +202,7 @@ got_cdda: name = g_mount_get_name (mount); label = g_strdup_printf ("%s %s", _("Play Disc"), name); - data = parole_disc_get_mount_data (disc, label, uri, kind); + data = parole_disc_get_mount_data (disc, label, uri, device, kind); g_free (uri); g_ptr_array_add (disc->priv->array, data); @@ -188,14 +214,12 @@ got_cdda: } static void -parole_disc_check_cdrom (ParoleDisc *disc, GVolume *volume) +parole_disc_check_cdrom (ParoleDisc *disc, GVolume *volume, const gchar *device) { #if defined(__linux__) gint fd; - gchar *device; gint drive; - - device = g_volume_get_identifier (volume, G_VOLUME_IDENTIFIER_KIND_UNIX_DEVICE); + TRACE ("device : %s", device); if ( (fd = open (device, O_RDONLY)) < 0 ) @@ -211,16 +235,15 @@ parole_disc_check_cdrom (ParoleDisc *disc, GVolume *volume) { g_print ("Drive :%s is not yet ready\n", device); disc->priv->needs_update = TRUE; - goto out; } - if ( drive == CDS_DISC_OK ) + else if ( drive == CDS_DISC_OK ) { if ( (drive = ioctl (fd, CDROM_DISC_STATUS, NULL)) > 0 ) { if ( drive == CDS_AUDIO || drive == CDS_MIXED ) { MountData *data; - data = parole_disc_get_mount_data (disc, g_volume_get_name (volume), "cdda:/", PAROLE_DISC_CDDA); + data = parole_disc_get_mount_data (disc, g_volume_get_name (volume), "cdda:/", device, PAROLE_DISC_CDDA); g_ptr_array_add (disc->priv->array, data); } } @@ -229,13 +252,12 @@ parole_disc_check_cdrom (ParoleDisc *disc, GVolume *volume) close (fd); out: - g_free (device); - + ; #endif /* if defined(__linux__) */ } static void -parole_disc_add_drive (ParoleDisc *disc, GDrive *drive) +parole_disc_add_drive (ParoleDisc *disc, GDrive *drive, const gchar *device) { GList *list; guint len; @@ -256,13 +278,13 @@ parole_disc_add_drive (ParoleDisc *disc, GDrive *drive) if ( mount ) { TRACE ("Mount name : %s", g_mount_get_name (mount)); - parole_disc_add_mount_to_menu (disc, mount); + parole_disc_add_mount_to_menu (disc, mount, device); g_object_unref (mount); } else { /* Could be a cdda?*/ - parole_disc_check_cdrom (disc, volume); + parole_disc_check_cdrom (disc, volume, device); } } @@ -290,10 +312,17 @@ parole_disc_get_drives (ParoleDisc *disc) for ( i = 0; i < len; i++) { GDrive *drive; + gchar *device = NULL; + drive = g_list_nth_data (list, i); if ( g_drive_can_eject (drive) && g_drive_has_media (drive) ) - parole_disc_add_drive (disc, drive); + { + device = g_drive_get_identifier (drive, G_VOLUME_IDENTIFIER_KIND_UNIX_DEVICE); + parole_disc_add_drive (disc, drive, device); + if ( device ) + g_free (device); + } } g_list_foreach (list, (GFunc) g_object_unref, NULL); @@ -337,8 +366,9 @@ parole_disc_class_init (ParoleDiscClass *klass) G_SIGNAL_RUN_LAST, G_STRUCT_OFFSET (ParoleDiscClass, disc_selected), NULL, NULL, - g_cclosure_marshal_VOID__STRING, - G_TYPE_NONE, 1, G_TYPE_STRING); + _gmarshal_VOID__STRING_STRING, + G_TYPE_NONE, 2, + G_TYPE_STRING, G_TYPE_STRING); object_class->finalize = parole_disc_finalize; @@ -394,7 +424,7 @@ parole_disc_finalize (GObject *object) g_object_unref (disc->priv->monitor); - g_ptr_array_foreach (disc->priv->array, (GFunc) g_free, NULL); + g_ptr_array_foreach (disc->priv->array, (GFunc) free_mount_data, NULL); g_ptr_array_free (disc->priv->array, TRUE); G_OBJECT_CLASS (parole_disc_parent_class)->finalize (object); diff --git a/parole/parole-disc.h b/parole/parole-disc.h index 115fa00..23adbc2 100644 --- a/parole/parole-disc.h +++ b/parole/parole-disc.h @@ -53,7 +53,8 @@ typedef struct GObjectClass parent_class; void (*disc_selected) (ParoleDisc *disc, - const gchar *uri); + const gchar *uri, + const gchar *device); } ParoleDiscClass; diff --git a/parole/parole-gst.c b/parole/parole-gst.c index fc954d8..b186cf2 100644 --- a/parole/parole-gst.c +++ b/parole/parole-gst.c @@ -77,6 +77,7 @@ struct ParoleGstPrivate ParoleStream *stream; gulong tick_id; GdkPixbuf *logo; + gchar *device; GTimer *hidecursor_timer; ParoleConf *conf; @@ -128,6 +129,9 @@ parole_gst_finalize (GObject *object) g_object_unref (gst->priv->conf); g_object_unref (gst->priv->logo); + if ( gst->priv->device ) + g_free (gst->priv->device); + g_mutex_free (gst->priv->lock); G_OBJECT_CLASS (parole_gst_parent_class)->finalize (object); @@ -1216,6 +1220,27 @@ parole_gst_stream_info_notify_cb (GObject * obj, GParamSpec * pspec, ParoleGst * } static void +parole_gst_source_notify_cb (GObject *obj, GParamSpec *pspec, ParoleGst *gst) +{ + GObject *source; + + g_object_get (obj, + "source", &source, + NULL); + + if ( source ) + { + if ( G_LIKELY (gst->priv->device) ) + { + g_object_set (source, + "device", gst->priv->device, + NULL); + } + g_object_unref (source); + } +} + +static void parole_gst_play_file_internal (ParoleGst *gst) { gchar *uri; @@ -1306,6 +1331,10 @@ parole_gst_construct (GObject *object) g_signal_connect (gst->priv->playbin, "notify::stream-info", G_CALLBACK (parole_gst_stream_info_notify_cb), gst); + + g_signal_connect (gst->priv->playbin, "notify::source", + G_CALLBACK (parole_gst_source_notify_cb), gst); + parole_gst_load_logo (gst); parole_gst_set_subtitle_encoding (gst); parole_gst_set_subtitle_font (gst); @@ -1628,6 +1657,7 @@ parole_gst_init (ParoleGst *gst) gst->priv->buffering = FALSE; gst->priv->update_color_balance = TRUE; gst->priv->state_change_id = 0; + gst->priv->device = NULL; gst->priv->conf = parole_conf_new (); @@ -1705,7 +1735,21 @@ void parole_gst_play_uri (ParoleGst *gst, const gchar *uri) parole_window_busy_cursor (GTK_WIDGET (gst)->window); g_idle_add ((GSourceFunc) parole_gst_play_idle, gst); +} + +void parole_gst_play_device_uri (ParoleGst *gst, const gchar *uri, const gchar *device) +{ + TRACE ("device : %s", device); + + if ( gst->priv->device ) + { + g_free (gst->priv->device); + gst->priv->device = NULL; + } + + gst->priv->device = g_strdup (device); + parole_gst_play_uri (gst, uri); } void parole_gst_pause (ParoleGst *gst) diff --git a/parole/parole-gst.h b/parole/parole-gst.h index 851c9a3..7fa10e5 100644 --- a/parole/parole-gst.h +++ b/parole/parole-gst.h @@ -86,6 +86,10 @@ GtkWidget *parole_gst_new (void); void parole_gst_play_uri (ParoleGst *gst, const gchar *uri); +void parole_gst_play_device_uri (ParoleGst *gst, + const gchar *uri, + const gchar *device); + void parole_gst_pause (ParoleGst *gst); void parole_gst_resume (ParoleGst *gst); diff --git a/parole/parole-player.c b/parole/parole-player.c index 2f6fd58..b66a287 100644 --- a/parole/parole-player.c +++ b/parole/parole-player.c @@ -347,11 +347,12 @@ parole_player_media_activated_cb (ParoleMediaList *list, GtkTreeRowReference *ro } static void -parole_player_disc_selected_cb (ParoleDisc *disc, const gchar *uri, ParolePlayer *player) +parole_player_disc_selected_cb (ParoleDisc *disc, const gchar *uri, const gchar *device, ParolePlayer *player) { parole_player_reset (player); gtk_widget_set_sensitive (player->priv->stop, TRUE); - parole_gst_play_uri (PAROLE_GST (player->priv->gst), uri); + + parole_gst_play_device_uri (PAROLE_GST (player->priv->gst), uri, device); } static void @@ -1545,7 +1546,7 @@ ParoleMediaList *parole_player_get_media_list (ParolePlayer *player) void parole_player_play_uri_disc (ParolePlayer *player, const gchar *uri) { - parole_player_disc_selected_cb (NULL, uri, player); + parole_player_disc_selected_cb (NULL, uri, NULL, player); } void parole_player_terminate (ParolePlayer *player) _______________________________________________ Xfce4-commits mailing list Xfce4-commits@xfce.org http://foo-projects.org/mailman/listinfo/xfce4-commits