summaryrefslogtreecommitdiff
path: root/Source/WebKit2/UIProcess/API/gtk/WebKitPrintOperation.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'Source/WebKit2/UIProcess/API/gtk/WebKitPrintOperation.cpp')
-rw-r--r--Source/WebKit2/UIProcess/API/gtk/WebKitPrintOperation.cpp91
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)