changeset 184:4406e91d2da3

Subtune control slider in fileinfo-window now works. Various fixes. Pop-up subtune control can now be exited via ESC-button. The slider is focused by default.
author Matti Hamalainen <ccr@tnsp.org>
date Wed, 18 Aug 2004 05:16:00 +0000
parents 11d0f9555717
children af7c0e0ce11a
files src/xmms-sid.c
diffstat 1 files changed, 75 insertions(+), 19 deletions(-) [+]
line wrap: on
line diff
--- a/src/xmms-sid.c	Wed Aug 18 05:15:00 2004 +0000
+++ b/src/xmms-sid.c	Wed Aug 18 05:16:00 2004 +0000
@@ -28,6 +28,9 @@
 #include <xmms/plugin.h>
 #include <xmms/util.h>
 
+#include <gdk/gdkkeysyms.h>
+#include <gtk/gtk.h>
+
 #include "xmms-sid.h"
 #include "xs_support.h"
 #include "xs_config.h"
@@ -117,7 +120,9 @@
 static t_xs_tune		*xs_fileinfotune = NULL;
 static t_xs_stil_node		*xs_fileinfostil = NULL;
 
+
 void	xs_subctrl_close(void);
+void	xs_subctrl_update(void);
 
 
 /*
@@ -299,10 +304,13 @@
  pthread_mutex_lock(&xs_mutex);
  myStatus.currSong = xs_status.currSong;
  pthread_mutex_unlock(&xs_mutex);
+ xs_subctrl_update();
 
  XSDEBUG("subtune #%i selected, initializing...\n", myStatus.currSong);
 
  songLength = myTune->subTunes[myStatus.currSong - 1].tuneLength;
+ 
+ /* Check minimum playtime */
  if (xs_cfg.playMinTimeEnable)
  	{
 	if (songLength < xs_cfg.playMinTime)
@@ -314,7 +322,7 @@
 	{
 	XSERR("Couldn't initialize SID-tune '%s' (sub-tune #%i)!\n",
 		myTune->tuneFilename, myStatus.currSong);
-	goto err_exit;
+	goto xs_err_exit;
 	}
 
 
@@ -335,7 +343,7 @@
 	pthread_mutex_lock(&xs_mutex);
 	xs_status.isError = TRUE;
 	pthread_mutex_unlock(&xs_mutex);
-	goto err_exit;
+	goto xs_err_exit;
 	}
 
  audioOpen = TRUE;
@@ -399,7 +407,7 @@
  if (!myStatus.isPlaying) doPlay = FALSE;
  }
 
-err_exit:
+xs_err_exit:
  /* Close audio */
  if (audioOpen)
 	{
@@ -442,7 +450,7 @@
  xs_status.isPlaying	= TRUE;
  xs_status.isError	= FALSE;
  xs_status.currSong	= xs_status.pTune->startTune;
-
+ 
  /* Start the playing thread! */
  if (pthread_create(&xs_decode_thread, NULL, xs_play_loop, NULL) < 0)
 	{
@@ -479,6 +487,9 @@
  xs_player->plrDeleteSID(&xs_status);
  xs_tune_free(xs_status.pTune);
  xs_status.pTune = NULL;
+
+ /* Update subtune control */
+ xs_subctrl_update();
 }
 
 
@@ -500,29 +511,50 @@
 void xs_subctrl_update(void)
 {
  GtkAdjustment *tmpAdj;
+ gboolean isEnabled;
  
- if (xs_subctrl)
+ /* Check if control window exists, we are currently playing and have a tune */
+ if (xs_subctrl && xs_status.pTune && xs_status.isPlaying)
  	{
  	tmpAdj = GTK_ADJUSTMENT(xs_subctrl_adj);
  	
  	tmpAdj->value = xs_status.currSong;
  	tmpAdj->lower = 1;
-	tmpAdj->upper = (xs_status.pTune) ? xs_status.pTune->nsubTunes : 1;
+	tmpAdj->upper = xs_status.pTune->nsubTunes;
  	gtk_adjustment_value_changed(tmpAdj);
  	}
 
  if (xs_fileinfowin)
  	{
-	tmpAdj = gtk_range_get_adjustment(GTK_RANGE(LUW("fileinfo_subctrl_adj")));
+ 	/* Check if we are currently playing and have a tune */
+ 	if (xs_status.pTune && xs_status.isPlaying)
+ 		{
+		tmpAdj = gtk_range_get_adjustment(GTK_RANGE(LUW("fileinfo_subctrl_adj")));
 
- 	tmpAdj->value = xs_status.currSong;
- 	tmpAdj->lower = 1;
-	tmpAdj->upper = xs_status.pTune->nsubTunes;
- 	gtk_adjustment_value_changed(tmpAdj);
+ 		tmpAdj->value = xs_status.currSong;
+ 		tmpAdj->lower = 1;
+		tmpAdj->upper = xs_status.pTune->nsubTunes;
+ 		gtk_adjustment_value_changed(tmpAdj);
+ 		isEnabled = TRUE; 		
+ 		} else
+ 		isEnabled = FALSE;
+	
+	/* Enable or disable subtune-control in fileinfo window */
+	gtk_widget_set_sensitive(LUW("fileinfo_subctrl_prev"), isEnabled);
+	gtk_widget_set_sensitive(LUW("fileinfo_subctrl_adj"), isEnabled);
+	gtk_widget_set_sensitive(LUW("fileinfo_subctrl_next"), isEnabled);
 	}
 }
 
 
+void xs_fileinfo_setsong(void)
+{
+ pthread_mutex_lock(&xs_mutex);
+ xs_status.currSong = gtk_range_get_adjustment(GTK_RANGE(LUW("fileinfo_subctrl_adj")))->value;
+ pthread_mutex_unlock(&xs_mutex);
+}
+
+
 void xs_subctrl_setsong(void)
 {
  pthread_mutex_lock(&xs_mutex);
@@ -533,10 +565,13 @@
 
 void xs_subctrl_prevsong(void)
 {
- pthread_mutex_lock(&xs_mutex);
- if (xs_status.currSong > 1)
-	xs_status.currSong--;
- pthread_mutex_unlock(&xs_mutex);
+ if (xs_status.pTune && xs_status.isPlaying)
+ 	{
+ 	pthread_mutex_lock(&xs_mutex);
+ 	if (xs_status.currSong > 1)
+		xs_status.currSong--;
+	pthread_mutex_unlock(&xs_mutex);
+	}
 
  xs_subctrl_update();
 }
@@ -544,10 +579,13 @@
 
 void xs_subctrl_nextsong(void)
 {
- pthread_mutex_lock(&xs_mutex);
- if (xs_status.currSong < xs_status.pTune->nsubTunes)
-	xs_status.currSong++;
- pthread_mutex_unlock(&xs_mutex);
+ if (xs_status.pTune && xs_status.isPlaying)
+ 	{
+ 	pthread_mutex_lock(&xs_mutex);
+ 	if (xs_status.currSong < xs_status.pTune->nsubTunes)
+		xs_status.currSong++;
+	pthread_mutex_unlock(&xs_mutex);
+	}
 
  xs_subctrl_update();
 }
@@ -563,6 +601,15 @@
 }
 
 
+gboolean xs_subctrl_keypress(GtkWidget *win, GdkEventKey *ev)
+{
+ if (ev->keyval == GDK_Escape)
+ 	xs_subctrl_close();
+
+ return FALSE;
+}
+
+
 void xs_subctrl_open()
 {
  GtkWidget *frame25, *hbox15, *subctrl_prev, *subctrl_current, *subctrl_next;
@@ -611,6 +658,7 @@
  gtk_box_pack_start (GTK_BOX (hbox15), subctrl_current, FALSE, TRUE, 0);
  gtk_scale_set_digits (GTK_SCALE (subctrl_current), 0);
  gtk_range_set_update_policy (GTK_RANGE (subctrl_current), GTK_UPDATE_DELAYED);
+ gtk_widget_grab_focus (subctrl_current);
 
  subctrl_next = gtk_button_new_with_label (" > ");
  gtk_widget_set_name (subctrl_next, "subctrl_next");
@@ -622,6 +670,9 @@
  gtk_signal_connect (GTK_OBJECT (subctrl_next), "clicked",
 	GTK_SIGNAL_FUNC (xs_subctrl_nextsong), NULL);
 
+ gtk_signal_connect (GTK_OBJECT (xs_subctrl), "key_press_event",
+ 	GTK_SIGNAL_FUNC (xs_subctrl_keypress), NULL);
+ 
  gtk_widget_show_all(xs_subctrl);
 }
 
@@ -877,6 +928,11 @@
 	} else {
 	/* If not, create a new one */
 	xs_fileinfowin = create_xs_fileinfowin();
+	
+	/* Connect additional signals */
+	gtk_signal_connect(GTK_OBJECT(
+		gtk_range_get_adjustment(GTK_RANGE(LUW("fileinfo_subctrl_adj")))),
+		"value_changed", GTK_SIGNAL_FUNC (xs_fileinfo_setsong), NULL);
 	}