Coverage Report

Created: 2018-09-25 14:53

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