]> git.saurik.com Git - wxWidgets.git/commitdiff
Recreate GtkPrintOperation every time when printing in wxGTK.
authorVadim Zeitlin <vadim@wxwidgets.org>
Mon, 8 Oct 2012 12:09:37 +0000 (12:09 +0000)
committerVadim Zeitlin <vadim@wxwidgets.org>
Mon, 8 Oct 2012 12:09:37 +0000 (12:09 +0000)
Apparently reusing GtkPrintOperation is not allowed, so create a new one
every time we need it.

Closes #14731.

git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@72642 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775

include/wx/gtk/print.h
src/gtk/print.cpp

index c0110a9678812104c6726ee4eb17fc944827ea32..90626ee549d8e7f633e33a41021ae1bf26cbd461 100644 (file)
@@ -197,6 +197,7 @@ public:
     void SetPrintConfig( GtkPrintSettings * config );
 
     GtkPrintOperation* GetPrintJob() { return m_job; }
+    void SetPrintJob(GtkPrintOperation *job) { m_job = job; }
 
     GtkPrintContext *GetPrintContext() { return m_context; }
     void SetPrintContext(GtkPrintContext *context) {m_context = context; }
@@ -206,6 +207,8 @@ public:
     void SetPageSetupToSettings(GtkPrintSettings* settings, GtkPageSetup* page_setup);
 
 private:
+    // NB: m_config is created and owned by us, but the other objects are not
+    //     and their accessors don't change their ref count.
     GtkPrintSettings    *m_config;
     GtkPrintOperation   *m_job;
     GtkPrintContext     *m_context;
index 34143e4b73391b50f53ad584569550fc6b787f84..3c689cbba9b47d1b23b97e81da4604f5c2ccc60b 100644 (file)
@@ -33,6 +33,7 @@
 #include "wx/fontutil.h"
 #include "wx/dynlib.h"
 #include "wx/paper.h"
+#include "wx/scopeguard.h"
 
 #include <gtk/gtk.h>
 
@@ -234,13 +235,12 @@ IMPLEMENT_CLASS(wxGtkPrintNativeData, wxPrintNativeDataBase)
 wxGtkPrintNativeData::wxGtkPrintNativeData()
 {
     m_config = gtk_print_settings_new();
-    m_job = gtk_print_operation_new();
+    m_job = NULL;
     m_context = NULL;
 }
 
 wxGtkPrintNativeData::~wxGtkPrintNativeData()
 {
-    g_object_unref(m_job);
     g_object_unref(m_config);
 }
 
@@ -904,7 +904,10 @@ bool wxGtkPrinter::Print(wxWindow *parent, wxPrintout *printout, bool prompt )
     wxPrintData printdata = GetPrintDialogData().GetPrintData();
     wxGtkPrintNativeData *native = (wxGtkPrintNativeData*) printdata.GetNativeData();
 
-    GtkPrintOperation * const printOp = native->GetPrintJob();
+    wxGtkObject<GtkPrintOperation> printOp(gtk_print_operation_new());
+    native->SetPrintJob(printOp);
+    wxON_BLOCK_EXIT_OBJ1(*native, wxGtkPrintNativeData::SetPrintJob,
+                         static_cast<GtkPrintOperation*>(NULL));
 
     wxPrinterToGtkData dataToSend;
     dataToSend.printer = this;