diff options
Diffstat (limited to 'Source/WebKit2/UIProcess/API/gtk/WebKitPrintOperation.cpp')
-rw-r--r-- | Source/WebKit2/UIProcess/API/gtk/WebKitPrintOperation.cpp | 91 |
1 files changed, 72 insertions, 19 deletions
diff --git a/Source/WebKit2/UIProcess/API/gtk/WebKitPrintOperation.cpp b/Source/WebKit2/UIProcess/API/gtk/WebKitPrintOperation.cpp index 75b435baf..dab8c9d89 100644 --- a/Source/WebKit2/UIProcess/API/gtk/WebKitPrintOperation.cpp +++ b/Source/WebKit2/UIProcess/API/gtk/WebKitPrintOperation.cpp @@ -20,6 +20,7 @@ #include "config.h" #include "WebKitPrintOperation.h" +#include "WebKitPrintCustomWidgetPrivate.h" #include "WebKitPrintOperationPrivate.h" #include "WebKitPrivate.h" #include "WebKitWebViewBasePrivate.h" @@ -27,11 +28,11 @@ #include <WebCore/GtkUtilities.h> #include <WebCore/NotImplemented.h> #include <glib/gi18n-lib.h> -#include <wtf/gobject/GRefPtr.h> -#include <wtf/gobject/GUniquePtr.h> +#include <wtf/glib/GRefPtr.h> +#include <wtf/glib/GUniquePtr.h> #include <wtf/text/CString.h> -#ifdef HAVE_GTK_UNIX_PRINTING +#if HAVE(GTK_UNIX_PRINTING) #include <gtk/gtkunixprint.h> #endif @@ -60,6 +61,7 @@ enum { enum { FINISHED, FAILED, + CREATE_CUSTOM_WIDGET, LAST_SIGNAL }; @@ -128,6 +130,15 @@ static void webkitPrintOperationSetProperty(GObject* object, guint propId, const } } +static gboolean webkitPrintOperationAccumulatorObjectHandled(GSignalInvocationHint*, GValue* returnValue, const GValue* handlerReturn, gpointer) +{ + void* object = g_value_get_object(handlerReturn); + if (object) + g_value_set_object(returnValue, object); + + return !object; +} + static void webkit_print_operation_class_init(WebKitPrintOperationClass* printOperationClass) { GObjectClass* gObjectClass = G_OBJECT_CLASS(printOperationClass); @@ -198,16 +209,45 @@ static void webkit_print_operation_class_init(WebKitPrintOperationClass* printOp * The #WebKitPrintOperation::finished signal is emitted after this one. */ signals[FAILED] = - g_signal_new("failed", - G_TYPE_FROM_CLASS(gObjectClass), - G_SIGNAL_RUN_LAST, - 0, 0, 0, - g_cclosure_marshal_VOID__POINTER, - G_TYPE_NONE, 1, - G_TYPE_POINTER); + g_signal_new( + "failed", + G_TYPE_FROM_CLASS(gObjectClass), + G_SIGNAL_RUN_LAST, + 0, 0, 0, + g_cclosure_marshal_VOID__BOXED, + G_TYPE_NONE, 1, + G_TYPE_ERROR | G_SIGNAL_TYPE_STATIC_SCOPE); + + /** + * WebKitPrintOperation::create-custom-widget: + * @print_operation: the #WebKitPrintOperation on which the signal was emitted + * + * Emitted when displaying the print dialog with webkit_print_operation_run_dialog(). + * The returned #WebKitPrintCustomWidget will be added to the print dialog and + * it will be owned by the @print_operation. However, the object is guaranteed + * to be alive until the #WebKitPrintCustomWidget::apply is emitted. + * + * Returns: (transfer full): A #WebKitPrintCustomWidget that will be embedded in the dialog. + * + * Since: 2.16 + */ + signals[CREATE_CUSTOM_WIDGET] = + g_signal_new( + "create-custom-widget", + G_TYPE_FROM_CLASS(gObjectClass), + G_SIGNAL_RUN_LAST, + 0, + webkitPrintOperationAccumulatorObjectHandled, 0, + g_cclosure_marshal_generic, + WEBKIT_TYPE_PRINT_CUSTOM_WIDGET, 0); +} + +#if HAVE(GTK_UNIX_PRINTING) +static void notifySelectedPrinterCallback(GtkPrintUnixDialog* dialog, GParamSpec*, WebKitPrintCustomWidget* printCustomWidget) +{ + webkitPrintCustomWidgetEmitUpdateCustomWidgetSignal(printCustomWidget, gtk_print_unix_dialog_get_page_setup(dialog), gtk_print_unix_dialog_get_settings(dialog)); } -#ifdef HAVE_GTK_UNIX_PRINTING static WebKitPrintOperationResponse webkitPrintOperationRunDialog(WebKitPrintOperation* printOperation, GtkWindow* parent) { GtkPrintUnixDialog* printDialog = GTK_PRINT_UNIX_DIALOG(gtk_print_unix_dialog_new(0, parent)); @@ -232,11 +272,23 @@ static WebKitPrintOperationResponse webkitPrintOperationRunDialog(WebKitPrintOpe gtk_print_unix_dialog_set_embed_page_setup(printDialog, TRUE); + GRefPtr<WebKitPrintCustomWidget> customWidget; + g_signal_emit(printOperation, signals[CREATE_CUSTOM_WIDGET], 0, &customWidget.outPtr()); + if (customWidget) { + const gchar* widgetTitle = webkit_print_custom_widget_get_title(customWidget.get()); + GtkWidget* widget = webkit_print_custom_widget_get_widget(customWidget.get()); + + g_signal_connect(printDialog, "notify::selected-printer", G_CALLBACK(notifySelectedPrinterCallback), customWidget.get()); + gtk_print_unix_dialog_add_custom_tab(printDialog, widget, gtk_label_new(widgetTitle)); + } + WebKitPrintOperationResponse returnValue = WEBKIT_PRINT_OPERATION_RESPONSE_CANCEL; if (gtk_dialog_run(GTK_DIALOG(printDialog)) == GTK_RESPONSE_OK) { priv->printSettings = adoptGRef(gtk_print_unix_dialog_get_settings(printDialog)); priv->pageSetup = gtk_print_unix_dialog_get_page_setup(printDialog); returnValue = WEBKIT_PRINT_OPERATION_RESPONSE_PRINT; + if (customWidget) + webkitPrintCustomWidgetEmitCustomWidgetApplySignal(customWidget.get()); } gtk_widget_destroy(GTK_WIDGET(printDialog)); @@ -252,30 +304,31 @@ static WebKitPrintOperationResponse webkitPrintOperationRunDialog(WebKitPrintOpe } #endif -static void drawPagesForPrintingCompleted(WKErrorRef wkPrintError, WKErrorRef, void* context) +static void drawPagesForPrintingCompleted(API::Error* wkPrintError, WebKitPrintOperation* printOperation) { - GRefPtr<WebKitPrintOperation> printOperation = adoptGRef(WEBKIT_PRINT_OPERATION(context)); - // When running synchronously WebPageProxy::printFrame() calls endPrinting(). if (printOperation->priv->printMode == PrintInfo::PrintModeAsync && printOperation->priv->webView) { WebPageProxy* page = webkitWebViewBaseGetPage(WEBKIT_WEB_VIEW_BASE(printOperation->priv->webView)); page->endPrinting(); } - const WebCore::ResourceError& resourceError = wkPrintError ? toImpl(wkPrintError)->platformError() : WebCore::ResourceError(); + const WebCore::ResourceError& resourceError = wkPrintError ? wkPrintError->platformError() : WebCore::ResourceError(); if (!resourceError.isNull()) { GUniquePtr<GError> printError(g_error_new_literal(g_quark_from_string(resourceError.domain().utf8().data()), - resourceError.errorCode(), resourceError.localizedDescription().utf8().data())); - g_signal_emit(printOperation.get(), signals[FAILED], 0, printError.get()); + toWebKitError(resourceError.errorCode()), resourceError.localizedDescription().utf8().data())); + g_signal_emit(printOperation, signals[FAILED], 0, printError.get()); } - g_signal_emit(printOperation.get(), signals[FINISHED], 0, NULL); + g_signal_emit(printOperation, signals[FINISHED], 0, NULL); } static void webkitPrintOperationPrintPagesForFrame(WebKitPrintOperation* printOperation, WebFrameProxy* webFrame, GtkPrintSettings* printSettings, GtkPageSetup* pageSetup) { PrintInfo printInfo(printSettings, pageSetup, printOperation->priv->printMode); WebPageProxy* page = webkitWebViewBaseGetPage(WEBKIT_WEB_VIEW_BASE(printOperation->priv->webView)); - page->drawPagesForPrinting(webFrame, printInfo, PrintFinishedCallback::create(g_object_ref(printOperation), &drawPagesForPrintingCompleted)); + g_object_ref(printOperation); + page->drawPagesForPrinting(webFrame, printInfo, PrintFinishedCallback::create([printOperation](API::Error* printError, CallbackBase::Error) { + drawPagesForPrintingCompleted(printError, adoptGRef(printOperation).get()); + })); } WebKitPrintOperationResponse webkitPrintOperationRunDialogForFrame(WebKitPrintOperation* printOperation, GtkWindow* parent, WebFrameProxy* webFrame) |