[Goodies-commits] r7906 - in parole/trunk: . data/interfaces parole
Ali Abdallah
aliov at xfce.org
Tue Aug 11 11:39:04 CEST 2009
Author: aliov
Date: 2009-08-11 09:39:03 +0000 (Tue, 11 Aug 2009)
New Revision: 7906
Modified:
parole/trunk/ChangeLog
parole/trunk/data/interfaces/parole.ui
parole/trunk/data/interfaces/playlist.ui
parole/trunk/parole/main.c
parole/trunk/parole/parole-disc-menu.c
parole/trunk/parole/parole-disc-menu.h
parole/trunk/parole/parole-gst.c
parole/trunk/parole/parole-gst.h
parole/trunk/parole/parole-medialist.c
parole/trunk/parole/parole-player.c
parole/trunk/parole/parole-utils.c
Log:
* main.c show gtk and gst command line options.
* parole-medialist.c, allow multiple selection, so handle list up
and down+remove when multiple rows are selected.
* Show a button for fast tracks selection when playing cdda.
Modified: parole/trunk/ChangeLog
===================================================================
--- parole/trunk/ChangeLog 2009-08-09 15:47:54 UTC (rev 7905)
+++ parole/trunk/ChangeLog 2009-08-11 09:39:03 UTC (rev 7906)
@@ -1,3 +1,9 @@
+2009-08-11: aliov at xfce.org
+ * main.c show gtk and gst command line options.
+ * parole-medialist.c, allow multiple selection, so handle list up
+ and down+remove when multiple rows are selected.
+ * Show a button for fast tracks selection when playing cdda.
+
2009-08-06: 14:30 Ali aliov at xfce.org
* parole-gst.c Implement a timeout handler to check state change
failure, can potentially happen on live streams.
Modified: parole/trunk/data/interfaces/parole.ui
===================================================================
--- parole/trunk/data/interfaces/parole.ui 2009-08-09 15:47:54 UTC (rev 7905)
+++ parole/trunk/data/interfaces/parole.ui 2009-08-11 09:39:03 UTC (rev 7906)
@@ -325,73 +325,100 @@
<property name="orientation">vertical</property>
<property name="spacing">5</property>
<child>
- <object class="GtkHBox" id="dvd-box">
- <property name="visible">True</property>
+ <object class="GtkEventBox" id="disc-box">
+ <property name="no_show_all">True</property>
<child>
- <object class="GtkButton" id="prev-chapter">
- <property name="label" translatable="yes">Previous Chapter</property>
- <property name="can_focus">True</property>
- <property name="receives_default">True</property>
- <property name="no_show_all">True</property>
- <property name="image">image1</property>
- </object>
- <packing>
- <property name="expand">False</property>
- <property name="position">0</property>
- </packing>
- </child>
- <child>
- <object class="GtkButton" id="dvd-menu">
- <property name="label" translatable="yes">DVD Menu</property>
- <property name="can_focus">True</property>
- <property name="receives_default">True</property>
- <property name="no_show_all">True</property>
- <property name="image">image2</property>
- </object>
- <packing>
- <property name="expand">False</property>
- <property name="position">1</property>
- </packing>
- </child>
- <child>
- <object class="GtkButton" id="chapter-menu">
- <property name="label" translatable="yes">Chapter Menu</property>
- <property name="can_focus">True</property>
- <property name="receives_default">True</property>
- <property name="no_show_all">True</property>
- <property name="image">image3</property>
- </object>
- <packing>
- <property name="expand">False</property>
- <property name="position">2</property>
- </packing>
- </child>
- <child>
- <object class="GtkButton" id="next-chapter">
- <property name="label" translatable="yes">Next Chapter</property>
- <property name="can_focus">True</property>
- <property name="receives_default">True</property>
- <property name="no_show_all">True</property>
- <property name="image">image4</property>
- </object>
- <packing>
- <property name="expand">False</property>
- <property name="position">3</property>
- </packing>
- </child>
- <child>
- <object class="GtkEventBox" id="eventboxinfo">
- <property name="no_show_all">True</property>
+ <object class="GtkHBox" id="disc-menu-box">
+ <property name="visible">True</property>
+ <property name="spacing">5</property>
<child>
- <object class="GtkLabel" id="info">
+ <object class="GtkButton" id="prev-chapter">
+ <property name="label" translatable="yes">Previous Chapter</property>
+ <property name="can_focus">False</property>
+ <property name="receives_default">False</property>
<property name="no_show_all">True</property>
- <property name="use_markup">True</property>
+ <property name="image">image1</property>
+ <property name="relief">none</property>
</object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="position">0</property>
+ </packing>
</child>
+ <child>
+ <object class="GtkButton" id="dvd-menu">
+ <property name="label" translatable="yes">DVD Menu</property>
+ <property name="can_focus">False</property>
+ <property name="receives_default">False</property>
+ <property name="no_show_all">True</property>
+ <property name="image">image2</property>
+ <property name="relief">none</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkButton" id="chapter-menu">
+ <property name="label" translatable="yes">Chapter Menu</property>
+ <property name="can_focus">False</property>
+ <property name="receives_default">False</property>
+ <property name="no_show_all">True</property>
+ <property name="image">image3</property>
+ <property name="relief">none</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="position">2</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkEventBox" id="eventboxinfo">
+ <property name="no_show_all">True</property>
+ <child>
+ <object class="GtkLabel" id="info">
+ <property name="no_show_all">True</property>
+ <property name="use_markup">True</property>
+ </object>
+ </child>
+ </object>
+ <packing>
+ <property name="position">3</property>
+ </packing>
+ </child>
+ <child>
+ <placeholder/>
+ </child>
+ <child>
+ <object class="GtkButton" id="select-track">
+ <property name="label" translatable="yes">Select Track</property>
+ <property name="can_focus">False</property>
+ <property name="receives_default">False</property>
+ <property name="no_show_all">True</property>
+ <property name="image">image13</property>
+ <property name="relief">none</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="position">5</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkButton" id="next-chapter">
+ <property name="label" translatable="yes">Next Chapter</property>
+ <property name="can_focus">False</property>
+ <property name="receives_default">False</property>
+ <property name="no_show_all">True</property>
+ <property name="image">image4</property>
+ <property name="relief">none</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="position">6</property>
+ </packing>
+ </child>
</object>
- <packing>
- <property name="position">4</property>
- </packing>
</child>
</object>
<packing>
@@ -448,11 +475,10 @@
<property name="visible">True</property>
<property name="sensitive">False</property>
<property name="can_focus">True</property>
- <property name="receives_default">True</property>
+ <property name="receives_default">False</property>
<property name="image">image7</property>
<property name="relief">none</property>
<property name="focus_on_click">False</property>
- <accelerator key="s" signal="clicked"/>
<signal name="clicked" handler="parole_player_stop_clicked"/>
</object>
<packing>
@@ -545,6 +571,7 @@
<property name="can_focus">True</property>
<property name="receives_default">True</property>
<property name="no_show_all">True</property>
+ <property name="relief">none</property>
<property name="use_stock">True</property>
<signal name="clicked" handler="parole_player_leave_fs_cb"/>
</object>
@@ -681,22 +708,21 @@
<property name="visible">True</property>
<property name="stock">gtk-network</property>
</object>
- <object class="GtkImage" id="image1">
+ <object class="GtkImage" id="image10">
<property name="visible">True</property>
- <property name="stock">gtk-media-previous</property>
+ <property name="icon_name">audio-volume-low</property>
</object>
- <object class="GtkImage" id="image2">
+ <object class="GtkImage" id="image11">
<property name="visible">True</property>
- <property name="stock">gtk-index</property>
+ <property name="icon_name">audio-volume-high</property>
</object>
- <object class="GtkImage" id="image3">
+ <object class="GtkImage" id="image12">
<property name="visible">True</property>
- <property name="no_show_all">True</property>
- <property name="stock">gtk-index</property>
+ <property name="icon_name">audio-volume-muted</property>
</object>
- <object class="GtkImage" id="image4">
+ <object class="GtkImage" id="image18">
<property name="visible">True</property>
- <property name="stock">gtk-media-next</property>
+ <property name="stock">gtk-go-forward</property>
</object>
<object class="GtkImage" id="image6">
<property name="visible">True</property>
@@ -714,20 +740,25 @@
<property name="visible">True</property>
<property name="stock">gtk-media-forward</property>
</object>
- <object class="GtkImage" id="image18">
+ <object class="GtkImage" id="image1">
<property name="visible">True</property>
- <property name="stock">gtk-go-forward</property>
+ <property name="stock">gtk-media-previous</property>
</object>
- <object class="GtkImage" id="image10">
+ <object class="GtkImage" id="image2">
<property name="visible">True</property>
- <property name="icon_name">audio-volume-low</property>
+ <property name="stock">gtk-index</property>
</object>
- <object class="GtkImage" id="image11">
+ <object class="GtkImage" id="image3">
<property name="visible">True</property>
- <property name="icon_name">audio-volume-high</property>
+ <property name="no_show_all">True</property>
+ <property name="stock">gtk-index</property>
</object>
- <object class="GtkImage" id="image12">
+ <object class="GtkImage" id="image4">
<property name="visible">True</property>
- <property name="icon_name">audio-volume-muted</property>
+ <property name="stock">gtk-media-next</property>
</object>
+ <object class="GtkImage" id="image13">
+ <property name="visible">True</property>
+ <property name="stock">gtk-cdrom</property>
+ </object>
</interface>
Modified: parole/trunk/data/interfaces/playlist.ui
===================================================================
--- parole/trunk/data/interfaces/playlist.ui 2009-08-09 15:47:54 UTC (rev 7905)
+++ parole/trunk/data/interfaces/playlist.ui 2009-08-11 09:39:03 UTC (rev 7906)
@@ -17,7 +17,6 @@
<property name="can_focus">True</property>
<property name="headers_visible">False</property>
<property name="show_expanders">False</property>
- <signal name="cursor_changed" handler="parole_media_list_cursor_changed_cb"/>
<signal name="row_activated" handler="parole_media_list_row_activated_cb"/>
<signal name="button_release_event" handler="parole_media_list_button_release_event"/>
<signal name="drag_data_received" handler="parole_media_list_drag_data_received_cb"/>
Modified: parole/trunk/parole/main.c
===================================================================
--- parole/trunk/parole/main.c 2009-08-09 15:47:54 UTC (rev 7905)
+++ parole/trunk/parole/main.c 2009-08-11 09:39:03 UTC (rev 7906)
@@ -54,7 +54,6 @@
"Part of the Xfce Goodies Project\n"
"http://goodies.xfce.org\n\n"
"Licensed under the GNU GPL.\n\n"), VERSION);
-
exit (EXIT_SUCCESS);
}
@@ -145,7 +144,8 @@
ParolePlayer *player;
ParolePluginsManager *plugins;
GtkBuilder *builder;
-
+ GOptionContext *ctx;
+ GOptionGroup *gst_option_group;
GError *error = NULL;
gchar **filenames = NULL;
gboolean new_instance = FALSE;
@@ -164,28 +164,30 @@
xfce_textdomain (GETTEXT_PACKAGE, LOCALEDIR, "UTF-8");
- if ( !gtk_init_with_args (&argc, &argv, (gchar *)"", option_entries, (gchar *)PACKAGE, &error))
+ gtk_init (&argc, &argv);
+
+ ctx = g_option_context_new (NULL);
+
+ gst_option_group = gst_init_get_option_group ();
+ g_option_context_add_main_entries (ctx, option_entries, GETTEXT_PACKAGE);
+ g_option_context_set_translation_domain (ctx, GETTEXT_PACKAGE);
+ g_option_context_add_group (ctx, gst_option_group);
+
+ g_option_context_add_group (ctx, gtk_get_option_group (TRUE));
+
+ if ( !g_option_context_parse (ctx, &argc, &argv, &error) )
{
- if (G_LIKELY (error) )
- {
- g_printerr ("%s: %s.\n", G_LOG_DOMAIN, error->message);
- g_printerr (_("Type '%s --help' for usage."), G_LOG_DOMAIN);
- g_printerr ("\n");
- g_error_free (error);
- }
- else
- {
- g_error ("Unable to open display.");
- }
-
- return EXIT_FAILURE;
+ g_print ("%s\n", error->message);
+ g_print ("Type %s --help to list all available command line options", argv[0]);
+ g_error_free (error);
+ g_option_context_free (ctx);
+ return EXIT_FAILURE;
}
-
+ g_option_context_free (ctx);
+
if ( version )
show_version ();
-
- gst_init (NULL, NULL);
-
+
if ( !new_instance && parole_dbus_name_has_owner (PAROLE_DBUS_NAME) )
{
TRACE ("Parole is already running");
Modified: parole/trunk/parole/parole-disc-menu.c
===================================================================
--- parole/trunk/parole/parole-disc-menu.c 2009-08-09 15:47:54 UTC (rev 7905)
+++ parole/trunk/parole/parole-disc-menu.c 2009-08-11 09:39:03 UTC (rev 7906)
@@ -42,12 +42,18 @@
{
ParoleGst *gst;
ParoleMediaType current_media_type;
+
+ GtkWidget *disc_track;
+ GtkWidget *disc_box;
+
GtkWidget *next_chapter;
GtkWidget *prev_chapter;
GtkWidget *dvd_menu;
GtkWidget *chapter_menu;
GtkWidget *info;
GtkWidget *eventboxinfo;
+
+ guint tracks;
};
G_DEFINE_TYPE (ParoleDiscMenu, parole_disc_menu, G_TYPE_OBJECT)
@@ -55,10 +61,12 @@
static void
parole_disc_menu_hide (ParoleDiscMenu *menu)
{
+ gtk_widget_hide (menu->priv->disc_track);
gtk_widget_hide (menu->priv->next_chapter);
gtk_widget_hide (menu->priv->prev_chapter);
gtk_widget_hide (menu->priv->info);
gtk_widget_hide (menu->priv->eventboxinfo);
+ gtk_widget_hide (menu->priv->disc_box);
//gtk_widget_hide (menu->priv->dvd_menu);
//gtk_widget_hide (menu->priv->chapter_menu);
}
@@ -73,9 +81,12 @@
{
gtk_widget_show (menu->priv->eventboxinfo);
gtk_widget_show (menu->priv->info);
+ gtk_widget_show (menu->priv->disc_track);
}
+
//gtk_widget_show (menu->priv->dvd_menu);
- //gtk_widget_show (menu->priv->chapter_menu);
+ //gtk_widget_show (menu->priv->dvd_menu);
+ gtk_widget_show (menu->priv->disc_box);
}
@@ -84,6 +95,7 @@
ParoleMediaState state, ParoleDiscMenu *menu)
{
ParoleMediaType media_type;
+ menu->priv->tracks = 0;
if ( state < PAROLE_MEDIA_STATE_PAUSED )
{
@@ -121,6 +133,7 @@
g_free (text);
parole_disc_menu_show (menu, TRUE);
+ menu->priv->tracks = num_tracks;
}
menu->priv->current_media_type = media_type;
}
@@ -157,6 +170,58 @@
}
static void
+track_menu_item_activated_cb (GtkWidget *widget, ParoleDiscMenu *menu)
+{
+ guint track;
+
+ track = GPOINTER_TO_UINT ( g_object_get_data (G_OBJECT (widget), "track"));
+
+ parole_gst_seek_cdda (menu->priv->gst, track);
+}
+
+static void
+parole_disc_menu_show_disc_track_menu (ParoleDiscMenu *disc_menu, guint button, guint activate_time)
+{
+ GtkWidget *menu, *mi, *img;
+ gchar track[128];
+ guint i;
+
+ menu = gtk_menu_new ();
+
+ for ( i = 0; i < disc_menu->priv->tracks; i++)
+ {
+ img = gtk_image_new_from_stock (GTK_STOCK_CDROM, GTK_ICON_SIZE_MENU);
+ g_snprintf (track, 128, _("Track %i"), i+1);
+ mi = gtk_image_menu_item_new_with_label (track);
+ gtk_image_menu_item_set_image (GTK_IMAGE_MENU_ITEM (mi), img);
+ gtk_widget_show (mi);
+ gtk_menu_shell_append (GTK_MENU_SHELL (menu), mi);
+ g_object_set_data (G_OBJECT (mi), "track", GUINT_TO_POINTER (i+1));
+ g_signal_connect (mi, "activate",
+ G_CALLBACK (track_menu_item_activated_cb), disc_menu);
+ }
+
+ g_signal_connect_swapped (menu, "selection-done",
+ G_CALLBACK (gtk_widget_destroy), menu);
+
+ gtk_menu_popup (GTK_MENU (menu),
+ NULL, NULL,
+ NULL, NULL,
+ button, activate_time);
+}
+
+static gboolean
+parole_disc_menu_show_disc_track (GtkWidget *widget, GdkEventButton *ev, ParoleDiscMenu *menu)
+{
+ if ( ev->button == 1 )
+ {
+ parole_disc_menu_show_disc_track_menu (menu, ev->button, ev->time);
+ }
+
+ return FALSE;
+}
+
+static void
parole_disc_menu_class_init (ParoleDiscMenuClass *klass)
{
GObjectClass *object_class = G_OBJECT_CLASS (klass);
@@ -174,20 +239,29 @@
menu->priv = PAROLE_DISC_MENU_GET_PRIVATE (menu);
+ menu->priv->tracks = 0;
+
builder = parole_builder_get_main_interface ();
+ menu->priv->disc_track = GTK_WIDGET (gtk_builder_get_object (builder, "select-track"));
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->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"));
gdk_color_parse ("black", &color);
+
gtk_widget_modify_bg (menu->priv->eventboxinfo, GTK_STATE_NORMAL, &color);
+ gtk_widget_modify_bg (menu->priv->disc_box, GTK_STATE_NORMAL, &color);
menu->priv->current_media_type = PAROLE_MEDIA_TYPE_UNKNOWN;
+ g_signal_connect (menu->priv->disc_track, "button-press-event",
+ G_CALLBACK (parole_disc_menu_show_disc_track), menu);
+
g_signal_connect_swapped (menu->priv->next_chapter, "clicked",
G_CALLBACK (parole_disc_menu_next_chapter_cb), menu);
@@ -226,7 +300,7 @@
return menu;
}
-gboolean parole_disc_menu_visible (ParoleDiscMenu *menu)
+gboolean parole_disc_menu_visible (ParoleDiscMenu *menu)
{
return (GTK_WIDGET_VISIBLE (menu->priv->next_chapter));
}
@@ -240,3 +314,7 @@
{
parole_disc_menu_prev_chapter_cb (menu);
}
+
+void parole_disc_menu_set_fullscreen (ParoleDiscMenu *menu, gboolean fullscreen)
+{
+}
Modified: parole/trunk/parole/parole-disc-menu.h
===================================================================
--- parole/trunk/parole/parole-disc-menu.h 2009-08-09 15:47:54 UTC (rev 7905)
+++ parole/trunk/parole/parole-disc-menu.h 2009-08-11 09:39:03 UTC (rev 7906)
@@ -52,6 +52,9 @@
void parole_disc_menu_seek_prev (ParoleDiscMenu *menu);
+void parole_disc_menu_set_fullscreen (ParoleDiscMenu *menu,
+ gboolean fullscreen);
+
G_END_DECLS
#endif /* __PAROLE_DISC_MENU_H */
Modified: parole/trunk/parole/parole-gst.c
===================================================================
--- parole/trunk/parole/parole-gst.c 2009-08-09 15:47:54 UTC (rev 7905)
+++ parole/trunk/parole/parole-gst.c 2009-08-11 09:39:03 UTC (rev 7906)
@@ -644,16 +644,12 @@
gchar *sub;
gchar *sub_uri;
gboolean sub_enabled;
- gboolean has_video;
g_object_get (G_OBJECT (gst->priv->stream),
"media-type", &type,
- "has-video", &has_video,
NULL);
- PAROLE_DEBUG_ENUM_FULL (type, ENUM_GTYPE_MEDIA_TYPE, " has_video=%d", has_video);
-
- if ( type != PAROLE_MEDIA_TYPE_LOCAL_FILE || !has_video)
+ if ( type != PAROLE_MEDIA_TYPE_LOCAL_FILE)
return;
g_object_get (G_OBJECT (gst->priv->conf),
@@ -1182,6 +1178,8 @@
{
GstStateChangeReturn ret;
+ TRACE ("Changing state to %d", new);
+
ret = gst_element_set_state (GST_ELEMENT (gst->priv->playbin), new);
switch (ret)
@@ -1233,14 +1231,16 @@
"uri", &uri,
NULL);
+ TRACE ("Processing uri : %s", uri);
+
g_object_set (G_OBJECT (gst->priv->playbin),
"uri", uri,
"suburi", NULL,
NULL);
parole_gst_load_subtitle (gst);
-
parole_gst_change_state (gst, GST_STATE_PLAYING);
+
g_free (uri);
}
@@ -1670,6 +1670,21 @@
return GTK_WIDGET (parole_gst_object);
}
+static gboolean
+parole_gst_play_idle (gpointer data)
+{
+ ParoleGst *gst;
+
+ gst = PAROLE_GST (data);
+
+ if ( gst->priv->state < GST_STATE_PAUSED )
+ parole_gst_play_file_internal (gst);
+ else
+ parole_gst_change_state (gst, GST_STATE_READY);
+
+ return FALSE;
+}
+
void parole_gst_play_uri (ParoleGst *gst, const gchar *uri)
{
g_mutex_lock (gst->priv->lock);
@@ -1689,10 +1704,8 @@
parole_window_busy_cursor (GTK_WIDGET (gst)->window);
- if ( gst->priv->state < GST_STATE_PAUSED )
- parole_gst_play_file_internal (gst);
- else
- parole_gst_change_state (gst, GST_STATE_READY);
+ g_idle_add ((GSourceFunc) parole_gst_play_idle, gst);
+
}
void parole_gst_pause (ParoleGst *gst)
@@ -1821,6 +1834,15 @@
parole_gst_change_cdda_track (gst, -1);
}
+void parole_gst_seek_cdda (ParoleGst *gst, guint track_num)
+{
+ gint current_track;
+
+ current_track = parole_gst_get_current_cdda_track (gst);
+
+ parole_gst_change_cdda_track (gst, (gint) track_num - current_track -1);
+}
+
gint parole_gst_get_current_cdda_track (ParoleGst *gst)
{
GstFormat format;
Modified: parole/trunk/parole/parole-gst.h
===================================================================
--- parole/trunk/parole/parole-gst.h 2009-08-09 15:47:54 UTC (rev 7905)
+++ parole/trunk/parole/parole-gst.h 2009-08-11 09:39:03 UTC (rev 7906)
@@ -116,6 +116,9 @@
void parole_gst_prev_cdda_track (ParoleGst *gst);
+void parole_gst_seek_cdda (ParoleGst *gst,
+ guint track_num);
+
gint parole_gst_get_current_cdda_track (ParoleGst *gst);
ParoleMediaType parole_gst_get_current_stream_type (ParoleGst *gst);
Modified: parole/trunk/parole/parole-medialist.c
===================================================================
--- parole/trunk/parole/parole-medialist.c 2009-08-09 15:47:54 UTC (rev 7905)
+++ parole/trunk/parole/parole-medialist.c 2009-08-11 09:39:03 UTC (rev 7906)
@@ -74,6 +74,14 @@
static void parole_media_list_dbus_class_init (ParoleMediaListClass *klass);
static void parole_media_list_dbus_init (ParoleMediaList *list);
+static GtkTreeRowReference *
+ parole_media_list_get_row_reference_from_iter (ParoleMediaList *list,
+ GtkTreeIter *iter,
+ gboolean select_path);
+
+static void parole_media_list_select_path (ParoleMediaList *list,
+ GtkTreePath *path);
+
/*
* Callbacks for GtkBuilder
*/
@@ -97,9 +105,6 @@
GtkTreeViewColumn *col,
ParoleMediaList *list);
-void parole_media_list_cursor_changed_cb (GtkTreeView *view,
- ParoleMediaList *list);
-
gboolean parole_media_list_button_release_event (GtkWidget *widget,
GdkEventButton *ev,
ParoleMediaList *list);
@@ -133,6 +138,7 @@
GtkWidget *view;
GtkWidget *box;
GtkListStore *store;
+ GtkTreeSelection *sel;
GtkWidget *remove;
GtkWidget *up;
@@ -361,7 +367,34 @@
gtk_widget_destroy (GTK_WIDGET (data->chooser));
g_free (data);
}
-
+
+static GtkTreeRowReference *
+parole_media_list_get_first_selected_row (ParoleMediaList *list)
+{
+ GtkTreeModel *model;
+ GtkTreeRowReference *row = NULL;
+ GtkTreeIter iter;
+ GList *path_list = NULL;
+
+ path_list = gtk_tree_selection_get_selected_rows (list->priv->sel, &model);
+
+ if ( g_list_length (path_list) > 0 )
+ {
+ GtkTreePath *path;
+ path = g_list_nth_data (path_list, 0);
+
+ if ( G_LIKELY (gtk_tree_model_get_iter (model, &iter, path) == TRUE ))
+ {
+ row = parole_media_list_get_row_reference_from_iter (list, &iter, FALSE);
+ }
+ }
+
+ g_list_foreach (path_list, (GFunc)gtk_tree_path_free, NULL);
+ g_list_free (path_list);
+
+ return row;
+}
+
void parole_media_list_save_playlist_cb (GtkButton *button, ParolePlaylistSave *data)
{
ParolePlFormat format = PAROLE_PL_FORMAT_UNKNOWN;
@@ -503,27 +536,72 @@
g_object_unref (builder);
}
+static GList *
+parole_media_list_path_to_row_list (GList *path_list, GtkTreeModel *model)
+{
+ GList *row_list = NULL;
+ guint len, i;
+
+ len = g_list_length (path_list);
+
+ for ( i = 0; i < len; i++)
+ {
+ GtkTreePath *path;
+ GtkTreeRowReference *row;
+
+ path = g_list_nth_data (path_list, i);
+
+ row = gtk_tree_row_reference_new (model, path);
+ path = gtk_tree_row_reference_get_path (row);
+ row_list = g_list_append (row_list, row);
+ }
+
+ return row_list;
+}
+
void
parole_media_list_remove_clicked_cb (GtkButton *button, ParoleMediaList *list)
{
- GtkTreeSelection *sel;
+ GtkTreeModel *model;
+ GList *path_list = NULL;
+ GList *row_list = NULL;
GtkTreeIter iter;
gint nch;
+ guint len, i;
- sel = gtk_tree_view_get_selection (GTK_TREE_VIEW (list->priv->view));
+ path_list = gtk_tree_selection_get_selected_rows (list->priv->sel, &model);
+
+ row_list = parole_media_list_path_to_row_list (path_list, model);
- if ( !gtk_tree_selection_get_selected (sel, NULL, &iter) )
- return;
-
- gtk_list_store_remove (list->priv->store,
- &iter);
-
+ g_list_foreach (path_list, (GFunc) gtk_tree_path_free, NULL);
+ g_list_free (path_list);
+
+ len = g_list_length (row_list);
+
+ for ( i = 0; i < len; i++)
+ {
+ GtkTreePath *path;
+ GtkTreeRowReference *row;
+ row = g_list_nth_data (row_list, i);
+ path = gtk_tree_row_reference_get_path (row);
+
+ if ( G_LIKELY (gtk_tree_model_get_iter (model, &iter, path) == TRUE ) )
+ {
+ gtk_list_store_remove (GTK_LIST_STORE (model),
+ &iter);
+ }
+ }
+
+ g_list_foreach (row_list, (GFunc) gtk_tree_row_reference_free, NULL);
+ g_list_free (row_list);
+
/*
* Returns the number of children that iter has.
* As a special case, if iter is NULL,
* then the number of toplevel nodes is returned. Gtk API doc.
*/
nch = gtk_tree_model_iter_n_children (GTK_TREE_MODEL (list->priv->store), NULL);
+
if ( nch == 0)
{
parole_media_list_set_widget_sensitive (list, FALSE);
@@ -540,74 +618,178 @@
}
}
-void
-parole_media_list_media_down_clicked_cb (GtkButton *button, ParoleMediaList *list)
+static void
+parole_media_list_move_one_down (GtkListStore *store, GtkTreeIter *iter)
{
- GtkTreeSelection *sel;
- GtkTreeIter iter;
GtkTreeIter *pos_iter;
- sel = gtk_tree_view_get_selection (GTK_TREE_VIEW (list->priv->view));
-
- if ( !gtk_tree_selection_get_selected (sel, NULL, &iter) )
- return;
-
/* Save the selected iter to the selected row */
- pos_iter = gtk_tree_iter_copy (&iter);
+ pos_iter = gtk_tree_iter_copy (iter);
/* We are on the last node in the list!*/
- if ( !gtk_tree_model_iter_next (GTK_TREE_MODEL (list->priv->store), &iter) )
+ if ( !gtk_tree_model_iter_next (GTK_TREE_MODEL (store), iter) )
{
/* Return false if tree is empty*/
- if (gtk_tree_model_get_iter_first (GTK_TREE_MODEL (list->priv->store), &iter))
+ if (gtk_tree_model_get_iter_first (GTK_TREE_MODEL (store), iter))
{
- gtk_list_store_move_before (GTK_LIST_STORE (list->priv->store), pos_iter, &iter);
+ gtk_list_store_move_before (GTK_LIST_STORE (store), pos_iter, iter);
}
}
else
{
- gtk_list_store_move_after (GTK_LIST_STORE (list->priv->store), pos_iter, &iter);
+ gtk_list_store_move_after (GTK_LIST_STORE (store), pos_iter, iter);
}
gtk_tree_iter_free (pos_iter);
}
+static void
+parole_media_list_move_many_down (GList *path_list, GtkTreeModel *model)
+{
+ GList *row_list = NULL;
+ GtkTreeIter iter;
+ guint len;
+ guint i;
+
+ row_list = parole_media_list_path_to_row_list (path_list, model);
+
+ len = g_list_length (row_list);
+
+ for ( i = 0; i < len; i++)
+ {
+ GtkTreeRowReference *row;
+ GtkTreePath *path;
+
+ row = g_list_nth_data (row_list, i);
+
+ path = gtk_tree_row_reference_get_path (row);
+
+ if ( G_LIKELY (gtk_tree_model_get_iter (model, &iter, path) ) )
+ {
+ parole_media_list_move_one_down (GTK_LIST_STORE (model), &iter);
+ }
+ }
+
+ g_list_foreach (row_list, (GFunc) gtk_tree_row_reference_free, NULL);
+ g_list_free (row_list);
+}
+
void
-parole_media_list_media_up_clicked_cb (GtkButton *button, ParoleMediaList *list)
+parole_media_list_media_down_clicked_cb (GtkButton *button, ParoleMediaList *list)
{
- GtkTreeSelection *sel;
GtkTreeIter iter;
+ GList *path_list = NULL;
+ GtkTreeModel *model;
+ guint len;
+
+ path_list = gtk_tree_selection_get_selected_rows (list->priv->sel, &model);
+
+ len = g_list_length (path_list);
+
+ if ( len == 1 )
+ {
+ GtkTreePath *path;
+ path = g_list_nth_data (path_list, 0);
+ if ( G_LIKELY (gtk_tree_model_get_iter (model, &iter, path)) )
+ parole_media_list_move_one_down (list->priv->store, &iter);
+ }
+ else
+ {
+ parole_media_list_move_many_down (path_list, model);
+ }
+
+ g_list_foreach (path_list, (GFunc) gtk_tree_path_free, NULL);
+ g_list_free (path_list);
+}
+
+static void
+parole_media_list_move_one_up (GtkListStore *store, GtkTreeIter *iter)
+{
GtkTreePath *path;
GtkTreeIter *pos_iter;
- sel = gtk_tree_view_get_selection (GTK_TREE_VIEW (list->priv->view));
-
- if ( !gtk_tree_selection_get_selected (sel, NULL, &iter) )
- return;
-
/* Save the selected iter to the selected row */
- pos_iter = gtk_tree_iter_copy (&iter);
+ pos_iter = gtk_tree_iter_copy (iter);
- path = gtk_tree_model_get_path (GTK_TREE_MODEL (list->priv->store), &iter);
+ path = gtk_tree_model_get_path (GTK_TREE_MODEL (store), iter);
/* We are on the top of the list */
if ( !gtk_tree_path_prev (path) )
{
/* Passing NULL as the last argument will cause this call to move
* the iter to the end of the list, Gtk API doc*/
- gtk_list_store_move_before (GTK_LIST_STORE (list->priv->store), &iter, NULL);
+ gtk_list_store_move_before (GTK_LIST_STORE (store), iter, NULL);
}
else
{
- if (gtk_tree_model_get_iter (GTK_TREE_MODEL (list->priv->store), &iter, path))
- gtk_list_store_move_before (GTK_LIST_STORE (list->priv->store), pos_iter, &iter);
+ if (gtk_tree_model_get_iter (GTK_TREE_MODEL (store), iter, path))
+ gtk_list_store_move_before (GTK_LIST_STORE (store), pos_iter, iter);
}
gtk_tree_path_free (path);
gtk_tree_iter_free (pos_iter);
}
+static void
+parole_media_list_move_many_up (GList *path_list, GtkTreeModel *model)
+{
+ GList *row_list = NULL;
+ GtkTreeIter iter;
+ guint len;
+ guint i;
+
+ row_list = parole_media_list_path_to_row_list (path_list, model);
+
+ len = g_list_length (row_list);
+
+ for ( i = 0; i < len; i++)
+ {
+ GtkTreeRowReference *row;
+ GtkTreePath *path;
+
+ row = g_list_nth_data (row_list, i);
+
+ path = gtk_tree_row_reference_get_path (row);
+
+ if ( G_LIKELY (gtk_tree_model_get_iter (model, &iter, path) ) )
+ {
+ parole_media_list_move_one_up (GTK_LIST_STORE (model), &iter);
+ }
+ }
+
+ g_list_foreach (row_list, (GFunc) gtk_tree_row_reference_free, NULL);
+ g_list_free (row_list);
+}
+
void
+parole_media_list_media_up_clicked_cb (GtkButton *button, ParoleMediaList *list)
+{
+ GtkTreeIter iter;
+ GList *path_list = NULL;
+ GtkTreeModel *model;
+ guint len;
+
+ path_list = gtk_tree_selection_get_selected_rows (list->priv->sel, &model);
+
+ len = g_list_length (path_list);
+
+ if ( len == 1 )
+ {
+ GtkTreePath *path;
+ path = g_list_nth_data (path_list, 0);
+ if ( G_LIKELY (gtk_tree_model_get_iter (model, &iter, path)) )
+ parole_media_list_move_one_up (list->priv->store, &iter);
+ }
+ else
+ {
+ parole_media_list_move_many_up (path_list, model);
+ }
+
+ g_list_foreach (path_list, (GFunc) gtk_tree_path_free, NULL);
+ g_list_free (path_list);
+}
+
+void
parole_media_list_row_activated_cb (GtkTreeView *view, GtkTreePath *path,
GtkTreeViewColumn *col, ParoleMediaList *list)
{
@@ -622,22 +804,11 @@
g_signal_emit (G_OBJECT (list), signals [MEDIA_ACTIVATED], 0, row);
}
-void
-parole_media_list_cursor_changed_cb (GtkTreeView *view, ParoleMediaList *list)
+static void
+parole_media_list_selection_changed_cb (GtkTreeSelection *sel, ParoleMediaList *list)
{
- GtkTreeSelection *sel;
- GtkTreeIter iter;
-
- sel = gtk_tree_view_get_selection (view);
-
- if ( !gtk_tree_selection_get_selected (sel, NULL, &iter ) )
- {
- g_signal_emit (G_OBJECT (list), signals [MEDIA_CURSOR_CHANGED], 0, FALSE);
- }
- else
- {
- g_signal_emit (G_OBJECT (list), signals [MEDIA_CURSOR_CHANGED], 0, TRUE);
- }
+ g_signal_emit (G_OBJECT (list), signals [MEDIA_CURSOR_CHANGED], 0,
+ gtk_tree_selection_count_selected_rows (sel) > 0);
}
static void
@@ -715,10 +886,7 @@
static void
parole_media_list_select_path (ParoleMediaList *list, GtkTreePath *path)
{
- GtkTreeSelection *sel;
-
- sel = gtk_tree_view_get_selection (GTK_TREE_VIEW (list->priv->view));
- gtk_tree_selection_select_path (sel, path);
+ gtk_tree_selection_select_path (list->priv->sel, path);
gtk_tree_view_set_cursor (GTK_TREE_VIEW (list->priv->view), path, NULL, FALSE);
}
@@ -791,6 +959,7 @@
static void
parole_media_list_setup_view (ParoleMediaList *list)
{
+ GtkTreeSelection *sel;
GtkListStore *list_store;
GtkTreeViewColumn *col;
GtkCellRenderer *renderer;
@@ -821,6 +990,12 @@
gtk_drag_dest_set (list->priv->view, GTK_DEST_DEFAULT_ALL, target_entry, G_N_ELEMENTS (target_entry),
GDK_ACTION_COPY | GDK_ACTION_MOVE);
+ list->priv->sel = sel = gtk_tree_view_get_selection (GTK_TREE_VIEW (list->priv->view));
+ gtk_tree_selection_set_mode (sel, GTK_SELECTION_MULTIPLE);
+
+ g_signal_connect (sel, "changed",
+ G_CALLBACK (parole_media_list_selection_changed_cb), list);
+
list->priv->store = list_store;
}
@@ -837,6 +1012,7 @@
builder = parole_builder_new_from_string (playlist_ui, playlist_ui_length);
list->priv->view = GTK_WIDGET (gtk_builder_get_object (builder, "media-list"));
+
box = GTK_WIDGET (gtk_builder_get_object (builder, "playlist-box"));
parole_media_list_setup_view (list);
@@ -974,16 +1150,7 @@
GtkTreeRowReference *parole_media_list_get_selected_row (ParoleMediaList *list)
{
- GtkTreeModel *model;
- GtkTreeSelection *sel;
- GtkTreeIter iter;
-
- sel = gtk_tree_view_get_selection (GTK_TREE_VIEW (list->priv->view));
-
- if (!gtk_tree_selection_get_selected (sel, &model, &iter))
- return NULL;
-
- return parole_media_list_get_row_reference_from_iter (list, &iter, TRUE);
+ return parole_media_list_get_first_selected_row (list);
}
void parole_media_list_set_row_pixbuf (ParoleMediaList *list, GtkTreeRowReference *row, GdkPixbuf *pix)
Modified: parole/trunk/parole/parole-player.c
===================================================================
--- parole/trunk/parole/parole-player.c 2009-08-09 15:47:54 UTC (rev 7905)
+++ parole/trunk/parole/parole-player.c 2009-08-11 09:39:03 UTC (rev 7906)
@@ -881,6 +881,7 @@
gtk_widget_reparent (player->priv->play_box, player->priv->control);
gtk_widget_hide (player->priv->fs_window);
parole_statusbar_set_visible (player->priv->status, TRUE);
+ parole_disc_menu_set_fullscreen (player->priv->disc_menu, FALSE);
gtk_widget_show (player->priv->play_box);
gtk_widget_show (player->priv->menu_bar);
gtk_widget_show (player->priv->playlist_nt);
@@ -895,6 +896,7 @@
}
else
{
+ parole_disc_menu_set_fullscreen (player->priv->disc_menu, TRUE);
parole_player_move_fs_window (player);
gtk_widget_reparent (player->priv->play_box, player->priv->fs_window);
@@ -908,6 +910,7 @@
current_page = gtk_notebook_get_current_page (GTK_NOTEBOOK (player->priv->playlist_nt));
gtk_notebook_set_show_tabs (GTK_NOTEBOOK (player->priv->main_nt), FALSE);
+
gtk_window_fullscreen (GTK_WINDOW (player->priv->window));
player->priv->full_screen = TRUE;
}
@@ -1244,7 +1247,12 @@
parole_player_key_press (GtkWidget *widget, GdkEventKey *ev, ParolePlayer *player)
{
gboolean ret_val = FALSE;
-
+/*
+ gchar *key;
+ key = gdk_keyval_name (ev->keyval);
+ g_print ("Key Press 0x%X:%s on widget=%s\n", ev->keyval, key, gtk_widget_get_name (widget));
+*/
+
switch (ev->keyval)
{
case GDK_F11:
@@ -1270,12 +1278,14 @@
parole_player_seekb_cb (NULL, player);
ret_val = TRUE;
break;
+ case GDK_space:
+ parole_player_play_pause_clicked (NULL, player);
+ ret_val = TRUE;
+ break;
default:
break;
}
- g_print ("Key Press 0x%X\n", ev->keyval);
-
return ret_val;
}
@@ -1429,6 +1439,11 @@
g_signal_connect (G_OBJECT (player->priv->gst), "motion-notify-event",
G_CALLBACK (parole_player_gst_widget_motion_notify_event), player);
+ /*
+ g_signal_connect (G_OBJECT (player->priv->gst), "key-press-event",
+ G_CALLBACK (parole_player_key_press), player);
+ */
+
player->priv->window = GTK_WIDGET (gtk_builder_get_object (builder, "main-window"));
player->priv->main_nt = GTK_WIDGET (gtk_builder_get_object (builder, "main-notebook"));
Modified: parole/trunk/parole/parole-utils.c
===================================================================
--- parole/trunk/parole/parole-utils.c 2009-08-09 15:47:54 UTC (rev 7905)
+++ parole/trunk/parole/parole-utils.c 2009-08-11 09:39:03 UTC (rev 7906)
@@ -312,6 +312,8 @@
file = g_file_new_for_commandline_arg (uri);
parent = g_file_get_parent (file);
+ TRACE ("uri : %s", uri);
+
if ( !parent )
{
g_object_unref (file);
More information about the Goodies-commits
mailing list