1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
// This file was generated by gir (https://github.com/gtk-rs/gir)
// from gir-files (https://github.com/gtk-rs/gir-files)
// DO NOT EDIT

use glib::{
    prelude::*,
    signal::{connect_raw, SignalHandlerId},
    translate::*,
};
use std::boxed::Box as Box_;

glib::wrapper! {
    ///
    ///
    /// ## Signals
    ///
    ///
    /// #### `window-manager-changed`
    ///
    #[doc(alias = "GdkX11Screen")]
    pub struct X11Screen(Object<ffi::GdkX11Screen, ffi::GdkX11ScreenClass>);

    match fn {
        type_ => || ffi::gdk_x11_screen_get_type(),
    }
}

impl X11Screen {
    /// Returns the current workspace for @self when running under a
    /// window manager that supports multiple workspaces, as described
    /// in the
    /// [Extended Window Manager Hints](http://www.freedesktop.org/Standards/wm-spec) specification.
    ///
    /// # Returns
    ///
    /// the current workspace, or 0 if workspaces are not supported
    #[doc(alias = "gdk_x11_screen_get_current_desktop")]
    #[doc(alias = "get_current_desktop")]
    pub fn current_desktop(&self) -> u32 {
        unsafe { ffi::gdk_x11_screen_get_current_desktop(self.to_glib_none().0) }
    }

    /// Returns the number of workspaces for @self when running under a
    /// window manager that supports multiple workspaces, as described
    /// in the
    /// [Extended Window Manager Hints](http://www.freedesktop.org/Standards/wm-spec) specification.
    ///
    /// # Returns
    ///
    /// the number of workspaces, or 0 if workspaces are not supported
    #[doc(alias = "gdk_x11_screen_get_number_of_desktops")]
    #[doc(alias = "get_number_of_desktops")]
    pub fn number_of_desktops(&self) -> u32 {
        unsafe { ffi::gdk_x11_screen_get_number_of_desktops(self.to_glib_none().0) }
    }

    /// Returns the index of a [`X11Screen`][crate::X11Screen].
    ///
    /// # Returns
    ///
    /// the position of @self among the screens
    ///   of its display
    #[doc(alias = "gdk_x11_screen_get_screen_number")]
    #[doc(alias = "get_screen_number")]
    pub fn screen_number(&self) -> i32 {
        unsafe { ffi::gdk_x11_screen_get_screen_number(self.to_glib_none().0) }
    }

    /// Returns the name of the window manager for @self.
    ///
    /// # Returns
    ///
    /// the name of the window manager screen @self, or
    /// "unknown" if the window manager is unknown. The string is owned by GDK
    /// and should not be freed.
    #[doc(alias = "gdk_x11_screen_get_window_manager_name")]
    #[doc(alias = "get_window_manager_name")]
    pub fn window_manager_name(&self) -> glib::GString {
        unsafe {
            from_glib_none(ffi::gdk_x11_screen_get_window_manager_name(
                self.to_glib_none().0,
            ))
        }
    }

    /// This function is specific to the X11 backend of GDK, and indicates
    /// whether the window manager supports a certain hint from the
    /// [Extended Window Manager Hints](http://www.freedesktop.org/Standards/wm-spec) specification.
    ///
    /// When using this function, keep in mind that the window manager
    /// can change over time; so you shouldn’t use this function in
    /// a way that impacts persistent application state. A common bug
    /// is that your application can start up before the window manager
    /// does when the user logs in, and before the window manager starts
    /// gdk_x11_screen_supports_net_wm_hint() will return [`false`] for every property.
    /// You can monitor the window_manager_changed signal on [`X11Screen`][crate::X11Screen] to detect
    /// a window manager change.
    /// ## `property_name`
    /// name of the WM property
    ///
    /// # Returns
    ///
    /// [`true`] if the window manager supports @property
    #[doc(alias = "gdk_x11_screen_supports_net_wm_hint")]
    pub fn supports_net_wm_hint(&self, property_name: &str) -> bool {
        unsafe {
            from_glib(ffi::gdk_x11_screen_supports_net_wm_hint(
                self.to_glib_none().0,
                property_name.to_glib_none().0,
            ))
        }
    }

    #[doc(alias = "window-manager-changed")]
    pub fn connect_window_manager_changed<F: Fn(&Self) + 'static>(&self, f: F) -> SignalHandlerId {
        unsafe extern "C" fn window_manager_changed_trampoline<F: Fn(&X11Screen) + 'static>(
            this: *mut ffi::GdkX11Screen,
            f: glib::ffi::gpointer,
        ) {
            let f: &F = &*(f as *const F);
            f(&from_glib_borrow(this))
        }
        unsafe {
            let f: Box_<F> = Box_::new(f);
            connect_raw(
                self.as_ptr() as *mut _,
                b"window-manager-changed\0".as_ptr() as *const _,
                Some(std::mem::transmute::<_, unsafe extern "C" fn()>(
                    window_manager_changed_trampoline::<F> as *const (),
                )),
                Box_::into_raw(f),
            )
        }
    }
}