1 /*
2 Glurp - A GTK+ client for Music Player Daemon
3 Copyright (C) 2004, 2005 Andrej Kacian
4
5 This program is free software; you can redistribute it and/or modify
6 it under the terms of the GNU General Public License as published by
7 the Free Software Foundation; either version 2 of the License, or
8 (at your option) any later version.
9
10 This program is distributed in the hope that it will be useful,
11 but WITHOUT ANY WARRANTY; without even the implied warranty of
12 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 GNU General Public License for more details.
14
15 You should have received a copy of the GNU General Public License
16 along with this program; if not, write to the Free Software
17 Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
18
19 http://musicpd.org/glurp.shtml
20
21 */
22 #include "support.h"
23 #include "gui.h"
24 #include "comm.h"
25 #include "player.h"
26 #include "mpd-callbacks.h"
27
28 extern GtkBuilder *builder;
29
mpd_status_changed_callback(MpdObj * mi,ChangedStatusType what,void * userdata)30 void mpd_status_changed_callback (MpdObj *mi, ChangedStatusType what, void *userdata) {
31 struct glurp_t* glurp = userdata;
32 gchar* temp;
33 int tel;
34
35 if (what != MPD_CST_ELAPSED_TIME) /* we don't want to have a line each second... */
36 debug ("Status change callback... what: %x", what);
37 if (what & MPD_CST_PLAYLIST) {
38 update_playlist(mpd_playlist_get_old_playlist_id(glurp->mpd));
39 /* update song name display for streams that change it on the fly */
40 glurp->current_song = mpd_playlist_get_current_song(glurp->mpd);
41 gui_show_song_name();
42 }
43
44 if (what & MPD_CST_VOLUME ) {
45 /* update volumebar */
46 gtk_scale_button_set_value(GTK_SCALE_BUTTON(gtk_builder_get_object(builder, "volumebar")), (gdouble)(mpd_status_get_volume(glurp->mpd)/100.0));
47 }
48 if (what & MPD_CST_SONGID ) {
49 /* save current song */
50 glurp->current_song = mpd_playlist_get_current_song(glurp->mpd);
51 gui_show_song_name();
52 }
53
54 if (what & MPD_CST_ELAPSED_TIME ) {
55 if(!glurp->progress_dragging) {
56 gtk_widget_set_sensitive(GTK_WIDGET(gtk_builder_get_object(builder, "progressbar")), TRUE);
57
58 /* +0.1 to make sure min<max is true... */
59 gtk_range_set_range(GTK_RANGE(gtk_builder_get_object(builder, "progressbar")), 0, (gdouble)mpd_status_get_total_song_time(glurp->mpd) + 0.1);
60 }
61 }
62
63 if ( what & MPD_CST_ELAPSED_TIME ) {
64 /* update progressbar unless the user is dragging it...*/
65 if(!glurp->progress_dragging) {
66 gtk_widget_set_sensitive(GTK_WIDGET(gtk_builder_get_object(builder, "progressbar")), TRUE);
67
68 gtk_range_set_value(GTK_RANGE(gtk_builder_get_object(builder, "progressbar")),
69 mpd_status_get_elapsed_song_time(glurp->mpd));
70 }
71
72 if(glurp->config->time_display_left)
73 tel = mpd_status_get_total_song_time(glurp->mpd) - mpd_status_get_elapsed_song_time(glurp->mpd);
74 else
75 tel = mpd_status_get_elapsed_song_time(glurp->mpd);
76
77 temp = g_strdup_printf("%s%02d:%02d", (glurp->config->time_display_left ? "-" : ""), tel/60, tel%60);
78 #if 0 /* strange: this makes tooltips disappear! */
79 gtk_button_set_label(GTK_BUTTON(gtk_builder_get_object(builder, "button_time")), temp);
80 /* gtk_tooltip_trigger_tooltip_query (gdk_display_get_default()); */
81 #else
82 gtk_label_set_text(GTK_LABEL(gtk_builder_get_object(builder, "label_time")), temp);
83 #endif
84 g_free(temp);
85 }
86
87 if ( what & MPD_CST_STATE ) {
88 switch (mpd_player_get_state(glurp->mpd)) {
89 case MPD_PLAYER_STOP:
90 gtk_entry_set_text(GTK_ENTRY(gtk_builder_get_object(builder, "entry_trackname")), "Stopped...");
91
92 /* change appropriate gui parts */
93 gtk_label_set_text(GTK_LABEL(gtk_builder_get_object(builder, "label_bitrate")), g_strdup("---kbps"));
94 gtk_label_set_text(GTK_LABEL(gtk_builder_get_object(builder, "label_mode")), g_strdup("---"));
95 break;
96 case MPD_PLAYER_PLAY:
97 glurp->play_state = MPD_PLAYER_PLAY;
98 gui_show_song_name();
99 break;
100 case MPD_PLAYER_PAUSE:
101 glurp->play_state = MPD_PLAYER_PAUSE;
102 break;
103 case MPD_PLAYER_UNKNOWN:
104 /* wazige sh*t */
105 break;
106 }
107 }
108 /* PERIODIC: update bitrate and mode labels */
109 if ( what & MPD_CST_AUDIOFORMAT ) {
110 char *text;
111 switch (mpd_status_get_channels(glurp->mpd)) {
112 case 0:
113 text = g_strdup("---");
114 break;
115 case 1:
116 text = g_strdup("Mono");
117 break;
118 case 2:
119 text = g_strdup("Stereo");
120 break;
121 default:
122 text = g_strdup("More");
123 break;
124 }
125 gtk_label_set_text(GTK_LABEL(gtk_builder_get_object(builder, "label_mode")), text);
126 }
127 if ( what & MPD_CST_BITRATE ) {
128 char *text;
129 int bitrate = mpd_status_get_bitrate(glurp->mpd);
130 if (bitrate == 0)
131 text = g_strdup("---kbps");
132 else
133 text = g_strdup_printf("%dkbps", bitrate);
134 gtk_label_set_text(GTK_LABEL(gtk_builder_get_object(builder, "label_bitrate")), text);
135 }
136
137 if ( what & MPD_CST_REPEAT ) {
138 /* PERIODIC: update repeat button */
139 if( mpd_player_get_repeat(glurp->mpd) ) {
140 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(gtk_builder_get_object(builder, "togglebutton_repeat")), TRUE);
141 } else {
142 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(gtk_builder_get_object(builder, "togglebutton_repeat")), FALSE);
143 }
144 }
145
146 if ( what & MPD_CST_RANDOM ) {
147 /* PERIODIC: update random button */
148 if( mpd_player_get_random(glurp->mpd) ) {
149 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(gtk_builder_get_object(builder, "togglebutton_random")), TRUE);
150 } else {
151 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(gtk_builder_get_object(builder, "togglebutton_random")), FALSE);
152 }
153 }
154
155 if ( what & MPD_CST_DATABASE ) {
156 /* PERIODIC: reenable Add window controls if we just finished updating db (>=0.11.0) */
157 statusbar_print("Database updated");
158 gui_updating_enable_add_controls();
159 glurp->updating_db = FALSE;
160 gtk_tree_view_set_model(GTK_TREE_VIEW(gtk_builder_get_object(builder, "treeview_add")), GTK_TREE_MODEL(glurp->gui_addtree));
161 populate_gui_add_tree();
162 }
163
164 // TODO: hmm misunderstood something; this should be done anywhere an error could occur (as it was... D'oh)
165 mpd_check_error(glurp->mpd);
166 }
167
mpd_error_callback(MpdObj * mi,int id,char * msg,void * userdata)168 int mpd_error_callback (MpdObj *mi, int id, char *msg, void *userdata) {
169 debug("Damn, mpd returned an error, %s", msg);
170 return 0;
171 }
172
mpd_connection_changed_callback(MpdObj * mi,int connect,void * userdata)173 void mpd_connection_changed_callback(MpdObj *mi, int connect, void *userdata) {
174 struct glurp_t* glurp = userdata;
175
176 if (connect) {
177 debug("We're connected!");
178 /* we're just connected */
179 debug("Connected to %s:%d", glurp->config->server_host, glurp->config->server_port);
180 statusbar_print("Connected to server %s:%d", glurp->config->server_host, glurp->config->server_port);
181
182 title_print(GTK_WIDGET(gtk_builder_get_object(builder, "glurp_window_main")), "%s:%d", glurp->config->server_host, glurp->config->server_port);
183
184 if( !STREAM_CAPABLE_MPD(glurp->mpd) ) {
185 debug("MPD VERSION TOO OLD, DISCONNECTING");
186 glurp_disconnect();
187 statusbar_print("MPD version too old, disconnecting");
188 } else {
189
190 gui_set_connected();
191
192 debug("Adding a timeout call to gui_update().");
193 /* force immediate schedule beacuse of time dependency */
194 gui_update_cb(GINT_TO_POINTER((guint)glurp->refresh_rate_status));
195 g_timeout_add((guint)glurp->config->refresh_rate, gui_update_cb, NULL);
196 }
197 } else {
198 debug("We're disconnected!");
199 gui_set_disconnected();
200 /* we're just disconnected */
201 }
202 }
203
204 // vim: et sw=2 smarttab
205