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
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
// 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 crate::X11Visual;
use glib::object::ObjectType as ObjectType_;
use glib::signal::connect_raw;
use glib::signal::SignalHandlerId;
use glib::translate::*;
use std::boxed::Box as Box_;
use std::fmt;
use std::mem::transmute;
use x11::xlib;

glib::wrapper! {
    ///
    ///
    /// # Implements
    ///
    /// [`trait@gdk::prelude::ScreenExt`]
    #[doc(alias = "GdkX11Screen")]
    pub struct X11Screen(Object<ffi::GdkX11Screen, ffi::GdkX11ScreenClass>) @extends gdk::Screen;

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

    /// Gets the XID of the specified output/monitor.
    /// If the X server does not support version 1.2 of the RANDR
    /// extension, 0 is returned.
    /// ## `monitor_num`
    /// number of the monitor, between 0 and gdk_screen_get_n_monitors (screen)
    ///
    /// # Returns
    ///
    /// the XID of the monitor
    #[doc(alias = "gdk_x11_screen_get_monitor_output")]
    #[doc(alias = "get_monitor_output")]
    pub fn monitor_output(&self, monitor_num: i32) -> xlib::XID {
        unsafe { ffi::gdk_x11_screen_get_monitor_output(self.to_glib_none().0, monitor_num) }
    }

    /// 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 [`gdk::Screen`][crate::gdk::Screen].
    ///
    /// # 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) -> Option<glib::GString> {
        unsafe {
            from_glib_none(ffi::gdk_x11_screen_get_window_manager_name(
                self.to_glib_none().0,
            ))
        }
    }

    /// Looks up the [`gdk::Visual`][crate::gdk::Visual] for a particular screen and X Visual ID.
    /// ## `xvisualid`
    /// an X Visual ID.
    ///
    /// # Returns
    ///
    /// the [`gdk::Visual`][crate::gdk::Visual] (owned by the screen
    ///  object), or [`None`] if the visual ID wasn’t found.
    #[doc(alias = "gdk_x11_screen_lookup_visual")]
    pub fn lookup_visual(&self, xvisualid: xlib::VisualID) -> Option<X11Visual> {
        unsafe {
            from_glib_none(ffi::gdk_x11_screen_lookup_visual(
                self.to_glib_none().0,
                xvisualid,
            ))
        }
    }

    /// 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
    /// [`supports_net_wm_hint()`][Self::supports_net_wm_hint()] will return [`false`] for every property.
    /// You can monitor the window_manager_changed signal on [`gdk::Screen`][crate::gdk::Screen] to detect
    /// a window manager change.
    /// ## `property`
    /// a property atom.
    ///
    /// # 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: &gdk::Atom) -> bool {
        unsafe {
            from_glib(ffi::gdk_x11_screen_supports_net_wm_hint(
                self.to_glib_none().0,
                property.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(transmute::<_, unsafe extern "C" fn()>(
                    window_manager_changed_trampoline::<F> as *const (),
                )),
                Box_::into_raw(f),
            )
        }
    }
}

impl fmt::Display for X11Screen {
    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
        f.write_str("X11Screen")
    }
}