Recuperer des evenement clavier d'une application

tmatortmator Membre
08:26 modifié dans API AppKit #1
Bonjour,

je débute en cocoa et je suis bloqué sur un petit problème. J'ai une application qui utilise des plugins sous forme de librairies dynamiques pour gere les entrées (clavier, ...), audio et video.

J'ai ecrit le plugin video en cocoa qui fonctionne tres bien.

Maintenant j'essaie de faire un plugin récuperant les evenement du clavier mais je ne recupere aucun evenements, est ce par ce que mon code n'est pas dans la boucle de l'appli qui est dans la partie gl ? je n'ai pas de reponse. En esperant que vous pourrez m'aider, je poste le code cocoa de la partie video et de la partie event. Je précise que lorsque j'execute mon code, je passe a chaque foi dans le
if ( event == nil )
, donc qu'il n'y a pas d'evenement alors que j'appui sur les touches du clavier. J'ai deja teste ce code dans une appli simple avec tout a plat (partie graphique et event) et ca fonctionne.

Code de la partie affichage et creation d'application

#import &quot;cocoaGL.h&quot;<br /><br />@implementation NSApplication(i)<br />- (void)appRunning<br />{<br />&nbsp; &nbsp; _running = 1;<br />}<br />@end<br /><br />@interface cocoaAppDelegate : NSObject<br />- (NSApplicationTerminateReply)applicationShouldTerminate:(NSApplication *)sender;<br />@end<br /><br />@implementation cocoaAppDelegate : NSObject<br />- (NSApplicationTerminateReply)applicationShouldTerminate:(NSApplication *)sender<br />{<br />&nbsp; &nbsp; return NSTerminateCancel;<br />}<br />@end<br /><br /><br />void cocoaGLCreateApp()<br />{<br />&nbsp; &nbsp; 	ProcessSerialNumber psn;<br />&nbsp; &nbsp; 	NSAutoreleasePool *pool;<br /><br />&nbsp; &nbsp; 	if (!GetCurrentProcess(&amp;psn)) {<br />&nbsp; &nbsp; &nbsp; &nbsp; 	TransformProcessType(&amp;psn, kProcessTransformToForegroundApplication);<br />&nbsp; &nbsp; &nbsp; &nbsp; 	SetFrontProcess(&amp;psn);<br />&nbsp; &nbsp; 	}<br /><br />&nbsp;  	pool = [[NSAutoreleasePool alloc] init];<br />&nbsp; &nbsp; 	<br />	if (NSApp == nil) {<br />&nbsp; &nbsp; &nbsp; &nbsp; 	[NSApplication sharedApplication];<br />		//TODO : Create menu<br />&nbsp; &nbsp; &nbsp; &nbsp; 	[NSApp finishLaunching];<br />&nbsp; &nbsp; 	}<br />&nbsp; &nbsp; 	<br />	if ([NSApp delegate] == nil) {<br />&nbsp; &nbsp; &nbsp; &nbsp; 	[NSApp setDelegate:[[cocoaAppDelegate alloc] init]];<br />&nbsp; &nbsp; 	}<br />&nbsp; &nbsp; 	<br />	[NSApp appRunning];<br />&nbsp; &nbsp; 	<br />	[pool release];<br /><br />}<br /><br />NSWindow *cocoaGLCreateWindow(int w,int h)<br />{<br /><br />	NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];<br />&nbsp; &nbsp; 	NSWindow *window;<br />&nbsp; &nbsp; 	window = [[NSWindow alloc] initWithContentRect:NSMakeRect(50,50,w,h)<br />&nbsp; &nbsp; &nbsp; &nbsp; 				styleMask:NSTitledWindowMask | NSResizableWindowMask<br />&nbsp; &nbsp; &nbsp; &nbsp; 				backing:NSBackingStoreBuffered<br />&nbsp; &nbsp; &nbsp; &nbsp; 				defer:FALSE];<br /><br />	[window setTitle:@&quot;Dolphin on OSX&quot;];<br />	[window makeKeyAndOrderFront: nil];<br /><br />	[pool release];<br /><br />	return window;<br />}<br /><br />void cocoaGLSetTitle(NSWindow *win, const char *title)<br />{<br />&nbsp; &nbsp; NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];<br />&nbsp; &nbsp; <br />&nbsp; &nbsp; [win setTitle: [[[NSString alloc] initWithCString: title encoding: NSASCIIStringEncoding] autorelease]];<br /><br />&nbsp; &nbsp; [pool release];<br />}<br /><br />void cocoaGLMakeCurrent(NSOpenGLContext *ctx, NSWindow *win)<br />{<br />&nbsp; &nbsp; 	NSAutoreleasePool *pool;<br /><br />&nbsp; 	pool = [[NSAutoreleasePool alloc] init];<br /><br />	int value = 0;<br />&nbsp; &nbsp; &nbsp; &nbsp; [ctx setValues:&amp;value forParameter:NSOpenGLCPSwapInterval];<br /><br />&nbsp; &nbsp; 	if (ctx) {<br /><br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 	[ctx setView:[win contentView]];<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 	[ctx update];<br />&nbsp; &nbsp; &nbsp; &nbsp; 	[ctx makeCurrentContext];<br />	} else {<br />&nbsp; &nbsp; &nbsp; &nbsp; 	[NSOpenGLContext clearCurrentContext];<br />&nbsp; &nbsp; 	}<br /><br />&nbsp; &nbsp; 	[pool release];<br /><br />}<br /><br /><br /><br />NSOpenGLContext* cocoaGLInit(int mode)<br />{<br />&nbsp;  	NSAutoreleasePool *pool;<br />&nbsp; &nbsp; 	NSOpenGLPixelFormatAttribute attr[32];<br />&nbsp; &nbsp; 	NSOpenGLPixelFormat *fmt;<br />&nbsp; &nbsp; 	NSOpenGLContext *context;<br />&nbsp; &nbsp; 	int i = 0;<br /><br />	pool = [[NSAutoreleasePool alloc] init];<br />	<br />	attr[i++] = NSOpenGLPFADepthSize;<br />	attr[i++] = 24;<br />	attr[i++] = NSOpenGLPFADoubleBuffer;<br />	<br />&nbsp; &nbsp; &nbsp; &nbsp; attr[i++] = NSOpenGLPFASampleBuffers;<br />&nbsp; &nbsp; &nbsp; &nbsp; attr[i++] = mode;<br />&nbsp; &nbsp; &nbsp; &nbsp; attr[i++] = NSOpenGLPFASamples;<br />&nbsp; &nbsp; &nbsp; &nbsp; attr[i++] = 1;<br /><br />	//if opengl &lt; 1.3 uncomment this twoo lines to use software renderer<br />&nbsp; &nbsp; &nbsp; &nbsp; //attr[i++] = NSOpenGLPFARendererID;<br />&nbsp; &nbsp; &nbsp; &nbsp; //attr[i++] = kCGLRendererGenericFloatID;<br /><br />&nbsp; &nbsp; 	attr[i++] = NSOpenGLPFAScreenMask;<br />&nbsp; &nbsp; 	attr[i++] = CGDisplayIDToOpenGLDisplayMask(CGMainDisplayID());<br /><br />&nbsp; &nbsp; 	attr[i] = 0;<br /><br />&nbsp; &nbsp; 	fmt = [[NSOpenGLPixelFormat alloc] initWithAttributes:attr];<br />&nbsp;  	if (fmt == nil) {<br />&nbsp; &nbsp; &nbsp; &nbsp; 	printf(&quot;failed to create pixel format&#092;n&quot;);<br />&nbsp; &nbsp; &nbsp; &nbsp; 	[pool release];<br />&nbsp; &nbsp; &nbsp; &nbsp; 	return NULL;<br />&nbsp; &nbsp; 	}<br /><br />&nbsp; &nbsp; 	context = [[NSOpenGLContext alloc] initWithFormat:fmt shareContext:nil];<br /><br />&nbsp; &nbsp; 	[fmt release];<br /><br />&nbsp; &nbsp; 	if (context == nil) {<br />&nbsp; &nbsp; &nbsp; &nbsp; 	printf(&quot;failed to create context&#092;n&quot;);<br />&nbsp; &nbsp; &nbsp; &nbsp; 	[pool release];<br />&nbsp; &nbsp; &nbsp;  	 	return NULL;<br />&nbsp; &nbsp; 	}<br /><br />&nbsp; &nbsp; 	[pool release];<br /><br />&nbsp; &nbsp; 	return context;<br /><br />}<br /><br />void cocoaGLDelete(NSOpenGLContext *ctx)<br />{<br />&nbsp; &nbsp; 	NSAutoreleasePool *pool;<br /><br />&nbsp; &nbsp; 	pool = [[NSAutoreleasePool alloc] init];<br /><br />&nbsp; &nbsp; 	[ctx clearDrawable];<br />&nbsp; &nbsp; 	[ctx release];<br /><br />&nbsp; &nbsp; 	[pool release];<br /><br />}<br /><br />void cocoaGLSwap(NSOpenGLContext *ctx,NSWindow *window)<br />{<br />&nbsp; &nbsp; 	NSAutoreleasePool *pool;<br /><br />&nbsp; &nbsp; 	pool = [[NSAutoreleasePool alloc] init];<br />	[window makeKeyAndOrderFront: nil];<br /><br />&nbsp; &nbsp; 	ctx = [NSOpenGLContext currentContext];<br />&nbsp;  	if (ctx != nil) {<br />&nbsp; &nbsp; &nbsp; &nbsp; 	[ctx flushBuffer];<br />&nbsp; &nbsp; 	}<br />	else<br />	{<br />		printf(&quot;bad cocoa gl ctx&#092;n&quot;);<br />	}<br />&nbsp; &nbsp; 	[pool release];<br /><br />}


code de la partie evenements

#import &quot;cocoaKeyboard.h&quot;<br /><br />int CocoaGetKeyCode(NSEvent *event)<br />{<br />&nbsp; &nbsp; &nbsp; &nbsp; unsigned short scancode = [event keyCode];<br />&nbsp; &nbsp; &nbsp; &nbsp; return scancode;<br />}<br /><br />int CocoaEvent()<br />{<br />&nbsp; &nbsp; &nbsp; &nbsp; NSAutoreleasePool *pool;<br /><br />&nbsp; &nbsp; &nbsp; &nbsp; pool = [[NSAutoreleasePool alloc] init];<br />&nbsp; &nbsp; &nbsp; &nbsp; while ([NSApp isRunning]) {<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; NSEvent *event = [NSApp nextEventMatchingMask:NSAnyEventMask untilDate:[NSDate distantPast] inMode:NSDefaultRunLoopMode dequeue:YES ];<br /><br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; if ( event == nil ) {<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; break;<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; }<br /><br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; switch ([event type]) {<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; case NSKeyDown:<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; printf(&quot;Down event %d&#092;n&quot;,CocoaGetKeyCode(event));<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; case NSKeyUp:<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; printf(&quot;Up event %d&#092;n&quot;,CocoaGetKeyCode(event));<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; break;<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; default:<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; [NSApp sendEvent:event];<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; break;<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; }<br />&nbsp; &nbsp; &nbsp; &nbsp; }<br />&nbsp; &nbsp; &nbsp; &nbsp; [pool release];<br />}<br />


Au passage, un grand merci a ce site qui m'a deja permi de me debloquer pas mal de fois en lisant les messages ;)

Réponses

  • NoNo Membre
    08:26 modifié #2
    dans 1230571649:

    Maintenant j'essaie de faire un plugin récuperant les evenement du clavier mais je ne recupere aucun evenements, est ce par ce que mon code n'est pas dans la boucle de l'appli qui est dans la partie gl ? je n'ai pas de reponse. En esperant que vous pourrez m'aider, je poste le code cocoa de la partie video et de la partie event. Je précise que lorsque j'execute mon code, je passe a chaque foi dans le

    J'avoue ne pas comprendre ni ton besoin, ni ton code.
    Tu parles de plugin, mais en quelle technologie ?
    Comment les intègres/appelles tu depuis une application cocoa ?
  • tmatortmator Membre
    08:26 modifié #3
    En fait c'est un émulateur pour lequel on utilise divers plugins pour gerer différement l'affichage, les E/S, l'audio ...

    Le plus simple est peut être de voir tout le code pour comprendre, en esperant que ca aide

    http://code.google.com/p/dolphin-emu/source/checkout
  • NoNo Membre
    08:26 modifié #4
    Ca n'aide pas beaucoup.

    2 choses :
    - soit c'est l'application hôte qui transmet ses événements au plugin concerné,
    - soit c'est le plugin qui va monitorer les événements que le window-server envoie à  l'application hôte via des taps.
Connectez-vous ou Inscrivez-vous pour répondre.