Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

Application Cocoa construite avec un makefile qui n'affiche pas son menu

9 réponses
Avatar
Guilhem de Wailly
Je suis tout nouveau dans la programmation macosx. Je cherche a
construire une application "hello world" avec un makefile.

Elle se compile correctement ; à l'execussion, elle affiche sa
fenêtre, mais pas son menu ; elle n'aparait pas non plus dans le
dock.

Merci par avance de toute idée...

Guilhem de Wailly

Voila les sources:


#--- makefile ---
all: main

main.o: main.m
gcc -Wall -c -g -o $@ $^

main: main.o
gcc -g -o $@ $^ -framework cocoa


/* --- main.m --- */
#include <Cocoa/Cocoa.h>

@class NSWindow;
@class NSTextField;
@class NSNotification;

@interface AppController : NSObject {
NSWindow * window;
NSTextField * label;
}
- (void)applicationWillFinishLaunching:(NSNotification *) not;
- (void)applicationDidFinishLaunching:(NSNotification *) not;
@end

@implementation AppController
- (void) applicationWillFinishLaunching: (NSNotification *) not {
/* Create Menu */
NSMenu * menu;
NSMenu * info;

NSLog (@"Creating the menu");

menu = [NSMenu new];
[menu addItemWithTitle: @"Info"
action: NULL
keyEquivalent: @""];
[menu addItemWithTitle: @"Hide"
action: @selector(hide:)
keyEquivalent: @"h"];
[menu addItemWithTitle: @"Quit"
action: @selector(terminate:)
keyEquivalent: @"q"];

info = [NSMenu new];
[info addItemWithTitle: @"Info Panel..."
action: @selector(orderFrontStandardInfoPanel:)
keyEquivalent: @""];
[info addItemWithTitle: @"Preferences"
action: NULL
keyEquivalent: @""];
[info addItemWithTitle: @"Help"
action: @selector (orderFrontHelpPanel:)
keyEquivalent: @"?"];

[menu setSubmenu: info
forItem: [menu itemWithTitle: @"Info"]];

[info release];

[NSApp setMainMenu:menu];
[menu release];

/* Create Window */
window = [[NSWindow alloc]
initWithContentRect: NSMakeRect(300, 300, 200, 100)
styleMask: (NSTitledWindowMask |
NSMiniaturizableWindowMask |
NSResizableWindowMask)
backing: NSBackingStoreBuffered
defer: YES];
[window showsResizeIndicator];
[window setAlphaValue: 0.9];
[window setTitle: @"Hello World"];

/* Create Label */
label = [[NSTextField alloc] initWithFrame: NSMakeRect(30, 30, 80, 30)];
[label setSelectable: NO];
[label setBezeled: NO];
[label setDrawsBackground: NO];
[label setStringValue: @"Hello World"];

[[window contentView] addSubview: label];
[label release];
}
- (void) applicationDidFinishLaunching: (NSNotification *) not {
[window makeKeyAndOrderFront: self];
}
- (void) dealloc {
[window release];
[super dealloc];
}
@end

int main (int argc, const char * argv[]) {
NSAutoreleasePool * pool;
AppController * delegate;

NSLog (@"Creation");

pool = [NSAutoreleasePool new];
delegate = [AppController new];

[NSApplication sharedApplication];
[NSApp setDelegate: delegate];
[pool release];

NSLog (@"Running");
[NSApp run];
return 0;
}

9 réponses

Avatar
Schmurtz
Guilhem de Wailly wrote:

Je suis tout nouveau dans la programmation macosx. Je cherche a
construire une application "hello world" avec un makefile.


Si tu programmes en Cocoa, je te conseille d'utiliser XCode, fournit
gratuitement avec les outils de développement d'Apple. C'est autrement
plus simple de créer un projet avec que par l'intermédiaire de fichier
makefile.

Elle se compile correctement ; à l'execussion, elle affiche sa
fenêtre, mais pas son menu ; elle n'aparait pas non plus dans le
dock.


Tu remarqueras par exemple qu'il est possible de faire une application
avec un menu et une fenêtre contenant "Hello word", sans crire une seule
ligne de code!!!
Le tutorial:
<http://developer.apple.com/documentation/Cocoa/Conceptual/ObjCTutorial/i
ndex.html#//apple_ref/doc/uid/TP40000863>

Pour commencer:
<http://developer.apple.com/referencelibrary/GettingStarted/GS_Cocoa/inde
x.html>

La doc officielle, très facile à lire quand on se plonge dedans.
<Pour commencer:
<http://developer.apple.com/documentation/Cocoa/Cocoa.html>

--
Schmurtz

Avatar
Guilhem de Wailly
Merci Schmurtz de ta réponse... En fait, je souhaiterais porter
une application existante windows/linux sous macosx.

L'application comporte une centaine de modules qui peuvent etre
compilés / liées en mode static ou dynamique (dll), avec un
mode debug et release...

j'ai commis un generateur de makefile en M4 qui me permes d'avoir
dans le makefile.template, une ligne par module, le processeur
m4 générant toutes les dépendences et les centaines de lignes
de makefile... Bref, un vrai bouzin bien pratique.

c'est pourquoi il me faut de (grande) préférence acuérire les
moyens d'utiliser les makefiles... J'ai vu xcode, c'est top,
mais si je dois créer 4 targets par modules, je ne suis pas
encode sorti du bois!

sais tu s'il existe un lieu ou je puis trouver des exemples
de code cocoa avec makefile? J'ai passé un temps dajà considérable
pour essayer de trouver mon bonheur, sans sucès...

merci

Guilhem


Schmurtz wrote:
Guilhem de Wailly wrote:


Je suis tout nouveau dans la programmation macosx. Je cherche a
construire une application "hello world" avec un makefile.



Si tu programmes en Cocoa, je te conseille d'utiliser XCode, fournit
gratuitement avec les outils de développement d'Apple. C'est autrement
plus simple de créer un projet avec que par l'intermédiaire de fichier
makefile.


Elle se compile correctement ; à l'execussion, elle affiche sa
fenêtre, mais pas son menu ; elle n'aparait pas non plus dans le
dock.



Tu remarqueras par exemple qu'il est possible de faire une application
avec un menu et une fenêtre contenant "Hello word", sans crire une seule
ligne de code!!!
Le tutorial:
<http://developer.apple.com/documentation/Cocoa/Conceptual/ObjCTutorial/i
ndex.html#//apple_ref/doc/uid/TP40000863>

Pour commencer:
<http://developer.apple.com/referencelibrary/GettingStarted/GS_Cocoa/inde
x.html>

La doc officielle, très facile à lire quand on se plonge dedans.
<Pour commencer:
<http://developer.apple.com/documentation/Cocoa/Cocoa.html>




Avatar
Schmurtz
Guilhem de Wailly wrote:

Merci Schmurtz de ta réponse... En fait, je souhaiterais porter
une application existante windows/linux sous macosx.


Ah oui, ça change un peu la donne.

L'application comporte une centaine de modules qui peuvent etre
compilés / liées en mode static ou dynamique (dll), avec un
mode debug et release...

j'ai commis un generateur de makefile en M4 qui me permes d'avoir
dans le makefile.template, une ligne par module, le processeur
m4 générant toutes les dépendences et les centaines de lignes
de makefile... Bref, un vrai bouzin bien pratique.

c'est pourquoi il me faut de (grande) préférence acuérire les
moyens d'utiliser les makefiles... J'ai vu xcode, c'est top,
mais si je dois créer 4 targets par modules, je ne suis pas
encode sorti du bois!


Non, tu peux aussi créer 1 seul targets par modules et créer des
variantes de compilations indépendante des targets et utilisable pour
tous les targets.

Comme c'est un peu complexe à mettre en ¦uvre sur un projet déjà
existant, je te conseille plutôt de rester avec les makefiles. Par
ailleurs tu peux créer une cible qui se contente de lancer un makefile.

sais tu s'il existe un lieu ou je puis trouver des exemples
de code cocoa avec makefile? J'ai passé un temps dajà considérable
pour essayer de trouver mon bonheur, sans sucès...


Compiler une application Cocoa avec un makefile n'est pas compliqué en
soit. Le seul endroit où tu pourras avoir des problèmes, c'est dans la
manière de lié à un framework :
gcc -framework Cocoa -o appli source.m

C'est expliqué ici :
<http://developer.apple.com/tools/gcc_overview.html>

Par ailleurs il peut-être utile de créer l'interface graphique avec
Interface Builder, et ainsi la stocker dans un fichier nib. Je ne sais
pas comment est origanisé ton application, mais j'ai vu un peu comment
c'était fait dans VLC qui est open source (http://www.videolan.org/). Il
utilise en fait un plugin qui gère l'interface graphique et qui charge
lui même ses fichiers nib. Tout le reste du code est strictement
identique.

Au moment de la création de la l'application, tu dois obtenir la
hiérarchie suivante :
appli.app
Contents
Info.plist <-- voir comment son fait ceux des autres applis
MacOS
appli <-- l'exécutable à lancer
Resources
... <-- les fichiers .nib

Tous les autres fichiers peuvent être mis où c'est le plus pratique,
même dans Contents/MacOS si tu veux. L'idéal serait tout de même de
suivre autant que possible les guidelines d'Apple :

Contents/Resources : les données utilisé par l'application
(l'équivalent de /usr/share/ sous linux)

Contents/Resources/<langue>.lproj : les données traduites dans cette
langue

Contents/Plugins/ : les plugins

Contents/Frameworks/ : les bibliothèques partages qui ne sont pas des
plugins (l'quivalent de /usr/lib/ sous linux)

Pour info, la structure de l'application VLC est la suivante :
VLC.app
Contents
Info.plist
MacOS
VLC
lib
...
locale
fr
...
en
...
modules
...
share
...
Resources
English.lproj
MainMenu.nib
French.lproj
MainMenu.nib

--
Schmurtz

Avatar
lucsky
Guilhem de Wailly wrote:

Je suis tout nouveau dans la programmation macosx. Je cherche a
construire une application "hello world" avec un makefile.


Si tu veux tout faire à la main, compiler un simple executable est
insuffisant.

"An application is a bundle":

<http://developer.apple.com/documentation/MacOSX/Conceptual/SystemOvervi
ew/AppPackaging/chapter_5_section_2.html>

Tout sur les bundles:

<http://developer.apple.com/documentation/MacOSX/Conceptual/SystemOvervi
ew/Bundles/chapter_4_section_1.html#//apple_ref/doc/uid/20000982/CHDDDIF
F>

--
Luc Heinrich -

Avatar
Guilhem de Wailly
Je viens d'essayer de rajouter un NSWindowControler... Pas de
succès...

Dans la méthode

- (void) applicationDidFinishLaunching: (NSNotification *) not {
NSLog (@"Finishing to launch. Can be Main = %s",
[window canBecomeMainWindow] == true ? "yes" : "no");
[window makeKeyAndOrderFront:nil];
[window makeMainWindow];
}

le message de log indique que la fenêtre 'window' ne peut pas être
main... Reste a savoir pourquoi!!!
Avatar
Guilhem de Wailly
Finalement, je laisse tomber le makefile temporairement...

Il semble que le problème existe aussi dans wxWindows ou les
application wxcocoa ont ce problème de focus...

J'ai regardé le code de VLC, mais il manque plein de libs
a installer...

en tout cas, merci pour les réponses.

Donc pour l'instant, Xcode a fond. C'est vraiment bien.

J'ai qd meme un pb: comment ajouter une toolbar a une
application, via interface builder? J'ai pas trouver
comment faire...

De plus, je voudrais savoir s'il est possible de donner à une
application plusieurs toolbars?

Merci

guilhem
Avatar
Schmurtz
Guilhem de Wailly wrote:

Finalement, je laisse tomber le makefile temporairement...

Il semble que le problème existe aussi dans wxWindows ou les
application wxcocoa ont ce problème de focus...

J'ai regardé le code de VLC, mais il manque plein de libs
a installer...

en tout cas, merci pour les réponses.

Donc pour l'instant, Xcode a fond. C'est vraiment bien.

J'ai qd meme un pb: comment ajouter une toolbar a une
application, via interface builder? J'ai pas trouver
comment faire...

De plus, je voudrais savoir s'il est possible de donner à une
application plusieurs toolbars?


J'avais vu ça une fois. Il me semble qu'il faut créer un NSToolbar, lui
ajouter des NSToolbarItems, puis associer le NSToolbar à la fenêtre
voulue.

--
Schmurtz

Avatar
lucsky
Guilhem de Wailly wrote:

J'ai qd meme un pb: comment ajouter une toolbar a une
application, via interface builder? J'ai pas trouver
comment faire...


Ce n'est pas possible. Les NSToolbars doivent être créee par le code.

--
Luc Heinrich -

Avatar
Schmurtz
(Luc Heinrich) wrote:

Guilhem de Wailly wrote:

J'ai qd meme un pb: comment ajouter une toolbar a une
application, via interface builder? J'ai pas trouver
comment faire...


Ce n'est pas possible. Les NSToolbars doivent être créee par le code.


<http://developer.apple.com/documentation/Cocoa/Conceptual/Toolbars/index
.html#//apple_ref/doc/uid/10000109i>

<http://developer.apple.com/documentation/Cocoa/Reference/ApplicationKit/
ObjC_classic/Classes/NSToolbar.html>

<http://www.cocoadev.com/index.pl?NSToolbar>

--
Schmurtz