summaryrefslogtreecommitdiffstats
path: root/chrome
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
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')
-rw-r--r--chrome/browser/browser_main_posix.cc5
-rw-r--r--chrome/browser/printing/print_dialog_gtk.cc125
-rw-r--r--chrome/browser/printing/print_dialog_gtk.h45
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);