NSStatusItem, LSUIElement et comportement d'une app
hdex
Membre
Bonjour a tous,
J'aimerai reproduire le comportement de l'application "Internet Connect" ou même iChat d'Apple. En clair, être capable de lancer l'appli et l'utiliser depuis le dock ou (via un NSStatusItem) la faire tourner dans la barre de menu sans autre élément d'interfaces (icone, fenêtre) mais avec la possibilité d'afficher l'interface à la demande.
J'ai regarde du cote de LSUIElement et LSBackgroundOnly mais ca semble figer le comportement de l'appli (a mois d'aller bidouiller le fichier info.plist depuis l'appli).
Je ferai bien 2 applis differentes mais avec tout un tas de code redondant ça semble un peu :)beta: ... J'avoue que la je suis preneur de toutes pistes ...
J'aimerai reproduire le comportement de l'application "Internet Connect" ou même iChat d'Apple. En clair, être capable de lancer l'appli et l'utiliser depuis le dock ou (via un NSStatusItem) la faire tourner dans la barre de menu sans autre élément d'interfaces (icone, fenêtre) mais avec la possibilité d'afficher l'interface à la demande.
J'ai regarde du cote de LSUIElement et LSBackgroundOnly mais ca semble figer le comportement de l'appli (a mois d'aller bidouiller le fichier info.plist depuis l'appli).
Je ferai bien 2 applis differentes mais avec tout un tas de code redondant ça semble un peu :)beta: ... J'avoue que la je suis preneur de toutes pistes ...
Connectez-vous ou Inscrivez-vous pour répondre.
Réponses
.
LSUIElement me permet de masquer l'UI tout en ayant un NSStatusItem, j'ai teste pas de probleme.
Pour ce qui est du switch entre appli sans UI/appli avec UI le tout dans une meme appli, il faut creer un "helper" qui se charge de faire le switch entre les 2 modes.
Ca veut bien dire plusieurs bundle dans une meme app histoire que mon bundle avec UI est un LSUIElement a 0.
J'ai bon ou j'ai vraiment rien compris ?
PS : si j'ai tout faux, vous avez le droit de >:D
En fait, il s'agit de 2 applis différentes, donc 2 bundles différents.
Toutefois, rien ne t'interdit de déposer le 2nd bundle (celui de l'appli avec UI) dans le rép "Resources" (par exemple) du 1er bundle (celui de l'appli sans UI).
Ainsi, lors du lancement de l'appli avec UI (après choix d'un item NSStatusItem si j'ai bien compris de l'appli sans UI), il te suffit de récupérer le chemin du bundle UI, puis de le lancer (par un -[NSWorkPlace launchApplication:] par exemple).
L'avantage de ceci est d'avoir dans le même paquet (le bundle sans UI) tout ce qui est nécessaire pour toi, d'où une installation facile.
.
Ca fait un peu de code redondant (a moi de faire une sorte de demon et des app qui discutent avec le demon) mais ça semble être le plus simple à gérer.
Le code redondant (en fait les classes communes) peuvent être dans un plugin.
Chaque appli (la sans-UI et la avec-UI) charge alors à son démarrage le plugin afin de disposer des classes communes.
Le plugin est quelque chose de très facile à faire en Obj-C dans Xcode, et c'est encore plus facile à charger dans son appli.
.
Au fin fond de l'Univers Mac, à des années et des années-lumière de la Pomme,
Veille celui que le debutant Cocoa appelle
Quand il n'est plus capable de trouver une solution à ses problèmes,
Quand il ne reste plus aucun espoir :
le Capitaine Bru!
[size=5pt]A chantonner sur l'air du capitaine Flam ... pour ceux qui ont connu (oui je sais ca commence a dater)[/size]
Créer un NSMenuExtra
ça été le sujet de gros débats pour / contre, et mon but n'est pas du tout d'en relancer un, mais jette-y un oeuil avant de décider d'utiliser un Helper avec un NSStatusItem.
Et pour preuve ! la méthode des MenuExtras que tu évoques utilise des méthodes non-documentées.
Je ne suis pas contre l'utilisation des undocumented quand il n'y a pas d'autres moyens.
Là , Apple fournit des outils (NSStatusItem/NSStatusBar) capable de faire (presque) la même chose.
Alors, pourquoi hésiter ?
En quoi c'est pratique ?
Que ce soit un child-process de SystemUIServer ou de LoginWindow, je ne vois pas trop la différence...
Tout comme Mac OSX se charge de charger une appli (normale sans UI) au login (si celle ci se trouve dans les "éléments de démarrage").
D'autre part, l'utilisateur garde la maà®trise totale de lancer a-la-mano son appli, mais aussi de la faire quitter à tout moment.
Ce qui est parfaitement impossible avec MenuExtra (où la même manip nécessite un redémarrage de la session).
Et donc ? C'est un avantage ?
C'est le seul avantage par rapport à NSStatusItem/NSStatusBar.
Et encore, à part faire mumuse pour déplacer les items...
De plus, retirer l'item de la barre :
1. ne fait pas quitter le process qui y est rattaché (il reste actif en mémoire).
2. oblige de toute manière à créer un UI (sous forme d'appli ou de pref-panel) pour manipuler le process attaché au MenuExtra.
Croyez un mec qui adore pourtant les undocumented... Moi j'utiliserais bien sûr NSStatusItem/NSStatusBar sans hésitation.
.
C'est possible: "killall SystemUIServer"
Bah ça montre que c'est un manière de faire très stable et tout, si c'est celle qu'Apple utilise...
Personellement je veux pouvoir remanier mes menus dans l'ordre que je veux.
Tu as plein de petites apps qui sont fait avec des MenuExtras: iStat Menu Pro, Menu Meters, et bien d'autre... comparé à par ex. Skitch, qui est super mais qui s'ordonne dans ordre de lancement de l'appli au lieu de l'ordre que j'ai choisis...
Moi je veux pouvoir avoir mes menu dans un ordre spécifique... je haid skitch / adium / et le seul menu apple fait comme ça: Airport Disk agent.
1. je te l'accorde
2. bah non... pas du tout...
Personellement j'avais commencé un projet avec NSStatusItem, et je l'avais recommencé avec NSMenuExtra, et j'ai vraiment préféré NSMenuExtra.
En effet comme tu dis, utiliser des undocumented quand il est possible d'utiliser documented n'est pas bien, mais à mon avis dans cette situation NSMenuExtra apporte bien asser d'avantage par rapport à l'autre facon pour le rendre une alternative tout à fait valable...
NSMenuExtra: mieux pour l'utilisateur final, ce qui est la première priorité AMHA
NSStatusItem: mieux pour le développeur...
Si non, la licence "artistic" permet quoi exactement ?
Dans le lien que t'as donné, il est dit :
C'est à dire que pour 10.2 et >, il faut Menu Extra Enabler ou MenuCracker
Pour le moment je vais me concentrer sur NSStatusItem. NSMenuExtra et la possibilites de planter SystemUIServer c'est un peu la grande ecole ... je suis encore en maternelle Objective-C
Je n'ai jamais rien utilisé de la sorte et tout à fonctionné, peut-être que ça été changé depuis Tiger.
Cet article à été écrit à l'époque de Jaguar, et n'est p-ê plus à jour.
Vala par exemple le message que j'ai dans la console :