summaryrefslogtreecommitdiffstats
path: root/printing/printing_context_cairo.cc
diff options
context:
space:
mode:
authorsanjeevr@chromium.org <sanjeevr@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2010-12-03 22:40:37 +0000
committersanjeevr@chromium.org <sanjeevr@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2010-12-03 22:40:37 +0000
commitee5f36e4442fed7e6c264c73bbbd49b6545201d1 (patch)
tree2d6de2c6c52f5b6a9ca772e56c2edeef6f7733cc /printing/printing_context_cairo.cc
parent18d68db9020b616b3ee9d39b4406736ae266cd61 (diff)
downloadchromium_src-ee5f36e4442fed7e6c264c73bbbd49b6545201d1.zip
chromium_src-ee5f36e4442fed7e6c264c73bbbd49b6545201d1.tar.gz
chromium_src-ee5f36e4442fed7e6c264c73bbbd49b6545201d1.tar.bz2
On Chrome OS, use the application locale to determine the default paper size rather than rely on GTK.
BUG=None. TEST=Web pages printed from Chrome OS should use locale-specific default paper size (specifically, for US, it should use 8.5 x 11). Review URL: http://codereview.chromium.org/5636001 git-svn-id: svn://svn.chromium.org/chrome/trunk/src@68233 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'printing/printing_context_cairo.cc')
-rw-r--r--printing/printing_context_cairo.cc53
1 files changed, 49 insertions, 4 deletions
diff --git a/printing/printing_context_cairo.cc b/printing/printing_context_cairo.cc
index c2097f2..5f9f884 100644
--- a/printing/printing_context_cairo.cc
+++ b/printing/printing_context_cairo.cc
@@ -6,18 +6,22 @@
#include <gtk/gtk.h>
#include <gtk/gtkprintunixdialog.h>
+#include <unicode/ulocdata.h>
#include "base/logging.h"
+#include "printing/native_metafile.h"
#include "printing/print_settings_initializer_gtk.h"
+#include "printing/units.h"
namespace printing {
// static
-PrintingContext* PrintingContext::Create() {
- return static_cast<PrintingContext*>(new PrintingContextCairo);
+ PrintingContext* PrintingContext::Create(const std::string& app_locale) {
+ return static_cast<PrintingContext*>(new PrintingContextCairo(app_locale));
}
-PrintingContextCairo::PrintingContextCairo() : PrintingContext() {
+ PrintingContextCairo::PrintingContextCairo(const std::string& app_locale)
+ : PrintingContext(app_locale) {
}
PrintingContextCairo::~PrintingContextCairo() {
@@ -37,7 +41,47 @@ PrintingContext::Result PrintingContextCairo::UseDefaultSettings() {
DCHECK(!in_print_job_);
ResetSettings();
-
+#if defined(OS_CHROMEOS)
+ // For Chrome OS use default values based on the app locale rather than rely
+ // on GTK. Note that relying on the app locale does not work well if it is
+ // different from the system locale, e.g. a user using Chinese ChromeOS in the
+ // US. Eventually we need to get the defaults from the printer.
+ // TODO(sanjeevr): We need a better feedback loop between the cloud print
+ // dialog and this code.
+ int dpi = 300;
+ gfx::Size physical_size_device_units;
+ gfx::Rect printable_area_device_units;
+ int32_t width = 0;
+ int32_t height = 0;
+ UErrorCode error = U_ZERO_ERROR;
+ ulocdata_getPaperSize(app_locale_.c_str(), &height, &width, &error);
+ if (error != U_ZERO_ERROR) {
+ // If the call failed, assume a paper size of 8.5 x 11 inches.
+ LOG(WARNING) << "ulocdata_getPaperSize failed, using 8.5 x 11, error: "
+ << error;
+ width = static_cast<int>(8.5 * dpi);
+ height = static_cast<int>(11 * dpi);
+ } else {
+ // ulocdata_getPaperSize returns the width and height in mm.
+ // Convert this to pixels based on the dpi.
+ width = static_cast<int>(ConvertUnitDouble(width, 25.4, 1.0) * dpi);
+ height = static_cast<int>(ConvertUnitDouble(height, 25.4, 1.0) * dpi);
+ }
+
+ physical_size_device_units.SetSize(width, height);
+ printable_area_device_units.SetRect(
+ static_cast<int>(NativeMetafile::kLeftMarginInInch * dpi),
+ static_cast<int>(NativeMetafile::kTopMarginInInch * dpi),
+ width - (NativeMetafile::kLeftMarginInInch +
+ NativeMetafile::kRightMarginInInch) * dpi,
+ height - (NativeMetafile::kTopMarginInInch +
+ NativeMetafile::kBottomMarginInInch) * dpi);
+
+ settings_.set_dpi(dpi);
+ settings_.SetPrinterPrintableArea(physical_size_device_units,
+ printable_area_device_units,
+ dpi);
+#else // defined(OS_CHROMEOS)
GtkWidget* dialog = gtk_print_unix_dialog_new(NULL, NULL);
GtkPrintSettings* settings =
gtk_print_unix_dialog_get_settings(GTK_PRINT_UNIX_DIALOG(dialog));
@@ -51,6 +95,7 @@ PrintingContext::Result PrintingContextCairo::UseDefaultSettings() {
g_object_unref(settings);
// |page_setup| is owned by dialog, so it does not need to be unref'ed.
gtk_widget_destroy(dialog);
+#endif // defined(OS_CHROMEOS)
return OK;
}