Problème d'activation et de firstMouse:

fouffouf Membre
01:50 modifié dans API AppKit #1
Bonjour à  tous.

Je travaille sur une appli qui possède des inspecteurs qui sont donc des fenêtres susceptible de devenir des keyWindow. Or comme vous le savez les NSView des fenêtres qui ne sont pas des keyWindow ne tiennent compte d'un click que si elles retournent YES à  -acceptFirstMouse: (c'est ce qui fait, par exemple, que lorsque vous cliquez sur un lien dans votre navigateur préféré alors que l'appli n'est pas au premier plan, le navigateur ne vous envoie pas vers le lien en question).

Donc, ce que je voudrais c'est un système qui fait que la NSView accepte les mouseDown: quand l'appli est déjà  au premier plan mais pas quand le click en question fait justement venir l'appli au premier plan.

A cet effet, j'ai mené quelques recherches :
- lorsque l'on appelle [NSApp isActive] dans le acceptFirstMouse:, cela retourne toujours YES, donc pas possible de s'en tirer a partir de là . Manifestement, l'appli et la fenêtre sont mis au premier plan avant l'appel de acceptFirstMouse: ...

- ensuite, j'ai essayé de sous-classer NSWindow pour capter les messages mouseDown: mais ce n'est pas très concluant puisque sont recus uniquement les événements qui arrivent dans une zone inocuppées de la fenêtre (non recouvert par une vue).

- enfin en surchargeant becomeKeyWindow et makeKeyWindow (et en espérant que ces méthodes appellent par la suite acceptFirstMouse: ) je suis arrivé au même résultat ...

Je fais donc appel à  vous, ô Objective-Cocoaiens en éspérant que vous ayez une réponse à  mon ch'tit problème.

Bonne soirée,  :fouf):

Réponses

  • BruBru Membre
    01:50 modifié #2
    Créé une sous-classe de NSWindow, et surcharge la méthode sendEvent:.
    Cette méthode est appelée à  chaque réception d'événement sur la fenêtre, avant que celui-ci soit dispatché aux vues contenues.
    Je crois me souvenir que isActive peut être utilisé dans cette méthode (car à  ce moment, l'appli n'est pas encore mise en avant plan).

    .
  • fouffouf Membre
    01:50 modifié #3
    Merci beaucoup Bru, ca marche du tonnerre.

    Il suffit donc de faire un flag avec un accesseur de la manière suivante
    <br />- (void)sendEvent:(NSEvent *)theEvent<br />{<br />	_appDidBecomeActive = ![NSApp isActive];<br />	[super sendEvent:theEvent];<br />	_appDidBecomeActive = NO;<br />}<br />- (BOOL)appDidBecomeActive<br />{<br />	return _appDidBecomeActive;<br />}<br />
    

    et puis ensuite la vue appelle cette méthode dans le acceptFirstMouse: et retourne donc YES ou NO selon ce que l'on veut ...

    Merci encore ...
Connectez-vous ou Inscrivez-vous pour répondre.