我開始在Mono框架下爲Linux編寫一個小型應用程序,該應用程序本質上是一個小型自助服務終端,用戶交互非常少。這是取代基於100%文本/控制檯的相同應用程序的先前版本。如何訪問Mono(Mono.Cairo/GTK#)中的Linux Framebuffer?
因爲這將在Raspberry Pi上運行,所以我想避免運行X並讓我的應用程序直接與Framebuffer對話。我開始使用Mono框架和C#作爲我的開發語言,因爲我非常瞭解C#。在這種情況下,可移植性不是問題。
我在查找適當的庫和綁定時遇到了一些麻煩,但是讓我從Mono訪問Framebuffer。 GTK#
庫都顯式綁定到X11接口,並且在任何情況下,Debian Wheezy都沒有爲ARM Soft-Float(armel)體系結構預構建GtkFB庫。
的Mono.Cairo
庫公開一個DirectFBSurface
類型,但是構造爲表面採用兩個IntPtr
參數並沒有記錄,所以我不知道應該怎樣傳遞到構造函數正確初始化幀緩衝區的開羅表面。
有沒有人與Mono和C#一起討論Linux Framebuffer,如果可以的話,你能否提供基本的例子來初始化並開始繪製到FB上,或者指向在線文檔來協助?
更新1
我想我會嘗試實例化DirectFBSurface與null
兩個構造函數的參數,用下面的代碼:
public static void Main(string[] args)
{
// ...
DirectFBSurface surface = new DirectFBSurface(((IntPtr)null), ((IntPtr)null));
// ...
}
我預計在產生一個異常,表明null
參數值是不允許的,但是它看起來好像DirectFBSurface沒有在Mono.Cairo
中實現,或者沒有被編譯到Debian Wheezy(armel)附帶的庫中:
Unhandled Exception: System.EntryPointNotFoundException: cairo_directfb_surface_create
at (wrapper managed-to-native) Cairo.NativeMethods:cairo_directfb_surface_create (intptr,intptr)
at Cairo.DirectFBSurface..ctor (IntPtr dfb, IntPtr dfb_surface) [0x00000] in <filename unknown>:0
at Info.Insch.SandBox.TestCairo.Program.Main (System.String[] args) [0x00000] in <filename unknown>:0
所以看來Mono.Cairo
做法可能不會爲我的工作需要,並且如上所述,GTK#
幀緩衝庫似乎並沒有成爲阿梅爾Debian的喘息的一部分。是否有另一套我可以用來從Mono訪問Linux Framebuffer的庫?
這是你的嗎? http://www.raspberrypi.org/phpBB3/viewtopic.php?t=15788&p=160933 – IanNorton
如果是這樣,您可以在開羅繪製軟件表面,並且每隔一段時間將其噴到SDL表面上。 – IanNorton
看來您需要將指針傳遞給本機IDirectFB和IDirectFBSurface。這裏是Mono.Cairo的源代碼:https://github.com/mono/mono/blob/master/mcs/class/Mono.Cairo/Mono.Cairo/DirectFBSurface.cs這裏是該構造函數的cairo源代碼:http ://cgit.freedesktop.org/cairo/tree/src/cairo-directfb-surface.c#n499 – joncham