Author: matt
Date: 2011-01-10 08:27:25 -0800 (Mon, 10 Jan 2011)
New Revision: 8242
Log:
Virtual wrapping seems to work now.
Modified:
branches/branch-3.0-2011/fltk3/Wrapper.h
branches/branch-3.0-2011/src/Fl_Widget.cxx
Modified: branches/branch-3.0-2011/fltk3/Wrapper.h
===================================================================
--- branches/branch-3.0-2011/fltk3/Wrapper.h 2011-01-10 14:02:38 UTC (rev
8241)
+++ branches/branch-3.0-2011/fltk3/Wrapper.h 2011-01-10 16:27:25 UTC (rev
8242)
@@ -31,6 +31,52 @@
#ifndef FLTK3_Wrapper_H
#define FLTK3_Wrapper_H
+#define FLTK3_WRAPPER_VCALLS_OBJECT(proto, call, flag) \
+ virtual void proto { \
+ if ( pVCalls & pVCallWidget##flag ) { \
+ } else { \
+ pVCalls |= pVCallWidget##flag; \
+ ((fltk3::Widget*)_p)->call; \
+ pVCalls &= ~pVCallWidget##flag; \
+ } \
+ }
+
+#define FLTK3_OBJECT_VCALLS_WRAPPER(call, flag) \
+ if (pWrapper) { \
+ if ( pWrapper->pVCalls & Wrapper::pVCallWidget##flag ) { \
+ } else { \
+ pWrapper->pVCalls |= Wrapper::pVCallWidgetResize; \
+ ((WidgetWrapper*)pWrapper)->call; \
+ if ( !(pWrapper->pVCalls & Wrapper::pVCallWidget##flag) ) \
+ return; \
+ } \
+ pWrapper->pVCalls &= ~Wrapper::pVCallWidgetResize; \
+ }
+
+#define FLTK3_WRAPPER_VCALLS_OBJECT_INT(proto, call, flag) \
+ virtual int proto { \
+ int ret = 0; \
+ if ( pVCalls & pVCallWidget##flag ) { \
+ } else { \
+ pVCalls |= pVCallWidget##flag; \
+ ret = ((fltk3::Widget*)_p)->call; \
+ pVCalls &= ~pVCallWidget##flag; \
+ } \
+ return ret; \
+ }
+
+#define FLTK3_OBJECT_VCALLS_WRAPPER_INT(call, flag) \
+ if (pWrapper) { \
+ if ( pWrapper->pVCalls & Wrapper::pVCallWidget##flag ) { \
+ } else { \
+ pWrapper->pVCalls |= Wrapper::pVCallWidgetResize; \
+ int ret = ((WidgetWrapper*)pWrapper)->call; \
+ if ( !(pWrapper->pVCalls & Wrapper::pVCallWidget##flag) ) \
+ return ret; \
+ } \
+ pWrapper->pVCalls &= ~Wrapper::pVCallWidgetResize; \
+ }
+
namespace fltk3 {
class Object;
@@ -43,7 +89,7 @@
Object *_p;
public:
Wrapper()
- : _p(0L) { }
+ : _p(0L), pVCalls(0) { }
virtual ~Wrapper() { }
unsigned int pVCalls;
@@ -52,7 +98,7 @@
static const unsigned int pVCallWidgetResize = 1<<2;
static const unsigned int pVCallWidgetShow = 1<<3;
static const unsigned int pVCallWidgetHide = 1<<4;
-
+
virtual void draw() { /* call _p->draw() with a flag set */ }
};
@@ -60,32 +106,21 @@
class WidgetWrapper : public Wrapper {
public:
virtual ~WidgetWrapper() {}
- virtual void draw() {
- pVCalls |= pVCallWidgetDraw;
- ((fltk3::Widget*)_p)->draw();
- pVCalls &= ~pVCallWidgetDraw;
- }
- virtual int handle(int event) {
- pVCalls |= pVCallWidgetHandle;
- int ret = ((fltk3::Widget*)_p)->handle(event);
- pVCalls &= ~pVCallWidgetHandle;
- return ret;
- }
- virtual void resize(int x, int y, int w, int h) {
- pVCalls |= pVCallWidgetResize;
- ((fltk3::Widget*)_p)->resize(x, y, w, h);
- pVCalls &= ~pVCallWidgetResize;
- }
- virtual void show() {
- pVCalls |= pVCallWidgetShow;
- ((fltk3::Widget*)_p)->show();
- pVCalls &= ~pVCallWidgetShow;
- }
- virtual void hide() {
- pVCalls |= pVCallWidgetHide;
- ((fltk3::Widget*)_p)->hide();
- pVCalls &= ~pVCallWidgetHide;
- }
+ FLTK3_WRAPPER_VCALLS_OBJECT(draw(),
+ draw(),
+ Draw)
+ FLTK3_WRAPPER_VCALLS_OBJECT_INT(handle(int event),
+ handle(event),
+ Handle)
+ FLTK3_WRAPPER_VCALLS_OBJECT(resize(int x, int y, int w, int h),
+ resize(x, y, w, h),
+ Resize)
+ FLTK3_WRAPPER_VCALLS_OBJECT(show(),
+ show(),
+ Show)
+ FLTK3_WRAPPER_VCALLS_OBJECT(hide(),
+ hide(),
+ Hide)
};
Modified: branches/branch-3.0-2011/src/Fl_Widget.cxx
===================================================================
--- branches/branch-3.0-2011/src/Fl_Widget.cxx 2011-01-10 14:02:38 UTC (rev
8241)
+++ branches/branch-3.0-2011/src/Fl_Widget.cxx 2011-01-10 16:27:25 UTC (rev
8242)
@@ -105,14 +105,7 @@
////////////////////////////////////////////////////////////////
int fltk3::Widget::handle(int event) {
- if (pWrapper) {
- int ret = 0;
- if ( !(pWrapper->pVCalls & Wrapper::pVCallWidgetHandle) )
- ret = ((WidgetWrapper*)pWrapper)->handle(event);
- if ( !(pWrapper->pVCalls & Wrapper::pVCallWidgetHandle) )
- return ret;
- pWrapper->pVCalls &= ~Wrapper::pVCallWidgetHandle;
- }
+ FLTK3_OBJECT_VCALLS_WRAPPER_INT(handle(event), Handle);
return 0;
}
@@ -147,15 +140,7 @@
}
void fltk3::Widget::resize(int X, int Y, int W, int H) {
- /*
- if (pWrapper) {
- if ( !(pWrapper->pVCalls & Wrapper::pVCallWidgetResize) )
- ((WidgetWrapper*)pWrapper)->resize(X, Y, W, H);
- if ( !(pWrapper->pVCalls & Wrapper::pVCallWidgetResize) )
- return;
- pWrapper->pVCalls &= ~Wrapper::pVCallWidgetResize;
- }
- */
+ FLTK3_OBJECT_VCALLS_WRAPPER(resize(X, Y, W, H), Resize);
x_ = X; y_ = Y; w_ = W; h_ = H;
}
@@ -277,13 +262,7 @@
}
void fltk3::Widget::show() {
- if (pWrapper) {
- if ( !(pWrapper->pVCalls & Wrapper::pVCallWidgetShow) )
- ((WidgetWrapper*)pWrapper)->show();
- if ( !(pWrapper->pVCalls & Wrapper::pVCallWidgetShow) )
- return;
- pWrapper->pVCalls &= ~Wrapper::pVCallWidgetShow;
- }
+ FLTK3_OBJECT_VCALLS_WRAPPER(show(), Show);
if (!visible()) {
clear_flag(INVISIBLE);
if (visible_r()) {
@@ -296,6 +275,7 @@
}
void fltk3::Widget::hide() {
+ FLTK3_OBJECT_VCALLS_WRAPPER(hide(), Hide);
if (pWrapper) {
if ( !(pWrapper->pVCalls & Wrapper::pVCallWidgetHide) )
((WidgetWrapper*)pWrapper)->hide();
@@ -373,13 +353,7 @@
}
void fltk3::Widget::draw() {
- if (pWrapper) {
- if ( !(pWrapper->pVCalls & Wrapper::pVCallWidgetDraw) )
- pWrapper->draw();
- if ( !(pWrapper->pVCalls & Wrapper::pVCallWidgetDraw) )
- return;
- pWrapper->pVCalls &= ~Wrapper::pVCallWidgetDraw;
- }
+ FLTK3_OBJECT_VCALLS_WRAPPER(draw(), Draw);
draw_box();
draw_label();
}
_______________________________________________
fltk-commit mailing list
[email protected]
http://lists.easysw.com/mailman/listinfo/fltk-commit