summaryrefslogtreecommitdiffstats
path: root/chrome/browser/printing/print_dialog_gtk.cc
diff options
context:
space:
mode:
authorthestig@chromium.org <thestig@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2011-04-11 04:58:20 +0000
committerthestig@chromium.org <thestig@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2011-04-11 04:58:20 +0000
commiteaa389e3a4be9d9f87113043156cf6ac85f67c8d (patch)
tree5bf89af4a8b7a477dd2e878e08e98b9852333b47 /chrome/browser/printing/print_dialog_gtk.cc
parent9b6db26fcc22a7a4ec0510a93733b2e190d9e649 (diff)
downloadchromium_src-eaa389e3a4be9d9f87113043156cf6ac85f67c8d.zip
chromium_src-eaa389e3a4be9d9f87113043156cf6ac85f67c8d.tar.gz
chromium_src-eaa389e3a4be9d9f87113043156cf6ac85f67c8d.tar.bz2
Linux: Refactor PrintDialogGtk in preparation for adding dialog-less printing.
BUG=none TEST=Printing on Linux still works. Review URL: http://codereview.chromium.org/6811016 git-svn-id: svn://svn.chromium.org/chrome/trunk/src@81069 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'chrome/browser/printing/print_dialog_gtk.cc')
-rw-r--r--chrome/browser/printing/print_dialog_gtk.cc125
1 files changed, 69 insertions, 56 deletions
diff --git a/chrome/browser/printing/print_dialog_gtk.cc b/chrome/browser/printing/print_dialog_gtk.cc
index 3cbe7cd..24d87fb 100644
--- a/chrome/browser/printing/print_dialog_gtk.cc
+++ b/chrome/browser/printing/print_dialog_gtk.cc
@@ -17,54 +17,53 @@
#include "base/utf_string_conversions.h"
#include "chrome/browser/ui/browser_list.h"
#include "chrome/browser/ui/browser_window.h"
-#include "content/browser/browser_thread.h"
#include "printing/print_settings_initializer_gtk.h"
// static
-void* PrintDialogGtk::CreatePrintDialog(
- PrintingContextCairo::PrintSettingsCallback* callback,
+printing::PrintDialogGtkInterface* PrintDialogGtk::CreatePrintDialog(
PrintingContextCairo* context) {
DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
-
- PrintDialogGtk* dialog = new PrintDialogGtk(callback, context);
- return dialog;
-}
-
-// static
-void PrintDialogGtk::PrintDocument(void* print_dialog,
- const NativeMetafile* metafile,
- const string16& document_name) {
- PrintDialogGtk* dialog = static_cast<PrintDialogGtk*>(print_dialog);
-
- scoped_ptr<base::WaitableEvent> event(new base::WaitableEvent(false, false));
- dialog->set_save_document_event(event.get());
- BrowserThread::PostTask(
- BrowserThread::FILE, FROM_HERE,
- NewRunnableMethod(dialog,
- &PrintDialogGtk::SaveDocumentToDisk,
- metafile,
- document_name));
- // Wait for SaveDocumentToDisk() to finish.
- event->Wait();
+ return new PrintDialogGtk(context);
}
-PrintDialogGtk::PrintDialogGtk(
- PrintingContextCairo::PrintSettingsCallback* callback,
- PrintingContextCairo* context)
- : callback_(callback),
+PrintDialogGtk::PrintDialogGtk(PrintingContextCairo* context)
+ : callback_(NULL),
context_(context),
dialog_(NULL),
- page_setup_(NULL),
- printer_(NULL),
gtk_settings_(NULL),
- save_document_event_(NULL) {
- // Manual AddRef since PrintDialogGtk manages its own lifetime.
- AddRef();
-
+ page_setup_(NULL),
+ printer_(NULL) {
GtkWindow* parent = BrowserList::GetLastActive()->window()->GetNativeHandle();
// TODO(estade): We need a window title here.
dialog_ = gtk_print_unix_dialog_new(NULL, parent);
+}
+
+PrintDialogGtk::~PrintDialogGtk() {
+ DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
+
+ gtk_widget_destroy(dialog_);
+ dialog_ = NULL;
+ if (gtk_settings_) {
+ g_object_unref(gtk_settings_);
+ gtk_settings_ = NULL;
+ }
+ if (page_setup_) {
+ g_object_unref(page_setup_);
+ page_setup_ = NULL;
+ }
+ if (printer_) {
+ g_object_unref(printer_);
+ printer_ = NULL;
+ }
+}
+
+void PrintDialogGtk::ShowDialog(
+ PrintingContextCairo::PrintSettingsCallback* callback) {
+ DCHECK(!save_document_event_.get());
+
+ callback_ = callback;
+
// Set modal so user cannot focus the same tab and press print again.
gtk_window_set_modal(GTK_WINDOW(dialog_), TRUE);
@@ -83,19 +82,36 @@ PrintDialogGtk::PrintDialogGtk(
TRUE);
#endif
g_signal_connect(dialog_, "response", G_CALLBACK(OnResponseThunk), this);
-
gtk_widget_show(dialog_);
}
-PrintDialogGtk::~PrintDialogGtk() {
- gtk_widget_destroy(dialog_);
- dialog_ = NULL;
- page_setup_ = NULL;
- printer_ = NULL;
- if (gtk_settings_) {
- g_object_unref(gtk_settings_);
- gtk_settings_ = NULL;
- }
+void PrintDialogGtk::PrintDocument(const NativeMetafile* metafile,
+ const string16& document_name) {
+ // This runs on the print worker thread, does not block the UI thread.
+ DCHECK(!BrowserThread::CurrentlyOn(BrowserThread::UI));
+
+ // The document printing tasks can outlive the PrintingContext that created
+ // this dialog.
+ AddRef();
+ DCHECK(!save_document_event_.get());
+ save_document_event_.reset(new base::WaitableEvent(false, false));
+
+ BrowserThread::PostTask(
+ BrowserThread::FILE, FROM_HERE,
+ NewRunnableMethod(this,
+ &PrintDialogGtk::SaveDocumentToDisk,
+ metafile,
+ document_name));
+ // Wait for SaveDocumentToDisk() to finish.
+ save_document_event_->Wait();
+}
+
+void PrintDialogGtk::AddRefToDialog() {
+ AddRef();
+}
+
+void PrintDialogGtk::ReleaseDialog() {
+ Release();
}
void PrintDialogGtk::OnResponse(GtkWidget* dialog, int response_id) {
@@ -103,15 +119,16 @@ void PrintDialogGtk::OnResponse(GtkWidget* dialog, int response_id) {
switch (response_id) {
case GTK_RESPONSE_OK: {
- // |gtk_settings_| is a new object.
gtk_settings_ = gtk_print_unix_dialog_get_settings(
GTK_PRINT_UNIX_DIALOG(dialog_));
- // |printer_| and |page_setup_| are owned by |dialog_|.
- page_setup_ = gtk_print_unix_dialog_get_page_setup(
- GTK_PRINT_UNIX_DIALOG(dialog_));
printer_ = gtk_print_unix_dialog_get_selected_printer(
GTK_PRINT_UNIX_DIALOG(dialog_));
+ g_object_ref(printer_);
+ page_setup_ = gtk_print_unix_dialog_get_page_setup(
+ GTK_PRINT_UNIX_DIALOG(dialog_));
+ g_object_ref(page_setup_);
+ // Handle page ranges.
printing::PageRanges ranges_vector;
gint num_ranges;
GtkPageRange* gtk_range =
@@ -131,12 +148,13 @@ void PrintDialogGtk::OnResponse(GtkWidget* dialog, int response_id) {
gtk_settings_, page_setup_, ranges_vector, false, &settings);
context_->InitWithSettings(settings);
callback_->Run(PrintingContextCairo::OK);
+ callback_ = NULL;
return;
}
case GTK_RESPONSE_DELETE_EVENT: // Fall through.
case GTK_RESPONSE_CANCEL: {
callback_->Run(PrintingContextCairo::CANCEL);
- Release();
+ callback_ = NULL;
return;
}
case GTK_RESPONSE_APPLY:
@@ -166,6 +184,7 @@ void PrintDialogGtk::SaveDocumentToDisk(const NativeMetafile* metafile,
save_document_event_->Signal();
if (error) {
+ // Matches AddRef() in PrintDocument();
Release();
} else {
// No errors, continue printing.
@@ -205,12 +224,6 @@ void PrintDialogGtk::OnJobCompleted(GtkPrintJob* print_job, GError* error) {
path_to_pdf_,
false,
NULL);
- // Printing finished.
+ // Printing finished. Matches AddRef() in PrintDocument();
Release();
}
-
-void PrintDialogGtk::set_save_document_event(base::WaitableEvent* event) {
- DCHECK(event);
- DCHECK(!save_document_event_);
- save_document_event_ = event;
-}