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