1 /* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
2 /* This Source Code Form is subject to the terms of the Mozilla Public
3 * License, v. 2.0. If a copy of the MPL was not distributed with this
4 * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
6 #include "nsPrintSettingsGTK.h"
12 static gboolean
ref_printer(GtkPrinter
* aPrinter
, gpointer aData
) {
13 ((nsPrintSettingsGTK
*)aData
)->SetGtkPrinter(aPrinter
);
17 static gboolean
printer_enumerator(GtkPrinter
* aPrinter
, gpointer aData
) {
18 if (gtk_printer_is_default(aPrinter
)) return ref_printer(aPrinter
, aData
);
20 return FALSE
; // Keep 'em coming...
23 static GtkPaperSize
* moz_gtk_paper_size_copy_to_new_custom(
24 GtkPaperSize
* oldPaperSize
) {
25 // We make a "custom-ified" copy of the paper size so it can be changed later.
26 return gtk_paper_size_new_custom(
27 gtk_paper_size_get_name(oldPaperSize
),
28 gtk_paper_size_get_display_name(oldPaperSize
),
29 gtk_paper_size_get_width(oldPaperSize
, GTK_UNIT_INCH
),
30 gtk_paper_size_get_height(oldPaperSize
, GTK_UNIT_INCH
), GTK_UNIT_INCH
);
33 NS_IMPL_ISUPPORTS_INHERITED(nsPrintSettingsGTK
, nsPrintSettings
,
36 /** ---------------------------------------------------
38 nsPrintSettingsGTK::nsPrintSettingsGTK()
39 : mPageSetup(nullptr),
40 mPrintSettings(nullptr),
42 mPrintSelectionOnly(false) {
43 // The aim here is to set up the objects enough that silent printing works
44 // well. These will be replaced anyway if the print dialog is used.
45 mPrintSettings
= gtk_print_settings_new();
46 GtkPageSetup
* pageSetup
= gtk_page_setup_new();
47 SetGtkPageSetup(pageSetup
);
48 g_object_unref(pageSetup
);
50 SetOutputFormat(nsIPrintSettings::kOutputFormatNative
);
53 already_AddRefed
<nsIPrintSettings
> CreatePlatformPrintSettings(
54 const PrintSettingsInitializer
& aSettings
) {
55 RefPtr
<nsPrintSettings
> settings
= new nsPrintSettingsGTK();
56 settings
->InitWithInitializer(aSettings
);
57 settings
->SetDefaultFileName();
58 return settings
.forget();
61 /** ---------------------------------------------------
63 nsPrintSettingsGTK::~nsPrintSettingsGTK() {
65 g_object_unref(mPageSetup
);
69 g_object_unref(mPrintSettings
);
70 mPrintSettings
= nullptr;
73 g_object_unref(mGTKPrinter
);
74 mGTKPrinter
= nullptr;
78 /** ---------------------------------------------------
80 nsPrintSettingsGTK::nsPrintSettingsGTK(const nsPrintSettingsGTK
& aPS
)
81 : mPageSetup(nullptr),
82 mPrintSettings(nullptr),
84 mPrintSelectionOnly(false) {
88 /** ---------------------------------------------------
90 nsPrintSettingsGTK
& nsPrintSettingsGTK::operator=(
91 const nsPrintSettingsGTK
& rhs
) {
96 nsPrintSettings::operator=(rhs
);
98 if (mPageSetup
) g_object_unref(mPageSetup
);
99 mPageSetup
= gtk_page_setup_copy(rhs
.mPageSetup
);
100 // NOTE: No need to re-initialize mUnwriteableMargin here (even
101 // though mPageSetup is changing). It'll be copied correctly by
102 // nsPrintSettings::operator=.
104 if (mPrintSettings
) g_object_unref(mPrintSettings
);
105 mPrintSettings
= gtk_print_settings_copy(rhs
.mPrintSettings
);
107 if (mGTKPrinter
) g_object_unref(mGTKPrinter
);
108 mGTKPrinter
= (GtkPrinter
*)g_object_ref(rhs
.mGTKPrinter
);
110 mPrintSelectionOnly
= rhs
.mPrintSelectionOnly
;
115 /** -------------------------------------------
117 nsresult
nsPrintSettingsGTK::_Clone(nsIPrintSettings
** _retval
) {
118 NS_ENSURE_ARG_POINTER(_retval
);
121 nsPrintSettingsGTK
* newSettings
= new nsPrintSettingsGTK(*this);
122 if (!newSettings
) return NS_ERROR_FAILURE
;
123 *_retval
= newSettings
;
128 /** -------------------------------------------
131 nsPrintSettingsGTK::_Assign(nsIPrintSettings
* aPS
) {
132 nsPrintSettingsGTK
* printSettingsGTK
= static_cast<nsPrintSettingsGTK
*>(aPS
);
133 if (!printSettingsGTK
) return NS_ERROR_UNEXPECTED
;
134 *this = *printSettingsGTK
;
138 /** ---------------------------------------------------
140 void nsPrintSettingsGTK::SetGtkPageSetup(GtkPageSetup
* aPageSetup
) {
141 if (mPageSetup
) g_object_unref(mPageSetup
);
143 mPageSetup
= (GtkPageSetup
*)g_object_ref(aPageSetup
);
144 InitUnwriteableMargin();
146 // If the paper size is not custom, then we make a custom copy of the
147 // GtkPaperSize, so it can be mutable. If a GtkPaperSize wasn't made as
148 // custom, its properties are immutable.
149 GtkPaperSize
* paperSize
= gtk_page_setup_get_paper_size(aPageSetup
);
150 if (!gtk_paper_size_is_custom(paperSize
)) {
151 GtkPaperSize
* customPaperSize
=
152 moz_gtk_paper_size_copy_to_new_custom(paperSize
);
153 gtk_page_setup_set_paper_size(mPageSetup
, customPaperSize
);
154 gtk_paper_size_free(customPaperSize
);
159 /** ---------------------------------------------------
161 void nsPrintSettingsGTK::SetGtkPrintSettings(GtkPrintSettings
* aPrintSettings
) {
162 if (mPrintSettings
) g_object_unref(mPrintSettings
);
164 mPrintSettings
= (GtkPrintSettings
*)g_object_ref(aPrintSettings
);
166 GtkPaperSize
* paperSize
= gtk_print_settings_get_paper_size(aPrintSettings
);
168 GtkPaperSize
* customPaperSize
=
169 moz_gtk_paper_size_copy_to_new_custom(paperSize
);
170 gtk_paper_size_free(paperSize
);
171 gtk_page_setup_set_paper_size(mPageSetup
, customPaperSize
);
172 gtk_paper_size_free(customPaperSize
);
174 // paperSize was null, and so we add the paper size in the GtkPageSetup to
180 /** ---------------------------------------------------
182 void nsPrintSettingsGTK::SetGtkPrinter(GtkPrinter
* aPrinter
) {
183 if (mGTKPrinter
) g_object_unref(mGTKPrinter
);
185 mGTKPrinter
= (GtkPrinter
*)g_object_ref(aPrinter
);
188 NS_IMETHODIMP
nsPrintSettingsGTK::GetOutputFormat(int16_t* aOutputFormat
) {
189 NS_ENSURE_ARG_POINTER(aOutputFormat
);
192 nsresult rv
= nsPrintSettings::GetOutputFormat(&format
);
197 if (format
== nsIPrintSettings::kOutputFormatNative
&&
198 GTK_IS_PRINTER(mGTKPrinter
)) {
199 if (gtk_printer_accepts_pdf(mGTKPrinter
)) {
200 format
= nsIPrintSettings::kOutputFormatPDF
;
202 format
= nsIPrintSettings::kOutputFormatPS
;
206 *aOutputFormat
= format
;
211 * Reimplementation of nsPrintSettings functions so that we get the values
212 * from the GTK objects rather than our own variables.
215 NS_IMETHODIMP
nsPrintSettingsGTK::GetPrintRange(int16_t* aPrintRange
) {
216 NS_ENSURE_ARG_POINTER(aPrintRange
);
217 if (mPrintSelectionOnly
) {
218 *aPrintRange
= kRangeSelection
;
222 GtkPrintPages gtkRange
= gtk_print_settings_get_print_pages(mPrintSettings
);
223 if (gtkRange
== GTK_PRINT_PAGES_RANGES
)
224 *aPrintRange
= kRangeSpecifiedPageRange
;
226 *aPrintRange
= kRangeAllPages
;
230 NS_IMETHODIMP
nsPrintSettingsGTK::SetPrintRange(int16_t aPrintRange
) {
231 if (aPrintRange
== kRangeSelection
) {
232 mPrintSelectionOnly
= true;
236 mPrintSelectionOnly
= false;
237 if (aPrintRange
== kRangeSpecifiedPageRange
)
238 gtk_print_settings_set_print_pages(mPrintSettings
, GTK_PRINT_PAGES_RANGES
);
240 gtk_print_settings_set_print_pages(mPrintSettings
, GTK_PRINT_PAGES_ALL
);
245 nsPrintSettingsGTK::GetStartPageRange(int32_t* aStartPageRange
) {
247 GtkPageRange
* lstRanges
=
248 gtk_print_settings_get_page_ranges(mPrintSettings
, &ctRanges
);
250 // Make sure we got a range.
252 *aStartPageRange
= 1;
254 // GTK supports multiple page ranges; gecko only supports 1. So find
255 // the lowest start page.
256 int32_t start(lstRanges
[0].start
);
257 for (gint ii
= 1; ii
< ctRanges
; ii
++) {
258 start
= std::min(lstRanges
[ii
].start
, start
);
260 *aStartPageRange
= start
+ 1;
267 nsPrintSettingsGTK::SetStartPageRange(int32_t aStartPageRange
) {
269 GetEndPageRange(&endRange
);
271 GtkPageRange gtkRange
;
272 gtkRange
.start
= aStartPageRange
- 1;
273 gtkRange
.end
= endRange
- 1;
275 gtk_print_settings_set_page_ranges(mPrintSettings
, >kRange
, 1);
281 nsPrintSettingsGTK::GetEndPageRange(int32_t* aEndPageRange
) {
283 GtkPageRange
* lstRanges
=
284 gtk_print_settings_get_page_ranges(mPrintSettings
, &ctRanges
);
289 int32_t end(lstRanges
[0].end
);
290 for (gint ii
= 1; ii
< ctRanges
; ii
++) {
291 end
= std::max(lstRanges
[ii
].end
, end
);
293 *aEndPageRange
= end
+ 1;
300 nsPrintSettingsGTK::SetEndPageRange(int32_t aEndPageRange
) {
302 GetStartPageRange(&startRange
);
304 GtkPageRange gtkRange
;
305 gtkRange
.start
= startRange
- 1;
306 gtkRange
.end
= aEndPageRange
- 1;
308 gtk_print_settings_set_page_ranges(mPrintSettings
, >kRange
, 1);
314 nsPrintSettingsGTK::GetPrintReversed(bool* aPrintReversed
) {
315 *aPrintReversed
= gtk_print_settings_get_reverse(mPrintSettings
);
319 nsPrintSettingsGTK::SetPrintReversed(bool aPrintReversed
) {
320 gtk_print_settings_set_reverse(mPrintSettings
, aPrintReversed
);
325 nsPrintSettingsGTK::GetPrintInColor(bool* aPrintInColor
) {
326 *aPrintInColor
= gtk_print_settings_get_use_color(mPrintSettings
);
330 nsPrintSettingsGTK::SetPrintInColor(bool aPrintInColor
) {
331 gtk_print_settings_set_use_color(mPrintSettings
, aPrintInColor
);
336 nsPrintSettingsGTK::GetOrientation(int32_t* aOrientation
) {
337 NS_ENSURE_ARG_POINTER(aOrientation
);
339 GtkPageOrientation gtkOrient
= gtk_page_setup_get_orientation(mPageSetup
);
341 case GTK_PAGE_ORIENTATION_LANDSCAPE
:
342 case GTK_PAGE_ORIENTATION_REVERSE_LANDSCAPE
:
343 *aOrientation
= kLandscapeOrientation
;
346 case GTK_PAGE_ORIENTATION_PORTRAIT
:
347 case GTK_PAGE_ORIENTATION_REVERSE_PORTRAIT
:
349 *aOrientation
= kPortraitOrientation
;
354 nsPrintSettingsGTK::SetOrientation(int32_t aOrientation
) {
355 GtkPageOrientation gtkOrient
;
356 if (aOrientation
== kLandscapeOrientation
)
357 gtkOrient
= GTK_PAGE_ORIENTATION_LANDSCAPE
;
359 gtkOrient
= GTK_PAGE_ORIENTATION_PORTRAIT
;
361 gtk_print_settings_set_orientation(mPrintSettings
, gtkOrient
);
362 gtk_page_setup_set_orientation(mPageSetup
, gtkOrient
);
367 nsPrintSettingsGTK::GetToFileName(nsAString
& aToFileName
) {
368 // Get the gtk output filename
369 const char* gtk_output_uri
=
370 gtk_print_settings_get(mPrintSettings
, GTK_PRINT_SETTINGS_OUTPUT_URI
);
371 if (!gtk_output_uri
) {
372 aToFileName
= mToFileName
;
376 // Convert to an nsIFile
377 nsCOMPtr
<nsIFile
> file
;
378 nsresult rv
= NS_GetFileFromURLSpec(nsDependentCString(gtk_output_uri
),
379 getter_AddRefs(file
));
380 if (NS_FAILED(rv
)) return rv
;
383 return file
->GetPath(aToFileName
);
387 nsPrintSettingsGTK::SetToFileName(const nsAString
& aToFileName
) {
388 if (aToFileName
.IsEmpty()) {
389 mToFileName
.SetLength(0);
390 gtk_print_settings_set(mPrintSettings
, GTK_PRINT_SETTINGS_OUTPUT_URI
,
395 gtk_print_settings_set(mPrintSettings
, GTK_PRINT_SETTINGS_OUTPUT_FILE_FORMAT
,
398 nsCOMPtr
<nsIFile
> file
;
399 nsresult rv
= NS_NewLocalFile(aToFileName
, true, getter_AddRefs(file
));
400 NS_ENSURE_SUCCESS(rv
, rv
);
402 // Convert the nsIFile to a URL
404 rv
= NS_GetURLSpecFromFile(file
, url
);
405 NS_ENSURE_SUCCESS(rv
, rv
);
407 gtk_print_settings_set(mPrintSettings
, GTK_PRINT_SETTINGS_OUTPUT_URI
,
409 mToFileName
= aToFileName
;
415 nsPrintSettingsGTK::GetPrinterName(nsAString
& aPrinter
) {
416 const char* gtkPrintName
= gtk_print_settings_get_printer(mPrintSettings
);
418 if (GTK_IS_PRINTER(mGTKPrinter
)) {
419 gtkPrintName
= gtk_printer_get_name(mGTKPrinter
);
421 // This mimics what nsPrintSettingsImpl does when we try to Get before we
427 aPrinter
= NS_ConvertUTF8toUTF16(gtkPrintName
);
432 nsPrintSettingsGTK::SetPrinterName(const nsAString
& aPrinter
) {
433 NS_ConvertUTF16toUTF8
gtkPrinter(aPrinter
);
435 if (StringBeginsWith(gtkPrinter
, "CUPS/"_ns
)) {
436 // Strip off "CUPS/"; GTK might recognize the rest
437 gtkPrinter
.Cut(0, strlen("CUPS/"));
440 // Give mPrintSettings the passed-in printer name if either...
441 // - it has no printer name stored yet
442 // - it has an existing printer name that's different from
443 // the name passed to this function.
444 const char* oldPrinterName
= gtk_print_settings_get_printer(mPrintSettings
);
445 if (!oldPrinterName
|| !gtkPrinter
.Equals(oldPrinterName
)) {
446 mIsInitedFromPrinter
= false;
447 mIsInitedFromPrefs
= false;
448 gtk_print_settings_set_printer(mPrintSettings
, gtkPrinter
.get());
455 nsPrintSettingsGTK::GetNumCopies(int32_t* aNumCopies
) {
456 NS_ENSURE_ARG_POINTER(aNumCopies
);
457 *aNumCopies
= gtk_print_settings_get_n_copies(mPrintSettings
);
461 nsPrintSettingsGTK::SetNumCopies(int32_t aNumCopies
) {
462 gtk_print_settings_set_n_copies(mPrintSettings
, aNumCopies
);
467 nsPrintSettingsGTK::GetScaling(double* aScaling
) {
468 *aScaling
= gtk_print_settings_get_scale(mPrintSettings
) / 100.0;
473 nsPrintSettingsGTK::SetScaling(double aScaling
) {
474 gtk_print_settings_set_scale(mPrintSettings
, aScaling
* 100.0);
479 nsPrintSettingsGTK::GetPaperName(nsAString
& aPaperName
) {
481 gtk_paper_size_get_name(gtk_page_setup_get_paper_size(mPageSetup
));
482 aPaperName
= NS_ConvertUTF8toUTF16(name
);
486 nsPrintSettingsGTK::SetPaperName(const nsAString
& aPaperName
) {
487 NS_ConvertUTF16toUTF8
gtkPaperName(aPaperName
);
489 // Convert these Gecko names to GTK names
490 if (gtkPaperName
.EqualsIgnoreCase("letter"))
491 gtkPaperName
.AssignLiteral(GTK_PAPER_NAME_LETTER
);
492 else if (gtkPaperName
.EqualsIgnoreCase("legal"))
493 gtkPaperName
.AssignLiteral(GTK_PAPER_NAME_LEGAL
);
495 GtkPaperSize
* oldPaperSize
= gtk_page_setup_get_paper_size(mPageSetup
);
496 gdouble width
= gtk_paper_size_get_width(oldPaperSize
, GTK_UNIT_INCH
);
497 gdouble height
= gtk_paper_size_get_height(oldPaperSize
, GTK_UNIT_INCH
);
499 // Try to get the display name from the name so our paper size fits in the
500 // Page Setup dialog.
501 GtkPaperSize
* paperSize
= gtk_paper_size_new(gtkPaperName
.get());
502 GtkPaperSize
* customPaperSize
= gtk_paper_size_new_custom(
503 gtkPaperName
.get(), gtk_paper_size_get_display_name(paperSize
), width
,
504 height
, GTK_UNIT_INCH
);
505 gtk_paper_size_free(paperSize
);
507 gtk_page_setup_set_paper_size(mPageSetup
, customPaperSize
);
508 gtk_paper_size_free(customPaperSize
);
513 GtkUnit
nsPrintSettingsGTK::GetGTKUnit(int16_t aGeckoUnit
) {
514 if (aGeckoUnit
== kPaperSizeMillimeters
)
517 return GTK_UNIT_INCH
;
520 void nsPrintSettingsGTK::SaveNewPageSize() {
521 gtk_print_settings_set_paper_size(mPrintSettings
,
522 gtk_page_setup_get_paper_size(mPageSetup
));
525 void nsPrintSettingsGTK::InitUnwriteableMargin() {
526 mUnwriteableMargin
.SizeTo(
527 NS_INCHES_TO_INT_TWIPS(
528 gtk_page_setup_get_top_margin(mPageSetup
, GTK_UNIT_INCH
)),
529 NS_INCHES_TO_INT_TWIPS(
530 gtk_page_setup_get_right_margin(mPageSetup
, GTK_UNIT_INCH
)),
531 NS_INCHES_TO_INT_TWIPS(
532 gtk_page_setup_get_bottom_margin(mPageSetup
, GTK_UNIT_INCH
)),
533 NS_INCHES_TO_INT_TWIPS(
534 gtk_page_setup_get_left_margin(mPageSetup
, GTK_UNIT_INCH
)));
538 * NOTE: Need a custom set of SetUnwriteableMargin functions, because
539 * whenever we change mUnwriteableMargin, we must pass the change
540 * down to our GTKPageSetup object. (This is needed in order for us
541 * to give the correct default values in nsPrintDialogGTK.)
543 * It's important that the following functions pass
544 * mUnwriteableMargin values rather than aUnwriteableMargin values
545 * to gtk_page_setup_set_[blank]_margin, because the two may not be
546 * the same. (Specifically, negative values of aUnwriteableMargin
547 * are ignored by the nsPrintSettings::SetUnwriteableMargin functions.)
550 nsPrintSettingsGTK::SetUnwriteableMarginInTwips(
551 nsIntMargin
& aUnwriteableMargin
) {
552 nsPrintSettings::SetUnwriteableMarginInTwips(aUnwriteableMargin
);
553 gtk_page_setup_set_top_margin(
554 mPageSetup
, NS_TWIPS_TO_INCHES(mUnwriteableMargin
.top
), GTK_UNIT_INCH
);
555 gtk_page_setup_set_left_margin(
556 mPageSetup
, NS_TWIPS_TO_INCHES(mUnwriteableMargin
.left
), GTK_UNIT_INCH
);
557 gtk_page_setup_set_bottom_margin(
558 mPageSetup
, NS_TWIPS_TO_INCHES(mUnwriteableMargin
.bottom
), GTK_UNIT_INCH
);
559 gtk_page_setup_set_right_margin(
560 mPageSetup
, NS_TWIPS_TO_INCHES(mUnwriteableMargin
.right
), GTK_UNIT_INCH
);
565 nsPrintSettingsGTK::SetUnwriteableMarginTop(double aUnwriteableMarginTop
) {
566 nsPrintSettings::SetUnwriteableMarginTop(aUnwriteableMarginTop
);
567 gtk_page_setup_set_top_margin(
568 mPageSetup
, NS_TWIPS_TO_INCHES(mUnwriteableMargin
.top
), GTK_UNIT_INCH
);
573 nsPrintSettingsGTK::SetUnwriteableMarginLeft(double aUnwriteableMarginLeft
) {
574 nsPrintSettings::SetUnwriteableMarginLeft(aUnwriteableMarginLeft
);
575 gtk_page_setup_set_left_margin(
576 mPageSetup
, NS_TWIPS_TO_INCHES(mUnwriteableMargin
.left
), GTK_UNIT_INCH
);
581 nsPrintSettingsGTK::SetUnwriteableMarginBottom(
582 double aUnwriteableMarginBottom
) {
583 nsPrintSettings::SetUnwriteableMarginBottom(aUnwriteableMarginBottom
);
584 gtk_page_setup_set_bottom_margin(
585 mPageSetup
, NS_TWIPS_TO_INCHES(mUnwriteableMargin
.bottom
), GTK_UNIT_INCH
);
590 nsPrintSettingsGTK::SetUnwriteableMarginRight(double aUnwriteableMarginRight
) {
591 nsPrintSettings::SetUnwriteableMarginRight(aUnwriteableMarginRight
);
592 gtk_page_setup_set_right_margin(
593 mPageSetup
, NS_TWIPS_TO_INCHES(mUnwriteableMargin
.right
), GTK_UNIT_INCH
);
598 nsPrintSettingsGTK::GetPaperWidth(double* aPaperWidth
) {
599 NS_ENSURE_ARG_POINTER(aPaperWidth
);
600 GtkPaperSize
* paperSize
= gtk_page_setup_get_paper_size(mPageSetup
);
602 gtk_paper_size_get_width(paperSize
, GetGTKUnit(mPaperSizeUnit
));
606 nsPrintSettingsGTK::SetPaperWidth(double aPaperWidth
) {
607 GtkPaperSize
* paperSize
= gtk_page_setup_get_paper_size(mPageSetup
);
608 gtk_paper_size_set_size(
609 paperSize
, aPaperWidth
,
610 gtk_paper_size_get_height(paperSize
, GetGTKUnit(mPaperSizeUnit
)),
611 GetGTKUnit(mPaperSizeUnit
));
617 nsPrintSettingsGTK::GetPaperHeight(double* aPaperHeight
) {
618 NS_ENSURE_ARG_POINTER(aPaperHeight
);
619 GtkPaperSize
* paperSize
= gtk_page_setup_get_paper_size(mPageSetup
);
621 gtk_paper_size_get_height(paperSize
, GetGTKUnit(mPaperSizeUnit
));
625 nsPrintSettingsGTK::SetPaperHeight(double aPaperHeight
) {
626 GtkPaperSize
* paperSize
= gtk_page_setup_get_paper_size(mPageSetup
);
627 gtk_paper_size_set_size(
629 gtk_paper_size_get_width(paperSize
, GetGTKUnit(mPaperSizeUnit
)),
630 aPaperHeight
, GetGTKUnit(mPaperSizeUnit
));
636 nsPrintSettingsGTK::SetPaperSizeUnit(int16_t aPaperSizeUnit
) {
637 // Convert units internally. e.g. they might have set the values while we're
638 // still in mm but they change to inch just afterwards, expecting that their
639 // sizes are in inches.
640 GtkPaperSize
* paperSize
= gtk_page_setup_get_paper_size(mPageSetup
);
641 gtk_paper_size_set_size(
643 gtk_paper_size_get_width(paperSize
, GetGTKUnit(mPaperSizeUnit
)),
644 gtk_paper_size_get_height(paperSize
, GetGTKUnit(mPaperSizeUnit
)),
645 GetGTKUnit(aPaperSizeUnit
));
648 mPaperSizeUnit
= aPaperSizeUnit
;
653 nsPrintSettingsGTK::GetEffectivePageSize(double* aWidth
, double* aHeight
) {
654 GtkPaperSize
* paperSize
= gtk_page_setup_get_paper_size(mPageSetup
);
655 *aWidth
= NS_INCHES_TO_INT_TWIPS(
656 gtk_paper_size_get_width(paperSize
, GTK_UNIT_INCH
));
657 *aHeight
= NS_INCHES_TO_INT_TWIPS(
658 gtk_paper_size_get_height(paperSize
, GTK_UNIT_INCH
));
660 GtkPageOrientation gtkOrient
= gtk_page_setup_get_orientation(mPageSetup
);
662 if (gtkOrient
== GTK_PAGE_ORIENTATION_LANDSCAPE
||
663 gtkOrient
== GTK_PAGE_ORIENTATION_REVERSE_LANDSCAPE
) {
664 double temp
= *aWidth
;
672 nsPrintSettingsGTK::SetupSilentPrinting() {
673 // We have to get a printer here, rather than when the print settings are
674 // constructed. This is because when we request sync, GTK makes us wait in the
675 // *event loop* while waiting for the enumeration to finish. We must do this
676 // when event loop runs are expected.
677 gtk_enumerate_printers(printer_enumerator
, this, nullptr, TRUE
);
679 // XXX If no default printer set, get the first one.
680 if (!GTK_IS_PRINTER(mGTKPrinter
))
681 gtk_enumerate_printers(ref_printer
, this, nullptr, TRUE
);
687 nsPrintSettingsGTK::GetPageRanges(nsTArray
<int32_t>& aPages
) {
689 GtkPageRange
* lstRanges
=
690 gtk_print_settings_get_page_ranges(mPrintSettings
, &ctRanges
);
695 for (gint i
= 0; i
< ctRanges
; i
++) {
696 aPages
.AppendElement(lstRanges
[i
].start
+ 1);
697 aPages
.AppendElement(lstRanges
[i
].end
+ 1);
706 nsPrintSettingsGTK::GetResolution(int32_t* aResolution
) {
707 if (!gtk_print_settings_has_key(mPrintSettings
,
708 GTK_PRINT_SETTINGS_RESOLUTION
))
709 return NS_ERROR_FAILURE
;
710 *aResolution
= gtk_print_settings_get_resolution(mPrintSettings
);
715 nsPrintSettingsGTK::SetResolution(int32_t aResolution
) {
716 gtk_print_settings_set_resolution(mPrintSettings
, aResolution
);
721 nsPrintSettingsGTK::GetDuplex(int32_t* aDuplex
) {
722 if (!gtk_print_settings_has_key(mPrintSettings
, GTK_PRINT_SETTINGS_DUPLEX
)) {
723 *aDuplex
= GTK_PRINT_DUPLEX_SIMPLEX
;
725 *aDuplex
= gtk_print_settings_get_duplex(mPrintSettings
);
731 nsPrintSettingsGTK::SetDuplex(int32_t aDuplex
) {
732 MOZ_ASSERT(aDuplex
>= GTK_PRINT_DUPLEX_SIMPLEX
&&
733 aDuplex
<= GTK_PRINT_DUPLEX_VERTICAL
,
734 "value is out of bounds for GtkPrintDuplex enum");
735 gtk_print_settings_set_duplex(mPrintSettings
,
736 static_cast<GtkPrintDuplex
>(aDuplex
));