@@ -150,34 +150,53 @@ impl ListStore {
150
150
( * func) ( & a) . into_glib ( )
151
151
}
152
152
153
- unsafe {
154
- // GIO requires a non-NULL item to be passed in so we're constructing a fake item here.
155
- // See https://gitlab.gnome.org/GNOME/glib/-/merge_requests/3284
153
+ let mut func = equal_func;
154
+ let func_obj: & mut ( dyn FnMut ( & Object ) -> bool ) = & mut func;
155
+ let func_ptr = & func_obj as * const & mut ( dyn FnMut ( & Object ) -> bool ) as glib:: ffi:: gpointer ;
156
+ let mut position = std:: mem:: MaybeUninit :: uninit ( ) ;
157
+
158
+ // GIO prior to 2.76 requires a non-NULL item to be passed in so we're constructing a fake item here.
159
+ // See https://gitlab.gnome.org/GNOME/glib/-/merge_requests/3284
160
+ #[ cfg( not( feature = "v2_76" ) ) ]
161
+ let result = unsafe {
162
+ let g_class: * mut glib:: gobject_ffi:: GTypeClass =
163
+ glib:: gobject_ffi:: g_type_class_peek ( self . item_type ( ) . into_glib ( ) ) as * mut _ ;
164
+
165
+ // g_class will be `NULL` when no instance of the `item-type` has been created yet.
166
+ // See https://github.com/gtk-rs/gtk-rs-core/issues/1767
167
+ if g_class. is_null ( ) {
168
+ return None ;
169
+ }
170
+
156
171
let item = glib:: gobject_ffi:: GObject {
157
- g_type_instance : glib:: gobject_ffi:: GTypeInstance {
158
- g_class : glib:: gobject_ffi:: g_type_class_peek ( self . item_type ( ) . into_glib ( ) )
159
- as * mut _ ,
160
- } ,
172
+ g_type_instance : glib:: gobject_ffi:: GTypeInstance { g_class } ,
161
173
ref_count : 1 ,
162
174
qdata : std:: ptr:: null_mut ( ) ,
163
175
} ;
164
- let mut func = equal_func;
165
- let func_obj: & mut ( dyn FnMut ( & Object ) -> bool ) = & mut func;
166
- let func_ptr =
167
- & func_obj as * const & mut ( dyn FnMut ( & Object ) -> bool ) as glib:: ffi:: gpointer ;
168
176
169
- let mut position = std:: mem:: MaybeUninit :: uninit ( ) ;
170
-
171
- let found = bool:: from_glib ( ffi:: g_list_store_find_with_equal_func_full (
177
+ bool:: from_glib ( ffi:: g_list_store_find_with_equal_func_full (
172
178
self . to_glib_none ( ) . 0 ,
173
179
mut_override ( & item as * const _ ) ,
174
180
Some ( equal_func_trampoline) ,
175
181
func_ptr,
176
182
position. as_mut_ptr ( ) ,
177
- ) ) ;
183
+ ) )
184
+ . then ( || position. assume_init ( ) )
185
+ } ;
178
186
179
- found. then ( || position. assume_init ( ) )
180
- }
187
+ #[ cfg( feature = "v2_76" ) ]
188
+ let result = unsafe {
189
+ bool:: from_glib ( ffi:: g_list_store_find_with_equal_func_full (
190
+ self . to_glib_none ( ) . 0 ,
191
+ std:: ptr:: null_mut ( ) ,
192
+ Some ( equal_func_trampoline) ,
193
+ func_ptr,
194
+ position. as_mut_ptr ( ) ,
195
+ ) )
196
+ . then ( || position. assume_init ( ) )
197
+ } ;
198
+
199
+ result
181
200
}
182
201
}
183
202
0 commit comments