/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, >kRange, 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, >kRange, 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 | | |