Skip to content

Commit a234bfe

Browse files
authored
Merge pull request #9 from alatiera/alatiera/subclasss-override
subclass: Always allow to override the vfuns of classes
2 parents ce98539 + f2f441f commit a234bfe

File tree

8 files changed

+24
-4
lines changed

8 files changed

+24
-4
lines changed

src/subclass/application_window.rs

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,11 +2,14 @@ use glib::subclass::prelude::*;
22

33
use super::window::WindowImpl;
44
use ApplicationWindowClass;
5+
use WindowClass;
56

67
pub trait ApplicationWindowImpl: WindowImpl + 'static {}
78

89
unsafe impl<T: ObjectSubclass + ApplicationWindowImpl> IsSubclassable<T>
910
for ApplicationWindowClass
1011
{
11-
fn override_vfuncs(&mut self) {}
12+
fn override_vfuncs(&mut self) {
13+
<WindowClass as IsSubclassable<T>>::override_vfuncs(self);
14+
}
1215
}

src/subclass/bin.rs

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,9 +2,12 @@ use glib::subclass::prelude::*;
22

33
use super::container::ContainerImpl;
44
use BinClass;
5+
use ContainerClass;
56

67
pub trait BinImpl: ContainerImpl + 'static {}
78

89
unsafe impl<T: ObjectSubclass + BinImpl> IsSubclassable<T> for BinClass {
9-
fn override_vfuncs(&mut self) {}
10+
fn override_vfuncs(&mut self) {
11+
<ContainerClass as IsSubclassable<T>>::override_vfuncs(self);
12+
}
1013
}

src/subclass/box_.rs

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,9 +2,12 @@ use glib::subclass::prelude::*;
22

33
use super::container::ContainerImpl;
44
use BoxClass;
5+
use ContainerClass;
56

67
pub trait BoxImpl: ContainerImpl + 'static {}
78

89
unsafe impl<T: ObjectSubclass + BoxImpl> IsSubclassable<T> for BoxClass {
9-
fn override_vfuncs(&mut self) {}
10+
fn override_vfuncs(&mut self) {
11+
<ContainerClass as IsSubclassable<T>>::override_vfuncs(self);
12+
}
1013
}

src/subclass/container.rs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ use super::widget::WidgetImpl;
88
use Container;
99
use ContainerClass;
1010
use Widget;
11+
use WidgetClass;
1112
use WidgetPath;
1213

1314
pub trait ContainerImpl: ContainerImplExt + WidgetImpl + 'static {
@@ -99,6 +100,7 @@ impl<T: ContainerImpl + ObjectImpl> ContainerImplExt for T {
99100

100101
unsafe impl<T: ObjectSubclass + ContainerImpl> IsSubclassable<T> for ContainerClass {
101102
fn override_vfuncs(&mut self) {
103+
<WidgetClass as IsSubclassable<T>>::override_vfuncs(self);
102104
unsafe {
103105
let klass = &mut *(self as *mut Self as *mut gtk_sys::GtkContainerClass);
104106
klass.add = Some(container_add::<T>);

src/subclass/dialog.rs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ use super::window::WindowImpl;
88
use Dialog;
99
use DialogClass;
1010
use ResponseType;
11+
use WindowClass;
1112

1213
pub trait DialogImpl: DialogImplExt + WindowImpl + 'static {
1314
fn response(&self, dialog: &Dialog, response: ResponseType) {
@@ -50,6 +51,7 @@ impl<T: DialogImpl + ObjectImpl> DialogImplExt for T {
5051

5152
unsafe impl<T: ObjectSubclass + DialogImpl> IsSubclassable<T> for DialogClass {
5253
fn override_vfuncs(&mut self) {
54+
<WindowClass as IsSubclassable<T>>::override_vfuncs(self);
5355
unsafe {
5456
let klass = &mut *(self as *mut Self as *mut gtk_sys::GtkDialogClass);
5557
klass.response = Some(dialog_response::<T>);

src/subclass/header_bar.rs

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,13 @@
11
use glib::subclass::prelude::*;
22

33
use super::container::ContainerImpl;
4+
use ContainerClass;
45
use HeaderBarClass;
56

67
pub trait HeaderBarImpl: ContainerImpl + 'static {}
78

89
unsafe impl<T: ObjectSubclass + HeaderBarImpl> IsSubclassable<T> for HeaderBarClass {
9-
fn override_vfuncs(&mut self) {}
10+
fn override_vfuncs(&mut self) {
11+
<ContainerClass as IsSubclassable<T>>::override_vfuncs(self);
12+
}
1013
}

src/subclass/widget.rs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ use gtk_sys;
33
use glib::translate::*;
44

55
use glib::subclass::prelude::*;
6+
use glib::ObjectClass;
67

78
use crate::DragResult;
89
use crate::SelectionData;
@@ -292,6 +293,7 @@ impl<T: WidgetImpl + ObjectImpl> WidgetImplExt for T {
292293

293294
unsafe impl<T: ObjectSubclass + WidgetImpl> IsSubclassable<T> for WidgetClass {
294295
fn override_vfuncs(&mut self) {
296+
<ObjectClass as IsSubclassable<T>>::override_vfuncs(self);
295297
unsafe {
296298
let klass = &mut *(self as *mut Self as *mut gtk_sys::GtkWidgetClass);
297299
// klass.can_activate_accel = Some(widget_can_activate_accel::<T>);

src/subclass/window.rs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ use glib::translate::*;
55
use glib::subclass::prelude::*;
66

77
use super::bin::BinImpl;
8+
use BinClass;
89
use Window;
910
use WindowClass;
1011

@@ -97,6 +98,7 @@ impl<T: WindowImpl + ObjectImpl> WindowImplExt for T {
9798

9899
unsafe impl<T: ObjectSubclass + WindowImpl> IsSubclassable<T> for WindowClass {
99100
fn override_vfuncs(&mut self) {
101+
<BinClass as IsSubclassable<T>>::override_vfuncs(self);
100102
unsafe {
101103
let klass = &mut *(self as *mut Self as *mut gtk_sys::GtkWindowClass);
102104
klass.activate_focus = Some(window_activate_focus::<T>);

0 commit comments

Comments
 (0)