Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
fix: honor pageRanges when printing (#25597)
- Loading branch information
1 parent
0b75053
commit 6fe6dff
Showing
5 changed files
with
141 additions
and
12 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
127 changes: 127 additions & 0 deletions
127
patches/chromium/fix_properly_honor_printing_page_ranges.patch
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,127 @@ | ||
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 | ||
From: Shelley Vohr <shelley.vohr@gmail.com> | ||
Date: Wed, 23 Sep 2020 10:27:57 -0700 | ||
Subject: fix: properly honor printing page ranges | ||
|
||
The print ranges in Chromium's print job settings were not being properly | ||
plumbed through to PMPrintSettings on mcOS. This fixes that by setting | ||
them should they exist. | ||
|
||
diff --git a/printing/printing_context_mac.h b/printing/printing_context_mac.h | ||
index 06cdc0e1a4a50e29a148c97c964c30a939e800da..5db5cdb61be0beee4506313dcde46c499e011383 100644 | ||
--- a/printing/printing_context_mac.h | ||
+++ b/printing/printing_context_mac.h | ||
@@ -81,6 +81,10 @@ class PRINTING_EXPORT PrintingContextMac : public PrintingContext { | ||
// Returns true if the orientation was set. | ||
bool SetOrientationIsLandscape(bool landscape); | ||
|
||
+ // Set the page range in native print info object. | ||
+ // Returns true if the range was set. | ||
+ bool SetPrintRangeInPrintSettings(const PageRanges& ranges); | ||
+ | ||
// Sets duplex mode in PMPrintSettings. | ||
// Returns true if duplex mode is set. | ||
bool SetDuplexModeInPrintSettings(mojom::DuplexMode mode); | ||
diff --git a/printing/printing_context_mac.mm b/printing/printing_context_mac.mm | ||
index 93438609a3a0eaeec0dbc76efe5c46e03fb40e52..dc64546f7d88db3b48f379b34c7dcc49b692a048 100644 | ||
--- a/printing/printing_context_mac.mm | ||
+++ b/printing/printing_context_mac.mm | ||
@@ -186,7 +186,8 @@ PrintingContext::Result PrintingContextMac::UpdatePrinterSettings( | ||
!SetCopiesInPrintSettings(settings_->copies()) || | ||
!SetCollateInPrintSettings(settings_->collate()) || | ||
!SetDuplexModeInPrintSettings(settings_->duplex_mode()) || | ||
- !SetOutputColor(settings_->color())) { | ||
+ !SetOutputColor(settings_->color()) || | ||
+ !SetPrintRangeInPrintSettings(settings_->ranges())) { | ||
return OnError(); | ||
} | ||
} | ||
@@ -339,6 +340,22 @@ bool PrintingContextMac::SetCopiesInPrintSettings(int copies) { | ||
return PMSetCopies(print_settings, copies, false) == noErr; | ||
} | ||
|
||
+bool PrintingContextMac::SetPrintRangeInPrintSettings(const PageRanges& ranges) { | ||
+ // Default is already NSPrintAllPages - we can safely bail. | ||
+ if (ranges.empty()) | ||
+ return true; | ||
+ | ||
+ auto* print_settings = | ||
+ static_cast<PMPrintSettings>([print_info_.get() PMPrintSettings]); | ||
+ | ||
+ // macOS does not allow multiple ranges, so pluck the first. | ||
+ auto range = ranges.front(); | ||
+ bool set_first_page = PMSetFirstPage(print_settings, range.from + 1, false) == noErr; | ||
+ bool set_last_page = PMSetLastPage(print_settings, range.to + 1, false) == noErr; | ||
+ | ||
+ return set_first_page && set_last_page; | ||
+} | ||
+ | ||
bool PrintingContextMac::SetCollateInPrintSettings(bool collate) { | ||
PMPrintSettings print_settings = | ||
static_cast<PMPrintSettings>([print_info_.get() PMPrintSettings]); | ||
diff --git a/printing/printing_context_system_dialog_win.cc b/printing/printing_context_system_dialog_win.cc | ||
index a53e4045bdc8a4ea68720c7a4792599097792814..1cb0c34dce72f99d8689e37f2a5d587767d224bf 100644 | ||
--- a/printing/printing_context_system_dialog_win.cc | ||
+++ b/printing/printing_context_system_dialog_win.cc | ||
@@ -52,14 +52,28 @@ void PrintingContextSystemDialogWin::AskUserForSettings( | ||
PRINTPAGERANGE ranges[32]; | ||
dialog_options.nStartPage = START_PAGE_GENERAL; | ||
if (max_pages) { | ||
- // Default initialize to print all the pages. | ||
memset(ranges, 0, sizeof(ranges)); | ||
- ranges[0].nFromPage = 1; | ||
- ranges[0].nToPage = max_pages; | ||
- dialog_options.nPageRanges = 1; | ||
- dialog_options.nMaxPageRanges = base::size(ranges); | ||
+ | ||
+ auto page_ranges = settings_->ranges(); | ||
+ if (!page_ranges.empty()) { | ||
+ for (size_t i = 0; i < page_ranges.size(); i++) { | ||
+ auto range = page_ranges[i]; | ||
+ ranges[i].nFromPage = range.from + 1; | ||
+ ranges[i].nToPage = range.to + 1; | ||
+ } | ||
+ dialog_options.nPageRanges = page_ranges.size(); | ||
+ | ||
+ // Ensure the Pages radio button is selected. | ||
+ dialog_options.Flags |= PD_PAGENUMS; | ||
+ } else { | ||
+ ranges[0].nFromPage = 1; | ||
+ ranges[0].nToPage = max_pages; | ||
+ dialog_options.nPageRanges = 1; | ||
+ } | ||
+ | ||
dialog_options.nMinPage = 1; | ||
dialog_options.nMaxPage = max_pages; | ||
+ dialog_options.nMaxPageRanges = base::size(ranges); | ||
dialog_options.lpPageRanges = ranges; | ||
} else { | ||
// No need to bother, we don't know how many pages are available. | ||
diff --git a/ui/gtk/printing/print_dialog_gtk.cc b/ui/gtk/printing/print_dialog_gtk.cc | ||
index 57900d2854d7c3cb427bc3bd8b1742335ab820b8..166e7eeb9c46f04664fe8986767114b9f4809b71 100644 | ||
--- a/ui/gtk/printing/print_dialog_gtk.cc | ||
+++ b/ui/gtk/printing/print_dialog_gtk.cc | ||
@@ -240,6 +240,23 @@ void PrintDialogGtk::UpdateSettings( | ||
gtk_print_settings_set_n_copies(gtk_settings_, settings->copies()); | ||
gtk_print_settings_set_collate(gtk_settings_, settings->collate()); | ||
|
||
+ auto print_ranges = settings->ranges(); | ||
+ if (!print_ranges.empty()) { | ||
+ // Tell the system that we only intend to print a subset of pages. | ||
+ gtk_print_settings_set_print_pages(gtk_settings_, GTK_PRINT_PAGES_RANGES); | ||
+ | ||
+ GtkPageRange* ranges; | ||
+ ranges = g_new(GtkPageRange, print_ranges.size()); | ||
+ for (size_t i = 0; i < print_ranges.size(); i++) { | ||
+ auto range = print_ranges[i]; | ||
+ ranges[i].start = range.from; | ||
+ ranges[i].end = range.to; | ||
+ } | ||
+ | ||
+ gtk_print_settings_set_page_ranges(gtk_settings_, ranges, 1); | ||
+ g_free(ranges); | ||
+ } | ||
+ | ||
#if defined(USE_CUPS) | ||
// Set advanced settings first so they can be overridden by user applied | ||
// settings. |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters