📄 webkitwebview.cpp
字号:
break; case PROP_CUSTOM_ENCODING: webkit_web_view_set_custom_encoding(webView, g_value_get_string(value)); break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID(object, prop_id, pspec); }}static bool shouldCoalesce(GdkRectangle rect, GdkRectangle* rects, int count){ const int cRectThreshold = 10; const float cWastedSpaceThreshold = 0.75f; bool useUnionedRect = (count <= 1) || (count > cRectThreshold); if (!useUnionedRect) { // Attempt to guess whether or not we should use the unioned rect or the individual rects. // We do this by computing the percentage of "wasted space" in the union. If that wasted space // is too large, then we will do individual rect painting instead. float unionPixels = (rect.width * rect.height); float singlePixels = 0; for (int i = 0; i < count; ++i) singlePixels += rects[i].width * rects[i].height; float wastedSpace = 1 - (singlePixels / unionPixels); if (wastedSpace <= cWastedSpaceThreshold) useUnionedRect = true; } return useUnionedRect;}static gboolean webkit_web_view_expose_event(GtkWidget* widget, GdkEventExpose* event){ WebKitWebView* webView = WEBKIT_WEB_VIEW(widget); WebKitWebViewPrivate* priv = webView->priv; Frame* frame = core(webView)->mainFrame(); if (frame->contentRenderer() && frame->view()) { frame->view()->layoutIfNeededRecursive(); cairo_t* cr = gdk_cairo_create(event->window); GraphicsContext ctx(cr); cairo_destroy(cr); ctx.setGdkExposeEvent(event); GOwnPtr<GdkRectangle> rects; int rectCount; gdk_region_get_rectangles(event->region, &rects.outPtr(), &rectCount); // Avoid recursing into the render tree excessively bool coalesce = shouldCoalesce(event->area, rects.get(), rectCount); if (coalesce) { IntRect rect = event->area; ctx.clip(rect); if (priv->transparent) ctx.clearRect(rect); frame->view()->paint(&ctx, rect); } else { for (int i = 0; i < rectCount; i++) { IntRect rect = rects.get()[i]; ctx.save(); ctx.clip(rect); if (priv->transparent) ctx.clearRect(rect); frame->view()->paint(&ctx, rect); ctx.restore(); } } } return FALSE;}static gboolean webkit_web_view_key_press_event(GtkWidget* widget, GdkEventKey* event){ WebKitWebView* webView = WEBKIT_WEB_VIEW(widget); Frame* frame = core(webView)->focusController()->focusedOrMainFrame(); PlatformKeyboardEvent keyboardEvent(event); if (!frame->view()) return FALSE; if (frame->eventHandler()->keyEvent(keyboardEvent)) return TRUE; FrameView* view = frame->view(); SelectionController::EAlteration alteration; if (event->state & GDK_SHIFT_MASK) alteration = SelectionController::EXTEND; else alteration = SelectionController::MOVE; // TODO: We probably want to use GTK+ key bindings here and perhaps take an // approach more like the Win and Mac ports for key handling. switch (event->keyval) { case GDK_Down: view->scrollBy(IntSize(0, cScrollbarPixelsPerLineStep)); return TRUE; case GDK_Up: view->scrollBy(IntSize(0, -cScrollbarPixelsPerLineStep)); return TRUE; case GDK_Right: view->scrollBy(IntSize(cScrollbarPixelsPerLineStep, 0)); return TRUE; case GDK_Left: view->scrollBy(IntSize(-cScrollbarPixelsPerLineStep, 0)); return TRUE; case GDK_Home: frame->selection()->modify(alteration, SelectionController::BACKWARD, DocumentBoundary, true); return TRUE; case GDK_End: frame->selection()->modify(alteration, SelectionController::FORWARD, DocumentBoundary, true); return TRUE; } /* Chain up to our parent class for binding activation */ return GTK_WIDGET_CLASS(webkit_web_view_parent_class)->key_press_event(widget, event);}static gboolean webkit_web_view_key_release_event(GtkWidget* widget, GdkEventKey* event){ WebKitWebView* webView = WEBKIT_WEB_VIEW(widget); Frame* frame = core(webView)->focusController()->focusedOrMainFrame(); if (!frame->view()) return FALSE; PlatformKeyboardEvent keyboardEvent(event); if (frame->eventHandler()->keyEvent(keyboardEvent)) return TRUE; /* Chain up to our parent class for binding activation */ return GTK_WIDGET_CLASS(webkit_web_view_parent_class)->key_release_event(widget, event);}static gboolean webkit_web_view_button_press_event(GtkWidget* widget, GdkEventButton* event){ WebKitWebView* webView = WEBKIT_WEB_VIEW(widget); // FIXME: need to keep track of subframe focus for key events gtk_widget_grab_focus(widget); if (event->button == 3) return webkit_web_view_forward_context_menu_event(webView, PlatformMouseEvent(event)); Frame* frame = core(webView)->mainFrame(); if (!frame->view()) return FALSE; return frame->eventHandler()->handleMousePressEvent(PlatformMouseEvent(event));}static gboolean webkit_web_view_button_release_event(GtkWidget* widget, GdkEventButton* event){ WebKitWebView* webView = WEBKIT_WEB_VIEW(widget); Frame* focusedFrame = core(webView)->focusController()->focusedFrame(); if (focusedFrame && focusedFrame->editor()->canEdit()) {#ifdef MAEMO_CHANGES WebKitWebViewPrivate* priv = webView->priv; hildon_gtk_im_context_filter_event(priv->imContext, (GdkEvent*)event);#endif } Frame* mainFrame = core(webView)->mainFrame(); if (mainFrame->view()) mainFrame->eventHandler()->handleMouseReleaseEvent(PlatformMouseEvent(event)); /* We always return FALSE here because WebKit can, for the same click, decide * to not handle press-event but handle release-event, which can totally confuse * some GTK+ containers when there are no other events in between. This way we * guarantee that this case never happens, and that if press-event goes through * release-event also goes through. */ return FALSE;}static gboolean webkit_web_view_motion_event(GtkWidget* widget, GdkEventMotion* event){ WebKitWebView* webView = WEBKIT_WEB_VIEW(widget); Frame* frame = core(webView)->mainFrame(); if (!frame->view()) return FALSE; return frame->eventHandler()->mouseMoved(PlatformMouseEvent(event));}static gboolean webkit_web_view_scroll_event(GtkWidget* widget, GdkEventScroll* event){ WebKitWebView* webView = WEBKIT_WEB_VIEW(widget); Frame* frame = core(webView)->mainFrame(); if (!frame->view()) return FALSE; PlatformWheelEvent wheelEvent(event); return frame->eventHandler()->handleWheelEvent(wheelEvent);}static void webkit_web_view_size_allocate(GtkWidget* widget, GtkAllocation* allocation){ GTK_WIDGET_CLASS(webkit_web_view_parent_class)->size_allocate(widget,allocation); WebKitWebView* webView = WEBKIT_WEB_VIEW(widget); Frame* frame = core(webView)->mainFrame(); if (!frame->view()) return; frame->view()->resize(allocation->width, allocation->height); frame->view()->forceLayout(); frame->view()->adjustViewSize();}static gboolean webkit_web_view_focus_in_event(GtkWidget* widget, GdkEventFocus* event){ // TODO: Improve focus handling as suggested in // http://bugs.webkit.org/show_bug.cgi?id=16910 GtkWidget* toplevel = gtk_widget_get_toplevel(widget); if (GTK_WIDGET_TOPLEVEL(toplevel) && gtk_window_has_toplevel_focus(GTK_WINDOW(toplevel))) { WebKitWebView* webView = WEBKIT_WEB_VIEW(widget); Frame* frame = core(webView)->mainFrame(); core(webView)->focusController()->setActive(frame); } return GTK_WIDGET_CLASS(webkit_web_view_parent_class)->focus_in_event(widget, event);}static gboolean webkit_web_view_focus_out_event(GtkWidget* widget, GdkEventFocus* event){ WebKitWebView* webView = WEBKIT_WEB_VIEW(widget); core(webView)->focusController()->setActive(false); return GTK_WIDGET_CLASS(webkit_web_view_parent_class)->focus_out_event(widget, event);}static void webkit_web_view_realize(GtkWidget* widget){ GTK_WIDGET_SET_FLAGS(widget, GTK_REALIZED); GdkWindowAttr attributes; 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 = GDK_VISIBILITY_NOTIFY_MASK | GDK_EXPOSURE_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK | GDK_POINTER_MOTION_MASK | GDK_KEY_PRESS_MASK | GDK_KEY_RELEASE_MASK | GDK_BUTTON_MOTION_MASK | GDK_BUTTON1_MOTION_MASK | GDK_BUTTON2_MOTION_MASK | GDK_BUTTON3_MOTION_MASK; gint 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); gdk_window_set_background(widget->window, &widget->style->base[GTK_WIDGET_STATE(widget)]); WebKitWebView* webView = WEBKIT_WEB_VIEW(widget); WebKitWebViewPrivate* priv = webView->priv; gtk_im_context_set_client_window(priv->imContext, widget->window);}static void webkit_web_view_set_scroll_adjustments(WebKitWebView* webView, GtkAdjustment* hadj, GtkAdjustment* vadj){ if (!core(webView)) return; FrameView* view = core(webkit_web_view_get_main_frame(webView))->view(); if (hadj) g_object_ref(hadj); if (vadj) g_object_ref(vadj); WebKitWebViewPrivate* priv = webView->priv; if (priv->horizontalAdjustment) g_object_unref(priv->horizontalAdjustment); if (priv->verticalAdjustment) g_object_unref(priv->verticalAdjustment); priv->horizontalAdjustment = hadj; priv->verticalAdjustment = vadj; if (!view) return; view->setGtkAdjustments(hadj, vadj);}static void webkit_web_view_container_add(GtkContainer* container, GtkWidget* widget){ WebKitWebView* webView = WEBKIT_WEB_VIEW(container); WebKitWebViewPrivate* priv = webView->priv; priv->children.add(widget); if (GTK_WIDGET_REALIZED(container)) gtk_widget_set_parent_window(widget, GTK_WIDGET(webView)->window); gtk_widget_set_parent(widget, GTK_WIDGET(container));}static void webkit_web_view_container_remove(GtkContainer* container, GtkWidget* widget){ WebKitWebView* webView = WEBKIT_WEB_VIEW(container); WebKitWebViewPrivate* priv = webView->priv; if (priv->children.contains(widget)) { gtk_widget_unparent(widget); priv->children.remove(widget); }}static void webkit_web_view_container_forall(GtkContainer* container, gboolean, GtkCallback callback, gpointer callbackData){ WebKitWebView* webView = WEBKIT_WEB_VIEW(container); WebKitWebViewPrivate* priv = webView->priv; HashSet<GtkWidget*> children = priv->children; HashSet<GtkWidget*>::const_iterator end = children.end(); for (HashSet<GtkWidget*>::const_iterator current = children.begin(); current != end; ++current) (*callback)(*current, callbackData);}static WebKitWebView* webkit_web_view_real_create_web_view(WebKitWebView*, WebKitWebFrame*){ return 0;}static gboolean webkit_web_view_real_web_view_ready(WebKitWebView*)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -