Mercurial > audlegacy
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 */ |