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 {}