diff options
author | thestig@chromium.org <thestig@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2011-04-11 04:58:20 +0000 |
---|---|---|
committer | thestig@chromium.org <thestig@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2011-04-11 04:58:20 +0000 |
commit | eaa389e3a4be9d9f87113043156cf6ac85f67c8d (patch) | |
tree | 5bf89af4a8b7a477dd2e878e08e98b9852333b47 /chrome | |
parent | 9b6db26fcc22a7a4ec0510a93733b2e190d9e649 (diff) | |
download | chromium_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')
-rw-r--r-- | chrome/browser/browser_main_posix.cc | 5 | ||||
-rw-r--r-- | chrome/browser/printing/print_dialog_gtk.cc | 125 | ||||
-rw-r--r-- | chrome/browser/printing/print_dialog_gtk.h | 45 |
3 files changed, 96 insertions, 79 deletions
diff --git a/chrome/browser/browser_main_posix.cc b/chrome/browser/browser_main_posix.cc index 57ee3f7..ae523dd 100644 --- a/chrome/browser/browser_main_posix.cc +++ b/chrome/browser/browser_main_posix.cc @@ -237,8 +237,7 @@ void BrowserMainPartsPosix::PostMainMessageLoopStart() { } #if defined(OS_LINUX) && !defined(OS_CHROMEOS) - printing::PrintingContextCairo::SetPrintingFunctions( - &PrintDialogGtk::CreatePrintDialog, - &PrintDialogGtk::PrintDocument); + printing::PrintingContextCairo::SetCreatePrintDialogFunction( + &PrintDialogGtk::CreatePrintDialog); #endif // defined(OS_LINUX) && !defined(OS_CHROMEOS) } 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; -} diff --git a/chrome/browser/printing/print_dialog_gtk.h b/chrome/browser/printing/print_dialog_gtk.h index e66579f..79266b3 100644 --- a/chrome/browser/printing/print_dialog_gtk.h +++ b/chrome/browser/printing/print_dialog_gtk.h @@ -11,7 +11,10 @@ #include "base/file_path.h" #include "base/memory/ref_counted.h" +#include "base/memory/scoped_ptr.h" +#include "content/browser/browser_thread.h" #include "printing/native_metafile.h" +#include "printing/print_dialog_gtk_interface.h" #include "printing/printing_context_cairo.h" #include "ui/base/gtk/gtk_signal.h" @@ -22,27 +25,29 @@ class WaitableEvent; using printing::NativeMetafile; using printing::PrintingContextCairo; -class PrintDialogGtk : public base::RefCountedThreadSafe<PrintDialogGtk> { +// Needs to be freed on the UI thread to clean up its GTK members variables. +class PrintDialogGtk + : public printing::PrintDialogGtkInterface, + public base::RefCountedThreadSafe<PrintDialogGtk, + BrowserThread::DeleteOnUIThread> { public: - // Creates and returns a print dialog. The dialog will initialize the settings - // for |context| and call |callback| to inform the print workflow of the - // dialog results. - static void* CreatePrintDialog( - PrintingContextCairo::PrintSettingsCallback* callback, + // Creates and returns a print dialog. + static printing::PrintDialogGtkInterface* CreatePrintDialog( PrintingContextCairo* context); - // Prints a document named |document_name| based on the settings in - // |print_dialog|, with data from |metafile|. - // Called from the print worker thread. - static void PrintDocument(void* print_dialog, - const NativeMetafile* metafile, - const string16& document_name); + // printing::PrintDialogGtkInterface implementation. + virtual void ShowDialog( + PrintingContextCairo::PrintSettingsCallback* callback); + virtual void PrintDocument(const NativeMetafile* metafile, + const string16& document_name); + virtual void AddRefToDialog(); + virtual void ReleaseDialog(); private: - friend class base::RefCountedThreadSafe<PrintDialogGtk>; + friend struct BrowserThread::DeleteOnThread<BrowserThread::UI>; + friend class DeleteTask<PrintDialogGtk>; - PrintDialogGtk(PrintingContextCairo::PrintSettingsCallback* callback, - PrintingContextCairo* context); + explicit PrintDialogGtk(PrintingContextCairo* context); ~PrintDialogGtk(); // Handles dialog response. @@ -61,20 +66,20 @@ class PrintDialogGtk : public base::RefCountedThreadSafe<PrintDialogGtk> { GError* error); void OnJobCompleted(GtkPrintJob* print_job, GError* error); - void set_save_document_event(base::WaitableEvent* event); - // Printing dialog callback. PrintingContextCairo::PrintSettingsCallback* callback_; PrintingContextCairo* context_; - // Print dialog settings. + // Print dialog settings. PrintDialogGtk owns |dialog_| and holds references + // to the other objects. GtkWidget* dialog_; + GtkPrintSettings* gtk_settings_; GtkPageSetup* page_setup_; GtkPrinter* printer_; - GtkPrintSettings* gtk_settings_; // Event to signal when save document finishes. - base::WaitableEvent* save_document_event_; + scoped_ptr<base::WaitableEvent> save_document_event_; + FilePath path_to_pdf_; DISALLOW_COPY_AND_ASSIGN(PrintDialogGtk); |