changeset 140:8b9c14540e53

- Added UADE-style popup subsong-selector
author Matti Hamalainen <ccr@tnsp.org>
date Thu, 26 Feb 2004 11:41:00 +0000
parents 7cc2cc5f6f21
children 7327a985aee8
files src/xmms-sid.c
diffstat 1 files changed, 133 insertions(+), 16 deletions(-) [+]
line wrap: on
line diff
--- a/src/xmms-sid.c	Thu Feb 26 04:31:01 2004 +0000
+++ b/src/xmms-sid.c	Thu Feb 26 11:41:00 2004 +0000
@@ -111,7 +111,13 @@
 struct t_xs_cfg			xs_cfg;
 t_xs_status			xs_status;
 t_xs_player			*xs_player	= NULL;
+static GtkWidget		*xs_fileinfowin = NULL,
+				*xs_subctrl	= NULL;
+static GtkObject		*xs_subctrl_adj = NULL;
+static t_xs_tune		*xs_fileinfotune = NULL;
+static t_xs_stil_node		*xs_fileinfostil = NULL;
 
+void	xs_subctrl_close(void);
 
 /*
  * Initialize XMMS-SID
@@ -434,6 +440,9 @@
 void xs_stop(void)
 {
  XSDEBUG("STOP_REQ\n");
+
+ xs_subctrl_close();
+
  if (xs_status.isPlaying)
 	{
 	/* Stop playing */
@@ -456,11 +465,128 @@
  */
 void xs_pause(short pauseState)
 {
+ xs_subctrl_close();
  xs_plugin_ip.output->pause(pauseState);
 }
 
 
 /*
+ * Pop-up subtune selector
+ */
+void xs_subctrl_update(void)
+{
+ if (xs_subctrl)
+ 	{
+ 	GTK_ADJUSTMENT(xs_subctrl_adj)->value = xs_status.currSong;
+ 	gtk_adjustment_value_changed(GTK_ADJUSTMENT(xs_subctrl_adj));
+ 	}
+}
+
+
+void xs_subctrl_setsong(void)
+{
+ pthread_mutex_lock(&xs_mutex);
+ xs_status.currSong = GTK_ADJUSTMENT(xs_subctrl_adj)->value;
+ pthread_mutex_unlock(&xs_mutex);
+}
+
+
+void xs_subctrl_prevsong(void)
+{
+ pthread_mutex_lock(&xs_mutex);
+ if (xs_status.currSong > 1)
+	xs_status.currSong--;
+ pthread_mutex_unlock(&xs_mutex);
+
+ xs_subctrl_update();
+}
+
+
+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);
+
+ xs_subctrl_update();
+}
+
+
+void xs_subctrl_close(void)
+{
+ if (xs_subctrl)
+ 	{
+	gtk_widget_destroy(xs_subctrl);
+	xs_subctrl = NULL;
+	}
+}
+
+
+void xs_subctrl_open()
+{
+ GtkWidget *frame25, *hbox15, *subctrl_prev, *subctrl_current, *subctrl_next;
+
+ if (xs_subctrl) return;
+
+ /* Create the pop-up window */
+ xs_subctrl = gtk_window_new (GTK_WINDOW_DIALOG);
+ gtk_widget_set_name (xs_subctrl, "xs_subctrl");
+ gtk_object_set_data (GTK_OBJECT (xs_subctrl), "xs_subctrl", xs_subctrl);
+
+ gtk_window_set_title(GTK_WINDOW(xs_subctrl), "Subtune Control");
+ gtk_window_set_position(GTK_WINDOW(xs_subctrl), GTK_WIN_POS_MOUSE);
+ gtk_container_set_border_width(GTK_CONTAINER(xs_subctrl), 0);
+ gtk_window_set_policy(GTK_WINDOW(xs_subctrl), FALSE, FALSE, FALSE);
+
+ gtk_signal_connect(GTK_OBJECT(xs_subctrl), "destroy",
+	GTK_SIGNAL_FUNC(gtk_widget_destroyed), &xs_subctrl);
+
+ gtk_signal_connect(GTK_OBJECT(xs_subctrl), "focus_out_event",
+	GTK_SIGNAL_FUNC(xs_subctrl_close), NULL);
+
+ gtk_widget_realize(xs_subctrl);
+ gdk_window_set_decorations(xs_subctrl->window, 0);
+
+
+ /* Create the control widgets */
+ frame25 = gtk_frame_new (NULL);
+ gtk_container_add (GTK_CONTAINER (xs_subctrl), frame25);
+ gtk_container_set_border_width (GTK_CONTAINER (frame25), 2);
+ gtk_frame_set_shadow_type (GTK_FRAME (frame25), GTK_SHADOW_OUT);
+
+ hbox15 = gtk_hbox_new (FALSE, 4);
+ gtk_container_add (GTK_CONTAINER (frame25), hbox15);
+
+ subctrl_prev = gtk_button_new_with_label (" < ");
+ gtk_widget_set_name (subctrl_prev, "subctrl_prev");
+ gtk_box_pack_start (GTK_BOX (hbox15), subctrl_prev, FALSE, FALSE, 0);
+
+ xs_subctrl_adj = gtk_adjustment_new (xs_status.currSong, 1, xs_status.pTune->nsubTunes, 1, 1, 0);
+ gtk_signal_connect (GTK_OBJECT (xs_subctrl_adj), "value_changed",
+	GTK_SIGNAL_FUNC (xs_subctrl_setsong), NULL);
+
+ subctrl_current = gtk_hscale_new (GTK_ADJUSTMENT(xs_subctrl_adj));
+ gtk_widget_set_name (subctrl_current, "subctrl_current");
+ 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);
+
+ subctrl_next = gtk_button_new_with_label (" > ");
+ gtk_widget_set_name (subctrl_next, "subctrl_next");
+ gtk_box_pack_start (GTK_BOX (hbox15), subctrl_next, FALSE, FALSE, 0);
+
+ gtk_signal_connect (GTK_OBJECT (subctrl_prev), "clicked",
+	GTK_SIGNAL_FUNC (xs_subctrl_prevsong), NULL);
+
+ gtk_signal_connect (GTK_OBJECT (subctrl_next), "clicked",
+	GTK_SIGNAL_FUNC (xs_subctrl_nextsong), NULL);
+
+ gtk_widget_show_all(xs_subctrl);
+}
+
+
+/*
  * Set the time-seek position
  * (the playing thread will do the "seeking" aka song-change)
  */
@@ -472,21 +598,17 @@
  /* Act according to settings */ 
  switch (xs_cfg.subsongControl) {
  case XS_SSC_SEEK:
-	pthread_mutex_lock(&xs_mutex);
 	if (iTime < xs_status.lastTime)
-		{
-		if (xs_status.currSong > 1)
-			xs_status.currSong--;
-		} else
+		xs_subctrl_prevsong();
+		else
 	if (iTime > xs_status.lastTime)
-		{
-		if (xs_status.currSong < xs_status.pTune->nsubTunes)
-			xs_status.currSong++;
-		}
-
-	pthread_mutex_unlock(&xs_mutex);
+		xs_subctrl_nextsong();
 	break;
 
+ case XS_SSC_POPUP:
+ 	xs_subctrl_open();
+ 	break;
+ 
  /* If we have song-position patch, check settings */
 #ifdef HAVE_SONG_POSITION
  case XS_SSC_PATCH:
@@ -625,19 +747,14 @@
 /*
  * File-information window
  */
-static GtkWidget	*xs_fileinfowin = NULL;
-static t_xs_tune	*xs_fileinfotune = NULL;
-static t_xs_stil_node	*xs_fileinfostil = NULL;
 #define LUW(x...)	lookup_widget(xs_fileinfowin, ## x)
 
-
 void xs_fileinfo_ok(void)
 {
  gtk_widget_destroy(xs_fileinfowin);
  xs_fileinfowin = NULL;
 }
 
-
 void xs_fileinfo_subtune(GtkWidget *widget, void *data)
 {
  t_xs_stil_subnode *tmpNode;