summaryrefslogtreecommitdiffstats
path: root/printing
diff options
context:
space:
mode:
authorjhawkins@chromium.org <jhawkins@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2010-09-21 19:18:05 +0000
committerjhawkins@chromium.org <jhawkins@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2010-09-21 19:18:05 +0000
commitb719142cac87c33ec2d6e99a238b5ecd48f87d68 (patch)
treecb073e88f553db6c3acab1c18c1f9e31793a80b7 /printing
parentb119a1e6bdd11040f93245e0b71d654a4883b40a (diff)
downloadchromium_src-b719142cac87c33ec2d6e99a238b5ecd48f87d68.zip
chromium_src-b719142cac87c33ec2d6e99a238b5ecd48f87d68.tar.gz
chromium_src-b719142cac87c33ec2d6e99a238b5ecd48f87d68.tar.bz2
Printing: Implement PrintingContext::UseDefaultSettings for Linux/Cairo.
BUG=none TEST=none Review URL: http://codereview.chromium.org/3389005 git-svn-id: svn://svn.chromium.org/chrome/trunk/src@60087 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'printing')
-rw-r--r--printing/print_settings.cc41
-rw-r--r--printing/print_settings.h9
-rw-r--r--printing/printing.gyp2
-rw-r--r--printing/printing_context.h15
-rw-r--r--printing/printing_context_cairo.cc29
-rw-r--r--printing/printing_context_mac.mm10
-rw-r--r--printing/printing_context_win.cc12
-rw-r--r--printing/printing_context_win_unittest.cc21
8 files changed, 115 insertions, 24 deletions
diff --git a/printing/print_settings.cc b/printing/print_settings.cc
index bfc7868..98a9ebf 100644
--- a/printing/print_settings.cc
+++ b/printing/print_settings.cc
@@ -4,9 +4,16 @@
#include "printing/print_settings.h"
+// TODO(jhawkins): Move platform-specific implementations to their own files.
+#if defined(USE_X11)
+#include <gtk/gtk.h>
+#endif // defined(USE_X11)
+
#include "base/atomic_sequence_num.h"
#include "base/logging.h"
+#include "base/string_piece.h"
#include "base/sys_string_conversions.h"
+#include "base/utf_string_conversions.h"
#include "printing/units.h"
namespace printing {
@@ -37,7 +44,7 @@ void PrintSettings::Clear() {
landscape_ = false;
}
-#ifdef WIN32
+#if defined(OS_WIN)
void PrintSettings::Init(HDC hdc,
const DEVMODE& dev_mode,
const PageRanges& new_ranges,
@@ -119,6 +126,38 @@ void PrintSettings::Init(PMPrinter printer, PMPageFormat page_format,
printable_area_device_units,
72);
}
+#elif defined(OS_LINUX)
+void PrintSettings::Init(GtkPrintSettings* settings,
+ GtkPageSetup* page_setup,
+ const PageRanges& new_ranges,
+ bool print_selection_only) {
+ // TODO(jhawkins): |printer_name_| and |device_name_| should be string16.
+ base::StringPiece name(
+ reinterpret_cast<const char*>(gtk_print_settings_get_printer(settings)));
+ printer_name_ = UTF8ToWide(name);
+ device_name_ = printer_name_;
+ ranges = new_ranges;
+
+ GtkPageOrientation orientation = gtk_print_settings_get_orientation(settings);
+ landscape_ = orientation == GTK_PAGE_ORIENTATION_LANDSCAPE;
+ selection_only = print_selection_only;
+
+ dpi_ = gtk_print_settings_get_resolution(settings);
+
+ // Initialize page_setup_device_units_.
+ gfx::Size physical_size_device_units(
+ gtk_page_setup_get_paper_width(page_setup, GTK_UNIT_INCH) * dpi_,
+ gtk_page_setup_get_paper_height(page_setup, GTK_UNIT_INCH) * dpi_);
+ gfx::Rect printable_area_device_units(
+ gtk_page_setup_get_left_margin(page_setup, GTK_UNIT_INCH) * dpi_,
+ gtk_page_setup_get_top_margin(page_setup, GTK_UNIT_INCH) * dpi_,
+ gtk_page_setup_get_page_width(page_setup, GTK_UNIT_INCH) * dpi_,
+ gtk_page_setup_get_page_height(page_setup, GTK_UNIT_INCH) * dpi_);
+
+ SetPrinterPrintableArea(physical_size_device_units,
+ printable_area_device_units,
+ dpi_);
+}
#endif
void PrintSettings::SetPrinterPrintableArea(
diff --git a/printing/print_settings.h b/printing/print_settings.h
index fc52aeb..bdea485 100644
--- a/printing/print_settings.h
+++ b/printing/print_settings.h
@@ -16,6 +16,8 @@
typedef struct HDC__* HDC;
typedef struct _devicemodeW DEVMODE;
+typedef struct _GtkPrintSettings GtkPrintSettings;
+typedef struct _GtkPageSetup GtkPageSetup;
namespace printing {
@@ -39,6 +41,13 @@ class PrintSettings {
// Reads the settings from the given PMPrinter and PMPageFormat.
void Init(PMPrinter printer, PMPageFormat page_format,
const PageRanges& new_ranges, bool print_selection_only);
+#elif defined(OS_LINUX)
+ // Initializes the settings from the given GtkPrintSettings and GtkPageSetup.
+ // TODO(jhawkins): This method is a mess across the platforms. Refactor.
+ void Init(GtkPrintSettings* settings,
+ GtkPageSetup* page_setup,
+ const PageRanges& new_ranges,
+ bool print_selection_onl);
#endif
// Set printer printable area in in device units.
diff --git a/printing/printing.gyp b/printing/printing.gyp
index 48e31a1..050f830 100644
--- a/printing/printing.gyp
+++ b/printing/printing.gyp
@@ -76,6 +76,8 @@
'dependencies': [
# For FT_Init_FreeType and friends.
'../build/linux/system.gyp:freetype2',
+ '../build/linux/system.gyp:gtk',
+ '../build/linux/system.gyp:gtkprint',
],
}],
],
diff --git a/printing/printing_context.h b/printing/printing_context.h
index eb1b0c7..d5c6b00 100644
--- a/printing/printing_context.h
+++ b/printing/printing_context.h
@@ -15,6 +15,7 @@
#include <string>
#include "base/basictypes.h"
+#include "base/callback.h"
#if !(defined(OS_WIN) || defined(OS_MACOSX))
// TODO(port) Remove after implementing PrintingContext::context()
#include "base/logging.h"
@@ -50,10 +51,18 @@ class PrintingContext {
PrintingContext();
~PrintingContext();
+ // Callback of AskUserForSettings, used to notify the PrintJobWorker when
+ // print settings are available.
+ typedef Callback1<Result>::Type PrintSettingsCallback;
+
// Asks the user what printer and format should be used to print. Updates the
- // context with the select device settings.
- Result AskUserForSettings(gfx::NativeView parent_view, int max_pages,
- bool has_selection);
+ // context with the select device settings. The result of the call is returned
+ // in the callback. This is necessary for Linux, which only has an
+ // asynchronous printing API.
+ void AskUserForSettings(gfx::NativeView parent_view,
+ int max_pages,
+ bool has_selection,
+ PrintSettingsCallback* callback);
#if defined(OS_WIN) && defined(UNIT_TEST)
// Sets a fake PrintDlgEx function pointer in tests.
diff --git a/printing/printing_context_cairo.cc b/printing/printing_context_cairo.cc
index 78b5235..d82f626 100644
--- a/printing/printing_context_cairo.cc
+++ b/printing/printing_context_cairo.cc
@@ -4,6 +4,9 @@
#include "printing/printing_context.h"
+#include <gtk/gtk.h>
+#include <gtk/gtkprintunixdialog.h>
+
#include "base/logging.h"
namespace printing {
@@ -22,22 +25,34 @@ PrintingContext::~PrintingContext() {
ResetSettings();
}
-PrintingContext::Result PrintingContext::AskUserForSettings(
+void PrintingContext::AskUserForSettings(
gfx::NativeView parent_view,
int max_pages,
- bool has_selection) {
-
+ bool has_selection,
+ PrintSettingsCallback* callback) {
NOTIMPLEMENTED();
-
- return FAILED;
+ callback->Run(OK);
}
PrintingContext::Result PrintingContext::UseDefaultSettings() {
DCHECK(!in_print_job_);
- NOTIMPLEMENTED();
+ ResetSettings();
- return FAILED;
+ GtkWidget* dialog = gtk_print_unix_dialog_new(NULL, NULL);
+ GtkPrintSettings* settings =
+ gtk_print_unix_dialog_get_settings(GTK_PRINT_UNIX_DIALOG(dialog));
+ GtkPageSetup* page_setup =
+ gtk_print_unix_dialog_get_page_setup(GTK_PRINT_UNIX_DIALOG(dialog));
+
+ PageRanges ranges_vector; // Nothing to initialize for default settings.
+ settings_.Init(settings, page_setup, ranges_vector, false);
+
+ g_object_unref(settings);
+ // |page_setup| is owned by dialog, so it does not need to be unref'ed.
+ gtk_widget_destroy(dialog);
+
+ return OK;
}
PrintingContext::Result PrintingContext::InitWithSettings(
diff --git a/printing/printing_context_mac.mm b/printing/printing_context_mac.mm
index 762cade..ea6474c 100644
--- a/printing/printing_context_mac.mm
+++ b/printing/printing_context_mac.mm
@@ -28,8 +28,10 @@ PrintingContext::~PrintingContext() {
}
-PrintingContext::Result PrintingContext::AskUserForSettings(
- gfx::NativeView parent_view, int max_pages, bool has_selection) {
+void PrintingContext::AskUserForSettings(gfx::NativeView parent_view,
+ int max_pages,
+ bool has_selection,
+ PrintSettingsCallback* callback) {
DCHECK([NSThread isMainThread]);
// We deliberately don't feed max_pages into the dialog, because setting
@@ -62,11 +64,11 @@ PrintingContext::Result PrintingContext::AskUserForSettings(
// Will require restructuring the PrintingContext API to use a callback.
NSInteger selection = [panel runModalWithPrintInfo:printInfo];
if (selection != NSOKButton) {
- return CANCEL;
+ callback->Run(CANCEL);
}
ParsePrintInfo([panel printInfo]);
- return OK;
+ callback->Run(OK);
}
PrintingContext::Result PrintingContext::UseDefaultSettings() {
diff --git a/printing/printing_context_win.cc b/printing/printing_context_win.cc
index ef07833..a94c71f 100644
--- a/printing/printing_context_win.cc
+++ b/printing/printing_context_win.cc
@@ -136,10 +136,10 @@ PrintingContext::~PrintingContext() {
ResetSettings();
}
-PrintingContext::Result PrintingContext::AskUserForSettings(
- HWND view,
- int max_pages,
- bool has_selection) {
+void PrintingContext::AskUserForSettings(HWND view,
+ int max_pages,
+ bool has_selection,
+ PrintSettingsCallback* callback) {
DCHECK(!in_print_job_);
dialog_box_dismissed_ = false;
@@ -190,11 +190,11 @@ PrintingContext::Result PrintingContext::AskUserForSettings(
{
if ((*print_dialog_func_)(&dialog_options) != S_OK) {
ResetSettings();
- return FAILED;
+ callback->Run(FAILED);
}
}
// TODO(maruel): Support PD_PRINTTOFILE.
- return ParseDialogResultEx(dialog_options);
+ callback->Run(ParseDialogResultEx(dialog_options));
}
PrintingContext::Result PrintingContext::UseDefaultSettings() {
diff --git a/printing/printing_context_win_unittest.cc b/printing/printing_context_win_unittest.cc
index c2e377b..625af54 100644
--- a/printing/printing_context_win_unittest.cc
+++ b/printing/printing_context_win_unittest.cc
@@ -10,6 +10,16 @@
// This test is automatically disabled if no printer is available.
class PrintingContextTest : public PrintingTest<testing::Test> {
+ public:
+ void PrintSettingsCallback(printing::PrintingContext::Result result) {
+ result_ = result;
+ }
+
+ protected:
+ printing::PrintingContext::Result result() const { return result_; }
+
+ private:
+ printing::PrintingContext::Result result_;
};
// This is a fake PrintDlgEx implementation that sets the right fields in
@@ -105,8 +115,13 @@ TEST_F(PrintingContextTest, Base) {
TEST_F(PrintingContextTest, PrintAll) {
printing::PrintingContext context;
context.SetPrintDialog(&PrintDlgExMock);
- ASSERT_EQ(printing::PrintingContext::OK,
- context.AskUserForSettings(NULL, 123, false));
+ context.AskUserForSettings(
+ NULL,
+ 123,
+ false,
+ NewCallback(static_cast<PrintingContextTest*>(this),
+ &PrintingContextTest::PrintSettingsCallback));
+ ASSERT_EQ(printing::PrintingContext::OK, result());
printing::PrintSettings settings = context.settings();
EXPECT_EQ(settings.ranges.size(), 0);
-} \ No newline at end of file
+}