Ah, got the examples working :)

I replaced all X11Drawable arguments in the ffi call signature to ulong
and replace the call ... drawable ... with ... drawable xid ...

attached is the changeset
(who maintains the FFI-Package and  the X11 examples?)




2014-09-22 23:10 GMT+02:00 p...@highoctane.be <p...@highoctane.be>:

> I passed 'localhost:0:0' in the XWindows example and this gave me a window
> reference.
>
> The next problem was that it broke after that. But I got the handle.
>
> Try with that, it may help.
>
> Phil
>
>
> On Mon, Sep 22, 2014 at 10:02 PM, Annick Fron <l...@afceurope.com> wrote:
>
>> Thanks you
>> The problem is I wanted to use X windows !
>> Otherwise I have managed to use FFI on Linux.
>> Perhaps there is a glitch when passing nil as argument. It is not clear
>> whether we have to use nil or 0 (as a null pointer).
>> This is really my point, I sometimes need to pass NULL.
>> Annick
>>
>> Le 22 sept. 2014 à 21:22, Nicolai Hess <nicolaih...@web.de> a écrit :
>>
>>
>> 2014-09-22 18:10 GMT+02:00 p...@highoctane.be <p...@highoctane.be>:
>>
>>> I've been able to reproduce this.
>>>
>>> Well, my CentOS thing requires me for some reason to put
>>> /usr/lib/libX11.so.6 in the module name (doing these kind of things looks
>>> like usual for lib names with FFI from what I saw from old Squeak threads).
>>>
>>
>> Yes, I read this threads too, I solved it by
>> LD_LIBRARY_PATH=<YOUR_PATH_TO_X11> ./pharo ....
>>
>> but no matter which of this (LD_LIBRARY_PATH or full name in the ffi
>> pragma) the call throws the
>> "could not coerce arguments"- error.
>>
>> But the Sample class>>callC: method you wrote in the other mail works.
>>
>>
>>>
>>> XCreateGC: xDisplay with: aDrawable with: valueMask with: values
>>> <cdecl: X11GC 'XCreateGC' (X11Display* X11Drawable ulong long*) module:
>>> '/usr/lib/libX11.so.6'>
>>>
>>> Now, other internal FFIPrims tests do work.
>>>
>>> So, it is X11 or something else, I do not know.
>>>
>>> Phil
>>>
>>>
>>> On Mon, Sep 22, 2014 at 4:39 PM, Ben Coman <b...@openinworld.com> wrote:
>>>
>>>> Annick Fron wrote:
>>>>
>>>>> Hi,
>>>>>
>>>>> I have posted a bug about this in fogbugz.
>>>>> FFI example on Linux don’t work
>>>>>
>>>>> X11Display coloredRectangles
>>>>> raises an error « coud not coerce arguments ».
>>>>> In fogbugz, I was asked to raise this question in the mailing list, to
>>>>> know if it comes from the VM or from FFI.
>>>>>
>>>>> Annick
>>>>>
>>>>>
>>>>>
>>>> Hi Annick,
>>>> Sorry I don't know anything about this topic to help, just a minor
>>>> observation that a link to the fogbugz issue would help streamline things
>>>> for someone who does.
>>>> :)
>>>> cheers -ben
>>>>
>>>>
>>>>
>>>>
>>>
>>
>>
>
'From Pharo3.0 of 18 March 2013 [Latest update: #30854] on 23 September 2014 at 12:08:02.915403 am'!

!X11GC methodsFor: 'drawing' stamp: 'NicolaiHess 9/23/2014 00:05'!
drawOval: aRectangle
	self
		XDrawArc: self display
			with: drawable xid
			with: self
			with: aRectangle left
			with: aRectangle top
			with: aRectangle width
			with: aRectangle height
			with: 0
			with: 64*360! !

!X11GC methodsFor: 'drawing' stamp: 'NicolaiHess 9/23/2014 00:06'!
fillRectangle: aRectangle
	self
		XFillRectangle: self display
			with: drawable xid
			with: self
			with: aRectangle left
			with: aRectangle top
			with: aRectangle width
			with: aRectangle height! !

!X11GC methodsFor: 'drawing' stamp: 'NicolaiHess 9/23/2014 00:06'!
drawRectangle: aRectangle
	self
		XDrawRectangle: self display
			with: drawable xid
			with: self
			with: aRectangle left
			with: aRectangle top
			with: aRectangle width
			with: aRectangle height! !

!X11GC methodsFor: 'drawing' stamp: 'NicolaiHess 9/23/2014 00:04'!
fillOval: aRectangle
	self
		XFillArc: self display
			with: drawable xid
			with: self
			with: aRectangle left
			with: aRectangle top
			with: aRectangle width
			with: aRectangle height
			with: 0
			with: 64*360! !

!X11GC methodsFor: 'drawing' stamp: 'NicolaiHess 9/23/2014 00:07'!
drawLineFrom: pt1 to: pt2
	self XDrawLine: self display 
			with: drawable xid
			with: self 
			with: pt1 x 
			with: pt1 y 
			with: pt2 x 
			with: pt2 y! !

!X11GC methodsFor: 'xlib calls' stamp: 'NicolaiHess 9/23/2014 00:06'!
XDrawRectangle: xDisplay with: xDrawable with: xGC with: x with: y with: w with: h
	<cdecl: void 'XDrawRectangle' (X11Display* ulong X11GC long long ulong ulong) module: 'X11'>
	^self externalCallFailed! !

!X11GC methodsFor: 'xlib calls' stamp: 'NicolaiHess 9/23/2014 00:07'!
XDrawLine: xDisplay with: aDrawable with: xGC with: x0 with: y0 with: x1 with: y1
	<cdecl: long 'XDrawLine' (X11Display* ulong X11GC long long long long) module: 'X11'>
	^self externalCallFailed! !

!X11GC methodsFor: 'xlib calls' stamp: 'NicolaiHess 9/23/2014 00:05'!
XDrawArc: xDisplay with: xDrawable with: xGC with: x with: y with: w with: h with: a1 with: a2
	<cdecl: void 'XDrawArc' (X11Display* ulong X11GC long long ulong ulong long long) module: 'X11'>
	^self externalCallFailed! !

!X11GC methodsFor: 'xlib calls' stamp: 'NicolaiHess 9/23/2014 00:04'!
XFillArc: xDisplay with: xDrawable with: xGC with: x with: y with: w with: h with: a1 with: a2
	<cdecl: void 'XFillArc' (X11Display* ulong X11GC long long ulong ulong long long) module: 'X11'>
	^self externalCallFailed! !

!X11GC methodsFor: 'xlib calls' stamp: 'NicolaiHess 9/23/2014 00:06'!
XFillRectangle: xDisplay with: xDrawable with: xGC with: x with: y with: w with: h
	<cdecl: void 'XFillRectangle' (X11Display* ulong X11GC long long ulong ulong) module: 'X11'>
	^self externalCallFailed! !


!X11Display class methodsFor: 'examples' stamp: 'NicolaiHess 9/23/2014 00:06'!
x11Draw
	"X11Display x11Draw"
	| display window gc nextPt lastPt ptr |
	display := X11Display XOpenDisplay: nil.
	window := display ourWindow.
	window display:display.
	gc := X11GC on: window.
	gc foreground: 0.
	lastPt := nil.
	[ptr := display queryPointer: window.	"{root. child. root pos. win pos. mask}"
	ptr last anyMask: 256] whileFalse:[
		nextPt := ptr fourth.
		nextPt = lastPt ifFalse:[
			lastPt ifNotNil: [
				gc drawLineFrom: lastPt to: nextPt.
				display sync].
			lastPt := nextPt].
	].
	gc free.
	display closeDisplay.
	Display forceToScreen.! !

!X11Display class methodsFor: 'examples' stamp: 'NicolaiHess 9/23/2014 00:04'!
coloredEllipses
	"X11Display coloredEllipses"
	| display window gc colors rnd w h pt1 pt2 r |
	display := X11Display XOpenDisplay: nil.
	window := display ourWindow.
	window display:display.
	gc := X11GC on: window.
	colors := Color registeredColorNames collect:[:n| (Color fromString:n) pixelWordForDepth: 32].
	rnd := Random new.
	w := Display width.
	h := Display height.
	[Sensor anyButtonPressed] whileFalse:[
		pt1 := (rnd next * w) asInteger @ (rnd next * h) asInteger.
		pt2 := (rnd next * w) asInteger @ (rnd next * h) asInteger.
		r := Rectangle encompassing: (Array with: pt1 with: pt2).
		gc foreground: colors atRandom.
		gc fillOval: r.
		gc foreground: 0.
		gc drawOval: r.
		display sync.
	].
	gc free.
	display closeDisplay.
	Display forceToScreen.! !

!X11Display class methodsFor: 'examples' stamp: 'NicolaiHess 9/23/2014 00:05'!
coloredRectangles
	"X11Display coloredRectangles"
	| display window gc colors rnd w h pt1 pt2 r nPixels time n |
	display := X11Display XOpenDisplay: nil.
	window := display ourWindow.
	window display:display.
	gc := X11GC on: window.
	colors := Color registeredColorNames  collect:[:cn| (Color fromString:cn) pixelWordForDepth: 32].
	rnd := Random new.
	w := Display width.
	h := Display height.
	n := 0.
	nPixels := 0.
	time := Time millisecondClockValue.
	[Sensor anyButtonPressed] whileFalse:[
		pt1 := (rnd next * w) asInteger @ (rnd next * h) asInteger.
		pt2 := (rnd next * w) asInteger @ (rnd next * h) asInteger.
		r := Rectangle encompassing: (Array with: pt1 with: pt2).
		gc foreground: colors atRandom.
		gc fillRectangle: r.
		gc foreground: 0.
		gc drawRectangle: r.
		display sync.
		n := n + 1.
		nPixels := nPixels + ((r right - r left) * (r bottom - r top)).
		(n \\ 100) = 0 ifTrue:[
			'Pixel fillRate: ', (nPixels * 1000 // (Time millisecondClockValue - time))
				asStringWithCommas displayAt: 0@0].
	].
	gc free.
	display closeDisplay.
	Display forceToScreen.! !


!X11GC class methodsFor: 'instance creation' stamp: 'NicolaiHess 9/23/2014 00:04'!
on: aDrawable
	| xgc |
	xgc := self XCreateGC: aDrawable display with: aDrawable xid with: 0 with: nil.
	xgc drawable: aDrawable.
	^xgc! !

!X11GC class methodsFor: 'xlib calls' stamp: 'NicolaiHess 9/23/2014 00:03'!
XCreateGC: xDisplay with: aDrawable with: valueMask with: values
	<cdecl: X11GC 'XCreateGC' (X11Display* ulong ulong long*) module: 'X11'>
	^self externalCallFailed! !

Reply via email to