2013-03-05 6 views
25

Lavoro su Windows ma sono bloccato qui su Mac. Ho l'SDK Canon e ho costruito un wrapper JNA su di esso. Funziona bene su Windows e ha bisogno di aiuto con il Mac. Nel sdk, c'è una funzione in cui è possibile registrare una funzione di callback. Fondamentalmente quando un evento si verifica nella fotocamera, chiama la funzione di callback.Ottieni eventi dal sistema operativo

su Windows, dopo la registrazione, ho bisogno di usare User32 per ottenere l'evento e per inviare l'evento da:

private static final User32 lib = User32.INSTANCE; 
boolean hasMessage = lib.PeekMessage(msg, null, 0, 0, 1); // peek and remove 
if(hasMessage){ 
    lib.TranslateMessage(msg); 
    lib.DispatchMessage(msg); //message gets dispatched and hence the callback function is called 
} 

nell'API, non trovo una classe simile a Mac. Come vado su questo?

PS: Il JNAapi per unix è esteso e non riuscivo a capire cosa cercare. Il reference potrebbe essere d'aiuto

+0

Probabilmente si consiglia di controllare GCEventRef, https://developer.apple.com/library/mac/documentation/Carbon/Reference/QuartzEventServicesRef/Reference/reference .html –

+0

La maggior parte dei mapping di piattaforma di JNA per unix sono per X11 e non c'è molto specificamente per OS X. [Rococoa] (http://code.google.com/p/rococoa/) ha molto di più in uscita di mappature OS X. – technomage

+0

@technomage Non posso ora passare a Rococoa perché poi dovrò riscrivere il codice. Windows uno funziona già bene. Ho solo bisogno di una tecnica per ottenere il messaggio – Jatin

risposta

3

Questa soluzione utilizza il framework Cocoa. Il cacao è deprecato e non sono a conoscenza di altre soluzioni alternative. Ma il sotto funziona come fascino.

Infine ho trovato la soluzione utilizzando il framework Carbon. Ecco la mia interfaccia MCarbon che definisce le chiamate di cui ho bisogno.

public interface MCarbon extends Library { 
    MCarbon INSTANCE = (MCarbon) Native.loadLibrary("Carbon", MCarbon.class); 
    Pointer GetCurrentEventQueue(); 
    int SendEventToEventTarget(Pointer inEvent, Pointer intarget); 
    int RemoveEventFromQueue(Pointer inQueue, Pointer inEvent); 
    void ReleaseEvent(Pointer inEvent); 
    Pointer AcquireFirstMatchingEventInQueue(Pointer inQueue,NativeLong inNumTypes,EventTypeSpec[] inList, NativeLong inOptions); 
    //... so on 
    } 

La soluzione al problema è risolto utilizzando la seguente funzione:

NativeLong ReceiveNextEvent(NativeLong inNumTypes, EventTypeSpec[] inList, double inTimeout, byte inPullEvent, Pointer outEvent); 

Questo fa il lavoro. Come da documentazione -

This routine tries to fetch the next event of a specified type. 
If no events in the event queue match, this routine will run the 
current event loop until an event that matches arrives, or the 
timeout expires. Except for timers firing, your application is 
blocked waiting for events to arrive when inside this function. 

anche se non ReceiveNextEvent, poi altre funzioni come indicato nel MCarbon classe superiore sarebbe utile.

Penso che Carbon quadro documentation darebbe più informazioni e flessibilità per risolvere il problema. A parte lo Carbon, nei forum le persone hanno menzionato la soluzione utilizzando Cocoa, ma nessuno di essi ne è a conoscenza.

Edit: Grazie a technomarge, ulteriori informazioni here

+0

Fresco. Peccato che il carbonio sia deprecato però. –

+0

@AmigableClarkKant Qualsiasi altra alternativa? – Jatin

+0

scusa no, non che io sappia. (Ma potrebbe esserci.) –