gtk-khtml.cc

来自「khtml在gtk上的移植版本」· CC 代码 · 共 1,018 行 · 第 1/2 页

CC
1,018
字号
/* * Copyright (c) 2004 Nokia. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * * Neither the name of Nokia nor the names of its contributors may be * used to endorse or promote products derived from this software * without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */#include <string.h> /* memset() */#include <assert.h>#include "gtk-khtml.h"#include "gtk-khtml-private.h"#include "gtk-khtml-marshal.h"#include "osb.h"static void gtk_khtml_class_init (GtkKHTMLClass * c) G_GNUC_UNUSED;static void gtk_khtml_init (GtkKHTML * self) G_GNUC_UNUSED;static void _gtk_khtml_finalize (GObject * self) G_GNUC_UNUSED;static void _gtk_khtml_realize (GtkWidget * widget) G_GNUC_UNUSED;static void _gtk_khtml_map (GtkWidget * widget) G_GNUC_UNUSED;static gboolean _gtk_khtml_expose_event (GtkWidget * widget, GdkEventExpose * event) G_GNUC_UNUSED;static void _gtk_khtml_size_allocate (GtkWidget * widget, GtkAllocation * allocation) G_GNUC_UNUSED;enum {    STATUS_TEXT_SIGNAL,    STATUS_SIGNAL,    LOCATION_SIGNAL,    TITLE_SIGNAL,    PROGRESS_SIGNAL,    REQ_NEW_WINDOW,    LOAD_START,    LOAD_STOP,    LOAD_ITEM_START,    LOAD_ITEM_PROGRESS,    LOAD_ITEM_STOP,    REQ_AUTH_PROMPT,    MOUSE_OVER,    SELECTION,    LAST_SIGNAL};static guint object_signals[LAST_SIGNAL] = {0};/* pointer to the class of our parent */static GtkBinClass *parent_class = NULL;GTypegtk_khtml_get_type (void){    static GType type = 0;    if G_UNLIKELY(type == 0) {	static const GTypeInfo info = {	    sizeof (GtkKHTMLClass),	    (GBaseInitFunc) NULL,	    (GBaseFinalizeFunc) NULL,	    (GClassInitFunc) gtk_khtml_class_init,	    (GClassFinalizeFunc) NULL,	    NULL /* class_data */,	    sizeof (GtkKHTML),	    0 /* n_preallocs */,	    (GInstanceInitFunc) gtk_khtml_init,	};	type = g_type_register_static (GTK_TYPE_BIN, "GtkKHTML", &info, (GTypeFlags)0);    }    return type;}#undef PARENT_HANDLERstatic void gtk_khtml_class_init (GtkKHTMLClass * c){    GObjectClass *g_object_class = (GObjectClass*) c;    GtkWidgetClass *gtk_widget_class = (GtkWidgetClass *)c;    parent_class = (GtkBinClass *)g_type_class_ref (GTK_TYPE_BIN);    object_signals[STATUS_TEXT_SIGNAL] =	g_signal_new ("status_text",		      G_TYPE_FROM_CLASS (g_object_class),		      (GSignalFlags)(G_SIGNAL_RUN_LAST),		      G_STRUCT_OFFSET (GtkKHTMLClass, status_text),		      NULL, NULL,		      gtk_khtml_marshal_VOID__VOID,		      G_TYPE_NONE, 0);    object_signals[STATUS_SIGNAL] =	g_signal_new ("status",		      G_TYPE_FROM_CLASS (g_object_class),		      (GSignalFlags)(G_SIGNAL_RUN_LAST),		      G_STRUCT_OFFSET (GtkKHTMLClass, status),		      NULL, NULL,		      gtk_khtml_marshal_VOID__POINTER,		      G_TYPE_NONE, 1,		      G_TYPE_POINTER);    object_signals[LOCATION_SIGNAL] =	g_signal_new ("location",		      G_TYPE_FROM_CLASS (g_object_class),		      (GSignalFlags)(G_SIGNAL_RUN_LAST),		      G_STRUCT_OFFSET (GtkKHTMLClass, location),		      NULL, NULL,		      g_cclosure_marshal_VOID__VOID,		      G_TYPE_NONE, 0);    object_signals[TITLE_SIGNAL] =	g_signal_new ("title",		      G_TYPE_FROM_CLASS (g_object_class),		      (GSignalFlags)(G_SIGNAL_RUN_LAST),		      G_STRUCT_OFFSET (GtkKHTMLClass, title),		      NULL, NULL,		      gtk_khtml_marshal_VOID__VOID,		      G_TYPE_NONE, 0);    object_signals[PROGRESS_SIGNAL] =	g_signal_new ("progress",		      G_TYPE_FROM_CLASS (g_object_class),		      (GSignalFlags)(G_SIGNAL_RUN_LAST),		      G_STRUCT_OFFSET (GtkKHTMLClass, progress),		      NULL, NULL,		      gtk_khtml_marshal_VOID__INT_INT,		      G_TYPE_NONE, 2,		      G_TYPE_INT,		      G_TYPE_INT);    object_signals[REQ_NEW_WINDOW] =	g_signal_new ("req-new-window",		      G_TYPE_FROM_CLASS (g_object_class),		      (GSignalFlags)(G_SIGNAL_RUN_LAST),		      G_STRUCT_OFFSET (GtkKHTMLClass, progress),		      NULL, NULL,		      gtk_khtml_marshal_POINTER__POINTER,		      G_TYPE_POINTER, 1, G_TYPE_POINTER);    object_signals[LOAD_START] =	g_signal_new ("load-start",		      G_TYPE_FROM_CLASS (g_object_class),		      (GSignalFlags)(G_SIGNAL_RUN_LAST),		      G_STRUCT_OFFSET (GtkKHTMLClass, progress),		      NULL, NULL,		      gtk_khtml_marshal_VOID__VOID,		      G_TYPE_NONE, 0);    object_signals[LOAD_STOP] =	g_signal_new ("load-stop",		      G_TYPE_FROM_CLASS (g_object_class),		      (GSignalFlags)(G_SIGNAL_RUN_LAST),		      G_STRUCT_OFFSET (GtkKHTMLClass, progress),		      NULL, NULL,		      gtk_khtml_marshal_VOID__VOID,		      G_TYPE_NONE, 0);    object_signals[LOAD_ITEM_START] =	g_signal_new ("load-item-start",		      G_TYPE_FROM_CLASS (g_object_class),		      (GSignalFlags)(G_SIGNAL_RUN_LAST),		      G_STRUCT_OFFSET (GtkKHTMLClass, progress),		      NULL, NULL,		      gtk_khtml_marshal_VOID__INT,		      G_TYPE_NONE, 0);    object_signals[LOAD_ITEM_PROGRESS] =	g_signal_new ("load-item-progress",		      G_TYPE_FROM_CLASS (g_object_class),		      (GSignalFlags)(G_SIGNAL_RUN_LAST),		      G_STRUCT_OFFSET (GtkKHTMLClass, progress),		      NULL, NULL,		      gtk_khtml_marshal_VOID__INT_INT,		      G_TYPE_NONE, 0);    object_signals[LOAD_ITEM_STOP] =	g_signal_new ("load-item-stop",		      G_TYPE_FROM_CLASS (g_object_class),		      (GSignalFlags)(G_SIGNAL_RUN_LAST),		      G_STRUCT_OFFSET (GtkKHTMLClass, progress),		      NULL, NULL,		      gtk_khtml_marshal_VOID__INT,		      G_TYPE_NONE, 0);    object_signals[LOAD_STOP] =	g_signal_new ("req-js-prompt",		      G_TYPE_FROM_CLASS (g_object_class),		      (GSignalFlags)(G_SIGNAL_RUN_LAST),		      G_STRUCT_OFFSET (GtkKHTMLClass, progress),		      NULL, NULL,		      gtk_khtml_marshal_VOID__POINTER,		      G_TYPE_NONE, 1,		      G_TYPE_POINTER);    object_signals[REQ_AUTH_PROMPT] =	g_signal_new ("req-auth-prompt",		      G_TYPE_FROM_CLASS (g_object_class),		      (GSignalFlags)(G_SIGNAL_RUN_LAST),		      G_STRUCT_OFFSET (GtkKHTMLClass, progress),		      NULL, NULL,		      gtk_khtml_marshal_VOID__POINTER,		      G_TYPE_NONE, 1,		      G_TYPE_POINTER);    object_signals[MOUSE_OVER] =	g_signal_new ("mouse-over",		      G_TYPE_FROM_CLASS (g_object_class),		      (GSignalFlags)(G_SIGNAL_RUN_LAST),		      G_STRUCT_OFFSET (GtkKHTMLClass, mouse_over),		      NULL, NULL,		      gtk_khtml_marshal_VOID__POINTER_POINTER_POINTER_POINTER,		      G_TYPE_NONE, 4,		      G_TYPE_POINTER,G_TYPE_POINTER,G_TYPE_POINTER,G_TYPE_POINTER );    object_signals[SELECTION] =	g_signal_new ("signal",		      G_TYPE_FROM_CLASS (g_object_class),		      (GSignalFlags)(G_SIGNAL_RUN_LAST),		      G_STRUCT_OFFSET (GtkKHTMLClass, selection),		      NULL, NULL,		      gtk_khtml_marshal_VOID__VOID,		      G_TYPE_NONE, 0);    c->status_text = NULL;    c->location = NULL;    c->title = NULL;    c->req_new_window = NULL;    c->load_start = NULL;    c->load_stop = NULL;    c->req_js_prompt = NULL;    g_object_class->finalize = _gtk_khtml_finalize;    gtk_widget_class->realize = _gtk_khtml_realize;    gtk_widget_class->map = _gtk_khtml_map;    gtk_widget_class->expose_event = _gtk_khtml_expose_event;    gtk_widget_class->size_allocate = _gtk_khtml_size_allocate;    return;}static void_gtk_khtml_finalize(GObject *objself){    GtkKHTML *self = GTK_KHTML (objself);    gpointer priv = self->_priv;    if (self->_priv->location) g_free (self->_priv->location);     if (self->_priv->title) g_free (self->_priv->title);    if (self->_priv->js_input_text) g_free (self->_priv->js_input_text);    if (self->_priv->auth_username) g_free (self->_priv->auth_username);    if (self->_priv->auth_password) g_free (self->_priv->auth_password);    g_free (priv);#define PARENT_HANDLER(___self) \	{ if(G_OBJECT_CLASS(parent_class)->finalize) \		(* G_OBJECT_CLASS(parent_class)->finalize)(___self); }    PARENT_HANDLER(G_OBJECT (self));    return;#undef PARENT_HANDLER}static void_on_gtk_khtml_destroy(GtkObject *object, gpointer user_data){    GtkKHTML* self = GTK_KHTML (object);    /* GtkBin has removed child from widget structure and decreased its reference count */    /* destruct structures, which leads to destruction of child and all inner objects */        if (self->_priv->browser) delete self->_priv->browser;    self->_priv->browser = 0;}static void gtk_khtml_init (GtkKHTML * self){    self->_priv = g_new0 (GtkKHTMLPrivate, 1);    return;}/** * gtk_khtml_new: * * Makes a new #GtkKHTML widget * * Returns: a new widget **/GtkWidget * gtk_khtml_new(){    OSB::Preferences *settings;    GtkKHTML* self = GTK_KHTML (g_object_new (gtk_khtml_get_type(),  NULL));    MyRoot* browser = new MyRoot(self);    self->_priv->browser = browser;    self->_priv->child = self->_priv->browser->mainFrame()->widget();    settings = self->_priv->browser->preferences();        settings->setWillLoadImagesAutomatically(true);    settings->setJavaScriptEnabled(true);    settings->setJavaEnabled(false);    settings->setPluginsEnabled(false);    settings->setMinimumFontSize(6);    settings->setDefaultFontSize(14);    settings->setDefaultFixedFontSize(10);    settings->setDefaultTextEncoding("ISO-8859-1");    settings->setSerifFontFamily("serif");    settings->setSansSerifFontFamily("sans");    settings->setFixedFontFamily("fixed");    settings->setStandardFontFamily("times");    settings->setCursiveFontFamily("times");    settings->setFantasyFontFamily("lucidabright");    gtk_container_add (GTK_CONTAINER (self), self->_priv->child);    /* to destruct structures (which destructs self->_priv->child)*/    g_signal_connect (G_OBJECT (self),		      "destroy",		      G_CALLBACK (_on_gtk_khtml_destroy),		      self);    return (GtkWidget*)self;}void gtk_khtml_load_url (GtkKHTML * self, const gchar * url){    g_return_if_fail (self != NULL);    g_return_if_fail (GTK_IS_KHTML (self));	    self->_priv->browser->mainFrame()->startLoad(url);	}void gtk_khtml_refresh (GtkKHTML * self){    g_return_if_fail (self != NULL);    g_return_if_fail (GTK_IS_KHTML (self));	    self->_priv->browser->mainFrame()->refresh();	}void gtk_khtml_stop_load (GtkKHTML * self){    g_return_if_fail (self != NULL);    g_return_if_fail (GTK_IS_KHTML (self));	    self->_priv->browser->mainFrame()->stopLoad();}gboolean gtk_khtml_can_go_back (GtkKHTML * self){    g_return_val_if_fail (self != NULL, (gboolean )0);    g_return_val_if_fail (GTK_IS_KHTML (self), (gboolean )0);    return self->_priv->browser->canGoBack();}gboolean gtk_khtml_can_go_forward (GtkKHTML * self){    g_return_val_if_fail (self != NULL, (gboolean )0);    g_return_val_if_fail (GTK_IS_KHTML (self), (gboolean )0);    return self->_priv->browser->canGoForward();}void gtk_khtml_go_back (GtkKHTML * self){    g_return_if_fail (self != NULL);    g_return_if_fail (GTK_IS_KHTML (self));    if ( self->_priv->browser->canGoBack())  	self->_priv->browser->goBack();}void gtk_khtml_go_forward (GtkKHTML * self){    g_return_if_fail (self != NULL);    g_return_if_fail (GTK_IS_KHTML (self));	    if ( self->_priv->browser->canGoForward())  	self->_priv->browser->goForward();}const gchar * gtk_khtml_get_location (GtkKHTML * self){    g_return_val_if_fail (self != NULL, (const gchar * )0);    g_return_val_if_fail (GTK_IS_KHTML (self), (const gchar * )0);    return self->_priv->browser->myLocation();}const gchar * gtk_khtml_get_title (GtkKHTML * self){    g_return_val_if_fail (self != NULL, (const gchar * )0);    g_return_val_if_fail (GTK_IS_KHTML (self), (const gchar * )0);        return self->_priv->browser->myTitle();}const GtkKHTMLLoadStatus * gtk_khtml_get_status (GtkKHTML * self){    g_return_val_if_fail (self != NULL, (const GtkKHTMLLoadStatus * )0);    g_return_val_if_fail (GTK_IS_KHTML (self), (const GtkKHTMLLoadStatus * )0);    return self->_priv->browser->myStatus();}void*gtk_khtml_get_internal (GtkKHTML * self){    g_return_val_if_fail (self != NULL, NULL);    g_return_val_if_fail (GTK_IS_KHTML (self), NULL);            return self->_priv->browser;}void gtk_khtml_set_settings (GtkKHTML * self, const GtkKHTMLSettings * settings){    g_return_if_fail (self != NULL);    g_return_if_fail (GTK_IS_KHTML (self));    OSB::Preferences *s = self->_priv->browser->preferences();    s->setWillLoadImagesAutomatically (settings->autoload_images);    s->setJavaScriptEnabled (settings->javascript_enabled);    s->setJavaEnabled (settings->java_enabled);    s->setPluginsEnabled (settings->plugins_enabled);    s->setMinimumFontSize (settings->minimum_font_size);    s->setDefaultFontSize (settings->default_font_size);    s->setDefaultFixedFontSize (settings->default_fixed_font_size);#define CALL_IF_SET(inst, method, var) if ((var)) (inst)->method (var);        CALL_IF_SET(s, setDefaultTextEncoding, settings->default_text_encoding);    CALL_IF_SET(s, setSerifFontFamily, settings->serif_font_family);    CALL_IF_SET(s, setSansSerifFontFamily, settings->sans_serif_font_family);    CALL_IF_SET(s, setFixedFontFamily, settings->fixed_font_family);    CALL_IF_SET(s, setStandardFontFamily, settings->standard_font_family);    CALL_IF_SET(s, setCursiveFontFamily, settings->cursive_font_family);    CALL_IF_SET(s, setFantasyFontFamily, settings->fantasy_font_family);#undef CALL_IF_SET        OSB::ProtocolDelegate* httpprov = self->_priv->browser->protocolDelegateForURL("http://");            if (httpprov) {	httpprov->setProxy(settings->http_proxy);    }}voidgtk_khtml_set_emit_internal_status (GtkKHTML* self, gboolean flag){    g_return_if_fail (self != NULL);    g_return_if_fail (GTK_IS_KHTML (self));    self->_priv->browser->setEmitInternal(flag == TRUE);}voidgtk_khtml_set_group (GtkKHTML * self, const gchar* group){    g_return_if_fail (self != NULL);    g_return_if_fail (GTK_IS_KHTML (self));    OSB::Root* browser = self->_priv->browser;    browser->setGroup(group);   }const gchar * gtk_khtml_get_group (GtkKHTML * self){    g_return_val_if_fail (self != NULL, NULL);    g_return_val_if_fail (GTK_IS_KHTML (self), NULL);    OSB::Root* browser = self->_priv->browser;    return browser->group();

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?