1 /*
2  *  Copyright (C) 2005 Marc Pavot <marc.pavot@gmail.com>
3  *
4  *  This program is free software; you can redistribute it and/or modify
5  *  it under the terms of the GNU General Public License as published by
6  *  the Free Software Foundation; either version 2, or (at your option)
7  *  any later version.
8  *
9  *  This program is distributed in the hope that it will be useful,
10  *  but WITHOUT ANY WARRANTY; without even the implied warranty of
11  *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
12  *  GNU General Public License for more details.
13  *
14  *  You should have received a copy of the GNU General Public License
15  *  along with this program; if not, write to the Free Software
16  *  Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
17  *
18  */
19 
20 #include "shell/ario-shell-lyrics.h"
21 #include <config.h>
22 #include <gtk/gtk.h>
23 #include <stdlib.h>
24 #include <string.h>
25 #include <time.h>
26 #include <glib/gi18n.h>
27 #include "ario-debug.h"
28 #include "widgets/ario-lyrics-editor.h"
29 #include "ario-util.h"
30 
31 static void ario_shell_lyrics_finalize (GObject *object);
32 static gboolean ario_shell_lyrics_window_delete_cb (GtkWidget *window,
33                                                     GdkEventAny *event,
34                                                     ArioShellLyrics *shell_lyrics);
35 static void ario_shell_lyrics_close_cb (GtkButton *button,
36                                         ArioShellLyrics *shell_lyrics);
37 static void ario_shell_lyrics_add_to_queue (ArioShellLyrics *shell_lyrics);
38 static void ario_shell_lyrics_song_changed_cb (ArioServer *server,
39                                                ArioShellLyrics *shell_lyrics);
40 static void ario_shell_lyrics_state_changed_cb (ArioServer *server,
41                                                 ArioShellLyrics *shell_lyrics);
42 
43 #define BASE_TITLE _("Lyrics")
44 
45 struct ArioShellLyricsPrivate
46 {
47         GtkWidget *lyrics_editor;
48 };
49 
50 static gboolean is_instantiated = FALSE;
51 
52 #define ARIO_SHELL_LYRICS_GET_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE ((o), TYPE_ARIO_SHELL_LYRICS, ArioShellLyricsPrivate))
G_DEFINE_TYPE(ArioShellLyrics,ario_shell_lyrics,GTK_TYPE_WINDOW)53 G_DEFINE_TYPE (ArioShellLyrics, ario_shell_lyrics, GTK_TYPE_WINDOW)
54 
55 static void
56 ario_shell_lyrics_class_init (ArioShellLyricsClass *klass)
57 {
58         ARIO_LOG_FUNCTION_START;
59         GObjectClass *object_class = G_OBJECT_CLASS (klass);
60 
61         object_class->finalize = ario_shell_lyrics_finalize;
62 
63         g_type_class_add_private (klass, sizeof (ArioShellLyricsPrivate));
64 }
65 
66 static void
ario_shell_lyrics_init(ArioShellLyrics * shell_lyrics)67 ario_shell_lyrics_init (ArioShellLyrics *shell_lyrics)
68 {
69         ARIO_LOG_FUNCTION_START;
70         shell_lyrics->priv = ARIO_SHELL_LYRICS_GET_PRIVATE (shell_lyrics);
71 
72         g_signal_connect(shell_lyrics,
73                          "delete_event",
74                          G_CALLBACK (ario_shell_lyrics_window_delete_cb),
75                          shell_lyrics);
76 
77         gtk_window_set_title (GTK_WINDOW (shell_lyrics), BASE_TITLE);
78         gtk_window_set_resizable (GTK_WINDOW (shell_lyrics), FALSE);
79 
80         gtk_container_set_border_width (GTK_CONTAINER (shell_lyrics), 5);
81 }
82 
83 GtkWidget *
ario_shell_lyrics_new(void)84 ario_shell_lyrics_new (void)
85 {
86         ARIO_LOG_FUNCTION_START;
87         ArioShellLyrics *shell_lyrics;
88         GtkWidget *close_button;
89         GList *childs_list;
90         GtkWidget *hbox;
91         ArioServer *server = ario_server_get_instance ();
92 
93         if (is_instantiated)
94                 return NULL;
95         else
96                 is_instantiated = TRUE;
97 
98         shell_lyrics = g_object_new (TYPE_ARIO_SHELL_LYRICS,
99                                      NULL);
100 
101         g_return_val_if_fail (shell_lyrics->priv != NULL, NULL);
102 
103         g_signal_connect_object (server,
104                                  "song_changed",
105                                  G_CALLBACK (ario_shell_lyrics_song_changed_cb),
106                                  shell_lyrics, 0);
107         g_signal_connect_object (server,
108                                  "state_changed",
109                                  G_CALLBACK (ario_shell_lyrics_state_changed_cb),
110                                  shell_lyrics, 0);
111 
112         close_button = gtk_button_new_from_icon_name ("window-close", GTK_ICON_SIZE_BUTTON);
113         shell_lyrics->priv->lyrics_editor = ario_lyrics_editor_new ();
114 
115         childs_list = gtk_container_get_children (GTK_CONTAINER (shell_lyrics->priv->lyrics_editor));
116         g_return_val_if_fail (childs_list, NULL);
117         hbox = g_list_last (childs_list)->data;
118         g_list_free (childs_list);
119         gtk_box_pack_end (GTK_BOX (hbox),
120                           close_button,
121                           FALSE, FALSE, 0);
122         gtk_box_reorder_child (GTK_BOX (hbox), close_button, 0);
123 
124         gtk_container_add (GTK_CONTAINER (shell_lyrics),
125                            shell_lyrics->priv->lyrics_editor);
126 
127         gtk_window_set_resizable (GTK_WINDOW (shell_lyrics), TRUE);
128         gtk_window_set_default_size (GTK_WINDOW (shell_lyrics), 350, 500);
129         gtk_window_set_position (GTK_WINDOW (shell_lyrics), GTK_WIN_POS_CENTER);
130 
131         g_signal_connect (close_button,
132                           "clicked",
133                           G_CALLBACK (ario_shell_lyrics_close_cb),
134                           shell_lyrics);
135 
136         ario_shell_lyrics_add_to_queue (shell_lyrics);
137 
138         return GTK_WIDGET (shell_lyrics);
139 }
140 
141 static void
ario_shell_lyrics_finalize(GObject * object)142 ario_shell_lyrics_finalize (GObject *object)
143 {
144         ARIO_LOG_FUNCTION_START;
145         ArioShellLyrics *shell_lyrics;
146 
147         g_return_if_fail (object != NULL);
148         g_return_if_fail (IS_ARIO_SHELL_LYRICS (object));
149 
150         shell_lyrics = ARIO_SHELL_LYRICS (object);
151 
152         g_return_if_fail (shell_lyrics->priv != NULL);
153 
154         is_instantiated = FALSE;
155 
156         G_OBJECT_CLASS (ario_shell_lyrics_parent_class)->finalize (object);
157 }
158 
159 static gboolean
ario_shell_lyrics_window_delete_cb(GtkWidget * window,GdkEventAny * event,ArioShellLyrics * shell_lyrics)160 ario_shell_lyrics_window_delete_cb (GtkWidget *window,
161                                     GdkEventAny *event,
162                                     ArioShellLyrics *shell_lyrics)
163 {
164         ARIO_LOG_FUNCTION_START;
165         gtk_widget_hide (GTK_WIDGET (shell_lyrics));
166         gtk_widget_destroy (GTK_WIDGET (shell_lyrics));
167 
168         return TRUE;
169 }
170 
171 static void
ario_shell_lyrics_close_cb(GtkButton * button,ArioShellLyrics * shell_lyrics)172 ario_shell_lyrics_close_cb (GtkButton *button,
173                             ArioShellLyrics *shell_lyrics)
174 {
175         ARIO_LOG_FUNCTION_START;
176         gtk_widget_hide (GTK_WIDGET (shell_lyrics));
177         gtk_widget_destroy (GTK_WIDGET (shell_lyrics));
178 }
179 
180 static void
ario_shell_lyrics_add_to_queue(ArioShellLyrics * shell_lyrics)181 ario_shell_lyrics_add_to_queue (ArioShellLyrics *shell_lyrics)
182 {
183         ARIO_LOG_FUNCTION_START;
184         ArioLyricsEditorData *data;
185         gchar *window_title;
186 
187         data = (ArioLyricsEditorData *) g_malloc0 (sizeof (ArioLyricsEditorData));
188 
189         if (!ario_server_is_connected ()
190             || ario_server_get_current_state () == ARIO_STATE_STOP
191             || ario_server_get_current_state () == ARIO_STATE_UNKNOWN) {
192                 data->artist = NULL;
193                 data->title = NULL;
194                 window_title = g_strdup (BASE_TITLE);
195         } else {
196                 data->artist = g_strdup (ario_server_get_current_artist ());
197                 data->title = g_strdup (ario_util_format_title (ario_server_get_current_song ()));
198                 window_title = g_strdup_printf ("%s - %s", BASE_TITLE, data->title);
199         }
200 
201         ario_lyrics_editor_push (ARIO_LYRICS_EDITOR (shell_lyrics->priv->lyrics_editor), data);
202         gtk_window_set_title (GTK_WINDOW (shell_lyrics), window_title);
203         g_free (window_title);
204 }
205 
206 static void
ario_shell_lyrics_song_changed_cb(ArioServer * server,ArioShellLyrics * shell_lyrics)207 ario_shell_lyrics_song_changed_cb (ArioServer *server,
208                                    ArioShellLyrics *shell_lyrics)
209 {
210         ARIO_LOG_FUNCTION_START;
211         ario_shell_lyrics_add_to_queue (shell_lyrics);
212 }
213 
214 static void
ario_shell_lyrics_state_changed_cb(ArioServer * server,ArioShellLyrics * shell_lyrics)215 ario_shell_lyrics_state_changed_cb (ArioServer *server,
216                                     ArioShellLyrics *shell_lyrics)
217 {
218         ARIO_LOG_FUNCTION_START;
219 
220         ario_shell_lyrics_add_to_queue (shell_lyrics);
221 }
222 
223