45 #define VERSION "0.7.2"
46 #define PACKAGE_NAME "mp3splt-gtk"
53 #include <glib/gi18n.h>
55 #include <gdk/gdkkeysyms.h>
65 #include "mp3splt-gtk.h"
67 #include "split_files.h"
68 #include "utilities.h"
69 #include "preferences_tab.h"
70 #include "freedb_tab.h"
71 #include "special_split.h"
72 #include "utilities.h"
73 #include "player_tab.h"
77 #include "preferences_manager.h"
78 #include "player_tab.h"
80 #include "ui_manager.h"
83 GtkWidget *window = NULL;
84 GtkAccelGroup *window_accel_group = NULL;
87 GtkWidget *status_bar;
90 gint preferences_tab = FALSE;
93 GtkWidget *player_box;
96 GtkWidget *split_freedb_button;
99 GtkWidget *percent_progress_bar;
102 gchar *filename_to_split;
103 gchar *filename_path_of_split;
106 gint we_are_splitting = FALSE;
107 gint we_quit_main_program = FALSE;
109 GtkWidget *player_vbox = NULL;
112 GtkWidget *cancel_button = NULL;
114 extern GtkWidget *mess_history_dialog;
116 extern GtkWidget *da;
117 extern GtkWidget *progress_bar;
120 extern gint selected_id;
124 extern GList *text_options_list;
125 extern gchar **split_files;
126 extern gint max_split_files;
127 extern gint selected_player;
129 extern gint number_of_silence_points;
133 GtkWidget *playlist_box = NULL;
136 void quit(GtkWidget *widget, gpointer data)
138 save_preferences(NULL, NULL);
140 if (we_are_splitting)
143 mp3splt_stop_split(the_state,&err);
146 we_quit_main_program = TRUE;
157 g_list_free(text_options_list);
162 g_free(silence_points);
163 silence_points = NULL;
164 number_of_silence_points = 0;
170 void main_window_drag_data_received(GtkWidget *window,
171 GdkDragContext *drag_context, gint x, gint y, GtkSelectionData *data, guint
172 info, guint time, gpointer user_data)
174 const gchar *received_data = (gchar *) gtk_selection_data_get_text(data);
176 if (received_data != NULL)
178 gchar **drop_filenames = NULL;
179 drop_filenames = g_strsplit(received_data,
"\n", 0);
181 gint current_index = 0;
182 gchar *current_filename = drop_filenames[current_index];
183 while (current_filename != NULL)
185 gchar *filename = NULL;
186 if (strstr(current_filename,
"file:") == current_filename)
188 filename = g_filename_from_uri(current_filename, NULL, NULL);
192 gint fname_malloc_size = strlen(current_filename) + 1;
193 filename = g_malloc(
sizeof(gchar) * fname_malloc_size);
194 g_snprintf(filename, fname_malloc_size,
"%s", current_filename);
210 g_free(current_filename);
212 current_filename = drop_filenames[current_index];
217 g_free(drop_filenames);
218 drop_filenames = NULL;
223 gboolean configure_window_callback(GtkWindow *window, GdkEvent *event, gpointer data)
227 ui_set_main_win_position(ui, event->configure.x, event->configure.y);
228 ui_set_main_win_size(ui, event->configure.width, event->configure.height);
233 void initialize_window()
235 window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
237 g_signal_connect(G_OBJECT(window),
"configure-event", G_CALLBACK(configure_window_callback), ui);
239 window_accel_group = gtk_accel_group_new();
240 gtk_window_add_accel_group(GTK_WINDOW(window), window_accel_group);
242 gtk_window_set_title(GTK_WINDOW(window), PACKAGE_NAME
" "VERSION);
243 gtk_container_set_border_width (GTK_CONTAINER (window), 0);
245 g_signal_connect(G_OBJECT(window),
"delete_event", G_CALLBACK(quit), NULL);
246 g_signal_connect(G_OBJECT(window),
"drag-data-received",
247 G_CALLBACK(main_window_drag_data_received), NULL);
248 gtk_drag_dest_set(window, GTK_DEST_DEFAULT_MOTION | GTK_DEST_DEFAULT_DROP,
249 drop_types, 3, GDK_ACTION_COPY | GDK_ACTION_MOVE);
251 GString *Imagefile = g_string_new(
"");
252 build_path(Imagefile, PIXMAP_PATH,
"mp3splt-gtk_ico"ICON_EXT);
253 GdkPixbuf *pixbuf = gdk_pixbuf_new_from_file(Imagefile->str, NULL);
254 gtk_window_set_default_icon(pixbuf);
255 g_string_free(Imagefile, TRUE);
258 void activate_url(GtkAboutDialog *about,
const gchar *link, gpointer data)
261 char default_browser[512] = {
'\0' };
262 DWORD dwType, dwSize =
sizeof(default_browser) - 1;
264 SHGetValue(HKEY_CURRENT_USER,
265 TEXT(
"Software\\Clients\\StartMenuInternet"),
271 if (default_browser[0] !=
'\0')
273 SHGetValue(HKEY_LOCAL_MACHINE,
274 TEXT(
"SOFTWARE\\Clients\\StartMenuInternet"),
281 if (default_browser[0] !=
'\0')
283 char browser_exe[2048] = {
'\0' };
284 dwSize =
sizeof(browser_exe) - 1;
286 char browser_exe_registry[1024] = {
'\0' };
287 snprintf(browser_exe_registry, 1024,
288 "SOFTWARE\\Clients\\StartMenuInternet\\%s\\shell\\open\\command\\",
291 SHGetValue(HKEY_LOCAL_MACHINE,
292 TEXT(browser_exe_registry), TEXT(
""),
293 &dwType, browser_exe, &dwSize);
295 if (browser_exe[0] !=
'\0')
297 gint browser_command_size = strlen(browser_exe) + strlen(link) + 2;
298 char *browser_command = g_malloc(
sizeof(
char) * browser_command_size);
301 snprintf(browser_command, browser_command_size,
"%s %s",
305 PROCESS_INFORMATION pinf;
306 ZeroMemory(&si,
sizeof(si));
308 ZeroMemory(&pinf,
sizeof(pinf));
310 if (! CreateProcess(NULL, browser_command,
311 NULL, NULL, FALSE, 0, NULL, NULL, &si, &pinf))
316 CloseHandle(pinf.hProcess);
317 CloseHandle(pinf.hThread);
319 g_free(browser_command);
320 browser_command = NULL;
327 void about_window(GtkWidget *widget, gpointer *data)
329 GtkWidget *dialog = gtk_about_dialog_new();
331 GString *Imagefile = g_string_new(
"");
332 build_path(Imagefile, PIXMAP_PATH,
"mp3splt-gtk.png");
333 GdkPixbuf *pixbuf = gdk_pixbuf_new_from_file(Imagefile->str, NULL);
334 gtk_about_dialog_set_logo(GTK_ABOUT_DIALOG(dialog), pixbuf);
335 g_string_free(Imagefile, TRUE);
337 gtk_about_dialog_set_program_name(GTK_ABOUT_DIALOG(dialog), (gchar *)PACKAGE_NAME);
338 gtk_about_dialog_set_version(GTK_ABOUT_DIALOG(dialog), VERSION);
339 gtk_about_dialog_set_copyright(GTK_ABOUT_DIALOG(dialog),
340 PACKAGE_NAME
" : Copyright © 2005-2011 Alexandru"
341 " Munteanu \n mp3splt : Copyright © 2002-2005 Matteo Trotta");
344 gchar b3[100] = {
'\0' };
345 b1 = (gchar *)_(
"using");
346 gchar library_version[20] = {
'\0' };
347 mp3splt_get_version(library_version);
348 g_snprintf(b3, 100,
"-%s-\n%s libmp3splt %s",
349 _(
"release of "MP3SPLT_GTK_DATE), b1, library_version);
351 gtk_about_dialog_set_comments(GTK_ABOUT_DIALOG(dialog), b3);
353 gtk_about_dialog_set_license(GTK_ABOUT_DIALOG(dialog),
355 "This program is free software; you can "
356 "redistribute it and/or \n"
357 "modify it under the terms of the GNU General Public License\n"
358 "as published by the Free Software "
359 "Foundation; either version 2\n"
360 "of the License, or (at your option) "
361 "any later version.\n\n"
362 "This program is distributed in the "
363 "hope that it will be useful,\n"
364 "but WITHOUT ANY WARRANTY; without even "
365 "the implied warranty of\n"
366 "MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n"
367 "GNU General Public License for more details.\n\n"
368 "You should have received a copy of the GNU General Public License\n"
369 "along with this program; if not, write "
370 "to the Free Software\n"
371 "Foundation, Inc., 59 Temple Place -"
372 "Suite 330, Boston, MA 02111-1307, "
375 g_signal_connect(G_OBJECT(dialog),
"activate-link", G_CALLBACK(activate_url), NULL);
377 gtk_about_dialog_set_website_label(GTK_ABOUT_DIALOG(dialog),
378 "http://mp3splt.sourceforge.net");
379 gtk_about_dialog_set_website(GTK_ABOUT_DIALOG(dialog),
380 "http://mp3splt.sourceforge.net");
382 gtk_about_dialog_set_translator_credits(GTK_ABOUT_DIALOG(dialog),
383 "Mario Blättermann <mariobl@gnome.org>");
385 gtk_dialog_run(GTK_DIALOG(dialog));
386 gtk_widget_destroy(dialog);
396 gtk_statusbar_get_context_id(GTK_STATUSBAR(status_bar),
"mess");
397 gtk_statusbar_pop(GTK_STATUSBAR(status_bar), status_id);
426 gtk_statusbar_get_context_id(GTK_STATUSBAR(status_bar),
"mess");
428 gtk_statusbar_pop(GTK_STATUSBAR(status_bar), status_id);
429 gtk_statusbar_push(GTK_STATUSBAR(status_bar), status_id, text);
439 mp3splt_stop_split(the_state,&err);
444 gtk_widget_set_sensitive(widget, FALSE);
453 if (!we_are_splitting)
477 if (filename_path_of_split != NULL)
479 we_are_splitting = TRUE;
480 create_thread(
split_it, NULL, TRUE, NULL);
481 gtk_widget_set_sensitive(GTK_WIDGET(cancel_button), TRUE);
497 GtkWidget *box = gtk_hbox_new(FALSE, 0);
498 gtk_container_set_border_width(GTK_CONTAINER(box), 0);
499 gtk_box_pack_start(GTK_BOX(box),
500 gtk_image_new_from_stock(GTK_STOCK_APPLY, GTK_ICON_SIZE_SMALL_TOOLBAR),
502 gtk_box_pack_start(GTK_BOX(box), gtk_label_new(_(
"Split !")), FALSE, FALSE, 0);
504 GtkWidget *split_button = gtk_button_new();
505 gtk_container_add(GTK_CONTAINER(split_button), box);
506 gtk_widget_set_tooltip_text(split_button,_(
"Split !"));
507 gtk_container_set_border_width(GTK_CONTAINER(split_button), 0);
508 gtk_button_set_relief(GTK_BUTTON(split_button), GTK_RELIEF_HALF);
510 g_signal_connect(G_OBJECT(split_button),
"clicked",
513 GtkWidget *vbox = gtk_vbox_new(FALSE, 0);
514 GtkWidget *hbox = gtk_hbox_new(FALSE, 0);
516 gtk_box_pack_start(GTK_BOX(hbox), split_button, TRUE, FALSE, 0);
517 gtk_box_pack_start(GTK_BOX(vbox), hbox, FALSE, FALSE, 0);
525 gtk_widget_show_all(GTK_WIDGET(mess_history_dialog));
531 GError* gerror = NULL;
532 gtk_show_uri(gdk_screen_get_default(),
"ghelp:mp3splt-gtk", gtk_get_current_event_time(), &gerror);
536 static gchar *my_dgettext(
const gchar *key,
const gchar *domain)
538 return dgettext(
"mp3splt-gtk", key);
544 GtkWidget *menu_box = gtk_hbox_new(FALSE,0);
546 static GtkActionEntry
const entries[] = {
548 {
"FileMenu", NULL, N_(
"_File") },
549 {
"HelpMenu", NULL, N_(
"_Help") },
552 {
"Open", GTK_STOCK_OPEN, N_(
"_Open..."),
"<Ctrl>O", N_(
"Open"),
555 {
"Import", GTK_STOCK_FILE, N_(
"_Import splitpoints..."),
"<Ctrl>I", N_(
"Import"),
557 {
"Export", GTK_STOCK_SAVE_AS, N_(
"_Export splitpoints..."),
"<Ctrl>E", N_(
"Export"),
560 {
"Split", GTK_STOCK_APPLY, N_(
"_Split !"),
"<Ctrl>S", N_(
"Split"),
562 {
"Messages history", GTK_STOCK_INFO, N_(
"Messages _history"),
"<Ctrl>H", N_(
"Messages history"),
565 {
"Quit", GTK_STOCK_QUIT, N_(
"_Quit"),
"<Ctrl>Q", N_(
"Quit"),
569 {
"Contents", GTK_STOCK_HELP, N_(
"_Contents"),
"F1", N_(
"Contents"),
570 G_CALLBACK(ShowHelp)},
573 {
"About", GTK_STOCK_ABOUT, N_(
"_About"),
"<Ctrl>A", N_(
"About"),
574 G_CALLBACK(about_window)},
577 static const gchar *ui_info =
579 " <menubar name='MenuBar'>"
580 " <menu action='FileMenu'>"
581 " <menuitem action='Open'/>"
583 " <menuitem action='Import'/>"
584 " <menuitem action='Export'/>"
586 " <menuitem action='Split'/>"
587 " <menuitem action='Messages history'/>"
589 " <menuitem action='Quit'/>"
591 " <menu action='HelpMenu'>"
593 " <menuitem action='Contents'/>"
595 " <menuitem action='About'/>"
600 GtkActionGroup *actions = gtk_action_group_new (
"Actions");
602 gtk_action_group_set_translation_domain(actions,
"mp3splt-gtk");
603 gtk_action_group_set_translate_func(actions,
604 (GtkTranslateFunc)my_dgettext, NULL, NULL);
607 gtk_action_group_add_actions (actions, entries, G_N_ELEMENTS(entries), NULL);
608 GtkUIManager *ui = gtk_ui_manager_new ();
610 gtk_ui_manager_insert_action_group (ui, actions, 0);
612 gtk_window_add_accel_group (GTK_WINDOW (window),
613 gtk_ui_manager_get_accel_group (ui));
615 gtk_ui_manager_add_ui_from_string(ui, ui_info, -1, NULL);
618 gtk_box_pack_start (GTK_BOX (menu_box),
619 gtk_ui_manager_get_widget(ui,
"/MenuBar"),
623 gtk_box_pack_start(GTK_BOX(menu_box), toolbar, TRUE, TRUE, 0);
643 box = gtk_hbox_new(FALSE, 0);
644 gtk_container_set_border_width(GTK_CONTAINER (box), 2);
646 image = gtk_image_new_from_stock(stock_id, GTK_ICON_SIZE_MENU);
647 gtk_box_pack_start(GTK_BOX(box), image, FALSE, FALSE, 3);
649 if (label_text != NULL)
651 label = gtk_label_new (label_text);
652 gtk_label_set_text_with_mnemonic(GTK_LABEL(label),label_text);
653 gtk_box_pack_start (GTK_BOX (box), label, FALSE, FALSE, 3);
658 button = gtk_toggle_button_new();
662 button = gtk_button_new();
665 gtk_container_add(GTK_CONTAINER(button),box);
674 GtkWidget *main_vbox;
682 GtkWidget *notebook_label;
685 main_vbox = gtk_vbox_new (FALSE, 0);
686 gtk_container_set_border_width (GTK_CONTAINER (main_vbox), 0);
688 frame = (GtkWidget *)create_choose_file_frame();
689 gtk_box_pack_start(GTK_BOX(main_vbox), frame, FALSE, FALSE, 0);
692 notebook = gtk_notebook_new();
693 gtk_box_pack_start (GTK_BOX (main_vbox), notebook, TRUE, TRUE, 0);
694 gtk_notebook_popup_enable(GTK_NOTEBOOK(notebook));
695 gtk_notebook_set_show_tabs(GTK_NOTEBOOK(notebook), TRUE);
696 gtk_notebook_set_show_border(GTK_NOTEBOOK(notebook), FALSE);
697 gtk_notebook_set_scrollable(GTK_NOTEBOOK(notebook), TRUE);
700 GtkWidget *splitpoints_vbox;
701 splitpoints_vbox = gtk_vbox_new (FALSE, 0);
702 gtk_container_set_border_width (GTK_CONTAINER (splitpoints_vbox), 0);
705 gtk_container_add(GTK_CONTAINER(splitpoints_vbox), frame);
708 player_vbox = gtk_vbox_new(FALSE,0);
709 notebook_label = gtk_label_new((gchar *)_(
"Player"));
713 gtk_box_pack_start(GTK_BOX(player_vbox), player_box, FALSE, FALSE, 0);
717 gtk_box_pack_start(GTK_BOX(player_vbox), playlist_box, TRUE, TRUE, 0);
719 gtk_notebook_append_page(GTK_NOTEBOOK(notebook), player_vbox,
720 (GtkWidget *)notebook_label);
723 notebook_label = gtk_label_new((gchar *)_(
"Splitpoints"));
724 gtk_notebook_append_page(GTK_NOTEBOOK(notebook),
726 (GtkWidget *)notebook_label);
729 GtkWidget *split_files_vbox = gtk_vbox_new (FALSE, 0);
730 gtk_container_set_border_width(GTK_CONTAINER(split_files_vbox), 0);
733 gtk_container_add(GTK_CONTAINER(split_files_vbox), frame);
735 notebook_label = gtk_label_new((gchar *)_(
"Split files"));
736 gtk_notebook_append_page(GTK_NOTEBOOK(notebook),
738 (GtkWidget *)notebook_label);
741 GtkWidget *freedb_vbox;
742 freedb_vbox = gtk_vbox_new (FALSE, 0);
743 gtk_container_set_border_width (GTK_CONTAINER (freedb_vbox), 0);
746 gtk_container_add(GTK_CONTAINER(freedb_vbox), frame);
748 notebook_label = gtk_label_new((gchar *)_(
"FreeDB"));
749 gtk_notebook_append_page(GTK_NOTEBOOK(notebook),
751 (GtkWidget *)notebook_label);
754 GtkWidget *special_split_vbox;
755 special_split_vbox = gtk_vbox_new (FALSE, 0);
756 gtk_container_set_border_width (GTK_CONTAINER (special_split_vbox), 0);
758 gtk_container_add(GTK_CONTAINER(special_split_vbox), frame);
759 notebook_label = gtk_label_new(_(
"Type of split"));
760 gtk_notebook_append_page(GTK_NOTEBOOK(notebook),
762 (GtkWidget *)notebook_label);
765 GtkWidget *preferences_vbox;
766 preferences_vbox = gtk_vbox_new (FALSE, 0);
767 gtk_container_set_border_width (GTK_CONTAINER (preferences_vbox), 0);
770 gtk_container_add(GTK_CONTAINER(preferences_vbox), frame);
772 notebook_label = gtk_label_new((gchar *)_(
"Preferences"));
773 gtk_notebook_append_page(GTK_NOTEBOOK(notebook), preferences_vbox,
774 (GtkWidget *)notebook_label);
777 percent_progress_bar = gtk_progress_bar_new();
778 gtk_progress_bar_set_fraction(GTK_PROGRESS_BAR(percent_progress_bar), 0.0);
779 gtk_progress_bar_set_text(GTK_PROGRESS_BAR(percent_progress_bar),
"");
781 #if GTK_MAJOR_VERSION >= 3
782 gtk_progress_bar_set_show_text(GTK_PROGRESS_BAR(percent_progress_bar), TRUE);
785 GtkWidget *hbox = gtk_hbox_new (FALSE, 0);
786 gtk_box_pack_start(GTK_BOX(hbox), percent_progress_bar, TRUE, TRUE, 0);
790 g_signal_connect(G_OBJECT(cancel_button),
"clicked",
793 gtk_box_pack_start(GTK_BOX(hbox), cancel_button, FALSE, TRUE, 3);
794 gtk_widget_set_sensitive(GTK_WIDGET(cancel_button), FALSE);
796 gtk_box_pack_start(GTK_BOX(main_vbox), hbox, FALSE, FALSE, 2);
802 status_bar = gtk_statusbar_new();
804 GtkWidget *mess_history_button =
806 gtk_button_set_relief(GTK_BUTTON(mess_history_button), GTK_RELIEF_NONE);
807 gtk_widget_set_tooltip_text(mess_history_button,_(
"Messages history"));
808 gtk_box_pack_start(GTK_BOX(status_bar), mess_history_button, FALSE, FALSE, 0);
809 g_signal_connect(G_OBJECT(mess_history_button),
"clicked",
812 gtk_box_pack_start(GTK_BOX(main_vbox), status_bar, FALSE, FALSE, 0);
817 static void move_and_resize_main_window()
821 gint x = main_win->root_x_pos;
822 gint y = main_win->root_y_pos;
824 if (x != 0 && y != 0)
826 gtk_window_move(GTK_WINDOW(window), x, y);
830 gtk_window_set_position(GTK_WINDOW(window), GTK_WIN_POS_CENTER);
833 gtk_window_resize(GTK_WINDOW(window), main_win->width, main_win->height);
844 GtkWidget *window_vbox = gtk_vbox_new(FALSE, 0);
845 gtk_container_add(GTK_CONTAINER(window), window_vbox);
849 gtk_box_pack_start(GTK_BOX(window_vbox), menu_bar, FALSE, FALSE, 0);
852 gtk_box_pack_start(GTK_BOX(window_vbox), main_vbox, TRUE, TRUE, 0);
856 move_and_resize_main_window();
858 gtk_widget_show_all(window);
860 if (selected_player != PLAYER_GSTREAMER)
862 gtk_widget_hide(playlist_box);
865 hide_freedb_spinner();
874 char *error_from_library = mp3splt_get_strerror(the_state, confirmation);
875 if (error_from_library != NULL)
878 free(error_from_library);
879 error_from_library = NULL;