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