1use glib;
6use glib::translate::*;
7use glib::GString;
8use gtk_sys;
9use std;
10use std::fmt;
11use std::mem;
12use std::ptr;
13use Error;
14use NumberUpLayout;
15use PageOrientation;
16use PageRange;
17use PageSet;
18use PaperSize;
19use PrintDuplex;
20use PrintPages;
21use PrintQuality;
22use Unit;
23
24glib_wrapper! {
25 pub struct PrintSettings(Object<gtk_sys::GtkPrintSettings, PrintSettingsClass>);
26
27 match fn {
28 get_type => || gtk_sys::gtk_print_settings_get_type(),
29 }
30}
31
32impl PrintSettings {
33 pub fn new() -> PrintSettings {
34 assert_initialized_main_thread!();
35 unsafe { from_glib_full(gtk_sys::gtk_print_settings_new()) }
36 }
37
38 pub fn new_from_file<P: AsRef<std::path::Path>>(file_name: P) -> Result<PrintSettings, Error> {
39 assert_initialized_main_thread!();
40 unsafe {
41 let mut error = ptr::null_mut();
42 let ret = gtk_sys::gtk_print_settings_new_from_file(
43 file_name.as_ref().to_glib_none().0,
44 &mut error,
45 );
46 if error.is_null() {
47 Ok(from_glib_full(ret))
48 } else {
49 Err(from_glib_full(error))
50 }
51 }
52 }
53
54 #[cfg(any(feature = "v3_22", feature = "dox"))]
55 pub fn new_from_gvariant(variant: &glib::Variant) -> PrintSettings {
56 assert_initialized_main_thread!();
57 unsafe {
58 from_glib_full(gtk_sys::gtk_print_settings_new_from_gvariant(
59 variant.to_glib_none().0,
60 ))
61 }
62 }
63
64 pub fn new_from_key_file(
65 key_file: &glib::KeyFile,
66 group_name: Option<&str>,
67 ) -> Result<PrintSettings, Error> {
68 assert_initialized_main_thread!();
69 unsafe {
70 let mut error = ptr::null_mut();
71 let ret = gtk_sys::gtk_print_settings_new_from_key_file(
72 key_file.to_glib_none().0,
73 group_name.to_glib_none().0,
74 &mut error,
75 );
76 if error.is_null() {
77 Ok(from_glib_full(ret))
78 } else {
79 Err(from_glib_full(error))
80 }
81 }
82 }
83
84 pub fn copy(&self) -> Option<PrintSettings> {
85 unsafe { from_glib_full(gtk_sys::gtk_print_settings_copy(self.to_glib_none().0)) }
86 }
87
88 pub fn foreach<P: FnMut(&str, &str)>(&self, func: P) {
89 let func_data: P = func;
90 unsafe extern "C" fn func_func<P: FnMut(&str, &str)>(
91 key: *const libc::c_char,
92 value: *const libc::c_char,
93 user_data: glib_sys::gpointer,
94 ) {
95 let key: GString = from_glib_borrow(key);
96 let value: GString = from_glib_borrow(value);
97 let callback: *mut P = user_data as *const _ as usize as *mut P;
98 (*callback)(key.as_str(), value.as_str());
99 }
100 let func = Some(func_func::<P> as _);
101 let super_callback0: &P = &func_data;
102 unsafe {
103 gtk_sys::gtk_print_settings_foreach(
104 self.to_glib_none().0,
105 func,
106 super_callback0 as *const _ as usize as *mut _,
107 );
108 }
109 }
110
111 pub fn get(&self, key: &str) -> Option<GString> {
112 unsafe {
113 from_glib_none(gtk_sys::gtk_print_settings_get(
114 self.to_glib_none().0,
115 key.to_glib_none().0,
116 ))
117 }
118 }
119
120 pub fn get_bool(&self, key: &str) -> bool {
121 unsafe {
122 from_glib(gtk_sys::gtk_print_settings_get_bool(
123 self.to_glib_none().0,
124 key.to_glib_none().0,
125 ))
126 }
127 }
128
129 pub fn get_collate(&self) -> bool {
130 unsafe {
131 from_glib(gtk_sys::gtk_print_settings_get_collate(
132 self.to_glib_none().0,
133 ))
134 }
135 }
136
137 pub fn get_default_source(&self) -> Option<GString> {
138 unsafe {
139 from_glib_none(gtk_sys::gtk_print_settings_get_default_source(
140 self.to_glib_none().0,
141 ))
142 }
143 }
144
145 pub fn get_dither(&self) -> Option<GString> {
146 unsafe {
147 from_glib_none(gtk_sys::gtk_print_settings_get_dither(
148 self.to_glib_none().0,
149 ))
150 }
151 }
152
153 pub fn get_double(&self, key: &str) -> f64 {
154 unsafe {
155 gtk_sys::gtk_print_settings_get_double(self.to_glib_none().0, key.to_glib_none().0)
156 }
157 }
158
159 pub fn get_double_with_default(&self, key: &str, def: f64) -> f64 {
160 unsafe {
161 gtk_sys::gtk_print_settings_get_double_with_default(
162 self.to_glib_none().0,
163 key.to_glib_none().0,
164 def,
165 )
166 }
167 }
168
169 pub fn get_duplex(&self) -> PrintDuplex {
170 unsafe {
171 from_glib(gtk_sys::gtk_print_settings_get_duplex(
172 self.to_glib_none().0,
173 ))
174 }
175 }
176
177 pub fn get_finishings(&self) -> Option<GString> {
178 unsafe {
179 from_glib_none(gtk_sys::gtk_print_settings_get_finishings(
180 self.to_glib_none().0,
181 ))
182 }
183 }
184
185 pub fn get_int(&self, key: &str) -> i32 {
186 unsafe { gtk_sys::gtk_print_settings_get_int(self.to_glib_none().0, key.to_glib_none().0) }
187 }
188
189 pub fn get_int_with_default(&self, key: &str, def: i32) -> i32 {
190 unsafe {
191 gtk_sys::gtk_print_settings_get_int_with_default(
192 self.to_glib_none().0,
193 key.to_glib_none().0,
194 def,
195 )
196 }
197 }
198
199 pub fn get_length(&self, key: &str, unit: Unit) -> f64 {
200 unsafe {
201 gtk_sys::gtk_print_settings_get_length(
202 self.to_glib_none().0,
203 key.to_glib_none().0,
204 unit.to_glib(),
205 )
206 }
207 }
208
209 pub fn get_media_type(&self) -> Option<GString> {
210 unsafe {
211 from_glib_none(gtk_sys::gtk_print_settings_get_media_type(
212 self.to_glib_none().0,
213 ))
214 }
215 }
216
217 pub fn get_n_copies(&self) -> i32 {
218 unsafe { gtk_sys::gtk_print_settings_get_n_copies(self.to_glib_none().0) }
219 }
220
221 pub fn get_number_up(&self) -> i32 {
222 unsafe { gtk_sys::gtk_print_settings_get_number_up(self.to_glib_none().0) }
223 }
224
225 pub fn get_number_up_layout(&self) -> NumberUpLayout {
226 unsafe {
227 from_glib(gtk_sys::gtk_print_settings_get_number_up_layout(
228 self.to_glib_none().0,
229 ))
230 }
231 }
232
233 pub fn get_orientation(&self) -> PageOrientation {
234 unsafe {
235 from_glib(gtk_sys::gtk_print_settings_get_orientation(
236 self.to_glib_none().0,
237 ))
238 }
239 }
240
241 pub fn get_output_bin(&self) -> Option<GString> {
242 unsafe {
243 from_glib_none(gtk_sys::gtk_print_settings_get_output_bin(
244 self.to_glib_none().0,
245 ))
246 }
247 }
248
249 pub fn get_page_ranges(&self) -> Vec<PageRange> {
250 unsafe {
251 let mut num_ranges = mem::uninitialized();
252 let ret = FromGlibContainer::from_glib_full_num(
253 gtk_sys::gtk_print_settings_get_page_ranges(self.to_glib_none().0, &mut num_ranges),
254 num_ranges as usize,
255 );
256 ret
257 }
258 }
259
260 pub fn get_page_set(&self) -> PageSet {
261 unsafe {
262 from_glib(gtk_sys::gtk_print_settings_get_page_set(
263 self.to_glib_none().0,
264 ))
265 }
266 }
267
268 pub fn get_paper_height(&self, unit: Unit) -> f64 {
269 unsafe {
270 gtk_sys::gtk_print_settings_get_paper_height(self.to_glib_none().0, unit.to_glib())
271 }
272 }
273
274 pub fn get_paper_size(&self) -> PaperSize {
275 unsafe {
276 from_glib_full(gtk_sys::gtk_print_settings_get_paper_size(
277 self.to_glib_none().0,
278 ))
279 }
280 }
281
282 pub fn get_paper_width(&self, unit: Unit) -> f64 {
283 unsafe {
284 gtk_sys::gtk_print_settings_get_paper_width(self.to_glib_none().0, unit.to_glib())
285 }
286 }
287
288 pub fn get_print_pages(&self) -> PrintPages {
289 unsafe {
290 from_glib(gtk_sys::gtk_print_settings_get_print_pages(
291 self.to_glib_none().0,
292 ))
293 }
294 }
295
296 pub fn get_printer(&self) -> Option<GString> {
297 unsafe {
298 from_glib_none(gtk_sys::gtk_print_settings_get_printer(
299 self.to_glib_none().0,
300 ))
301 }
302 }
303
304 pub fn get_printer_lpi(&self) -> f64 {
305 unsafe { gtk_sys::gtk_print_settings_get_printer_lpi(self.to_glib_none().0) }
306 }
307
308 pub fn get_quality(&self) -> PrintQuality {
309 unsafe {
310 from_glib(gtk_sys::gtk_print_settings_get_quality(
311 self.to_glib_none().0,
312 ))
313 }
314 }
315
316 pub fn get_resolution(&self) -> i32 {
317 unsafe { gtk_sys::gtk_print_settings_get_resolution(self.to_glib_none().0) }
318 }
319
320 pub fn get_resolution_x(&self) -> i32 {
321 unsafe { gtk_sys::gtk_print_settings_get_resolution_x(self.to_glib_none().0) }
322 }
323
324 pub fn get_resolution_y(&self) -> i32 {
325 unsafe { gtk_sys::gtk_print_settings_get_resolution_y(self.to_glib_none().0) }
326 }
327
328 pub fn get_reverse(&self) -> bool {
329 unsafe {
330 from_glib(gtk_sys::gtk_print_settings_get_reverse(
331 self.to_glib_none().0,
332 ))
333 }
334 }
335
336 pub fn get_scale(&self) -> f64 {
337 unsafe { gtk_sys::gtk_print_settings_get_scale(self.to_glib_none().0) }
338 }
339
340 pub fn get_use_color(&self) -> bool {
341 unsafe {
342 from_glib(gtk_sys::gtk_print_settings_get_use_color(
343 self.to_glib_none().0,
344 ))
345 }
346 }
347
348 pub fn has_key(&self, key: &str) -> bool {
349 unsafe {
350 from_glib(gtk_sys::gtk_print_settings_has_key(
351 self.to_glib_none().0,
352 key.to_glib_none().0,
353 ))
354 }
355 }
356
357 pub fn load_file<P: AsRef<std::path::Path>>(&self, file_name: P) -> Result<(), Error> {
358 unsafe {
359 let mut error = ptr::null_mut();
360 let _ = gtk_sys::gtk_print_settings_load_file(
361 self.to_glib_none().0,
362 file_name.as_ref().to_glib_none().0,
363 &mut error,
364 );
365 if error.is_null() {
366 Ok(())
367 } else {
368 Err(from_glib_full(error))
369 }
370 }
371 }
372
373 pub fn load_key_file(
374 &self,
375 key_file: &glib::KeyFile,
376 group_name: Option<&str>,
377 ) -> Result<(), Error> {
378 unsafe {
379 let mut error = ptr::null_mut();
380 let _ = gtk_sys::gtk_print_settings_load_key_file(
381 self.to_glib_none().0,
382 key_file.to_glib_none().0,
383 group_name.to_glib_none().0,
384 &mut error,
385 );
386 if error.is_null() {
387 Ok(())
388 } else {
389 Err(from_glib_full(error))
390 }
391 }
392 }
393
394 pub fn set(&self, key: &str, value: Option<&str>) {
395 unsafe {
396 gtk_sys::gtk_print_settings_set(
397 self.to_glib_none().0,
398 key.to_glib_none().0,
399 value.to_glib_none().0,
400 );
401 }
402 }
403
404 pub fn set_bool(&self, key: &str, value: bool) {
405 unsafe {
406 gtk_sys::gtk_print_settings_set_bool(
407 self.to_glib_none().0,
408 key.to_glib_none().0,
409 value.to_glib(),
410 );
411 }
412 }
413
414 pub fn set_collate(&self, collate: bool) {
415 unsafe {
416 gtk_sys::gtk_print_settings_set_collate(self.to_glib_none().0, collate.to_glib());
417 }
418 }
419
420 pub fn set_default_source(&self, default_source: &str) {
421 unsafe {
422 gtk_sys::gtk_print_settings_set_default_source(
423 self.to_glib_none().0,
424 default_source.to_glib_none().0,
425 );
426 }
427 }
428
429 pub fn set_dither(&self, dither: &str) {
430 unsafe {
431 gtk_sys::gtk_print_settings_set_dither(self.to_glib_none().0, dither.to_glib_none().0);
432 }
433 }
434
435 pub fn set_double(&self, key: &str, value: f64) {
436 unsafe {
437 gtk_sys::gtk_print_settings_set_double(
438 self.to_glib_none().0,
439 key.to_glib_none().0,
440 value,
441 );
442 }
443 }
444
445 pub fn set_duplex(&self, duplex: PrintDuplex) {
446 unsafe {
447 gtk_sys::gtk_print_settings_set_duplex(self.to_glib_none().0, duplex.to_glib());
448 }
449 }
450
451 pub fn set_finishings(&self, finishings: &str) {
452 unsafe {
453 gtk_sys::gtk_print_settings_set_finishings(
454 self.to_glib_none().0,
455 finishings.to_glib_none().0,
456 );
457 }
458 }
459
460 pub fn set_int(&self, key: &str, value: i32) {
461 unsafe {
462 gtk_sys::gtk_print_settings_set_int(self.to_glib_none().0, key.to_glib_none().0, value);
463 }
464 }
465
466 pub fn set_length(&self, key: &str, value: f64, unit: Unit) {
467 unsafe {
468 gtk_sys::gtk_print_settings_set_length(
469 self.to_glib_none().0,
470 key.to_glib_none().0,
471 value,
472 unit.to_glib(),
473 );
474 }
475 }
476
477 pub fn set_media_type(&self, media_type: &str) {
478 unsafe {
479 gtk_sys::gtk_print_settings_set_media_type(
480 self.to_glib_none().0,
481 media_type.to_glib_none().0,
482 );
483 }
484 }
485
486 pub fn set_n_copies(&self, num_copies: i32) {
487 unsafe {
488 gtk_sys::gtk_print_settings_set_n_copies(self.to_glib_none().0, num_copies);
489 }
490 }
491
492 pub fn set_number_up(&self, number_up: i32) {
493 unsafe {
494 gtk_sys::gtk_print_settings_set_number_up(self.to_glib_none().0, number_up);
495 }
496 }
497
498 pub fn set_number_up_layout(&self, number_up_layout: NumberUpLayout) {
499 unsafe {
500 gtk_sys::gtk_print_settings_set_number_up_layout(
501 self.to_glib_none().0,
502 number_up_layout.to_glib(),
503 );
504 }
505 }
506
507 pub fn set_orientation(&self, orientation: PageOrientation) {
508 unsafe {
509 gtk_sys::gtk_print_settings_set_orientation(
510 self.to_glib_none().0,
511 orientation.to_glib(),
512 );
513 }
514 }
515
516 pub fn set_output_bin(&self, output_bin: &str) {
517 unsafe {
518 gtk_sys::gtk_print_settings_set_output_bin(
519 self.to_glib_none().0,
520 output_bin.to_glib_none().0,
521 );
522 }
523 }
524
525 pub fn set_page_set(&self, page_set: PageSet) {
526 unsafe {
527 gtk_sys::gtk_print_settings_set_page_set(self.to_glib_none().0, page_set.to_glib());
528 }
529 }
530
531 pub fn set_paper_height(&self, height: f64, unit: Unit) {
532 unsafe {
533 gtk_sys::gtk_print_settings_set_paper_height(
534 self.to_glib_none().0,
535 height,
536 unit.to_glib(),
537 );
538 }
539 }
540
541 pub fn set_paper_size(&self, paper_size: &PaperSize) {
542 unsafe {
543 gtk_sys::gtk_print_settings_set_paper_size(
544 self.to_glib_none().0,
545 mut_override(paper_size.to_glib_none().0),
546 );
547 }
548 }
549
550 pub fn set_paper_width(&self, width: f64, unit: Unit) {
551 unsafe {
552 gtk_sys::gtk_print_settings_set_paper_width(
553 self.to_glib_none().0,
554 width,
555 unit.to_glib(),
556 );
557 }
558 }
559
560 pub fn set_print_pages(&self, pages: PrintPages) {
561 unsafe {
562 gtk_sys::gtk_print_settings_set_print_pages(self.to_glib_none().0, pages.to_glib());
563 }
564 }
565
566 pub fn set_printer(&self, printer: &str) {
567 unsafe {
568 gtk_sys::gtk_print_settings_set_printer(
569 self.to_glib_none().0,
570 printer.to_glib_none().0,
571 );
572 }
573 }
574
575 pub fn set_printer_lpi(&self, lpi: f64) {
576 unsafe {
577 gtk_sys::gtk_print_settings_set_printer_lpi(self.to_glib_none().0, lpi);
578 }
579 }
580
581 pub fn set_quality(&self, quality: PrintQuality) {
582 unsafe {
583 gtk_sys::gtk_print_settings_set_quality(self.to_glib_none().0, quality.to_glib());
584 }
585 }
586
587 pub fn set_resolution(&self, resolution: i32) {
588 unsafe {
589 gtk_sys::gtk_print_settings_set_resolution(self.to_glib_none().0, resolution);
590 }
591 }
592
593 pub fn set_resolution_xy(&self, resolution_x: i32, resolution_y: i32) {
594 unsafe {
595 gtk_sys::gtk_print_settings_set_resolution_xy(
596 self.to_glib_none().0,
597 resolution_x,
598 resolution_y,
599 );
600 }
601 }
602
603 pub fn set_reverse(&self, reverse: bool) {
604 unsafe {
605 gtk_sys::gtk_print_settings_set_reverse(self.to_glib_none().0, reverse.to_glib());
606 }
607 }
608
609 pub fn set_scale(&self, scale: f64) {
610 unsafe {
611 gtk_sys::gtk_print_settings_set_scale(self.to_glib_none().0, scale);
612 }
613 }
614
615 pub fn set_use_color(&self, use_color: bool) {
616 unsafe {
617 gtk_sys::gtk_print_settings_set_use_color(self.to_glib_none().0, use_color.to_glib());
618 }
619 }
620
621 pub fn to_file<P: AsRef<std::path::Path>>(&self, file_name: P) -> Result<(), Error> {
622 unsafe {
623 let mut error = ptr::null_mut();
624 let _ = gtk_sys::gtk_print_settings_to_file(
625 self.to_glib_none().0,
626 file_name.as_ref().to_glib_none().0,
627 &mut error,
628 );
629 if error.is_null() {
630 Ok(())
631 } else {
632 Err(from_glib_full(error))
633 }
634 }
635 }
636
637 #[cfg(any(feature = "v3_22", feature = "dox"))]
638 pub fn to_gvariant(&self) -> Option<glib::Variant> {
639 unsafe {
640 from_glib_none(gtk_sys::gtk_print_settings_to_gvariant(
641 self.to_glib_none().0,
642 ))
643 }
644 }
645
646 pub fn to_key_file(&self, key_file: &glib::KeyFile, group_name: Option<&str>) {
647 unsafe {
648 gtk_sys::gtk_print_settings_to_key_file(
649 self.to_glib_none().0,
650 key_file.to_glib_none().0,
651 group_name.to_glib_none().0,
652 );
653 }
654 }
655
656 pub fn unset(&self, key: &str) {
657 unsafe {
658 gtk_sys::gtk_print_settings_unset(self.to_glib_none().0, key.to_glib_none().0);
659 }
660 }
661}
662
663impl Default for PrintSettings {
664 fn default() -> Self {
665 Self::new()
666 }
667}
668
669impl fmt::Display for PrintSettings {
670 fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
671 write!(f, "PrintSettings")
672 }
673}