Ein minimales Palm-Programm (Garnet OS)
Ein minimales Programm für das veraltete Garnet OS/Palm OS für meinen Treo 650 sieht ungefähr aus wie unten.
Das Programm stellt ein "Form" dar. Tut allerdings sonst nichts.
Das Projekt habe ich mit der Garnet OS Development Suite erstellt. Zusätzlich braucht es noch eine Resource-Datei (.xrd), die ein Form-Objekt mit der ID "1000" enthält.
Die Reihenfolge der Methoden ist "verkehrt" (unwichtigste zuerst), um erstmal keine Header-Datei zu benötigen.
#include < PalmOS.h >
#define UI_MainForm 1000
static Boolean MainFormHandleEvent(EventPtr eventP) {
switch (eventP->eType) {
case frmOpenEvent:
{
FormPtr frmP = FrmGetActiveForm();
FrmDrawForm(frmP);
return true;
}
default:
return false;
}
}
static Boolean AppHandleEvent(EventPtr eventP) {
if (eventP->eType == frmLoadEvent) {
UInt16 formId = eventP->data.frmLoad.formID;
FormPtr formP = FrmInitForm(formId);
FrmSetActiveForm(formP);
if (formId == UI_MainForm)
FrmSetEventHandler(formP, MainFormHandleEvent);
return true;
}
else
return false;
}
static void AppStart() {
FrmGotoForm(UI_MainForm);
}
static void AppStop() {
FrmCloseAllForms();
}
static void AppEventLoop() {
UInt16 error;
EventType event;
do {
EvtGetEvent(&event, evtWaitForever);
if (!SysHandleEvent(&event))
if (!MenuHandleEvent(0, &event, &error))
if (!AppHandleEvent(&event))
FrmDispatchEvent(&event);
} while (event.eType != appStopEvent);
}
UInt32 PilotMain (UInt16 cmd, void *cmdPBP, UInt16 launchFlags) {
switch (cmd) {
case sysAppLaunchCmdNormalLaunch:
AppStart();
AppEventLoop();
AppStop();
return errNone;
default:
return errNone;
}
}
Hauptkomponente des Programms ist die AppEventLoop().
Darin ist nur AppHandleEvent() eine eigene Methode, der Rest wird vom System bereitgestellt, um z. B. Events auf Menüs oder anderen Oberflächenelementen richtig aufzuteilen.
Und AppHandleEvent() wiederum setzt nur das Form als aktives und registriert den Haupt-Message-Handler für dieses Form.
Achja: Die .xrd-Datei muss von Hand ins makefile eingetragen werden unter RESOURCES.
Das Programm stellt ein "Form" dar. Tut allerdings sonst nichts.
Das Projekt habe ich mit der Garnet OS Development Suite erstellt. Zusätzlich braucht es noch eine Resource-Datei (.xrd), die ein Form-Objekt mit der ID "1000" enthält.
Die Reihenfolge der Methoden ist "verkehrt" (unwichtigste zuerst), um erstmal keine Header-Datei zu benötigen.
#include < PalmOS.h >
#define UI_MainForm 1000
static Boolean MainFormHandleEvent(EventPtr eventP) {
switch (eventP->eType) {
case frmOpenEvent:
{
FormPtr frmP = FrmGetActiveForm();
FrmDrawForm(frmP);
return true;
}
default:
return false;
}
}
static Boolean AppHandleEvent(EventPtr eventP) {
if (eventP->eType == frmLoadEvent) {
UInt16 formId = eventP->data.frmLoad.formID;
FormPtr formP = FrmInitForm(formId);
FrmSetActiveForm(formP);
if (formId == UI_MainForm)
FrmSetEventHandler(formP, MainFormHandleEvent);
return true;
}
else
return false;
}
static void AppStart() {
FrmGotoForm(UI_MainForm);
}
static void AppStop() {
FrmCloseAllForms();
}
static void AppEventLoop() {
UInt16 error;
EventType event;
do {
EvtGetEvent(&event, evtWaitForever);
if (!SysHandleEvent(&event))
if (!MenuHandleEvent(0, &event, &error))
if (!AppHandleEvent(&event))
FrmDispatchEvent(&event);
} while (event.eType != appStopEvent);
}
UInt32 PilotMain (UInt16 cmd, void *cmdPBP, UInt16 launchFlags) {
switch (cmd) {
case sysAppLaunchCmdNormalLaunch:
AppStart();
AppEventLoop();
AppStop();
return errNone;
default:
return errNone;
}
}
Hauptkomponente des Programms ist die AppEventLoop().
Darin ist nur AppHandleEvent() eine eigene Methode, der Rest wird vom System bereitgestellt, um z. B. Events auf Menüs oder anderen Oberflächenelementen richtig aufzuteilen.
Und AppHandleEvent() wiederum setzt nur das Form als aktives und registriert den Haupt-Message-Handler für dieses Form.
Achja: Die .xrd-Datei muss von Hand ins makefile eingetragen werden unter RESOURCES.
Nielsson - 14. August, 22:56 - Technisches

