Implement View source with external Text editor

This commit is contained in:
Christian Dywan 2008-10-20 21:32:25 +02:00
parent 2fccaa1bea
commit df12b9acb9
3 changed files with 131 additions and 10 deletions

View file

@ -35,6 +35,13 @@
#include <gdk/gdkkeysyms.h> #include <gdk/gdkkeysyms.h>
#include <gtk/gtk.h> #include <gtk/gtk.h>
#include <string.h> #include <string.h>
#ifdef HAVE_UNISTD_H
#include <unistd.h>
#endif
#if HAVE_LIBSOUP
#include <libsoup/soup.h>
#endif
struct _MidoriBrowser struct _MidoriBrowser
{ {
@ -72,6 +79,10 @@ struct _MidoriBrowser
KatzeArray* trash; KatzeArray* trash;
KatzeArray* search_engines; KatzeArray* search_engines;
KatzeArray* history; KatzeArray* history;
#if HAVE_LIBSOUP
SoupSession* session;
#endif
}; };
G_DEFINE_TYPE (MidoriBrowser, midori_browser, GTK_TYPE_WINDOW) G_DEFINE_TYPE (MidoriBrowser, midori_browser, GTK_TYPE_WINDOW)
@ -1642,27 +1653,98 @@ _action_zoom_normal_activate (GtkAction* action,
midori_view_set_zoom_level (MIDORI_VIEW (view), 1.0f); midori_view_set_zoom_level (MIDORI_VIEW (view), 1.0f);
} }
#if HAVE_LIBSOUP
static void
midori_browser_got_body_cb (SoupMessage* msg,
MidoriBrowser* browser)
{
SoupURI* soup_uri;
gchar* uri;
gchar* filename;
gchar* unique_filename;
gchar* text_editor;
gint fd;
FILE* fp;
if (msg->response_body->length > 0)
{
soup_uri = soup_message_get_uri (msg);
uri = soup_uri_to_string (soup_uri, FALSE);
filename = g_strdup_printf ("%uXXXXXX", g_str_hash (uri));
g_free (uri);
if (((fd = g_file_open_tmp (filename, &unique_filename, NULL)) != -1))
{
if ((fp = fdopen (fd, "w")))
{
fwrite (msg->response_body->data,
1, msg->response_body->length, fp);
fclose (fp);
g_object_get (browser->settings,
"text-editor", &text_editor, NULL);
sokoke_spawn_program (text_editor, unique_filename);
g_free (unique_filename);
g_free (text_editor);
}
close (fd);
}
g_free (filename);
}
}
#endif
static void static void
_action_source_view_activate (GtkAction* action, _action_source_view_activate (GtkAction* action,
MidoriBrowser* browser) MidoriBrowser* browser)
{ {
gchar* text_editor;
const gchar* current_uri;
#if HAVE_LIBSOUP
SoupMessage* msg;
#endif
GtkWidget* view; GtkWidget* view;
GtkWidget* source_view; GtkWidget* source_view;
gchar* filename;
gchar* uri; gchar* uri;
gint n; gint n;
if (!(view = midori_browser_get_current_tab (browser))) if (!(view = midori_browser_get_current_tab (browser)))
return; return;
uri = g_strdup_printf ("view-source:%s", g_object_get (browser->settings, "text-editor", &text_editor, NULL);
midori_view_get_display_uri (MIDORI_VIEW (view))); if (text_editor && *text_editor)
source_view = midori_view_new (); {
midori_view_set_settings (MIDORI_VIEW (source_view), browser->settings); current_uri = midori_view_get_display_uri (MIDORI_VIEW (view));
midori_view_set_uri (MIDORI_VIEW (source_view), uri); #if HAVE_LIBSOUP
g_free (uri); if (g_str_has_prefix (current_uri, "http://") ||
gtk_widget_show (source_view); g_str_has_prefix (current_uri, "https://"))
n = midori_browser_add_tab (browser, source_view); {
midori_browser_set_current_page (browser, n); msg = soup_message_new ("GET", current_uri);
g_signal_connect (msg, "got-body",
G_CALLBACK (midori_browser_got_body_cb), browser);
soup_session_queue_message (browser->session, msg, NULL, NULL);
g_free (text_editor);
return;
}
#endif
if (g_str_has_prefix (current_uri, "file://"))
{
filename = g_filename_from_uri (current_uri, NULL, NULL);
sokoke_spawn_program (text_editor, filename);
}
}
else
{
uri = g_strdup_printf ("view-source:%s",
midori_view_get_display_uri (MIDORI_VIEW (view)));
source_view = midori_view_new ();
midori_view_set_settings (MIDORI_VIEW (source_view), browser->settings);
midori_view_set_uri (MIDORI_VIEW (source_view), uri);
g_free (uri);
gtk_widget_show (source_view);
n = midori_browser_add_tab (browser, source_view);
midori_browser_set_current_page (browser, n);
}
g_free (text_editor);
} }
static void static void
@ -3258,6 +3340,10 @@ midori_browser_init (MidoriBrowser* browser)
GtkRcStyle* rcstyle; GtkRcStyle* rcstyle;
GtkAction* action; GtkAction* action;
#if HAVE_LIBSOUP
browser->session = soup_session_async_new ();
#endif
browser->settings = midori_web_settings_new (); browser->settings = midori_web_settings_new ();
browser->proxy_array = katze_array_new (KATZE_TYPE_ARRAY); browser->proxy_array = katze_array_new (KATZE_TYPE_ARRAY);
browser->bookmarks = NULL; browser->bookmarks = NULL;
@ -3758,6 +3844,10 @@ midori_browser_finalize (GObject* object)
if (browser->history) if (browser->history)
g_object_unref (browser->history); g_object_unref (browser->history);
#if HAVE_LIBSOUP
g_object_unref (browser->session);
#endif
G_OBJECT_CLASS (midori_browser_parent_class)->finalize (object); G_OBJECT_CLASS (midori_browser_parent_class)->finalize (object);
} }

View file

@ -336,7 +336,7 @@ midori_preferences_set_settings (MidoriPreferences* preferences,
FILLED_ADD (entry, 1, 2, 1, 2); FILLED_ADD (entry, 1, 2, 1, 2);
/* TODO: We need something like "use current website" */ /* TODO: We need something like "use current website" */
FRAME_NEW (_("Transfers")); FRAME_NEW (_("Transfers"));
TABLE_NEW (1, 2); TABLE_NEW (3, 2);
label = katze_property_label (settings, "download-folder"); label = katze_property_label (settings, "download-folder");
INDENTED_ADD (label, 0, 1, 0, 1); INDENTED_ADD (label, 0, 1, 0, 1);
button = katze_property_proxy (settings, "download-folder", "folder"); button = katze_property_proxy (settings, "download-folder", "folder");
@ -355,6 +355,20 @@ midori_preferences_set_settings (MidoriPreferences* preferences,
g_signal_connect (entry, "focus-out-event", g_signal_connect (entry, "focus-out-event",
G_CALLBACK (proxy_download_manager_icon_cb), button); G_CALLBACK (proxy_download_manager_icon_cb), button);
FILLED_ADD (hbox, 1, 2, 1, 2); FILLED_ADD (hbox, 1, 2, 1, 2);
label = katze_property_label (settings, "text-editor");
INDENTED_ADD (label, 0, 1, 2, 3);
hbox = gtk_hbox_new (FALSE, 4);
button = gtk_image_new ();
gtk_icon_size_lookup_for_settings (gtk_widget_get_settings (button),
GTK_ICON_SIZE_MENU, &icon_width, &icon_height);
gtk_widget_set_size_request (button, icon_width, icon_height);
gtk_box_pack_start (GTK_BOX (hbox), button, FALSE, FALSE, 4);
entry = katze_property_proxy (settings, "text-editor", NULL);
gtk_box_pack_start (GTK_BOX (hbox), entry, TRUE, TRUE, 0);
proxy_download_manager_icon_cb (entry, NULL, GTK_IMAGE (button));
g_signal_connect (entry, "focus-out-event",
G_CALLBACK (proxy_download_manager_icon_cb), button);
FILLED_ADD (hbox, 1, 2, 2, 3);
/* Page "Appearance" */ /* Page "Appearance" */
PAGE_NEW (GTK_STOCK_SELECT_FONT, _("Appearance")); PAGE_NEW (GTK_STOCK_SELECT_FONT, _("Appearance"));

View file

@ -46,6 +46,7 @@ struct _MidoriWebSettings
gchar* homepage; gchar* homepage;
gchar* download_folder; gchar* download_folder;
gchar* download_manager; gchar* download_manager;
gchar* text_editor;
gchar* location_entry_search; gchar* location_entry_search;
MidoriPreferredEncoding preferred_encoding; MidoriPreferredEncoding preferred_encoding;
@ -102,6 +103,7 @@ enum
PROP_HOMEPAGE, PROP_HOMEPAGE,
PROP_DOWNLOAD_FOLDER, PROP_DOWNLOAD_FOLDER,
PROP_DOWNLOAD_MANAGER, PROP_DOWNLOAD_MANAGER,
PROP_TEXT_EDITOR,
PROP_LOCATION_ENTRY_SEARCH, PROP_LOCATION_ENTRY_SEARCH,
PROP_PREFERRED_ENCODING, PROP_PREFERRED_ENCODING,
@ -454,6 +456,15 @@ midori_web_settings_class_init (MidoriWebSettingsClass* class)
NULL, NULL,
flags)); flags));
g_object_class_install_property (gobject_class,
PROP_TEXT_EDITOR,
g_param_spec_string (
"text-editor",
_("Text Editor"),
_("An external text editor"),
NULL,
flags));
g_object_class_install_property (gobject_class, g_object_class_install_property (gobject_class,
PROP_LOCATION_ENTRY_SEARCH, PROP_LOCATION_ENTRY_SEARCH,
g_param_spec_string ( g_param_spec_string (
@ -749,6 +760,9 @@ midori_web_settings_set_property (GObject* object,
case PROP_DOWNLOAD_MANAGER: case PROP_DOWNLOAD_MANAGER:
katze_assign (web_settings->download_manager, g_value_dup_string (value)); katze_assign (web_settings->download_manager, g_value_dup_string (value));
break; break;
case PROP_TEXT_EDITOR:
katze_assign (web_settings->text_editor, g_value_dup_string (value));
break;
case PROP_LOCATION_ENTRY_SEARCH: case PROP_LOCATION_ENTRY_SEARCH:
katze_assign (web_settings->location_entry_search, g_value_dup_string (value)); katze_assign (web_settings->location_entry_search, g_value_dup_string (value));
break; break;
@ -915,6 +929,9 @@ midori_web_settings_get_property (GObject* object,
case PROP_DOWNLOAD_MANAGER: case PROP_DOWNLOAD_MANAGER:
g_value_set_string (value, web_settings->download_manager); g_value_set_string (value, web_settings->download_manager);
break; break;
case PROP_TEXT_EDITOR:
g_value_set_string (value, web_settings->text_editor);
break;
case PROP_LOCATION_ENTRY_SEARCH: case PROP_LOCATION_ENTRY_SEARCH:
g_value_set_string (value, web_settings->location_entry_search); g_value_set_string (value, web_settings->location_entry_search);
break; break;