Guest User

claude-broswer-2e.c

a guest
Jul 28th, 2024
79
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 11.98 KB | Source Code | 0 0
  1. #include <gtk/gtk.h>
  2. #include <webkit2/webkit2.h>
  3.  
  4. static void show_about_dialog(GtkWidget *widget, gpointer data) {
  5. GtkWidget *dialog = gtk_about_dialog_new();
  6. gtk_about_dialog_set_program_name(GTK_ABOUT_DIALOG(dialog), "Simple Browser");
  7. gtk_about_dialog_set_version(GTK_ABOUT_DIALOG(dialog), "1.0");
  8. gtk_about_dialog_set_logo_icon_name(GTK_ABOUT_DIALOG(dialog), "web-browser");
  9. gtk_about_dialog_set_comments(GTK_ABOUT_DIALOG(dialog), "A simple GTK3 WebKit2 based browser");
  10. gtk_dialog_run(GTK_DIALOG(dialog));
  11. gtk_widget_destroy(dialog);
  12. }
  13.  
  14. static void go_back(GtkWidget *widget, WebKitWebView *web_view) {
  15. g_print("Back button clicked\n");
  16. if (webkit_web_view_can_go_back(web_view)) {
  17. g_print("Going back\n");
  18. webkit_web_view_go_back(web_view);
  19. } else {
  20. g_print("Cannot go back\n");
  21. }
  22. }
  23.  
  24. static void go_forward(GtkWidget *widget, WebKitWebView *web_view) {
  25. g_print("Forward button clicked\n");
  26. if (webkit_web_view_can_go_forward(web_view)) {
  27. g_print("Going forward\n");
  28. webkit_web_view_go_forward(web_view);
  29. } else {
  30. g_print("Cannot go forward\n");
  31. }
  32. }
  33.  
  34. static void zoom_in(GtkWidget *widget, WebKitWebView *web_view) {
  35. gdouble zoom_level = webkit_web_view_get_zoom_level(web_view);
  36. zoom_level += 0.1;
  37. webkit_web_view_set_zoom_level(web_view, zoom_level);
  38. g_print("Zoomed in. New zoom level: %.1f\n", zoom_level);
  39. }
  40.  
  41. static void zoom_out(GtkWidget *widget, WebKitWebView *web_view) {
  42. gdouble zoom_level = webkit_web_view_get_zoom_level(web_view);
  43. zoom_level -= 0.1;
  44. webkit_web_view_set_zoom_level(web_view, zoom_level);
  45. g_print("Zoomed out. New zoom level: %.1f\n", zoom_level);
  46. }
  47.  
  48.  
  49. static void print_web_view(GtkWidget *widget, WebKitWebView *web_view) {
  50. WebKitPrintOperation *print_operation = webkit_print_operation_new(web_view);
  51. webkit_print_operation_run_dialog(print_operation, GTK_WINDOW(gtk_widget_get_toplevel(GTK_WIDGET(web_view))));
  52. g_object_unref(print_operation);
  53. }
  54.  
  55. static void save_web_view_callback(GObject *source_object, GAsyncResult *res, gpointer user_data) {
  56. WebKitJavascriptResult *js_result;
  57. GError *error = NULL;
  58.  
  59. js_result = webkit_web_view_run_javascript_finish(WEBKIT_WEB_VIEW(source_object), res, &error);
  60. if (!js_result) {
  61. g_print("Error running JavaScript: %s\n", error->message);
  62. g_error_free(error);
  63. return;
  64. }
  65.  
  66. JSCValue *value = webkit_javascript_result_get_js_value(js_result);
  67. if (jsc_value_is_string(value)) {
  68. gchar *str_value = jsc_value_to_string(value);
  69. gchar *filename = (gchar *)user_data;
  70.  
  71. if (g_file_set_contents(filename, str_value, -1, &error)) {
  72. g_print("File saved successfully: %s\n", filename);
  73. } else {
  74. g_print("Error saving file: %s\n", error->message);
  75. g_error_free(error);
  76. }
  77.  
  78. g_free(str_value);
  79. g_free(filename);
  80. }
  81.  
  82. webkit_javascript_result_unref(js_result);
  83. }
  84.  
  85. static void save_web_view(GtkWidget *widget, WebKitWebView *web_view) {
  86. g_print("Save function called\n");
  87.  
  88. GtkWidget *dialog;
  89. GtkFileChooser *chooser;
  90. GtkFileChooserAction action = GTK_FILE_CHOOSER_ACTION_SAVE;
  91. gint res;
  92.  
  93. dialog = gtk_file_chooser_dialog_new("Save File",
  94. GTK_WINDOW(gtk_widget_get_toplevel(GTK_WIDGET(web_view))),
  95. action,
  96. "_Cancel",
  97. GTK_RESPONSE_CANCEL,
  98. "_Save",
  99. GTK_RESPONSE_ACCEPT,
  100. NULL);
  101. chooser = GTK_FILE_CHOOSER(dialog);
  102.  
  103. gtk_file_chooser_set_do_overwrite_confirmation(chooser, TRUE);
  104.  
  105. gtk_file_chooser_set_current_name(chooser, "webpage.html");
  106.  
  107. g_print("File chooser dialog created\n");
  108.  
  109. res = gtk_dialog_run(GTK_DIALOG(dialog));
  110. if (res == GTK_RESPONSE_ACCEPT) {
  111. char *filename;
  112. filename = gtk_file_chooser_get_filename(chooser);
  113. g_print("Selected filename: %s\n", filename);
  114.  
  115. const char *script = "document.documentElement.outerHTML;";
  116. webkit_web_view_run_javascript(web_view, script, NULL, save_web_view_callback, g_strdup(filename));
  117.  
  118. g_print("Save operation initiated\n");
  119. } else {
  120. g_print("Save operation cancelled\n");
  121. }
  122.  
  123. gtk_widget_destroy(dialog);
  124. g_print("Save function completed\n");
  125. }
  126.  
  127. static void update_address_bar(WebKitWebView *web_view, GtkWidget *address_bar) {
  128. const gchar *uri = webkit_web_view_get_uri(web_view);
  129. if (uri) {
  130. gtk_entry_set_text(GTK_ENTRY(address_bar), uri);
  131. }
  132. }
  133.  
  134. static void web_view_load_changed(WebKitWebView *web_view, WebKitLoadEvent load_event, gpointer user_data) {
  135. if (load_event == WEBKIT_LOAD_FINISHED) {
  136. update_address_bar(web_view, GTK_WIDGET(user_data));
  137. }
  138. }
  139.  
  140. static void new_window(GtkWidget *widget, gpointer data) {
  141. // Get the command to run the current executable
  142. gchar *executable = g_file_read_link("/proc/self/exe", NULL);
  143. if (executable == NULL) {
  144. g_print("Error getting executable path\n");
  145. return;
  146. }
  147.  
  148. // Spawn a new process
  149. gchar *argv[] = {executable, NULL};
  150. GError *error = NULL;
  151. if (!g_spawn_async(NULL, argv, NULL, G_SPAWN_SEARCH_PATH, NULL, NULL, NULL, &error)) {
  152. g_print("Error spawning new process: %s\n", error->message);
  153. g_error_free(error);
  154. }
  155.  
  156. g_free(executable);
  157. }
  158.  
  159.  
  160. static void load_url(GtkEntry *entry, gpointer user_data) {
  161. const gchar *url = gtk_entry_get_text(entry);
  162. g_print("Loading URL: %s\n", url);
  163.  
  164. if (g_str_has_prefix(url, "http://") || g_str_has_prefix(url, "https://")) {
  165. webkit_web_view_load_uri(WEBKIT_WEB_VIEW(user_data), url);
  166. } else {
  167. gchar *search_url = g_strdup_printf("https://www.google.com/search?q=%s", url);
  168. webkit_web_view_load_uri(WEBKIT_WEB_VIEW(user_data), search_url);
  169. g_free(search_url);
  170. }
  171. }
  172.  
  173. static void toggle_images_visibility(WebKitSettings *settings) {
  174. gboolean current_setting = webkit_settings_get_auto_load_images(settings);
  175. webkit_settings_set_auto_load_images(settings, !current_setting);
  176. }
  177.  
  178. static void on_show_image_toggled(GtkToggleButton *button, WebKitWebView *web_view) {
  179. WebKitSettings *settings = webkit_web_view_get_settings(web_view);
  180. toggle_images_visibility(settings);
  181. webkit_web_view_reload(web_view);
  182. }
  183.  
  184. static void reload(GtkWidget *widget, WebKitWebView *web_view) {
  185. webkit_web_view_reload(web_view);
  186. }
  187.  
  188.  
  189. int main(int argc, char *argv[]) {
  190. gtk_init(&argc, &argv);
  191.  
  192.  
  193. GtkWidget *window;
  194. GtkWidget *vbox;
  195. GtkWidget *menubar;
  196. GtkWidget *filemenu;
  197. GtkWidget *file;
  198. GtkWidget *new_window_item; // New menu item
  199. GtkWidget *save;
  200. GtkWidget *print;
  201. GtkWidget *quit;
  202. GtkWidget *helpmenu;
  203. GtkWidget *help;
  204. GtkWidget *about;
  205. GtkWidget *toolbar;
  206. GtkToolItem *back_button;
  207. GtkToolItem *forward_button;
  208. GtkToolItem *zoom_in_button;
  209. GtkToolItem *zoom_out_button;
  210. GtkToolItem *image_toggle_button;
  211. GtkToolItem *reload_button;
  212. GtkWidget *address_bar;
  213. GtkWidget *web_view;
  214.  
  215.  
  216. window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
  217. gtk_window_set_default_size(GTK_WINDOW(window), 800, 600);
  218. gtk_window_set_title(GTK_WINDOW(window), "Web-Browser");
  219. gtk_window_set_icon_name(GTK_WINDOW(window), "web-browser");
  220.  
  221.  
  222. vbox = gtk_box_new(GTK_ORIENTATION_VERTICAL, 0);
  223. gtk_container_add(GTK_CONTAINER(window), vbox);
  224.  
  225.  
  226. menubar = gtk_menu_bar_new();
  227. filemenu = gtk_menu_new();
  228. helpmenu = gtk_menu_new();
  229.  
  230. file = gtk_menu_item_new_with_label("File");
  231. save = gtk_menu_item_new_with_label("Save");
  232. new_window_item = gtk_menu_item_new_with_label("New Window"); // New menu item
  233. print = gtk_menu_item_new_with_label("Print");
  234. quit = gtk_menu_item_new_with_label("Quit");
  235. help = gtk_menu_item_new_with_label("Help");
  236. about = gtk_menu_item_new_with_label("About");
  237.  
  238. gtk_menu_item_set_submenu(GTK_MENU_ITEM(file), filemenu);
  239. gtk_menu_shell_append(GTK_MENU_SHELL(filemenu), new_window_item); // Add new menu item
  240. gtk_menu_shell_append(GTK_MENU_SHELL(filemenu), save);
  241. gtk_menu_shell_append(GTK_MENU_SHELL(filemenu), print);
  242. gtk_menu_shell_append(GTK_MENU_SHELL(filemenu), quit);
  243. gtk_menu_shell_append(GTK_MENU_SHELL(menubar), file);
  244.  
  245. gtk_menu_item_set_submenu(GTK_MENU_ITEM(help), helpmenu);
  246. gtk_menu_shell_append(GTK_MENU_SHELL(helpmenu), about);
  247. gtk_menu_shell_append(GTK_MENU_SHELL(menubar), help);
  248.  
  249. gtk_box_pack_start(GTK_BOX(vbox), menubar, FALSE, FALSE, 0);
  250.  
  251.  
  252. toolbar = gtk_toolbar_new();
  253. gtk_toolbar_set_style(GTK_TOOLBAR(toolbar), GTK_TOOLBAR_ICONS);
  254.  
  255.  
  256. back_button = gtk_tool_button_new(gtk_image_new_from_icon_name("go-previous", GTK_ICON_SIZE_SMALL_TOOLBAR), "Back");
  257. gtk_toolbar_insert(GTK_TOOLBAR(toolbar), back_button, -1);
  258.  
  259.  
  260. forward_button = gtk_tool_button_new(gtk_image_new_from_icon_name("go-next", GTK_ICON_SIZE_SMALL_TOOLBAR), "Forward");
  261. gtk_toolbar_insert(GTK_TOOLBAR(toolbar), forward_button, -1);
  262.  
  263.  
  264. zoom_in_button = gtk_tool_button_new(gtk_image_new_from_icon_name("zoom-in", GTK_ICON_SIZE_SMALL_TOOLBAR), "Zoom In");
  265. gtk_toolbar_insert(GTK_TOOLBAR(toolbar), zoom_in_button, -1);
  266.  
  267. zoom_out_button = gtk_tool_button_new(gtk_image_new_from_icon_name("zoom-out", GTK_ICON_SIZE_SMALL_TOOLBAR), "Zoom Out");
  268. gtk_toolbar_insert(GTK_TOOLBAR(toolbar), zoom_out_button, -1);
  269.  
  270. image_toggle_button = gtk_tool_button_new(gtk_image_new_from_icon_name("image", GTK_ICON_SIZE_SMALL_TOOLBAR), "Toggle Image");
  271. gtk_toolbar_insert(GTK_TOOLBAR(toolbar), image_toggle_button, -1);
  272.  
  273. reload_button = gtk_tool_button_new(gtk_image_new_from_icon_name("reload", GTK_ICON_SIZE_SMALL_TOOLBAR), "Reload Page");
  274. gtk_toolbar_insert(GTK_TOOLBAR(toolbar), reload_button, -1);
  275.  
  276.  
  277.  
  278.  
  279. address_bar = gtk_entry_new();
  280. GtkToolItem *address_item = gtk_tool_item_new();
  281. gtk_container_add(GTK_CONTAINER(address_item), address_bar);
  282. gtk_tool_item_set_expand(address_item, TRUE);
  283. gtk_toolbar_insert(GTK_TOOLBAR(toolbar), address_item, -1);
  284.  
  285.  
  286. gtk_box_pack_start(GTK_BOX(vbox), toolbar, FALSE, FALSE, 0);
  287.  
  288.  
  289. web_view = webkit_web_view_new();
  290.  
  291.  
  292. gtk_box_pack_start(GTK_BOX(vbox), web_view, TRUE, TRUE, 0);
  293.  
  294.  
  295. g_signal_connect(back_button, "clicked", G_CALLBACK(go_back), web_view);
  296. g_signal_connect(forward_button, "clicked", G_CALLBACK(go_forward), web_view);
  297. g_signal_connect(zoom_in_button, "clicked", G_CALLBACK(zoom_in), web_view);
  298. g_signal_connect(zoom_out_button, "clicked", G_CALLBACK(zoom_out), web_view);
  299. g_signal_connect(image_toggle_button, "clicked", G_CALLBACK(on_show_image_toggled), web_view);
  300. g_signal_connect(reload_button, "clicked", G_CALLBACK(reload), web_view);
  301.  
  302. g_signal_connect(address_bar, "activate", G_CALLBACK(load_url), web_view);
  303. g_signal_connect(about, "activate", G_CALLBACK(show_about_dialog), NULL);
  304. g_signal_connect(print, "activate", G_CALLBACK(print_web_view), web_view);
  305. g_signal_connect(save, "activate", G_CALLBACK(save_web_view), web_view);
  306. g_signal_connect(new_window_item, "activate", G_CALLBACK(new_window), NULL); // Connect new window signal
  307. g_signal_connect(quit, "activate", G_CALLBACK(gtk_main_quit), NULL);
  308. g_signal_connect(window, "destroy", G_CALLBACK(gtk_main_quit), NULL);
  309.  
  310. g_signal_connect(web_view, "load-changed", G_CALLBACK(web_view_load_changed), address_bar);
  311.  
  312. webkit_web_view_load_uri(WEBKIT_WEB_VIEW(web_view), "https://www.google.com");
  313.  
  314. update_address_bar(WEBKIT_WEB_VIEW(web_view), address_bar);
  315.  
  316. gtk_widget_show_all(window);
  317.  
  318. g_print("Starting GTK main loop\n");
  319. gtk_main();
  320.  
  321. return 0;
  322. }
Advertisement
Add Comment
Please, Sign In to add comment