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
exit_save(GtkWidget * widget,GtkWidget * data)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
main(int argc,char * argv[])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
gtext_genre(unsigned char genre)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
gget_genre(char * genre)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
create_techinfo_win(void)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
open_mp3_file(void)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
read_new_mp3(GtkWidget * button,GtkWidget * file)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
load_mp3(char * filename)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
kill_if_esc(GtkWidget * widget,GdkEventKey * event,gpointer obj)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
quick_popup(char * title,char * message)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
about_mp3info(void)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 */
499