LSUIElement sous Tiger

décembre 2007 modifié dans Vos applications #1
Bonjour,

Je suis face à  un problème. Dans mon application, je propose d'afficher ou de masquer son icône dans le Dock (donc je touche à  LSUIElement).
Sous Leopard, pas de problème, le relaunch de l'application prend bien en compte le changement.
Mais sous Tiger, c'est autre chose. Les changements de Info.plist sont pris en compte qu'au redémarrage de la machine !!!
J'ai raté quelque chose ? Même si je modifie le Info.plist à  la main, il faut redémarrer la machine..

Note de dernière minute : si on duplique l'application les changements du Info.plist sont pris en compte

Réponses

  • décembre 2007 modifié #2
    ça n'a rien de nouveau comme "bug". Sur les systèmes pre-leopard, les Info.plist ne sont mis à  jour par le système/Finder que lorsqu'on fait certaines manips qui affectent le bundle plutôt que ses composants.

    Donc nul besoin de redémarrer. Tu peux aussi déplacer ton appli puis la remettre en place (dans le cas de versions debug) ou encore relancer le Finder. Mais vu ce que tu veux faire, c'est un peu sortir la grosse artillerie et un "touch" devrait faire l'affaire.

    EDIT: par curiosité, j'ai consulté le code source de QuickSilver.
    Après avoir modifié le Info.plist, il y a la ligne:
    [tt]NSFileManager defaultManager] changeFileAttributes:[NSDictionary dictionaryWithObject:[NSDate date] forKey:NSFileModificationDate] atPath: [[NSBundle mainBundle] bundlePath;[/tt]

    Ce qui revient au même que de faire un "touch".
  • 16:33 modifié #3
    Merci Renaud !  ;)
  • schlumschlum Membre
    16:33 modifié #4
    Sinon, on revient aux fondamentaux de la bibliothèque standard C, et on utilise "utimes"  :P
  • 16:33 modifié #5
    D'ailleurs pour ceux que ça intéresse, je restart l'application pour prendre en compte le changement de LSUIElement :

    <br />NSString* info = [[[[NSBundle mainBundle] resourcePath] stringByDeletingLastPathComponent] stringByAppendingPathComponent:@&quot;Info.plist&quot;];<br />	NSMutableDictionary* infos = [NSMutableDictionary dictionaryWithContentsOfFile:info];<br />	if([[infos objectForKey:@&quot;LSUIElement&quot;] intValue]!=1){<br />	[infos setObject:[NSNumber numberWithInt:1] forKey:@&quot;LSUIElement&quot;];<br />	[infos writeToFile:info atomically:NO];<br />	[[NSFileManager defaultManager] changeFileAttributes:[NSDictionary dictionaryWithObject:[NSDate date] forKey:NSFileModificationDate] atPath: [[NSBundle mainBundle] bundlePath]];<br />	NSURL *url = [NSURL fileURLWithPath:[[NSBundle mainBundle] bundlePath]];<br /><br />		LSLaunchURLSpec launchSpec;<br />		launchSpec.appURL = (CFURLRef)url;<br />		launchSpec.itemURLs = NULL;<br />		launchSpec.passThruParams = NULL;<br />		launchSpec.launchFlags = kLSLaunchDefaults | kLSLaunchNewInstance;<br />		launchSpec.asyncRefCon = NULL;<br /><br />		OSErr err = LSOpenFromURLSpec(&amp;launchSpec, NULL);<br />		if (err == noErr) {<br />			[NSApp terminate:nil];<br />		}<br />	}<br />
    


    (Merci à  Psycho)
  • schlumschlum Membre
    décembre 2007 modifié #6
    http://www.cocoadev.com/index.pl?RelaunchApp
    ;)

    On peut aussi le faire en AppleScript...
    (c'est peut-être même plus propre)
  • 16:33 modifié #7
    dans 1199117501:

    http://www.cocoadev.com/index.pl?RelaunchApp
    ;)

    On peut aussi le faire en AppleScript...
    (c'est peut-être même plus propre)


    J'ai préféré le C, y'a trop d'AppleScript déjà  dans mon logiciel  :o
Connectez-vous ou Inscrivez-vous pour répondre.