3
* Copyright (C) 2001 J�rgen Scheibengruber
5
* This program is free software; you can redistribute it and/or
6
* modify it under the terms of the GNU General Public License as
7
* published by the Free Software Foundation; either version 2 of the
8
* License, or (at your option) any later version.
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.
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
21
/*** the recording functionality */
25
#include <sys/types.h>
28
#include <glib/gi18n.h>
33
static int timeout_id = -1;
34
static GtkWidget *file_lbl, *type_lbl, *size_lbl, *length_lbl;
35
static GtkWidget *status_dialog;
37
extern GtkWidget *level;
39
void close_status_window(void)
43
g_source_remove(timeout_id);
48
gtk_widget_destroy(GTK_WIDGET(status_dialog));
51
tray_icon_items_set_sensible(TRUE);
52
recording_set_sensible(TRUE);
55
static char *seconds_to_full_string (guint seconds)
57
long days, hours, minutes;
59
const char *minutefmt;
61
const char *secondfmt;
63
days = seconds / (60 * 60 * 24);
64
hours = (seconds / (60 * 60));
65
minutes = (seconds / 60) - ((days * 24 * 60) + (hours * 60));
66
seconds = seconds % 60;
68
minutefmt = ngettext ("%ld minute", "%ld minutes", minutes);
69
hourfmt = ngettext ("%ld hour", "%ld hours", hours);
70
secondfmt = ngettext ("%ld second", "%ld seconds", seconds);
76
/* Translators: the format is "X hours X minutes X seconds" */
77
fmt = g_strdup_printf (_("%s %s %s"), hourfmt, minutefmt, secondfmt);
78
time = g_strdup_printf (fmt, hours, minutes, seconds);
82
/* Translators: the format is "X hours X minutes" */
83
fmt = g_strdup_printf (_("%s %s"), hourfmt, minutefmt);
84
time = g_strdup_printf (fmt, hours, minutes);
90
/* Translators: the format is "X minutes X seconds" */
91
fmt = g_strdup_printf (_("%s %s"), minutefmt, secondfmt);
92
time = g_strdup_printf (fmt, minutes, seconds);
95
time = g_strdup_printf (minutefmt, minutes);
101
/* Translators: the format is "X minutes X seconds" */
102
fmt = g_strdup_printf (_("%s %s"), minutefmt, secondfmt);
103
time = g_strdup_printf (fmt, minutes, seconds);
106
time = g_strdup_printf (minutefmt, minutes);
110
time = g_strdup_printf (secondfmt, seconds);
117
static gboolean timeout_cb(gpointer data)
119
Recording *recording = data;
123
gchar *utf8_name = NULL;
124
GError *error = NULL;
126
GFileInfo *file_info;
127
const gchar *content_type;
134
if (!gtk_widget_get_visible(status_dialog))
135
gtk_widget_show_all(status_dialog);
138
name = g_path_get_basename(recording->filename);
139
utf8_name = g_filename_to_utf8 (name, -1, NULL, NULL, NULL);
140
gtk_label_set_text(GTK_LABEL(file_lbl), utf8_name);
144
file = g_file_new_for_path(recording->filename);
145
file_info = g_file_query_info(file,
146
G_FILE_ATTRIBUTE_STANDARD_CONTENT_TYPE,
147
G_FILE_QUERY_INFO_NONE,
152
content_type = g_file_info_get_content_type(file_info);
153
description = g_content_type_get_description(content_type);
154
mime = g_content_type_get_mime_type(content_type);
155
type = g_strconcat(description, " (", mime, ")", NULL);
156
gtk_label_set_text(GTK_LABEL(type_lbl), type);
161
g_message ("%s", error->message);
167
g_object_unref(file_info);
168
g_object_unref(file);
171
s = get_file_size(recording->filename);
173
size = g_format_size_full(s, G_FORMAT_SIZE_LONG_FORMAT);
175
close_status_window();
176
recording_stop(recording);
179
text = g_strdup_printf(_("Error writing to file \"%s\"!"), utf8_name);
181
detail = g_strdup_printf("Please check for sufficient write file permissions.");
182
show_error_message(text, detail);
191
GstElement *pipeline;
195
pipeline = recording->pipeline;
197
if (gst_element_query_position (pipeline, GST_FORMAT_TIME, &val) && val != -1) {
199
secs = val / GST_SECOND;
201
length = seconds_to_full_string(secs);
202
gtk_label_set_text(GTK_LABEL(length_lbl), length);
206
gtk_label_set_text(GTK_LABEL(size_lbl), size);
212
void run_status_window(Recording *recording)
214
timeout_id = g_timeout_add(500, (GSourceFunc) timeout_cb, recording);
217
void stop_rec_button_clicked_cb(GtkButton *button, gpointer data)
219
Recording *recording = data;
220
close_status_window();
221
recording_stop(recording);
224
static gint delete_event_cb(GtkWidget* window, GdkEventAny* e, gpointer data)
226
stop_rec_button_clicked_cb(NULL, data);
230
GtkWidget* record_status_window(Recording *recording)
232
GtkWidget *btn_label, *btn_pixmap, *button;
233
GtkWidget *vbox, *btn_box, *hbox;
234
GtkWidget *f_lbl, *t_lbl, *s_lbl, *l_lbl;
235
GtkWidget *grid, *r_grid;
238
GtkWidget *level_box;
242
status_dialog = gtk_window_new(GTK_WINDOW_TOPLEVEL);
243
gtk_window_set_title(GTK_WINDOW(status_dialog),_("Gnomeradio recording status"));
244
gtk_window_set_resizable(GTK_WINDOW(status_dialog), FALSE);
246
vbox = gtk_box_new(GTK_ORIENTATION_VERTICAL, 12);
247
gtk_container_set_border_width(GTK_CONTAINER(vbox), 8);
249
grid = gtk_grid_new();
250
gtk_grid_set_row_spacing(GTK_GRID(grid), 5);
251
gtk_grid_set_column_spacing(GTK_GRID(grid), 15);
252
gtk_container_set_border_width(GTK_CONTAINER(grid), 5);
254
image = gtk_image_new_from_icon_name("gnomeradio", GTK_ICON_SIZE_DIALOG);
255
gtk_image_set_pixel_size(GTK_IMAGE(image), 42);
256
gtk_widget_set_valign(image, GTK_ALIGN_START);
257
gtk_grid_attach(GTK_GRID(grid), image, 0, 0, 1, 3);
259
str = g_strdup_printf(_("Recording from station %s"), recording->station);
260
text = g_strdup_printf("<big><b>%s</b></big>", str);
262
title = gtk_label_new(text);
264
gtk_widget_set_halign(title, GTK_ALIGN_START);
265
gtk_label_set_use_markup(GTK_LABEL(title), TRUE);
266
gtk_grid_attach(GTK_GRID(grid), title, 1, 0, 1, 1);
268
level_box = gtk_box_new(GTK_ORIENTATION_VERTICAL, 0);
269
level = gtk_progress_bar_new();
270
gtk_box_pack_start(GTK_BOX(level_box), level, FALSE, TRUE, 0);
271
gtk_grid_attach(GTK_GRID(grid), level_box, 1, 1, 1, 1);
273
expander = gtk_expander_new(_("Details"));
274
gtk_grid_attach(GTK_GRID(grid), expander, 1, 2, 1, 1);
276
r_grid = gtk_grid_new();
277
gtk_grid_set_row_spacing(GTK_GRID(r_grid), 5);
278
gtk_grid_set_column_spacing(GTK_GRID(r_grid), 15);
279
gtk_container_set_border_width(GTK_CONTAINER(r_grid), 5);
281
f_lbl = gtk_label_new(_("Name:"));
282
gtk_widget_set_halign(f_lbl, GTK_ALIGN_START);
283
gtk_grid_attach(GTK_GRID(r_grid), f_lbl, 0, 0, 1, 1);
285
t_lbl = gtk_label_new(_("Type:"));
286
gtk_widget_set_halign(t_lbl, GTK_ALIGN_START);
287
gtk_grid_attach(GTK_GRID(r_grid), t_lbl, 0, 1, 1, 1);
289
s_lbl = gtk_label_new(_("Size:"));
290
gtk_widget_set_halign(s_lbl, GTK_ALIGN_START);
291
gtk_grid_attach(GTK_GRID(r_grid), s_lbl, 0, 2, 1, 1);
293
l_lbl = gtk_label_new(_("Length:"));
294
gtk_widget_set_halign(l_lbl, GTK_ALIGN_START);
295
gtk_grid_attach(GTK_GRID(r_grid), l_lbl, 0, 3, 1, 1);
297
file_lbl = gtk_label_new(NULL);
298
gtk_label_set_ellipsize(GTK_LABEL(file_lbl), PANGO_ELLIPSIZE_START);
299
gtk_widget_set_halign(file_lbl, GTK_ALIGN_START);
300
gtk_grid_attach(GTK_GRID(r_grid), file_lbl, 1, 0, 1, 1);
302
type_lbl = gtk_label_new(NULL);
303
gtk_widget_set_halign(type_lbl, GTK_ALIGN_START);
304
gtk_grid_attach(GTK_GRID(r_grid), type_lbl, 1, 1, 1, 1);
306
size_lbl = gtk_label_new(NULL);
307
gtk_widget_set_halign(size_lbl, GTK_ALIGN_START);
308
gtk_grid_attach(GTK_GRID(r_grid), size_lbl, 1, 2, 1, 1);
310
length_lbl = gtk_label_new(NULL);
311
gtk_widget_set_halign(length_lbl, GTK_ALIGN_START);
312
gtk_grid_attach(GTK_GRID(r_grid), length_lbl, 1, 3, 1, 1);
314
gtk_container_add(GTK_CONTAINER(expander), r_grid);
316
button = gtk_button_new();
317
btn_box = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 0);
318
btn_label = gtk_label_new(_("Stop Recording"));
319
btn_pixmap = gtk_image_new_from_stock(GTK_STOCK_STOP, GTK_ICON_SIZE_BUTTON);
321
gtk_box_pack_start (GTK_BOX(btn_box), btn_pixmap, FALSE, FALSE, 2);
322
gtk_box_pack_start (GTK_BOX(btn_box), btn_label, FALSE, FALSE, 2);
324
gtk_container_add(GTK_CONTAINER(button), btn_box);
326
hbox = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 0);
327
gtk_box_pack_end (GTK_BOX(hbox), button, TRUE, FALSE, 0);
329
gtk_box_pack_start(GTK_BOX(vbox), grid, TRUE, TRUE, 0);
330
gtk_box_pack_start (GTK_BOX(vbox), hbox, FALSE, FALSE, 0);
332
gtk_container_add(GTK_CONTAINER(status_dialog), vbox);
333
gtk_widget_grab_focus (button);
335
g_signal_connect(G_OBJECT(status_dialog), "delete_event", G_CALLBACK(delete_event_cb), recording);
336
g_signal_connect(G_OBJECT(button), "clicked", G_CALLBACK(stop_rec_button_clicked_cb), recording);
337
g_signal_connect(G_OBJECT(status_dialog), "key-press-event", G_CALLBACK(key_press_event_cb), recording);
339
gtk_window_set_position(GTK_WINDOW(status_dialog), GTK_WIN_POS_CENTER);
341
return status_dialog;