⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 osb-browser.c

📁 khtml在gtk上的移植版本
💻 C
📖 第 1 页 / 共 2 页
字号:
/* * 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 "osb-browser.h"#include "osb-browser-private.h"#include <stdlib.h>		/* strtod */#include <string.h> 		/* strlen */#include <assert.h> 		/* assert */#include <glib.h>#include <glib/gprintf.h>       /* g_printf */#include <gtk/gtk.h>#include <gdk/gdk.h>#include <gdk-pixbuf/gdk-pixbuf.h>#ifdef HAVE_CONFIG_H#include "config.h"#endif#include "osb-browserglobal.h"#include "osb-browserglobal-private.h"#include "gtk-khtml.h"#include "callbacks.h"#ifndef _#define _(x) (x)#endifstatic void _osb_browser_class_init (OSBBrowserClass * c);static void _osb_browser_obj_init (OSBBrowser * self);static void _osb_browser_obj_finalize (GObject * self);static GtkWindowClass *parent_class = NULL;GTypeosb_browser_get_type (void){  static GType type = 0;    if G_UNLIKELY(type == 0) {    static const GTypeInfo info = {      sizeof (OSBBrowserClass),      (GBaseInitFunc) NULL,      (GBaseFinalizeFunc) NULL,      (GClassInitFunc) _osb_browser_class_init,      (GClassFinalizeFunc) NULL,      NULL /* class_data */,      sizeof (OSBBrowser),      0 /* n_preallocs */,      (GInstanceInitFunc) _osb_browser_obj_init,    };        type = g_type_register_static (GTK_TYPE_WINDOW, "OSBBrowser", &info, (GTypeFlags)0);  }  return type;}static void _osb_browser_class_init (OSBBrowserClass * c){  GObjectClass *g_object_class = (GObjectClass*) c;  parent_class = (GtkWindowClass *)g_type_class_ref (GTK_TYPE_WINDOW);  g_object_class->finalize = _osb_browser_obj_finalize;  return;}/* object */static void _osb_browser_obj_init (OSBBrowser * self){  self->_priv = g_new0 (OSBBrowserPrivate, 1);  self->_priv->global = 0;  return;}static void_osb_browser_obj_finalize(GObject *obj){  OSBBrowser *self = OSB_BROWSER (obj);  gpointer priv = self->_priv;  g_warning("finalize");  g_free (priv);    if(G_OBJECT_CLASS(parent_class)->finalize)     (* G_OBJECT_CLASS(parent_class)->finalize)(obj);    return;  }#if DEBUGstatic void_weak_notify(gpointer data, GObject *was){  g_warning("Destroyed: %s at %x\n", (const char*) data, (int) was);}static void_attach_notify(GObject *obj, const char* msg){  g_object_weak_ref( obj, (GWeakNotify)_weak_notify, (gpointer) msg);}#endifstatic gboolean_get_bool(const gchar* value){  if (value == NULL) return FALSE;    if (strcmp (value, "1") == 0)    return TRUE;    return FALSE;}static gfloat_get_float (const gchar* value){  gchar* endptr = NULL;  gfloat val;    if (value == NULL) return -1;   val  = (float) strtod(value, &endptr);  if (endptr == value) {    return -1;  }  return val;}static const gchar*_get_string (const gchar* value){  if (value == NULL) return NULL;  return value;}/*private*/voidosb_browser_set_settings (OSBBrowser* self, GtkKHTML* engine){  const gchar* http_proxy;  #define ENSURE_GOOD(var, fallback) \  if ((var)<1) var = fallback;  OSBBrowserGlobalSettings* settings = self->_priv->global->settings;  GtkKHTMLSettings s = {0,};  GtkKHTMLSettings *ks = &s;    ks->javascript_enabled =    _get_bool (osb_browserglobal_settings_get_string (settings,						      OSB_BROWSERGLOBAL_SETTINGS_JAVASCRIPT));    ks->java_enabled =    _get_bool (osb_browserglobal_settings_get_string (settings,						      OSB_BROWSERGLOBAL_SETTINGS_JAVA));   ks->plugins_enabled =    _get_bool (osb_browserglobal_settings_get_string (settings,						      OSB_BROWSERGLOBAL_SETTINGS_PLUGINS));   ks->autoload_images =    _get_bool (osb_browserglobal_settings_get_string (settings,						      OSB_BROWSERGLOBAL_SETTINGS_AUTOLOADIMAGES));   ks->minimum_font_size =    _get_float (osb_browserglobal_settings_get_string (settings,						       OSB_BROWSERGLOBAL_SETTINGS_MINIMUMFONTSIZE));    ENSURE_GOOD(ks->minimum_font_size, 7);  ks->default_font_size =    _get_float (osb_browserglobal_settings_get_string (settings,						       OSB_BROWSERGLOBAL_SETTINGS_DEFAULTFONTSIZE));  ENSURE_GOOD(ks->default_font_size, 7);  ks->default_fixed_font_size =    _get_float (osb_browserglobal_settings_get_string (settings,						       OSB_BROWSERGLOBAL_SETTINGS_DEFAULTFIXEDFONTSIZE));  ENSURE_GOOD(ks->default_fixed_font_size, 7);  ks->default_text_encoding =     _get_string (osb_browserglobal_settings_get_string (settings,							OSB_BROWSERGLOBAL_SETTINGS_DEFAULTTEXTENCODING));    ks->serif_font_family =     _get_string (osb_browserglobal_settings_get_string (settings,							OSB_BROWSERGLOBAL_SETTINGS_SERIFFONTFAMILY));    ks->sans_serif_font_family =     _get_string (osb_browserglobal_settings_get_string (settings,							OSB_BROWSERGLOBAL_SETTINGS_SANSSERIFFONTFAMILY));  ks->fixed_font_family =     _get_string (osb_browserglobal_settings_get_string (settings,							OSB_BROWSERGLOBAL_SETTINGS_FIXEDFONTFAMILY));  ks->standard_font_family =     _get_string (osb_browserglobal_settings_get_string (settings,							OSB_BROWSERGLOBAL_SETTINGS_STANDARDFONTFAMILY));  ks->cursive_font_family =       _get_string (osb_browserglobal_settings_get_string (settings,							  OSB_BROWSERGLOBAL_SETTINGS_CURSIVEFONTFAMILY));  ks->fantasy_font_family =       _get_string (osb_browserglobal_settings_get_string (settings,							  OSB_BROWSERGLOBAL_SETTINGS_FANTASYFONTFAMILY));    http_proxy = g_getenv ("http_proxy");  if (!http_proxy)    http_proxy = g_getenv ("HTTP_PROXY");    if (!http_proxy) {    /* TODO: falback to what*/    http_proxy = "" ;  }    osb_browserglobal_settings_set_string (settings, OSB_BROWSERGLOBAL_SETTINGS_HTTPPROXY, http_proxy);  ks->http_proxy = g_strdup(http_proxy);  gtk_khtml_set_settings (engine, ks);  #undef ENSURE_GOOD}GtkWidget * osb_browser_new (OSBBrowserGlobal * global){    GtkWidget *html_engine;    html_engine = gtk_khtml_new ();    gtk_khtml_set_group(GTK_KHTML (html_engine), osb_browserglobal_get_group(global));    gtk_khtml_set_emit_internal_status (GTK_KHTML (html_engine), TRUE);    return osb_browser_new_with_engine (global, html_engine);}/*private*/GtkWidget * osb_browser_new_with_engine (OSBBrowserGlobal * global, GtkWidget* html_engine){  static gboolean _settings_initialized = FALSE;  const gchar* path;  OSBBrowser* self;  GtkWidget *root_widget;  GtkWidget *label;  const gchar *title;      self = ((OSBBrowser *)g_object_new (osb_browser_get_type(),  NULL));  self->_priv->tab = 0;  self->_priv->global = global;  if (!_settings_initialized) {    gchar* plugin_path;    /* FIXME: REPLACE ME WITH SETTINGS SAVING/LOADING FUNCTIONALITY*/    OSBBrowserGlobalSettings* settings = global->settings;    osb_browserglobal_settings_set_string (settings, OSB_BROWSERGLOBAL_SETTINGS_JAVASCRIPT, "1");    osb_browserglobal_settings_set_string (settings, OSB_BROWSERGLOBAL_SETTINGS_JAVA, "0");    osb_browserglobal_settings_set_string (settings, OSB_BROWSERGLOBAL_SETTINGS_PLUGINS, "1");    osb_browserglobal_settings_set_string (settings, OSB_BROWSERGLOBAL_SETTINGS_AUTOLOADIMAGES , "1");    osb_browserglobal_settings_set_string (settings, OSB_BROWSERGLOBAL_SETTINGS_MINIMUMFONTSIZE, "10.0");    osb_browserglobal_settings_set_string (settings, OSB_BROWSERGLOBAL_SETTINGS_DEFAULTFONTSIZE, "16.0");    osb_browserglobal_settings_set_string (settings, OSB_BROWSERGLOBAL_SETTINGS_DEFAULTFIXEDFONTSIZE, "10.0");    osb_browserglobal_settings_set_string (settings, OSB_BROWSERGLOBAL_SETTINGS_DEFAULTTEXTENCODING, "ISO-8859-1");    osb_browserglobal_settings_set_string (settings, OSB_BROWSERGLOBAL_SETTINGS_SERIFFONTFAMILY, "serif");    osb_browserglobal_settings_set_string (settings, OSB_BROWSERGLOBAL_SETTINGS_SANSSERIFFONTFAMILY, "sans");    osb_browserglobal_settings_set_string (settings, OSB_BROWSERGLOBAL_SETTINGS_FIXEDFONTFAMILY, "fixed");    osb_browserglobal_settings_set_string (settings, OSB_BROWSERGLOBAL_SETTINGS_STANDARDFONTFAMILY, "times");    osb_browserglobal_settings_set_string (settings, OSB_BROWSERGLOBAL_SETTINGS_CURSIVEFONTFAMILY, "times");    osb_browserglobal_settings_set_string (settings, OSB_BROWSERGLOBAL_SETTINGS_FANTASYFONTFAMILY, "lucidabright");    osb_browserglobal_settings_set_string (settings, OSB_BROWSERGLOBAL_SETTINGS_HTTPPROXY, "");    plugin_path = g_strconcat (g_get_home_dir (), "/.osb-browser/plugins/", "libflashplayer.so", NULL);    if (osb_browserglobal_register_plugin (global, plugin_path) == -1) {      g_warning ("couldn't register plugin: %s", plugin_path);    }    g_free(plugin_path);    plugin_path = g_strconcat (g_get_home_dir (), "/.osb-browser/plugins/", "libNPSVG3.so", NULL);    if (osb_browserglobal_register_plugin (global, plugin_path) == -1) {      g_warning ("couldn't register plugin: %s", plugin_path);    }    g_free(plugin_path);  }    /* load the interface */  path = osb_browser_config_get_string (self, PATH_UI_XML_DESCRIPTION);  self->_priv->xml = glade_xml_new (path, NULL, NULL);      if (!self->_priv->xml) {    g_warning ("Couldn't load ui description file from '%s'", path);    return 0; /* leak*/  }      /* connect the signals in the interface */#define CONNECT_WITH_DATA(__s, __h, __d)\  glade_xml_signal_connect_data (self->_priv->xml, __s, G_CALLBACK( __h), __d);    /* toolbar */  CONNECT_WITH_DATA ("on_back_clicked", on_back_clicked, self);  CONNECT_WITH_DATA ("on_forward_clicked", on_forward_clicked, self);  CONNECT_WITH_DATA ("on_stop_clicked", on_stop_clicked, self);  CONNECT_WITH_DATA ("on_refresh_clicked", on_refresh_clicked, self);  CONNECT_WITH_DATA ("on_home_clicked", on_home_clicked, self);  CONNECT_WITH_DATA ("on_exec_clicked", on_exec_clicked, self);  /* location */  CONNECT_WITH_DATA ("on_location_activate", on_location_activate, self);  CONNECT_WITH_DATA ("on_location_location_key_release_event", on_location_key_release_event, self);  /* menus */  CONNECT_WITH_DATA ("on_file_new_window_activate", on_file_new_window_activate, self);  CONNECT_WITH_DATA ("on_file_new_tab_activate", on_file_new_tab_activate, self);  CONNECT_WITH_DATA ("on_file_open_activate", on_file_open_activate, self);  CONNECT_WITH_DATA ("on_file_close_activate", on_file_close_activate, self);  CONNECT_WITH_DATA ("on_file_quit_activate", on_file_quit_activate, self);    CONNECT_WITH_DATA ("on_edit_find_activate", on_edit_find_activate, self);  CONNECT_WITH_DATA ("on_edit_find_again_activate", on_edit_find_again_activate, self);  CONNECT_WITH_DATA ("on_view_zoom_in_activate", on_view_zoom_in_activate, self);  CONNECT_WITH_DATA ("on_view_zoom_out_activate", on_view_zoom_out_activate, self);  CONNECT_WITH_DATA ("on_view_zoom_default_activate", on_view_zoom_default_activate, self);    CONNECT_WITH_DATA ("on_go_back_activate", on_go_back_activate, self);  CONNECT_WITH_DATA ("on_go_forward_activate", on_go_forward_activate, self);  CONNECT_WITH_DATA ("on_go_home_activate", on_go_home_activate, self);  CONNECT_WITH_DATA ("on_rendering_tree_activate", on_rendering_tree_activate, self);  /* tab */  CONNECT_WITH_DATA ("on_engine_container_switch_page", on_engine_container_switch_page, self);    /* find dialog */  CONNECT_WITH_DATA ("on_find_find_clicked", on_find_find_clicked, self);  CONNECT_WITH_DATA ("on_find_close_clicked", on_find_close_clicked, self);  CONNECT_WITH_DATA ("on_find_delete_event", on_find_delete_event, self);  #undef CONNECT_WITH_DATA  /* connect the signals in the top level window */  g_signal_connect (G_OBJECT (self),		    "destroy",		    G_CALLBACK (on_browser_destroy),		    self);    g_signal_connect (G_OBJECT (self),		    "delete_event",		    G_CALLBACK (on_browser_delete_event),		    self);  path = osb_browser_config_get_string (self, PATH_DEFAULT_LOCATION_ICON);      if (path) {    osb_browser_set_location_icon (self, path);  }  root_widget  = glade_xml_get_widget (self->_priv->xml, "browser_root");  gtk_widget_reparent (root_widget, GTK_WIDGET (self));  self->_priv->tab = GTK_NOTEBOOK (gtk_notebook_new());  gtk_notebook_set_show_tabs (self->_priv->tab, FALSE);    gtk_container_add (GTK_CONTAINER (glade_xml_get_widget (self->_priv->xml, "view_container")),		     GTK_WIDGET (self->_priv->tab));  gtk_widget_show (GTK_WIDGET (self->_priv->tab));  osb_browser_set_settings(self, GTK_KHTML (html_engine));#if DEBUG  /*debug*/    _attach_notify (G_OBJECT(html_engine), "khtml");  _attach_notify (G_OBJECT(self), "OSBBrowser");#endif    osb_browser_connect_engine_signals (self, GTK_KHTML (html_engine));    title = _("Untitled");  label = gtk_label_new (title);  gtk_notebook_append_page (self->_priv->tab, html_engine, label);    gtk_notebook_set_tab_label_packing (self->_priv->tab, html_engine,				      TRUE, TRUE, GTK_PACK_START);  gtk_widget_show_all (html_engine);  if (self->_priv->global->renderOnly) {    gtk_window_set_default_size (GTK_WINDOW (self), 822, 718);      } else {    gtk_window_set_default_size (GTK_WINDOW (self),                                 osb_browser_config_get_int (self, INT_INITIAL_WIDTH),                                 osb_browser_config_get_int (self, INT_INITIAL_HEIGHT));  }        osb_browser_update_ui(self, GTK_KHTML (html_engine));  osb_browser_update_ui_local(self, GTK_KHTML (html_engine));      /* inform our global, which keeps track of browser objects */  osb_browserglobal_browser_created (self->_priv->global, self);    return (GtkWidget*) self;}voidosb_browser_open_url(OSBBrowser* self, const gchar* url){  GtkKHTML *active = osb_browser_get_active_engine(self);  gchar* realUrl = normalize_filename(url);  gtk_khtml_stop_load(active);  gtk_khtml_load_url(active, realUrl);  g_free(realUrl);}/*private*/const gchar* osb_browser_config_get_string(OSBBrowser* self, ConfigItem item){  self = self;  switch(item) {  case PATH_DEFAULT_LOCATION_ICON:    return DATADIR "default-location-icon.png";    break;  case PATH_UI_XML_DESCRIPTION:    return DATADIR "osb-browser.glade";  case STRING_BROWSER_NAME:    return "Flower";  case URL_HOME:    return "http://www.nokia.fi/";  default:    g_warning("config_get_string: couldn't find item: %d",item);    return 0;  }}intosb_browser_config_get_int(OSBBrowser* self, ConfigItem item){  self = self;  switch(item) {      case INT_TAB_TITLE_LEN:    return 50;  case INT_INITIAL_WIDTH:    return 800;  case INT_INITIAL_HEIGHT:    return 600;  default:

⌨️ 快捷键说明

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