# HG changeset patch # User Matti Hamalainen # Date 1092806160 0 # Node ID 4406e91d2da3a88ea23a87d72dab0334b6e575cd # Parent 11d0f955571755f8d1d2c37880ecb02f0393b0cd 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. diff -r 11d0f9555717 -r 4406e91d2da3 src/xmms-sid.c --- 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 #include +#include +#include + #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); }