comparison src/audacious/util.c @ 2402:6725ce180c26 trunk

[svn] recoded gtk2 style file opener
author mf0102
date Thu, 25 Jan 2007 06:56:12 -0800
parents ad1d7687814c
children e5e2c481eb59
comparison
equal deleted inserted replaced
2401:c4c24ca99c31 2402:6725ce180c26
393 * - nenolod 393 * - nenolod
394 */ 394 */
395 if (open_buffer == NULL || strcasecmp(filename, open_buffer)) 395 if (open_buffer == NULL || strcasecmp(filename, open_buffer))
396 { 396 {
397 if (buffer != NULL) 397 if (buffer != NULL)
398 { 398 {
399 g_free(buffer); 399 g_free(buffer);
400 buffer = NULL; 400 buffer = NULL;
401 } 401 }
402 402
403 if (open_buffer != NULL) 403 if (open_buffer != NULL)
404 { 404 {
405 g_free(open_buffer); 405 g_free(open_buffer);
406 open_buffer = NULL; 406 open_buffer = NULL;
407 } 407 }
408 408
409 if (!g_file_get_contents(filename, &buffer, &filesize, NULL)) 409 if (!g_file_get_contents(filename, &buffer, &filesize, NULL))
410 return NULL; 410 return NULL;
415 /* 415 /*
416 * Convert UTF-16 into something useful. Original implementation 416 * Convert UTF-16 into something useful. Original implementation
417 * by incomp@#audacious. Cleanups \nenolod 417 * by incomp@#audacious. Cleanups \nenolod
418 */ 418 */
419 if (!memcmp(&buffer[0],&x,2)) { 419 if (!memcmp(&buffer[0],&x,2)) {
420 outbuf = g_malloc (filesize); /* it's safe to waste memory. */ 420 outbuf = g_malloc (filesize); /* it's safe to waste memory. */
421 421
422 for (counter = 2; counter < filesize; counter += 2) 422 for (counter = 2; counter < filesize; counter += 2)
423 if (!memcmp(&buffer[counter+1], &x[2], 1)) 423 if (!memcmp(&buffer[counter+1], &x[2], 1))
424 outbuf[(counter-2)/2] = buffer[counter]; 424 outbuf[(counter-2)/2] = buffer[counter];
425 else 425 else
426 return NULL; 426 return NULL;
427 427
428 outbuf[(counter-2)/2] = '\0'; 428 outbuf[(counter-2)/2] = '\0';
429 429
430 if ((filesize - 2) / 2 == (counter - 2) / 2) { 430 if ((filesize - 2) / 2 == (counter - 2) / 2) {
431 g_free(buffer); 431 g_free(buffer);
432 buffer = outbuf; 432 buffer = outbuf;
433 } else { 433 } else {
434 g_free(outbuf); 434 g_free(outbuf);
435 return NULL; /* XXX wrong encoding */ 435 return NULL; /* XXX wrong encoding */
436 } 436 }
437 } 437 }
438 438
439 while (!ret_buffer && off < filesize) { 439 while (!ret_buffer && off < filesize) {
440 while (off < filesize && 440 while (off < filesize &&
593 GtkWidget * 593 GtkWidget *
594 util_add_url_dialog_new(const gchar * caption, GCallback ok_func, 594 util_add_url_dialog_new(const gchar * caption, GCallback ok_func,
595 GCallback enqueue_func) 595 GCallback enqueue_func)
596 { 596 {
597 GtkWidget *win, *vbox, *bbox, *enqueue, *ok, *cancel, *combo, *entry, 597 GtkWidget *win, *vbox, *bbox, *enqueue, *ok, *cancel, *combo, *entry,
598 *label; 598 *label;
599 GList *url; 599 GList *url;
600 600
601 win = gtk_window_new(GTK_WINDOW_TOPLEVEL); 601 win = gtk_window_new(GTK_WINDOW_TOPLEVEL);
602 gtk_window_set_title(GTK_WINDOW(win), _("Add/Open URL Dialog")); 602 gtk_window_set_title(GTK_WINDOW(win), _("Add/Open URL Dialog"));
603 gtk_window_set_type_hint(GTK_WINDOW(win), GDK_WINDOW_TYPE_HINT_DIALOG); 603 gtk_window_set_type_hint(GTK_WINDOW(win), GDK_WINDOW_TYPE_HINT_DIALOG);
637 gtk_button_box_set_spacing(GTK_BUTTON_BOX(bbox), 5); 637 gtk_button_box_set_spacing(GTK_BUTTON_BOX(bbox), 5);
638 gtk_box_pack_start(GTK_BOX(vbox), bbox, FALSE, FALSE, 0); 638 gtk_box_pack_start(GTK_BOX(vbox), bbox, FALSE, FALSE, 0);
639 639
640 ok = gtk_button_new_from_stock(GTK_STOCK_OPEN); 640 ok = gtk_button_new_from_stock(GTK_STOCK_OPEN);
641 g_signal_connect(ok, "clicked", 641 g_signal_connect(ok, "clicked",
642 G_CALLBACK(util_add_url_callback), entry); 642 G_CALLBACK(util_add_url_callback), entry);
643 g_signal_connect(ok, "clicked", 643 g_signal_connect(ok, "clicked",
644 G_CALLBACK(ok_func), entry); 644 G_CALLBACK(ok_func), entry);
645 g_signal_connect_swapped(ok, "clicked", 645 g_signal_connect_swapped(ok, "clicked",
646 G_CALLBACK(gtk_widget_destroy), 646 G_CALLBACK(gtk_widget_destroy),
647 win); 647 win);
648 gtk_box_pack_start(GTK_BOX(bbox), ok, FALSE, FALSE, 0); 648 gtk_box_pack_start(GTK_BOX(bbox), ok, FALSE, FALSE, 0);
649 649
708 708
709 g_free(cfg.filesel_path); 709 g_free(cfg.filesel_path);
710 cfg.filesel_path = ptr; 710 cfg.filesel_path = ptr;
711 } 711 }
712 712
713 static void
714 filebrowser_add(GtkFileChooser *browser)
715 {
716 GSList *files;
717
718 files = gtk_file_chooser_get_filenames(GTK_FILE_CHOOSER(browser));
719
720 if (!files) {
721 return;
722 }
723
724 filebrowser_add_files(browser, files);
725 g_slist_foreach(files, (GFunc) g_free, NULL);
726 g_slist_free(files);
727 }
728
729 static void
730 filebrowser_play(GtkFileChooser * browser)
731 {
732 GSList *files;
733
734 files = gtk_file_chooser_get_filenames(GTK_FILE_CHOOSER(browser));
735
736 if (!files) return;
737
738 playlist_clear(playlist_get_active());
739
740 filebrowser_add_files(browser, files);
741 g_slist_foreach(files, (GFunc) g_free, NULL);
742 g_slist_free(files);
743
744 playback_initiate();
745 }
746
747
748 static void
749 _filebrowser_add_gtk2(GtkWidget *widget,
750 gpointer data)
751 {
752 filebrowser_add(data);
753 gtk_file_chooser_unselect_all(GTK_FILE_CHOOSER(data));
754 }
755
756 static void
757 _filebrowser_play_gtk2(GtkWidget *widget, gpointer data)
758 {
759 filebrowser_play(data);
760 gtk_file_chooser_unselect_all(data);
761 }
762
763 #if 0
764 static void
765 filebrowser_on_response(GtkFileChooser * browser,
766 gint response,
767 gpointer data)
768 {
769 gtk_widget_hide(GTK_WIDGET(browser));
770 switch (response) {
771 case GTK_RESPONSE_OK:
772 break;
773 case GTK_RESPONSE_ACCEPT:
774 break;
775 case GTK_RESPONSE_CLOSE:
776 break;
777 }
778 gtk_widget_destroy(GTK_WIDGET(browser));
779
780 }
781
782 #endif
783
784 static void
785 _filebrowser_check_hide_add(GtkWidget * widget,
786 gpointer data)
787 {
788 cfg.close_dialog_add = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(widget));
789 }
790
791 static void
792 _filebrowser_check_hide_open(GtkWidget * widget,
793 gpointer data)
794 {
795 cfg.close_dialog_open = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(widget));
796 }
797
798
799
800 static gboolean
801 filebrowser_on_keypress(GtkWidget * browser,
802 GdkEventKey * event,
803 gpointer data)
804 {
805 if (event->keyval == GDK_Escape) {
806 /* FIXME: this crashes BMP for some reason */
807 /* g_signal_emit_by_name(browser, "delete-event"); */
808 gtk_widget_hide(browser);
809 return TRUE;
810 }
811
812 return FALSE;
813 }
814
815 static void
816 _filebrowser_do_hide_add(GtkWidget *widget,
817 gpointer data)
818 {
819 if (cfg.close_dialog_add)
820 gtk_widget_hide(data);
821 }
822
823 static void
824 _filebrowser_do_hide_open(GtkWidget *widget,
825 gpointer data)
826 {
827 if (cfg.close_dialog_open)
828 gtk_widget_hide(data);
829 }
830
831 void 713 void
832 util_run_filebrowser_gtk2style(gboolean play_button) 714 util_run_filebrowser_gtk2style(gboolean play_button)
833 { 715 {
834 static GladeXML *xml = NULL;
835 static GtkWidget *dialog = NULL;
836 static GtkWidget *chooser = NULL; 716 static GtkWidget *chooser = NULL;
717 static GtkWidget *toggle = NULL;
718
719 gint ACCEPT_RESPONSE_ID = 100;
720
721 chooser =
722 gtk_file_chooser_dialog_new(play_button ? "Open Files" : "Add Files",
723 NULL,
724 GTK_FILE_CHOOSER_ACTION_OPEN,
725 GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL,
726 play_button ? GTK_STOCK_OPEN : GTK_STOCK_ADD,
727 ACCEPT_RESPONSE_ID, NULL);
728
729 gtk_file_chooser_set_select_multiple(GTK_FILE_CHOOSER(chooser), TRUE);
730 if (cfg.filesel_path)
731 gtk_file_chooser_set_current_folder(GTK_FILE_CHOOSER(chooser),
732 cfg.filesel_path);
733
734
735 toggle = gtk_check_button_new_with_label(play_button ? _("Close dialog on Open") : _("Close dialog on Add"));
736 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(toggle),
737 cfg.close_dialog_open ? TRUE : FALSE);
738 gtk_file_chooser_set_extra_widget (GTK_FILE_CHOOSER(chooser), toggle);
739
837 740
838 static GtkWidget *button_add; 741 while(gtk_dialog_run(GTK_DIALOG(chooser)) == ACCEPT_RESPONSE_ID)
839 static GtkWidget *button_select_all, *button_deselect_all; 742 {
840 static GtkWidget *toggle; 743 cfg.close_dialog_open =
841 744 gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(toggle));
842 static gulong handlerid, handlerid_check, handlerid_do; 745
843 static gulong handlerid_activate, handlerid_do_activate; 746 GSList *files;
844 747 files = gtk_file_chooser_get_filenames(GTK_FILE_CHOOSER(chooser));
845 if (!xml) { 748 if (!files) return;
846 /* FIXME: Creating a file chooser dialog manually using 749
847 libglade because there's no way to stop 750 if (play_button)
848 GtkFileChooserDialog from resizing the buttons to the same 751 playlist_clear(playlist_get_active());
849 size. The long toggle button title causes the buttons to 752
850 turn unnecessarily elongated and fugly. */ 753 filebrowser_add_files(GTK_FILE_CHOOSER(chooser), files);
851 754 g_slist_foreach(files, (GFunc) g_free, NULL);
852 GtkWidget *alignment; 755 g_slist_free(files);
853 756
854 xml = glade_xml_new_or_die(_("Add/Open Files dialog"), 757 if (play_button)
855 DATA_DIR "/glade/addfiles.glade", 758 playback_initiate();
856 NULL, NULL); 759
857 glade_xml_signal_autoconnect(xml); 760
858 761 if (cfg.close_dialog_open)
859 dialog = glade_xml_get_widget(xml, "add_files_dialog"); 762 break;
860 763 }
861 /* FIXME: Creating file chooser widget here because libglade <= 2.4.0 does 764
862 not support GtkFileChooserWidget */ 765 gtk_widget_destroy(chooser);
863
864 chooser = gtk_file_chooser_widget_new(GTK_FILE_CHOOSER_ACTION_OPEN);
865 gtk_file_chooser_set_select_multiple(GTK_FILE_CHOOSER(chooser), TRUE);
866
867 if (cfg.filesel_path)
868 gtk_file_chooser_set_current_folder(GTK_FILE_CHOOSER(chooser),
869 cfg.filesel_path);
870
871 alignment = glade_xml_get_widget(xml, "alignment2");
872 gtk_container_add(GTK_CONTAINER(alignment), chooser);
873
874 toggle = glade_xml_get_widget(xml, "close_on_action");
875 button_select_all = glade_xml_get_widget(xml, "select_all");
876 button_deselect_all = glade_xml_get_widget(xml, "deselect_all");
877 button_add = glade_xml_get_widget(xml, "action");
878
879 g_signal_connect_swapped(button_select_all, "clicked",
880 G_CALLBACK(gtk_file_chooser_select_all),
881 chooser);
882 g_signal_connect_swapped(button_deselect_all, "clicked",
883 G_CALLBACK(gtk_file_chooser_unselect_all),
884 chooser);
885
886 g_signal_connect(dialog, "key_press_event",
887 G_CALLBACK(filebrowser_on_keypress),
888 NULL);
889
890 gtk_widget_show_all(dialog);
891 } /* !xml */
892 else {
893 g_signal_handler_disconnect(button_add, handlerid);
894 g_signal_handler_disconnect(toggle, handlerid_check);
895 g_signal_handler_disconnect(chooser, handlerid_activate);
896 g_signal_handler_disconnect(button_add, handlerid_do);
897 g_signal_handler_disconnect(chooser, handlerid_do_activate);
898
899 if (cfg.refresh_file_list)
900 {
901 gchar *tmp = gtk_file_chooser_get_current_folder(GTK_FILE_CHOOSER(chooser));
902 gtk_file_chooser_set_current_folder(GTK_FILE_CHOOSER(chooser), tmp);
903
904 g_free(tmp);
905 }
906 }
907
908 if (play_button) {
909 gtk_window_set_title(GTK_WINDOW(dialog), _("Open Files"));
910
911 gtk_button_set_label(GTK_BUTTON(button_add), GTK_STOCK_OPEN);
912
913 gtk_button_set_label(GTK_BUTTON(toggle), _("Close dialog on Open"));
914 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(toggle), cfg.close_dialog_open);
915
916 handlerid = g_signal_connect(button_add, "clicked", G_CALLBACK(_filebrowser_play_gtk2), chooser);
917 handlerid_check = g_signal_connect(toggle, "toggled", G_CALLBACK(_filebrowser_check_hide_open), NULL);
918 handlerid_do = g_signal_connect_after(button_add, "clicked", G_CALLBACK(_filebrowser_do_hide_open), dialog);
919 handlerid_activate = g_signal_connect(chooser, "file-activated", G_CALLBACK(_filebrowser_play_gtk2), chooser);
920 handlerid_do_activate = g_signal_connect_after(chooser,"file_activated", G_CALLBACK(_filebrowser_do_hide_open), dialog);
921 }
922 else {
923 gtk_window_set_title(GTK_WINDOW(dialog), _("Add Files"));
924
925 gtk_button_set_label(GTK_BUTTON(button_add), GTK_STOCK_ADD);
926
927 gtk_button_set_label(GTK_BUTTON(toggle), _("Close dialog on Add"));
928 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(toggle), cfg.close_dialog_add);
929
930 handlerid = g_signal_connect(button_add, "clicked", G_CALLBACK(_filebrowser_add_gtk2), chooser);
931 handlerid_check = g_signal_connect(toggle, "toggled", G_CALLBACK(_filebrowser_check_hide_add), NULL);
932 handlerid_do = g_signal_connect_after(button_add, "clicked", G_CALLBACK(_filebrowser_do_hide_add), dialog);
933 handlerid_activate = g_signal_connect(chooser, "file-activated", G_CALLBACK(_filebrowser_add_gtk2), chooser);
934 handlerid_do_activate = g_signal_connect_after(chooser,"file_activated", G_CALLBACK(_filebrowser_do_hide_add), dialog);
935 }
936
937 gtk_window_present(GTK_WINDOW(dialog));
938 } 766 }
939 767
940 /* 768 /*
941 * Derived from Beep Media Player 0.9.6.1. 769 * Derived from Beep Media Player 0.9.6.1.
942 * Which is (C) 2003 - 2006 Milosz Derezynski &c 770 * Which is (C) 2003 - 2006 Milosz Derezynski &c
946 static void filebrowser_changed_classic(GtkFileSelection * filesel) 774 static void filebrowser_changed_classic(GtkFileSelection * filesel)
947 { 775 {
948 GList *list; 776 GList *list;
949 GList *node; 777 GList *node;
950 char *filename = (char *) 778 char *filename = (char *)
951 gtk_file_selection_get_filename(GTK_FILE_SELECTION(filesel)); 779 gtk_file_selection_get_filename(GTK_FILE_SELECTION(filesel));
952 GtkListStore *store; 780 GtkListStore *store;
953 GtkTreeIter iter; 781 GtkTreeIter iter;
954 782
955 if ((list = input_scan_dir(filename)) != NULL) { 783 if ((list = input_scan_dir(filename)) != NULL)
956 /* 784 {
957 * We enter a directory that has been "hijacked" by an 785 /*
958 * input-plugin. This is used by the CDDA plugin 786 * We enter a directory that has been "hijacked" by an
959 */ 787 * input-plugin. This is used by the CDDA plugin
960 store = 788 */
961 GTK_LIST_STORE(gtk_tree_view_get_model 789 store =
962 (GTK_TREE_VIEW(filesel->file_list))); 790 GTK_LIST_STORE(gtk_tree_view_get_model
963 gtk_list_store_clear(store); 791 (GTK_TREE_VIEW(filesel->file_list)));
964 792 gtk_list_store_clear(store);
965 node = list; 793
966 while (node) { 794 node = list;
967 795 while (node) {
968 gtk_list_store_append(store, &iter); 796 gtk_list_store_append(store, &iter);
969 gtk_list_store_set(store, &iter, 0, node->data, -1); 797 gtk_list_store_set(store, &iter, 0, node->data, -1);
970 g_free(node->data); 798 g_free(node->data);
971 node = g_list_next(node); 799 node = g_list_next(node);
972 } 800 }
973 g_list_free(list); 801
802 g_list_free(list);
974 } 803 }
975 } 804 }
976 805
977 static void filebrowser_entry_changed_classic(GtkEditable * entry, gpointer data) 806 static void filebrowser_entry_changed_classic(GtkEditable * entry, gpointer data)
978 { 807 {
986 gboolean retv = FALSE; 815 gboolean retv = FALSE;
987 816
988 text = g_strdup(gtk_file_selection_get_filename(filesel)); 817 text = g_strdup(gtk_file_selection_get_filename(filesel));
989 818
990 if (stat(text, &buf) == 0 && S_ISDIR(buf.st_mode)) { 819 if (stat(text, &buf) == 0 && S_ISDIR(buf.st_mode)) {
991 /* Selected directory */ 820 /* Selected directory */
992 int len = strlen(text); 821 int len = strlen(text);
993 if (len > 3 && !strcmp(text + len - 4, "/../")) { 822 if (len > 3 && !strcmp(text + len - 4, "/../")) {
994 if (len == 4) 823 if (len == 4)
995 /* At the root already */ 824 /* At the root already */
996 *(text + len - 3) = '\0'; 825 *(text + len - 3) = '\0';
997 else { 826 else {
998 char *ptr; 827 char *ptr;
999 *(text + len - 4) = '\0'; 828 *(text + len - 4) = '\0';
1000 ptr = strrchr(text, '/'); 829 ptr = strrchr(text, '/');
1001 *(ptr + 1) = '\0'; 830 *(ptr + 1) = '\0';
1002 } 831 }
1003 } else if (len > 2 && !strcmp(text + len - 3, "/./")) 832 } else if (len > 2 && !strcmp(text + len - 3, "/./"))
1004 *(text + len - 2) = '\0'; 833 *(text + len - 2) = '\0';
1005 gtk_file_selection_set_filename(filesel, text); 834 gtk_file_selection_set_filename(filesel, text);
1006 retv = TRUE; 835 retv = TRUE;
1007 } 836 }
1008 g_free(text); 837 g_free(text);
1009 return retv; 838 return retv;
1010 } 839 }
1011 840
1012 static void filebrowser_add_files_classic(gchar ** files, 841 static void filebrowser_add_files_classic(gchar ** files,
1013 GtkFileSelection * filesel) 842 GtkFileSelection * filesel)
1014 { 843 {
1015 int ctr = 0; 844 int ctr = 0;
1016 char *ptr; 845 char *ptr;
1017 Playlist *playlist = playlist_get_active(); 846 Playlist *playlist = playlist_get_active();
1018 847
1019 if (GTK_IS_WIDGET(mainwin_jtf)) 848 if (GTK_IS_WIDGET(mainwin_jtf))
1020 gtk_widget_set_sensitive(mainwin_jtf, FALSE); 849 gtk_widget_set_sensitive(mainwin_jtf, FALSE);
1021 850
1022 while (files[ctr] != NULL) { 851 while (files[ctr] != NULL) {
1023 playlist_add(playlist, files[ctr++]); 852 playlist_add(playlist, files[ctr++]);
1024 } 853 }
1025 playlistwin_update_list(playlist); 854 playlistwin_update_list(playlist);
1026 855
1027 if (GTK_IS_WIDGET(mainwin_jtf)) 856 if (GTK_IS_WIDGET(mainwin_jtf))
1028 gtk_widget_set_sensitive(mainwin_jtf, TRUE); 857 gtk_widget_set_sensitive(mainwin_jtf, TRUE);
1029 858
1030 gtk_label_get(GTK_LABEL(GTK_BIN(filesel->history_pulldown)->child), 859 gtk_label_get(GTK_LABEL(GTK_BIN(filesel->history_pulldown)->child),
1031 &ptr); 860 &ptr);
1032 861
1033 /* This will give an extra slash if the current dir is the root. */ 862 /* This will give an extra slash if the current dir is the root. */
1034 cfg.filesel_path = g_strconcat(ptr, "/", NULL); 863 cfg.filesel_path = g_strconcat(ptr, "/", NULL);
1035 } 864 }
1036 865
1037 static void filebrowser_ok_classic(GtkWidget * w, GtkWidget * filesel) 866 static void filebrowser_ok_classic(GtkWidget * w, GtkWidget * filesel)
1038 { 867 {
1039 gchar **files; 868 gchar **files;
1040 869
1041 if (util_filebrowser_is_dir_classic(GTK_FILE_SELECTION(filesel))) 870 if (util_filebrowser_is_dir_classic(GTK_FILE_SELECTION(filesel)))
1042 return; 871 return;
1043 files = gtk_file_selection_get_selections(GTK_FILE_SELECTION(filesel)); 872 files = gtk_file_selection_get_selections(GTK_FILE_SELECTION(filesel));
1044 filebrowser_add_files_classic(files, GTK_FILE_SELECTION(filesel)); 873 filebrowser_add_files_classic(files, GTK_FILE_SELECTION(filesel));
1045 gtk_widget_destroy(filesel); 874 gtk_widget_destroy(filesel);
1046 } 875 }
1047 876
1048 static void filebrowser_play_classic(GtkWidget * w, GtkWidget * filesel) 877 static void filebrowser_play_classic(GtkWidget * w, GtkWidget * filesel)
1049 { 878 {
1050 gchar **files; 879 gchar **files;
1051 880
1052 if (util_filebrowser_is_dir_classic 881 if (util_filebrowser_is_dir_classic
1053 (GTK_FILE_SELECTION(GTK_FILE_SELECTION(filesel)))) 882 (GTK_FILE_SELECTION(GTK_FILE_SELECTION(filesel))))
1054 return; 883 return;
1055 playlist_clear(playlist_get_active()); 884 playlist_clear(playlist_get_active());
1056 files = gtk_file_selection_get_selections(GTK_FILE_SELECTION(filesel)); 885 files = gtk_file_selection_get_selections(GTK_FILE_SELECTION(filesel));
1057 filebrowser_add_files_classic(files, GTK_FILE_SELECTION(filesel)); 886 filebrowser_add_files_classic(files, GTK_FILE_SELECTION(filesel));
1058 gtk_widget_destroy(filesel); 887 gtk_widget_destroy(filesel);
1059 playback_initiate(); 888 playback_initiate();
1066 GtkFileSelection *filesel = GTK_FILE_SELECTION(data); 895 GtkFileSelection *filesel = GTK_FILE_SELECTION(data);
1067 files = gtk_file_selection_get_selections(filesel); 896 files = gtk_file_selection_get_selections(filesel);
1068 897
1069 filebrowser_add_files_classic(files, filesel); 898 filebrowser_add_files_classic(files, filesel);
1070 gtk_tree_selection_unselect_all(gtk_tree_view_get_selection 899 gtk_tree_selection_unselect_all(gtk_tree_view_get_selection
1071 (GTK_TREE_VIEW(filesel->file_list))); 900 (GTK_TREE_VIEW(filesel->file_list)));
1072 901
1073 gtk_entry_set_text(GTK_ENTRY(filesel->selection_entry), ""); 902 gtk_entry_set_text(GTK_ENTRY(filesel->selection_entry), "");
1074 } 903 }
1075 904
1076 static void filebrowser_add_all_files_classic(GtkWidget * w, gpointer data) 905 static void filebrowser_add_all_files_classic(GtkWidget * w, gpointer data)
1078 gchar **files; 907 gchar **files;
1079 GtkFileSelection *filesel; 908 GtkFileSelection *filesel;
1080 909
1081 filesel = data; 910 filesel = data;
1082 gtk_tree_selection_select_all(gtk_tree_view_get_selection 911 gtk_tree_selection_select_all(gtk_tree_view_get_selection
1083 (GTK_TREE_VIEW(filesel->file_list))); 912 (GTK_TREE_VIEW(filesel->file_list)));
1084 files = gtk_file_selection_get_selections(filesel); 913 files = gtk_file_selection_get_selections(filesel);
1085 filebrowser_add_files_classic(files, filesel); 914 filebrowser_add_files_classic(files, filesel);
1086 gtk_tree_selection_unselect_all(gtk_tree_view_get_selection 915 gtk_tree_selection_unselect_all(gtk_tree_view_get_selection
1087 (GTK_TREE_VIEW(filesel->file_list))); 916 (GTK_TREE_VIEW(filesel->file_list)));
1088 gtk_entry_set_text(GTK_ENTRY(filesel->selection_entry), ""); 917 gtk_entry_set_text(GTK_ENTRY(filesel->selection_entry), "");
1089 } 918 }
1090 919
1091 void 920 void
1092 util_run_filebrowser_classic(gboolean play_button) 921 util_run_filebrowser_classic(gboolean play_button)
1093 { 922 {
1094 static GtkWidget *dialog; 923 static GtkWidget *dialog;
1095 GtkWidget *button_add_selected, *button_add_all, *button_close, 924 GtkWidget *button_add_selected, *button_add_all, *button_close,
1096 *button_add; 925 *button_add;
1097 char *title; 926 char *title;
1098 927
1099 if (dialog != NULL) { 928 if (dialog != NULL) {
1100 gtk_window_present(GTK_WINDOW(dialog)); 929 gtk_window_present(GTK_WINDOW(dialog));
1101 return; 930 return;
1102 } 931 }
1103 932
1104 if (play_button) 933 if (play_button)
1105 title = _("Play files"); 934 title = _("Play files");
1106 else 935 else
1107 title = _("Load files"); 936 title = _("Load files");
1108 937
1109 dialog = gtk_file_selection_new(title); 938 dialog = gtk_file_selection_new(title);
1110 939
1111 gtk_file_selection_set_select_multiple 940 gtk_file_selection_set_select_multiple
1112 (GTK_FILE_SELECTION(dialog), TRUE); 941 (GTK_FILE_SELECTION(dialog), TRUE);
1113 942
1114 if (cfg.filesel_path) 943 if (cfg.filesel_path)
1115 gtk_file_selection_set_filename(GTK_FILE_SELECTION(dialog), 944 gtk_file_selection_set_filename(GTK_FILE_SELECTION(dialog),
1116 cfg.filesel_path); 945 cfg.filesel_path);
1117 946
1118 gtk_file_selection_hide_fileop_buttons(GTK_FILE_SELECTION(dialog)); 947 gtk_file_selection_hide_fileop_buttons(GTK_FILE_SELECTION(dialog));
1119 gtk_window_set_position(GTK_WINDOW(dialog), GTK_WIN_POS_CENTER); 948 gtk_window_set_position(GTK_WINDOW(dialog), GTK_WIN_POS_CENTER);
1120 949
1121 gtk_widget_hide(GTK_FILE_SELECTION(dialog)->ok_button); 950 gtk_widget_hide(GTK_FILE_SELECTION(dialog)->ok_button);
1124 /* 953 /*
1125 * The mnemonics are quite unorthodox, but that should guarantee they're unique in any locale 954 * The mnemonics are quite unorthodox, but that should guarantee they're unique in any locale
1126 * plus kinda easy to use 955 * plus kinda easy to use
1127 */ 956 */
1128 button_add_selected = 957 button_add_selected =
1129 gtk_dialog_add_button(GTK_DIALOG(dialog), "Add selected", 958 gtk_dialog_add_button(GTK_DIALOG(dialog), "Add selected",
1130 GTK_RESPONSE_NONE); 959 GTK_RESPONSE_NONE);
1131 gtk_button_set_use_underline(GTK_BUTTON(button_add_selected), TRUE); 960 gtk_button_set_use_underline(GTK_BUTTON(button_add_selected), TRUE);
1132 g_signal_connect(G_OBJECT(button_add_selected), "clicked", 961 g_signal_connect(G_OBJECT(button_add_selected), "clicked",
1133 G_CALLBACK(filebrowser_add_selected_files_classic), dialog); 962 G_CALLBACK(filebrowser_add_selected_files_classic), dialog);
1134 963
1135 button_add_all = 964 button_add_all =
1136 gtk_dialog_add_button(GTK_DIALOG(dialog), "Add all", 965 gtk_dialog_add_button(GTK_DIALOG(dialog), "Add all",
1137 GTK_RESPONSE_NONE); 966 GTK_RESPONSE_NONE);
1138 gtk_button_set_use_underline(GTK_BUTTON(button_add_all), TRUE); 967 gtk_button_set_use_underline(GTK_BUTTON(button_add_all), TRUE);
1139 g_signal_connect(G_OBJECT(button_add_all), "clicked", 968 g_signal_connect(G_OBJECT(button_add_all), "clicked",
1140 G_CALLBACK(filebrowser_add_all_files_classic), dialog); 969 G_CALLBACK(filebrowser_add_all_files_classic), dialog);
1141 970
1142 if (play_button) { 971 if (play_button) {
1143 button_add = 972 button_add =
1144 gtk_dialog_add_button(GTK_DIALOG(dialog), GTK_STOCK_MEDIA_PLAY, 973 gtk_dialog_add_button(GTK_DIALOG(dialog), GTK_STOCK_MEDIA_PLAY,
1145 GTK_RESPONSE_NONE); 974 GTK_RESPONSE_NONE);
1146 gtk_button_set_use_stock(GTK_BUTTON(button_add), TRUE); 975 gtk_button_set_use_stock(GTK_BUTTON(button_add), TRUE);
1147 g_signal_connect(G_OBJECT(button_add), "clicked", 976 g_signal_connect(G_OBJECT(button_add), "clicked",
1148 G_CALLBACK(filebrowser_play_classic), dialog); 977 G_CALLBACK(filebrowser_play_classic), dialog);
1149 g_signal_connect(G_OBJECT(GTK_FILE_SELECTION(dialog)->ok_button), 978 g_signal_connect(G_OBJECT(GTK_FILE_SELECTION(dialog)->ok_button),
1150 "clicked", G_CALLBACK(filebrowser_play_classic), dialog); 979 "clicked", G_CALLBACK(filebrowser_play_classic), dialog);
1151 } else { 980 } else {
1152 button_add = 981 button_add =
1153 gtk_dialog_add_button(GTK_DIALOG(dialog), GTK_STOCK_ADD, 982 gtk_dialog_add_button(GTK_DIALOG(dialog), GTK_STOCK_ADD,
1154 GTK_RESPONSE_NONE); 983 GTK_RESPONSE_NONE);
1155 gtk_button_set_use_stock(GTK_BUTTON(button_add), TRUE); 984 gtk_button_set_use_stock(GTK_BUTTON(button_add), TRUE);
1156 g_signal_connect(G_OBJECT(button_add), "clicked", 985 g_signal_connect(G_OBJECT(button_add), "clicked",
1157 G_CALLBACK(filebrowser_ok_classic), dialog); 986 G_CALLBACK(filebrowser_ok_classic), dialog);
1158 g_signal_connect(G_OBJECT(GTK_FILE_SELECTION(dialog)->ok_button), 987 g_signal_connect(G_OBJECT(GTK_FILE_SELECTION(dialog)->ok_button),
1159 "clicked", G_CALLBACK(filebrowser_ok_classic), dialog); 988 "clicked", G_CALLBACK(filebrowser_ok_classic), dialog);
1160 } 989 }
1161 990
1162 button_close = 991 button_close =
1163 gtk_dialog_add_button(GTK_DIALOG(dialog), GTK_STOCK_CLOSE, 992 gtk_dialog_add_button(GTK_DIALOG(dialog), GTK_STOCK_CLOSE,
1164 GTK_RESPONSE_NONE); 993 GTK_RESPONSE_NONE);
1165 gtk_button_set_use_stock(GTK_BUTTON(button_close), TRUE); 994 gtk_button_set_use_stock(GTK_BUTTON(button_close), TRUE);
1166 g_signal_connect_swapped(G_OBJECT(button_close), "clicked", 995 g_signal_connect_swapped(G_OBJECT(button_close), "clicked",
1167 G_CALLBACK(gtk_widget_destroy), 996 G_CALLBACK(gtk_widget_destroy),
1168 G_OBJECT(dialog)); 997 G_OBJECT(dialog));
1169 998
1170 gtk_widget_set_size_request(dialog, 600, 450); 999 gtk_widget_set_size_request(dialog, 600, 450);
1171 gtk_widget_realize(dialog); 1000 gtk_widget_realize(dialog);
1172 1001
1173 g_signal_connect(G_OBJECT 1002 g_signal_connect(G_OBJECT
1174 (GTK_FILE_SELECTION(dialog)->history_pulldown), 1003 (GTK_FILE_SELECTION(dialog)->history_pulldown),
1175 "changed", G_CALLBACK(filebrowser_entry_changed_classic), 1004 "changed", G_CALLBACK(filebrowser_entry_changed_classic),
1176 dialog); 1005 dialog);
1177 1006
1178 g_signal_connect(G_OBJECT(dialog), "destroy", 1007 g_signal_connect(G_OBJECT(dialog), "destroy",
1179 G_CALLBACK(gtk_widget_destroyed), &dialog); 1008 G_CALLBACK(gtk_widget_destroyed), &dialog);
1180 1009
1181 filebrowser_changed_classic(GTK_FILE_SELECTION(dialog)); 1010 filebrowser_changed_classic(GTK_FILE_SELECTION(dialog));
1182 1011
1183 gtk_widget_show(dialog); 1012 gtk_widget_show(dialog);
1184 } 1013 }
1388 /* 1217 /*
1389 * Resizes a GDK pixmap. 1218 * Resizes a GDK pixmap.
1390 */ 1219 */
1391 GdkPixmap *audacious_pixmap_resize(GdkWindow *src, GdkGC *src_gc, GdkPixmap *in, gint width, gint height) 1220 GdkPixmap *audacious_pixmap_resize(GdkWindow *src, GdkGC *src_gc, GdkPixmap *in, gint width, gint height)
1392 { 1221 {
1393 GdkPixmap *out; 1222 GdkPixmap *out;
1394 gint owidth, oheight; 1223 gint owidth, oheight;
1395 1224
1396 g_return_val_if_fail(src != NULL, NULL); 1225 g_return_val_if_fail(src != NULL, NULL);
1397 g_return_val_if_fail(src_gc != NULL, NULL); 1226 g_return_val_if_fail(src_gc != NULL, NULL);
1398 g_return_val_if_fail(in != NULL, NULL); 1227 g_return_val_if_fail(in != NULL, NULL);
1399 g_return_val_if_fail(width > 0 && height > 0, NULL); 1228 g_return_val_if_fail(width > 0 && height > 0, NULL);
1400 1229
1401 gdk_drawable_get_size(in, &owidth, &oheight); 1230 gdk_drawable_get_size(in, &owidth, &oheight);
1402 1231
1403 if (oheight == height && owidth == width) 1232 if (oheight == height && owidth == width)
1404 return NULL; 1233 return NULL;
1405 1234
1406 out = gdk_pixmap_new(src, width, height, -1); 1235 out = gdk_pixmap_new(src, width, height, -1);
1407 1236
1408 gdk_draw_rectangle(out, src_gc, TRUE, 0, 0, width, height); 1237 gdk_draw_rectangle(out, src_gc, TRUE, 0, 0, width, height);
1409 1238
1410 gdk_window_copy_area(out, src_gc, 0, 0, in, 0, 0, owidth, oheight); 1239 gdk_window_copy_area(out, src_gc, 0, 0, in, 0, 0, owidth, oheight);
1411 g_object_unref(src); 1240 g_object_unref(src);
1412 1241
1413 return out; 1242 return out;
1414 } 1243 }
1415 1244
1416 GdkImage *create_dblsize_image(GdkImage * img) 1245 GdkImage *create_dblsize_image(GdkImage * img)
1417 { 1246 {
1418 GdkImage *dblimg; 1247 GdkImage *dblimg;
1421 /* 1250 /*
1422 * This needs to be optimized 1251 * This needs to be optimized
1423 */ 1252 */
1424 1253
1425 dblimg = 1254 dblimg =
1426 gdk_image_new(GDK_IMAGE_NORMAL, gdk_visual_get_system(), 1255 gdk_image_new(GDK_IMAGE_NORMAL, gdk_visual_get_system(),
1427 img->width << 1, img->height << 1); 1256 img->width << 1, img->height << 1);
1428 if (dblimg->bpp == 1) { 1257 if (dblimg->bpp == 1) {
1429 register guint8 *srcptr, *ptr, *ptr2, pix; 1258 register guint8 *srcptr, *ptr, *ptr2, pix;
1430 1259
1431 srcptr = GDK_IMAGE(img)->mem; 1260 srcptr = GDK_IMAGE(img)->mem;
1432 ptr = GDK_IMAGE(dblimg)->mem; 1261 ptr = GDK_IMAGE(dblimg)->mem;
1433 ptr2 = ptr + dblimg->bpl; 1262 ptr2 = ptr + dblimg->bpl;
1434 1263
1435 for (y = 0; y < img->height; y++) { 1264 for (y = 0; y < img->height; y++) {
1436 for (x = 0; x < img->width; x++) { 1265 for (x = 0; x < img->width; x++) {
1437 pix = *srcptr++; 1266 pix = *srcptr++;
1438 *ptr++ = pix; 1267 *ptr++ = pix;
1439 *ptr++ = pix; 1268 *ptr++ = pix;
1440 *ptr2++ = pix; 1269 *ptr2++ = pix;
1441 *ptr2++ = pix; 1270 *ptr2++ = pix;
1442 } 1271 }
1443 srcptr += img->bpl - img->width; 1272 srcptr += img->bpl - img->width;
1444 ptr += (dblimg->bpl << 1) - dblimg->width; 1273 ptr += (dblimg->bpl << 1) - dblimg->width;
1445 ptr2 += (dblimg->bpl << 1) - dblimg->width; 1274 ptr2 += (dblimg->bpl << 1) - dblimg->width;
1446 } 1275 }
1447 } 1276 }
1448 if (dblimg->bpp == 2) { 1277 if (dblimg->bpp == 2) {
1449 guint16 *srcptr, *ptr, *ptr2, pix; 1278 guint16 *srcptr, *ptr, *ptr2, pix;
1450 1279
1451 srcptr = (guint16 *) GDK_IMAGE_XIMAGE(img)->data; 1280 srcptr = (guint16 *) GDK_IMAGE_XIMAGE(img)->data;
1452 ptr = (guint16 *) GDK_IMAGE_XIMAGE(dblimg)->data; 1281 ptr = (guint16 *) GDK_IMAGE_XIMAGE(dblimg)->data;
1453 ptr2 = ptr + (dblimg->bpl >> 1); 1282 ptr2 = ptr + (dblimg->bpl >> 1);
1454 1283
1455 for (y = 0; y < img->height; y++) { 1284 for (y = 0; y < img->height; y++) {
1456 for (x = 0; x < img->width; x++) { 1285 for (x = 0; x < img->width; x++) {
1457 pix = *srcptr++; 1286 pix = *srcptr++;
1458 *ptr++ = pix; 1287 *ptr++ = pix;
1459 *ptr++ = pix; 1288 *ptr++ = pix;
1460 *ptr2++ = pix; 1289 *ptr2++ = pix;
1461 *ptr2++ = pix; 1290 *ptr2++ = pix;
1462 } 1291 }
1463 srcptr += (img->bpl >> 1) - img->width; 1292 srcptr += (img->bpl >> 1) - img->width;
1464 ptr += (dblimg->bpl) - dblimg->width; 1293 ptr += (dblimg->bpl) - dblimg->width;
1465 ptr2 += (dblimg->bpl) - dblimg->width; 1294 ptr2 += (dblimg->bpl) - dblimg->width;
1466 } 1295 }
1467 } 1296 }
1468 if (dblimg->bpp == 3) { 1297 if (dblimg->bpp == 3) {
1469 register guint8 *srcptr, *ptr, *ptr2, pix1, pix2, pix3; 1298 register guint8 *srcptr, *ptr, *ptr2, pix1, pix2, pix3;
1470 1299
1471 srcptr = GDK_IMAGE(img)->mem; 1300 srcptr = GDK_IMAGE(img)->mem;
1472 ptr = GDK_IMAGE(dblimg)->mem; 1301 ptr = GDK_IMAGE(dblimg)->mem;
1473 ptr2 = ptr + dblimg->bpl; 1302 ptr2 = ptr + dblimg->bpl;
1474 1303
1475 for (y = 0; y < img->height; y++) { 1304 for (y = 0; y < img->height; y++) {
1476 for (x = 0; x < img->width; x++) { 1305 for (x = 0; x < img->width; x++) {
1477 pix1 = *srcptr++; 1306 pix1 = *srcptr++;
1478 pix2 = *srcptr++; 1307 pix2 = *srcptr++;
1479 pix3 = *srcptr++; 1308 pix3 = *srcptr++;
1480 *ptr++ = pix1; 1309 *ptr++ = pix1;
1481 *ptr++ = pix2; 1310 *ptr++ = pix2;
1482 *ptr++ = pix3; 1311 *ptr++ = pix3;
1483 *ptr++ = pix1; 1312 *ptr++ = pix1;
1484 *ptr++ = pix2; 1313 *ptr++ = pix2;
1485 *ptr++ = pix3; 1314 *ptr++ = pix3;
1486 *ptr2++ = pix1; 1315 *ptr2++ = pix1;
1487 *ptr2++ = pix2; 1316 *ptr2++ = pix2;
1488 *ptr2++ = pix3; 1317 *ptr2++ = pix3;
1489 *ptr2++ = pix1; 1318 *ptr2++ = pix1;
1490 *ptr2++ = pix2; 1319 *ptr2++ = pix2;
1491 *ptr2++ = pix3; 1320 *ptr2++ = pix3;
1492 1321
1493 } 1322 }
1494 srcptr += img->bpl - (img->width * 3); 1323 srcptr += img->bpl - (img->width * 3);
1495 ptr += (dblimg->bpl << 1) - (dblimg->width * 3); 1324 ptr += (dblimg->bpl << 1) - (dblimg->width * 3);
1496 ptr2 += (dblimg->bpl << 1) - (dblimg->width * 3); 1325 ptr2 += (dblimg->bpl << 1) - (dblimg->width * 3);
1497 } 1326 }
1498 } 1327 }
1499 if (dblimg->bpp == 4) { 1328 if (dblimg->bpp == 4) {
1500 register guint32 *srcptr, *ptr, *ptr2, pix; 1329 register guint32 *srcptr, *ptr, *ptr2, pix;
1501 1330
1502 srcptr = (guint32 *) GDK_IMAGE(img)->mem; 1331 srcptr = (guint32 *) GDK_IMAGE(img)->mem;
1503 ptr = (guint32 *) GDK_IMAGE(dblimg)->mem; 1332 ptr = (guint32 *) GDK_IMAGE(dblimg)->mem;
1504 ptr2 = ptr + (dblimg->bpl >> 2); 1333 ptr2 = ptr + (dblimg->bpl >> 2);
1505 1334
1506 for (y = 0; y < img->height; y++) { 1335 for (y = 0; y < img->height; y++) {
1507 for (x = 0; x < img->width; x++) { 1336 for (x = 0; x < img->width; x++) {
1508 pix = *srcptr++; 1337 pix = *srcptr++;
1509 *ptr++ = pix; 1338 *ptr++ = pix;
1510 *ptr++ = pix; 1339 *ptr++ = pix;
1511 *ptr2++ = pix; 1340 *ptr2++ = pix;
1512 *ptr2++ = pix; 1341 *ptr2++ = pix;
1513 } 1342 }
1514 srcptr += (img->bpl >> 2) - img->width; 1343 srcptr += (img->bpl >> 2) - img->width;
1515 ptr += (dblimg->bpl >> 1) - dblimg->width; 1344 ptr += (dblimg->bpl >> 1) - dblimg->width;
1516 ptr2 += (dblimg->bpl >> 1) - dblimg->width; 1345 ptr2 += (dblimg->bpl >> 1) - dblimg->width;
1517 } 1346 }
1518 } 1347 }
1519 return dblimg; 1348 return dblimg;
1520 } 1349 }
1521 1350
1522 /* URL-decode a file: URL path, return NULL if it's not what we expect */ 1351 /* URL-decode a file: URL path, return NULL if it's not what we expect */