diff options
-rw-r--r-- | src/web-view.c | 665 |
1 files changed, 8 insertions, 657 deletions
diff --git a/src/web-view.c b/src/web-view.c index 2eb10d3..b5a2283 100644 --- a/src/web-view.c +++ b/src/web-view.c @@ -60,418 +60,12 @@ struct _MqWebViewClass { G_DEFINE_TYPE(MqWebView, mq_web_view, WEBKIT_TYPE_WEB_VIEW) -#define WKCMA(ACTION) \ - WEBKIT_CONTEXT_MENU_ACTION_##ACTION - -static void -menu_open_link_activate_cb(GtkAction G_GNUC_UNUSED *action, MqWebView *web_view) -{ - mq_web_view_load_uri(web_view, webkit_hit_test_result_get_link_uri( - web_view->hit_test_result)); -} - -static void -menu_open_link_tab_activate_cb(GtkAction G_GNUC_UNUSED *action, - MqWebView *web_view) -{ - mq_notebook_insert_child( - MQ_NOTEBOOK(gtk_widget_get_parent( - GTK_WIDGET(web_view->tab_page))), - webkit_hit_test_result_get_link_uri(web_view->hit_test_result), - web_view->tab_page, - !mq_config_get_boolean(web_view->config, "tabs.background")); -} - -static void -menu_open_link_win_activate_cb(GtkAction G_GNUC_UNUSED *action, - MqWebView *web_view) -{ - const gchar *uris[2] = { - webkit_hit_test_result_get_link_uri(web_view->hit_test_result), - NULL - }; - mq_application_add_window( - mq_tab_page_get_application(web_view->tab_page), uris); -} - -static void -menu_open_image_activate_cb(GtkAction G_GNUC_UNUSED *action, - MqWebView *web_view) -{ - mq_web_view_load_uri(web_view, webkit_hit_test_result_get_image_uri( - web_view->hit_test_result)); -} - -static void -menu_open_image_tab_activate_cb(GtkAction G_GNUC_UNUSED *action, - MqWebView *web_view) -{ - mq_notebook_insert_child( - MQ_NOTEBOOK(gtk_widget_get_parent( - GTK_WIDGET(web_view->tab_page))), - webkit_hit_test_result_get_image_uri(web_view->hit_test_result), - web_view->tab_page, - !mq_config_get_boolean(web_view->config, "tabs.background")); -} - -static void -menu_open_image_win_activate_cb(GtkAction G_GNUC_UNUSED *action, - MqWebView *web_view) -{ - const gchar *uris[2] = { - webkit_hit_test_result_get_image_uri(web_view->hit_test_result), - NULL - }; - mq_application_add_window( - mq_tab_page_get_application(web_view->tab_page), uris); -} - -static void -menu_open_video_activate_cb(GtkAction G_GNUC_UNUSED *action, - MqWebView *web_view) -{ - mq_web_view_load_uri(web_view, webkit_hit_test_result_get_media_uri( - web_view->hit_test_result)); -} - -static void -menu_open_video_tab_activate_cb(GtkAction G_GNUC_UNUSED *action, - MqWebView *web_view) -{ - mq_notebook_insert_child( - MQ_NOTEBOOK(gtk_widget_get_parent( - GTK_WIDGET(web_view->tab_page))), - webkit_hit_test_result_get_media_uri(web_view->hit_test_result), - web_view->tab_page, - !mq_config_get_boolean(web_view->config, "tabs.background")); -} - -static void -menu_open_video_win_activate_cb(GtkAction G_GNUC_UNUSED *action, - MqWebView *web_view) -{ - const gchar *uris[2] = { - webkit_hit_test_result_get_media_uri(web_view->hit_test_result), - NULL - }; - mq_application_add_window( - mq_tab_page_get_application(web_view->tab_page), uris); -} - -static void -menu_open_audio_activate_cb(GtkAction G_GNUC_UNUSED *action, - MqWebView *web_view) -{ - mq_web_view_load_uri(web_view, webkit_hit_test_result_get_media_uri( - web_view->hit_test_result)); -} - -static void -menu_open_audio_tab_activate_cb(GtkAction G_GNUC_UNUSED *action, - MqWebView *web_view) -{ - mq_notebook_insert_child( - MQ_NOTEBOOK(gtk_widget_get_parent( - GTK_WIDGET(web_view->tab_page))), - webkit_hit_test_result_get_media_uri(web_view->hit_test_result), - web_view->tab_page, - !mq_config_get_boolean(web_view->config, "tabs.background")); -} - -static void -menu_open_audio_win_activate_cb(GtkAction G_GNUC_UNUSED *action, - MqWebView *web_view) -{ - const gchar *uris[2] = { - webkit_hit_test_result_get_media_uri(web_view->hit_test_result), - NULL - }; - mq_application_add_window( - mq_tab_page_get_application(web_view->tab_page), uris); -} - -#define ITEM_DECLS \ - GtkAction *action; \ - WebKitContextMenuItem *menu_item; -#define ITEM_DECLS_NO_CUSTOM \ - WebKitContextMenuItem *menu_item; -#define NEW_CUSTOM_ITEM(NAME, LABEL) \ - G_STMT_START { \ - /* Don't blame me; blame WebKitGTK+ for using GtkAction. */ \ - G_GNUC_BEGIN_IGNORE_DEPRECATIONS \ - action = gtk_action_new(#NAME, (LABEL), NULL, NULL); \ - G_GNUC_END_IGNORE_DEPRECATIONS \ - g_signal_connect(action, "activate", \ - G_CALLBACK(menu_##NAME##_activate_cb), web_view); \ - menu_item = webkit_context_menu_item_new(action); \ - webkit_context_menu_append(context_menu, menu_item); \ - } G_STMT_END -#define NEW_STOCK_ITEM(STOCK) \ - G_STMT_START { \ - menu_item = webkit_context_menu_item_new_from_stock_action( \ - WEBKIT_CONTEXT_MENU_ACTION_##STOCK); \ - webkit_context_menu_append(context_menu, menu_item); \ - } G_STMT_END -#define NEW_SEPARATOR_ITEM() \ - G_STMT_START { \ - webkit_context_menu_append(context_menu, \ - webkit_context_menu_item_new_separator()); \ - } G_STMT_END -#define RESTORE_ITEMS(ITEMS) \ - G_STMT_START { \ - for (; ITEMS; ITEMS = ITEMS->next) { \ - webkit_context_menu_append(context_menu, ITEMS->data); \ - g_object_unref(ITEMS->data); \ - } \ - } G_STMT_END - -static void -context_menu_link_cb(WebKitContextMenu *context_menu, MqWebView *web_view) -{ - ITEM_DECLS - - NEW_CUSTOM_ITEM(open_link, "_Open Link"); - NEW_CUSTOM_ITEM(open_link_tab, "Open Link in New _Tab"); - NEW_CUSTOM_ITEM(open_link_win, "Open Link in New _Window"); - NEW_SEPARATOR_ITEM(); /* --- */ - NEW_STOCK_ITEM(DOWNLOAD_LINK_TO_DISK); /* _Download Linked File */ - NEW_STOCK_ITEM(COPY_LINK_TO_CLIPBOARD); /* Copy Link Loc_ation */ -} - -static void -context_menu_image_cb(WebKitContextMenu *context_menu, MqWebView *web_view) -{ - ITEM_DECLS - - NEW_CUSTOM_ITEM(open_image, "Open _Image"); - NEW_CUSTOM_ITEM(open_image_tab, "Open Image in New Tab"); - NEW_CUSTOM_ITEM(open_image_win, "Open Image in New Window"); - NEW_SEPARATOR_ITEM(); /* --- */ - NEW_STOCK_ITEM(DOWNLOAD_IMAGE_TO_DISK); /* Sa_ve Image As */ - NEW_STOCK_ITEM(COPY_IMAGE_TO_CLIPBOARD); /* Cop_y Image */ - NEW_STOCK_ITEM(COPY_IMAGE_URL_TO_CLIPBOARD); /* Copy Image _Address */ -} - -static void -context_menu_media_cb(WebKitContextMenu *context_menu, GList *media_ctrl_items, - GList *media_toggle_items, gboolean is_video, MqWebView *web_view) -{ - ITEM_DECLS - - /* _Play/_Pause, _Mute */ - RESTORE_ITEMS(media_ctrl_items); - /* _Toggle Media Controls, Toggle Media _Loop Playback, Switch Video to - * _Fullscreen */ - RESTORE_ITEMS(media_toggle_items); - NEW_SEPARATOR_ITEM(); /* --- */ - if (is_video) { - NEW_CUSTOM_ITEM(open_video, "_Open Video"); - NEW_CUSTOM_ITEM(open_video_tab, "Open Video in New Tab"); - NEW_CUSTOM_ITEM(open_video_win, "Open Video in New Window"); - NEW_SEPARATOR_ITEM(); /* --- */ - NEW_STOCK_ITEM(DOWNLOAD_VIDEO_TO_DISK); /* Download _Video */ - /* Cop_y Video Link Location */ - NEW_STOCK_ITEM(COPY_VIDEO_LINK_TO_CLIPBOARD); - } else { - NEW_CUSTOM_ITEM(open_audio, "_Open Audio"); - NEW_CUSTOM_ITEM(open_audio_tab, "Open Audio in New Tab"); - NEW_CUSTOM_ITEM(open_audio_win, "Open Audio in New Window"); - NEW_SEPARATOR_ITEM(); /* --- */ - NEW_STOCK_ITEM(DOWNLOAD_AUDIO_TO_DISK); /* Download _Audio */ - /* Cop_y Audio Link Location */ - NEW_STOCK_ITEM(COPY_AUDIO_LINK_TO_CLIPBOARD); - } -} - -static void -context_menu_editable_cb(WebKitContextMenu *context_menu, - GList *spell_repl_items, GList *spell_ctrl_items, GList *edit_items, - GList *input_items, MqWebView G_GNUC_UNUSED *web_view) -{ - ITEM_DECLS_NO_CUSTOM - - RESTORE_ITEMS(spell_repl_items); /* Spelling suggestions */ - NEW_SEPARATOR_ITEM(); /* --- */ - RESTORE_ITEMS(spell_ctrl_items); /* _Ignore Spelling, _Learn Spelling */ - NEW_SEPARATOR_ITEM(); /* --- */ - RESTORE_ITEMS(edit_items); /* Cu_t, _Copy, _Paste, _Delete */ - NEW_SEPARATOR_ITEM(); /* --- */ - NEW_STOCK_ITEM(SELECT_ALL); /* Select _All */ - NEW_SEPARATOR_ITEM(); /* --- */ - RESTORE_ITEMS(input_items); /* _Insert Unicode Character */ -} -static void -context_menu_document_cb(WebKitContextMenu *context_menu, GList *nav_items, - MqWebView G_GNUC_UNUSED *web_view) -{ - ITEM_DECLS_NO_CUSTOM - - RESTORE_ITEMS(nav_items); /* _Back, _Forward, _Stop, _Reload */ - NEW_SEPARATOR_ITEM(); /* --- */ - NEW_STOCK_ITEM(SELECT_ALL); /* Select _All */ - NEW_SEPARATOR_ITEM(); /* --- */ - /* View Page Source */ -} - -#define PRESERVE_ITEM(ITEMS) \ - G_STMT_START { \ - g_object_ref(items->data); \ - ITEMS = g_list_prepend(ITEMS, items->data); \ - } G_STMT_END - static gboolean context_menu_cb(MqWebView *web_view, WebKitContextMenu *context_menu, - GdkEvent G_GNUC_UNUSED *event, WebKitHitTestResult *hit_test_result) + GdkEvent *event, WebKitHitTestResult *hit_test_result) { - GList *items; - GList *nav_items; - GList *edit_items; - GList *input_items; - GList *spell_repl_items; - GList *spell_ctrl_items; - GList *media_ctrl_items; - GList *media_toggle_items; - gboolean is_selection; - gboolean is_video; - WebKitContextMenuAction stock_action; - WebKitHitTestResultContext context; - gboolean context_handled; - WebKitContextMenuItem *menu_item; - - /* Get more hints about the context, since WebKit doesn't describe - * context very well in hit test results. Also, preserve menu items - * that aren't easy to reproduce (e.g. the Unicode menu and spelling - * guesses). */ - items = webkit_context_menu_get_items(context_menu); - nav_items = NULL; - edit_items = NULL; - input_items = NULL; - spell_repl_items = NULL; - spell_ctrl_items = NULL; - media_ctrl_items = NULL; - media_toggle_items = NULL; - is_selection = FALSE; - is_video = FALSE; - for (; items; items = items->next) { - stock_action = webkit_context_menu_item_get_stock_action( - items->data); -#pragma GCC diagnostic push -#pragma GCC diagnostic ignored "-Wswitch" - switch (stock_action) { - case WKCMA(GO_BACK): - case WKCMA(GO_FORWARD): - case WKCMA(STOP): - case WKCMA(RELOAD): - PRESERVE_ITEM(nav_items); - break; - case WKCMA(COPY): - PRESERVE_ITEM(edit_items); - is_selection = TRUE; - break; - case WKCMA(CUT): - case WKCMA(PASTE): - case WKCMA(DELETE): - PRESERVE_ITEM(edit_items); - break; - case WKCMA(INPUT_METHODS): - case WKCMA(UNICODE): - PRESERVE_ITEM(input_items); - break; - case WKCMA(SPELLING_GUESS): - case WKCMA(NO_GUESSES_FOUND): - PRESERVE_ITEM(spell_repl_items); - break; - case WKCMA(IGNORE_SPELLING): - case WKCMA(LEARN_SPELLING): - case WKCMA(IGNORE_GRAMMAR): - PRESERVE_ITEM(spell_ctrl_items); - break; - case WKCMA(OPEN_VIDEO_IN_NEW_WINDOW): - case WKCMA(COPY_VIDEO_LINK_TO_CLIPBOARD): - case WKCMA(DOWNLOAD_VIDEO_TO_DISK): - is_video = TRUE; - break; - case WKCMA(OPEN_AUDIO_IN_NEW_WINDOW): - case WKCMA(COPY_AUDIO_LINK_TO_CLIPBOARD): - case WKCMA(DOWNLOAD_AUDIO_TO_DISK): - is_video = FALSE; - break; - case WKCMA(TOGGLE_MEDIA_CONTROLS): - case WKCMA(TOGGLE_MEDIA_LOOP): - case WKCMA(ENTER_VIDEO_FULLSCREEN): - PRESERVE_ITEM(media_toggle_items); - break; - case WKCMA(MEDIA_PLAY): - case WKCMA(MEDIA_PAUSE): - case WKCMA(MEDIA_MUTE): - PRESERVE_ITEM(media_ctrl_items); - break; - } -#pragma GCC diagnostic pop - } - nav_items = g_list_reverse(nav_items); - edit_items = g_list_reverse(edit_items); - input_items = g_list_reverse(input_items); - spell_repl_items = g_list_reverse(spell_repl_items); - spell_ctrl_items = g_list_reverse(spell_ctrl_items); - media_ctrl_items = g_list_reverse(media_ctrl_items); - media_toggle_items = g_list_reverse(media_toggle_items); - - /* Clear the menu. */ - webkit_context_menu_remove_all(context_menu); - - /* Get the reported context (which isn't very descriptive) and save the - * hit test result for use by action callbacks. */ - context = webkit_hit_test_result_get_context(hit_test_result); - if (web_view->hit_test_result) { - g_object_unref(web_view->hit_test_result); - } - web_view->hit_test_result = hit_test_result; - g_object_ref(web_view->hit_test_result); - context_handled = FALSE; - - /* Build the context menu. */ - if (context & WEBKIT_HIT_TEST_RESULT_CONTEXT_LINK) { - context_menu_link_cb(context_menu, web_view); - context_handled = TRUE; - } - if (context & WEBKIT_HIT_TEST_RESULT_CONTEXT_IMAGE) { - if (context_handled) { - NEW_SEPARATOR_ITEM(); - } - context_menu_image_cb(context_menu, web_view); - context_handled = TRUE; - } - if (context & WEBKIT_HIT_TEST_RESULT_CONTEXT_MEDIA) { - context_menu_media_cb(context_menu, media_ctrl_items, - media_toggle_items, is_video, web_view); - context_handled = TRUE; - } - if (context & WEBKIT_HIT_TEST_RESULT_CONTEXT_EDITABLE) { - context_menu_editable_cb(context_menu, spell_repl_items, - spell_ctrl_items, edit_items, input_items, web_view); - context_handled = TRUE; - } - if (!context_handled && - context & WEBKIT_HIT_TEST_RESULT_CONTEXT_DOCUMENT) { - if (is_selection) { - RESTORE_ITEMS(edit_items); /* _Copy */ - context_handled = TRUE; - } else { - context_menu_document_cb(context_menu, nav_items, - web_view); - context_handled = TRUE; - } - } - if (context & WEBKIT_HIT_TEST_RESULT_CONTEXT_DOCUMENT) { - if (context_handled) { - NEW_SEPARATOR_ITEM(); - } - NEW_STOCK_ITEM(INSPECT_ELEMENT); /* Inspect Element */ - } - - /* Propagate the event further and show the context menu. */ - return FALSE; + return web_view->scheme_methods->context_menu(web_view, + &web_view->scheme, context_menu, event, hit_test_result); } static void @@ -592,16 +186,6 @@ decide_policy_cb(MqWebView *web_view, WebKitPolicyDecision *decision, } } -static gchar * -rewrite_uri(const gchar *uri) -{ - if (g_str_has_prefix(uri, "about:")) { - return g_strconcat("mq-about:", uri + strlen("about:"), NULL); - } else { - return g_strdup(uri); - } -} - static void constructed(GObject *object) { @@ -625,7 +209,8 @@ constructed(GObject *object) mq_tab_page_get_application(web_view->tab_page))); if (web_view->uri) { - rw_uri = rewrite_uri(web_view->uri); + rw_uri = web_view->scheme_methods->rewrite_uri( + &web_view->scheme, web_view->uri); webkit_web_view_load_uri(WEBKIT_WEB_VIEW(web_view), rw_uri); g_free(rw_uri); } else { @@ -804,7 +389,8 @@ mq_web_view_load_uri(MqWebView *web_view, const gchar *uri) web_view->uri = g_strdup(uri); if (g_str_has_prefix(uri, "about:")) { - rw_uri = rewrite_uri(web_view->uri); + rw_uri = web_view->scheme_methods->rewrite_uri( + &web_view->scheme, web_view->uri); webkit_web_view_load_uri(WEBKIT_WEB_VIEW(web_view), rw_uri); g_free(rw_uri); } else { @@ -941,243 +527,8 @@ mq_web_view_open(MqWebView *web_view) gtk_widget_show_all(dialog); } -static void -save_html_replace_cb(GFile *file, GAsyncResult *result, guchar *data) -{ - g_file_replace_contents_finish(file, result, NULL, NULL); - /* TODO: Error handling? */ - g_free(data); -} - -static void -save_html_get_data_cb(WebKitWebResource *resource, GAsyncResult *result, - MqWebView *web_view) -{ - guchar *data; - gsize length; - - data = webkit_web_resource_get_data_finish(resource, result, &length, - NULL); /* TODO: Error handling? */ - g_file_replace_contents_async(web_view->save_file, - (gchar *) data, length, - NULL, FALSE, G_FILE_CREATE_REPLACE_DESTINATION, NULL, - (GAsyncReadyCallback) save_html_replace_cb, data); -} - -static void -save_mhtml_cb(WebKitWebView *web_view, GAsyncResult *result) -{ - webkit_web_view_save_to_file_finish(web_view, result, NULL); -} - -static gchar * -get_extension(gchar *filename) -{ - gchar *extension; - - extension = strrchr(filename, '.'); - if (extension) { - return extension; - } else { - return filename + strlen(filename); - } -} - -static gboolean -extension_is_html(const gchar *extension) -{ - return - extension[0] == '.' && - extension[1] == 'h' && - extension[2] == 't' && - extension[3] == 'm' && - (extension[4] == '\0' || - (extension[4] == 'l' && - extension[5] == '\0')); -} - -static gboolean -extension_is_mhtml(const gchar *extension) -{ - return - extension[0] == '.' && - extension[1] == 'm' && - extension[2] == 'h' && - extension[3] == 't' && - (extension[4] == '\0' || - (extension[4] == 'm' && - (extension[5] == '\0' || - (extension[5] == 'l' && - extension[6] == '\0')))); -} - -static void -save_html(MqWebView *web_view, GFile *file) -{ - web_view->save_file = file; - webkit_web_resource_get_data( - webkit_web_view_get_main_resource(WEBKIT_WEB_VIEW(web_view)), - NULL, (GAsyncReadyCallback) save_html_get_data_cb, web_view); -} - -static void -save_mhtml(MqWebView *web_view, GFile *file) -{ - webkit_web_view_save_to_file(WEBKIT_WEB_VIEW(web_view), file, - WEBKIT_SAVE_MODE_MHTML, NULL, - (GAsyncReadyCallback) save_mhtml_cb, NULL); -} - -static gchar * -get_clean_title(MqWebView *web_view) -{ - const gchar *title; - - title = webkit_web_view_get_title(WEBKIT_WEB_VIEW(web_view)); - if (!title || title[0] == '\0') { - title = web_view->uri; - } - if (!title || title[0] == '\0') { - title = "page"; - } - return g_strdelimit(g_strdup(title), -#ifdef G_OS_WIN32 - "/\\:*\"?<>|", -#else - "/", -#endif - '_'); -} - -static void -save_type_changed_cb(GtkComboBox *combo_box, GtkFileChooser *chooser) -{ - gchar *name; - gchar *extension; - const gchar *active_id; - gchar *new_name; - - name = gtk_file_chooser_get_current_name(chooser); - extension = get_extension(name); - - active_id = gtk_combo_box_get_active_id(combo_box); - if (g_strcmp0(active_id, "html") == 0) { - if (!extension_is_html(extension)) { - /* Extension is not "htm" or "html". */ - extension[0] = '\0'; /* Remove extension. */ - new_name = g_strconcat(name, ".html", NULL); - gtk_file_chooser_set_current_name(chooser, new_name); - g_free(new_name); - } - } else if (g_strcmp0(active_id, "mhtml") == 0) { - if (!extension_is_mhtml(extension)) { - /* Extension is not "mht", "mhtm", or "mhtml". */ - extension[0] = '\0'; /* Remove extension. */ - new_name = g_strconcat(name, ".mhtml", NULL); - gtk_file_chooser_set_current_name(chooser, new_name); - g_free(new_name); - } - } - - g_free(name); -} - -static void -save_response_cb(GtkWidget *dialog, gint response_id, MqWebView *web_view) -{ - gchar *dir; - gchar *filename; - GFile *file; - gchar *extension; - const gchar *active_id; - - if (response_id == GTK_RESPONSE_ACCEPT) { - dir = gtk_file_chooser_get_current_folder( - GTK_FILE_CHOOSER(dialog)); - if (dir) { - mq_config_set_string(web_view->config, - "directories.downloads", dir); - g_free(dir); - mq_config_save(web_view->config); - } - - filename = gtk_file_chooser_get_filename( - GTK_FILE_CHOOSER(dialog)); - file = g_file_new_for_path(filename); - - active_id = gtk_combo_box_get_active_id( - web_view->save_type_combo_box); - if (g_strcmp0(active_id, "detect") == 0) { - extension = get_extension(filename); - if (extension_is_html(extension)) { - save_html(web_view, file); - } else { - save_mhtml(web_view, file); - } - } else if (g_strcmp0(active_id, "html") == 0) { - save_html(web_view, file); - } else if (g_strcmp0(active_id, "mhtml") == 0) { - save_mhtml(web_view, file); - } - - g_free(filename); - } - - gtk_widget_destroy(dialog); -} - void mq_web_view_save(MqWebView *web_view) { - GtkWidget *dialog; - GtkFileChooser *chooser; - gchar *dir; - gchar *title; - gchar *filename; - GtkWidget *type_combo_box; - GtkWidget *type_box; - - dialog = gtk_file_chooser_dialog_new("Save File", - GTK_WINDOW(mq_tab_page_get_window(web_view->tab_page)), - GTK_FILE_CHOOSER_ACTION_SAVE, - "_Cancel", GTK_RESPONSE_CANCEL, - "_Save", GTK_RESPONSE_ACCEPT, - NULL); - chooser = GTK_FILE_CHOOSER(dialog); - - gtk_file_chooser_set_do_overwrite_confirmation(chooser, TRUE); - - dir = mq_config_get_string(web_view->config, "directories.downloads"); - gtk_file_chooser_set_current_folder(chooser, dir); - g_free(dir); - - title = get_clean_title(web_view); - filename = g_strconcat(title, ".mhtml", NULL); - g_free(title); - gtk_file_chooser_set_current_name(chooser, filename); - g_free(filename); - - mq_web_view_add_html_mhtml_file_chooser_filters(chooser); - - type_combo_box = gtk_combo_box_text_new(); - gtk_combo_box_text_append(GTK_COMBO_BOX_TEXT(type_combo_box), - "detect", "By extension"); - gtk_combo_box_text_append(GTK_COMBO_BOX_TEXT(type_combo_box), - "html", "HTML document only"); - gtk_combo_box_text_append(GTK_COMBO_BOX_TEXT(type_combo_box), - "mhtml", "MHTML archive with associated resources"); - gtk_combo_box_set_active(GTK_COMBO_BOX(type_combo_box), 0); - g_signal_connect(type_combo_box, "changed", - G_CALLBACK(save_type_changed_cb), chooser); - web_view->save_type_combo_box = GTK_COMBO_BOX(type_combo_box); - - type_box = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 0); - gtk_box_pack_start(GTK_BOX(type_box), - gtk_label_new("Save as file type:"), FALSE, FALSE, 0); - gtk_box_pack_start(GTK_BOX(type_box), type_combo_box, FALSE, FALSE, 0); - gtk_file_chooser_set_extra_widget(chooser, type_box); - - g_signal_connect(dialog, "response", - G_CALLBACK(save_response_cb), web_view); - gtk_widget_show_all(dialog); + web_view->scheme_methods->save_file(web_view, &web_view->scheme); } |