Mercurial > hg > xmms-sid
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;