gtk-khtml.cc
来自「khtml在gtk上的移植版本」· CC 代码 · 共 1,018 行 · 第 1/2 页
CC
1,018 行
}void gtk_khtml_set_text_multiplier (GtkKHTML* self, gfloat multiplier){ g_return_if_fail (self != NULL); g_return_if_fail (GTK_IS_KHTML (self)); OSB::Root* browser = self->_priv->browser; browser->setTextSizeMultiplier(multiplier);}gfloatgtk_khtml_get_text_multiplier (GtkKHTML* self){ g_return_val_if_fail (self != NULL, -1.0); g_return_val_if_fail (GTK_IS_KHTML (self), -1.0); OSB::Root* browser = self->_priv->browser; return browser->textSizeMultiplier();}gboolean gtk_khtml_find (GtkKHTML* self, const gchar* text, gboolean case_sensitive, gboolean dir_down){ g_return_val_if_fail (self != NULL, FALSE); g_return_val_if_fail (GTK_IS_KHTML (self), FALSE); return self->_priv->browser->findString(text, case_sensitive, dir_down);}const gchar* gtk_khtml_get_current_selection_as_text(GtkKHTML* self){ g_return_val_if_fail (self != NULL, NULL); g_return_val_if_fail (GTK_IS_KHTML (self), NULL); return "";}static void _gtk_khtml_realize (GtkWidget * widget)#define PARENT_HANDLER(___widget) \ { if(GTK_WIDGET_CLASS(parent_class)->realize) \ (* GTK_WIDGET_CLASS(parent_class)->realize)(___widget); }{ GdkWindowAttr attributes; gint attributes_mask; g_return_if_fail(widget != NULL); GTK_WIDGET_SET_FLAGS(widget, GTK_REALIZED); attributes.window_type = GDK_WINDOW_CHILD; attributes.x = widget->allocation.x; attributes.y = widget->allocation.y; attributes.width = widget->allocation.width; attributes.height = widget->allocation.height; attributes.wclass = GDK_INPUT_OUTPUT; attributes.visual = gtk_widget_get_visual (widget); attributes.colormap = gtk_widget_get_colormap (widget); attributes.event_mask = gtk_widget_get_events (widget) | GDK_EXPOSURE_MASK; attributes_mask = GDK_WA_X | GDK_WA_Y | GDK_WA_VISUAL | GDK_WA_COLORMAP; widget->window = gdk_window_new (gtk_widget_get_parent_window (widget), &attributes, attributes_mask); gdk_window_set_user_data (widget->window, widget); widget->style = gtk_style_attach(widget->style, widget->window); }#undef PARENT_HANDLERstatic void _gtk_khtml_map (GtkWidget * widget)#define PARENT_HANDLER(___widget) \ { if(GTK_WIDGET_CLASS(parent_class)->map) \ (* GTK_WIDGET_CLASS(parent_class)->map)(___widget); }{ GtkWidget* child; g_return_if_fail(widget != NULL); g_return_if_fail(GTK_IS_KHTML (widget)); child = GTK_BIN(widget)->child; GTK_WIDGET_SET_FLAGS(widget, GTK_MAPPED); //NEEDED? if (GTK_WIDGET_VISIBLE(child)) { if (!GTK_WIDGET_MAPPED (child)){ gtk_widget_map(child); } } gdk_window_show(widget->window);}#undef PARENT_HANDLERstatic gboolean _gtk_khtml_expose_event (GtkWidget * widget, GdkEventExpose * event)#define PARENT_HANDLER(___widget,___event) \ ((GTK_WIDGET_CLASS(parent_class)->expose_event)? \ (* GTK_WIDGET_CLASS(parent_class)->expose_event)(___widget,___event): \ ((gboolean )0)){ return PARENT_HANDLER(widget,event); }#undef PARENT_HANDLERstatic void _gtk_khtml_size_allocate (GtkWidget * widget, GtkAllocation * allocation)#define PARENT_HANDLER(___widget,___allocation) \ { if(GTK_WIDGET_CLASS(parent_class)->size_allocate) \ (* GTK_WIDGET_CLASS(parent_class)->size_allocate)(___widget,___allocation); }{ GtkWidget* child; g_return_if_fail(widget != NULL); g_return_if_fail(GTK_IS_KHTML (widget)); widget->allocation = *allocation; // NEEDED? Not in Mozilla child = GTK_BIN(widget)->child; if (child){ GtkAllocation a; GtkRequisition r; gtk_widget_size_request(child, &r); a.x = 0; a.y = 0; /* a.height = r.height; */ /* a.width = r.width; */ a.width = allocation->width; a.height = allocation->height; gtk_widget_size_allocate(child, &a); } if (GTK_WIDGET_REALIZED(widget)) { gdk_window_move_resize(widget->window, allocation->x, allocation->y, allocation->width, allocation->height); } }#undef PARENT_HANDLERMyRoot::MyRoot(GtkKHTML* agtkkhtml) :listener(this) ,gtkkhtml(agtkkhtml) ,internal(false) { setUIDelegate(&listener); setFrameLoadDelegate(&listener); setResourceLoadDelegate(&listener); status = g_new0(GtkKHTMLLoadStatus, 1);}MyRoot::~MyRoot(){ g_free(status);}const GtkKHTMLLoadStatus* MyRoot::myStatus(){ return status;}const gchar* MyRoot::myLocation(){ return mainFrame()->location();}const gchar* MyRoot::myTitle(){ const gchar* l = listener.title(); return l;}gboolean MyRoot::findString(const gchar* text, gboolean case_sensitive, gboolean dir_down){ return searchFor(text, dir_down, case_sensitive) ? TRUE:FALSE;}void MyRoot::internalStatusStart(){ if (!internal) return; status->status = GTK_KHTML_LOADING_START; status->size = 0; status->received = 0; status->files = 0; status->filesWithSize = 0; status->ready = 0; g_signal_emit_by_name(gtkkhtml, "status", status);}void MyRoot::internalStatusStop(int statusCode){ if (!internal) return; status->status = GTK_KHTML_LOADING_COMPLETE; status->statusCode = statusCode;// assert(status->ready == status->files);}void MyRoot::internalStatusStartItem(const OSB::ResourceStatus * _status){ if (!internal) return; status->files++; g_signal_emit_by_name(gtkkhtml, "status", status);}void MyRoot::internalStatusHeadersItem(const OSB::ResourceStatus * _status){ if (!internal) return; if (_status->size()) { status->size += _status->size(); status->totalSize += _status->size(); status->filesWithSize++; } g_signal_emit_by_name(gtkkhtml, "status", status);}void MyRoot::internalStatusProgressItem(const OSB::ResourceStatus * _status){ if (!internal) return; status->totalReceived += _status->lastReceived(); // in case Content-Length -header is not present if (!_status->size()) { status->totalSize += _status->lastReceived(); } else { status->received += _status->lastReceived(); } g_signal_emit_by_name(gtkkhtml, "status", status);}void MyRoot::internalStatusStopItem(const OSB::ResourceStatus * _status){ if (!internal) return; assert(_status->size() == 0 || _status->error() || _status->size() == _status->received()); status->ready++; if (_status->error()) { // FIXME: handle errors as well.u } g_signal_emit_by_name(gtkkhtml, "status", status);}MyEventListener::MyEventListener(MyRoot* aroot) :root(aroot){ strSz = 400; status = g_new0(gchar, strSz); loc = g_new0(gchar, strSz); pageTitle = g_new0(gchar, strSz); clearState();}MyEventListener::~MyEventListener(){ if (status) g_free(status); if (loc) g_free(loc); if (pageTitle) g_free(pageTitle);}void MyEventListener::clearState(){ *status = *loc = *pageTitle = '\0';}static gboolean _utf8_copy_if_valid_else_set_empty(gchar* dst, const gchar* src, int dstsz){ if (src &&g_utf8_validate(src, -1, NULL)) { glong sz = g_utf8_strlen(src, dstsz); g_utf8_strncpy(dst, src, sz+1); return TRUE; } *dst = '\0'; return FALSE;}void MyEventListener::onMouseOverChanged(OSB::Frame* target, OSB::ElementInfo* node){ assert(node); g_signal_emit_by_name(root->engine(), "mouse-over", node->linkTitle(), node->linkLabel(), node->linkURL(), node->linkTarget());}void MyEventListener::setStatusText(OSB::Frame* target, const gchar* node) { _utf8_copy_if_valid_else_set_empty(status, node, strSz); g_signal_emit_by_name(root->engine(), "status", status);}void MyEventListener::onTitleChanged(OSB::Frame* frame, const gchar* title) { if (frame == root->mainFrame()) { _utf8_copy_if_valid_else_set_empty(pageTitle, title, strSz); g_signal_emit_by_name(root->engine(), "title"); }}void MyEventListener::onClientRedirectReceived(OSB::Frame* frame,const gchar* to) { frame = frame; to = to; /** not used*/}void MyEventListener::onServerRedirected(OSB::Frame* frame, const gchar* to) { if (frame == root->mainFrame()) { g_signal_emit_by_name(root->engine(), "location"); }}void MyEventListener::onCommitLoad(OSB::Frame* frame) { if (frame == root->mainFrame()) { g_signal_emit_by_name(root->engine(), "location"); }}#if 0gint_convert_status(int status){ /* map OSB status to GtkKHTML status*/ return (gint) status;}#endifvoid MyEventListener::onFrameLoadStarted(OSB::Frame* frame) { if (frame == root->mainFrame()) { clearState(); root->internalStatusStart(); g_signal_emit_by_name(root->engine(), "load-start"); }}void MyEventListener::onFrameLoadFinished(OSB::Frame* frame, int status) { if (frame == root->mainFrame()) { root->internalStatusStop(status); g_signal_emit_by_name(root->engine(), "load-stop"); } }void MyEventListener::onResourceLoadStarted(OSB::Frame* frame, const OSB::ResourceStatus * status) { root->internalStatusStartItem(status);}void MyEventListener::onResourceLoadHeaders(OSB::Frame* frame, const OSB::ResourceStatus * status) { root->internalStatusHeadersItem(status);}void MyEventListener::onResourceLoadStatus(OSB::Frame* frame, const OSB::ResourceStatus * status) { root->internalStatusProgressItem(status);}void MyEventListener::onResourceLoadFinished(OSB::Frame* frame, const OSB::ResourceStatus * status) { root->internalStatusStopItem(status);}OSB::Root* MyEventListener::createNewRoot(OSB::Frame* frame, const gchar* url){ GtkKHTML* new_engine = NULL; g_signal_emit_by_name (root->engine(), "req-new-window", url, &new_engine); if (!new_engine) return 0; OSB::Root* browser = new_engine->_priv->browser; return browser;}void MyEventListener::alertPanel(OSB::Frame* frame, const gchar *message) { GtkKHTMLPromptArgs args = {GTK_KHTML_ALERT,0,}; args.msg = message; g_signal_emit_by_name (root->engine(), "req-js-prompt", &args); return; }bool MyEventListener::confirmPanel(OSB::Frame* frame, const gchar *message) { GtkKHTMLPromptArgs args = {GTK_KHTML_CONFIRM,0,}; args.msg = message; g_signal_emit_by_name (root->engine(), "req-js-prompt", &args); return (args.out_ok_pressed == TRUE); }bool MyEventListener::textInputPanel(OSB::Frame* frame, const gchar *prompt, const gchar *defaultText, const gchar **result){ GtkKHTMLPromptArgs args = {GTK_KHTML_INPUT, 0,}; args.msg = prompt; args.default_input = defaultText; g_signal_emit_by_name (root->engine(), "req-js-prompt", &args); /* clear possible old values */ if (root->engine()->_priv->js_input_text) { g_free (root->engine()->_priv->js_input_text); root->engine()->_priv->js_input_text = NULL; } /* copy new results * GtkKHTMLInputArgs::out_input must be allocated with g_new, and will be owned and released by * us */ if (args.out_input) root->engine()->_priv->js_input_text = args.out_input; /* no g_strdup() by api convention*/ /* propagate results to caller. results will be valid until next call to this method */ if (result) *result = root->engine()->_priv->js_input_text; return (args.out_ok_pressed == TRUE); }bool MyEventListener::authPanel(OSB::Frame* frame, const gchar *realm, const gchar **username, const gchar **password) { GtkKHTMLAuthArgs args = {0,}; GtkKHTMLPrivate *priv = root->engine()->_priv; args.realm = realm; /* fixme: do we need to pass default usernames/passwords to browser */ args.out_username = 0; args.out_password = 0; g_signal_emit_by_name (root->engine(), "req-auth-prompt", &args); /* clear possible old values */ if (priv->auth_username) { g_free(priv->auth_username); priv->auth_username = NULL; } if (priv->auth_password) { g_free(priv->auth_password); priv->auth_password = NULL; } /* copy new results. * GtkKHTMLAuthArgs::out_{username,password} must be allocated with g_new, and will be owned by * and released by us.*/ if (args.out_username) priv->auth_username = args.out_username; /* no g_strdup() by api convention*/ if (args.out_password) priv->auth_password = args.out_password; /* no g_strdup() by api convention*/ /* propagate results to caller. results will be valid until next call to this method */ if (username) *username = priv->auth_username; if (password) *password = priv->auth_password; return (args.out_ok_pressed == TRUE); }const gchar *gtk_khtml_render_tree (GtkKHTML * self){ g_return_val_if_fail (self != NULL, NULL); g_return_val_if_fail (GTK_IS_KHTML (self), NULL); // self->_priv->browser->aux().renderTreeString(); return "";}/* Local Variables: c-basic-offset: 4 End: */
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?