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