1.1 --- /dev/null Thu Jan 01 00:00:00 1970 +0000 1.2 +++ b/widget/gtk/nsPrintSettingsGTK.cpp Wed Dec 31 06:09:35 2014 +0100 1.3 @@ -0,0 +1,776 @@ 1.4 +/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ 1.5 +/* This Source Code Form is subject to the terms of the Mozilla Public 1.6 + * License, v. 2.0. If a copy of the MPL was not distributed with this 1.7 + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ 1.8 + 1.9 +#include "nsPrintSettingsGTK.h" 1.10 +#include "nsIFile.h" 1.11 +#include "nsNetUtil.h" 1.12 +#include <stdlib.h> 1.13 +#include <algorithm> 1.14 + 1.15 +static 1.16 +gboolean ref_printer(GtkPrinter *aPrinter, gpointer aData) 1.17 +{ 1.18 + ((nsPrintSettingsGTK*) aData)->SetGtkPrinter(aPrinter); 1.19 + return TRUE; 1.20 +} 1.21 + 1.22 +static 1.23 +gboolean printer_enumerator(GtkPrinter *aPrinter, gpointer aData) 1.24 +{ 1.25 + if (gtk_printer_is_default(aPrinter)) 1.26 + return ref_printer(aPrinter, aData); 1.27 + 1.28 + return FALSE; // Keep 'em coming... 1.29 +} 1.30 + 1.31 +static 1.32 +GtkPaperSize* moz_gtk_paper_size_copy_to_new_custom(GtkPaperSize* oldPaperSize) 1.33 +{ 1.34 + // We make a "custom-ified" copy of the paper size so it can be changed later. 1.35 + return gtk_paper_size_new_custom(gtk_paper_size_get_name(oldPaperSize), 1.36 + gtk_paper_size_get_display_name(oldPaperSize), 1.37 + gtk_paper_size_get_width(oldPaperSize, GTK_UNIT_INCH), 1.38 + gtk_paper_size_get_height(oldPaperSize, GTK_UNIT_INCH), 1.39 + GTK_UNIT_INCH); 1.40 +} 1.41 + 1.42 +NS_IMPL_ISUPPORTS_INHERITED(nsPrintSettingsGTK, 1.43 + nsPrintSettings, 1.44 + nsPrintSettingsGTK) 1.45 + 1.46 +/** --------------------------------------------------- 1.47 + */ 1.48 +nsPrintSettingsGTK::nsPrintSettingsGTK() : 1.49 + mPageSetup(nullptr), 1.50 + mPrintSettings(nullptr), 1.51 + mGTKPrinter(nullptr), 1.52 + mPrintSelectionOnly(false) 1.53 +{ 1.54 + // The aim here is to set up the objects enough that silent printing works well. 1.55 + // These will be replaced anyway if the print dialog is used. 1.56 + mPrintSettings = gtk_print_settings_new(); 1.57 + mPageSetup = gtk_page_setup_new(); 1.58 + InitUnwriteableMargin(); 1.59 + 1.60 + SetOutputFormat(nsIPrintSettings::kOutputFormatNative); 1.61 + 1.62 + GtkPaperSize* defaultPaperSize = gtk_paper_size_new(nullptr); 1.63 + mPaperSize = moz_gtk_paper_size_copy_to_new_custom(defaultPaperSize); 1.64 + gtk_paper_size_free(defaultPaperSize); 1.65 + SaveNewPageSize(); 1.66 +} 1.67 + 1.68 +/** --------------------------------------------------- 1.69 + */ 1.70 +nsPrintSettingsGTK::~nsPrintSettingsGTK() 1.71 +{ 1.72 + if (mPageSetup) { 1.73 + g_object_unref(mPageSetup); 1.74 + mPageSetup = nullptr; 1.75 + } 1.76 + if (mPrintSettings) { 1.77 + g_object_unref(mPrintSettings); 1.78 + mPrintSettings = nullptr; 1.79 + } 1.80 + if (mGTKPrinter) { 1.81 + g_object_unref(mGTKPrinter); 1.82 + mGTKPrinter = nullptr; 1.83 + } 1.84 + gtk_paper_size_free(mPaperSize); 1.85 +} 1.86 + 1.87 +/** --------------------------------------------------- 1.88 + */ 1.89 +nsPrintSettingsGTK::nsPrintSettingsGTK(const nsPrintSettingsGTK& aPS) : 1.90 + mPageSetup(nullptr), 1.91 + mPrintSettings(nullptr), 1.92 + mGTKPrinter(nullptr), 1.93 + mPrintSelectionOnly(false) 1.94 +{ 1.95 + *this = aPS; 1.96 +} 1.97 + 1.98 +/** --------------------------------------------------- 1.99 + */ 1.100 +nsPrintSettingsGTK& nsPrintSettingsGTK::operator=(const nsPrintSettingsGTK& rhs) 1.101 +{ 1.102 + if (this == &rhs) { 1.103 + return *this; 1.104 + } 1.105 + 1.106 + nsPrintSettings::operator=(rhs); 1.107 + 1.108 + if (mPageSetup) 1.109 + g_object_unref(mPageSetup); 1.110 + mPageSetup = gtk_page_setup_copy(rhs.mPageSetup); 1.111 + // NOTE: No need to re-initialize mUnwriteableMargin here (even 1.112 + // though mPageSetup is changing). It'll be copied correctly by 1.113 + // nsPrintSettings::operator=. 1.114 + 1.115 + if (mPrintSettings) 1.116 + g_object_unref(mPrintSettings); 1.117 + mPrintSettings = gtk_print_settings_copy(rhs.mPrintSettings); 1.118 + 1.119 + if (mGTKPrinter) 1.120 + g_object_unref(mGTKPrinter); 1.121 + mGTKPrinter = (GtkPrinter*) g_object_ref(rhs.mGTKPrinter); 1.122 + 1.123 + mPrintSelectionOnly = rhs.mPrintSelectionOnly; 1.124 + 1.125 + return *this; 1.126 +} 1.127 + 1.128 +/** ------------------------------------------- 1.129 + */ 1.130 +nsresult nsPrintSettingsGTK::_Clone(nsIPrintSettings **_retval) 1.131 +{ 1.132 + NS_ENSURE_ARG_POINTER(_retval); 1.133 + *_retval = nullptr; 1.134 + 1.135 + nsPrintSettingsGTK *newSettings = new nsPrintSettingsGTK(*this); 1.136 + if (!newSettings) 1.137 + return NS_ERROR_FAILURE; 1.138 + *_retval = newSettings; 1.139 + NS_ADDREF(*_retval); 1.140 + return NS_OK; 1.141 +} 1.142 + 1.143 + 1.144 +/** ------------------------------------------- 1.145 + */ 1.146 +NS_IMETHODIMP 1.147 +nsPrintSettingsGTK::_Assign(nsIPrintSettings *aPS) 1.148 +{ 1.149 + nsPrintSettingsGTK *printSettingsGTK = static_cast<nsPrintSettingsGTK*>(aPS); 1.150 + if (!printSettingsGTK) 1.151 + return NS_ERROR_UNEXPECTED; 1.152 + *this = *printSettingsGTK; 1.153 + return NS_OK; 1.154 +} 1.155 + 1.156 +/** --------------------------------------------------- 1.157 + */ 1.158 +void 1.159 +nsPrintSettingsGTK::SetGtkPageSetup(GtkPageSetup *aPageSetup) 1.160 +{ 1.161 + if (mPageSetup) 1.162 + g_object_unref(mPageSetup); 1.163 + 1.164 + mPageSetup = (GtkPageSetup*) g_object_ref(aPageSetup); 1.165 + InitUnwriteableMargin(); 1.166 + 1.167 + // We make a custom copy of the GtkPaperSize so it can be mutable. If a 1.168 + // GtkPaperSize wasn't made as custom, its properties are immutable. 1.169 + GtkPaperSize* newPaperSize = gtk_page_setup_get_paper_size(aPageSetup); 1.170 + if (newPaperSize) { // Yes, this can be null 1.171 + gtk_paper_size_free(mPaperSize); 1.172 + mPaperSize = moz_gtk_paper_size_copy_to_new_custom(newPaperSize); 1.173 + } 1.174 + // If newPaperSize was not null, we must update our twin too (GtkPrintSettings). 1.175 + // If newPaperSize was null, we must set this object to use mPaperSize. 1.176 + SaveNewPageSize(); 1.177 +} 1.178 + 1.179 +/** --------------------------------------------------- 1.180 + */ 1.181 +void 1.182 +nsPrintSettingsGTK::SetGtkPrintSettings(GtkPrintSettings *aPrintSettings) 1.183 +{ 1.184 + if (mPrintSettings) 1.185 + g_object_unref(mPrintSettings); 1.186 + 1.187 + mPrintSettings = (GtkPrintSettings*) g_object_ref(aPrintSettings); 1.188 + 1.189 + GtkPaperSize* newPaperSize = gtk_print_settings_get_paper_size(aPrintSettings); 1.190 + if (newPaperSize) { 1.191 + gtk_paper_size_free(mPaperSize); 1.192 + mPaperSize = moz_gtk_paper_size_copy_to_new_custom(newPaperSize); 1.193 + } 1.194 + SaveNewPageSize(); 1.195 +} 1.196 + 1.197 +/** --------------------------------------------------- 1.198 + */ 1.199 +void 1.200 +nsPrintSettingsGTK::SetGtkPrinter(GtkPrinter *aPrinter) 1.201 +{ 1.202 + if (mGTKPrinter) 1.203 + g_object_unref(mGTKPrinter); 1.204 + 1.205 + mGTKPrinter = (GtkPrinter*) g_object_ref(aPrinter); 1.206 +} 1.207 + 1.208 +/** 1.209 + * Reimplementation of nsPrintSettings functions so that we get the values 1.210 + * from the GTK objects rather than our own variables. 1.211 + */ 1.212 + 1.213 +/* attribute long printRange; */ 1.214 +NS_IMETHODIMP nsPrintSettingsGTK::GetPrintRange(int16_t *aPrintRange) 1.215 +{ 1.216 + NS_ENSURE_ARG_POINTER(aPrintRange); 1.217 + if (mPrintSelectionOnly) { 1.218 + *aPrintRange = kRangeSelection; 1.219 + return NS_OK; 1.220 + } 1.221 + 1.222 + GtkPrintPages gtkRange = gtk_print_settings_get_print_pages(mPrintSettings); 1.223 + if (gtkRange == GTK_PRINT_PAGES_RANGES) 1.224 + *aPrintRange = kRangeSpecifiedPageRange; 1.225 + else 1.226 + *aPrintRange = kRangeAllPages; 1.227 + 1.228 + return NS_OK; 1.229 +} 1.230 +NS_IMETHODIMP nsPrintSettingsGTK::SetPrintRange(int16_t aPrintRange) 1.231 +{ 1.232 + if (aPrintRange == kRangeSelection) { 1.233 + mPrintSelectionOnly = true; 1.234 + return NS_OK; 1.235 + } 1.236 + 1.237 + mPrintSelectionOnly = false; 1.238 + if (aPrintRange == kRangeSpecifiedPageRange) 1.239 + gtk_print_settings_set_print_pages(mPrintSettings, GTK_PRINT_PAGES_RANGES); 1.240 + else 1.241 + gtk_print_settings_set_print_pages(mPrintSettings, GTK_PRINT_PAGES_ALL); 1.242 + return NS_OK; 1.243 +} 1.244 + 1.245 +/* attribute long startPageRange; */ 1.246 +NS_IMETHODIMP 1.247 +nsPrintSettingsGTK::GetStartPageRange(int32_t *aStartPageRange) 1.248 +{ 1.249 + gint ctRanges; 1.250 + GtkPageRange* lstRanges = gtk_print_settings_get_page_ranges(mPrintSettings, &ctRanges); 1.251 + 1.252 + // Make sure we got a range. 1.253 + if (ctRanges < 1) { 1.254 + *aStartPageRange = 1; 1.255 + } else { 1.256 + // GTK supports multiple page ranges; gecko only supports 1. So find 1.257 + // the lowest start page. 1.258 + int32_t start(lstRanges[0].start); 1.259 + for (gint ii = 1; ii < ctRanges; ii++) { 1.260 + start = std::min(lstRanges[ii].start, start); 1.261 + } 1.262 + *aStartPageRange = start + 1; 1.263 + } 1.264 + 1.265 + g_free(lstRanges); 1.266 + return NS_OK; 1.267 +} 1.268 +NS_IMETHODIMP 1.269 +nsPrintSettingsGTK::SetStartPageRange(int32_t aStartPageRange) 1.270 +{ 1.271 + int32_t endRange; 1.272 + GetEndPageRange(&endRange); 1.273 + 1.274 + GtkPageRange gtkRange; 1.275 + gtkRange.start = aStartPageRange - 1; 1.276 + gtkRange.end = endRange - 1; 1.277 + 1.278 + gtk_print_settings_set_page_ranges(mPrintSettings, >kRange, 1); 1.279 + 1.280 + return NS_OK; 1.281 +} 1.282 + 1.283 +/* attribute long endPageRange; */ 1.284 +NS_IMETHODIMP 1.285 +nsPrintSettingsGTK::GetEndPageRange(int32_t *aEndPageRange) 1.286 +{ 1.287 + gint ctRanges; 1.288 + GtkPageRange* lstRanges = gtk_print_settings_get_page_ranges(mPrintSettings, &ctRanges); 1.289 + 1.290 + if (ctRanges < 1) { 1.291 + *aEndPageRange = 1; 1.292 + } else { 1.293 + int32_t end(lstRanges[0].end); 1.294 + for (gint ii = 1; ii < ctRanges; ii++) { 1.295 + end = std::max(lstRanges[ii].end, end); 1.296 + } 1.297 + *aEndPageRange = end + 1; 1.298 + } 1.299 + 1.300 + g_free(lstRanges); 1.301 + return NS_OK; 1.302 +} 1.303 +NS_IMETHODIMP 1.304 +nsPrintSettingsGTK::SetEndPageRange(int32_t aEndPageRange) 1.305 +{ 1.306 + int32_t startRange; 1.307 + GetStartPageRange(&startRange); 1.308 + 1.309 + GtkPageRange gtkRange; 1.310 + gtkRange.start = startRange - 1; 1.311 + gtkRange.end = aEndPageRange - 1; 1.312 + 1.313 + gtk_print_settings_set_page_ranges(mPrintSettings, >kRange, 1); 1.314 + 1.315 + return NS_OK; 1.316 +} 1.317 + 1.318 +/* attribute boolean printReversed; */ 1.319 +NS_IMETHODIMP 1.320 +nsPrintSettingsGTK::GetPrintReversed(bool *aPrintReversed) 1.321 +{ 1.322 + *aPrintReversed = gtk_print_settings_get_reverse(mPrintSettings); 1.323 + return NS_OK; 1.324 +} 1.325 +NS_IMETHODIMP 1.326 +nsPrintSettingsGTK::SetPrintReversed(bool aPrintReversed) 1.327 +{ 1.328 + gtk_print_settings_set_reverse(mPrintSettings, aPrintReversed); 1.329 + return NS_OK; 1.330 +} 1.331 + 1.332 +/* attribute boolean printInColor; */ 1.333 +NS_IMETHODIMP 1.334 +nsPrintSettingsGTK::GetPrintInColor(bool *aPrintInColor) 1.335 +{ 1.336 + *aPrintInColor = gtk_print_settings_get_use_color(mPrintSettings); 1.337 + return NS_OK; 1.338 +} 1.339 +NS_IMETHODIMP 1.340 +nsPrintSettingsGTK::SetPrintInColor(bool aPrintInColor) 1.341 +{ 1.342 + gtk_print_settings_set_use_color(mPrintSettings, aPrintInColor); 1.343 + return NS_OK; 1.344 +} 1.345 + 1.346 +/* attribute short orientation; */ 1.347 +NS_IMETHODIMP 1.348 +nsPrintSettingsGTK::GetOrientation(int32_t *aOrientation) 1.349 +{ 1.350 + NS_ENSURE_ARG_POINTER(aOrientation); 1.351 + 1.352 + GtkPageOrientation gtkOrient = gtk_page_setup_get_orientation(mPageSetup); 1.353 + switch (gtkOrient) { 1.354 + case GTK_PAGE_ORIENTATION_LANDSCAPE: 1.355 + case GTK_PAGE_ORIENTATION_REVERSE_LANDSCAPE: 1.356 + *aOrientation = kLandscapeOrientation; 1.357 + break; 1.358 + 1.359 + case GTK_PAGE_ORIENTATION_PORTRAIT: 1.360 + case GTK_PAGE_ORIENTATION_REVERSE_PORTRAIT: 1.361 + default: 1.362 + *aOrientation = kPortraitOrientation; 1.363 + } 1.364 + return NS_OK; 1.365 +} 1.366 +NS_IMETHODIMP 1.367 +nsPrintSettingsGTK::SetOrientation(int32_t aOrientation) 1.368 +{ 1.369 + GtkPageOrientation gtkOrient; 1.370 + if (aOrientation == kLandscapeOrientation) 1.371 + gtkOrient = GTK_PAGE_ORIENTATION_LANDSCAPE; 1.372 + else 1.373 + gtkOrient = GTK_PAGE_ORIENTATION_PORTRAIT; 1.374 + 1.375 + gtk_print_settings_set_orientation(mPrintSettings, gtkOrient); 1.376 + gtk_page_setup_set_orientation(mPageSetup, gtkOrient); 1.377 + return NS_OK; 1.378 +} 1.379 + 1.380 +/* attribute wstring toFileName; */ 1.381 +NS_IMETHODIMP 1.382 +nsPrintSettingsGTK::GetToFileName(char16_t * *aToFileName) 1.383 +{ 1.384 + // Get the gtk output filename 1.385 + const char* gtk_output_uri = gtk_print_settings_get(mPrintSettings, GTK_PRINT_SETTINGS_OUTPUT_URI); 1.386 + if (!gtk_output_uri) { 1.387 + *aToFileName = ToNewUnicode(mToFileName); 1.388 + return NS_OK; 1.389 + } 1.390 + 1.391 + // Convert to an nsIFile 1.392 + nsCOMPtr<nsIFile> file; 1.393 + nsresult rv = NS_GetFileFromURLSpec(nsDependentCString(gtk_output_uri), 1.394 + getter_AddRefs(file)); 1.395 + if (NS_FAILED(rv)) 1.396 + return rv; 1.397 + 1.398 + // Extract the path 1.399 + nsAutoString path; 1.400 + rv = file->GetPath(path); 1.401 + NS_ENSURE_SUCCESS(rv, rv); 1.402 + 1.403 + *aToFileName = ToNewUnicode(path); 1.404 + return NS_OK; 1.405 +} 1.406 + 1.407 +NS_IMETHODIMP 1.408 +nsPrintSettingsGTK::SetToFileName(const char16_t * aToFileName) 1.409 +{ 1.410 + if (aToFileName[0] == 0) { 1.411 + mToFileName.SetLength(0); 1.412 + gtk_print_settings_set(mPrintSettings, GTK_PRINT_SETTINGS_OUTPUT_URI, 1.413 + nullptr); 1.414 + return NS_OK; 1.415 + } 1.416 + 1.417 + if (StringEndsWith(nsDependentString(aToFileName), NS_LITERAL_STRING(".ps"))) { 1.418 + gtk_print_settings_set(mPrintSettings, GTK_PRINT_SETTINGS_OUTPUT_FILE_FORMAT, "ps"); 1.419 + } else { 1.420 + gtk_print_settings_set(mPrintSettings, GTK_PRINT_SETTINGS_OUTPUT_FILE_FORMAT, "pdf"); 1.421 + } 1.422 + 1.423 + nsCOMPtr<nsIFile> file; 1.424 + nsresult rv = NS_NewLocalFile(nsDependentString(aToFileName), true, 1.425 + getter_AddRefs(file)); 1.426 + NS_ENSURE_SUCCESS(rv, rv); 1.427 + 1.428 + // Convert the nsIFile to a URL 1.429 + nsAutoCString url; 1.430 + rv = NS_GetURLSpecFromFile(file, url); 1.431 + NS_ENSURE_SUCCESS(rv, rv); 1.432 + 1.433 + gtk_print_settings_set(mPrintSettings, GTK_PRINT_SETTINGS_OUTPUT_URI, url.get()); 1.434 + mToFileName = aToFileName; 1.435 + 1.436 + return NS_OK; 1.437 +} 1.438 + 1.439 +NS_IMETHODIMP 1.440 +nsPrintSettingsGTK::GetPrinterName(char16_t * *aPrinter) 1.441 +{ 1.442 + const char* gtkPrintName = gtk_print_settings_get_printer(mPrintSettings); 1.443 + if (!gtkPrintName) { 1.444 + if (GTK_IS_PRINTER(mGTKPrinter)) { 1.445 + gtkPrintName = gtk_printer_get_name(mGTKPrinter); 1.446 + } else { 1.447 + // This mimics what nsPrintSettingsImpl does when we try to Get before we Set 1.448 + nsXPIDLString nullPrintName; 1.449 + *aPrinter = ToNewUnicode(nullPrintName); 1.450 + return NS_OK; 1.451 + } 1.452 + } 1.453 + *aPrinter = ToNewUnicode(nsDependentCString(gtkPrintName)); 1.454 + return NS_OK; 1.455 +} 1.456 + 1.457 +NS_IMETHODIMP 1.458 +nsPrintSettingsGTK::SetPrinterName(const char16_t * aPrinter) 1.459 +{ 1.460 + NS_ConvertUTF16toUTF8 gtkPrinter(aPrinter); 1.461 + 1.462 + if (StringBeginsWith(gtkPrinter, NS_LITERAL_CSTRING("CUPS/"))) { 1.463 + // Strip off "CUPS/"; GTK might recognize the rest 1.464 + gtkPrinter.Cut(0, strlen("CUPS/")); 1.465 + } 1.466 + 1.467 + // Give mPrintSettings the passed-in printer name if either... 1.468 + // - it has no printer name stored yet 1.469 + // - it has an existing printer name that's different from 1.470 + // the name passed to this function. 1.471 + const char* oldPrinterName = gtk_print_settings_get_printer(mPrintSettings); 1.472 + if (!oldPrinterName || !gtkPrinter.Equals(oldPrinterName)) { 1.473 + mIsInitedFromPrinter = false; 1.474 + mIsInitedFromPrefs = false; 1.475 + gtk_print_settings_set_printer(mPrintSettings, gtkPrinter.get()); 1.476 + } 1.477 + 1.478 + return NS_OK; 1.479 +} 1.480 + 1.481 +/* attribute long numCopies; */ 1.482 +NS_IMETHODIMP 1.483 +nsPrintSettingsGTK::GetNumCopies(int32_t *aNumCopies) 1.484 +{ 1.485 + NS_ENSURE_ARG_POINTER(aNumCopies); 1.486 + *aNumCopies = gtk_print_settings_get_n_copies(mPrintSettings); 1.487 + return NS_OK; 1.488 +} 1.489 +NS_IMETHODIMP 1.490 +nsPrintSettingsGTK::SetNumCopies(int32_t aNumCopies) 1.491 +{ 1.492 + gtk_print_settings_set_n_copies(mPrintSettings, aNumCopies); 1.493 + return NS_OK; 1.494 +} 1.495 + 1.496 +/* attribute double scaling; */ 1.497 +NS_IMETHODIMP 1.498 +nsPrintSettingsGTK::GetScaling(double *aScaling) 1.499 +{ 1.500 + *aScaling = gtk_print_settings_get_scale(mPrintSettings) / 100.0; 1.501 + return NS_OK; 1.502 +} 1.503 + 1.504 +NS_IMETHODIMP 1.505 +nsPrintSettingsGTK::SetScaling(double aScaling) 1.506 +{ 1.507 + gtk_print_settings_set_scale(mPrintSettings, aScaling * 100.0); 1.508 + return NS_OK; 1.509 +} 1.510 + 1.511 +/* attribute wstring paperName; */ 1.512 +NS_IMETHODIMP 1.513 +nsPrintSettingsGTK::GetPaperName(char16_t * *aPaperName) 1.514 +{ 1.515 + NS_ENSURE_ARG_POINTER(aPaperName); 1.516 + *aPaperName = ToNewUnicode(NS_ConvertUTF8toUTF16(gtk_paper_size_get_name(mPaperSize))); 1.517 + return NS_OK; 1.518 +} 1.519 +NS_IMETHODIMP 1.520 +nsPrintSettingsGTK::SetPaperName(const char16_t * aPaperName) 1.521 +{ 1.522 + NS_ConvertUTF16toUTF8 gtkPaperName(aPaperName); 1.523 + 1.524 + // Convert these Gecko names to GTK names 1.525 + if (gtkPaperName.EqualsIgnoreCase("letter")) 1.526 + gtkPaperName.AssignLiteral(GTK_PAPER_NAME_LETTER); 1.527 + else if (gtkPaperName.EqualsIgnoreCase("legal")) 1.528 + gtkPaperName.AssignLiteral(GTK_PAPER_NAME_LEGAL); 1.529 + 1.530 + // Try to get the display name from the name so our paper size fits in the Page Setup dialog. 1.531 + GtkPaperSize* paperSize = gtk_paper_size_new(gtkPaperName.get()); 1.532 + char* displayName = strdup(gtk_paper_size_get_display_name(paperSize)); 1.533 + gtk_paper_size_free(paperSize); 1.534 + 1.535 + paperSize = gtk_paper_size_new_custom(gtkPaperName.get(), displayName, 1.536 + gtk_paper_size_get_width(mPaperSize, GTK_UNIT_INCH), 1.537 + gtk_paper_size_get_height(mPaperSize, GTK_UNIT_INCH), 1.538 + GTK_UNIT_INCH); 1.539 + 1.540 + free(displayName); 1.541 + gtk_paper_size_free(mPaperSize); 1.542 + mPaperSize = paperSize; 1.543 + SaveNewPageSize(); 1.544 + return NS_OK; 1.545 +} 1.546 + 1.547 +GtkUnit 1.548 +nsPrintSettingsGTK::GetGTKUnit(int16_t aGeckoUnit) 1.549 +{ 1.550 + if (aGeckoUnit == kPaperSizeMillimeters) 1.551 + return GTK_UNIT_MM; 1.552 + else 1.553 + return GTK_UNIT_INCH; 1.554 +} 1.555 + 1.556 +void 1.557 +nsPrintSettingsGTK::SaveNewPageSize() 1.558 +{ 1.559 + gtk_print_settings_set_paper_size(mPrintSettings, mPaperSize); 1.560 + gtk_page_setup_set_paper_size(mPageSetup, mPaperSize); 1.561 +} 1.562 + 1.563 +void 1.564 +nsPrintSettingsGTK::InitUnwriteableMargin() 1.565 +{ 1.566 + mUnwriteableMargin.SizeTo( 1.567 + NS_INCHES_TO_INT_TWIPS(gtk_page_setup_get_top_margin(mPageSetup, GTK_UNIT_INCH)), 1.568 + NS_INCHES_TO_INT_TWIPS(gtk_page_setup_get_right_margin(mPageSetup, GTK_UNIT_INCH)), 1.569 + NS_INCHES_TO_INT_TWIPS(gtk_page_setup_get_bottom_margin(mPageSetup, GTK_UNIT_INCH)), 1.570 + NS_INCHES_TO_INT_TWIPS(gtk_page_setup_get_left_margin(mPageSetup, GTK_UNIT_INCH)) 1.571 + ); 1.572 +} 1.573 + 1.574 +/** 1.575 + * NOTE: Need a custom set of SetUnwriteableMargin functions, because 1.576 + * whenever we change mUnwriteableMargin, we must pass the change 1.577 + * down to our GTKPageSetup object. (This is needed in order for us 1.578 + * to give the correct default values in nsPrintDialogGTK.) 1.579 + * 1.580 + * It's important that the following functions pass 1.581 + * mUnwriteableMargin values rather than aUnwriteableMargin values 1.582 + * to gtk_page_setup_set_[blank]_margin, because the two may not be 1.583 + * the same. (Specifically, negative values of aUnwriteableMargin 1.584 + * are ignored by the nsPrintSettings::SetUnwriteableMargin functions.) 1.585 + */ 1.586 +NS_IMETHODIMP 1.587 +nsPrintSettingsGTK::SetUnwriteableMarginInTwips(nsIntMargin& aUnwriteableMargin) 1.588 +{ 1.589 + nsPrintSettings::SetUnwriteableMarginInTwips(aUnwriteableMargin); 1.590 + gtk_page_setup_set_top_margin(mPageSetup, 1.591 + NS_TWIPS_TO_INCHES(mUnwriteableMargin.top), GTK_UNIT_INCH); 1.592 + gtk_page_setup_set_left_margin(mPageSetup, 1.593 + NS_TWIPS_TO_INCHES(mUnwriteableMargin.left), GTK_UNIT_INCH); 1.594 + gtk_page_setup_set_bottom_margin(mPageSetup, 1.595 + NS_TWIPS_TO_INCHES(mUnwriteableMargin.bottom), GTK_UNIT_INCH); 1.596 + gtk_page_setup_set_right_margin(mPageSetup, 1.597 + NS_TWIPS_TO_INCHES(mUnwriteableMargin.right), GTK_UNIT_INCH); 1.598 + return NS_OK; 1.599 +} 1.600 + 1.601 +/* attribute double unwriteableMarginTop; */ 1.602 +NS_IMETHODIMP 1.603 +nsPrintSettingsGTK::SetUnwriteableMarginTop(double aUnwriteableMarginTop) 1.604 +{ 1.605 + nsPrintSettings::SetUnwriteableMarginTop(aUnwriteableMarginTop); 1.606 + gtk_page_setup_set_top_margin(mPageSetup, 1.607 + NS_TWIPS_TO_INCHES(mUnwriteableMargin.top), GTK_UNIT_INCH); 1.608 + return NS_OK; 1.609 +} 1.610 + 1.611 +/* attribute double unwriteableMarginLeft; */ 1.612 +NS_IMETHODIMP 1.613 +nsPrintSettingsGTK::SetUnwriteableMarginLeft(double aUnwriteableMarginLeft) 1.614 +{ 1.615 + nsPrintSettings::SetUnwriteableMarginLeft(aUnwriteableMarginLeft); 1.616 + gtk_page_setup_set_left_margin(mPageSetup, 1.617 + NS_TWIPS_TO_INCHES(mUnwriteableMargin.left), GTK_UNIT_INCH); 1.618 + return NS_OK; 1.619 +} 1.620 + 1.621 +/* attribute double unwriteableMarginBottom; */ 1.622 +NS_IMETHODIMP 1.623 +nsPrintSettingsGTK::SetUnwriteableMarginBottom(double aUnwriteableMarginBottom) 1.624 +{ 1.625 + nsPrintSettings::SetUnwriteableMarginBottom(aUnwriteableMarginBottom); 1.626 + gtk_page_setup_set_bottom_margin(mPageSetup, 1.627 + NS_TWIPS_TO_INCHES(mUnwriteableMargin.bottom), GTK_UNIT_INCH); 1.628 + return NS_OK; 1.629 +} 1.630 + 1.631 +/* attribute double unwriteableMarginRight; */ 1.632 +NS_IMETHODIMP 1.633 +nsPrintSettingsGTK::SetUnwriteableMarginRight(double aUnwriteableMarginRight) 1.634 +{ 1.635 + nsPrintSettings::SetUnwriteableMarginRight(aUnwriteableMarginRight); 1.636 + gtk_page_setup_set_right_margin(mPageSetup, 1.637 + NS_TWIPS_TO_INCHES(mUnwriteableMargin.right), GTK_UNIT_INCH); 1.638 + return NS_OK; 1.639 +} 1.640 + 1.641 +/* attribute double paperWidth; */ 1.642 +NS_IMETHODIMP 1.643 +nsPrintSettingsGTK::GetPaperWidth(double *aPaperWidth) 1.644 +{ 1.645 + NS_ENSURE_ARG_POINTER(aPaperWidth); 1.646 + *aPaperWidth = gtk_paper_size_get_width(mPaperSize, GetGTKUnit(mPaperSizeUnit)); 1.647 + return NS_OK; 1.648 +} 1.649 +NS_IMETHODIMP 1.650 +nsPrintSettingsGTK::SetPaperWidth(double aPaperWidth) 1.651 +{ 1.652 + gtk_paper_size_set_size(mPaperSize, 1.653 + aPaperWidth, 1.654 + gtk_paper_size_get_height(mPaperSize, GetGTKUnit(mPaperSizeUnit)), 1.655 + GetGTKUnit(mPaperSizeUnit)); 1.656 + SaveNewPageSize(); 1.657 + return NS_OK; 1.658 +} 1.659 + 1.660 +/* attribute double paperHeight; */ 1.661 +NS_IMETHODIMP 1.662 +nsPrintSettingsGTK::GetPaperHeight(double *aPaperHeight) 1.663 +{ 1.664 + NS_ENSURE_ARG_POINTER(aPaperHeight); 1.665 + *aPaperHeight = gtk_paper_size_get_height(mPaperSize, GetGTKUnit(mPaperSizeUnit)); 1.666 + return NS_OK; 1.667 +} 1.668 +NS_IMETHODIMP 1.669 +nsPrintSettingsGTK::SetPaperHeight(double aPaperHeight) 1.670 +{ 1.671 + gtk_paper_size_set_size(mPaperSize, 1.672 + gtk_paper_size_get_width(mPaperSize, GetGTKUnit(mPaperSizeUnit)), 1.673 + aPaperHeight, 1.674 + GetGTKUnit(mPaperSizeUnit)); 1.675 + SaveNewPageSize(); 1.676 + return NS_OK; 1.677 +} 1.678 + 1.679 +NS_IMETHODIMP 1.680 +nsPrintSettingsGTK::SetPaperSizeUnit(int16_t aPaperSizeUnit) 1.681 +{ 1.682 + // Convert units internally. e.g. they might have set the values while we're still in mm but 1.683 + // they change to inch just afterwards, expecting that their sizes are in inches. 1.684 + gtk_paper_size_set_size(mPaperSize, 1.685 + gtk_paper_size_get_width(mPaperSize, GetGTKUnit(mPaperSizeUnit)), 1.686 + gtk_paper_size_get_height(mPaperSize, GetGTKUnit(mPaperSizeUnit)), 1.687 + GetGTKUnit(aPaperSizeUnit)); 1.688 + SaveNewPageSize(); 1.689 + 1.690 + mPaperSizeUnit = aPaperSizeUnit; 1.691 + return NS_OK; 1.692 +} 1.693 + 1.694 +NS_IMETHODIMP 1.695 +nsPrintSettingsGTK::GetEffectivePageSize(double *aWidth, double *aHeight) 1.696 +{ 1.697 + *aWidth = NS_INCHES_TO_INT_TWIPS(gtk_paper_size_get_width(mPaperSize, GTK_UNIT_INCH)); 1.698 + *aHeight = NS_INCHES_TO_INT_TWIPS(gtk_paper_size_get_height(mPaperSize, GTK_UNIT_INCH)); 1.699 + 1.700 + GtkPageOrientation gtkOrient = gtk_page_setup_get_orientation(mPageSetup); 1.701 + 1.702 + if (gtkOrient == GTK_PAGE_ORIENTATION_LANDSCAPE || 1.703 + gtkOrient == GTK_PAGE_ORIENTATION_REVERSE_LANDSCAPE) { 1.704 + double temp = *aWidth; 1.705 + *aWidth = *aHeight; 1.706 + *aHeight = temp; 1.707 + } 1.708 + return NS_OK; 1.709 +} 1.710 + 1.711 +NS_IMETHODIMP 1.712 +nsPrintSettingsGTK::SetupSilentPrinting() 1.713 +{ 1.714 + // We have to get a printer here, rather than when the print settings are constructed. 1.715 + // This is because when we request sync, GTK makes us wait in the *event loop* while waiting 1.716 + // for the enumeration to finish. We must do this when event loop runs are expected. 1.717 + gtk_enumerate_printers(printer_enumerator, this, nullptr, TRUE); 1.718 + 1.719 + // XXX If no default printer set, get the first one. 1.720 + if (!GTK_IS_PRINTER(mGTKPrinter)) 1.721 + gtk_enumerate_printers(ref_printer, this, nullptr, TRUE); 1.722 + 1.723 + return NS_OK; 1.724 +} 1.725 + 1.726 +NS_IMETHODIMP 1.727 +nsPrintSettingsGTK::GetPageRanges(nsTArray<int32_t> &aPages) 1.728 +{ 1.729 + gint ctRanges; 1.730 + GtkPageRange* lstRanges = gtk_print_settings_get_page_ranges(mPrintSettings, &ctRanges); 1.731 + 1.732 + aPages.Clear(); 1.733 + 1.734 + if (ctRanges > 1) { 1.735 + for (gint i = 0; i < ctRanges; i++) { 1.736 + aPages.AppendElement(lstRanges[i].start+1); 1.737 + aPages.AppendElement(lstRanges[i].end+1); 1.738 + } 1.739 + } 1.740 + 1.741 + g_free(lstRanges); 1.742 + return NS_OK; 1.743 +} 1.744 + 1.745 +NS_IMETHODIMP 1.746 +nsPrintSettingsGTK::GetResolution(int32_t *aResolution) 1.747 +{ 1.748 + if (!gtk_print_settings_has_key(mPrintSettings, GTK_PRINT_SETTINGS_RESOLUTION)) 1.749 + return NS_ERROR_FAILURE; 1.750 + *aResolution = gtk_print_settings_get_resolution(mPrintSettings); 1.751 + return NS_OK; 1.752 +} 1.753 + 1.754 +NS_IMETHODIMP 1.755 +nsPrintSettingsGTK::SetResolution(int32_t aResolution) 1.756 +{ 1.757 + gtk_print_settings_set_resolution(mPrintSettings, aResolution); 1.758 + return NS_OK; 1.759 +} 1.760 + 1.761 +NS_IMETHODIMP 1.762 +nsPrintSettingsGTK::GetDuplex(int32_t *aDuplex) 1.763 +{ 1.764 + if (!gtk_print_settings_has_key(mPrintSettings, GTK_PRINT_SETTINGS_DUPLEX)) 1.765 + return NS_ERROR_FAILURE; 1.766 + *aDuplex = gtk_print_settings_get_duplex(mPrintSettings); 1.767 + return NS_OK; 1.768 +} 1.769 + 1.770 +NS_IMETHODIMP 1.771 +nsPrintSettingsGTK::SetDuplex(int32_t aDuplex) 1.772 +{ 1.773 + MOZ_ASSERT(aDuplex >= GTK_PRINT_DUPLEX_SIMPLEX && 1.774 + aDuplex <= GTK_PRINT_DUPLEX_VERTICAL, 1.775 + "value is out of bounds for GtkPrintDuplex enum"); 1.776 + gtk_print_settings_set_duplex(mPrintSettings, static_cast<GtkPrintDuplex>(aDuplex)); 1.777 + return NS_OK; 1.778 +} 1.779 +