Skip site navigation (1)Skip section navigation (2)
Date:      Tue, 26 Oct 1999 23:39:24 -0400
From:      Bakul Shah <bakul@torrentnet.com>
To:        Chuck Robey <chuckr@picnic.mat.net>
Cc:        tbuswell@acadia.net, Thomas David Rivers <rivers@dignus.com>, freebsd-hackers@FreeBSD.ORG
Subject:   Re: X11/C++ question 
Message-ID:  <199910270339.XAA11567@chai.torrentnet.com>
In-Reply-To: Your message of "Tue, 26 Oct 1999 22:54:15 EDT." <Pine.BSF.4.10.9910262253040.29073-100000@picnic.mat.net> 

next in thread | previous in thread | raw e-mail | index | archive | help
Allow me add something to what the FAQ-Xt says.

I find it more convenient to immediately call a non-static
function as shown below (using a slightly modified example
from the FAQ).

class Icon {
public:
			Icon(Widget*);
private:
	static void	static_callback(Icon*);
	inline void	real_callback();
	Widget*		button;
	int		count;
	...
};

Icon::Icon(Widget* parent): count(0)
{
	button = XtVaCreateWidget("Boo!", xmPushButtonWidgetClass, parent, 0);
	XtAddCallback(button,  XmNselectCallback, &Icon::static_callback,
		      (XtPointer)this);
	...
}

inline void
Icon::real_callback()
{
	count++;
	...
}

void
Icon::static_callback(Icon* icon)
{
	icon->real_callback();
}

The reason for calling real_callback from static_callback is
to avoid having to specify icon->count etc. to reference
components of the Icon object.  This makes a difference in
readability if your callback function does a bunch of stuff.
The reason for inlining to not incur the cost of an
additional call (if this matters -- usually it doesn't).
Inlining can get in your way during debugging (atleast gdb
loses its mind) so provide a way to disable it.  BTW, this
idiom is useful pretty much any time you have to use C++
callbacks from C code, not just for X11.


To Unsubscribe: send mail to majordomo@FreeBSD.org
with "unsubscribe freebsd-hackers" in the body of the message




Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?199910270339.XAA11567>