Index: chrome/browser/ui/libgtk2ui/print_dialog_gtk2.cc |
diff --git a/chrome/browser/ui/libgtk2ui/print_dialog_gtk2.cc b/chrome/browser/ui/libgtk2ui/print_dialog_gtk2.cc |
index 971eecc633679eae293f341f88029a9e1dafad3a..b8b01413cfcb5e8c4032ce81b75aac4c9132b129 100644 |
--- a/chrome/browser/ui/libgtk2ui/print_dialog_gtk2.cc |
+++ b/chrome/browser/ui/libgtk2ui/print_dialog_gtk2.cc |
@@ -6,6 +6,8 @@ |
#include <gtk/gtkunixprint.h> |
+#include <algorithm> |
+#include <cmath> |
#include <string> |
#include <vector> |
@@ -36,6 +38,53 @@ const char kDuplexNone[] = "None"; |
const char kDuplexTumble[] = "DuplexTumble"; |
const char kDuplexNoTumble[] = "DuplexNoTumble"; |
+int kPaperSizeTresholdMicrons = 100; |
+int kMicronsInMm = 1000; |
+ |
+// Checks whether gtk_paper_size can be used to represent user selected media. |
+// In fuzzy match mode checks that paper sizes are "close enough" (less than |
+// 1mm difference). In the exact mode, looks for the paper with the same PPD |
+// name and "close enough" size. |
+bool PaperSizeMatch(GtkPaperSize* gtk_paper_size, |
+ const PrintSettings::RequestedMedia& media, |
+ bool fuzzy_match) { |
+ if (!gtk_paper_size) { |
+ return false; |
+ } |
+ gfx::Size paper_size_microns( |
+ static_cast<int>(gtk_paper_size_get_width(gtk_paper_size, GTK_UNIT_MM) * |
+ kMicronsInMm + 0.5), |
+ static_cast<int>(gtk_paper_size_get_height(gtk_paper_size, GTK_UNIT_MM) * |
+ kMicronsInMm + 0.5)); |
+ int diff = std::max( |
+ std::abs(paper_size_microns.width() - media.size_microns.width()), |
+ std::abs(paper_size_microns.height() - media.size_microns.height())); |
+ if (fuzzy_match) { |
+ return diff <= kPaperSizeTresholdMicrons; |
+ } |
+ return !media.vendor_id.empty() && |
+ media.vendor_id == gtk_paper_size_get_ppd_name(gtk_paper_size) && |
+ diff <= kPaperSizeTresholdMicrons; |
+} |
+ |
+// Looks up a paper size matching (in terms of PaperSizeMatch) the user selected |
+// media in the paper size list reported by GTK. Returns NULL if there's no |
+// match found. |
+GtkPaperSize* FindPaperSizeMatch(GList* gtk_paper_sizes, |
+ const PrintSettings::RequestedMedia& media) { |
+ GtkPaperSize* first_fuzzy_match = NULL; |
+ for (GList* p = gtk_paper_sizes; p && p->data; p = g_list_next(p)) { |
+ GtkPaperSize* gtk_paper_size = static_cast<GtkPaperSize*>(p->data); |
+ if (PaperSizeMatch(gtk_paper_size, media, false)) { |
+ return gtk_paper_size; |
+ } |
+ if (!first_fuzzy_match && PaperSizeMatch(gtk_paper_size, media, true)) { |
+ first_fuzzy_match = gtk_paper_size; |
+ } |
+ } |
+ return first_fuzzy_match; |
+} |
+ |
class StickyPrintSettingGtk { |
public: |
StickyPrintSettingGtk() : last_used_settings_(gtk_print_settings_new()) { |
@@ -224,6 +273,40 @@ bool PrintDialogGtk2::UpdateSettings(printing::PrintSettings* settings) { |
if (!page_setup_) |
page_setup_ = gtk_page_setup_new(); |
+ if (page_setup_ && !settings->requested_media().IsDefault()) { |
+ const PrintSettings::RequestedMedia& requested_media = |
+ settings->requested_media(); |
+ GtkPaperSize* gtk_current_paper_size = |
+ gtk_page_setup_get_paper_size(page_setup_); |
+ if (!PaperSizeMatch(gtk_current_paper_size, requested_media, |
+ true /*fuzzy_match*/)) { |
+ GList* gtk_paper_sizes = |
+ gtk_paper_size_get_paper_sizes(false /*include_custom*/); |
+ if (gtk_paper_sizes) { |
+ GtkPaperSize* matching_gtk_paper_size = |
+ FindPaperSizeMatch(gtk_paper_sizes, requested_media); |
+ if (matching_gtk_paper_size) { |
+ VLOG(1) << "Using listed paper size"; |
+ gtk_page_setup_set_paper_size(page_setup_, matching_gtk_paper_size); |
+ } else { |
+ VLOG(1) << "Using custom paper size"; |
+ GtkPaperSize* custom_size = gtk_paper_size_new_custom( |
+ requested_media.vendor_id.c_str(), |
+ requested_media.vendor_id.c_str(), |
+ requested_media.size_microns.width() / kMicronsInMm, |
+ requested_media.size_microns.height() / kMicronsInMm, |
+ GTK_UNIT_MM); |
+ gtk_page_setup_set_paper_size(page_setup_, custom_size); |
+ gtk_paper_size_free(custom_size); |
+ } |
+ g_list_free_full(gtk_paper_sizes, |
+ reinterpret_cast<GDestroyNotify>(gtk_paper_size_free)); |
+ } |
+ } else { |
+ VLOG(1) << "Using default paper size"; |
+ } |
+ } |
+ |
gtk_print_settings_set_orientation( |
gtk_settings_, |
settings->landscape() ? GTK_PAGE_ORIENTATION_LANDSCAPE : |