"Fossies" - the Fresh Open Source Software Archive 
Member "mp3info-0.8.5a/gmp3info.c" (10 Nov 2006, 19838 Bytes) of package /linux/misc/old/mp3info-0.8.5a.tgz:
As a special service "Fossies" has tried to format the requested source page into HTML format using (guessed) C and C++ source code syntax highlighting (style:
standard) with prefixed line numbers and
code folding option.
Alternatively you can here
view or
download the uninterpreted source code file.
For more information about "gmp3info.c" see the
Fossies "Dox" file reference documentation.
1 /*
2 GMP3Info - Displays and allows editing of MP3 ID3 tags and various
3 technical aspects of MP3 files (GTK interface)
4
5 gmp3info.c - main part of GTK version of MP3Info
6
7 Copyright (C) 2000-2006 Cedric Tefft <cedric@phreaker.net>
8
9 This program is free software; you can redistribute it and/or modify
10 it under the terms of the GNU General Public License as published by
11 the Free Software Foundation; either version 2 of the License, or
12 (at your option) any later version.
13
14 This program is distributed in the hope that it will be useful,
15 but WITHOUT ANY WARRANTY; without even the implied warranty of
16 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
17 GNU General Public License for more details.
18
19 You should have received a copy of the GNU General Public License
20 along with this program; if not, write to the Free Software
21 Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
22
23 ***************************************************************************
24
25 rmc, Feb/2001 - Added a file open dialog
26 Added the Tech Info Window
27 Added an about box
28 GMP3Info can now be launched without an argument
29 */
30
31 #include <gtk/gtk.h>
32 #include <gdk/gdkkeysyms.h>
33 #define __MAIN
34 #include "mp3info.h"
35 #undef __MAIN
36
37 gchar *gtext_genre(unsigned char genre);
38 unsigned char gget_genre (char *genre);
39 int kill_if_esc(GtkWidget *widget, GdkEventKey *event, gpointer obj);
40 void create_techinfo_win(void);
41 void open_mp3_file(void);
42 int load_mp3(char *filename);
43 void read_new_mp3(GtkWidget *button, GtkWidget *file);
44 void quick_popup(char *title, char *message);
45 void about_mp3info(void);
46
47 GtkWidget *id3win,*id3win_frame_global;
48 GtkWidget *id3win_frame_title,*id3win_frame_artist,*id3win_frame_album;
49 GtkWidget *id3win_frame_year,*id3win_frame_comment, *id3win_frame_albyear;
50 GtkWidget *id3win_frame_genre,*id3win_frame_track,*id3win_frame_comtrack;
51 GtkWidget *id3win_text_title,*id3win_text_artist,*id3win_text_album;
52 GtkWidget *id3win_text_year,*id3win_text_comment,*id3win_combo_genre;
53 GtkWidget *id3win_text_track;
54 GtkWidget *id3win_frame_buttons,*id3win_ok_button,*id3win_cancel_button;
55 GtkWidget *id3win_menu_bar, *id3win_menu_file, *id3win_menu_fcont;
56 GtkWidget *id3win_menu_info, *id3win_menu_open, *id3win_menu_help;
57 GtkWidget *id3win_menu_hcont, *id3win_menu_about;
58 GList *genrelist=NULL;
59 gchar track[4]="",fbuf[4];
60
61 unsigned char genre=255;
62 FILE *fp;
63 unsigned char sig[2];
64 unsigned int track_num;
65 mp3info mp3;
66 int read_only=0;
67
68 void exit_save( GtkWidget *widget, GtkWidget *data) {
69 char tmp[31];
70
71 if (mp3.file) {
72 if(!read_only) {
73 strcpy(mp3.id3.title,gtk_entry_get_text(GTK_ENTRY(id3win_text_title)));
74 strcpy(mp3.id3.artist,gtk_entry_get_text(GTK_ENTRY(id3win_text_artist)));
75 strcpy(mp3.id3.album,gtk_entry_get_text(GTK_ENTRY(id3win_text_album)));
76 strcpy(mp3.id3.year,gtk_entry_get_text(GTK_ENTRY(id3win_text_year)));
77 strcpy(mp3.id3.comment,gtk_entry_get_text(GTK_ENTRY(id3win_text_comment)));
78 strcpy(tmp,gtk_entry_get_text(GTK_ENTRY(GTK_COMBO(id3win_combo_genre)->entry)));
79 mp3.id3.genre[0]=gget_genre(tmp);
80 strcpy(tmp,gtk_entry_get_text(GTK_ENTRY(id3win_text_track)));
81 mp3.id3.track[0]=atoi(tmp);
82 /* if (mp3.id3.track[0] > 255)
83 mp3.id3.track[0]=255;
84 */
85 write_tag(&mp3);
86 }
87
88 fclose(mp3.file);
89 }
90 gtk_main_quit();
91 }
92
93 int main(int argc, char *argv[] ) {
94
95 int i;
96 char track_text[4];
97
98
99 gtk_init (&argc, &argv);
100
101
102
103 id3win=gtk_window_new(GTK_WINDOW_TOPLEVEL);
104 gtk_window_set_title(GTK_WINDOW(id3win),"MP3info - An ID3 tag editor");
105 gtk_window_set_policy (GTK_WINDOW(id3win), FALSE,FALSE,FALSE);
106 gtk_widget_set_usize(id3win,450,360);
107 gtk_container_border_width(GTK_CONTAINER(id3win),5);
108 gtk_signal_connect(GTK_OBJECT(id3win), "delete_event", (GtkSignalFunc) gtk_exit, NULL);
109 id3win_frame_global=gtk_vbox_new(FALSE,5);
110
111 /* rmcc was here */
112
113 id3win_menu_bar = gtk_menu_bar_new();
114 gtk_widget_show(id3win_menu_bar);
115 gtk_box_pack_start(GTK_BOX(id3win_frame_global), id3win_menu_bar, FALSE, TRUE, 1);
116
117 id3win_menu_file = gtk_menu_item_new_with_label("File");
118 gtk_widget_show(id3win_menu_file);
119 gtk_container_add(GTK_CONTAINER(id3win_menu_bar), id3win_menu_file);
120 id3win_menu_fcont = gtk_menu_new();
121 gtk_menu_item_set_submenu(GTK_MENU_ITEM(id3win_menu_file), id3win_menu_fcont);
122
123 id3win_menu_open = gtk_menu_item_new_with_label("Open New ");
124 gtk_widget_show(id3win_menu_open);
125 gtk_container_add(GTK_CONTAINER(id3win_menu_fcont), id3win_menu_open);
126 gtk_signal_connect(GTK_OBJECT(id3win_menu_open), "activate",
127 GTK_SIGNAL_FUNC(open_mp3_file),
128 NULL);
129
130 id3win_menu_info = gtk_menu_item_new_with_label("Info ");
131 gtk_widget_show(id3win_menu_info);
132 gtk_container_add(GTK_CONTAINER(id3win_menu_fcont), id3win_menu_info);
133 gtk_signal_connect(GTK_OBJECT(id3win_menu_info), "activate",
134 GTK_SIGNAL_FUNC(create_techinfo_win),
135 NULL);
136
137 id3win_menu_help = gtk_menu_item_new_with_label(" Help");
138 gtk_widget_show(id3win_menu_help);
139 gtk_container_add(GTK_CONTAINER(id3win_menu_bar), id3win_menu_help);
140 gtk_menu_item_right_justify(GTK_MENU_ITEM(id3win_menu_help));
141 id3win_menu_hcont = gtk_menu_new();
142 gtk_menu_item_set_submenu(GTK_MENU_ITEM(id3win_menu_help), id3win_menu_hcont);
143
144 id3win_menu_about = gtk_menu_item_new_with_label("About ");
145 gtk_widget_show(id3win_menu_about);
146 gtk_container_add(GTK_CONTAINER(id3win_menu_hcont), id3win_menu_about);
147 gtk_signal_connect(GTK_OBJECT(id3win_menu_about), "activate",
148 GTK_SIGNAL_FUNC(about_mp3info),
149 NULL);
150
151
152 /* rmcc has left the building */
153
154 id3win_frame_title=gtk_frame_new("Title");
155 gtk_container_border_width(GTK_CONTAINER(id3win_frame_title),5);
156 id3win_text_title=gtk_entry_new_with_max_length(30);
157 gtk_container_add(GTK_CONTAINER(id3win_frame_title),id3win_text_title);
158 gtk_box_pack_start(GTK_BOX(id3win_frame_global),id3win_frame_title,TRUE,TRUE,0);
159
160 id3win_frame_artist=gtk_frame_new("Artist");
161 gtk_container_border_width(GTK_CONTAINER(id3win_frame_artist),5);
162 id3win_text_artist=gtk_entry_new_with_max_length(30);
163 gtk_container_add(GTK_CONTAINER(id3win_frame_artist),id3win_text_artist);
164 gtk_box_pack_start(GTK_BOX(id3win_frame_global),id3win_frame_artist,TRUE,TRUE,0);
165
166 id3win_frame_albyear=gtk_hbox_new(FALSE,30);
167 id3win_frame_album=gtk_frame_new("Album");
168 gtk_container_border_width(GTK_CONTAINER(id3win_frame_album),5);
169 id3win_text_album=gtk_entry_new_with_max_length(30);
170 gtk_container_add(GTK_CONTAINER(id3win_frame_album),id3win_text_album);
171 gtk_box_pack_start(GTK_BOX(id3win_frame_albyear),id3win_frame_album,TRUE,TRUE,0);
172
173 id3win_frame_year=gtk_frame_new("Year");
174 gtk_widget_set_usize(id3win_frame_year,2,0);
175 gtk_container_border_width(GTK_CONTAINER(id3win_frame_year),5);
176 id3win_text_year=gtk_entry_new_with_max_length(4);
177 gtk_container_add(GTK_CONTAINER(id3win_frame_year),id3win_text_year);
178 gtk_box_pack_start(GTK_BOX(id3win_frame_albyear),id3win_frame_year,TRUE,TRUE,0);
179 gtk_box_pack_start(GTK_BOX(id3win_frame_global),id3win_frame_albyear,TRUE,TRUE,0);
180
181 id3win_frame_comtrack=gtk_hbox_new(FALSE,30);
182 id3win_frame_comment=gtk_frame_new("Comment");
183 gtk_container_border_width(GTK_CONTAINER(id3win_frame_comment),5);
184 id3win_text_comment=gtk_entry_new_with_max_length(30);
185 gtk_container_add(GTK_CONTAINER(id3win_frame_comment),id3win_text_comment);
186 gtk_box_pack_start(GTK_BOX(id3win_frame_comtrack),id3win_frame_comment,TRUE,TRUE,0);
187
188 id3win_frame_track=gtk_frame_new("Track");
189 gtk_widget_set_usize(id3win_frame_track,2,0);
190 gtk_container_border_width(GTK_CONTAINER(id3win_frame_track),5);
191 id3win_text_track=gtk_entry_new_with_max_length(3);
192 gtk_container_add(GTK_CONTAINER(id3win_frame_track),id3win_text_track);
193 gtk_box_pack_start(GTK_BOX(id3win_frame_comtrack),id3win_frame_track,TRUE,TRUE,0);
194 gtk_box_pack_start(GTK_BOX(id3win_frame_global),id3win_frame_comtrack,TRUE,TRUE,0);
195
196 id3win_frame_genre=gtk_frame_new("Genre");
197 gtk_container_border_width(GTK_CONTAINER(id3win_frame_genre),5);
198 id3win_combo_genre=gtk_combo_new();
199 for(i=0;i<MAXGENRE+2;i++) {
200 genrelist = g_list_append(genrelist, typegenre[galphagenreindex[i]]);
201 }
202 gtk_combo_set_popdown_strings(GTK_COMBO(id3win_combo_genre),genrelist);
203 gtk_container_add(GTK_CONTAINER(id3win_frame_genre),id3win_combo_genre);
204 gtk_box_pack_start(GTK_BOX(id3win_frame_global),id3win_frame_genre,TRUE,TRUE,0);
205
206 id3win_frame_buttons=gtk_hbox_new(TRUE,30);
207 id3win_ok_button=gtk_button_new_with_label("OK");
208 gtk_box_pack_start(GTK_BOX(id3win_frame_buttons),id3win_ok_button,TRUE,TRUE,0);
209 if(read_only) {
210 gtk_widget_set_sensitive (id3win_text_title, FALSE);
211 gtk_widget_set_sensitive (id3win_text_artist, FALSE);
212 gtk_widget_set_sensitive (id3win_text_album, FALSE);
213 gtk_widget_set_sensitive (id3win_text_year, FALSE);
214 gtk_widget_set_sensitive (id3win_text_comment, FALSE);
215 gtk_widget_set_sensitive (id3win_text_track, FALSE);
216 gtk_widget_set_sensitive (id3win_combo_genre, FALSE);
217 } else {
218 id3win_cancel_button=gtk_button_new_with_label("Cancel");
219 gtk_box_pack_start(GTK_BOX(id3win_frame_buttons),id3win_cancel_button,TRUE,TRUE,0);
220 gtk_signal_connect (GTK_OBJECT (id3win_cancel_button), "clicked", GTK_SIGNAL_FUNC (gtk_exit), NULL);
221 }
222
223 gtk_widget_set_usize(id3win_frame_buttons,30,20);
224 gtk_box_pack_start(GTK_BOX(id3win_frame_global),id3win_frame_buttons,TRUE,TRUE,0);
225
226 gtk_container_add(GTK_CONTAINER(id3win),id3win_frame_global);
227
228 gtk_signal_connect (GTK_OBJECT (id3win_ok_button), "clicked", GTK_SIGNAL_FUNC (exit_save), NULL);
229
230 gtk_widget_show_all(id3win);
231
232 memset(&mp3,0,sizeof(mp3info));
233
234 if(argc==2) {
235 if (! load_mp3(argv[1])) {
236 exit(0);
237 }
238 gtk_entry_set_text(GTK_ENTRY(id3win_text_title),mp3.id3.title);
239 gtk_entry_set_text(GTK_ENTRY(id3win_text_artist),mp3.id3.artist);
240 gtk_entry_set_text(GTK_ENTRY(id3win_text_album),mp3.id3.album);
241 gtk_entry_set_text(GTK_ENTRY(id3win_text_year),mp3.id3.year);
242 gtk_entry_set_text(GTK_ENTRY(id3win_text_comment),mp3.id3.comment);
243 if(mp3.id3.track[0] > 0)
244 sprintf(track_text,"%d",(int)mp3.id3.track[0]);
245 else
246 track_text[0]=0;
247 gtk_entry_set_text(GTK_ENTRY(id3win_text_track),track_text);
248 gtk_entry_set_text(GTK_ENTRY(GTK_COMBO(id3win_combo_genre)->entry), gtext_genre(mp3.id3.genre[0]));
249
250 } else {
251 open_mp3_file();
252 }
253
254 gtk_main();
255 return(0);
256
257 }
258
259 gchar *gtext_genre(unsigned char genre) {
260 int genre_num = (int) genre;
261
262 if(genre_num <= MAXGENRE) {
263 return((gchar *)typegenre[genre_num]);
264 } else {
265 return((gchar *)"");
266 }
267 }
268
269 unsigned char gget_genre (char *genre) {
270 int num_genre=0;
271
272 if(genre[0] == '\0') { return 255; }
273
274 sscanf(genre,"%u",&num_genre);
275 if(num_genre == 0) {
276 if(genre[0] != '0') {
277 while(num_genre++ <= MAXGENRE) {
278 if(!strcasecmp(genre,typegenre[num_genre-1])) {
279 return num_genre-1;
280 }
281 }
282 num_genre=256;
283 }
284 }
285
286 if(num_genre < 0 || num_genre > MAXGENRE) {
287 num_genre=255;
288 }
289 return (unsigned char) num_genre;
290 }
291
292 /* rmcc was here */
293
294 void create_techinfo_win(void) {
295 GtkWidget *infowin_main, *infowin_main_frame;
296 GtkWidget *infowin_exit_button, *infowin_button_frame;
297 GtkWidget *infowin_text_media, *infowin_text_bitrate;
298 GtkWidget *infowin_text_emphasis, *infowin_text_crc;
299 GtkWidget *infowin_text_copyright, *infowin_text_original;
300 GtkWidget *infowin_text_padding, *infowin_text_length;
301 GtkWidget *infowin_text_frequency;
302 int ibuf,ibuf2;
303 char buf[1023];
304 char *layer_text[] = { "I", "II", "III" };
305
306
307 infowin_main = gtk_window_new(GTK_WINDOW_TOPLEVEL);
308 gtk_widget_set_usize(infowin_main, 230, 300);
309 gtk_container_border_width(GTK_CONTAINER(infowin_main), 15);
310 gtk_window_set_title(GTK_WINDOW(infowin_main), "MP3 Technical Info");
311 gtk_window_set_policy(GTK_WINDOW(infowin_main), FALSE, FALSE, FALSE);
312 gtk_signal_connect_object(GTK_OBJECT(infowin_main), "key_press_event",
313 GTK_SIGNAL_FUNC(kill_if_esc),
314 (gpointer) infowin_main);
315 infowin_main_frame=gtk_vbox_new(FALSE,5);
316
317 if (mp3.header_isvalid) {
318
319 sprintf(buf,"Media Type: MPEG %s Layer %s",mp3.header.version ? ((mp3.header.version==2) ? "2.5" : "1.0") : "2.0", layer_text[header_layer(&mp3.header)-1]);
320 infowin_text_media=gtk_label_new(buf);
321 gtk_box_pack_start(GTK_BOX(infowin_main_frame),infowin_text_media,TRUE,TRUE,0);
322
323 sprintf(buf,"Bitrate: %i KB/s",header_bitrate(&mp3.header));
324 infowin_text_bitrate=gtk_label_new(buf);
325 gtk_box_pack_start(GTK_BOX(infowin_main_frame),infowin_text_bitrate,TRUE,TRUE,0);
326
327 sprintf(buf,"Frequency: %iKHz",header_frequency(&mp3.header)/1000);
328 infowin_text_frequency=gtk_label_new(buf);
329 gtk_box_pack_start(GTK_BOX(infowin_main_frame),infowin_text_frequency,TRUE,TRUE,0);
330
331 ibuf=mp3.seconds / 60;
332 ibuf2=mp3.seconds % 60;
333 sprintf(buf,"Length: %i:%02i",ibuf,ibuf2);
334 infowin_text_length=gtk_label_new(buf);
335 gtk_box_pack_start(GTK_BOX(infowin_main_frame),infowin_text_length,TRUE,TRUE,0);
336
337 sprintf(buf,"Emphasis: %s",header_emphasis(&mp3.header));
338 infowin_text_emphasis=gtk_label_new(buf);
339 gtk_box_pack_start(GTK_BOX(infowin_main_frame),infowin_text_emphasis,TRUE,TRUE,0);
340
341 sprintf(buf,"CRC: %s",!mp3.header.crc ? "Yes" : "No");
342 infowin_text_crc=gtk_label_new(buf);
343 gtk_box_pack_start(GTK_BOX(infowin_main_frame),infowin_text_crc,TRUE,TRUE,0);
344
345 sprintf(buf,"Copyright: %s",mp3.header.copyright ? "Yes" : "No");
346 infowin_text_copyright=gtk_label_new(buf);
347 gtk_box_pack_start(GTK_BOX(infowin_main_frame),infowin_text_copyright,TRUE,TRUE,0);
348
349 sprintf(buf,"Original: %s",mp3.header.original ? "Yes" : "No");
350 infowin_text_original=gtk_label_new(buf);
351 gtk_box_pack_start(GTK_BOX(infowin_main_frame),infowin_text_original,TRUE,TRUE,0);
352
353 sprintf(buf,"Padding: %s",mp3.header.padding ? "Yes" : "No");
354 infowin_text_padding=gtk_label_new(buf);
355 gtk_box_pack_start(GTK_BOX(infowin_main_frame),infowin_text_padding,TRUE,TRUE,0);
356
357 } else {
358
359 sprintf(buf,"This file's header\nis invalid.\n\nNo information\navailable");
360 infowin_text_media=gtk_label_new(buf);
361 gtk_box_pack_start(GTK_BOX(infowin_main_frame),infowin_text_media,TRUE,TRUE,0);
362
363 }
364
365 infowin_button_frame=gtk_hbox_new(TRUE,30);
366 gtk_widget_set_usize(infowin_button_frame,30,20);
367 gtk_box_pack_start(GTK_BOX(infowin_main_frame),infowin_button_frame,TRUE,TRUE,0);
368
369
370 infowin_exit_button = gtk_button_new_with_label("Exit");
371 gtk_widget_show(infowin_exit_button);
372 gtk_box_pack_end(GTK_BOX(infowin_button_frame), infowin_exit_button, FALSE, TRUE, 0);
373 gtk_signal_connect_object(GTK_OBJECT(infowin_exit_button), "pressed",
374 GTK_SIGNAL_FUNC(gtk_widget_destroy),
375 GTK_OBJECT(infowin_main));
376
377 gtk_container_add(GTK_CONTAINER(infowin_main),infowin_main_frame);
378 gtk_widget_show_all(infowin_main);
379
380
381
382 }
383
384 void open_mp3_file(void) {
385 GtkWidget *filewin_main;
386
387 filewin_main=gtk_file_selection_new("Use another MP3 File");
388 gtk_signal_connect_object(GTK_OBJECT(filewin_main), "key_press_event",
389 (GtkSignalFunc) kill_if_esc, (gpointer) filewin_main);
390 gtk_signal_connect_object(GTK_OBJECT(GTK_FILE_SELECTION(filewin_main)->cancel_button), "pressed",
391 GTK_SIGNAL_FUNC(gtk_widget_destroy),
392 GTK_OBJECT(filewin_main));
393 gtk_signal_connect(GTK_OBJECT(GTK_FILE_SELECTION(filewin_main)->ok_button), "clicked",
394 (GtkSignalFunc) read_new_mp3,
395 filewin_main);
396 gtk_widget_show(filewin_main);
397
398
399
400 }
401
402 void read_new_mp3(GtkWidget *button, GtkWidget *file) {
403 char *filename;
404
405 filename = (char *)gtk_file_selection_get_filename(GTK_FILE_SELECTION(file));
406 if (load_mp3(filename) == 1) {
407 gtk_widget_destroy(file);
408 gtk_entry_set_text(GTK_ENTRY(id3win_text_title),mp3.id3.title);
409 gtk_entry_set_text(GTK_ENTRY(id3win_text_artist),mp3.id3.artist);
410 gtk_entry_set_text(GTK_ENTRY(id3win_text_album),mp3.id3.album);
411 gtk_entry_set_text(GTK_ENTRY(id3win_text_year),mp3.id3.year);
412 gtk_entry_set_text(GTK_ENTRY(id3win_text_comment),mp3.id3.comment);
413 gtk_entry_set_text(GTK_ENTRY(id3win_text_track),(char *)mp3.id3.track);
414 gtk_entry_set_text(GTK_ENTRY(GTK_COMBO(id3win_combo_genre)->entry), gtext_genre(mp3.id3.genre[0]));
415 }
416
417 }
418
419 int load_mp3(char *filename) {
420
421 mp3info nmp3;
422
423 memset(&nmp3,0,sizeof(mp3info));
424
425 if ( !( nmp3.file=fopen(filename,"rb+") ) ) {
426 if((nmp3.file=fopen(filename,"rb")))
427 read_only=1;
428 else {
429 if (id3win) {
430 quick_popup("Error in file", "Error opening MP3 file.");
431 } else {
432 g_print("Error opening MP3 file.");
433 }
434 return 0;
435 }
436 }
437
438 nmp3.filename=filename;
439 get_mp3_info(&nmp3,SCAN_QUICK,0);
440 if(!nmp3.header_isvalid && !nmp3.id3_isvalid) {
441 if (id3win) {
442 quick_popup("Error in file", "File is corrupt or is not a standard MP3 file!");
443 } else {
444 g_print("File is corrupt or is not a standard MP3 file!\n");
445 }
446 return 0;
447 } else {
448 mp3=nmp3;
449 return 1;
450 }
451 return 0;
452
453 }
454
455 int kill_if_esc(GtkWidget *widget, GdkEventKey *event, gpointer obj) {
456
457 if(event && event->type == GDK_KEY_PRESS && event->keyval == GDK_Escape) {
458 gtk_widget_destroy(GTK_WIDGET(obj));
459 gtk_signal_emit_stop_by_name(GTK_OBJECT(widget), "key_press_event");
460 }
461
462 return(TRUE);
463 }
464
465 void quick_popup(char *title, char *message) {
466 GtkWidget *popupwin, *popupwin_main, *popupwin_msg, *popupwin_ok;
467 char *markup;
468
469 popupwin = gtk_dialog_new();
470 gtk_widget_realize(popupwin);
471 gtk_container_border_width(GTK_CONTAINER(popupwin), 12);
472 gtk_window_set_title(GTK_WINDOW(popupwin), title);
473 popupwin_main = GTK_DIALOG(popupwin)->vbox;
474 popupwin_msg=gtk_label_new(NULL);
475 markup = g_markup_printf_escaped("<span foreground=\"blue\">%s</span>",message);
476 gtk_label_set_markup(GTK_LABEL(popupwin_msg),markup);
477 g_free (markup);
478 gtk_box_pack_start(GTK_BOX(popupwin_main),popupwin_msg,TRUE,TRUE,0);
479 popupwin_ok = gtk_button_new_with_label(" OK ");
480 gtk_signal_connect_object(GTK_OBJECT(popupwin_ok), "clicked",
481 GTK_SIGNAL_FUNC(gtk_widget_destroy),
482 GTK_OBJECT(popupwin));
483 gtk_signal_connect_object(GTK_OBJECT(popupwin), "key_press_event",
484 (GtkSignalFunc) kill_if_esc, (gpointer) popupwin);
485 gtk_box_pack_end(GTK_BOX(popupwin_main), popupwin_ok, TRUE, FALSE, 0);
486 gtk_widget_show_all(popupwin);
487
488 }
489
490 void about_mp3info(void) {
491 quick_popup(VERSION,"MP3Info\n"
492 " An ID3 Tag Editor\n\n\n"
493 " Original author: Ricardo Cerqueira <rmc@plug.pt>\n"
494 " Current maintainer: Cedric Tefft <cedric@phreaker.net>\n"
495 " (C) 1999-2006 Ricardo Cerqueira, Cedric Tefft\n\n");
496 }
497
498 /* rmcc has left the building */