Implement source view with GIO and drop internal source view
We use GIO to choose a text editor unless a text editor was specified in the Preferences. We drop our internal source view now which used to serve as a fallback.
This commit is contained in:
parent
7f207ce2c9
commit
bbaa0fb9e6
6 changed files with 54 additions and 241 deletions
|
@ -17,7 +17,6 @@
|
||||||
#include "midori-browser.h"
|
#include "midori-browser.h"
|
||||||
|
|
||||||
#include "midori-view.h"
|
#include "midori-view.h"
|
||||||
#include "midori-source.h"
|
|
||||||
#include "midori-preferences.h"
|
#include "midori-preferences.h"
|
||||||
#include "midori-panel.h"
|
#include "midori-panel.h"
|
||||||
#include "midori-locationaction.h"
|
#include "midori-locationaction.h"
|
||||||
|
@ -2185,6 +2184,8 @@ midori_browser_source_transfer_cb (KatzeNetRequest* request,
|
||||||
{
|
{
|
||||||
if ((fp = fdopen (fd, "w")))
|
if ((fp = fdopen (fd, "w")))
|
||||||
{
|
{
|
||||||
|
gboolean success;
|
||||||
|
|
||||||
ret = fwrite (request->data, 1, request->length, fp);
|
ret = fwrite (request->data, 1, request->length, fp);
|
||||||
fclose (fp);
|
fclose (fp);
|
||||||
if ((ret - request->length) != 0)
|
if ((ret - request->length) != 0)
|
||||||
|
@ -2195,7 +2196,15 @@ midori_browser_source_transfer_cb (KatzeNetRequest* request,
|
||||||
}
|
}
|
||||||
g_object_get (browser->settings,
|
g_object_get (browser->settings,
|
||||||
"text-editor", &text_editor, NULL);
|
"text-editor", &text_editor, NULL);
|
||||||
sokoke_spawn_program (text_editor, unique_filename);
|
if (text_editor && *text_editor)
|
||||||
|
success = sokoke_spawn_program (text_editor, unique_filename);
|
||||||
|
else
|
||||||
|
{
|
||||||
|
gchar* command = g_strconcat ("exo-open ", unique_filename, NULL);
|
||||||
|
success = g_spawn_command_line_async (command, NULL);
|
||||||
|
g_free (command);
|
||||||
|
}
|
||||||
|
|
||||||
g_free (unique_filename);
|
g_free (unique_filename);
|
||||||
g_free (text_editor);
|
g_free (text_editor);
|
||||||
}
|
}
|
||||||
|
@ -2209,11 +2218,9 @@ static void
|
||||||
_action_source_view_activate (GtkAction* action,
|
_action_source_view_activate (GtkAction* action,
|
||||||
MidoriBrowser* browser)
|
MidoriBrowser* browser)
|
||||||
{
|
{
|
||||||
gchar* text_editor;
|
|
||||||
GtkWidget* view;
|
GtkWidget* view;
|
||||||
GtkWidget* source_view;
|
gchar* text_editor;
|
||||||
gchar* uri;
|
const gchar* uri;
|
||||||
gint n;
|
|
||||||
|
|
||||||
if (!(view = midori_browser_get_current_tab (browser)))
|
if (!(view = midori_browser_get_current_tab (browser)))
|
||||||
return;
|
return;
|
||||||
|
@ -2222,28 +2229,46 @@ _action_source_view_activate (GtkAction* action,
|
||||||
g_object_get (browser->settings, "text-editor", &text_editor, NULL);
|
g_object_get (browser->settings, "text-editor", &text_editor, NULL);
|
||||||
else
|
else
|
||||||
text_editor = NULL;
|
text_editor = NULL;
|
||||||
|
uri = midori_view_get_display_uri (MIDORI_VIEW (view));
|
||||||
|
|
||||||
if (text_editor && *text_editor)
|
if (!g_strcmp0 (text_editor, ""))
|
||||||
{
|
{
|
||||||
katze_net_load_uri (browser->net,
|
GFile* file = g_file_new_for_uri (uri);
|
||||||
midori_view_get_display_uri (MIDORI_VIEW (view)), NULL,
|
|
||||||
(KatzeNetTransferCb)midori_browser_source_transfer_cb, browser);
|
gchar* content_type;
|
||||||
g_free (text_editor);
|
GAppInfo* app_info;
|
||||||
return;
|
GList* files;
|
||||||
}
|
gpointer context;
|
||||||
else
|
|
||||||
{
|
#if GLIB_CHECK_VERSION (2, 18, 0)
|
||||||
uri = g_strdup_printf ("view-source:%s",
|
content_type = g_content_type_from_mime_type ("text/plain");
|
||||||
midori_view_get_display_uri (MIDORI_VIEW (view)));
|
#else
|
||||||
source_view = midori_view_new (browser->net);
|
content_type = g_strdup ("text/plain");
|
||||||
midori_view_set_settings (MIDORI_VIEW (source_view), browser->settings);
|
#endif
|
||||||
midori_view_set_uri (MIDORI_VIEW (source_view), uri);
|
|
||||||
midori_view_notify_icon_cb (MIDORI_VIEW (source_view), NULL, browser);
|
app_info = g_app_info_get_default_for_type (content_type,
|
||||||
g_free (uri);
|
!g_str_has_prefix (uri, "file://"));
|
||||||
gtk_widget_show (source_view);
|
g_free (content_type);
|
||||||
n = midori_browser_add_tab (browser, source_view);
|
files = g_list_prepend (NULL, file);
|
||||||
midori_browser_set_current_page (browser, n);
|
#if GTK_CHECK_VERSION (2, 14, 0)
|
||||||
|
context = gdk_app_launch_context_new ();
|
||||||
|
gdk_app_launch_context_set_screen (context, gtk_widget_get_screen (view));
|
||||||
|
gdk_app_launch_context_set_timestamp (context, gtk_get_current_event_time ());
|
||||||
|
#else
|
||||||
|
context = g_app_launch_context_new ();
|
||||||
|
#endif
|
||||||
|
if (g_app_info_launch (app_info, files, context, NULL))
|
||||||
|
{
|
||||||
|
g_object_unref (app_info);
|
||||||
|
g_list_free (files);
|
||||||
|
g_object_unref (file);
|
||||||
|
g_free (text_editor);
|
||||||
|
return;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
katze_net_load_uri (browser->net, uri, NULL,
|
||||||
|
(KatzeNetTransferCb)midori_browser_source_transfer_cb, browser);
|
||||||
g_free (text_editor);
|
g_free (text_editor);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -1,136 +0,0 @@
|
||||||
/*
|
|
||||||
Copyright (C) 2007-2008 Christian Dywan <christian@twotoasts.de>
|
|
||||||
|
|
||||||
This library is free software; you can redistribute it and/or
|
|
||||||
modify it under the terms of the GNU Lesser General Public
|
|
||||||
License as published by the Free Software Foundation; either
|
|
||||||
version 2.1 of the License, or (at your option) any later version.
|
|
||||||
|
|
||||||
See the file COPYING for the full license text.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#if HAVE_CONFIG_H
|
|
||||||
#include <config.h>
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#include "midori-source.h"
|
|
||||||
|
|
||||||
#include <katze/katze.h>
|
|
||||||
|
|
||||||
#include <string.h>
|
|
||||||
#include <glib/gi18n.h>
|
|
||||||
|
|
||||||
struct _MidoriSource
|
|
||||||
{
|
|
||||||
GtkTextView parent_instance;
|
|
||||||
|
|
||||||
KatzeNet* net;
|
|
||||||
};
|
|
||||||
|
|
||||||
struct _MidoriSourceClass
|
|
||||||
{
|
|
||||||
GtkTextViewClass parent_class;
|
|
||||||
};
|
|
||||||
|
|
||||||
G_DEFINE_TYPE (MidoriSource, midori_source, GTK_TYPE_TEXT_VIEW);
|
|
||||||
|
|
||||||
static void
|
|
||||||
midori_source_finalize (GObject* object);
|
|
||||||
|
|
||||||
static void
|
|
||||||
midori_source_class_init (MidoriSourceClass* class)
|
|
||||||
{
|
|
||||||
GObjectClass* gobject_class;
|
|
||||||
|
|
||||||
gobject_class = G_OBJECT_CLASS (class);
|
|
||||||
gobject_class->finalize = midori_source_finalize;
|
|
||||||
}
|
|
||||||
|
|
||||||
static void
|
|
||||||
midori_source_init (MidoriSource* source)
|
|
||||||
{
|
|
||||||
gtk_text_view_set_editable (GTK_TEXT_VIEW (source), FALSE);
|
|
||||||
gtk_text_view_set_wrap_mode (GTK_TEXT_VIEW (source), TRUE);
|
|
||||||
|
|
||||||
source->net = katze_net_new ();
|
|
||||||
}
|
|
||||||
|
|
||||||
static void
|
|
||||||
midori_source_finalize (GObject* object)
|
|
||||||
{
|
|
||||||
katze_object_assign (MIDORI_SOURCE (object)->net, NULL);
|
|
||||||
|
|
||||||
G_OBJECT_CLASS (midori_source_parent_class)->finalize (object);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* midori_source_new:
|
|
||||||
* @uri: a view-source: URI
|
|
||||||
*
|
|
||||||
* Creates a new source widget.
|
|
||||||
*
|
|
||||||
* Return value: a new #MidoriSource
|
|
||||||
**/
|
|
||||||
GtkWidget*
|
|
||||||
midori_source_new (const gchar* uri)
|
|
||||||
{
|
|
||||||
MidoriSource* source = g_object_new (MIDORI_TYPE_SOURCE,
|
|
||||||
/*"uri", uri,*/
|
|
||||||
NULL);
|
|
||||||
midori_source_set_uri (source, uri);
|
|
||||||
|
|
||||||
return GTK_WIDGET (source);
|
|
||||||
}
|
|
||||||
|
|
||||||
static void
|
|
||||||
midori_source_transfer_cb (KatzeNetRequest* request,
|
|
||||||
MidoriSource* source)
|
|
||||||
{
|
|
||||||
gchar** mimev;
|
|
||||||
gchar* charset;
|
|
||||||
const gchar* default_charset;
|
|
||||||
gchar* contents_utf8;
|
|
||||||
GtkTextBuffer* buffer;
|
|
||||||
|
|
||||||
if (request->data)
|
|
||||||
{
|
|
||||||
if (!g_utf8_validate (request->data, request->length, NULL))
|
|
||||||
{
|
|
||||||
charset = NULL;
|
|
||||||
if (request->mime_type)
|
|
||||||
{
|
|
||||||
mimev = g_strsplit (request->mime_type, " ", 2);
|
|
||||||
if (mimev[0] && mimev[1] &&
|
|
||||||
g_str_has_prefix (mimev[1], "charset="))
|
|
||||||
charset = g_strdup (&mimev[1][8]);
|
|
||||||
g_strfreev (mimev);
|
|
||||||
}
|
|
||||||
g_get_charset (&default_charset);
|
|
||||||
contents_utf8 = g_convert (request->data, -1, "UTF-8",
|
|
||||||
charset ? charset : default_charset, NULL, NULL, NULL);
|
|
||||||
/* If conversion from the user's locale also failed,
|
|
||||||
try ISO-8859-1 as a last resort */
|
|
||||||
if (!contents_utf8)
|
|
||||||
contents_utf8 = g_convert (request->data, -1, "UTF-8",
|
|
||||||
"ISO-8859-1", NULL, NULL, NULL);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
contents_utf8 = (gchar*)request->data;
|
|
||||||
buffer = gtk_text_view_get_buffer (GTK_TEXT_VIEW (source));
|
|
||||||
if (contents_utf8)
|
|
||||||
gtk_text_buffer_set_text (buffer, contents_utf8, -1);
|
|
||||||
if (contents_utf8 != request->data)
|
|
||||||
g_free (contents_utf8);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void
|
|
||||||
midori_source_set_uri (MidoriSource* source,
|
|
||||||
const gchar* uri)
|
|
||||||
{
|
|
||||||
g_return_if_fail (MIDORI_IS_SOURCE (source));
|
|
||||||
g_return_if_fail (uri != NULL);
|
|
||||||
|
|
||||||
katze_net_load_uri (source->net, uri,
|
|
||||||
NULL, (KatzeNetTransferCb)midori_source_transfer_cb, source);
|
|
||||||
}
|
|
|
@ -1,47 +0,0 @@
|
||||||
/*
|
|
||||||
Copyright (C) 2008 Christian Dywan <christian@twotoasts.de>
|
|
||||||
|
|
||||||
This library is free software; you can redistribute it and/or
|
|
||||||
modify it under the terms of the GNU Lesser General Public
|
|
||||||
License as published by the Free Software Foundation; either
|
|
||||||
version 2.1 of the License, or (at your option) any later version.
|
|
||||||
|
|
||||||
See the file COPYING for the full license text.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#ifndef __MIDORI_SOURCE_H__
|
|
||||||
#define __MIDORI_SOURCE_H__
|
|
||||||
|
|
||||||
#include <gtk/gtk.h>
|
|
||||||
|
|
||||||
G_BEGIN_DECLS
|
|
||||||
|
|
||||||
#define MIDORI_TYPE_SOURCE \
|
|
||||||
(midori_source_get_type ())
|
|
||||||
#define MIDORI_SOURCE(obj) \
|
|
||||||
(G_TYPE_CHECK_INSTANCE_CAST ((obj), MIDORI_TYPE_SOURCE, MidoriSource))
|
|
||||||
#define MIDORI_SOURCE_CLASS(klass) \
|
|
||||||
(G_TYPE_CHECK_CLASS_CAST ((klass), MIDORI_TYPE_SOURCE, MidoriSourceClass))
|
|
||||||
#define MIDORI_IS_SOURCE(obj) \
|
|
||||||
(G_TYPE_CHECK_INSTANCE_TYPE ((obj), MIDORI_TYPE_SOURCE))
|
|
||||||
#define MIDORI_IS_SOURCE_CLASS(klass) \
|
|
||||||
(G_TYPE_CHECK_CLASS_TYPE ((klass), MIDORI_TYPE_SOURCE))
|
|
||||||
#define MIDORI_SOURCE_GET_CLASS(obj) \
|
|
||||||
(G_TYPE_INSTANCE_GET_CLASS ((obj), MIDORI_TYPE_SOURCE, MidoriSourceClass))
|
|
||||||
|
|
||||||
typedef struct _MidoriSource MidoriSource;
|
|
||||||
typedef struct _MidoriSourceClass MidoriSourceClass;
|
|
||||||
|
|
||||||
GType
|
|
||||||
midori_source_get_type (void);
|
|
||||||
|
|
||||||
GtkWidget*
|
|
||||||
midori_source_new (const gchar* uri);
|
|
||||||
|
|
||||||
void
|
|
||||||
midori_source_set_uri (MidoriSource* source,
|
|
||||||
const gchar* uri);
|
|
||||||
|
|
||||||
G_END_DECLS
|
|
||||||
|
|
||||||
#endif /* __MIDORI_SOURCE_H__ */
|
|
|
@ -14,7 +14,6 @@
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#include "midori-view.h"
|
#include "midori-view.h"
|
||||||
#include "midori-source.h"
|
|
||||||
#include "midori-stock.h"
|
#include "midori-stock.h"
|
||||||
|
|
||||||
#include "compat.h"
|
#include "compat.h"
|
||||||
|
@ -1603,43 +1602,18 @@ midori_view_construct_web_view (MidoriView* view)
|
||||||
* @view: a #MidoriView
|
* @view: a #MidoriView
|
||||||
*
|
*
|
||||||
* Opens the specified URI in the view.
|
* Opens the specified URI in the view.
|
||||||
*
|
|
||||||
* Pass an URI prefixed with "view-source:" in
|
|
||||||
* order to create a source view.
|
|
||||||
**/
|
**/
|
||||||
void
|
void
|
||||||
midori_view_set_uri (MidoriView* view,
|
midori_view_set_uri (MidoriView* view,
|
||||||
const gchar* uri)
|
const gchar* uri)
|
||||||
{
|
{
|
||||||
GtkWidget* widget;
|
|
||||||
gchar* data;
|
gchar* data;
|
||||||
|
|
||||||
g_return_if_fail (MIDORI_IS_VIEW (view));
|
g_return_if_fail (MIDORI_IS_VIEW (view));
|
||||||
|
|
||||||
if (!uri) uri = "";
|
if (!uri) uri = "";
|
||||||
|
|
||||||
if (!view->web_view && view->uri
|
if (1)
|
||||||
&& g_str_has_prefix (view->uri, "view-source:"))
|
|
||||||
{
|
|
||||||
g_signal_emit (view, signals[NEW_TAB], 0, uri);
|
|
||||||
}
|
|
||||||
else if (!view->web_view && g_str_has_prefix (uri, "view-source:"))
|
|
||||||
{
|
|
||||||
katze_assign (view->uri, g_strdup (uri));
|
|
||||||
g_object_notify (G_OBJECT (view), "uri");
|
|
||||||
if (view->item)
|
|
||||||
katze_item_set_uri (view->item, uri);
|
|
||||||
data = g_strdup_printf ("%s - %s", _("Source"), &uri[12]);
|
|
||||||
g_object_set (view, "title", data, NULL);
|
|
||||||
g_free (data);
|
|
||||||
katze_object_assign (view->icon,
|
|
||||||
gtk_widget_render_icon (GTK_WIDGET (view),
|
|
||||||
GTK_STOCK_EDIT, GTK_ICON_SIZE_MENU, NULL));
|
|
||||||
widget = midori_source_new (&uri[12]);
|
|
||||||
gtk_container_add (GTK_CONTAINER (view), widget);
|
|
||||||
gtk_widget_show (widget);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
{
|
||||||
if (!view->web_view)
|
if (!view->web_view)
|
||||||
midori_view_construct_web_view (view);
|
midori_view_construct_web_view (view);
|
||||||
|
@ -2260,10 +2234,10 @@ midori_view_can_zoom_out (MidoriView* view)
|
||||||
gboolean
|
gboolean
|
||||||
midori_view_can_view_source (MidoriView* view)
|
midori_view_can_view_source (MidoriView* view)
|
||||||
{
|
{
|
||||||
g_return_val_if_fail (MIDORI_IS_VIEW (view), FALSE);
|
|
||||||
|
|
||||||
const gchar* uri = view->uri;
|
const gchar* uri = view->uri;
|
||||||
|
|
||||||
|
g_return_val_if_fail (MIDORI_IS_VIEW (view), FALSE);
|
||||||
|
|
||||||
/* FIXME: Consider other types that are also text */
|
/* FIXME: Consider other types that are also text */
|
||||||
if (!g_str_has_prefix (view->mime_type, "text/")
|
if (!g_str_has_prefix (view->mime_type, "text/")
|
||||||
&& !g_strrstr (view->mime_type, "xml"))
|
&& !g_strrstr (view->mime_type, "xml"))
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
/*
|
/*
|
||||||
Copyright (C) 2008 Christian Dywan <christian@twotoasts.de>
|
Copyright (C) 2008-2009 Christian Dywan <christian@twotoasts.de>
|
||||||
|
|
||||||
This library is free software; you can redistribute it and/or
|
This library is free software; you can redistribute it and/or
|
||||||
modify it under the terms of the GNU Lesser General Public
|
modify it under the terms of the GNU Lesser General Public
|
||||||
|
@ -20,7 +20,6 @@
|
||||||
#include "midori-panel.h"
|
#include "midori-panel.h"
|
||||||
#include "midori-preferences.h"
|
#include "midori-preferences.h"
|
||||||
#include "midori-searchaction.h"
|
#include "midori-searchaction.h"
|
||||||
#include "midori-source.h"
|
|
||||||
#include "midori-stock.h"
|
#include "midori-stock.h"
|
||||||
#include "midori-view.h"
|
#include "midori-view.h"
|
||||||
#include "midori-viewable.h"
|
#include "midori-viewable.h"
|
||||||
|
|
|
@ -172,8 +172,6 @@ main (int argc,
|
||||||
(gconstpointer)MIDORI_TYPE_PREFERENCES, properties_type_test);
|
(gconstpointer)MIDORI_TYPE_PREFERENCES, properties_type_test);
|
||||||
g_test_add_data_func ("/properties/search-action",
|
g_test_add_data_func ("/properties/search-action",
|
||||||
(gconstpointer)MIDORI_TYPE_SEARCH_ACTION, properties_type_test);
|
(gconstpointer)MIDORI_TYPE_SEARCH_ACTION, properties_type_test);
|
||||||
g_test_add_data_func ("/properties/source",
|
|
||||||
(gconstpointer)MIDORI_TYPE_SOURCE, properties_type_test);
|
|
||||||
g_test_add_data_func ("/properties/view",
|
g_test_add_data_func ("/properties/view",
|
||||||
(gconstpointer)MIDORI_TYPE_VIEW, properties_type_test);
|
(gconstpointer)MIDORI_TYPE_VIEW, properties_type_test);
|
||||||
g_test_add_data_func ("/properties/viewable",
|
g_test_add_data_func ("/properties/viewable",
|
||||||
|
|
Loading…
Reference in a new issue