2012-08-27 15 views
7

Estoy empezando a escribir una pequeña aplicación para Linux bajo el marco de Mono, la aplicación será esencialmente una pequeña interfaz de kiosco con muy poca interacción del usuario. Esto es para reemplazar una versión anterior de la misma aplicación que estaba 100% basada en texto/consola.¿Cómo acceder a Linux Framebuffer en Mono (Mono.Cairo/GTK #)?

Como este se ejecutará en un Raspberry Pi, que quiere evitar la utilización X y tienen mi solicitud hablar con el framebuffer directamente. Estoy preparado para usar el framework Mono y C# como mi lenguaje de desarrollo ya que conozco C# muy bien. La portabilidad no es un problema en este caso.

Estoy teniendo algunos problemas para encontrar las bibliotecas y enlaces adecuados a me deja acceder a la Framebuffer de Mono sin embargo. Las bibliotecas GTK# se vinculan explícitamente a la interfaz X11 y, en cualquier caso, no parece haber bibliotecas GtkFB precompiladas en Debian Wheezy para la arquitectura ARM Soft-Float (armel).

La biblioteca Mono.Cairo expone un tipo DirectFBSurface, sin embargo, la constructora de dicha superficie toma dos argumentos IntPtr y no está documentado, así que no sé lo que debería ser pasado al constructor para inicializar correctamente el framebuffer como superficie de El Cairo.

¿Alguien ha trabajado con Mono y C# para hablar con Linux Framebuffer, y si es así, puede proporcionar ejemplos básicos para inicializar y comenzar a dibujar en el FB, o indicar documentación en línea para ayudar?

Actualización 1

pensé que iba a tratar una instancia del DirectFBSurface con null tanto para los parámetros del constructor, con el siguiente código:

public static void Main(string[] args) 
{ 
    // ... 
    DirectFBSurface surface = new DirectFBSurface(((IntPtr)null), ((IntPtr)null)); 
    // ... 
} 

esperaba que esto genera una excepción que indica que null no se permitieron los valores de los parámetros; sin embargo, parece que DirectFBSurface no está implementado en Mono.Cairo o no está compilado en la biblioteca incluida con 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 

por lo que parece que el enfoque Mono.Cairo probablemente no funcionará para mis necesidades, y como se señaló anteriormente, GTK# biblioteca Framebuffer no parece ser parte de Debian Wheezy para Armel. ¿Hay otro conjunto de bibliotecas que podría utilizar para acceder al Linux Framebuffer desde Mono?

+0

¿es este usted? http://www.raspberrypi.org/phpBB3/viewtopic.php?t=15788&p=160933 – IanNorton

+0

Si es así, podría dibujar en una superficie de software en El Cairo y ajustarla a la superficie del SDL de vez en cuando. – IanNorton

+2

Parece que necesita pasar un puntero a un IDirectFB nativo y una IDirectFBSurface. Aquí está la fuente de Mono.Cairo: https://github.com/mono/mono/blob/master/mcs/class/Mono.Cairo/Mono.Cairo/DirectFBSurface.cs Y aquí está el origen de El Cairo para ese constructor: http : //cgit.freedesktop.org/cairo/tree/src/cairo-directfb-surface.c#n499 – joncham

Respuesta

2

El EntryPointNotFoundException que obtiene, significa que el símbolo cairo_directfb_surface_create con (IntPtr, IntPtr) como argumentos no se encontró en su biblioteca libcairo.so.2 desde debian. Este puede ser el caso, si directfb no se habilitó en tiempo de compilación en cairo. Puede comprobar la compatibilidad directfb en El Cairo haciendo:

readelf -Ws /usr/lib/libcairo.so.2 | grep directfb 

Si el resultado (salida) está vacía, que carecen de apoyo directfb. En este caso, debe recompilar cairo con el argumento --enable-directfb pasado al script de configuración.

He probado en una caja de openSUSE 12.1 y Fedora 17, y ambos no parecen enviar directfb Cairo activado por defecto. Aunque no sé nada de Debian, tendrás que ponerte a prueba.