gio/auto/
desktop_app_info.rs1use crate::{ffi, AppInfo, AppLaunchContext};
6use glib::{prelude::*, translate::*};
7use std::boxed::Box as Box_;
8
9glib::wrapper! {
10 #[doc(alias = "GDesktopAppInfo")]
11 pub struct DesktopAppInfo(Object<ffi::GDesktopAppInfo, ffi::GDesktopAppInfoClass>) @implements AppInfo;
12
13 match fn {
14 type_ => || ffi::g_desktop_app_info_get_type(),
15 }
16}
17
18impl DesktopAppInfo {
19 #[doc(alias = "g_desktop_app_info_new")]
20 pub fn new(desktop_id: &str) -> Option<DesktopAppInfo> {
21 unsafe { from_glib_full(ffi::g_desktop_app_info_new(desktop_id.to_glib_none().0)) }
22 }
23
24 #[doc(alias = "g_desktop_app_info_new_from_filename")]
25 #[doc(alias = "new_from_filename")]
26 pub fn from_filename(filename: impl AsRef<std::path::Path>) -> Option<DesktopAppInfo> {
27 unsafe {
28 from_glib_full(ffi::g_desktop_app_info_new_from_filename(
29 filename.as_ref().to_glib_none().0,
30 ))
31 }
32 }
33
34 #[doc(alias = "g_desktop_app_info_new_from_keyfile")]
35 #[doc(alias = "new_from_keyfile")]
36 pub fn from_keyfile(key_file: &glib::KeyFile) -> Option<DesktopAppInfo> {
37 unsafe {
38 from_glib_full(ffi::g_desktop_app_info_new_from_keyfile(
39 key_file.to_glib_none().0,
40 ))
41 }
42 }
43
44 #[doc(alias = "g_desktop_app_info_get_action_name")]
45 #[doc(alias = "get_action_name")]
46 pub fn action_name(&self, action_name: &str) -> glib::GString {
47 unsafe {
48 from_glib_full(ffi::g_desktop_app_info_get_action_name(
49 self.to_glib_none().0,
50 action_name.to_glib_none().0,
51 ))
52 }
53 }
54
55 #[doc(alias = "g_desktop_app_info_get_boolean")]
56 #[doc(alias = "get_boolean")]
57 pub fn boolean(&self, key: &str) -> bool {
58 unsafe {
59 from_glib(ffi::g_desktop_app_info_get_boolean(
60 self.to_glib_none().0,
61 key.to_glib_none().0,
62 ))
63 }
64 }
65
66 #[doc(alias = "g_desktop_app_info_get_categories")]
67 #[doc(alias = "get_categories")]
68 pub fn categories(&self) -> Option<glib::GString> {
69 unsafe {
70 from_glib_none(ffi::g_desktop_app_info_get_categories(
71 self.to_glib_none().0,
72 ))
73 }
74 }
75
76 #[doc(alias = "g_desktop_app_info_get_filename")]
77 #[doc(alias = "get_filename")]
78 pub fn filename(&self) -> Option<std::path::PathBuf> {
79 unsafe { from_glib_none(ffi::g_desktop_app_info_get_filename(self.to_glib_none().0)) }
80 }
81
82 #[doc(alias = "g_desktop_app_info_get_generic_name")]
83 #[doc(alias = "get_generic_name")]
84 pub fn generic_name(&self) -> Option<glib::GString> {
85 unsafe {
86 from_glib_none(ffi::g_desktop_app_info_get_generic_name(
87 self.to_glib_none().0,
88 ))
89 }
90 }
91
92 #[doc(alias = "g_desktop_app_info_get_is_hidden")]
93 #[doc(alias = "get_is_hidden")]
94 pub fn is_hidden(&self) -> bool {
95 unsafe { from_glib(ffi::g_desktop_app_info_get_is_hidden(self.to_glib_none().0)) }
96 }
97
98 #[doc(alias = "g_desktop_app_info_get_keywords")]
99 #[doc(alias = "get_keywords")]
100 pub fn keywords(&self) -> Vec<glib::GString> {
101 unsafe {
102 FromGlibPtrContainer::from_glib_none(ffi::g_desktop_app_info_get_keywords(
103 self.to_glib_none().0,
104 ))
105 }
106 }
107
108 #[doc(alias = "g_desktop_app_info_get_locale_string")]
109 #[doc(alias = "get_locale_string")]
110 pub fn locale_string(&self, key: &str) -> Option<glib::GString> {
111 unsafe {
112 from_glib_full(ffi::g_desktop_app_info_get_locale_string(
113 self.to_glib_none().0,
114 key.to_glib_none().0,
115 ))
116 }
117 }
118
119 #[doc(alias = "g_desktop_app_info_get_nodisplay")]
120 #[doc(alias = "get_nodisplay")]
121 pub fn is_nodisplay(&self) -> bool {
122 unsafe { from_glib(ffi::g_desktop_app_info_get_nodisplay(self.to_glib_none().0)) }
123 }
124
125 #[doc(alias = "g_desktop_app_info_get_show_in")]
126 #[doc(alias = "get_show_in")]
127 pub fn shows_in(&self, desktop_env: Option<&str>) -> bool {
128 unsafe {
129 from_glib(ffi::g_desktop_app_info_get_show_in(
130 self.to_glib_none().0,
131 desktop_env.to_glib_none().0,
132 ))
133 }
134 }
135
136 #[doc(alias = "g_desktop_app_info_get_startup_wm_class")]
137 #[doc(alias = "get_startup_wm_class")]
138 pub fn startup_wm_class(&self) -> Option<glib::GString> {
139 unsafe {
140 from_glib_none(ffi::g_desktop_app_info_get_startup_wm_class(
141 self.to_glib_none().0,
142 ))
143 }
144 }
145
146 #[doc(alias = "g_desktop_app_info_get_string")]
147 #[doc(alias = "get_string")]
148 pub fn string(&self, key: &str) -> Option<glib::GString> {
149 unsafe {
150 from_glib_full(ffi::g_desktop_app_info_get_string(
151 self.to_glib_none().0,
152 key.to_glib_none().0,
153 ))
154 }
155 }
156
157 #[cfg(feature = "v2_60")]
158 #[cfg_attr(docsrs, doc(cfg(feature = "v2_60")))]
159 #[doc(alias = "g_desktop_app_info_get_string_list")]
160 #[doc(alias = "get_string_list")]
161 pub fn string_list(&self, key: &str) -> Vec<glib::GString> {
162 unsafe {
163 let mut length = std::mem::MaybeUninit::uninit();
164 let ret = FromGlibContainer::from_glib_full_num(
165 ffi::g_desktop_app_info_get_string_list(
166 self.to_glib_none().0,
167 key.to_glib_none().0,
168 length.as_mut_ptr(),
169 ),
170 length.assume_init() as _,
171 );
172 ret
173 }
174 }
175
176 #[doc(alias = "g_desktop_app_info_has_key")]
177 pub fn has_key(&self, key: &str) -> bool {
178 unsafe {
179 from_glib(ffi::g_desktop_app_info_has_key(
180 self.to_glib_none().0,
181 key.to_glib_none().0,
182 ))
183 }
184 }
185
186 #[doc(alias = "g_desktop_app_info_launch_action")]
187 pub fn launch_action(
188 &self,
189 action_name: &str,
190 launch_context: Option<&impl IsA<AppLaunchContext>>,
191 ) {
192 unsafe {
193 ffi::g_desktop_app_info_launch_action(
194 self.to_glib_none().0,
195 action_name.to_glib_none().0,
196 launch_context.map(|p| p.as_ref()).to_glib_none().0,
197 );
198 }
199 }
200
201 #[doc(alias = "g_desktop_app_info_launch_uris_as_manager")]
202 pub fn launch_uris_as_manager(
203 &self,
204 uris: &[&str],
205 launch_context: Option<&impl IsA<AppLaunchContext>>,
206 spawn_flags: glib::SpawnFlags,
207 user_setup: Option<Box_<dyn FnOnce() + 'static>>,
208 pid_callback: Option<&mut dyn FnMut(&DesktopAppInfo, glib::Pid)>,
209 ) -> Result<(), glib::Error> {
210 let user_setup_data: Box_<Option<Box_<dyn FnOnce() + 'static>>> = Box_::new(user_setup);
211 unsafe extern "C" fn user_setup_func(data: glib::ffi::gpointer) {
212 let callback = Box_::from_raw(data as *mut Option<Box_<dyn FnOnce() + 'static>>);
213 let callback = (*callback).expect("cannot get closure...");
214 callback()
215 }
216 let user_setup = if user_setup_data.is_some() {
217 Some(user_setup_func as _)
218 } else {
219 None
220 };
221 let mut pid_callback_data: Option<&mut dyn FnMut(&DesktopAppInfo, glib::Pid)> =
222 pid_callback;
223 unsafe extern "C" fn pid_callback_func(
224 appinfo: *mut ffi::GDesktopAppInfo,
225 pid: glib::ffi::GPid,
226 user_data: glib::ffi::gpointer,
227 ) {
228 let appinfo = from_glib_borrow(appinfo);
229 let pid = from_glib(pid);
230 let callback = user_data as *mut Option<&mut dyn FnMut(&DesktopAppInfo, glib::Pid)>;
231 if let Some(ref mut callback) = *callback {
232 callback(&appinfo, pid)
233 } else {
234 panic!("cannot get closure...")
235 }
236 }
237 let pid_callback = if pid_callback_data.is_some() {
238 Some(pid_callback_func as _)
239 } else {
240 None
241 };
242 let super_callback0: Box_<Option<Box_<dyn FnOnce() + 'static>>> = user_setup_data;
243 let super_callback1: &mut Option<&mut dyn FnMut(&DesktopAppInfo, glib::Pid)> =
244 &mut pid_callback_data;
245 unsafe {
246 let mut error = std::ptr::null_mut();
247 let is_ok = ffi::g_desktop_app_info_launch_uris_as_manager(
248 self.to_glib_none().0,
249 uris.to_glib_none().0,
250 launch_context.map(|p| p.as_ref()).to_glib_none().0,
251 spawn_flags.into_glib(),
252 user_setup,
253 Box_::into_raw(super_callback0) as *mut _,
254 pid_callback,
255 super_callback1 as *mut _ as *mut _,
256 &mut error,
257 );
258 debug_assert_eq!(is_ok == glib::ffi::GFALSE, !error.is_null());
259 if error.is_null() {
260 Ok(())
261 } else {
262 Err(from_glib_full(error))
263 }
264 }
265 }
266
267 #[doc(alias = "g_desktop_app_info_list_actions")]
268 pub fn list_actions(&self) -> Vec<glib::GString> {
269 unsafe {
270 FromGlibPtrContainer::from_glib_none(ffi::g_desktop_app_info_list_actions(
271 self.to_glib_none().0,
272 ))
273 }
274 }
275
276 #[doc(alias = "g_desktop_app_info_get_implementations")]
277 #[doc(alias = "get_implementations")]
278 pub fn implementations(interface: &str) -> Vec<DesktopAppInfo> {
279 unsafe {
280 FromGlibPtrContainer::from_glib_full(ffi::g_desktop_app_info_get_implementations(
281 interface.to_glib_none().0,
282 ))
283 }
284 }
285}