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
176
177
178
// 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
#![allow(deprecated)]

use crate::WaylandSurface;
use glib::translate::*;
use std::{boxed::Box as Box_, fmt};

glib::wrapper! {
    /// The Wayland implementation of [`gdk::Toplevel`][crate::gdk::Toplevel].
    ///
    /// Beyond the [`gdk::Toplevel`][crate::gdk::Toplevel] API, the Wayland implementation
    /// has API to set up cross-process parent-child relationships between
    /// surfaces with [`export_handle()`][Self::export_handle()] and
    /// [`set_transient_for_exported()`][Self::set_transient_for_exported()].
    ///
    /// # Implements
    ///
    /// [`WaylandSurfaceExt`][trait@crate::prelude::WaylandSurfaceExt], [`trait@gdk::prelude::SurfaceExt`], [`trait@gdk::prelude::ToplevelExt`], [`WaylandSurfaceExtManual`][trait@crate::prelude::WaylandSurfaceExtManual]
    #[doc(alias = "GdkWaylandToplevel")]
    pub struct WaylandToplevel(Object<ffi::GdkWaylandToplevel>) @extends WaylandSurface, gdk::Surface, @implements gdk::Toplevel;

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

impl WaylandToplevel {
    /// Destroy a handle that was obtained with gdk_wayland_toplevel_export_handle().
    ///
    /// Note that this API depends on an unstable Wayland protocol,
    /// and thus may require changes in the future.
    /// ## `handle`
    /// the handle to drop
    #[cfg(feature = "v4_12")]
    #[cfg_attr(docsrs, doc(cfg(feature = "v4_12")))]
    #[doc(alias = "gdk_wayland_toplevel_drop_exported_handle")]
    pub fn drop_exported_handle(&self, handle: &str) {
        unsafe {
            ffi::gdk_wayland_toplevel_drop_exported_handle(
                self.to_glib_none().0,
                handle.to_glib_none().0,
            );
        }
    }

    /// Asynchronously obtains a handle for a surface that can be passed
    /// to other processes.
    ///
    /// When the handle has been obtained, @callback will be called.
    ///
    /// It is an error to call this function on a surface that is already
    /// exported.
    ///
    /// When the handle is no longer needed, [`unexport_handle()`][Self::unexport_handle()]
    /// should be called to clean up resources.
    ///
    /// The main purpose for obtaining a handle is to mark a surface
    /// from another surface as transient for this one, see
    /// [`set_transient_for_exported()`][Self::set_transient_for_exported()].
    ///
    /// Before 4.12, this API could not safely be used multiple times,
    /// since there was no reference counting for handles. Starting with
    /// 4.12, every call to this function obtains a new handle, and every
    /// call to [`drop_exported_handle()`][Self::drop_exported_handle()] drops
    /// just the handle that it is given.
    ///
    /// Note that this API depends on an unstable Wayland protocol,
    /// and thus may require changes in the future.
    /// ## `callback`
    /// callback to call with the handle
    ///
    /// # Returns
    ///
    /// [`true`] if the handle has been requested, [`false`] if
    ///   an error occurred.
    #[doc(alias = "gdk_wayland_toplevel_export_handle")]
    pub fn export_handle<P: Fn(&WaylandToplevel, &str) + 'static>(&self, callback: P) -> bool {
        let callback_data: Box_<P> = Box_::new(callback);
        unsafe extern "C" fn callback_func<P: Fn(&WaylandToplevel, &str) + 'static>(
            toplevel: *mut ffi::GdkWaylandToplevel,
            handle: *const libc::c_char,
            user_data: glib::ffi::gpointer,
        ) {
            let toplevel = from_glib_borrow(toplevel);
            let handle: Borrowed<glib::GString> = from_glib_borrow(handle);
            let callback: &P = &*(user_data as *mut _);
            (*callback)(&toplevel, handle.as_str())
        }
        let callback = Some(callback_func::<P> as _);
        unsafe extern "C" fn destroy_func_func<P: Fn(&WaylandToplevel, &str) + 'static>(
            data: glib::ffi::gpointer,
        ) {
            let _callback: Box_<P> = Box_::from_raw(data as *mut _);
        }
        let destroy_call3 = Some(destroy_func_func::<P> as _);
        let super_callback0: Box_<P> = callback_data;
        unsafe {
            from_glib(ffi::gdk_wayland_toplevel_export_handle(
                self.to_glib_none().0,
                callback,
                Box_::into_raw(super_callback0) as *mut _,
                destroy_call3,
            ))
        }
    }

    /// Sets the application id on a [`gdk::Toplevel`][crate::gdk::Toplevel].
    /// ## `application_id`
    /// the application id for the @self
    #[doc(alias = "gdk_wayland_toplevel_set_application_id")]
    pub fn set_application_id(&self, application_id: &str) {
        unsafe {
            ffi::gdk_wayland_toplevel_set_application_id(
                self.to_glib_none().0,
                application_id.to_glib_none().0,
            );
        }
    }

    /// Marks @self as transient for the surface to which the given
    /// @parent_handle_str refers.
    ///
    /// Typically, the handle will originate from a
    /// [`export_handle()`][Self::export_handle()] call in another process.
    ///
    /// Note that this API depends on an unstable Wayland protocol,
    /// and thus may require changes in the future.
    /// ## `parent_handle_str`
    /// an exported handle for a surface
    ///
    /// # Returns
    ///
    /// [`true`] if the surface has been marked as transient,
    ///   [`false`] if an error occurred.
    #[doc(alias = "gdk_wayland_toplevel_set_transient_for_exported")]
    pub fn set_transient_for_exported(&self, parent_handle_str: &str) -> bool {
        unsafe {
            from_glib(ffi::gdk_wayland_toplevel_set_transient_for_exported(
                self.to_glib_none().0,
                parent_handle_str.to_glib_none().0,
            ))
        }
    }

    /// Destroys the handle that was obtained with
    /// gdk_wayland_toplevel_export_handle().
    ///
    /// It is an error to call this function on a surface that
    /// does not have a handle.
    ///
    /// Since 4.12, this function does nothing. Use
    /// [`drop_exported_handle()`][Self::drop_exported_handle()] instead to drop a
    /// handle that was obtained with [`export_handle()`][Self::export_handle()].
    ///
    /// Note that this API depends on an unstable Wayland protocol,
    /// and thus may require changes in the future.
    ///
    /// # Deprecated since 4.12
    ///
    /// Use [`drop_exported_handle()`][Self::drop_exported_handle()]
    ///   instead, this function does nothing
    #[cfg_attr(feature = "v4_12", deprecated = "Since 4.12")]
    #[allow(deprecated)]
    #[doc(alias = "gdk_wayland_toplevel_unexport_handle")]
    pub fn unexport_handle(&self) {
        unsafe {
            ffi::gdk_wayland_toplevel_unexport_handle(self.to_glib_none().0);
        }
    }
}

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