Skip to content
This repository was archived by the owner on Mar 4, 2024. It is now read-only.

Commit e260e69

Browse files
ids1024sdroege
authored andcommitted
glib: Implement AsRef/AsMut<T::GlibClassType> for Class<T>
This makes it easier/safer to implement `IsSubclassable`.
1 parent 3e29094 commit e260e69

20 files changed

+32
-20
lines changed

gio/src/subclass/application.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -307,7 +307,7 @@ unsafe impl<T: ApplicationImpl> IsSubclassable<T> for Application {
307307
fn override_vfuncs(class: &mut ::glib::object::Class<Self>) {
308308
<glib::Object as IsSubclassable<T>>::override_vfuncs(class);
309309
unsafe {
310-
let klass = &mut *(class as *mut _ as *mut gio_sys::GApplicationClass);
310+
let klass = &mut *(class.as_mut() as *mut gio_sys::GApplicationClass);
311311
klass.activate = Some(application_activate::<T>);
312312
klass.after_emit = Some(application_after_emit::<T>);
313313
klass.before_emit = Some(application_before_emit::<T>);

gio/src/subclass/input_stream.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -155,7 +155,7 @@ unsafe impl<T: InputStreamImpl> IsSubclassable<T> for InputStream {
155155
fn override_vfuncs(class: &mut ::glib::object::Class<Self>) {
156156
<glib::Object as IsSubclassable<T>>::override_vfuncs(class);
157157
unsafe {
158-
let klass = &mut *(class as *mut _ as *mut gio_sys::GInputStreamClass);
158+
let klass = &mut *(class.as_mut() as *mut gio_sys::GInputStreamClass);
159159
klass.read_fn = Some(stream_read::<T>);
160160
klass.close_fn = Some(stream_close::<T>);
161161
klass.skip = Some(stream_skip::<T>);

gio/src/subclass/io_stream.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -99,7 +99,7 @@ unsafe impl<T: IOStreamImpl> IsSubclassable<T> for IOStream {
9999
fn override_vfuncs(class: &mut ::glib::object::Class<Self>) {
100100
<glib::Object as IsSubclassable<T>>::override_vfuncs(class);
101101
unsafe {
102-
let klass = &mut *(class as *mut _ as *mut gio_sys::GIOStreamClass);
102+
let klass = &mut *(class.as_mut() as *mut gio_sys::GIOStreamClass);
103103
klass.get_input_stream = Some(stream_get_input_stream::<T>);
104104
klass.get_output_stream = Some(stream_get_output_stream::<T>);
105105
klass.close_fn = Some(stream_close::<T>);

gio/src/subclass/output_stream.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -195,7 +195,7 @@ unsafe impl<T: OutputStreamImpl> IsSubclassable<T> for OutputStream {
195195
fn override_vfuncs(class: &mut ::glib::object::Class<Self>) {
196196
<glib::Object as IsSubclassable<T>>::override_vfuncs(class);
197197
unsafe {
198-
let klass = &mut *(class as *mut _ as *mut gio_sys::GOutputStreamClass);
198+
let klass = &mut *(class.as_mut() as *mut gio_sys::GOutputStreamClass);
199199
klass.write_fn = Some(stream_write::<T>);
200200
klass.close_fn = Some(stream_close::<T>);
201201
klass.flush = Some(stream_flush::<T>);

glib/src/object.rs

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2518,6 +2518,18 @@ impl<T: ObjectType> Class<T> {
25182518
unsafe impl<T: ObjectType> Send for Class<T> {}
25192519
unsafe impl<T: ObjectType> Sync for Class<T> {}
25202520

2521+
impl<T: ObjectType> AsRef<T::GlibClassType> for Class<T> {
2522+
fn as_ref(&self) -> &T::GlibClassType {
2523+
&self.0
2524+
}
2525+
}
2526+
2527+
impl<T: ObjectType> AsMut<T::GlibClassType> for Class<T> {
2528+
fn as_mut(&mut self) -> &mut T::GlibClassType {
2529+
&mut self.0
2530+
}
2531+
}
2532+
25212533
// This should require Self: IsA<Self::Super>, but that seems to cause a cycle error
25222534
pub unsafe trait ParentClassIs: ObjectType {
25232535
type Parent: ObjectType;

glib/src/subclass/object.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -272,7 +272,7 @@ unsafe impl ObjectClassSubclassExt for ObjectClass {}
272272
unsafe impl<T: ObjectImpl> IsSubclassable<T> for Object {
273273
fn override_vfuncs(class: &mut ::object::Class<Self>) {
274274
unsafe {
275-
let klass = &mut *(class as *mut _ as *mut gobject_sys::GObjectClass);
275+
let klass = &mut *(class.as_mut() as *mut gobject_sys::GObjectClass);
276276
klass.set_property = Some(set_property::<T>);
277277
klass.get_property = Some(get_property::<T>);
278278
klass.constructed = Some(constructed::<T>);

gtk/src/subclass/application.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -83,11 +83,11 @@ unsafe impl<T: GtkApplicationImpl> IsSubclassable<T> for Application {
8383

8484
<gio::Application as IsSubclassable<T>>::override_vfuncs(class);
8585
unsafe {
86-
let klass = &mut *(class as *mut _ as *mut gtk_sys::GtkApplicationClass);
86+
let klass = &mut *(class.as_mut() as *mut gtk_sys::GtkApplicationClass);
8787
klass.window_added = Some(application_window_added::<T>);
8888
klass.window_removed = Some(application_window_removed::<T>);
8989
// Chain our startup handler in here
90-
let klass = &mut *(class as *mut _ as *mut gio_sys::GApplicationClass);
90+
let klass = &mut *(class.as_mut() as *mut gio_sys::GApplicationClass);
9191
klass.startup = Some(application_startup::<T>);
9292
}
9393
}

gtk/src/subclass/cell_renderer.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -439,7 +439,7 @@ unsafe impl<T: CellRendererImpl> IsSubclassable<T> for CellRenderer {
439439
fn override_vfuncs(class: &mut ::glib::object::Class<Self>) {
440440
<Object as IsSubclassable<T>>::override_vfuncs(class);
441441
unsafe {
442-
let klass = &mut *(class as *mut _ as *mut gtk_sys::GtkCellRendererClass);
442+
let klass = &mut *(class.as_mut() as *mut gtk_sys::GtkCellRendererClass);
443443
klass.get_request_mode = Some(cell_renderer_get_request_mode::<T>);
444444
klass.get_preferred_width = Some(cell_renderer_get_preferred_width::<T>);
445445
klass.get_preferred_height_for_width =

gtk/src/subclass/cell_renderer_accel.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -81,7 +81,7 @@ unsafe impl<T: CellRendererAccelImpl> IsSubclassable<T> for CellRendererAccel {
8181
fn override_vfuncs(class: &mut ::glib::object::Class<Self>) {
8282
<CellRendererText as IsSubclassable<T>>::override_vfuncs(class);
8383
unsafe {
84-
let klass = &mut *(class as *mut _ as *mut gtk_sys::GtkCellRendererAccelClass);
84+
let klass = &mut *(class.as_mut() as *mut gtk_sys::GtkCellRendererAccelClass);
8585
klass.accel_edited = Some(cell_renderer_accel_edited::<T>);
8686
klass.accel_cleared = Some(cell_renderer_accel_cleared::<T>);
8787
}

gtk/src/subclass/cell_renderer_text.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -41,7 +41,7 @@ unsafe impl<T: CellRendererTextImpl> IsSubclassable<T> for CellRendererText {
4141
fn override_vfuncs(class: &mut ::glib::object::Class<Self>) {
4242
<CellRenderer as IsSubclassable<T>>::override_vfuncs(class);
4343
unsafe {
44-
let klass = &mut *(class as *mut _ as *mut gtk_sys::GtkCellRendererTextClass);
44+
let klass = &mut *(class.as_mut() as *mut gtk_sys::GtkCellRendererTextClass);
4545
klass.edited = Some(cell_renderer_text_edited::<T>);
4646
}
4747
}

gtk/src/subclass/cell_renderer_toggle.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,7 @@ unsafe impl<T: CellRendererToggleImpl> IsSubclassable<T> for CellRendererToggle
3737
fn override_vfuncs(class: &mut ::glib::object::Class<Self>) {
3838
<CellRenderer as IsSubclassable<T>>::override_vfuncs(class);
3939
unsafe {
40-
let klass = &mut *(class as *mut _ as *mut gtk_sys::GtkCellRendererToggleClass);
40+
let klass = &mut *(class.as_mut() as *mut gtk_sys::GtkCellRendererToggleClass);
4141
klass.toggled = Some(cell_renderer_toggle_toggled::<T>);
4242
}
4343
}

gtk/src/subclass/container.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -133,7 +133,7 @@ unsafe impl<T: ContainerImpl> IsSubclassable<T> for Container {
133133
fn override_vfuncs(class: &mut ::glib::object::Class<Self>) {
134134
<Widget as IsSubclassable<T>>::override_vfuncs(class);
135135
unsafe {
136-
let klass = &mut *(class as *mut _ as *mut gtk_sys::GtkContainerClass);
136+
let klass = &mut *(class.as_mut() as *mut gtk_sys::GtkContainerClass);
137137
klass.add = Some(container_add::<T>);
138138
klass.remove = Some(container_remove::<T>);
139139
klass.check_resize = Some(container_check_resize::<T>);

gtk/src/subclass/dialog.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -50,7 +50,7 @@ unsafe impl<T: DialogImpl> IsSubclassable<T> for Dialog {
5050
fn override_vfuncs(class: &mut ::glib::object::Class<Self>) {
5151
<Window as IsSubclassable<T>>::override_vfuncs(class);
5252
unsafe {
53-
let klass = &mut *(class as *mut _ as *mut gtk_sys::GtkDialogClass);
53+
let klass = &mut *(class.as_mut() as *mut gtk_sys::GtkDialogClass);
5454
klass.response = Some(dialog_response::<T>);
5555
klass.close = Some(dialog_close::<T>);
5656
}

gtk/src/subclass/icon_view.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -143,7 +143,7 @@ unsafe impl<T: IconViewImpl> IsSubclassable<T> for IconView {
143143
fn override_vfuncs(class: &mut ::glib::object::Class<Self>) {
144144
<Container as IsSubclassable<T>>::override_vfuncs(class);
145145
unsafe {
146-
let klass = &mut *(class as *mut _ as *mut gtk_sys::GtkIconViewClass);
146+
let klass = &mut *(class.as_mut() as *mut gtk_sys::GtkIconViewClass);
147147
klass.item_activated = Some(icon_view_item_activated::<T>);
148148
klass.selection_changed = Some(icon_view_selection_changed::<T>);
149149
klass.select_all = Some(icon_view_select_all::<T>);

gtk/src/subclass/list_box.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -149,7 +149,7 @@ unsafe impl<T: ListBoxImpl> IsSubclassable<T> for ListBox {
149149
fn override_vfuncs(class: &mut ::glib::object::Class<Self>) {
150150
<Container as IsSubclassable<T>>::override_vfuncs(class);
151151
unsafe {
152-
let klass = &mut *(class as *mut _ as *mut gtk_sys::GtkListBoxClass);
152+
let klass = &mut *(class.as_mut() as *mut gtk_sys::GtkListBoxClass);
153153
klass.activate_cursor_row = Some(list_box_activate_cursor_row::<T>);
154154
klass.move_cursor = Some(list_box_move_cursor::<T>);
155155
klass.row_activated = Some(list_box_row_activated::<T>);

gtk/src/subclass/list_box_row.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,7 @@ unsafe impl<T: ListBoxRowImpl> IsSubclassable<T> for ListBoxRow {
2424
fn override_vfuncs(class: &mut ::glib::object::Class<Self>) {
2525
<Bin as IsSubclassable<T>>::override_vfuncs(class);
2626
unsafe {
27-
let klass = &mut *(class as *mut _ as *mut gtk_sys::GtkListBoxRowClass);
27+
let klass = &mut *(class.as_mut() as *mut gtk_sys::GtkListBoxRowClass);
2828
klass.activate = Some(list_box_row_activate::<T>);
2929
}
3030
}

gtk/src/subclass/plug.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -36,7 +36,7 @@ unsafe impl<T: PlugImpl> IsSubclassable<T> for Plug {
3636
fn override_vfuncs(class: &mut ::glib::object::Class<Self>) {
3737
<Window as IsSubclassable<T>>::override_vfuncs(class);
3838
unsafe {
39-
let klass = &mut *(class as *mut _ as *mut gtk_sys::GtkPlugClass);
39+
let klass = &mut *(class.as_mut() as *mut gtk_sys::GtkPlugClass);
4040
klass.embedded = Some(plug_embedded::<T>);
4141
}
4242
}

gtk/src/subclass/socket.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -54,7 +54,7 @@ unsafe impl<T: SocketImpl> IsSubclassable<T> for Socket {
5454
fn override_vfuncs(class: &mut ::glib::object::Class<Self>) {
5555
<Container as IsSubclassable<T>>::override_vfuncs(class);
5656
unsafe {
57-
let klass = &mut *(class as *mut _ as *mut gtk_sys::GtkSocketClass);
57+
let klass = &mut *(class.as_mut() as *mut gtk_sys::GtkSocketClass);
5858
klass.plug_added = Some(socket_plug_added::<T>);
5959
klass.plug_removed = Some(socket_plug_removed::<T>);
6060
}

gtk/src/subclass/widget.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -918,7 +918,7 @@ unsafe impl<T: WidgetImpl> IsSubclassable<T> for Widget {
918918
fn override_vfuncs(class: &mut ::glib::object::Class<Self>) {
919919
<Object as IsSubclassable<T>>::override_vfuncs(class);
920920
unsafe {
921-
let klass = &mut *(class as *mut _ as *mut gtk_sys::GtkWidgetClass);
921+
let klass = &mut *(class.as_mut() as *mut gtk_sys::GtkWidgetClass);
922922
klass.adjust_baseline_allocation = Some(widget_adjust_baseline_allocation::<T>);
923923
klass.adjust_baseline_request = Some(widget_adjust_baseline_request::<T>);
924924
klass.adjust_size_allocation = Some(widget_adjust_size_allocation::<T>);

gtk/src/subclass/window.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -97,7 +97,7 @@ unsafe impl<T: WindowImpl> IsSubclassable<T> for Window {
9797
fn override_vfuncs(class: &mut ::glib::object::Class<Self>) {
9898
<Bin as IsSubclassable<T>>::override_vfuncs(class);
9999
unsafe {
100-
let klass = &mut *(class as *mut _ as *mut gtk_sys::GtkWindowClass);
100+
let klass = &mut *(class.as_mut() as *mut gtk_sys::GtkWindowClass);
101101
klass.set_focus = Some(window_set_focus::<T>);
102102
klass.activate_focus = Some(window_activate_focus::<T>);
103103
klass.activate_default = Some(window_activate_default::<T>);

0 commit comments

Comments
 (0)