Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <gtk/gtk.h>
- #include <webkit2/webkit2.h>
- //blxdown
- // New structure to hold download information
- typedef struct {
- WebKitDownload *download;
- GtkWidget *progress_bar;
- GtkWidget *label;
- } DownloadItem;
- static gchar* remove_extension(const gchar* filename) {
- gchar *dot = strrchr(filename, '.');
- if(!dot || dot == filename) return g_strdup(filename);
- return g_strndup(filename, dot - filename);
- }
- static gchar* get_extension(const gchar* filename) {
- gchar *dot = strrchr(filename, '.');
- if(!dot || dot == filename) return g_strdup("");
- return g_strdup(dot);
- }
- static gchar* ensure_unique_filename(const gchar* filename) {
- gchar *unique_name = g_strdup(filename);
- int counter = 1;
- while (g_file_test(unique_name, G_FILE_TEST_EXISTS)) {
- g_free(unique_name);
- gchar *basename = g_path_get_basename(filename);
- gchar *directory = g_path_get_dirname(filename);
- gchar *file_without_ext = remove_extension(basename);
- gchar *extension = get_extension(basename);
- unique_name = g_strdup_printf("%s/%s (%d)%s", directory, file_without_ext, counter, extension);
- g_free(basename);
- g_free(directory);
- g_free(file_without_ext);
- g_free(extension);
- counter++;
- }
- return unique_name;
- }
- // Global variables for download manager
- GtkWidget *download_window = NULL;
- GtkWidget *download_list = NULL;
- // New function to update download progress
- static void update_download_progress(WebKitDownload *download, GParamSpec *pspec, DownloadItem *item) {
- gdouble progress = webkit_download_get_estimated_progress(download);
- gtk_progress_bar_set_fraction(GTK_PROGRESS_BAR(item->progress_bar), progress);
- const gchar *destination = webkit_download_get_destination(download);
- const gchar *filename = g_path_get_basename(destination);
- gchar *progress_text = g_strdup_printf("%s - %.1f%%", filename, progress * 100);
- gtk_progress_bar_set_text(GTK_PROGRESS_BAR(item->progress_bar), progress_text);
- g_free(progress_text);
- }
- // New function to handle download finished event
- static void download_finished(WebKitDownload *download, DownloadItem *item) {
- const gchar *destination = webkit_download_get_destination(download);
- const gchar *filename = g_path_get_basename(destination);
- gchar *finished_text = g_strdup_printf("Downloaded: %s", filename);
- gtk_label_set_text(GTK_LABEL(item->label), finished_text);
- g_free(finished_text);
- gtk_progress_bar_set_fraction(GTK_PROGRESS_BAR(item->progress_bar), 1.0);
- gtk_progress_bar_set_text(GTK_PROGRESS_BAR(item->progress_bar), "100%");
- }
- // Callback function to set download_window to NULL when it's destroyed
- static void on_download_window_destroyed(GtkWidget *widget, gpointer user_data) {
- download_window = NULL;
- download_list = NULL;
- }
- static void show_download_manager(GtkWidget *widget, gpointer user_data) {
- if (download_window == NULL) {
- // Create the download window if it doesn't exist
- download_window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
- gtk_window_set_title(GTK_WINDOW(download_window), "Download Manager");
- gtk_window_set_default_size(GTK_WINDOW(download_window), 400, 300);
- download_list = gtk_box_new(GTK_ORIENTATION_VERTICAL, 5);
- GtkWidget *scrolled_window = gtk_scrolled_window_new(NULL, NULL);
- gtk_container_add(GTK_CONTAINER(scrolled_window), download_list);
- gtk_container_add(GTK_CONTAINER(download_window), scrolled_window);
- // Connect the delete-event to destroy the window instead of hiding it
- g_signal_connect(download_window, "delete-event", G_CALLBACK(gtk_widget_destroy), NULL);
- // Connect a destroy signal to set download_window to NULL when it's destroyed
- g_signal_connect(download_window, "destroy", G_CALLBACK(on_download_window_destroyed), NULL);
- }
- // Show the window and bring it to the front
- gtk_widget_show_all(download_window);
- gtk_window_present(GTK_WINDOW(download_window));
- }
- static void download_started(WebKitWebView *web_view, WebKitDownload *download, gpointer user_data) {
- g_print("Download started function called\n");
- show_download_manager(NULL, NULL);
- const gchar *destination = webkit_download_get_destination(download);
- if (destination == NULL) {
- g_print("Error: Download destination is NULL\n");
- // Get the current URI
- WebKitURIRequest *request = webkit_download_get_request(download);
- const gchar *uri = request ? webkit_uri_request_get_uri(request) : "N/A";
- g_print("Download URI: %s\n", uri);
- // Generate a filename from the URI
- gchar *suggested_filename = NULL;
- if (uri && uri[0] != '\0') {
- gchar *basename = g_path_get_basename(uri);
- if (strchr(basename, '.') == NULL) {
- // If there's no extension, add a default one
- suggested_filename = g_strconcat(basename, ".download", NULL);
- g_free(basename);
- } else {
- suggested_filename = basename;
- }
- } else {
- suggested_filename = g_strdup("download.bin");
- }
- g_print("Generated filename: %s\n", suggested_filename);
- // Set a default destination with the generated filename
- gchar *default_destination = g_build_filename(g_get_user_special_dir(G_USER_DIRECTORY_DOWNLOAD),
- suggested_filename,
- NULL);
- gchar *unique_destination = ensure_unique_filename(default_destination);
- webkit_download_set_destination(download, unique_destination);
- g_print("Set default destination: %s\n", default_destination);
- g_print("Set unique destination: %s\n", unique_destination);
- g_free(suggested_filename);
- g_free(default_destination);
- g_free(unique_destination);
- destination = webkit_download_get_destination(download);
- if (destination == NULL) {
- g_print("Error: Still unable to get download destination\n");
- return;
- }
- }
- g_print("Download destination: %s\n", destination);
- // Extract filename from destination path
- const gchar *filename = g_path_get_basename(destination);
- DownloadItem *item = g_new(DownloadItem, 1);
- item->download = download;
- GtkWidget *hbox = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 5);
- // Create a label with the filename
- gchar *label_text = g_strdup_printf("Downloading: %s", filename);
- item->label = gtk_label_new(label_text);
- g_free(label_text);
- item->progress_bar = gtk_progress_bar_new();
- gtk_progress_bar_set_show_text(GTK_PROGRESS_BAR(item->progress_bar), TRUE);
- gtk_box_pack_start(GTK_BOX(hbox), item->label, FALSE, FALSE, 0);
- gtk_box_pack_start(GTK_BOX(hbox), item->progress_bar, TRUE, TRUE, 0);
- gtk_container_add(GTK_CONTAINER(download_list), hbox);
- gtk_widget_show_all(download_window);
- g_signal_connect(download, "notify::estimated-progress", G_CALLBACK(update_download_progress), item);
- g_signal_connect(download, "finished", G_CALLBACK(download_finished), item);
- }
- //BLXdownend
- static void show_about_dialog(GtkWidget *widget, gpointer data) {
- GtkWidget *dialog = gtk_about_dialog_new();
- gtk_about_dialog_set_program_name(GTK_ABOUT_DIALOG(dialog), "Simple Browser");
- gtk_about_dialog_set_version(GTK_ABOUT_DIALOG(dialog), "1.0");
- gtk_about_dialog_set_logo_icon_name(GTK_ABOUT_DIALOG(dialog), "web-browser");
- gtk_about_dialog_set_comments(GTK_ABOUT_DIALOG(dialog), "A simple GTK3 WebKit2 based browser");
- gtk_dialog_run(GTK_DIALOG(dialog));
- gtk_widget_destroy(dialog);
- }
- static void go_back(GtkWidget *widget, WebKitWebView *web_view) {
- g_print("Back button clicked\n");
- if (webkit_web_view_can_go_back(web_view)) {
- g_print("Going back\n");
- webkit_web_view_go_back(web_view);
- } else {
- g_print("Cannot go back\n");
- }
- }
- static void go_forward(GtkWidget *widget, WebKitWebView *web_view) {
- g_print("Forward button clicked\n");
- if (webkit_web_view_can_go_forward(web_view)) {
- g_print("Going forward\n");
- webkit_web_view_go_forward(web_view);
- } else {
- g_print("Cannot go forward\n");
- }
- }
- static void zoom_in(GtkWidget *widget, WebKitWebView *web_view) {
- gdouble zoom_level = webkit_web_view_get_zoom_level(web_view);
- zoom_level += 0.1;
- webkit_web_view_set_zoom_level(web_view, zoom_level);
- g_print("Zoomed in. New zoom level: %.1f\n", zoom_level);
- }
- static void zoom_out(GtkWidget *widget, WebKitWebView *web_view) {
- gdouble zoom_level = webkit_web_view_get_zoom_level(web_view);
- zoom_level -= 0.1;
- webkit_web_view_set_zoom_level(web_view, zoom_level);
- g_print("Zoomed out. New zoom level: %.1f\n", zoom_level);
- }
- static void print_web_view(GtkWidget *widget, WebKitWebView *web_view) {
- WebKitPrintOperation *print_operation = webkit_print_operation_new(web_view);
- webkit_print_operation_run_dialog(print_operation, GTK_WINDOW(gtk_widget_get_toplevel(GTK_WIDGET(web_view))));
- g_object_unref(print_operation);
- }
- static void save_web_view_callback(GObject *source_object, GAsyncResult *res, gpointer user_data) {
- WebKitJavascriptResult *js_result;
- GError *error = NULL;
- js_result = webkit_web_view_run_javascript_finish(WEBKIT_WEB_VIEW(source_object), res, &error);
- if (!js_result) {
- g_print("Error running JavaScript: %s\n", error->message);
- g_error_free(error);
- return;
- }
- JSCValue *value = webkit_javascript_result_get_js_value(js_result);
- if (jsc_value_is_string(value)) {
- gchar *str_value = jsc_value_to_string(value);
- gchar *filename = (gchar *)user_data;
- if (g_file_set_contents(filename, str_value, -1, &error)) {
- g_print("File saved successfully: %s\n", filename);
- } else {
- g_print("Error saving file: %s\n", error->message);
- g_error_free(error);
- }
- g_free(str_value);
- g_free(filename);
- }
- webkit_javascript_result_unref(js_result);
- }
- static void save_web_view(GtkWidget *widget, WebKitWebView *web_view) {
- g_print("Save function called\n");
- GtkWidget *dialog;
- GtkFileChooser *chooser;
- GtkFileChooserAction action = GTK_FILE_CHOOSER_ACTION_SAVE;
- gint res;
- dialog = gtk_file_chooser_dialog_new("Save File",
- GTK_WINDOW(gtk_widget_get_toplevel(GTK_WIDGET(web_view))),
- action,
- "_Cancel",
- GTK_RESPONSE_CANCEL,
- "_Save",
- GTK_RESPONSE_ACCEPT,
- NULL);
- chooser = GTK_FILE_CHOOSER(dialog);
- gtk_file_chooser_set_do_overwrite_confirmation(chooser, TRUE);
- gtk_file_chooser_set_current_name(chooser, "webpage.html");
- g_print("File chooser dialog created\n");
- res = gtk_dialog_run(GTK_DIALOG(dialog));
- if (res == GTK_RESPONSE_ACCEPT) {
- char *filename;
- filename = gtk_file_chooser_get_filename(chooser);
- g_print("Selected filename: %s\n", filename);
- const char *script = "document.documentElement.outerHTML;";
- webkit_web_view_run_javascript(web_view, script, NULL, save_web_view_callback, g_strdup(filename));
- g_print("Save operation initiated\n");
- } else {
- g_print("Save operation cancelled\n");
- }
- gtk_widget_destroy(dialog);
- g_print("Save function completed\n");
- }
- static void update_address_bar(WebKitWebView *web_view, GtkWidget *address_bar) {
- const gchar *uri = webkit_web_view_get_uri(web_view);
- if (uri) {
- gtk_entry_set_text(GTK_ENTRY(address_bar), uri);
- }
- }
- static void web_view_load_changed(WebKitWebView *web_view, WebKitLoadEvent load_event, gpointer user_data) {
- if (load_event == WEBKIT_LOAD_FINISHED) {
- update_address_bar(web_view, GTK_WIDGET(user_data));
- }
- }
- static void new_window(GtkWidget *widget, gpointer data) {
- // Get the command to run the current executable
- gchar *executable = g_file_read_link("/proc/self/exe", NULL);
- if (executable == NULL) {
- g_print("Error getting executable path\n");
- return;
- }
- // Spawn a new process
- gchar *argv[] = {executable, NULL};
- GError *error = NULL;
- if (!g_spawn_async(NULL, argv, NULL, G_SPAWN_SEARCH_PATH, NULL, NULL, NULL, &error)) {
- g_print("Error spawning new process: %s\n", error->message);
- g_error_free(error);
- }
- g_free(executable);
- }
- static void load_url(GtkEntry *entry, gpointer user_data) {
- const gchar *url = gtk_entry_get_text(entry);
- g_print("Loading URL: %s\n", url);
- if (g_str_has_prefix(url, "http://") || g_str_has_prefix(url, "https://")) {
- webkit_web_view_load_uri(WEBKIT_WEB_VIEW(user_data), url);
- } else {
- gchar *search_url = g_strdup_printf("https://www.google.com/search?q=%s", url);
- webkit_web_view_load_uri(WEBKIT_WEB_VIEW(user_data), search_url);
- g_free(search_url);
- }
- }
- static void toggle_images_visibility(WebKitSettings *settings) {
- gboolean current_setting = webkit_settings_get_auto_load_images(settings);
- webkit_settings_set_auto_load_images(settings, !current_setting);
- }
- static void on_show_image_toggled(GtkToggleButton *button, WebKitWebView *web_view) {
- WebKitSettings *settings = webkit_web_view_get_settings(web_view);
- toggle_images_visibility(settings);
- webkit_web_view_reload(web_view);
- }
- static void reload(GtkWidget *widget, WebKitWebView *web_view) {
- webkit_web_view_reload(web_view);
- }
- int main(int argc, char *argv[]) {
- gtk_init(&argc, &argv);
- GtkWidget *window;
- GtkWidget *vbox;
- GtkWidget *menubar;
- GtkWidget *filemenu;
- GtkWidget *file;
- GtkWidget *new_window_item; // New menu item
- GtkWidget *save;
- GtkWidget *print;
- GtkWidget *quit;
- GtkWidget *helpmenu;
- GtkWidget *help;
- GtkWidget *about;
- GtkWidget *toolbar;
- GtkToolItem *back_button;
- GtkToolItem *forward_button;
- GtkToolItem *zoom_in_button;
- GtkToolItem *zoom_out_button;
- GtkToolItem *image_toggle_button;
- GtkToolItem *reload_button;
- GtkWidget *address_bar;
- GtkWidget *web_view;
- window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
- gtk_window_set_default_size(GTK_WINDOW(window), 800, 600);
- gtk_window_set_title(GTK_WINDOW(window), "Web-Browser");
- gtk_window_set_icon_name(GTK_WINDOW(window), "web-browser");
- vbox = gtk_box_new(GTK_ORIENTATION_VERTICAL, 0);
- gtk_container_add(GTK_CONTAINER(window), vbox);
- menubar = gtk_menu_bar_new();
- filemenu = gtk_menu_new();
- helpmenu = gtk_menu_new();
- file = gtk_menu_item_new_with_label("File");
- save = gtk_menu_item_new_with_label("Save");
- new_window_item = gtk_menu_item_new_with_label("New Window"); // New menu item
- print = gtk_menu_item_new_with_label("Print");
- quit = gtk_menu_item_new_with_label("Quit");
- help = gtk_menu_item_new_with_label("Help");
- about = gtk_menu_item_new_with_label("About");
- GtkWidget *downloads = gtk_menu_item_new_with_label("Downloads");
- gtk_menu_item_set_submenu(GTK_MENU_ITEM(file), filemenu);
- gtk_menu_shell_append(GTK_MENU_SHELL(filemenu), new_window_item); // Add new menu item
- gtk_menu_shell_append(GTK_MENU_SHELL(filemenu), save);
- gtk_menu_shell_append(GTK_MENU_SHELL(filemenu), print);
- gtk_menu_shell_append(GTK_MENU_SHELL(filemenu), downloads);
- gtk_menu_shell_append(GTK_MENU_SHELL(filemenu), quit);
- gtk_menu_shell_append(GTK_MENU_SHELL(menubar), file);
- gtk_menu_item_set_submenu(GTK_MENU_ITEM(help), helpmenu);
- gtk_menu_shell_append(GTK_MENU_SHELL(helpmenu), about);
- gtk_menu_shell_append(GTK_MENU_SHELL(menubar), help);
- gtk_box_pack_start(GTK_BOX(vbox), menubar, FALSE, FALSE, 0);
- toolbar = gtk_toolbar_new();
- gtk_toolbar_set_style(GTK_TOOLBAR(toolbar), GTK_TOOLBAR_ICONS);
- back_button = gtk_tool_button_new(gtk_image_new_from_icon_name("go-previous", GTK_ICON_SIZE_SMALL_TOOLBAR), "Back");
- gtk_toolbar_insert(GTK_TOOLBAR(toolbar), back_button, -1);
- forward_button = gtk_tool_button_new(gtk_image_new_from_icon_name("go-next", GTK_ICON_SIZE_SMALL_TOOLBAR), "Forward");
- gtk_toolbar_insert(GTK_TOOLBAR(toolbar), forward_button, -1);
- zoom_in_button = gtk_tool_button_new(gtk_image_new_from_icon_name("zoom-in", GTK_ICON_SIZE_SMALL_TOOLBAR), "Zoom In");
- gtk_toolbar_insert(GTK_TOOLBAR(toolbar), zoom_in_button, -1);
- zoom_out_button = gtk_tool_button_new(gtk_image_new_from_icon_name("zoom-out", GTK_ICON_SIZE_SMALL_TOOLBAR), "Zoom Out");
- gtk_toolbar_insert(GTK_TOOLBAR(toolbar), zoom_out_button, -1);
- image_toggle_button = gtk_tool_button_new(gtk_image_new_from_icon_name("image", GTK_ICON_SIZE_SMALL_TOOLBAR), "Toggle Image");
- gtk_toolbar_insert(GTK_TOOLBAR(toolbar), image_toggle_button, -1);
- reload_button = gtk_tool_button_new(gtk_image_new_from_icon_name("reload", GTK_ICON_SIZE_SMALL_TOOLBAR), "Reload Page");
- gtk_toolbar_insert(GTK_TOOLBAR(toolbar), reload_button, -1);
- address_bar = gtk_entry_new();
- GtkToolItem *address_item = gtk_tool_item_new();
- gtk_container_add(GTK_CONTAINER(address_item), address_bar);
- gtk_tool_item_set_expand(address_item, TRUE);
- gtk_toolbar_insert(GTK_TOOLBAR(toolbar), address_item, -1);
- gtk_box_pack_start(GTK_BOX(vbox), toolbar, FALSE, FALSE, 0);
- web_view = webkit_web_view_new();
- gtk_box_pack_start(GTK_BOX(vbox), web_view, TRUE, TRUE, 0);
- g_signal_connect(back_button, "clicked", G_CALLBACK(go_back), web_view);
- g_signal_connect(forward_button, "clicked", G_CALLBACK(go_forward), web_view);
- g_signal_connect(zoom_in_button, "clicked", G_CALLBACK(zoom_in), web_view);
- g_signal_connect(zoom_out_button, "clicked", G_CALLBACK(zoom_out), web_view);
- g_signal_connect(image_toggle_button, "clicked", G_CALLBACK(on_show_image_toggled), web_view);
- g_signal_connect(reload_button, "clicked", G_CALLBACK(reload), web_view);
- g_signal_connect(address_bar, "activate", G_CALLBACK(load_url), web_view);
- g_signal_connect(about, "activate", G_CALLBACK(show_about_dialog), NULL);
- g_signal_connect(print, "activate", G_CALLBACK(print_web_view), web_view);
- g_signal_connect(save, "activate", G_CALLBACK(save_web_view), web_view);
- g_signal_connect(new_window_item, "activate", G_CALLBACK(new_window), NULL); // Connect new window signal
- g_signal_connect(quit, "activate", G_CALLBACK(gtk_main_quit), NULL);
- g_signal_connect(window, "destroy", G_CALLBACK(gtk_main_quit), NULL);
- // New signal connections
- g_signal_connect(downloads, "activate", G_CALLBACK(show_download_manager), NULL);
- g_signal_connect(web_view, "download-started", G_CALLBACK(download_started), NULL);
- g_signal_connect(webkit_web_context_get_default(), "download-started", G_CALLBACK(download_started), NULL);
- g_signal_connect(web_view, "load-changed", G_CALLBACK(web_view_load_changed), address_bar);
- webkit_web_view_load_uri(WEBKIT_WEB_VIEW(web_view), "https://www.google.com");
- update_address_bar(WEBKIT_WEB_VIEW(web_view), address_bar);
- gtk_widget_show_all(window);
- g_print("Starting GTK main loop\n");
- gtk_main();
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment