📄 janela.c
字号:
/*U2B Downloader is a simple program with a user interface to download videosfrom youTube.com and convert them to mpeg format (optional). Copyright (c) 2007, Fabio Bruno Pereira <fabytes@gmail.com>This file is part of U2B Downloader. U2B Downloader is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. U2B Downloader is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with U2B Downloader. If not, see <http://www.gnu.org/licenses/>.*/#include <gtk/gtk.h>#include <sys/wait.h>#include <sys/types.h>#include <dirent.h>#include <stdio.h>#include <string.h>#include <errno.h>#include <stdlib.h>#include <unistd.h>#include <curl/curl.h>#include <curl/types.h> #include <curl/easy.h> #include "download.h"void toggle_radio_button( GtkWidget *widget);void togg(GtkWidget *widget, gpointer *data);static void button_chdir_clear_cb(GtkWidget* w, gpointer data);static void button_link_clear_cb(GtkWidget* w, gpointer data);static gint unmap_event_cb(GtkWidget* window, GdkEventAny* e, gpointer data);static gint focusin_event_cb(GtkWidget* window, GdkEventAny* e, gpointer data);static gint focus_event_cb(GtkWidget* window, GdkEventAny* e, gpointer data);static gint delete_event_cb(GtkWidget* w, GdkEventAny* e, gpointer data);static void button_click_cb(GtkWidget* w, gpointer data);void create_file_selection(void) ;void open_dialog(char * msg, GtkMessageType type);size_t my_write_func(void *ptr, size_t size, size_t nmemb, FILE *stream);size_t my_read_func(void *ptr, size_t size, size_t nmemb, FILE *stream);void *my_thread(void *ptr);int start_download(char * url, char * filename);int my_progress_func(GtkWidget *Bar, double t, double d, double ultotal, double ulnow);GtkWidget *file_selection_box;gchar *filename=NULL;GtkWidget *saveToDir;GtkWidget *text_entry;GtkWidget *vbox;GtkWidget *hbox;GtkWidget *hbox2;GtkWidget *hbox3;GtkWidget *hbox4;GtkWidget* window;GtkWidget *Bar;GtkWidget *radio1;GtkWidget *radio2;GtkWidget* button;GtkWidget* button_clear1;GtkWidget* button_clear2;GtkWidget* chdir_button;GtkWidget *label_percent;GtkWidget *check_button;int mapped_window = 0; // tells weather the the main wondow is not minimized CURL *curl = NULL;int dvd_quality = 0 ;struct thread_info{ char * url ; char * filename ; char * ret ;};typedef struct thread_info stThread_info ;int main(int argc, char* argv[]){ GtkAdjustment *adj; GtkWidget *label; GtkWidget *label2; GtkWidget *label3; gtk_init(&argc, &argv); window = gtk_window_new(GTK_WINDOW_TOPLEVEL); // gtk_widget_set_size_request (GTK_WIDGET (window), 200, 100); gtk_window_set_position (GTK_WINDOW(window), GTK_WIN_POS_CENTER); gtk_window_set_default_icon_from_file ("/usr/share/pixmaps/U2Bdownloader32x32.png", NULL); vbox = gtk_vbox_new(FALSE,0); gtk_container_add(GTK_CONTAINER(window), vbox); button = gtk_button_new_with_label("Download!"); chdir_button = gtk_button_new_with_label("Change Dir"); button_clear1 = gtk_button_new_with_label("Clear"); button_clear2 = gtk_button_new_with_label("Clear"); text_entry = gtk_entry_new(); saveToDir = gtk_entry_new(); gtk_entry_set_max_length(GTK_ENTRY(text_entry),200); gtk_entry_set_max_length(GTK_ENTRY(saveToDir),200); label = gtk_label_new(" Enter the youtube video link: "); label2 = gtk_label_new("Save to: "); label3 = gtk_label_new("by Fabio Bruno Pereira - v 1.0.1"); label_percent = gtk_label_new(" "); radio1 = gtk_radio_button_new_with_label (NULL, "Medium Quality"); radio2 = gtk_radio_button_new_with_label(gtk_radio_button_group (GTK_RADIO_BUTTON (radio1)), "DVD Quality"); check_button = gtk_check_button_new_with_label("Convert to .mpg"); GdkColor color; gdk_color_parse ("gray", &color); gtk_widget_modify_fg (label3, GTK_STATE_NORMAL, &color); hbox = gtk_hbox_new(FALSE,0); hbox2 = gtk_hbox_new(FALSE,0); hbox3 = gtk_hbox_new(FALSE,0); hbox4 = gtk_hbox_new(FALSE,0); gtk_box_pack_start(GTK_BOX(vbox), label, TRUE, TRUE, 5); gtk_box_pack_start(GTK_BOX(vbox),hbox, TRUE, TRUE, 0); gtk_box_pack_start(GTK_BOX(hbox), text_entry, TRUE, TRUE, 4); gtk_widget_show(text_entry); gtk_box_pack_start(GTK_BOX(hbox),button_clear1, FALSE, FALSE, 0); gtk_box_pack_start(GTK_BOX(vbox), label2, FALSE, FALSE, 5); gtk_box_pack_start(GTK_BOX(vbox),hbox2, TRUE, TRUE, 0); gtk_box_pack_start(GTK_BOX(hbox2), saveToDir, TRUE, TRUE, 4); gtk_box_pack_start(GTK_BOX(hbox2),button_clear2, FALSE, FALSE, 0); gtk_box_pack_start(GTK_BOX(vbox), chdir_button, FALSE, FALSE, 10); gtk_box_pack_start(GTK_BOX(vbox), button, FALSE, FALSE, 10); adj = (GtkAdjustment*)gtk_adjustment_new(0, 0, 100, 0, 0, 0); Bar = gtk_progress_bar_new_with_adjustment(adj); gtk_progress_set_format_string (GTK_PROGRESS (Bar),"%p%%"); gtk_progress_set_show_text (GTK_PROGRESS (Bar),TRUE); gtk_box_pack_start(GTK_BOX(vbox), Bar, FALSE, FALSE, 10); gtk_box_pack_start(GTK_BOX(vbox), label_percent, FALSE, FALSE, 0); gtk_box_pack_start(GTK_BOX(vbox), check_button, FALSE, FALSE, 3); gtk_box_pack_start(GTK_BOX(vbox),hbox3, TRUE, TRUE, 0); gtk_box_pack_start(GTK_BOX(vbox),hbox4, TRUE, TRUE, 0); gtk_box_pack_start(GTK_BOX(hbox3), radio1, FALSE, FALSE, 16); gtk_box_pack_start(GTK_BOX(hbox4), radio2, FALSE, FALSE, 16); gtk_box_pack_start(GTK_BOX(vbox), label3, FALSE, FALSE, 10); gtk_window_set_resizable (GTK_WINDOW (window), FALSE); gtk_window_set_title(GTK_WINDOW(window), "U2B Downloader"); gtk_container_set_border_width(GTK_CONTAINER(window), 15); gtk_widget_set_sensitive(radio1, FALSE); gtk_widget_set_sensitive(radio2, FALSE); gtk_signal_connect(GTK_OBJECT(window), "delete_event", GTK_SIGNAL_FUNC(delete_event_cb), NULL); gtk_signal_connect(GTK_OBJECT (radio2), "toggled", GTK_SIGNAL_FUNC (toggle_radio_button), NULL); gtk_signal_connect(GTK_OBJECT(window), "focus_out_event", G_CALLBACK(focus_event_cb), NULL); gtk_signal_connect(GTK_OBJECT(window), "focus_in_event", GTK_SIGNAL_FUNC(focusin_event_cb), NULL); gtk_signal_connect(GTK_OBJECT(window), "unmap_event", GTK_SIGNAL_FUNC(unmap_event_cb), NULL); gtk_signal_connect(GTK_OBJECT(window), "map_event", GTK_SIGNAL_FUNC(unmap_event_cb), NULL); gtk_signal_connect(GTK_OBJECT(button), "clicked", GTK_SIGNAL_FUNC(button_click_cb), NULL); gtk_signal_connect(GTK_OBJECT(button_clear2), "clicked", GTK_SIGNAL_FUNC(button_chdir_clear_cb), NULL); gtk_signal_connect(GTK_OBJECT(button_clear1), "clicked", GTK_SIGNAL_FUNC(button_link_clear_cb), NULL); gtk_signal_connect(GTK_OBJECT(chdir_button), "clicked", GTK_SIGNAL_FUNC(create_file_selection), NULL); gtk_signal_connect (GTK_OBJECT (check_button), "toggled", GTK_SIGNAL_FUNC(togg), (gpointer *)check_button); gtk_widget_show_all(window); gtk_main(); return 0;}static void response_cb (GtkDialog *dialog, gint response_id){ if (response_id == GTK_RESPONSE_OK){ filename = gtk_file_chooser_get_filename(GTK_FILE_CHOOSER(file_selection_box)); gtk_entry_set_text(GTK_ENTRY(saveToDir), filename); }}void create_file_selection(void) { file_selection_box = gtk_file_chooser_dialog_new("Please select a directory.", GTK_WINDOW(window), GTK_FILE_CHOOSER_ACTION_SELECT_FOLDER, NULL,NULL); gtk_dialog_add_button (GTK_DIALOG (file_selection_box), GTK_STOCK_OK, GTK_RESPONSE_OK); char * home = getenv("HOME"); if(home != NULL){ gtk_file_chooser_set_current_folder(GTK_FILE_CHOOSER(file_selection_box),home); gtk_file_chooser_set_filename(GTK_FILE_CHOOSER(file_selection_box),home); } gtk_file_chooser_set_show_hidden(GTK_FILE_CHOOSER(file_selection_box), FALSE); g_signal_connect (GTK_DIALOG (file_selection_box), "response", G_CALLBACK (response_cb), NULL); gtk_dialog_run (GTK_DIALOG (file_selection_box)); gtk_widget_destroy (file_selection_box);}void toggle_radio_button( GtkWidget *widget){ if( GTK_TOGGLE_BUTTON( widget )->active ) { dvd_quality = 1; } else { dvd_quality = 0 ; }}static int convert = 0 ;void togg(GtkWidget *widget, gpointer *data){ if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(data))){ convert = 1; gtk_widget_set_sensitive(radio1, TRUE); gtk_widget_set_sensitive(radio2, TRUE); } else{ convert = 0 ; gtk_widget_set_sensitive(radio1, FALSE); gtk_widget_set_sensitive(radio2, FALSE); }}static gint focus_event_cb(GtkWidget* window, GdkEventAny* e, gpointer data){ mapped_window = 0; return FALSE;}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -