Skip to main content

gtk/auto/
icon_theme.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::{IconInfo, IconLookupFlags, ffi};
6use glib::{
7    object::ObjectType as _,
8    prelude::*,
9    signal::{SignalHandlerId, connect_raw},
10    translate::*,
11};
12use std::boxed::Box as Box_;
13
14glib::wrapper! {
15    /// message);
16    ///  g_error_free (error);
17    ///  }
18    /// else
19    ///  {
20    ///  // Use the pixbuf
21    ///  g_object_unref (pixbuf);
22    ///  }
23    /// ]|
24    ///
25    /// ## Signals
26    ///
27    ///
28    /// #### `changed`
29    ///  Emitted when the current icon theme is switched or GTK+ detects
30    /// that a change has occurred in the contents of the current
31    /// icon theme.
32    ///
33    ///
34    ///
35    /// # Implements
36    ///
37    /// [`IconThemeExt`][trait@crate::prelude::IconThemeExt], [`trait@glib::ObjectExt`]
38    #[doc(alias = "GtkIconTheme")]
39    pub struct IconTheme(Object<ffi::GtkIconTheme, ffi::GtkIconThemeClass>);
40
41    match fn {
42        type_ => || ffi::gtk_icon_theme_get_type(),
43    }
44}
45
46impl IconTheme {
47    pub const NONE: Option<&'static IconTheme> = None;
48
49    /// Creates a new icon theme object. Icon theme objects are used
50    /// to lookup up an icon by name in a particular icon theme.
51    /// Usually, you’ll want to use [`default()`][Self::default()]
52    /// or [`for_screen()`][Self::for_screen()] rather than creating
53    /// a new icon theme object for scratch.
54    ///
55    /// # Returns
56    ///
57    /// the newly created [`IconTheme`][crate::IconTheme] object.
58    #[doc(alias = "gtk_icon_theme_new")]
59    pub fn new() -> IconTheme {
60        assert_initialized_main_thread!();
61        unsafe { from_glib_full(ffi::gtk_icon_theme_new()) }
62    }
63
64    /// Gets the icon theme for the default screen. See
65    /// [`for_screen()`][Self::for_screen()].
66    ///
67    /// # Returns
68    ///
69    /// A unique [`IconTheme`][crate::IconTheme] associated with
70    ///  the default screen. This icon theme is associated with
71    ///  the screen and can be used as long as the screen
72    ///  is open. Do not ref or unref it.
73    #[doc(alias = "gtk_icon_theme_get_default")]
74    #[doc(alias = "get_default")]
75    #[allow(clippy::should_implement_trait)]
76    pub fn default() -> Option<IconTheme> {
77        assert_initialized_main_thread!();
78        unsafe { from_glib_none(ffi::gtk_icon_theme_get_default()) }
79    }
80
81    /// Gets the icon theme object associated with `screen`; if this
82    /// function has not previously been called for the given
83    /// screen, a new icon theme object will be created and
84    /// associated with the screen. Icon theme objects are
85    /// fairly expensive to create, so using this function
86    /// is usually a better choice than calling than [`new()`][Self::new()]
87    /// and setting the screen yourself; by using this function
88    /// a single icon theme object will be shared between users.
89    /// ## `screen`
90    /// a [`gdk::Screen`][crate::gdk::Screen]
91    ///
92    /// # Returns
93    ///
94    /// A unique [`IconTheme`][crate::IconTheme] associated with
95    ///  the given screen. This icon theme is associated with
96    ///  the screen and can be used as long as the screen
97    ///  is open. Do not ref or unref it.
98    #[doc(alias = "gtk_icon_theme_get_for_screen")]
99    #[doc(alias = "get_for_screen")]
100    pub fn for_screen(screen: &gdk::Screen) -> Option<IconTheme> {
101        assert_initialized_main_thread!();
102        unsafe { from_glib_none(ffi::gtk_icon_theme_get_for_screen(screen.to_glib_none().0)) }
103    }
104}
105
106impl Default for IconTheme {
107    fn default() -> Self {
108        Self::new()
109    }
110}
111
112/// Trait containing all [`struct@IconTheme`] methods.
113///
114/// # Implementors
115///
116/// [`IconTheme`][struct@crate::IconTheme]
117pub trait IconThemeExt: IsA<IconTheme> + 'static {
118    /// Adds a resource path that will be looked at when looking
119    /// for icons, similar to search paths.
120    ///
121    /// This function should be used to make application-specific icons
122    /// available as part of the icon theme.
123    ///
124    /// The resources are considered as part of the hicolor icon theme
125    /// and must be located in subdirectories that are defined in the
126    /// hicolor icon theme, such as ``path`/16x16/actions/run.png`.
127    /// Icons that are directly placed in the resource path instead
128    /// of a subdirectory are also considered as ultimate fallback.
129    /// ## `path`
130    /// a resource path
131    #[doc(alias = "gtk_icon_theme_add_resource_path")]
132    fn add_resource_path(&self, path: &str) {
133        unsafe {
134            ffi::gtk_icon_theme_add_resource_path(
135                self.as_ref().to_glib_none().0,
136                path.to_glib_none().0,
137            );
138        }
139    }
140
141    /// Appends a directory to the search path.
142    /// See `gtk_icon_theme_set_search_path()`.
143    /// ## `path`
144    /// directory name to append to the icon path
145    #[doc(alias = "gtk_icon_theme_append_search_path")]
146    fn append_search_path(&self, path: impl AsRef<std::path::Path>) {
147        unsafe {
148            ffi::gtk_icon_theme_append_search_path(
149                self.as_ref().to_glib_none().0,
150                path.as_ref().to_glib_none().0,
151            );
152        }
153    }
154
155    /// Gets the name of an icon that is representative of the
156    /// current theme (for instance, to use when presenting
157    /// a list of themes to the user.)
158    ///
159    /// # Returns
160    ///
161    /// the name of an example icon or [`None`].
162    ///  Free with `g_free()`.
163    #[doc(alias = "gtk_icon_theme_get_example_icon_name")]
164    #[doc(alias = "get_example_icon_name")]
165    fn example_icon_name(&self) -> Option<glib::GString> {
166        unsafe {
167            from_glib_full(ffi::gtk_icon_theme_get_example_icon_name(
168                self.as_ref().to_glib_none().0,
169            ))
170        }
171    }
172
173    /// Checks whether an icon theme includes an icon
174    /// for a particular name.
175    /// ## `icon_name`
176    /// the name of an icon
177    ///
178    /// # Returns
179    ///
180    /// [`true`] if `self` includes an
181    ///  icon for `icon_name`.
182    #[doc(alias = "gtk_icon_theme_has_icon")]
183    fn has_icon(&self, icon_name: &str) -> bool {
184        unsafe {
185            from_glib(ffi::gtk_icon_theme_has_icon(
186                self.as_ref().to_glib_none().0,
187                icon_name.to_glib_none().0,
188            ))
189        }
190    }
191
192    /// Gets the list of contexts available within the current
193    /// hierarchy of icon themes.
194    /// See [`list_icons()`][Self::list_icons()] for details about contexts.
195    ///
196    /// # Returns
197    ///
198    /// a `GList` list
199    ///  holding the names of all the contexts in the theme. You must first
200    ///  free each element in the list with `g_free()`, then free the list
201    ///  itself with `g_list_free()`.
202    #[doc(alias = "gtk_icon_theme_list_contexts")]
203    fn list_contexts(&self) -> Vec<glib::GString> {
204        unsafe {
205            FromGlibPtrContainer::from_glib_full(ffi::gtk_icon_theme_list_contexts(
206                self.as_ref().to_glib_none().0,
207            ))
208        }
209    }
210
211    /// Lists the icons in the current icon theme. Only a subset
212    /// of the icons can be listed by providing a context string.
213    /// The set of values for the context string is system dependent,
214    /// but will typically include such values as “Applications” and
215    /// “MimeTypes”. Contexts are explained in the
216    /// [Icon Theme Specification](http://www.freedesktop.org/wiki/Specifications/icon-theme-spec).
217    /// The standard contexts are listed in the
218    /// [Icon Naming Specification](http://www.freedesktop.org/wiki/Specifications/icon-naming-spec).
219    /// Also see [`list_contexts()`][Self::list_contexts()].
220    /// ## `context`
221    /// a string identifying a particular type of
222    ///  icon, or [`None`] to list all icons.
223    ///
224    /// # Returns
225    ///
226    /// a `GList` list
227    ///  holding the names of all the icons in the theme. You must
228    ///  first free each element in the list with `g_free()`, then
229    ///  free the list itself with `g_list_free()`.
230    #[doc(alias = "gtk_icon_theme_list_icons")]
231    fn list_icons(&self, context: Option<&str>) -> Vec<glib::GString> {
232        unsafe {
233            FromGlibPtrContainer::from_glib_full(ffi::gtk_icon_theme_list_icons(
234                self.as_ref().to_glib_none().0,
235                context.to_glib_none().0,
236            ))
237        }
238    }
239
240    /// Looks up an icon in an icon theme, scales it to the given size
241    /// and renders it into a pixbuf. This is a convenience function;
242    /// if more details about the icon are needed, use
243    /// [`lookup_icon()`][Self::lookup_icon()] followed by [`IconInfo::load_icon()`][crate::IconInfo::load_icon()].
244    ///
245    /// Note that you probably want to listen for icon theme changes and
246    /// update the icon. This is usually done by connecting to the
247    /// GtkWidget::style-set signal. If for some reason you do not want to
248    /// update the icon when the icon theme changes, you should consider
249    /// using `gdk_pixbuf_copy()` to make a private copy of the pixbuf
250    /// returned by this function. Otherwise GTK+ may need to keep the old
251    /// icon theme loaded, which would be a waste of memory.
252    /// ## `icon_name`
253    /// the name of the icon to lookup
254    /// ## `size`
255    /// the desired icon size. The resulting icon may not be
256    ///  exactly this size; see [`IconInfo::load_icon()`][crate::IconInfo::load_icon()].
257    /// ## `flags`
258    /// flags modifying the behavior of the icon lookup
259    ///
260    /// # Returns
261    ///
262    /// the rendered icon; this may be
263    ///  a newly created icon or a new reference to an internal icon, so
264    ///  you must not modify the icon. Use `g_object_unref()` to release
265    ///  your reference to the icon. [`None`] if the icon isn’t found.
266    #[doc(alias = "gtk_icon_theme_load_icon")]
267    fn load_icon(
268        &self,
269        icon_name: &str,
270        size: i32,
271        flags: IconLookupFlags,
272    ) -> Result<Option<gdk_pixbuf::Pixbuf>, glib::Error> {
273        unsafe {
274            let mut error = std::ptr::null_mut();
275            let ret = ffi::gtk_icon_theme_load_icon(
276                self.as_ref().to_glib_none().0,
277                icon_name.to_glib_none().0,
278                size,
279                flags.into_glib(),
280                &mut error,
281            );
282            if error.is_null() {
283                Ok(from_glib_full(ret))
284            } else {
285                Err(from_glib_full(error))
286            }
287        }
288    }
289
290    /// Looks up an icon in an icon theme for a particular window scale,
291    /// scales it to the given size and renders it into a pixbuf. This is a
292    /// convenience function; if more details about the icon are needed,
293    /// use [`lookup_icon()`][Self::lookup_icon()] followed by
294    /// [`IconInfo::load_icon()`][crate::IconInfo::load_icon()].
295    ///
296    /// Note that you probably want to listen for icon theme changes and
297    /// update the icon. This is usually done by connecting to the
298    /// GtkWidget::style-set signal. If for some reason you do not want to
299    /// update the icon when the icon theme changes, you should consider
300    /// using `gdk_pixbuf_copy()` to make a private copy of the pixbuf
301    /// returned by this function. Otherwise GTK+ may need to keep the old
302    /// icon theme loaded, which would be a waste of memory.
303    /// ## `icon_name`
304    /// the name of the icon to lookup
305    /// ## `size`
306    /// the desired icon size. The resulting icon may not be
307    ///  exactly this size; see [`IconInfo::load_icon()`][crate::IconInfo::load_icon()].
308    /// ## `scale`
309    /// desired scale
310    /// ## `flags`
311    /// flags modifying the behavior of the icon lookup
312    ///
313    /// # Returns
314    ///
315    /// the rendered icon; this may be
316    ///  a newly created icon or a new reference to an internal icon, so
317    ///  you must not modify the icon. Use `g_object_unref()` to release
318    ///  your reference to the icon. [`None`] if the icon isn’t found.
319    #[doc(alias = "gtk_icon_theme_load_icon_for_scale")]
320    fn load_icon_for_scale(
321        &self,
322        icon_name: &str,
323        size: i32,
324        scale: i32,
325        flags: IconLookupFlags,
326    ) -> Result<Option<gdk_pixbuf::Pixbuf>, glib::Error> {
327        unsafe {
328            let mut error = std::ptr::null_mut();
329            let ret = ffi::gtk_icon_theme_load_icon_for_scale(
330                self.as_ref().to_glib_none().0,
331                icon_name.to_glib_none().0,
332                size,
333                scale,
334                flags.into_glib(),
335                &mut error,
336            );
337            if error.is_null() {
338                Ok(from_glib_full(ret))
339            } else {
340                Err(from_glib_full(error))
341            }
342        }
343    }
344
345    /// Looks up an icon in an icon theme for a particular window scale,
346    /// scales it to the given size and renders it into a cairo surface. This is a
347    /// convenience function; if more details about the icon are needed,
348    /// use [`lookup_icon()`][Self::lookup_icon()] followed by
349    /// [`IconInfo::load_surface()`][crate::IconInfo::load_surface()].
350    ///
351    /// Note that you probably want to listen for icon theme changes and
352    /// update the icon. This is usually done by connecting to the
353    /// GtkWidget::style-set signal.
354    /// ## `icon_name`
355    /// the name of the icon to lookup
356    /// ## `size`
357    /// the desired icon size. The resulting icon may not be
358    ///  exactly this size; see [`IconInfo::load_icon()`][crate::IconInfo::load_icon()].
359    /// ## `scale`
360    /// desired scale
361    /// ## `for_window`
362    /// [`gdk::Window`][crate::gdk::Window] to optimize drawing for, or [`None`]
363    /// ## `flags`
364    /// flags modifying the behavior of the icon lookup
365    ///
366    /// # Returns
367    ///
368    /// the rendered icon; this may be
369    ///  a newly created icon or a new reference to an internal icon, so
370    ///  you must not modify the icon. Use `cairo_surface_destroy()` to
371    ///  release your reference to the icon. [`None`] if the icon isn’t
372    ///  found.
373    #[doc(alias = "gtk_icon_theme_load_surface")]
374    fn load_surface(
375        &self,
376        icon_name: &str,
377        size: i32,
378        scale: i32,
379        for_window: Option<&gdk::Window>,
380        flags: IconLookupFlags,
381    ) -> Result<Option<cairo::Surface>, glib::Error> {
382        unsafe {
383            let mut error = std::ptr::null_mut();
384            let ret = ffi::gtk_icon_theme_load_surface(
385                self.as_ref().to_glib_none().0,
386                icon_name.to_glib_none().0,
387                size,
388                scale,
389                for_window.to_glib_none().0,
390                flags.into_glib(),
391                &mut error,
392            );
393            if error.is_null() {
394                Ok(from_glib_full(ret))
395            } else {
396                Err(from_glib_full(error))
397            }
398        }
399    }
400
401    /// Looks up an icon and returns a [`IconInfo`][crate::IconInfo] containing information
402    /// such as the filename of the icon. The icon can then be rendered
403    /// into a pixbuf using [`IconInfo::load_icon()`][crate::IconInfo::load_icon()].
404    ///
405    /// When rendering on displays with high pixel densities you should not
406    /// use a `size` multiplied by the scaling factor returned by functions
407    /// like [`Window::scale_factor()`][crate::gdk::Window::scale_factor()]. Instead, you should use
408    /// [`lookup_by_gicon_for_scale()`][Self::lookup_by_gicon_for_scale()], as the assets loaded
409    /// for a given scaling factor may be different.
410    /// ## `icon`
411    /// the [`gio::Icon`][crate::gio::Icon] to look up
412    /// ## `size`
413    /// desired icon size
414    /// ## `flags`
415    /// flags modifying the behavior of the icon lookup
416    ///
417    /// # Returns
418    ///
419    /// a [`IconInfo`][crate::IconInfo] containing
420    ///  information about the icon, or [`None`] if the icon wasn’t
421    ///  found. Unref with `g_object_unref()`
422    #[doc(alias = "gtk_icon_theme_lookup_by_gicon")]
423    fn lookup_by_gicon(
424        &self,
425        icon: &impl IsA<gio::Icon>,
426        size: i32,
427        flags: IconLookupFlags,
428    ) -> Option<IconInfo> {
429        unsafe {
430            from_glib_full(ffi::gtk_icon_theme_lookup_by_gicon(
431                self.as_ref().to_glib_none().0,
432                icon.as_ref().to_glib_none().0,
433                size,
434                flags.into_glib(),
435            ))
436        }
437    }
438
439    /// Looks up an icon and returns a [`IconInfo`][crate::IconInfo] containing information
440    /// such as the filename of the icon. The icon can then be rendered into
441    /// a pixbuf using [`IconInfo::load_icon()`][crate::IconInfo::load_icon()].
442    /// ## `icon`
443    /// the [`gio::Icon`][crate::gio::Icon] to look up
444    /// ## `size`
445    /// desired icon size
446    /// ## `scale`
447    /// the desired scale
448    /// ## `flags`
449    /// flags modifying the behavior of the icon lookup
450    ///
451    /// # Returns
452    ///
453    /// a [`IconInfo`][crate::IconInfo] containing
454    ///  information about the icon, or [`None`] if the icon wasn’t
455    ///  found. Unref with `g_object_unref()`
456    #[doc(alias = "gtk_icon_theme_lookup_by_gicon_for_scale")]
457    fn lookup_by_gicon_for_scale(
458        &self,
459        icon: &impl IsA<gio::Icon>,
460        size: i32,
461        scale: i32,
462        flags: IconLookupFlags,
463    ) -> Option<IconInfo> {
464        unsafe {
465            from_glib_full(ffi::gtk_icon_theme_lookup_by_gicon_for_scale(
466                self.as_ref().to_glib_none().0,
467                icon.as_ref().to_glib_none().0,
468                size,
469                scale,
470                flags.into_glib(),
471            ))
472        }
473    }
474
475    /// Looks up a named icon and returns a [`IconInfo`][crate::IconInfo] containing
476    /// information such as the filename of the icon. The icon
477    /// can then be rendered into a pixbuf using
478    /// [`IconInfo::load_icon()`][crate::IconInfo::load_icon()]. ([`load_icon()`][Self::load_icon()]
479    /// combines these two steps if all you need is the pixbuf.)
480    ///
481    /// When rendering on displays with high pixel densities you should not
482    /// use a `size` multiplied by the scaling factor returned by functions
483    /// like [`Window::scale_factor()`][crate::gdk::Window::scale_factor()]. Instead, you should use
484    /// [`lookup_icon_for_scale()`][Self::lookup_icon_for_scale()], as the assets loaded
485    /// for a given scaling factor may be different.
486    /// ## `icon_name`
487    /// the name of the icon to lookup
488    /// ## `size`
489    /// desired icon size
490    /// ## `flags`
491    /// flags modifying the behavior of the icon lookup
492    ///
493    /// # Returns
494    ///
495    /// a [`IconInfo`][crate::IconInfo] object
496    ///  containing information about the icon, or [`None`] if the
497    ///  icon wasn’t found.
498    #[doc(alias = "gtk_icon_theme_lookup_icon")]
499    fn lookup_icon(&self, icon_name: &str, size: i32, flags: IconLookupFlags) -> Option<IconInfo> {
500        unsafe {
501            from_glib_full(ffi::gtk_icon_theme_lookup_icon(
502                self.as_ref().to_glib_none().0,
503                icon_name.to_glib_none().0,
504                size,
505                flags.into_glib(),
506            ))
507        }
508    }
509
510    /// Looks up a named icon for a particular window scale and returns a
511    /// [`IconInfo`][crate::IconInfo] containing information such as the filename of the
512    /// icon. The icon can then be rendered into a pixbuf using
513    /// [`IconInfo::load_icon()`][crate::IconInfo::load_icon()]. ([`load_icon()`][Self::load_icon()] combines
514    /// these two steps if all you need is the pixbuf.)
515    /// ## `icon_name`
516    /// the name of the icon to lookup
517    /// ## `size`
518    /// desired icon size
519    /// ## `scale`
520    /// the desired scale
521    /// ## `flags`
522    /// flags modifying the behavior of the icon lookup
523    ///
524    /// # Returns
525    ///
526    /// a [`IconInfo`][crate::IconInfo] object
527    ///  containing information about the icon, or [`None`] if the
528    ///  icon wasn’t found.
529    #[doc(alias = "gtk_icon_theme_lookup_icon_for_scale")]
530    fn lookup_icon_for_scale(
531        &self,
532        icon_name: &str,
533        size: i32,
534        scale: i32,
535        flags: IconLookupFlags,
536    ) -> Option<IconInfo> {
537        unsafe {
538            from_glib_full(ffi::gtk_icon_theme_lookup_icon_for_scale(
539                self.as_ref().to_glib_none().0,
540                icon_name.to_glib_none().0,
541                size,
542                scale,
543                flags.into_glib(),
544            ))
545        }
546    }
547
548    /// Prepends a directory to the search path.
549    /// See `gtk_icon_theme_set_search_path()`.
550    /// ## `path`
551    /// directory name to prepend to the icon path
552    #[doc(alias = "gtk_icon_theme_prepend_search_path")]
553    fn prepend_search_path(&self, path: impl AsRef<std::path::Path>) {
554        unsafe {
555            ffi::gtk_icon_theme_prepend_search_path(
556                self.as_ref().to_glib_none().0,
557                path.as_ref().to_glib_none().0,
558            );
559        }
560    }
561
562    /// Checks to see if the icon theme has changed; if it has, any
563    /// currently cached information is discarded and will be reloaded
564    /// next time `self` is accessed.
565    ///
566    /// # Returns
567    ///
568    /// [`true`] if the icon theme has changed and needed
569    ///  to be reloaded.
570    #[doc(alias = "gtk_icon_theme_rescan_if_needed")]
571    fn rescan_if_needed(&self) -> bool {
572        unsafe {
573            from_glib(ffi::gtk_icon_theme_rescan_if_needed(
574                self.as_ref().to_glib_none().0,
575            ))
576        }
577    }
578
579    /// Sets the name of the icon theme that the [`IconTheme`][crate::IconTheme] object uses
580    /// overriding system configuration. This function cannot be called
581    /// on the icon theme objects returned from [`IconTheme::default()`][crate::IconTheme::default()]
582    /// and [`IconTheme::for_screen()`][crate::IconTheme::for_screen()].
583    /// ## `theme_name`
584    /// name of icon theme to use instead of
585    ///  configured theme, or [`None`] to unset a previously set custom theme
586    #[doc(alias = "gtk_icon_theme_set_custom_theme")]
587    fn set_custom_theme(&self, theme_name: Option<&str>) {
588        unsafe {
589            ffi::gtk_icon_theme_set_custom_theme(
590                self.as_ref().to_glib_none().0,
591                theme_name.to_glib_none().0,
592            );
593        }
594    }
595
596    /// Sets the screen for an icon theme; the screen is used
597    /// to track the user’s currently configured icon theme,
598    /// which might be different for different screens.
599    /// ## `screen`
600    /// a [`gdk::Screen`][crate::gdk::Screen]
601    #[doc(alias = "gtk_icon_theme_set_screen")]
602    fn set_screen(&self, screen: &gdk::Screen) {
603        unsafe {
604            ffi::gtk_icon_theme_set_screen(self.as_ref().to_glib_none().0, screen.to_glib_none().0);
605        }
606    }
607
608    /// Emitted when the current icon theme is switched or GTK+ detects
609    /// that a change has occurred in the contents of the current
610    /// icon theme.
611    #[doc(alias = "changed")]
612    fn connect_changed<F: Fn(&Self) + 'static>(&self, f: F) -> SignalHandlerId {
613        unsafe extern "C" fn changed_trampoline<P: IsA<IconTheme>, F: Fn(&P) + 'static>(
614            this: *mut ffi::GtkIconTheme,
615            f: glib::ffi::gpointer,
616        ) {
617            unsafe {
618                let f: &F = &*(f as *const F);
619                f(IconTheme::from_glib_borrow(this).unsafe_cast_ref())
620            }
621        }
622        unsafe {
623            let f: Box_<F> = Box_::new(f);
624            connect_raw(
625                self.as_ptr() as *mut _,
626                c"changed".as_ptr(),
627                Some(std::mem::transmute::<*const (), unsafe extern "C" fn()>(
628                    changed_trampoline::<Self, F> as *const (),
629                )),
630                Box_::into_raw(f),
631            )
632        }
633    }
634}
635
636impl<O: IsA<IconTheme>> IconThemeExt for O {}