Skip to content

Commit be4a4f5

Browse files
gtk: Use Propagation for CallbackAction callback
1 parent edf7343 commit be4a4f5

File tree

5 files changed

+57
-48
lines changed

5 files changed

+57
-48
lines changed

gtk4/Gir.toml

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -727,9 +727,7 @@ name = "Gtk.CallbackAction"
727727
status = "generate"
728728
[[object.function]]
729729
name = "new"
730-
[[object.function.parameter]]
731-
name = "callback"
732-
nullable = false
730+
manual = true # to use glib::Propagation, we don't have inhibit for callbacks
733731

734732
[[object]]
735733
name = "Gtk.CellArea"

gtk4/src/auto/callback_action.rs

Lines changed: 2 additions & 41 deletions
Original file line numberDiff line numberDiff line change
@@ -2,9 +2,7 @@
22
// from gir-files (https://github.com/gtk-rs/gir-files)
33
// DO NOT EDIT
44

5-
use crate::{ShortcutAction, Widget};
6-
use glib::translate::*;
7-
use std::boxed::Box as Box_;
5+
use crate::ShortcutAction;
86

97
glib::wrapper! {
108
#[doc(alias = "GtkCallbackAction")]
@@ -15,41 +13,4 @@ glib::wrapper! {
1513
}
1614
}
1715

18-
impl CallbackAction {
19-
#[doc(alias = "gtk_callback_action_new")]
20-
pub fn new<P: Fn(&Widget, Option<&glib::Variant>) -> bool + 'static>(
21-
callback: P,
22-
) -> CallbackAction {
23-
assert_initialized_main_thread!();
24-
let callback_data: Box_<P> = Box_::new(callback);
25-
unsafe extern "C" fn callback_func<
26-
P: Fn(&Widget, Option<&glib::Variant>) -> bool + 'static,
27-
>(
28-
widget: *mut ffi::GtkWidget,
29-
args: *mut glib::ffi::GVariant,
30-
user_data: glib::ffi::gpointer,
31-
) -> glib::ffi::gboolean {
32-
let widget = from_glib_borrow(widget);
33-
let args: Borrowed<Option<glib::Variant>> = from_glib_borrow(args);
34-
let callback = &*(user_data as *mut P);
35-
(*callback)(&widget, args.as_ref().as_ref()).into_glib()
36-
}
37-
let callback = Some(callback_func::<P> as _);
38-
unsafe extern "C" fn destroy_func<
39-
P: Fn(&Widget, Option<&glib::Variant>) -> bool + 'static,
40-
>(
41-
data: glib::ffi::gpointer,
42-
) {
43-
let _callback = Box_::from_raw(data as *mut P);
44-
}
45-
let destroy_call2 = Some(destroy_func::<P> as _);
46-
let super_callback0: Box_<P> = callback_data;
47-
unsafe {
48-
from_glib_full(ffi::gtk_callback_action_new(
49-
callback,
50-
Box_::into_raw(super_callback0) as *mut _,
51-
destroy_call2,
52-
))
53-
}
54-
}
55-
}
16+
impl CallbackAction {}

gtk4/src/callback_action.rs

Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,44 @@
1+
// Take a look at the license at the top of the repository in the LICENSE file.
2+
use glib::translate::*;
3+
use std::boxed::Box as Box_;
4+
5+
use crate::{CallbackAction, Widget};
6+
7+
impl CallbackAction {
8+
#[doc(alias = "gtk_callback_action_new")]
9+
pub fn new<P: Fn(&Widget, Option<&glib::Variant>) -> glib::Propagation + 'static>(
10+
callback: P,
11+
) -> CallbackAction {
12+
assert_initialized_main_thread!();
13+
let callback_data: Box_<P> = Box_::new(callback);
14+
unsafe extern "C" fn callback_func<
15+
P: Fn(&Widget, Option<&glib::Variant>) -> glib::Propagation + 'static,
16+
>(
17+
widget: *mut ffi::GtkWidget,
18+
args: *mut glib::ffi::GVariant,
19+
user_data: glib::ffi::gpointer,
20+
) -> glib::ffi::gboolean {
21+
let widget = from_glib_borrow(widget);
22+
let args: Borrowed<Option<glib::Variant>> = from_glib_borrow(args);
23+
let callback = &*(user_data as *mut P);
24+
(*callback)(&widget, args.as_ref().as_ref()).into_glib()
25+
}
26+
let callback = Some(callback_func::<P> as _);
27+
unsafe extern "C" fn destroy_func<
28+
P: Fn(&Widget, Option<&glib::Variant>) -> glib::Propagation + 'static,
29+
>(
30+
data: glib::ffi::gpointer,
31+
) {
32+
let _callback = Box_::from_raw(data as *mut P);
33+
}
34+
let destroy_call2 = Some(destroy_func::<P> as _);
35+
let super_callback0: Box_<P> = callback_data;
36+
unsafe {
37+
from_glib_full(ffi::gtk_callback_action_new(
38+
callback,
39+
Box_::into_raw(super_callback0) as *mut _,
40+
destroy_call2,
41+
))
42+
}
43+
}
44+
}

gtk4/src/lib.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -111,6 +111,7 @@ mod border;
111111
mod builder;
112112
mod builder_cscope;
113113
mod builder_rust_scope;
114+
mod callback_action;
114115
mod cell_area;
115116
mod cell_layout;
116117
mod closure_expression;

gtk4/src/subclass/widget.rs

Lines changed: 9 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1008,7 +1008,10 @@ pub unsafe trait WidgetClassExt: ClassStruct {
10081008

10091009
#[doc(alias = "gtk_widget_class_add_binding")]
10101010
fn add_binding<
1011-
F: Fn(&<<Self as ClassStruct>::Type as ObjectSubclass>::Type, Option<&Variant>) -> bool
1011+
F: Fn(
1012+
&<<Self as ClassStruct>::Type as ObjectSubclass>::Type,
1013+
Option<&Variant>,
1014+
) -> glib::Propagation
10121015
+ 'static,
10131016
>(
10141017
&mut self,
@@ -1019,9 +1022,11 @@ pub unsafe trait WidgetClassExt: ClassStruct {
10191022
) {
10201023
let shortcut = crate::Shortcut::new(
10211024
Some(crate::KeyvalTrigger::new(keyval, mods)),
1022-
Some(crate::CallbackAction::new(move |widget, args| -> bool {
1023-
unsafe { callback(widget.unsafe_cast_ref(), args) }
1024-
})),
1025+
Some(crate::CallbackAction::new(
1026+
move |widget, args| -> glib::Propagation {
1027+
unsafe { callback(widget.unsafe_cast_ref(), args) }
1028+
},
1029+
)),
10251030
);
10261031
shortcut.set_arguments(arguments);
10271032
self.add_shortcut(&shortcut);

0 commit comments

Comments
 (0)