home *** CD-ROM | disk | FTP | other *** search
/ Computer Music Interactif…cial Edition 1999 Winter / cd 3.iso / mac / Mac / Shares / Midishare™1.68 / Development Tools / Sources Examples / Skeleton_P / Skeleton.p < prev    next >
Encoding:
Text File  |  1992-03-08  |  24.8 KB  |  712 lines  |  [TEXT/MPS ]

  1. {••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••}
  2. {•                        MIDI SKELETON                                            •}
  3. {•------------------------------------------------------------------------------•}
  4. {• MIDISHARE est un module logiciel conçu spécialement pour permettre le fonc-    •}
  5. {• tionnement et le développement d'applications Midi dans un contexte multi-    •}
  6. {• tâches et temps réel.                                                         •}
  7. {•                                                                                 •}
  8. {• MIDISHARE prend en charge la plupart des problèmes spécifiques liés au déve- •}
  9. {• loppement d'applications Midi: gestion des flux Midi, gestion du temps,        •}
  10. {• gestion des tâches. En outre, MIDISHARE permet le fonctionnement simultané    •}
  11. {• sous Multi-Finder de ces applications, ainsi que l'établissement de connec-    •}
  12. {• tions Midi virtuelles entre celles-ci.                                        •}
  13. {•                                                                                 •}
  14. {• SKELETON est un exemple d'application MidiShare minimale qui peut être        •}
  15. {• utilisée comme base de développement pour de nouvelles applications.            •}
  16. {• Par défaut, l'application renvoie tous les événements qu'elle reçoit, sans    •}
  17. {• aucune modification.                                                            •}
  18. {•                                                                                •}
  19. {• Les points qui peuvent être facilement modifiés sont les suivants :            •}
  20. {•                                                                                •}
  21. {• - ReceiveEvents : qui traite tous les événements reçus et qui réalise ici     •}
  22. {•   un simple MidiThru.                                                        •}
  23. {•                                                                                •}
  24. {• - La constante wantRealTime : quand elle vaut 1, ReceiveEvents est appelée    •}
  25. {•   sous interruption et fonctionne donc en temps réel, mais ne peut pas        •}
  26. {•   utiliser les appels à la Toolbox; quand elle vaut 0, ReceiveEvents est     •}
  27. {•   appelée dans la boucle principale et peut donc utiliser la toolbox.        •}
  28. {•                                                                                •}
  29. {• - La constante wantFilter : quand elle vaut 1, un filtre sur les entrées      •}
  30. {•   Midi est installé, quand elle vaut 0, aucun filtre n'est installé et         •}
  31. {•   l'application reçoit tous les événements.                                    •}
  32. {•                                                                                •}
  33. {• - InstallFilter : qui configure le filtre d'entrée                            •}
  34. {•                                                                                •}
  35. {• - La resource de dialogue 128 qui définit la fenêtre de l'application        •}
  36. {•                                                                                •}
  37. {•                                                                                •}
  38. {•------------------------------------------------------------------------------•}
  39. {•        © GRAME 1987-92, Yann Orlarey et Hervé Lequay                             •}
  40. {••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••}
  41.  
  42. {$D+} { MacsBug symbols on }
  43. {$R-} { No range checking  }
  44.  
  45. Program SKELETON;
  46.  
  47. USES    Memtypes, Quickdraw, OSIntf, ToolIntf, PackIntf, Traps, MidiShareUnit;
  48.  
  49. const    AppleID    = 128;    AppleMenu    = 1;
  50.         FileID    = 129;    FileMenu    = 2;
  51.         EditID    = 130;    EditMenu    = 3;
  52.             UndoI    = 1;    CutI    = 3;    CopyI    = 4;    PasteI    = 5;    ClearI    = 6;
  53.         
  54.         WindowID    = 128; 
  55.         AboutID        = 129;
  56.         AlertID        = 500;
  57.         
  58.         resumeMask    = $01;                                        { suspend/resume mask                }
  59.         
  60.         wantRealTime= true;                                        { je veux du temps réel                }
  61.         wantFilter    = false;                                    { sans filtrage des événements        }
  62.         
  63. var    
  64.     myRefNum:                integer;                            { numéro d'appl. Midi                }
  65.     myFilter:                TFilter;                            { filtre d'événements                }
  66.     myWindow:                 windowPtr;                            { fenêtre                            }
  67.  
  68.     doneFlag:                boolean;                            { flag d'arrêt                        }
  69.     
  70.     gMac:                    SysEnvRec;                            { machine…                            }
  71.     eventPending:            boolean;                            { vrai si événement en attente        }
  72.     hasWNE:                    boolean;                            { vrai si WaitNextEvent implémenté    }
  73.     foreGround:                boolean;                            { vrai si en foreGround                }
  74.  
  75.     myEvent:                eventRecord;                        { pour la main event loop            }
  76.     theChar:                char;                                { pour la gestion des touches        }
  77.     dragRect:                rect;                                { rect de déplacement de fenêtre    }
  78.     myMenus:                array[AppleMenu..EditMenu] of MenuHandle;
  79.                                                                 { les menus                            }
  80.  
  81.     
  82.  
  83. (********************************************************************************)
  84. (*                                 UTILITAIRES                                        *)
  85. (*------------------------------------------------------------------------------*)
  86. (*                                                                                 *)
  87. (********************************************************************************)
  88.  
  89. {$S Initialize}
  90. Function TRAPAVAILABLE (tNumber: integer; tType: trapType): boolean;
  91. (*    Vérification de l'implémentation d'une trappe                                *)
  92. begin
  93.     TrapAvailable:= NGetTrapAddress(tNumber,tType) <> GetTrapAddress(_Unimplemented)
  94. end;
  95.  
  96. {$S Main}
  97. Function ISAPPWINDOW (aWind: windowPtr): boolean;
  98. (* vérifie si la fenêtre appartient à l'application                                *)
  99. begin
  100.     if aWind = nil then
  101.         IsAppWindow:= false
  102.     else 
  103.         IsAppWindow:= windowPeek(aWind)^.windowKind >= 0
  104. end;
  105.  
  106. {$S Main}
  107. Function ISDAWINDOW (aWind: windowPtr): boolean;
  108. (* vérifie si la fenêtre appartient à un accessoire de bureau                    *)
  109. begin
  110.     if aWind = nil then
  111.         IsDAWindow:= false
  112.     else 
  113.         IsDAWindow:= windowPeek(aWind)^.windowKind < 0
  114. end;
  115.  
  116. {$S Main}
  117. Procedure CenterRectOnScreen (var aRect: Rect);
  118. (* Centre un rectangle global sur l'écran principal (dragRect)                    *)
  119. var    screenSize    : Point;
  120.     rectSize    : Point;
  121. begin
  122.     with dragRect do
  123.         SetPt(screenSize,right - left,bottom - top);
  124.     with aRect do begin
  125.         SetPt(rectSize,right - left,bottom - top);
  126.         left:= dragRect.left + (screenSize.h - rectSize.h) div 2;
  127.         top:= dragRect.top + (screenSize.v - rectSize.v) div 5;
  128.         topLeft:= point(PinRect(dragRect,topLeft));
  129.         right:= left + rectSize.h;
  130.         bottom:= top + rectSize.v;
  131.         end;
  132. end;
  133.  
  134. {$S Main}
  135. Function GetNewCenteredDialog (dialogID: integer): DialogPtr;
  136. (* Affiche une fenêtre de dialogue au centre de l'écran                            *)
  137. var    dlogTemplate    : DialogTHndl;
  138. begin
  139.     GetNewCenteredDialog := nil;
  140.     dlogTemplate := DialogTHndl(GetResource('DLOG', dialogID));
  141.     if dlogTemplate <> nil then begin
  142.         CenterRectOnScreen(dlogTemplate^^.boundsRect);
  143.         GetNewCenteredDialog:= GetNewDialog(dialogID, nil, pointer(-1));
  144.         end
  145.     else SysBeep(2)                                                { At least give some indication }
  146. end;
  147.  
  148. {$S Main}
  149. Procedure AlertUser (alertID: integer);
  150. (* Affiche une alerte au centre de l'écran                                        *)
  151. var    alrtTemplate    : AlertTHndl;
  152.     temp            : integer;
  153. begin
  154.     alrtTemplate := AlertTHndl(GetResource('ALRT', alertID));
  155.     if alrtTemplate <> nil then begin
  156.         SetCursor(arrow);
  157.         CenterRectOnScreen(alrtTemplate^^.boundsRect);
  158.         temp:= Alert(alertID,nil)
  159.         end
  160.     else SysBeep(2)                                             { At least give some indication        }
  161. end;
  162.  
  163.  
  164. (*=============================== MidiShare Part ===============================*)
  165.  
  166.  
  167. (********************************************************************************)
  168. (*                                 RECEIVE EVENTS                                    *)
  169. (*------------------------------------------------------------------------------*)
  170. (* Cette procédure traite tous les événements reçus. Elle peut être appelée        *)
  171. (* "manuellement" (wantRealTime 0) dans la boucle principale de l'application    *)
  172. (* s'il n'y a pas de contraintes temps réel sur la réception.                    *)
  173. (*                                                                                 *)
  174. (* Dans le cas contraire (wantRealTime 1), grâce à MidiSetRcvAlarm, la routine     *)
  175. (* peut être appelée automatiquement par MidiShare, sous interruptions, chaque     *) 
  176. (* fois que l'application reçoit de nouveaux événements (voir SetupMidi).         *)
  177. (*                                                                                 *)
  178. (* Dans le code ci dessous, ReceiveEvents réalise un simple MidiThru sans        *)
  179. (* aucun traitement.                                                             *)
  180. (*                                                                                 *)
  181. (* ReceiveEvents doit obligatoirement comporter un paramètre, qui est le         *)
  182. (* numéro de référence MidiShare de l'application.                                *)
  183. (*                                                                                 *)
  184. (* Les paramètres de l'appel :                                                    *)
  185. (* ---------------------------                                                    *)
  186. (*                                                                                 *)
  187. (*        refNum:    numéro de référence MidiShare de l'application.                    *)
  188. (*                                                                                 *)
  189. (********************************************************************************)
  190.  
  191. {$ Main}
  192. Procedure RECEIVEEVENTS (refNum: integer);
  193. var    e:    midiEvPtr;
  194.     n:     longint;
  195. begin
  196.     n := midiCountEvs(refNum);                            { compte les événements reçus                }
  197.     while n > 0 do begin                                { Pour chaque événement :                    }
  198.         e := midiGetEv(refNum);                            {  on récupère l'événement reçu                }
  199.         MidiSend(refNum,e);                                {  et on le renvoie sans modification        }
  200.         n := n-1                                        {  un de moins à traiter                    }
  201.         end
  202. end;
  203.                         
  204.  
  205. (********************************************************************************)
  206. (*                            INSTALL FILTER                                        *)
  207. (*------------------------------------------------------------------------------*)
  208. (* Cette procédure définit les valeurs du filtre de l'application. Un filtre     *)
  209. (* est composé de trois parties, qui sont trois tableaux de booléens :            *) 
  210. (*                                                                                 *)
  211. (*        un tableau de 256 bits pour les ports Midi acceptés                        *)
  212. (*        un tableau de 256 bits pour les types d'événements acceptés                *)
  213. (*        un tableau de  16 bits pour les canaux Midi acceptés                    *)
  214. (*                                                                                 *)
  215. (* Dans le code ci dessous, le filtre est paramétré pour accepter n'importe        *)
  216. (* quel type d'événement.                                                         *)
  217. (*                                                                                 *)
  218. (* Les paramètres de l'appel :                                                    *)
  219. (* ---------------------------                                                    *)
  220. (*                                                                                 *)
  221. (*        aucun                                                                    *)
  222. (*                                                                                 *)
  223. (********************************************************************************)
  224.  
  225. {$ Initialize}
  226. Procedure INSTALLFILTER;
  227. var    i:    integer;
  228. begin
  229.     for i:= 0 to 255 do begin
  230.         myFilter.evType[i]:= true;                        { accepte tous les types d'événements        }
  231.         myFilter.port[i]:= true                            { en provenance de tous les ports            }
  232.         end;
  233.                                             
  234.     for i:= 0 to 15 do
  235.         myFilter.channel[i]:= true;                        { et sur tous les canaux Midi                }
  236.         
  237.     MidiSetFilter(myRefNum,@myFilter)                       { installe le filtre                        }
  238. end;
  239.  
  240.  
  241. (********************************************************************************)
  242. (*                                 APPL ALARM                                        *)
  243. (*------------------------------------------------------------------------------*)
  244. (* ALARM est la procédure passée à MidiShare comme alarme de changement de sta-    *)
  245. (* tut des appl. Midi ou des ports. Comme il est possible qu'elle soit appelée    *)
  246. (* sous interruptions, elle ne peut provoquer d'appel à des routines qui utili-    *)
  247. (* sent le Memory Manager. Elle positionne seulement des flags, la Main Event      *)
  248. (* Loop se chargeant d'appeler MAINALARM si ces flags sont positionnés.         *)
  249. (*                                                                                 *)
  250. (* Les paramètres de l'appel :                                                    *)
  251. (* ---------------------------                                                    *)
  252. (*                                                                                 *)
  253. (*        refnum: numéro de l'application (de Midi Connection)                    *)
  254. (*        code:    HiWrd = refnum de l'application concernée                        *)
  255. (*                LoWrd = code de la modification intervenue                        *)
  256. (*                                                                                 *)
  257. (********************************************************************************)
  258.  
  259. {$S Main}
  260. Procedure APPLALARM (refnum: integer; code: longint);
  261. begin    
  262.     case LoWrd(code) of
  263.         MIDIOpenAppl        :    ;        { ouverture d'une application                }
  264.         MIDICloseAppl        :    ;        { fermeture d'une application                }
  265.         MIDIChgName            :    ;        { changement de nom d'une application        }
  266.         MIDIChgConnect        :    ;        { modification d'une connexion                }
  267.         MIDIOpenModem        :    ;        { ouverture du port Modem                    }
  268.         MIDICloseModem        :    ;        { fermeture du port Modem                    }
  269.         MIDIOpenPrinter        :    ;        { ouverture du port Printer                    }
  270.         MIDIClosePrinter    :    ;        { fermeture du port Printer                    }
  271.         end;
  272. end;
  273.  
  274.  
  275. (********************************************************************************)
  276. (*                                 SETUP MIDI                                        *)
  277. (*------------------------------------------------------------------------------*)
  278. (* Vérifie la présence de MidiShare, la possibilité d'ouverture Midi, et        *)
  279. (* installe la procédure d'alarme qui sera appelée par MidiShare lors des chan-    *)
  280. (* gements de statut des applications ou des ports.                                *)
  281. (*                                                                                 *)
  282. (* Les paramètres de l'appel :                                                    *)
  283. (* ---------------------------                                                    *)
  284. (*                                                                                 *)
  285. (*        aucun                                                                    *)
  286. (*                                                                                 *)
  287. (********************************************************************************)
  288.  
  289. {$S Initialize}
  290. Procedure SETUPMIDI;
  291. var    name:        str255;
  292.     apRefNum:    integer;
  293.     apParam:    Handle;
  294.     aRefNum:    integer;
  295.  
  296.     Procedure FAILSETUP (strIndex: integer);
  297.     var    msgStr:    str255;
  298.     begin
  299.         GetIndString (msgStr,AlertID,strIndex);            { message d'alerte suivant erreur    }
  300.         ParamText(name,msgStr,'','');
  301.         AlertUser(AlertID);
  302.         ExitToShell                                        { et quitte                            }
  303.     end;
  304.     
  305. begin
  306.     GetAppParms(name,apRefNum,apParam);                    { récupérer le nom d'application    }
  307.     if not MidiShare then FailSetUp(1);                    { MidiShare n'est pas installé        }
  308.         
  309.     myRefNum:= MidiOpen(name);                            { ouverture en Midi                    }
  310.     if myRefNum = MidiErrSpace then FailSetUp(2);        { impossible, plus de place            }
  311.     
  312.     if wantRealTime then begin
  313.         {MidiSetApplAlarm(myRefNum,@ApplAlarm);}        { définit la tâche temps-réel de contexte    }
  314.         MidiSetRcvAlarm(myRefNum,@ReceiveEvents)        { définit la tâche temps-réel de réception    }
  315.         end;
  316.     if wantFilter then        
  317.         InstallFilter;                                    { installe un filtre si nécessaire            }
  318.     
  319.     MidiConnect(0,myRefNum,true);                        { connection avec les ports Midi d'entrées    }
  320.     MidiConnect(myRefNum,0,true)                        { connection avec les ports Midi de sortie    }
  321. end;
  322.             
  323.  
  324. (********************************************************************************)
  325. (*                                 DO IDLE                                            *)
  326. (*------------------------------------------------------------------------------*)
  327. (* Execution des différentes tâches Midi : reception des événements Midi si        *)
  328. (* cela n'est pas fait sous interruptions; Exécution des tâches différées en    *)
  329. (* attente (tâches crées par MidiDTask).                                        *)
  330. (*                                                                                 *)
  331. (* Les paramètres de l'appel :                                                    *)
  332. (* ---------------------------                                                    *)
  333. (*                                                                                 *)
  334. (*        aucun                                                                    *)
  335. (*                                                                                 *)
  336. (********************************************************************************)
  337.  
  338. {$S Main}
  339. Procedure DOIDLE;
  340. var    n:    longint;
  341. begin
  342.     if not wantRealTime then
  343.         ReceiveEvents(myRefNum);
  344.     for n:= 1 to MidiCountDTasks(myRefNum) do
  345.         MidiExec1DTask(myRefNum)
  346. end;
  347.  
  348.  
  349. (*=============================== Macintosh Part ===============================*)
  350.  
  351. (********************************************************************************)
  352. (*                                 SET UP MENUS                                    *)
  353. (*------------------------------------------------------------------------------*)
  354. (* Installation de la barre de menus                                              *)
  355. (*                                                                                 *)
  356. (* Les paramètres de l'appel :                                                    *)
  357. (* ---------------------------                                                    *)
  358. (*                                                                                 *)
  359. (*        aucun                                                                    *)
  360. (*                                                                                 *)
  361. (********************************************************************************)
  362.  
  363. {$S Initialize}
  364. Procedure SETUPMENUS;
  365. var    i:    integer;
  366. begin    
  367.     myMenus[AppleMenu] := GetMenu(AppleID);                        { menu Pomme                        }
  368.     AddResMenu(myMenus[AppleMenu],'DRVR');                        { ajout des accessoires de bureau    }
  369.     myMenus[FileMenu] := GetMenu(FileID);                        { menu Fichier                        }
  370.     myMenus[EditMenu] := GetMenu(EditID);                        { menu Edit                            }
  371.     for i := AppleMenu to EditMenu do
  372.         InsertMenu(myMenus[i], 0);
  373.     DrawMenuBar                                                    { affiche la barre des menus        }
  374. end;
  375.             
  376.  
  377. (********************************************************************************)
  378. (*                                 SETUP WINDOW                                    *)
  379. (*------------------------------------------------------------------------------*)
  380. (* Ouvre la fenêtre                                                                *)
  381. (*                                                                                 *)
  382. (* Les paramètres de l'appel :                                                    *)
  383. (* ---------------------------                                                    *)
  384. (*                                                                                 *)
  385. (*        aucun                                                                    *)
  386. (*                                                                                 *)
  387. (********************************************************************************)
  388.  
  389. {$S Initialize}
  390. Procedure SETUPWINDOW;
  391. var    r    : rect;
  392. begin    
  393.     with screenBits.bounds do                                    { rect max de déplacmt de fenêtre    }
  394.         SetRect(dragRect, 4, 24, right - 4, bottom - 4);
  395.     myWindow := GetNewDialog(WindowID,nil,pointer(-1));
  396.     SetPort(myWindow);
  397.     r:= myWindow^.portRect;
  398.     with r do begin
  399.         LocalToGlobal(topLeft);
  400.         LocalToGlobal(botRight)
  401.         end;
  402.     if not RectInRgn(r,GetGrayRgn) then begin                    { rect fenêtre hors écrans :        }
  403.         CenterRectOnScreen(r);                                    { le centrer sur l'écran principal    }
  404.         MoveWindow(myWindow,r.left,r.top,true)
  405.         end;
  406.     ShowWindow(myWindow)
  407. end;
  408.  
  409. {$S Main}
  410. Procedure SAVEWINDOWPOS;
  411. (* Sauvegarde dans la ressource DLOG de l'application la position de la fenêtre    *)
  412. type    rectPtr  =     ^rect;
  413.         rectHdle =    ^rectPtr;
  414. var    windHdle:    handle;
  415. begin
  416.     windHdle:= Get1Resource('DLOG',WindowID);
  417.     rectHdle(windHdle)^^:= windowPeek(myWindow)^.contRgn^^.rgnBBox;
  418.     ChangedResource(windHdle);
  419.     if ResError = noErr then
  420.         WriteResource(windHdle)
  421. end;
  422.     
  423.  
  424. (********************************************************************************)
  425. (*                                 INITIALIZE                                        *)
  426. (*------------------------------------------------------------------------------*)
  427. (* Initialisations générales (hasWNE, foreGround, managers, fenêtre, Midi)        *)
  428. (*                                                                                 *)
  429. (* Les paramètres de l'appel :                                                    *)
  430. (* ---------------------------                                                    *)
  431. (*                                                                                 *)
  432. (*        aucun                                                                    *)
  433. (*                                                                                 *)
  434. (********************************************************************************)
  435.  
  436. {$S Initialize}
  437. Procedure INITIALIZE;
  438. var    err:    OSErr;
  439. begin
  440.     err:= SysEnvirons(1,gMac);
  441.     hasWNE:= (gMac.machineType >= 0) & TrapAvailable(_WaitNextEvent,ToolTrap);
  442.         
  443.     InitGraf(@thePort);                                            { initialisations standard            }
  444.     InitFonts;
  445.     InitWindows;
  446.     InitMenus;
  447.     TEInit;
  448.     InitDialogs(NIL);
  449.     InitCursor;
  450.     SetUpMenus;                                                    { mise en place menus                }
  451.     SetUpMidi;                                                    { ouverture MidiShare                }
  452.     SetUpWindow;                                                { initialisations fenêtre et listes    }
  453. end;
  454.  
  455.  
  456. (********************************************************************************)
  457. (*                                 ADJUST MENUS                                    *)
  458. (*------------------------------------------------------------------------------*)
  459. (* Ajustement de la barre de menus suivant la fenêtre de premier plan, juste    *)
  460. (* lors d'un click dans la barre des menus                                        *)
  461. (*                                                                                 *)
  462. (* Les paramètres de l'appel :                                                    *)
  463. (* ---------------------------                                                    *)
  464. (*                                                                                  *)
  465. (*        aucun                                                                    *)
  466. (*                                                                                 *)
  467. (********************************************************************************)
  468.  
  469. {$S Main}
  470. Procedure ADJUSTMENUS;
  471. begin
  472.     if IsAppWindow(FrontWindow) then begin
  473.         DisableItem(myMenus[EditMenu],UndoI);
  474.         DisableItem(myMenus[EditMenu],CutI);
  475.         DisableItem(myMenus[EditMenu],CopyI);
  476.         DisableItem(myMenus[EditMenu],PasteI);
  477.         DisableItem(myMenus[EditMenu],ClearI)
  478.         end
  479.     else
  480.     if IsDAWindow(FrontWindow) then begin
  481.         EnableItem(myMenus[EditMenu],UndoI);
  482.         EnableItem(myMenus[EditMenu],CutI);
  483.         EnableItem(myMenus[EditMenu],CopyI);
  484.         EnableItem(myMenus[EditMenu],PasteI);
  485.         EnableItem(myMenus[EditMenu],ClearI)
  486.         end
  487. end;
  488.             
  489.  
  490. (********************************************************************************)
  491. (*                                 DO COMMAND                                        *)
  492. (*------------------------------------------------------------------------------*)
  493. (* Gère les menus: Pomme (About), File (Quit)                                    *)
  494. (*                                                                                 *)
  495. (* Les paramètres de l'appel :                                                    *)
  496. (* ---------------------------                                                    *)
  497. (*                                                                                 *)
  498. (*        mResult: numéro de menu et d'item retournés par MenuSelect et MenuKey    *)
  499. (*                                                                                 *)
  500. (********************************************************************************)
  501.  
  502. {$S Main}
  503. Procedure DOCOMMAND ( mResult: LONGINT);
  504. var    theItem:    integer;
  505.     name:        str255;
  506.     sysEdit:    boolean;
  507.     
  508.     Procedure SHOWABOUT;
  509.     var    myDialog    : dialogPtr;
  510.         hit            : integer;
  511.     begin
  512.         myDialog:= GetNewCenteredDialog(AboutID);
  513.         if myDialog <> nil then begin
  514.             ModalDialog(nil,hit);
  515.             DisposDialog(myDialog);
  516.             end
  517.     end;
  518.             
  519. begin    
  520.     theItem := LoWord(mResult);
  521.     case HiWord(mResult) of
  522.         AppleID:                                                { menu Pomme                        }
  523.             if theItem <> 1 then begin
  524.                 GetItem(myMenus[AppleMenu], theItem, name);
  525.                 theItem := OpenDeskAcc(name)  end
  526.             else ShowAbout;
  527.         FileID:                                                    { menu File                            }
  528.             doneFlag := true;
  529.         EditID:                                                    { menu Edit: uniquement pour DAs    }
  530.             sysEdit := SystemEdit(theItem-1);
  531.         end;
  532.     HiliteMenu(0)
  533. end;
  534.         
  535.         
  536. (********************************************************************************)
  537. (*                                 TRACK DIALOG                                    *)
  538. (*------------------------------------------------------------------------------*)
  539. (* Procédure chargée du suivi de la souris lors d'un click dans contenu            *)
  540. (*                                                                                 *)
  541. (* Les paramètres de l'appel :                                                    *)
  542. (* ---------------------------                                                    *)
  543. (*                                                                                 *)
  544. (*        window:    pointeur sur la fenêtre de dialogue.                            *)
  545. (*        where:    point où la souris a été cliquée.                                *)
  546. (*                                                                                 *)
  547. (********************************************************************************)
  548.  
  549. {$S Main}
  550. Procedure TRACKDIALOG (window: windowPtr; where: point);
  551. begin
  552.     SetPort(window);
  553.     GlobalToLocal(where);                                        { conversion du point en local        }
  554. end;
  555.  
  556.         
  557. (********************************************************************************)
  558. (*                                 DO MOUSE DOWN                                    *)
  559. (*------------------------------------------------------------------------------*)
  560. (* Gère les clicks souris                                                        *)
  561. (*                                                                                 *)
  562. (* Les paramètres de l'appel :                                                    *)
  563. (* ---------------------------                                                    *)
  564. (*                                                                                 *)
  565. (*        anEvent: l'événement                                                    *)
  566. (*                                                                                 *)
  567. (********************************************************************************)
  568.  
  569. {$S Main}
  570. Procedure DOMOUSEDOWN (anEvent: eventRecord);
  571. var    whichWind:    windowPtr;
  572.     part:        integer;
  573. begin
  574.     part:= FindWindow(anEvent.where, whichWind);
  575.     case part of
  576.         inMenuBar:        begin
  577.                         AdjustMenus;
  578.                         DoCommand(MenuSelect(anEvent.where))
  579.                         end;
  580.         inSysWindow:    SystemClick(anEvent,whichWind);
  581.         inDrag:         DragWindow(whichWind,anEvent.where,dragRect);
  582.         inGoAway:        doneFlag:= TrackGoAway(whichWind,anEvent.where);
  583.         inContent:        if whichWind <> FrontWindow then
  584.                             SelectWindow(whichWind)
  585.                         else
  586.                             if IsAppWindow(whichWind) then
  587.                                 TrackDialog(whichWind,anEvent.where);
  588.         end
  589. end;
  590.  
  591.  
  592. (********************************************************************************)
  593. (*                                 ADJUST CURSOR                                    *)
  594. (*------------------------------------------------------------------------------*)
  595. (* Ajuste le curseur suivant région et fenêtre                                    *)
  596. (*                                                                                 *)
  597. (********************************************************************************)
  598.  
  599. {$S Main}
  600. Procedure ADJUSTCURSOR;
  601. begin
  602.     if foreGround and IsAppWindow(FrontWindow) then
  603.         SetCursor(arrow)
  604. end;
  605.  
  606.  
  607. (********************************************************************************)
  608. (*                                 CLOSE WINDOWS                                    *)
  609. (*------------------------------------------------------------------------------*)
  610. (* Pour terminer correctement l'application: fermeture de toutes les fenêtres    *)
  611. (* (application et DA's)                                                        *)
  612. (*                                                                                 *)
  613. (********************************************************************************)
  614.  
  615. {$S Main}
  616. Procedure CLOSEWIND (aWind: windowPtr);
  617. (* ferme une fenêtre                                                            *)
  618. begin
  619.     if IsDAWindow(aWind) then
  620.         CloseDeskAcc(windowPeek(aWind)^.windowKind)
  621.     else if IsAppWindow(aWind) then
  622.         DisposeWindow(aWind)
  623. end;
  624.  
  625. Procedure CLOSEALLWINDS;
  626. (* ferme toutes les fenêtres                                                    *)
  627. var    window:    windowPtr;
  628. begin
  629.     repeat
  630.         window:= FrontWindow;
  631.         if window <> nil then
  632.             CloseWind(window);
  633.     until window = nil;
  634. end;
  635.  
  636.  
  637. Procedure _DataInit;        EXTERNAL;
  638.  
  639. (********************************************************************************)
  640. (*                             Corps Principal                                        *)
  641. (*------------------------------------------------------------------------------*)
  642. (* Initialisation des managers, ouverture fenêtre, initialisations diverses    et    *)
  643. (* tutti quanti, boucle principale.                                                *)
  644. (*                                                                                 *)
  645. (********************************************************************************)
  646.  
  647. {$S Main}
  648. begin
  649.     UnLoadSeg(@_DataInit);
  650.     MaxApplZone;
  651.     Initialize;
  652.     UnLoadSeg(@Initialize);
  653.     
  654.     DoneFlag:=false;                                            { flag de terminaison                }
  655.     repeat                                                        { boucle principale typique            }
  656.         if hasWNE then
  657.             eventPending:= WaitNextEvent(everyEvent, myEvent, 0, nil)
  658.                                                                 { no sleep, no mouseRgn                }
  659.         else begin
  660.             SystemTask;
  661.              eventPending:= GetNextEvent(everyEvent, myEvent)
  662.         end;
  663.         AdjustCursor;                                            { si ≠ curseurs ou mouseRgn, ici    }
  664.         with myEvent do
  665.             case what of
  666.                 nullEvent:
  667.                     DoIdle;                                        { do Idle                            }
  668.                 {
  669.                 activateEvt:
  670.                     if IsAppWindow(windowPtr(message)) then;
  671.                         if BAnd(modifiers,activeFlag) <> 0 then
  672.                         else
  673.                 }
  674.                 osEvt:
  675.                     case BSR(message,24) of
  676.                         suspendResumeMessage:
  677.                             begin
  678.                             foreGround:= BAnd(message,resumeMask) <> 0;
  679.                             {
  680.                             if IsAppWindow(FrontWindow) then
  681.                             }
  682.                             end;
  683.                         mouseMovedMessage:
  684.                             DoIdle                                { do Idle                            }
  685.                     end;
  686.                 keyDown, autoKey:
  687.                     begin
  688.                         theChar:= chr(BAnd(message,charCodeMask));
  689.                         IF BAnd(modifiers, cmdKey) <> 0 then begin
  690.                             AdjustMenus;
  691.                             DoCommand(MenuKey(theChar))
  692.                             end
  693.                     end;
  694.                 mouseDown:
  695.                     DoMouseDown(myEvent);
  696.                 updateEvt:
  697.                     if IsAppWindow(windowPtr(message)) then begin
  698.                         BeginUpdate(myWindow);
  699.                         if not EmptyRgn(myWindow^.visRgn) then begin
  700.                             SetPort(myWindow);
  701.                             DrawDialog(myWindow)
  702.                             end;
  703.                         EndUpdate(myWindow)
  704.                     end
  705.                 end
  706.     until doneFlag;
  707.     MidiClose(myRefNum);                                                { fermeture MidiShare             }
  708.     SaveWindowPos;
  709.     CloseAllWinds;
  710.     ExitToShell
  711. end.
  712.