Skip to main content

gtk/auto/
invisible.rs

1// This file was generated by gir (https://github.com/gtk-rs/gir)
2// from gir-files (https://github.com/gtk-rs/gir-files)
3// DO NOT EDIT
4
5use crate::{Align, Buildable, Container, Widget, ffi};
6use glib::{
7    prelude::*,
8    signal::{SignalHandlerId, connect_raw},
9    translate::*,
10};
11use std::boxed::Box as Box_;
12
13glib::wrapper! {
14    /// The [`Invisible`][crate::Invisible] widget is used internally in GTK+, and is probably not
15    /// very useful for application developers.
16    ///
17    /// It is used for reliable pointer grabs and selection handling in the code
18    /// for drag-and-drop.
19    ///
20    /// ## Properties
21    ///
22    ///
23    /// #### `screen`
24    ///  Readable | Writable
25    /// <details><summary><h4>Widget</h4></summary>
26    ///
27    ///
28    /// #### `app-paintable`
29    ///  Readable | Writable
30    ///
31    ///
32    /// #### `can-default`
33    ///  Readable | Writable
34    ///
35    ///
36    /// #### `can-focus`
37    ///  Readable | Writable
38    ///
39    ///
40    /// #### `composite-child`
41    ///  Readable
42    ///
43    ///
44    /// #### `double-buffered`
45    ///  Whether the widget is double buffered.
46    ///
47    /// Readable | Writable
48    ///
49    ///
50    /// #### `events`
51    ///  Readable | Writable
52    ///
53    ///
54    /// #### `expand`
55    ///  Whether to expand in both directions. Setting this sets both [`hexpand`][struct@crate::Widget#hexpand] and [`vexpand`][struct@crate::Widget#vexpand]
56    ///
57    /// Readable | Writable
58    ///
59    ///
60    /// #### `focus-on-click`
61    ///  Whether the widget should grab focus when it is clicked with the mouse.
62    ///
63    /// This property is only relevant for widgets that can take focus.
64    ///
65    /// Before 3.20, several widgets (GtkButton, GtkFileChooserButton,
66    /// GtkComboBox) implemented this property individually.
67    ///
68    /// Readable | Writable
69    ///
70    ///
71    /// #### `halign`
72    ///  How to distribute horizontal space if widget gets extra space, see [`Align`][crate::Align]
73    ///
74    /// Readable | Writable
75    ///
76    ///
77    /// #### `has-default`
78    ///  Readable | Writable
79    ///
80    ///
81    /// #### `has-focus`
82    ///  Readable | Writable
83    ///
84    ///
85    /// #### `has-tooltip`
86    ///  Enables or disables the emission of [`query-tooltip`][struct@crate::Widget#query-tooltip] on `widget`.
87    /// A value of [`true`] indicates that `widget` can have a tooltip, in this case
88    /// the widget will be queried using [`query-tooltip`][struct@crate::Widget#query-tooltip] to determine
89    /// whether it will provide a tooltip or not.
90    ///
91    /// Note that setting this property to [`true`] for the first time will change
92    /// the event masks of the GdkWindows of this widget to include leave-notify
93    /// and motion-notify events. This cannot and will not be undone when the
94    /// property is set to [`false`] again.
95    ///
96    /// Readable | Writable
97    ///
98    ///
99    /// #### `height-request`
100    ///  Readable | Writable
101    ///
102    ///
103    /// #### `hexpand`
104    ///  Whether to expand horizontally. See [`WidgetExt::set_hexpand()`][crate::prelude::WidgetExt::set_hexpand()].
105    ///
106    /// Readable | Writable
107    ///
108    ///
109    /// #### `hexpand-set`
110    ///  Whether to use the [`hexpand`][struct@crate::Widget#hexpand] property. See [`WidgetExt::is_hexpand_set()`][crate::prelude::WidgetExt::is_hexpand_set()].
111    ///
112    /// Readable | Writable
113    ///
114    ///
115    /// #### `is-focus`
116    ///  Readable | Writable
117    ///
118    ///
119    /// #### `margin`
120    ///  Sets all four sides' margin at once. If read, returns max
121    /// margin on any side.
122    ///
123    /// Readable | Writable
124    ///
125    ///
126    /// #### `margin-bottom`
127    ///  Margin on bottom side of widget.
128    ///
129    /// This property adds margin outside of the widget's normal size
130    /// request, the margin will be added in addition to the size from
131    /// [`WidgetExt::set_size_request()`][crate::prelude::WidgetExt::set_size_request()] for example.
132    ///
133    /// Readable | Writable
134    ///
135    ///
136    /// #### `margin-end`
137    ///  Margin on end of widget, horizontally. This property supports
138    /// left-to-right and right-to-left text directions.
139    ///
140    /// This property adds margin outside of the widget's normal size
141    /// request, the margin will be added in addition to the size from
142    /// [`WidgetExt::set_size_request()`][crate::prelude::WidgetExt::set_size_request()] for example.
143    ///
144    /// Readable | Writable
145    ///
146    ///
147    /// #### `margin-left`
148    ///  Margin on left side of widget.
149    ///
150    /// This property adds margin outside of the widget's normal size
151    /// request, the margin will be added in addition to the size from
152    /// [`WidgetExt::set_size_request()`][crate::prelude::WidgetExt::set_size_request()] for example.
153    ///
154    /// Readable | Writable
155    ///
156    ///
157    /// #### `margin-right`
158    ///  Margin on right side of widget.
159    ///
160    /// This property adds margin outside of the widget's normal size
161    /// request, the margin will be added in addition to the size from
162    /// [`WidgetExt::set_size_request()`][crate::prelude::WidgetExt::set_size_request()] for example.
163    ///
164    /// Readable | Writable
165    ///
166    ///
167    /// #### `margin-start`
168    ///  Margin on start of widget, horizontally. This property supports
169    /// left-to-right and right-to-left text directions.
170    ///
171    /// This property adds margin outside of the widget's normal size
172    /// request, the margin will be added in addition to the size from
173    /// [`WidgetExt::set_size_request()`][crate::prelude::WidgetExt::set_size_request()] for example.
174    ///
175    /// Readable | Writable
176    ///
177    ///
178    /// #### `margin-top`
179    ///  Margin on top side of widget.
180    ///
181    /// This property adds margin outside of the widget's normal size
182    /// request, the margin will be added in addition to the size from
183    /// [`WidgetExt::set_size_request()`][crate::prelude::WidgetExt::set_size_request()] for example.
184    ///
185    /// Readable | Writable
186    ///
187    ///
188    /// #### `name`
189    ///  Readable | Writable
190    ///
191    ///
192    /// #### `no-show-all`
193    ///  Readable | Writable
194    ///
195    ///
196    /// #### `opacity`
197    ///  The requested opacity of the widget. See [`WidgetExt::set_opacity()`][crate::prelude::WidgetExt::set_opacity()] for
198    /// more details about window opacity.
199    ///
200    /// Before 3.8 this was only available in GtkWindow
201    ///
202    /// Readable | Writable
203    ///
204    ///
205    /// #### `parent`
206    ///  Readable | Writable
207    ///
208    ///
209    /// #### `receives-default`
210    ///  Readable | Writable
211    ///
212    ///
213    /// #### `scale-factor`
214    ///  The scale factor of the widget. See [`WidgetExt::scale_factor()`][crate::prelude::WidgetExt::scale_factor()] for
215    /// more details about widget scaling.
216    ///
217    /// Readable
218    ///
219    ///
220    /// #### `sensitive`
221    ///  Readable | Writable
222    ///
223    ///
224    /// #### `style`
225    ///  The style of the widget, which contains information about how it will look (colors, etc).
226    ///
227    /// Readable | Writable
228    ///
229    ///
230    /// #### `tooltip-markup`
231    ///  Sets the text of tooltip to be the given string, which is marked up
232    /// with the [Pango text markup language][PangoMarkupFormat].
233    /// Also see [`Tooltip::set_markup()`][crate::Tooltip::set_markup()].
234    ///
235    /// This is a convenience property which will take care of getting the
236    /// tooltip shown if the given string is not [`None`]: [`has-tooltip`][struct@crate::Widget#has-tooltip]
237    /// will automatically be set to [`true`] and there will be taken care of
238    /// [`query-tooltip`][struct@crate::Widget#query-tooltip] in the default signal handler.
239    ///
240    /// Note that if both [`tooltip-text`][struct@crate::Widget#tooltip-text] and [`tooltip-markup`][struct@crate::Widget#tooltip-markup]
241    /// are set, the last one wins.
242    ///
243    /// Readable | Writable
244    ///
245    ///
246    /// #### `tooltip-text`
247    ///  Sets the text of tooltip to be the given string.
248    ///
249    /// Also see [`Tooltip::set_text()`][crate::Tooltip::set_text()].
250    ///
251    /// This is a convenience property which will take care of getting the
252    /// tooltip shown if the given string is not [`None`]: [`has-tooltip`][struct@crate::Widget#has-tooltip]
253    /// will automatically be set to [`true`] and there will be taken care of
254    /// [`query-tooltip`][struct@crate::Widget#query-tooltip] in the default signal handler.
255    ///
256    /// Note that if both [`tooltip-text`][struct@crate::Widget#tooltip-text] and [`tooltip-markup`][struct@crate::Widget#tooltip-markup]
257    /// are set, the last one wins.
258    ///
259    /// Readable | Writable
260    ///
261    ///
262    /// #### `valign`
263    ///  How to distribute vertical space if widget gets extra space, see [`Align`][crate::Align]
264    ///
265    /// Readable | Writable
266    ///
267    ///
268    /// #### `vexpand`
269    ///  Whether to expand vertically. See [`WidgetExt::set_vexpand()`][crate::prelude::WidgetExt::set_vexpand()].
270    ///
271    /// Readable | Writable
272    ///
273    ///
274    /// #### `vexpand-set`
275    ///  Whether to use the [`vexpand`][struct@crate::Widget#vexpand] property. See [`WidgetExt::is_vexpand_set()`][crate::prelude::WidgetExt::is_vexpand_set()].
276    ///
277    /// Readable | Writable
278    ///
279    ///
280    /// #### `visible`
281    ///  Readable | Writable
282    ///
283    ///
284    /// #### `width-request`
285    ///  Readable | Writable
286    ///
287    ///
288    /// #### `window`
289    ///  The widget's window if it is realized, [`None`] otherwise.
290    ///
291    /// Readable
292    /// </details>
293    ///
294    /// # Implements
295    ///
296    /// [`InvisibleExt`][trait@crate::prelude::InvisibleExt], [`WidgetExt`][trait@crate::prelude::WidgetExt], [`trait@glib::ObjectExt`], [`BuildableExt`][trait@crate::prelude::BuildableExt], [`InvisibleExtManual`][trait@crate::prelude::InvisibleExtManual], [`WidgetExtManual`][trait@crate::prelude::WidgetExtManual], [`BuildableExtManual`][trait@crate::prelude::BuildableExtManual]
297    #[doc(alias = "GtkInvisible")]
298    pub struct Invisible(Object<ffi::GtkInvisible, ffi::GtkInvisibleClass>) @extends Widget, @implements Buildable;
299
300    match fn {
301        type_ => || ffi::gtk_invisible_get_type(),
302    }
303}
304
305impl Invisible {
306    pub const NONE: Option<&'static Invisible> = None;
307
308    /// Creates a new [`Invisible`][crate::Invisible].
309    ///
310    /// # Returns
311    ///
312    /// a new [`Invisible`][crate::Invisible].
313    #[doc(alias = "gtk_invisible_new")]
314    pub fn new() -> Invisible {
315        assert_initialized_main_thread!();
316        unsafe { Widget::from_glib_none(ffi::gtk_invisible_new()).unsafe_cast() }
317    }
318
319    /// Creates a new [`Invisible`][crate::Invisible] object for a specified screen
320    /// ## `screen`
321    /// a [`gdk::Screen`][crate::gdk::Screen] which identifies on which
322    ///  the new [`Invisible`][crate::Invisible] will be created.
323    ///
324    /// # Returns
325    ///
326    /// a newly created [`Invisible`][crate::Invisible] object
327    #[doc(alias = "gtk_invisible_new_for_screen")]
328    #[doc(alias = "new_for_screen")]
329    pub fn for_screen(screen: &gdk::Screen) -> Invisible {
330        assert_initialized_main_thread!();
331        unsafe {
332            Widget::from_glib_none(ffi::gtk_invisible_new_for_screen(screen.to_glib_none().0))
333                .unsafe_cast()
334        }
335    }
336
337    // rustdoc-stripper-ignore-next
338    /// Creates a new builder-pattern struct instance to construct [`Invisible`] objects.
339    ///
340    /// This method returns an instance of [`InvisibleBuilder`](crate::builders::InvisibleBuilder) which can be used to create [`Invisible`] objects.
341    pub fn builder() -> InvisibleBuilder {
342        InvisibleBuilder::new()
343    }
344}
345
346impl Default for Invisible {
347    fn default() -> Self {
348        Self::new()
349    }
350}
351
352// rustdoc-stripper-ignore-next
353/// A [builder-pattern] type to construct [`Invisible`] objects.
354///
355/// [builder-pattern]: https://doc.rust-lang.org/1.0.0/style/ownership/builders.html
356#[must_use = "The builder must be built to be used"]
357pub struct InvisibleBuilder {
358    builder: glib::object::ObjectBuilder<'static, Invisible>,
359}
360
361impl InvisibleBuilder {
362    fn new() -> Self {
363        Self {
364            builder: glib::object::Object::builder(),
365        }
366    }
367
368    pub fn screen(self, screen: &gdk::Screen) -> Self {
369        Self {
370            builder: self.builder.property("screen", screen.clone()),
371        }
372    }
373
374    pub fn app_paintable(self, app_paintable: bool) -> Self {
375        Self {
376            builder: self.builder.property("app-paintable", app_paintable),
377        }
378    }
379
380    pub fn can_default(self, can_default: bool) -> Self {
381        Self {
382            builder: self.builder.property("can-default", can_default),
383        }
384    }
385
386    pub fn can_focus(self, can_focus: bool) -> Self {
387        Self {
388            builder: self.builder.property("can-focus", can_focus),
389        }
390    }
391
392    pub fn events(self, events: gdk::EventMask) -> Self {
393        Self {
394            builder: self.builder.property("events", events),
395        }
396    }
397
398    /// Whether to expand in both directions. Setting this sets both [`hexpand`][struct@crate::Widget#hexpand] and [`vexpand`][struct@crate::Widget#vexpand]
399    pub fn expand(self, expand: bool) -> Self {
400        Self {
401            builder: self.builder.property("expand", expand),
402        }
403    }
404
405    /// Whether the widget should grab focus when it is clicked with the mouse.
406    ///
407    /// This property is only relevant for widgets that can take focus.
408    ///
409    /// Before 3.20, several widgets (GtkButton, GtkFileChooserButton,
410    /// GtkComboBox) implemented this property individually.
411    pub fn focus_on_click(self, focus_on_click: bool) -> Self {
412        Self {
413            builder: self.builder.property("focus-on-click", focus_on_click),
414        }
415    }
416
417    /// How to distribute horizontal space if widget gets extra space, see [`Align`][crate::Align]
418    pub fn halign(self, halign: Align) -> Self {
419        Self {
420            builder: self.builder.property("halign", halign),
421        }
422    }
423
424    pub fn has_default(self, has_default: bool) -> Self {
425        Self {
426            builder: self.builder.property("has-default", has_default),
427        }
428    }
429
430    pub fn has_focus(self, has_focus: bool) -> Self {
431        Self {
432            builder: self.builder.property("has-focus", has_focus),
433        }
434    }
435
436    /// Enables or disables the emission of [`query-tooltip`][struct@crate::Widget#query-tooltip] on `widget`.
437    /// A value of [`true`] indicates that `widget` can have a tooltip, in this case
438    /// the widget will be queried using [`query-tooltip`][struct@crate::Widget#query-tooltip] to determine
439    /// whether it will provide a tooltip or not.
440    ///
441    /// Note that setting this property to [`true`] for the first time will change
442    /// the event masks of the GdkWindows of this widget to include leave-notify
443    /// and motion-notify events. This cannot and will not be undone when the
444    /// property is set to [`false`] again.
445    pub fn has_tooltip(self, has_tooltip: bool) -> Self {
446        Self {
447            builder: self.builder.property("has-tooltip", has_tooltip),
448        }
449    }
450
451    pub fn height_request(self, height_request: i32) -> Self {
452        Self {
453            builder: self.builder.property("height-request", height_request),
454        }
455    }
456
457    /// Whether to expand horizontally. See [`WidgetExt::set_hexpand()`][crate::prelude::WidgetExt::set_hexpand()].
458    pub fn hexpand(self, hexpand: bool) -> Self {
459        Self {
460            builder: self.builder.property("hexpand", hexpand),
461        }
462    }
463
464    /// Whether to use the [`hexpand`][struct@crate::Widget#hexpand] property. See [`WidgetExt::is_hexpand_set()`][crate::prelude::WidgetExt::is_hexpand_set()].
465    pub fn hexpand_set(self, hexpand_set: bool) -> Self {
466        Self {
467            builder: self.builder.property("hexpand-set", hexpand_set),
468        }
469    }
470
471    pub fn is_focus(self, is_focus: bool) -> Self {
472        Self {
473            builder: self.builder.property("is-focus", is_focus),
474        }
475    }
476
477    /// Sets all four sides' margin at once. If read, returns max
478    /// margin on any side.
479    pub fn margin(self, margin: i32) -> Self {
480        Self {
481            builder: self.builder.property("margin", margin),
482        }
483    }
484
485    /// Margin on bottom side of widget.
486    ///
487    /// This property adds margin outside of the widget's normal size
488    /// request, the margin will be added in addition to the size from
489    /// [`WidgetExt::set_size_request()`][crate::prelude::WidgetExt::set_size_request()] for example.
490    pub fn margin_bottom(self, margin_bottom: i32) -> Self {
491        Self {
492            builder: self.builder.property("margin-bottom", margin_bottom),
493        }
494    }
495
496    /// Margin on end of widget, horizontally. This property supports
497    /// left-to-right and right-to-left text directions.
498    ///
499    /// This property adds margin outside of the widget's normal size
500    /// request, the margin will be added in addition to the size from
501    /// [`WidgetExt::set_size_request()`][crate::prelude::WidgetExt::set_size_request()] for example.
502    pub fn margin_end(self, margin_end: i32) -> Self {
503        Self {
504            builder: self.builder.property("margin-end", margin_end),
505        }
506    }
507
508    /// Margin on start of widget, horizontally. This property supports
509    /// left-to-right and right-to-left text directions.
510    ///
511    /// This property adds margin outside of the widget's normal size
512    /// request, the margin will be added in addition to the size from
513    /// [`WidgetExt::set_size_request()`][crate::prelude::WidgetExt::set_size_request()] for example.
514    pub fn margin_start(self, margin_start: i32) -> Self {
515        Self {
516            builder: self.builder.property("margin-start", margin_start),
517        }
518    }
519
520    /// Margin on top side of widget.
521    ///
522    /// This property adds margin outside of the widget's normal size
523    /// request, the margin will be added in addition to the size from
524    /// [`WidgetExt::set_size_request()`][crate::prelude::WidgetExt::set_size_request()] for example.
525    pub fn margin_top(self, margin_top: i32) -> Self {
526        Self {
527            builder: self.builder.property("margin-top", margin_top),
528        }
529    }
530
531    pub fn name(self, name: impl Into<glib::GString>) -> Self {
532        Self {
533            builder: self.builder.property("name", name.into()),
534        }
535    }
536
537    pub fn no_show_all(self, no_show_all: bool) -> Self {
538        Self {
539            builder: self.builder.property("no-show-all", no_show_all),
540        }
541    }
542
543    /// The requested opacity of the widget. See [`WidgetExt::set_opacity()`][crate::prelude::WidgetExt::set_opacity()] for
544    /// more details about window opacity.
545    ///
546    /// Before 3.8 this was only available in GtkWindow
547    pub fn opacity(self, opacity: f64) -> Self {
548        Self {
549            builder: self.builder.property("opacity", opacity),
550        }
551    }
552
553    pub fn parent(self, parent: &impl IsA<Container>) -> Self {
554        Self {
555            builder: self.builder.property("parent", parent.clone().upcast()),
556        }
557    }
558
559    pub fn receives_default(self, receives_default: bool) -> Self {
560        Self {
561            builder: self.builder.property("receives-default", receives_default),
562        }
563    }
564
565    pub fn sensitive(self, sensitive: bool) -> Self {
566        Self {
567            builder: self.builder.property("sensitive", sensitive),
568        }
569    }
570
571    /// Sets the text of tooltip to be the given string, which is marked up
572    /// with the [Pango text markup language][PangoMarkupFormat].
573    /// Also see [`Tooltip::set_markup()`][crate::Tooltip::set_markup()].
574    ///
575    /// This is a convenience property which will take care of getting the
576    /// tooltip shown if the given string is not [`None`]: [`has-tooltip`][struct@crate::Widget#has-tooltip]
577    /// will automatically be set to [`true`] and there will be taken care of
578    /// [`query-tooltip`][struct@crate::Widget#query-tooltip] in the default signal handler.
579    ///
580    /// Note that if both [`tooltip-text`][struct@crate::Widget#tooltip-text] and [`tooltip-markup`][struct@crate::Widget#tooltip-markup]
581    /// are set, the last one wins.
582    pub fn tooltip_markup(self, tooltip_markup: impl Into<glib::GString>) -> Self {
583        Self {
584            builder: self
585                .builder
586                .property("tooltip-markup", tooltip_markup.into()),
587        }
588    }
589
590    /// Sets the text of tooltip to be the given string.
591    ///
592    /// Also see [`Tooltip::set_text()`][crate::Tooltip::set_text()].
593    ///
594    /// This is a convenience property which will take care of getting the
595    /// tooltip shown if the given string is not [`None`]: [`has-tooltip`][struct@crate::Widget#has-tooltip]
596    /// will automatically be set to [`true`] and there will be taken care of
597    /// [`query-tooltip`][struct@crate::Widget#query-tooltip] in the default signal handler.
598    ///
599    /// Note that if both [`tooltip-text`][struct@crate::Widget#tooltip-text] and [`tooltip-markup`][struct@crate::Widget#tooltip-markup]
600    /// are set, the last one wins.
601    pub fn tooltip_text(self, tooltip_text: impl Into<glib::GString>) -> Self {
602        Self {
603            builder: self.builder.property("tooltip-text", tooltip_text.into()),
604        }
605    }
606
607    /// How to distribute vertical space if widget gets extra space, see [`Align`][crate::Align]
608    pub fn valign(self, valign: Align) -> Self {
609        Self {
610            builder: self.builder.property("valign", valign),
611        }
612    }
613
614    /// Whether to expand vertically. See [`WidgetExt::set_vexpand()`][crate::prelude::WidgetExt::set_vexpand()].
615    pub fn vexpand(self, vexpand: bool) -> Self {
616        Self {
617            builder: self.builder.property("vexpand", vexpand),
618        }
619    }
620
621    /// Whether to use the [`vexpand`][struct@crate::Widget#vexpand] property. See [`WidgetExt::is_vexpand_set()`][crate::prelude::WidgetExt::is_vexpand_set()].
622    pub fn vexpand_set(self, vexpand_set: bool) -> Self {
623        Self {
624            builder: self.builder.property("vexpand-set", vexpand_set),
625        }
626    }
627
628    pub fn visible(self, visible: bool) -> Self {
629        Self {
630            builder: self.builder.property("visible", visible),
631        }
632    }
633
634    pub fn width_request(self, width_request: i32) -> Self {
635        Self {
636            builder: self.builder.property("width-request", width_request),
637        }
638    }
639
640    // rustdoc-stripper-ignore-next
641    /// Build the [`Invisible`].
642    #[must_use = "Building the object from the builder is usually expensive and is not expected to have side effects"]
643    pub fn build(self) -> Invisible {
644        assert_initialized_main_thread!();
645        self.builder.build()
646    }
647}
648
649/// Trait containing all [`struct@Invisible`] methods.
650///
651/// # Implementors
652///
653/// [`Invisible`][struct@crate::Invisible]
654pub trait InvisibleExt: IsA<Invisible> + 'static {
655    /// Sets the [`gdk::Screen`][crate::gdk::Screen] where the [`Invisible`][crate::Invisible] object will be displayed.
656    /// ## `screen`
657    /// a [`gdk::Screen`][crate::gdk::Screen].
658    #[doc(alias = "gtk_invisible_set_screen")]
659    #[doc(alias = "screen")]
660    fn set_screen(&self, screen: &gdk::Screen) {
661        unsafe {
662            ffi::gtk_invisible_set_screen(self.as_ref().to_glib_none().0, screen.to_glib_none().0);
663        }
664    }
665
666    #[doc(alias = "screen")]
667    fn connect_screen_notify<F: Fn(&Self) + 'static>(&self, f: F) -> SignalHandlerId {
668        unsafe extern "C" fn notify_screen_trampoline<P: IsA<Invisible>, F: Fn(&P) + 'static>(
669            this: *mut ffi::GtkInvisible,
670            _param_spec: glib::ffi::gpointer,
671            f: glib::ffi::gpointer,
672        ) {
673            unsafe {
674                let f: &F = &*(f as *const F);
675                f(Invisible::from_glib_borrow(this).unsafe_cast_ref())
676            }
677        }
678        unsafe {
679            let f: Box_<F> = Box_::new(f);
680            connect_raw(
681                self.as_ptr() as *mut _,
682                c"notify::screen".as_ptr(),
683                Some(std::mem::transmute::<*const (), unsafe extern "C" fn()>(
684                    notify_screen_trampoline::<Self, F> as *const (),
685                )),
686                Box_::into_raw(f),
687            )
688        }
689    }
690}
691
692impl<O: IsA<Invisible>> InvisibleExt for O {}