[Xfce4-commits] <parole:master> Support for playing DVD/VCD ISO images from a file.
Ali Abdallah
noreply at xfce.org
Wed Jan 13 19:26:03 CET 2010
Updating branch refs/heads/master
to 2191db595fa6dd9125297f612ff0edaa8c5d093d (commit)
from c0adeb10c13ccc6fffa745ccc2c4fce224ea73d1 (commit)
commit 2191db595fa6dd9125297f612ff0edaa8c5d093d
Author: Ali Abdallah <aliov at xfce.org>
Date: Wed Jan 13 18:55:58 2010 +0100
Support for playing DVD/VCD ISO images from a file.
data/interfaces/parole.ui | 84 +++++++++++++++++++++++++++++++++++++--
src/parole-disc-menu.c | 2 +-
src/parole-disc.c | 69 +++++++++++++++++++++++---------
src/parole-player.c | 96 ++++++++++++++++++++++++++++++++++++++++++++-
4 files changed, 223 insertions(+), 28 deletions(-)
diff --git a/data/interfaces/parole.ui b/data/interfaces/parole.ui
index 1f2d148..4ffad80 100644
--- a/data/interfaces/parole.ui
+++ b/data/interfaces/parole.ui
@@ -52,6 +52,65 @@
</object>
</child>
<child>
+ <object class="GtkImageMenuItem" id="dvd-menu">
+ <property name="label" translatable="yes">DVD</property>
+ <property name="visible">True</property>
+ <property name="image">image14</property>
+ <property name="use_stock">False</property>
+ <child type="submenu">
+ <object class="GtkMenu" id="menu6">
+ <property name="visible">True</property>
+ <child>
+ <object class="GtkImageMenuItem" id="dvd-iso-mi">
+ <property name="label" translatable="yes">From ISO image</property>
+ <property name="visible">True</property>
+ <property name="image">image15</property>
+ <property name="use_stock">False</property>
+ <signal name="activate" handler="dvd_iso_mi_activated_cb"/>
+ </object>
+ </child>
+ <child>
+ <object class="GtkSeparatorMenuItem" id="separatormenuitem5">
+ <property name="visible">True</property>
+ </object>
+ </child>
+ </object>
+ </child>
+ </object>
+ </child>
+ <child>
+ <object class="GtkImageMenuItem" id="cd-menu">
+ <property name="label">gtk-cdrom</property>
+ <property name="visible">True</property>
+ <property name="use_underline">True</property>
+ <property name="use_stock">True</property>
+ <child type="submenu">
+ <object class="GtkMenu" id="menu7">
+ <property name="visible">True</property>
+ <child>
+ <object class="GtkImageMenuItem" id="cd-iso-mi">
+ <property name="label" translatable="yes">From ISO image</property>
+ <property name="visible">True</property>
+ <property name="image">image16</property>
+ <property name="use_stock">False</property>
+ <signal name="activate" handler="cd_iso_mi_activated_cb"/>
+ </object>
+ </child>
+ <child>
+ <object class="GtkSeparatorMenuItem" id="separatormenuitem6">
+ <property name="visible">True</property>
+ </object>
+ </child>
+ </object>
+ </child>
+ </object>
+ </child>
+ <child>
+ <object class="GtkSeparatorMenuItem" id="separatormenuitem4">
+ <property name="visible">True</property>
+ </object>
+ </child>
+ <child>
<object class="GtkImageMenuItem" id="menu-exit">
<property name="label">gtk-quit</property>
<property name="visible">True</property>
@@ -354,7 +413,7 @@
</packing>
</child>
<child>
- <object class="GtkButton" id="dvd-menu">
+ <object class="GtkButton" id="dvd-chapters-menu">
<property name="label" translatable="yes">DVD Menu</property>
<property name="can_focus">True</property>
<property name="receives_default">True</property>
@@ -716,10 +775,6 @@
</object>
</child>
</object>
- <object class="GtkImage" id="image5">
- <property name="visible">True</property>
- <property name="stock">gtk-network</property>
- </object>
<object class="GtkImage" id="image10">
<property name="visible">True</property>
<property name="icon_name">audio-volume-low</property>
@@ -773,4 +828,23 @@
<property name="visible">True</property>
<property name="stock">gtk-go-forward</property>
</object>
+ <object class="GtkImage" id="image5">
+ <property name="visible">True</property>
+ <property name="stock">gtk-network</property>
+ </object>
+ <object class="GtkImage" id="image14">
+ <property name="visible">True</property>
+ <property name="stock">gtk-cdrom</property>
+ <property name="icon-size">1</property>
+ </object>
+ <object class="GtkImage" id="image15">
+ <property name="visible">True</property>
+ <property name="stock">gtk-file</property>
+ <property name="icon-size">1</property>
+ </object>
+ <object class="GtkImage" id="image16">
+ <property name="visible">True</property>
+ <property name="stock">gtk-file</property>
+ <property name="icon-size">1</property>
+ </object>
</interface>
diff --git a/src/parole-disc-menu.c b/src/parole-disc-menu.c
index 08edb8a..58aac16 100644
--- a/src/parole-disc-menu.c
+++ b/src/parole-disc-menu.c
@@ -247,7 +247,7 @@ parole_disc_menu_init (ParoleDiscMenu *menu)
menu->priv->next_chapter = GTK_WIDGET (gtk_builder_get_object (builder, "next-chapter"));
menu->priv->prev_chapter = GTK_WIDGET (gtk_builder_get_object (builder, "prev-chapter"));
menu->priv->chapter_menu = GTK_WIDGET (gtk_builder_get_object (builder, "chapter-menu"));
- menu->priv->dvd_menu = GTK_WIDGET (gtk_builder_get_object (builder, "dvd-menu"));
+ menu->priv->dvd_menu = GTK_WIDGET (gtk_builder_get_object (builder, "dvd-chapters-menu"));
menu->priv->info = GTK_WIDGET (gtk_builder_get_object (builder, "info"));
menu->priv->eventboxinfo = GTK_WIDGET (gtk_builder_get_object (builder, "eventboxinfo"));
menu->priv->disc_box = GTK_WIDGET (gtk_builder_get_object (builder, "disc-box"));
diff --git a/src/parole-disc.c b/src/parole-disc.c
index 20bf506..111d9c7 100644
--- a/src/parole-disc.c
+++ b/src/parole-disc.c
@@ -53,7 +53,9 @@ struct ParoleDiscPrivate
{
GVolumeMonitor *monitor;
GPtrArray *array;
- GtkWidget *media_menu;
+
+ GtkWidget *dvd_menu;
+ GtkWidget *cd_menu;
gboolean needs_update;
};
@@ -103,38 +105,61 @@ parole_disc_media_activate_cb (GtkWidget *widget, ParoleDisc *disc)
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,
- const gchar *device,
- ParoleDiscKind kind)
+
+static void
+parole_disc_insert_menu_item (ParoleDisc *disc, MountData *data, const gchar *label)
{
- MountData *data;
+ GtkWidget *menu;
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);
img = gtk_image_new_from_stock (GTK_STOCK_CDROM, GTK_ICON_SIZE_MENU);
gtk_image_menu_item_set_image (GTK_IMAGE_MENU_ITEM (data->mi),
- img);
+ img);
gtk_widget_show (data->mi);
gtk_widget_show (img);
g_object_set_data (G_OBJECT (data->mi),
"mount-data", data);
- gtk_menu_shell_insert (GTK_MENU_SHELL (disc->priv->media_menu), data->mi, 2);
+ switch (data->kind )
+ {
+ case PAROLE_DISC_CDDA:
+ case PAROLE_DISC_SVCD:
+ case PAROLE_DISC_VCD:
+ menu = gtk_menu_item_get_submenu (GTK_MENU_ITEM (disc->priv->cd_menu));
+ break;
+ case PAROLE_DISC_DVD:
+ menu = gtk_menu_item_get_submenu (GTK_MENU_ITEM (disc->priv->dvd_menu));
+ break;
+ default:
+ g_warn_if_reached ();
+ break;
+ }
+
+ gtk_menu_shell_insert (GTK_MENU_SHELL (menu), data->mi, 2);
g_signal_connect (data->mi, "activate",
G_CALLBACK (parole_disc_media_activate_cb), disc);
+
+}
+
+static MountData *
+parole_disc_get_mount_data (ParoleDisc *disc,
+ const gchar *uri,
+ const gchar *device,
+ ParoleDiscKind kind)
+{
+ MountData *data;
+
+ data = g_new0 (MountData, 1);
+
+ data->kind = kind;
+ data->uri = data->device = NULL;
+ data->uri = g_strdup (uri);
+ data->device = g_strdup (device);
+
return data;
}
@@ -201,7 +226,9 @@ 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, device, kind);
+ data = parole_disc_get_mount_data (disc, uri, device, kind);
+ parole_disc_insert_menu_item (disc, data, label);
+
if ( uri )
g_free (uri);
@@ -243,7 +270,8 @@ parole_disc_check_cdrom (ParoleDisc *disc, GVolume *volume, const gchar *device)
if ( drive == CDS_AUDIO || drive == CDS_MIXED )
{
MountData *data;
- data = parole_disc_get_mount_data (disc, g_volume_get_name (volume), "cdda://", device, PAROLE_DISC_CDDA);
+ data = parole_disc_get_mount_data (disc, "cdda://", device, PAROLE_DISC_CDDA);
+ parole_disc_insert_menu_item (disc, data, g_volume_get_name (volume));
g_ptr_array_add (disc->priv->array, data);
}
}
@@ -407,7 +435,8 @@ parole_disc_init (ParoleDisc *disc)
g_signal_connect (G_OBJECT (disc->priv->monitor), "drive-eject-button",
G_CALLBACK (parole_disc_monitor_changed_cb), disc);
- disc->priv->media_menu = GTK_WIDGET (gtk_builder_get_object (builder, "media-menu"));
+ disc->priv->dvd_menu = GTK_WIDGET (gtk_builder_get_object (builder, "dvd-menu"));
+ disc->priv->cd_menu = GTK_WIDGET (gtk_builder_get_object (builder, "cd-menu"));
g_signal_connect (gtk_builder_get_object (builder, "media-menu-item"), "select",
G_CALLBACK (parole_disc_select_cb), disc);
diff --git a/src/parole-player.c b/src/parole-player.c
index 467e6b3..8277f61 100644
--- a/src/parole-player.c
+++ b/src/parole-player.c
@@ -70,8 +70,13 @@
/*
* DBus Glib init
*/
-static void parole_player_dbus_class_init (ParolePlayerClass *klass);
-static void parole_player_dbus_init (ParolePlayer *player);
+static void parole_player_dbus_class_init (ParolePlayerClass *klass);
+static void parole_player_dbus_init (ParolePlayer *player);
+
+static void parole_player_disc_selected_cb (ParoleDisc *disc,
+ const gchar *uri,
+ const gchar *device,
+ ParolePlayer *player);
/*
* GtkBuilder Callbacks
@@ -130,6 +135,12 @@ void parole_player_menu_add_cb (GtkWidget *widget,
void parole_player_menu_exit_cb (GtkWidget *widget,
ParolePlayer *player);
+void dvd_iso_mi_activated_cb (GtkWidget *widget,
+ ParolePlayer *player);
+
+void cd_iso_mi_activated_cb (GtkWidget *widget,
+ ParolePlayer *player);
+
void parole_player_volume_up (GtkWidget *widget,
ParolePlayer *player);
@@ -333,6 +344,87 @@ void parole_player_show_hide_playlist (GtkButton *button, ParolePlayer *player)
g_object_unref (img);
}
+typedef enum
+{
+ PAROLE_ISO_IMAGE_DVD,
+ PAROLE_ISO_IMAGE_CD
+} ParoleIsoImage;
+
+static void
+iso_files_folder_changed_cb (GtkFileChooser *widget, gpointer data)
+{
+ gchar *folder;
+ folder = gtk_file_chooser_get_current_folder (GTK_FILE_CHOOSER (widget));
+
+ if ( folder )
+ {
+ parole_rc_write_entry_string ("iso-image-folder", PAROLE_RC_GROUP_GENERAL, folder);
+ g_free (folder);
+ }
+}
+
+static void
+parole_player_open_iso_image (ParolePlayer *player, ParoleIsoImage image)
+{
+ GtkWidget *chooser;
+ GtkFileFilter *filter;
+ gchar *file = NULL;
+ const gchar *folder;
+ gint response;
+
+ chooser = gtk_file_chooser_dialog_new (_("Open ISO image"), GTK_WINDOW (player->priv->window),
+ GTK_FILE_CHOOSER_ACTION_OPEN,
+ GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL,
+ GTK_STOCK_OPEN, GTK_RESPONSE_OK,
+ NULL);
+
+ gtk_file_chooser_set_select_multiple (GTK_FILE_CHOOSER (chooser), FALSE);
+
+ folder = parole_rc_read_entry_string ("iso-image-folder", PAROLE_RC_GROUP_GENERAL, NULL);
+
+ if ( folder )
+ gtk_file_chooser_set_current_folder (GTK_FILE_CHOOSER (chooser), folder);
+
+ g_signal_connect (chooser, "current-folder-changed",
+ G_CALLBACK (iso_files_folder_changed_cb), NULL);
+
+ filter = gtk_file_filter_new ();
+ gtk_file_filter_set_name (filter, image == PAROLE_ISO_IMAGE_CD ? _("CD image") : _("DVD image"));
+ gtk_file_filter_add_mime_type (filter, "application/x-cd-image");
+ gtk_file_chooser_add_filter (GTK_FILE_CHOOSER (chooser), filter);
+
+ gtk_window_set_default_size (GTK_WINDOW (chooser), 680, 480);
+ response = gtk_dialog_run (GTK_DIALOG (chooser));
+
+ if ( response == GTK_RESPONSE_OK )
+ {
+ file = gtk_file_chooser_get_filename (GTK_FILE_CHOOSER (chooser));
+ }
+
+ gtk_widget_destroy (chooser);
+
+ if ( file )
+ {
+ gchar *uri;
+ //FIXME: vcd will word for svcd?
+ uri = g_strdup_printf ("%s%s", PAROLE_ISO_IMAGE_CD ? "dvd://" : ("vcd://"), file);
+ TRACE ("Playing ISO image %s", uri);
+ parole_player_disc_selected_cb (NULL, uri, NULL, player);
+ g_free (file);
+ g_free (uri);
+ }
+}
+
+void dvd_iso_mi_activated_cb (GtkWidget *widget, ParolePlayer *player)
+{
+ parole_player_open_iso_image (player, PAROLE_ISO_IMAGE_DVD);
+}
+
+void cd_iso_mi_activated_cb (GtkWidget *widget, ParolePlayer *player)
+{
+ parole_player_open_iso_image (player, PAROLE_ISO_IMAGE_CD);
+}
+
static void
parole_player_change_range_value (ParolePlayer *player, gdouble value)
{
More information about the Xfce4-commits
mailing list