widget/gtk/nsPrintSettingsGTK.cpp

Wed, 31 Dec 2014 06:09:35 +0100

author
Michael Schloh von Bennewitz <michael@schloh.com>
date
Wed, 31 Dec 2014 06:09:35 +0100
changeset 0
6474c204b198
permissions
-rw-r--r--

Cloned upstream origin tor-browser at tor-browser-31.3.0esr-4.5-1-build1
revision ID fc1c9ff7c1b2defdbc039f12214767608f46423f for hacking purpose.

     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"
     7 #include "nsIFile.h"
     8 #include "nsNetUtil.h"
     9 #include <stdlib.h>
    10 #include <algorithm>
    12 static
    13 gboolean ref_printer(GtkPrinter *aPrinter, gpointer aData)
    14 {
    15   ((nsPrintSettingsGTK*) aData)->SetGtkPrinter(aPrinter);
    16   return TRUE;
    17 }
    19 static
    20 gboolean printer_enumerator(GtkPrinter *aPrinter, gpointer aData)
    21 {
    22   if (gtk_printer_is_default(aPrinter))
    23     return ref_printer(aPrinter, aData);
    25   return FALSE; // Keep 'em coming...
    26 }
    28 static
    29 GtkPaperSize* moz_gtk_paper_size_copy_to_new_custom(GtkPaperSize* oldPaperSize)
    30 {
    31   // We make a "custom-ified" copy of the paper size so it can be changed later.
    32   return gtk_paper_size_new_custom(gtk_paper_size_get_name(oldPaperSize),
    33                                    gtk_paper_size_get_display_name(oldPaperSize),
    34                                    gtk_paper_size_get_width(oldPaperSize, GTK_UNIT_INCH),
    35                                    gtk_paper_size_get_height(oldPaperSize, GTK_UNIT_INCH),
    36                                    GTK_UNIT_INCH);
    37 }
    39 NS_IMPL_ISUPPORTS_INHERITED(nsPrintSettingsGTK, 
    40                             nsPrintSettings, 
    41                             nsPrintSettingsGTK)
    43 /** ---------------------------------------------------
    44  */
    45 nsPrintSettingsGTK::nsPrintSettingsGTK() :
    46   mPageSetup(nullptr),
    47   mPrintSettings(nullptr),
    48   mGTKPrinter(nullptr),
    49   mPrintSelectionOnly(false)
    50 {
    51   // The aim here is to set up the objects enough that silent printing works well.
    52   // These will be replaced anyway if the print dialog is used.
    53   mPrintSettings = gtk_print_settings_new();
    54   mPageSetup = gtk_page_setup_new();
    55   InitUnwriteableMargin();
    57   SetOutputFormat(nsIPrintSettings::kOutputFormatNative);
    59   GtkPaperSize* defaultPaperSize = gtk_paper_size_new(nullptr);
    60   mPaperSize = moz_gtk_paper_size_copy_to_new_custom(defaultPaperSize);
    61   gtk_paper_size_free(defaultPaperSize);
    62   SaveNewPageSize();
    63 }
    65 /** ---------------------------------------------------
    66  */
    67 nsPrintSettingsGTK::~nsPrintSettingsGTK()
    68 {
    69   if (mPageSetup) {
    70     g_object_unref(mPageSetup);
    71     mPageSetup = nullptr;
    72   }
    73   if (mPrintSettings) {
    74     g_object_unref(mPrintSettings);
    75     mPrintSettings = nullptr;
    76   }
    77   if (mGTKPrinter) {
    78     g_object_unref(mGTKPrinter);
    79     mGTKPrinter = nullptr;
    80   }
    81   gtk_paper_size_free(mPaperSize);
    82 }
    84 /** ---------------------------------------------------
    85  */
    86 nsPrintSettingsGTK::nsPrintSettingsGTK(const nsPrintSettingsGTK& aPS) :
    87   mPageSetup(nullptr),
    88   mPrintSettings(nullptr),
    89   mGTKPrinter(nullptr),
    90   mPrintSelectionOnly(false)
    91 {
    92   *this = aPS;
    93 }
    95 /** ---------------------------------------------------
    96  */
    97 nsPrintSettingsGTK& nsPrintSettingsGTK::operator=(const nsPrintSettingsGTK& rhs)
    98 {
    99   if (this == &rhs) {
   100     return *this;
   101   }
   103   nsPrintSettings::operator=(rhs);
   105   if (mPageSetup)
   106     g_object_unref(mPageSetup);
   107   mPageSetup = gtk_page_setup_copy(rhs.mPageSetup);
   108   // NOTE: No need to re-initialize mUnwriteableMargin here (even
   109   // though mPageSetup is changing). It'll be copied correctly by
   110   // nsPrintSettings::operator=.
   112   if (mPrintSettings)
   113     g_object_unref(mPrintSettings);
   114   mPrintSettings = gtk_print_settings_copy(rhs.mPrintSettings);
   116   if (mGTKPrinter)
   117     g_object_unref(mGTKPrinter);
   118   mGTKPrinter = (GtkPrinter*) g_object_ref(rhs.mGTKPrinter);
   120   mPrintSelectionOnly = rhs.mPrintSelectionOnly;
   122   return *this;
   123 }
   125 /** -------------------------------------------
   126  */
   127 nsresult nsPrintSettingsGTK::_Clone(nsIPrintSettings **_retval)
   128 {
   129   NS_ENSURE_ARG_POINTER(_retval);
   130   *_retval = nullptr;
   132   nsPrintSettingsGTK *newSettings = new nsPrintSettingsGTK(*this);
   133   if (!newSettings)
   134     return NS_ERROR_FAILURE;
   135   *_retval = newSettings;
   136   NS_ADDREF(*_retval);
   137   return NS_OK;
   138 }
   141 /** -------------------------------------------
   142  */
   143 NS_IMETHODIMP
   144 nsPrintSettingsGTK::_Assign(nsIPrintSettings *aPS)
   145 {
   146   nsPrintSettingsGTK *printSettingsGTK = static_cast<nsPrintSettingsGTK*>(aPS);
   147   if (!printSettingsGTK)
   148     return NS_ERROR_UNEXPECTED;
   149   *this = *printSettingsGTK;
   150   return NS_OK;
   151 }
   153 /** ---------------------------------------------------
   154  */
   155 void
   156 nsPrintSettingsGTK::SetGtkPageSetup(GtkPageSetup *aPageSetup)
   157 {
   158   if (mPageSetup)
   159     g_object_unref(mPageSetup);
   161   mPageSetup = (GtkPageSetup*) g_object_ref(aPageSetup);
   162   InitUnwriteableMargin();
   164   // We make a custom copy of the GtkPaperSize so it can be mutable. If a
   165   // GtkPaperSize wasn't made as custom, its properties are immutable.
   166   GtkPaperSize* newPaperSize = gtk_page_setup_get_paper_size(aPageSetup);
   167   if (newPaperSize) { // Yes, this can be null
   168     gtk_paper_size_free(mPaperSize);
   169     mPaperSize = moz_gtk_paper_size_copy_to_new_custom(newPaperSize);
   170   }
   171   // If newPaperSize was not null, we must update our twin too (GtkPrintSettings).
   172   // If newPaperSize was null, we must set this object to use mPaperSize.
   173   SaveNewPageSize();
   174 }
   176 /** ---------------------------------------------------
   177  */
   178 void
   179 nsPrintSettingsGTK::SetGtkPrintSettings(GtkPrintSettings *aPrintSettings)
   180 {
   181   if (mPrintSettings)
   182     g_object_unref(mPrintSettings);
   184   mPrintSettings = (GtkPrintSettings*) g_object_ref(aPrintSettings);
   186   GtkPaperSize* newPaperSize = gtk_print_settings_get_paper_size(aPrintSettings);
   187   if (newPaperSize) {
   188     gtk_paper_size_free(mPaperSize);
   189     mPaperSize = moz_gtk_paper_size_copy_to_new_custom(newPaperSize);
   190   }
   191   SaveNewPageSize();
   192 }
   194 /** ---------------------------------------------------
   195  */
   196 void
   197 nsPrintSettingsGTK::SetGtkPrinter(GtkPrinter *aPrinter)
   198 {
   199   if (mGTKPrinter)
   200     g_object_unref(mGTKPrinter);
   202   mGTKPrinter = (GtkPrinter*) g_object_ref(aPrinter);
   203 }
   205 /**
   206  * Reimplementation of nsPrintSettings functions so that we get the values
   207  * from the GTK objects rather than our own variables.
   208  */
   210 /* attribute long printRange; */
   211 NS_IMETHODIMP nsPrintSettingsGTK::GetPrintRange(int16_t *aPrintRange)
   212 {
   213   NS_ENSURE_ARG_POINTER(aPrintRange);
   214   if (mPrintSelectionOnly) {
   215     *aPrintRange = kRangeSelection;
   216     return NS_OK;
   217   }
   219   GtkPrintPages gtkRange = gtk_print_settings_get_print_pages(mPrintSettings);
   220   if (gtkRange == GTK_PRINT_PAGES_RANGES)
   221     *aPrintRange = kRangeSpecifiedPageRange;
   222   else
   223     *aPrintRange = kRangeAllPages;
   225   return NS_OK;
   226 }
   227 NS_IMETHODIMP nsPrintSettingsGTK::SetPrintRange(int16_t aPrintRange)
   228 {
   229   if (aPrintRange == kRangeSelection) {
   230     mPrintSelectionOnly = true;
   231     return NS_OK;
   232   }
   234   mPrintSelectionOnly = false;
   235   if (aPrintRange == kRangeSpecifiedPageRange)
   236     gtk_print_settings_set_print_pages(mPrintSettings, GTK_PRINT_PAGES_RANGES);
   237   else
   238     gtk_print_settings_set_print_pages(mPrintSettings, GTK_PRINT_PAGES_ALL);
   239   return NS_OK;
   240 }
   242 /* attribute long startPageRange; */
   243 NS_IMETHODIMP
   244 nsPrintSettingsGTK::GetStartPageRange(int32_t *aStartPageRange)
   245 {
   246   gint ctRanges;
   247   GtkPageRange* lstRanges = gtk_print_settings_get_page_ranges(mPrintSettings, &ctRanges);
   249   // Make sure we got a range.
   250   if (ctRanges < 1) {
   251     *aStartPageRange = 1;
   252   } else {
   253     // GTK supports multiple page ranges; gecko only supports 1. So find
   254     // the lowest start page.
   255     int32_t start(lstRanges[0].start);
   256     for (gint ii = 1; ii < ctRanges; ii++) {
   257       start = std::min(lstRanges[ii].start, start);
   258     }
   259     *aStartPageRange = start + 1;
   260   }
   262   g_free(lstRanges);
   263   return NS_OK;
   264 }
   265 NS_IMETHODIMP
   266 nsPrintSettingsGTK::SetStartPageRange(int32_t aStartPageRange)
   267 {
   268   int32_t endRange;
   269   GetEndPageRange(&endRange);
   271   GtkPageRange gtkRange;
   272   gtkRange.start = aStartPageRange - 1;
   273   gtkRange.end = endRange - 1;
   275   gtk_print_settings_set_page_ranges(mPrintSettings, &gtkRange, 1);
   277   return NS_OK;
   278 }
   280 /* attribute long endPageRange; */
   281 NS_IMETHODIMP
   282 nsPrintSettingsGTK::GetEndPageRange(int32_t *aEndPageRange)
   283 {
   284   gint ctRanges;
   285   GtkPageRange* lstRanges = gtk_print_settings_get_page_ranges(mPrintSettings, &ctRanges);
   287   if (ctRanges < 1) {
   288     *aEndPageRange = 1;
   289   } else {
   290     int32_t end(lstRanges[0].end);
   291     for (gint ii = 1; ii < ctRanges; ii++) {
   292       end = std::max(lstRanges[ii].end, end);
   293     }
   294     *aEndPageRange = end + 1;
   295   }
   297   g_free(lstRanges);
   298   return NS_OK;
   299 }
   300 NS_IMETHODIMP
   301 nsPrintSettingsGTK::SetEndPageRange(int32_t aEndPageRange)
   302 {
   303   int32_t startRange;
   304   GetStartPageRange(&startRange);
   306   GtkPageRange gtkRange;
   307   gtkRange.start = startRange - 1;
   308   gtkRange.end = aEndPageRange - 1;
   310   gtk_print_settings_set_page_ranges(mPrintSettings, &gtkRange, 1);
   312   return NS_OK;
   313 }
   315 /* attribute boolean printReversed; */
   316 NS_IMETHODIMP
   317 nsPrintSettingsGTK::GetPrintReversed(bool *aPrintReversed)
   318 {
   319   *aPrintReversed = gtk_print_settings_get_reverse(mPrintSettings);
   320   return NS_OK;
   321 }
   322 NS_IMETHODIMP
   323 nsPrintSettingsGTK::SetPrintReversed(bool aPrintReversed)
   324 {
   325   gtk_print_settings_set_reverse(mPrintSettings, aPrintReversed);
   326   return NS_OK;
   327 }
   329 /* attribute boolean printInColor; */
   330 NS_IMETHODIMP
   331 nsPrintSettingsGTK::GetPrintInColor(bool *aPrintInColor)
   332 {
   333   *aPrintInColor = gtk_print_settings_get_use_color(mPrintSettings);
   334   return NS_OK;
   335 }
   336 NS_IMETHODIMP
   337 nsPrintSettingsGTK::SetPrintInColor(bool aPrintInColor)
   338 {
   339   gtk_print_settings_set_use_color(mPrintSettings, aPrintInColor);
   340   return NS_OK;
   341 }
   343 /* attribute short orientation; */
   344 NS_IMETHODIMP
   345 nsPrintSettingsGTK::GetOrientation(int32_t *aOrientation)
   346 {
   347   NS_ENSURE_ARG_POINTER(aOrientation);
   349   GtkPageOrientation gtkOrient = gtk_page_setup_get_orientation(mPageSetup);
   350   switch (gtkOrient) {
   351     case GTK_PAGE_ORIENTATION_LANDSCAPE:
   352     case GTK_PAGE_ORIENTATION_REVERSE_LANDSCAPE:
   353       *aOrientation = kLandscapeOrientation;
   354       break;
   356     case GTK_PAGE_ORIENTATION_PORTRAIT:
   357     case GTK_PAGE_ORIENTATION_REVERSE_PORTRAIT:
   358     default:
   359       *aOrientation = kPortraitOrientation;
   360   }
   361   return NS_OK;
   362 }
   363 NS_IMETHODIMP
   364 nsPrintSettingsGTK::SetOrientation(int32_t aOrientation)
   365 {
   366   GtkPageOrientation gtkOrient;
   367   if (aOrientation == kLandscapeOrientation)
   368     gtkOrient = GTK_PAGE_ORIENTATION_LANDSCAPE;
   369   else
   370     gtkOrient = GTK_PAGE_ORIENTATION_PORTRAIT;
   372   gtk_print_settings_set_orientation(mPrintSettings, gtkOrient);
   373   gtk_page_setup_set_orientation(mPageSetup, gtkOrient);
   374   return NS_OK;
   375 }
   377 /* attribute wstring toFileName; */
   378 NS_IMETHODIMP
   379 nsPrintSettingsGTK::GetToFileName(char16_t * *aToFileName)
   380 {
   381   // Get the gtk output filename
   382   const char* gtk_output_uri = gtk_print_settings_get(mPrintSettings, GTK_PRINT_SETTINGS_OUTPUT_URI);
   383   if (!gtk_output_uri) {
   384     *aToFileName = ToNewUnicode(mToFileName);
   385     return NS_OK;
   386   }
   388   // Convert to an nsIFile
   389   nsCOMPtr<nsIFile> file;
   390   nsresult rv = NS_GetFileFromURLSpec(nsDependentCString(gtk_output_uri),
   391                                       getter_AddRefs(file));
   392   if (NS_FAILED(rv))
   393     return rv;
   395   // Extract the path
   396   nsAutoString path;
   397   rv = file->GetPath(path);
   398   NS_ENSURE_SUCCESS(rv, rv);
   400   *aToFileName = ToNewUnicode(path);
   401   return NS_OK;
   402 }
   404 NS_IMETHODIMP
   405 nsPrintSettingsGTK::SetToFileName(const char16_t * aToFileName)
   406 {
   407   if (aToFileName[0] == 0) {
   408     mToFileName.SetLength(0);
   409     gtk_print_settings_set(mPrintSettings, GTK_PRINT_SETTINGS_OUTPUT_URI,
   410                            nullptr);
   411     return NS_OK;
   412   }
   414   if (StringEndsWith(nsDependentString(aToFileName), NS_LITERAL_STRING(".ps"))) {
   415     gtk_print_settings_set(mPrintSettings, GTK_PRINT_SETTINGS_OUTPUT_FILE_FORMAT, "ps");
   416   } else {
   417     gtk_print_settings_set(mPrintSettings, GTK_PRINT_SETTINGS_OUTPUT_FILE_FORMAT, "pdf");
   418   }
   420   nsCOMPtr<nsIFile> file;
   421   nsresult rv = NS_NewLocalFile(nsDependentString(aToFileName), true,
   422                                 getter_AddRefs(file));
   423   NS_ENSURE_SUCCESS(rv, rv);
   425   // Convert the nsIFile to a URL
   426   nsAutoCString url;
   427   rv = NS_GetURLSpecFromFile(file, url);
   428   NS_ENSURE_SUCCESS(rv, rv);
   430   gtk_print_settings_set(mPrintSettings, GTK_PRINT_SETTINGS_OUTPUT_URI, url.get());
   431   mToFileName = aToFileName;
   433   return NS_OK;
   434 }
   436 NS_IMETHODIMP
   437 nsPrintSettingsGTK::GetPrinterName(char16_t * *aPrinter)
   438 {
   439   const char* gtkPrintName = gtk_print_settings_get_printer(mPrintSettings);
   440   if (!gtkPrintName) {
   441     if (GTK_IS_PRINTER(mGTKPrinter)) {
   442       gtkPrintName = gtk_printer_get_name(mGTKPrinter);
   443     } else {
   444       // This mimics what nsPrintSettingsImpl does when we try to Get before we Set
   445       nsXPIDLString nullPrintName;
   446       *aPrinter = ToNewUnicode(nullPrintName);
   447       return NS_OK;
   448     }
   449   }
   450   *aPrinter = ToNewUnicode(nsDependentCString(gtkPrintName));
   451   return NS_OK;
   452 }
   454 NS_IMETHODIMP
   455 nsPrintSettingsGTK::SetPrinterName(const char16_t * aPrinter)
   456 {
   457   NS_ConvertUTF16toUTF8 gtkPrinter(aPrinter);
   459   if (StringBeginsWith(gtkPrinter, NS_LITERAL_CSTRING("CUPS/"))) {
   460     // Strip off "CUPS/"; GTK might recognize the rest
   461     gtkPrinter.Cut(0, strlen("CUPS/"));
   462   }
   464   // Give mPrintSettings the passed-in printer name if either...
   465   // - it has no printer name stored yet
   466   // - it has an existing printer name that's different from
   467   //   the name passed to this function.
   468   const char* oldPrinterName = gtk_print_settings_get_printer(mPrintSettings);
   469   if (!oldPrinterName || !gtkPrinter.Equals(oldPrinterName)) {
   470     mIsInitedFromPrinter = false;
   471     mIsInitedFromPrefs = false;
   472     gtk_print_settings_set_printer(mPrintSettings, gtkPrinter.get());
   473   }
   475   return NS_OK;
   476 }
   478 /* attribute long numCopies; */
   479 NS_IMETHODIMP
   480 nsPrintSettingsGTK::GetNumCopies(int32_t *aNumCopies)
   481 {
   482   NS_ENSURE_ARG_POINTER(aNumCopies);
   483   *aNumCopies = gtk_print_settings_get_n_copies(mPrintSettings);
   484   return NS_OK;
   485 }
   486 NS_IMETHODIMP
   487 nsPrintSettingsGTK::SetNumCopies(int32_t aNumCopies)
   488 {
   489   gtk_print_settings_set_n_copies(mPrintSettings, aNumCopies);
   490   return NS_OK;
   491 }
   493 /* attribute double scaling; */
   494 NS_IMETHODIMP
   495 nsPrintSettingsGTK::GetScaling(double *aScaling)
   496 {
   497   *aScaling = gtk_print_settings_get_scale(mPrintSettings) / 100.0;
   498   return NS_OK;
   499 }
   501 NS_IMETHODIMP
   502 nsPrintSettingsGTK::SetScaling(double aScaling)
   503 {
   504   gtk_print_settings_set_scale(mPrintSettings, aScaling * 100.0);
   505   return NS_OK;
   506 }
   508 /* attribute wstring paperName; */
   509 NS_IMETHODIMP
   510 nsPrintSettingsGTK::GetPaperName(char16_t * *aPaperName)
   511 {
   512   NS_ENSURE_ARG_POINTER(aPaperName);
   513   *aPaperName = ToNewUnicode(NS_ConvertUTF8toUTF16(gtk_paper_size_get_name(mPaperSize)));
   514   return NS_OK;
   515 }
   516 NS_IMETHODIMP
   517 nsPrintSettingsGTK::SetPaperName(const char16_t * aPaperName)
   518 {
   519   NS_ConvertUTF16toUTF8 gtkPaperName(aPaperName);
   521   // Convert these Gecko names to GTK names
   522   if (gtkPaperName.EqualsIgnoreCase("letter"))
   523     gtkPaperName.AssignLiteral(GTK_PAPER_NAME_LETTER);
   524   else if (gtkPaperName.EqualsIgnoreCase("legal"))
   525     gtkPaperName.AssignLiteral(GTK_PAPER_NAME_LEGAL);
   527   // Try to get the display name from the name so our paper size fits in the Page Setup dialog.
   528   GtkPaperSize* paperSize = gtk_paper_size_new(gtkPaperName.get());
   529   char* displayName = strdup(gtk_paper_size_get_display_name(paperSize));
   530   gtk_paper_size_free(paperSize);
   532   paperSize = gtk_paper_size_new_custom(gtkPaperName.get(), displayName,
   533                                         gtk_paper_size_get_width(mPaperSize, GTK_UNIT_INCH),
   534                                         gtk_paper_size_get_height(mPaperSize, GTK_UNIT_INCH),
   535                                         GTK_UNIT_INCH);
   537   free(displayName);
   538   gtk_paper_size_free(mPaperSize);
   539   mPaperSize = paperSize;
   540   SaveNewPageSize();
   541   return NS_OK;
   542 }
   544 GtkUnit
   545 nsPrintSettingsGTK::GetGTKUnit(int16_t aGeckoUnit)
   546 {
   547   if (aGeckoUnit == kPaperSizeMillimeters)
   548     return GTK_UNIT_MM;
   549   else
   550     return GTK_UNIT_INCH;
   551 }
   553 void
   554 nsPrintSettingsGTK::SaveNewPageSize()
   555 {
   556   gtk_print_settings_set_paper_size(mPrintSettings, mPaperSize);
   557   gtk_page_setup_set_paper_size(mPageSetup, mPaperSize);
   558 }
   560 void
   561 nsPrintSettingsGTK::InitUnwriteableMargin()
   562 {
   563   mUnwriteableMargin.SizeTo(
   564    NS_INCHES_TO_INT_TWIPS(gtk_page_setup_get_top_margin(mPageSetup, GTK_UNIT_INCH)),
   565    NS_INCHES_TO_INT_TWIPS(gtk_page_setup_get_right_margin(mPageSetup, GTK_UNIT_INCH)),
   566    NS_INCHES_TO_INT_TWIPS(gtk_page_setup_get_bottom_margin(mPageSetup, GTK_UNIT_INCH)),
   567    NS_INCHES_TO_INT_TWIPS(gtk_page_setup_get_left_margin(mPageSetup, GTK_UNIT_INCH))
   568   );
   569 }
   571 /**
   572  * NOTE: Need a custom set of SetUnwriteableMargin functions, because
   573  * whenever we change mUnwriteableMargin, we must pass the change
   574  * down to our GTKPageSetup object.  (This is needed in order for us
   575  * to give the correct default values in nsPrintDialogGTK.)
   576  *
   577  * It's important that the following functions pass 
   578  * mUnwriteableMargin values rather than aUnwriteableMargin values
   579  * to gtk_page_setup_set_[blank]_margin, because the two may not be
   580  * the same.  (Specifically, negative values of aUnwriteableMargin
   581  * are ignored by the nsPrintSettings::SetUnwriteableMargin functions.)
   582  */
   583 NS_IMETHODIMP 
   584 nsPrintSettingsGTK::SetUnwriteableMarginInTwips(nsIntMargin& aUnwriteableMargin)
   585 {
   586   nsPrintSettings::SetUnwriteableMarginInTwips(aUnwriteableMargin);
   587   gtk_page_setup_set_top_margin(mPageSetup,
   588            NS_TWIPS_TO_INCHES(mUnwriteableMargin.top), GTK_UNIT_INCH);
   589   gtk_page_setup_set_left_margin(mPageSetup,
   590            NS_TWIPS_TO_INCHES(mUnwriteableMargin.left), GTK_UNIT_INCH);
   591   gtk_page_setup_set_bottom_margin(mPageSetup,
   592            NS_TWIPS_TO_INCHES(mUnwriteableMargin.bottom), GTK_UNIT_INCH);
   593   gtk_page_setup_set_right_margin(mPageSetup,
   594            NS_TWIPS_TO_INCHES(mUnwriteableMargin.right), GTK_UNIT_INCH);
   595   return NS_OK;
   596 }
   598 /* attribute double unwriteableMarginTop; */
   599 NS_IMETHODIMP
   600 nsPrintSettingsGTK::SetUnwriteableMarginTop(double aUnwriteableMarginTop)
   601 {
   602   nsPrintSettings::SetUnwriteableMarginTop(aUnwriteableMarginTop);
   603   gtk_page_setup_set_top_margin(mPageSetup,
   604            NS_TWIPS_TO_INCHES(mUnwriteableMargin.top), GTK_UNIT_INCH);
   605   return NS_OK;
   606 }
   608 /* attribute double unwriteableMarginLeft; */
   609 NS_IMETHODIMP
   610 nsPrintSettingsGTK::SetUnwriteableMarginLeft(double aUnwriteableMarginLeft)
   611 {
   612   nsPrintSettings::SetUnwriteableMarginLeft(aUnwriteableMarginLeft);
   613   gtk_page_setup_set_left_margin(mPageSetup,
   614            NS_TWIPS_TO_INCHES(mUnwriteableMargin.left), GTK_UNIT_INCH);
   615   return NS_OK;
   616 }
   618 /* attribute double unwriteableMarginBottom; */
   619 NS_IMETHODIMP
   620 nsPrintSettingsGTK::SetUnwriteableMarginBottom(double aUnwriteableMarginBottom)
   621 {
   622   nsPrintSettings::SetUnwriteableMarginBottom(aUnwriteableMarginBottom);
   623   gtk_page_setup_set_bottom_margin(mPageSetup,
   624            NS_TWIPS_TO_INCHES(mUnwriteableMargin.bottom), GTK_UNIT_INCH);
   625   return NS_OK;
   626 }
   628 /* attribute double unwriteableMarginRight; */
   629 NS_IMETHODIMP
   630 nsPrintSettingsGTK::SetUnwriteableMarginRight(double aUnwriteableMarginRight)
   631 {
   632   nsPrintSettings::SetUnwriteableMarginRight(aUnwriteableMarginRight);
   633   gtk_page_setup_set_right_margin(mPageSetup,
   634            NS_TWIPS_TO_INCHES(mUnwriteableMargin.right), GTK_UNIT_INCH);
   635   return NS_OK;
   636 }
   638 /* attribute double paperWidth; */
   639 NS_IMETHODIMP
   640 nsPrintSettingsGTK::GetPaperWidth(double *aPaperWidth)
   641 {
   642   NS_ENSURE_ARG_POINTER(aPaperWidth);
   643   *aPaperWidth = gtk_paper_size_get_width(mPaperSize, GetGTKUnit(mPaperSizeUnit));
   644   return NS_OK;
   645 }
   646 NS_IMETHODIMP
   647 nsPrintSettingsGTK::SetPaperWidth(double aPaperWidth)
   648 {
   649   gtk_paper_size_set_size(mPaperSize,
   650                           aPaperWidth,
   651                           gtk_paper_size_get_height(mPaperSize, GetGTKUnit(mPaperSizeUnit)),
   652                           GetGTKUnit(mPaperSizeUnit));
   653   SaveNewPageSize();
   654   return NS_OK;
   655 }
   657 /* attribute double paperHeight; */
   658 NS_IMETHODIMP
   659 nsPrintSettingsGTK::GetPaperHeight(double *aPaperHeight)
   660 {
   661   NS_ENSURE_ARG_POINTER(aPaperHeight);
   662   *aPaperHeight = gtk_paper_size_get_height(mPaperSize, GetGTKUnit(mPaperSizeUnit));
   663   return NS_OK;
   664 }
   665 NS_IMETHODIMP
   666 nsPrintSettingsGTK::SetPaperHeight(double aPaperHeight)
   667 {
   668   gtk_paper_size_set_size(mPaperSize,
   669                           gtk_paper_size_get_width(mPaperSize, GetGTKUnit(mPaperSizeUnit)),
   670                           aPaperHeight,
   671                           GetGTKUnit(mPaperSizeUnit));
   672   SaveNewPageSize();
   673   return NS_OK;
   674 }
   676 NS_IMETHODIMP
   677 nsPrintSettingsGTK::SetPaperSizeUnit(int16_t aPaperSizeUnit)
   678 {
   679   // Convert units internally. e.g. they might have set the values while we're still in mm but
   680   // they change to inch just afterwards, expecting that their sizes are in inches.
   681   gtk_paper_size_set_size(mPaperSize,
   682                           gtk_paper_size_get_width(mPaperSize, GetGTKUnit(mPaperSizeUnit)),
   683                           gtk_paper_size_get_height(mPaperSize, GetGTKUnit(mPaperSizeUnit)),
   684                           GetGTKUnit(aPaperSizeUnit));
   685   SaveNewPageSize();
   687   mPaperSizeUnit = aPaperSizeUnit;
   688   return NS_OK;
   689 }
   691 NS_IMETHODIMP
   692 nsPrintSettingsGTK::GetEffectivePageSize(double *aWidth, double *aHeight)
   693 {
   694   *aWidth  = NS_INCHES_TO_INT_TWIPS(gtk_paper_size_get_width(mPaperSize, GTK_UNIT_INCH));
   695   *aHeight = NS_INCHES_TO_INT_TWIPS(gtk_paper_size_get_height(mPaperSize, GTK_UNIT_INCH));
   697   GtkPageOrientation gtkOrient = gtk_page_setup_get_orientation(mPageSetup);
   699   if (gtkOrient == GTK_PAGE_ORIENTATION_LANDSCAPE ||
   700       gtkOrient == GTK_PAGE_ORIENTATION_REVERSE_LANDSCAPE) {
   701     double temp = *aWidth;
   702     *aWidth = *aHeight;
   703     *aHeight = temp;
   704   }
   705   return NS_OK;
   706 }
   708 NS_IMETHODIMP
   709 nsPrintSettingsGTK::SetupSilentPrinting()
   710 {
   711   // We have to get a printer here, rather than when the print settings are constructed.
   712   // This is because when we request sync, GTK makes us wait in the *event loop* while waiting
   713   // for the enumeration to finish. We must do this when event loop runs are expected.
   714   gtk_enumerate_printers(printer_enumerator, this, nullptr, TRUE);
   716   // XXX If no default printer set, get the first one.
   717   if (!GTK_IS_PRINTER(mGTKPrinter))
   718     gtk_enumerate_printers(ref_printer, this, nullptr, TRUE);
   720   return NS_OK;
   721 }
   723 NS_IMETHODIMP
   724 nsPrintSettingsGTK::GetPageRanges(nsTArray<int32_t> &aPages)
   725 {
   726   gint ctRanges;
   727   GtkPageRange* lstRanges = gtk_print_settings_get_page_ranges(mPrintSettings, &ctRanges);
   729   aPages.Clear();
   731   if (ctRanges > 1) {
   732     for (gint i = 0; i < ctRanges; i++) {
   733       aPages.AppendElement(lstRanges[i].start+1);
   734       aPages.AppendElement(lstRanges[i].end+1);
   735     }
   736   }
   738   g_free(lstRanges);
   739   return NS_OK;
   740 }
   742 NS_IMETHODIMP
   743 nsPrintSettingsGTK::GetResolution(int32_t *aResolution)
   744 {
   745   if (!gtk_print_settings_has_key(mPrintSettings, GTK_PRINT_SETTINGS_RESOLUTION))
   746     return NS_ERROR_FAILURE;
   747   *aResolution = gtk_print_settings_get_resolution(mPrintSettings);
   748   return NS_OK;
   749 }
   751 NS_IMETHODIMP
   752 nsPrintSettingsGTK::SetResolution(int32_t aResolution)
   753 {
   754   gtk_print_settings_set_resolution(mPrintSettings, aResolution);
   755   return NS_OK;
   756 }
   758 NS_IMETHODIMP
   759 nsPrintSettingsGTK::GetDuplex(int32_t *aDuplex)
   760 {
   761   if (!gtk_print_settings_has_key(mPrintSettings, GTK_PRINT_SETTINGS_DUPLEX))
   762     return NS_ERROR_FAILURE;
   763   *aDuplex = gtk_print_settings_get_duplex(mPrintSettings);
   764   return NS_OK;
   765 }
   767 NS_IMETHODIMP
   768 nsPrintSettingsGTK::SetDuplex(int32_t aDuplex)
   769 {
   770   MOZ_ASSERT(aDuplex >= GTK_PRINT_DUPLEX_SIMPLEX &&
   771              aDuplex <= GTK_PRINT_DUPLEX_VERTICAL,
   772              "value is out of bounds for GtkPrintDuplex enum");
   773   gtk_print_settings_set_duplex(mPrintSettings, static_cast<GtkPrintDuplex>(aDuplex));
   774   return NS_OK;
   775 }

mercurial