[prev in list] [next in list] [prev in thread] [next in thread] 

List:       kde-bindings
Subject:    Re: [Kde-bindings] Argument against the current direction of KDE
From:       Richard Dale <Richard_Dale () tipitina ! demon ! co ! uk>
Date:       2005-06-12 20:02:43
Message-ID: 200506122202.43453.Richard_Dale () tipitina ! demon ! co ! uk
[Download RAW message or body]

On Sunday 12 June 2005 04:08, Ashley Winters wrote:
> --- Adam Treat <manyoso@yahoo.com> wrote:
> > Hey Everyone, I couldn't keep my mouth shut... I just had to let you
> > know I
> > think we're all barking up the wrong tree with KDE bindings for KDE4.
> >  Most
> > of you have all heard my feelings before, but if not:
> >
> > http://www.kdedevelopers.org/node/view/1150
>
> And I agreed with him in a back-handed way. :)
> http://jahqueel.blogspot.com/2005/06/smoke-kde-com-win32.html
"Distributed Smoke (aka. DSmoke) would be a relatively simple add-on to the 
built-in marshalling system. "

It already exists! It is called Korundum DCOP support. It uses nested 
method_missing calls to interface with both Smoke, and a remote DCOP call. 
From korundum.rb:

	class DCOPRef < Qt::Base
		def method_missing(*k)
			# Enables DCOPRef calls to be made like this:
			#
			# dcopRef = DCOPRef.new("dcopslot", "MyWidget")
			# result = dcopRef.getPoint("Hello from dcopcall")
			begin
				# First look for a method in the Smoke runtime.
				# If not found, then throw an exception and try dcop.
				super(*k)
			rescue
			
			...

				return callExt(method, *dcopArgs)
			end

It dynamically looks up QDataStream '<<' and '>>' operators in the Smoke 
runtime. From Korundum.cpp:

// Look for methods of the form: QDataStream & operator>>(QDataStream&, 
MyClass&)
Smoke::Index meth = t.smoke()->findMethod("QGlobalSpace", "operator>>##");
Smoke::Index ix;
if (meth > 0) {
	ix = t.smoke()->methodMaps[meth].method;
	ix = -ix;		// turn into ambiguousMethodList index
	while (t.smoke()->ambiguousMethodList[ix]) {
		Smoke::Method &method = 
t.smoke()->methods[t.smoke()->ambiguousMethodList[ix]];
		QString	refType(t.name());
		refType += "&";
		if (	strcmp(	"QDataStream&", 
						t.smoke()->types[t.smoke()->argumentList[method.args+0]].name ) == 0 
				&& strcmp(	refType.latin1(), 
							t.smoke()->types[t.smoke()->argumentList[method.args+1]].name ) == 0 ) 
		{
			Smoke::ClassFn fn = t.smoke()->classes[method.classId].classFn;
			Smoke::StackItem local_stack[3];
			local_stack[1].s_voidp = stream;
			local_stack[2].s_voidp = stack[i].s_voidp;
			// Call the QDataStream marshaller read method
			// on the instance to be marshalled
			(*fn)(method.method, 0, local_stack);
			break;
		}
		ix++;
	}
}					

-- Richard
_______________________________________________
Kde-bindings mailing list
Kde-bindings@kde.org
https://mail.kde.org/mailman/listinfo/kde-bindings
[prev in list] [next in list] [prev in thread] [next in thread] 

Configure | About | News | Add a list | Sponsored by KoreLogic