mirror of
https://github.com/elasota/Aerofoil.git
synced 2026-03-01 13:25:23 +00:00
Emscripten port
This commit is contained in:
@@ -34,6 +34,11 @@
|
||||
#include <stdlib.h>
|
||||
#include <new>
|
||||
|
||||
int16_t DialogManagerImpl_AlertFilter(void *context, Dialog *dialog, const TimeTaggedVOSEvent *evt)
|
||||
{
|
||||
return -1;
|
||||
}
|
||||
|
||||
namespace PortabilityLayer
|
||||
{
|
||||
class DialogImpl;
|
||||
@@ -90,7 +95,12 @@ namespace PortabilityLayer
|
||||
ArrayView<const DialogItem> GetItems() const override;
|
||||
void SetItemVisibility(unsigned int itemIndex, bool isVisible) override;
|
||||
|
||||
#if GP_ASYNCIFY_PARANOID
|
||||
template<class TFilterFunc>
|
||||
int16_t ExecuteModal(void *captureContext, const TFilterFunc &filterFunc);
|
||||
#else
|
||||
int16_t ExecuteModal(void *captureContext, DialogFilterFunc_t filterFunc) override;
|
||||
#endif
|
||||
|
||||
bool ReplaceWidget(unsigned int itemIndex, Widget *widget) override;
|
||||
|
||||
@@ -108,15 +118,71 @@ namespace PortabilityLayer
|
||||
|
||||
static void MakeStringSubstitutions(uint8_t *outStr, const uint8_t *inStr, const DialogTextSubstitutions *substitutions);
|
||||
|
||||
#if GP_ASYNCIFY_PARANOID
|
||||
template<class TFilterFunc>
|
||||
int16_t ExecuteModalInDarkenStack(void *captureContext, const TFilterFunc &filterFunc);
|
||||
#else
|
||||
int16_t ExecuteModalInDarkenStack(void *captureContext, DialogFilterFunc_t filterFunc);
|
||||
#endif
|
||||
|
||||
Window *m_window;
|
||||
DialogItem *m_items;
|
||||
size_t m_numItems;
|
||||
size_t m_maxItems;
|
||||
};
|
||||
}
|
||||
|
||||
|
||||
#if GP_ASYNCIFY_PARANOID
|
||||
|
||||
#define PL_DIALOG_IMPLEMENT_EXECUTE_MODAL(f) \
|
||||
template<> \
|
||||
int16_t Dialog::ExecuteModal(void *captureContext, DialogFilterFunc_t filterFuncID, const DialogFilterFuncs::InvokeWrapper<DialogFilterFuncs::k##f> &filterFunc) \
|
||||
{ \
|
||||
(void)filterFuncID; \
|
||||
return static_cast<PortabilityLayer::DialogImpl*>(this)->ExecuteModal(captureContext, filterFunc); \
|
||||
}
|
||||
|
||||
PL_DIALOG_IMPLEMENT_EXECUTE_MODAL(BlowerFilter)
|
||||
|
||||
PL_DIALOG_IMPLEMENT_EXECUTE_MODAL(FurnitureFilter)
|
||||
PL_DIALOG_IMPLEMENT_EXECUTE_MODAL(CustPictFilter)
|
||||
PL_DIALOG_IMPLEMENT_EXECUTE_MODAL(SwitchFilter)
|
||||
PL_DIALOG_IMPLEMENT_EXECUTE_MODAL(TriggerFilter)
|
||||
PL_DIALOG_IMPLEMENT_EXECUTE_MODAL(ApplianceFilter)
|
||||
PL_DIALOG_IMPLEMENT_EXECUTE_MODAL(MicrowaveFilter)
|
||||
PL_DIALOG_IMPLEMENT_EXECUTE_MODAL(GreaseFilter)
|
||||
PL_DIALOG_IMPLEMENT_EXECUTE_MODAL(InvisBonusFilter)
|
||||
PL_DIALOG_IMPLEMENT_EXECUTE_MODAL(TransFilter)
|
||||
PL_DIALOG_IMPLEMENT_EXECUTE_MODAL(EnemyFilter)
|
||||
PL_DIALOG_IMPLEMENT_EXECUTE_MODAL(FlowerFilter)
|
||||
PL_DIALOG_IMPLEMENT_EXECUTE_MODAL(LightFilter)
|
||||
PL_DIALOG_IMPLEMENT_EXECUTE_MODAL(GoToFilter)
|
||||
PL_DIALOG_IMPLEMENT_EXECUTE_MODAL(RoomFilter)
|
||||
PL_DIALOG_IMPLEMENT_EXECUTE_MODAL(OriginalArtFilter)
|
||||
|
||||
PL_DIALOG_IMPLEMENT_EXECUTE_MODAL(AboutFilter)
|
||||
PL_DIALOG_IMPLEMENT_EXECUTE_MODAL(LicenseReaderFilter)
|
||||
PL_DIALOG_IMPLEMENT_EXECUTE_MODAL(LoadFilter)
|
||||
PL_DIALOG_IMPLEMENT_EXECUTE_MODAL(AboutFrameworkFilter)
|
||||
PL_DIALOG_IMPLEMENT_EXECUTE_MODAL(BrainsFilter)
|
||||
PL_DIALOG_IMPLEMENT_EXECUTE_MODAL(NameFilter)
|
||||
PL_DIALOG_IMPLEMENT_EXECUTE_MODAL(BannerFilter)
|
||||
PL_DIALOG_IMPLEMENT_EXECUTE_MODAL(ControlFilter)
|
||||
PL_DIALOG_IMPLEMENT_EXECUTE_MODAL(SoundFilter)
|
||||
PL_DIALOG_IMPLEMENT_EXECUTE_MODAL(HouseFilter)
|
||||
PL_DIALOG_IMPLEMENT_EXECUTE_MODAL(DisplayFilter)
|
||||
PL_DIALOG_IMPLEMENT_EXECUTE_MODAL(PrefsFilter)
|
||||
|
||||
PL_DIALOG_IMPLEMENT_EXECUTE_MODAL(FileBrowserUIImpl_PopUpAlertUIFilter)
|
||||
PL_DIALOG_IMPLEMENT_EXECUTE_MODAL(FileBrowserUIImpl_FileBrowserUIFilter)
|
||||
PL_DIALOG_IMPLEMENT_EXECUTE_MODAL(DialogManagerImpl_AlertFilter)
|
||||
|
||||
#endif
|
||||
|
||||
|
||||
namespace PortabilityLayer
|
||||
{
|
||||
DialogItem::DialogItem(Widget *widget)
|
||||
: m_widget(widget)
|
||||
{
|
||||
@@ -336,7 +402,12 @@ namespace PortabilityLayer
|
||||
}
|
||||
}
|
||||
|
||||
#if GP_ASYNCIFY_PARANOID
|
||||
template<class TFilterFunc>
|
||||
int16_t DialogImpl::ExecuteModal(void *captureContext, const TFilterFunc &filterFunc)
|
||||
#else
|
||||
int16_t DialogImpl::ExecuteModal(void *captureContext, DialogFilterFunc_t filterFunc)
|
||||
#endif
|
||||
{
|
||||
Window *exclWindow = this->GetWindow();
|
||||
|
||||
@@ -349,7 +420,12 @@ namespace PortabilityLayer
|
||||
return result;
|
||||
}
|
||||
|
||||
#if GP_ASYNCIFY_PARANOID
|
||||
template<class TFilterFunc>
|
||||
int16_t DialogImpl::ExecuteModalInDarkenStack(void *captureContext, const TFilterFunc &filterFunc)
|
||||
#else
|
||||
int16_t DialogImpl::ExecuteModalInDarkenStack(void *captureContext, DialogFilterFunc_t filterFunc)
|
||||
#endif
|
||||
{
|
||||
Window *window = this->GetWindow();
|
||||
Widget *capturingWidget = nullptr;
|
||||
@@ -359,12 +435,16 @@ namespace PortabilityLayer
|
||||
{
|
||||
TimeTaggedVOSEvent evt;
|
||||
|
||||
const bool haveEvent = WaitForEvent(&evt, 1);
|
||||
bool haveEvent = false;
|
||||
{
|
||||
PL_ASYNCIFY_PARANOID_DISARM_FOR_SCOPE();
|
||||
haveEvent = WaitForEvent(&evt, 1);
|
||||
}
|
||||
|
||||
if (!haveEvent && window->IsHandlingTickEvents())
|
||||
window->OnTick();
|
||||
|
||||
const int16_t selection = (filterFunc != nullptr) ? filterFunc(captureContext, this, haveEvent ? &evt : nullptr) : -1;
|
||||
const int16_t selection = filterFunc(captureContext, this, haveEvent ? &evt : nullptr);
|
||||
|
||||
if (selection >= 0)
|
||||
return selection;
|
||||
@@ -614,7 +694,7 @@ namespace PortabilityLayer
|
||||
public:
|
||||
Dialog *LoadDialog(int16_t resID, Window *behindWindow, const DialogTextSubstitutions *substitutions) override;
|
||||
Dialog *LoadDialogFromTemplate(int16_t templateResID, const Rect &rect, bool visible, bool hasCloseBox, uint32_t referenceConstant, uint16_t positionSpec, Window *behindWindow, const PLPasStr &title, const DialogTextSubstitutions *substitutions) override;
|
||||
int16_t DisplayAlert(int16_t alertResID, const DialogTextSubstitutions *substitutions) override;
|
||||
int16_t DisplayAlert(int16_t alertResID, const DialogTextSubstitutions *substitutions) GP_ASYNCIFY_PARANOID_OVERRIDE;
|
||||
void PositionWindow(Window *window, const Rect &rect) const override;
|
||||
|
||||
DialogTemplate *LoadDialogTemplate(int16_t resID);
|
||||
@@ -622,9 +702,6 @@ namespace PortabilityLayer
|
||||
static DialogManagerImpl *GetInstance();
|
||||
|
||||
private:
|
||||
|
||||
static int16_t AlertFilter(void *context, Dialog *dialog, const TimeTaggedVOSEvent *evt);
|
||||
|
||||
static DialogManagerImpl ms_instance;
|
||||
};
|
||||
|
||||
@@ -708,11 +785,6 @@ namespace PortabilityLayer
|
||||
return dialog;
|
||||
}
|
||||
|
||||
int16_t DialogManagerImpl::AlertFilter(void *context, Dialog *dialog, const TimeTaggedVOSEvent *evt)
|
||||
{
|
||||
return -1;
|
||||
}
|
||||
|
||||
int16_t DialogManagerImpl::DisplayAlert(int16_t alertResID, const DialogTextSubstitutions *substitutions)
|
||||
{
|
||||
struct AlertResourceData
|
||||
@@ -769,7 +841,7 @@ namespace PortabilityLayer
|
||||
if (!dialog)
|
||||
return 0;
|
||||
|
||||
int16_t hit = dialog->ExecuteModal(nullptr, DialogManagerImpl::AlertFilter);
|
||||
int16_t hit = dialog->ExecuteModal(nullptr, PL_FILTER_FUNC(DialogManagerImpl_AlertFilter));
|
||||
dialog->Destroy();
|
||||
|
||||
return hit;
|
||||
@@ -885,3 +957,12 @@ namespace PortabilityLayer
|
||||
return DialogManagerImpl::GetInstance();
|
||||
}
|
||||
}
|
||||
|
||||
PL_IMPLEMENT_FILTER_FUNCTION(DialogManagerImpl_AlertFilter)
|
||||
|
||||
#if GP_ASYNCIFY_PARANOID
|
||||
int16_t PortabilityLayer::DialogManager::DisplayAlert(int16_t alertResID, const DialogTextSubstitutions *substitutions)
|
||||
{
|
||||
return static_cast<DialogManagerImpl*>(this)->DisplayAlert(alertResID, substitutions);
|
||||
}
|
||||
#endif
|
||||
|
||||
@@ -1,5 +1,6 @@
|
||||
#pragma once
|
||||
|
||||
#include "CoreDefs.h"
|
||||
#include <stdint.h>
|
||||
|
||||
struct Dialog;
|
||||
@@ -19,7 +20,7 @@ namespace PortabilityLayer
|
||||
public:
|
||||
virtual Dialog *LoadDialog(int16_t resID, Window *behindWindow, const DialogTextSubstitutions *substitutions) = 0;
|
||||
virtual Dialog *LoadDialogFromTemplate(int16_t templateResID, const Rect &rect, bool visible, bool hasCloseBox, uint32_t referenceConstant, uint16_t positionSpec, Window *behindWindow, const PLPasStr &title, const DialogTextSubstitutions *substitutions) = 0;
|
||||
virtual int16_t DisplayAlert(int16_t alertResID, const DialogTextSubstitutions *substitutions) = 0;
|
||||
GP_ASYNCIFY_PARANOID_VIRTUAL int16_t DisplayAlert(int16_t alertResID, const DialogTextSubstitutions *substitutions) GP_ASYNCIFY_PARANOID_PURE;
|
||||
virtual void PositionWindow(Window *window, const Rect &rect) const = 0;
|
||||
|
||||
static DialogManager *GetInstance();
|
||||
|
||||
@@ -62,8 +62,6 @@ namespace PortabilityLayer
|
||||
|
||||
static void PubScrollBarCallback(void *captureContext, Widget *control, int part);
|
||||
static bool PubEditBoxCharFilter(void *context, uint8_t ch);
|
||||
static int16_t PubFileBrowserUIFilter(void *context, Dialog *dialog, const TimeTaggedVOSEvent *evt);
|
||||
static int16_t PubPopUpAlertUIFilter(void *context, Dialog *dialog, const TimeTaggedVOSEvent *evt);
|
||||
|
||||
bool AppendName(const char *name, size_t nameLength, void *details);
|
||||
void SortNames();
|
||||
@@ -82,6 +80,9 @@ namespace PortabilityLayer
|
||||
|
||||
static int16_t PopUpAlert(const Rect &rect, int dialogResID, const DialogTextSubstitutions *substitutions);
|
||||
|
||||
int16_t FileBrowserUIFilter(Dialog *dialog, const TimeTaggedVOSEvent *evt);
|
||||
int16_t PopUpAlertUIFilter(Dialog *dialog, const TimeTaggedVOSEvent *evt);
|
||||
|
||||
private:
|
||||
typedef PascalStr<255> NameStr_t;
|
||||
|
||||
@@ -92,8 +93,6 @@ namespace PortabilityLayer
|
||||
};
|
||||
|
||||
void ScrollBarCallback(Widget *control, int part);
|
||||
int16_t FileBrowserUIFilter(Dialog *dialog, const TimeTaggedVOSEvent *evt);
|
||||
int16_t PopUpAlertUIFilter(Dialog *dialog, const TimeTaggedVOSEvent *evt);
|
||||
|
||||
static bool FileEntrySortPred(const FileEntry &a, const FileEntry &b);
|
||||
|
||||
@@ -114,7 +113,21 @@ namespace PortabilityLayer
|
||||
|
||||
const FileBrowserUI_DetailsCallbackAPI m_api;
|
||||
};
|
||||
}
|
||||
|
||||
|
||||
static int16_t FileBrowserUIImpl_FileBrowserUIFilter(void *context, Dialog *dialog, const TimeTaggedVOSEvent *evt)
|
||||
{
|
||||
return static_cast<PortabilityLayer::FileBrowserUIImpl*>(context)->FileBrowserUIFilter(dialog, evt);
|
||||
}
|
||||
|
||||
static int16_t FileBrowserUIImpl_PopUpAlertUIFilter(void *context, Dialog *dialog, const TimeTaggedVOSEvent *evt)
|
||||
{
|
||||
return static_cast<PortabilityLayer::FileBrowserUIImpl*>(context)->PopUpAlertUIFilter(dialog, evt);
|
||||
}
|
||||
|
||||
namespace PortabilityLayer
|
||||
{
|
||||
FileBrowserUIImpl::FileBrowserUIImpl(const FileBrowserUI_DetailsCallbackAPI &callbackAPI)
|
||||
: m_offset(0)
|
||||
, m_surface(nullptr)
|
||||
@@ -148,16 +161,6 @@ namespace PortabilityLayer
|
||||
static_cast<FileBrowserUIImpl*>(captureContext)->ScrollBarCallback(control, part);
|
||||
}
|
||||
|
||||
int16_t FileBrowserUIImpl::PubFileBrowserUIFilter(void *context, Dialog *dialog, const TimeTaggedVOSEvent *evt)
|
||||
{
|
||||
return static_cast<FileBrowserUIImpl*>(context)->FileBrowserUIFilter(dialog, evt);
|
||||
}
|
||||
|
||||
int16_t FileBrowserUIImpl::PubPopUpAlertUIFilter(void *context, Dialog *dialog, const TimeTaggedVOSEvent *evt)
|
||||
{
|
||||
return static_cast<FileBrowserUIImpl*>(context)->PopUpAlertUIFilter(dialog, evt);
|
||||
}
|
||||
|
||||
bool FileBrowserUIImpl::PubEditBoxCharFilter(void *context, uint8_t ch)
|
||||
{
|
||||
uint16_t unicodeChar = MacRoman::ToUnicode(ch);
|
||||
@@ -356,6 +359,7 @@ namespace PortabilityLayer
|
||||
|
||||
if (okayButton->IsEnabled())
|
||||
{
|
||||
PL_ASYNCIFY_PARANOID_DISARM_FOR_SCOPE();
|
||||
okayButton->SetHighlightStyle(kControlButtonPart, true);
|
||||
PLSysCalls::Sleep(8);
|
||||
okayButton->SetHighlightStyle(kControlButtonPart, false);
|
||||
@@ -368,6 +372,7 @@ namespace PortabilityLayer
|
||||
|
||||
case PL_KEY_SPECIAL(kEscape):
|
||||
{
|
||||
PL_ASYNCIFY_PARANOID_DISARM_FOR_SCOPE();
|
||||
Widget *cancelButton = dialog->GetItems()[kCancelButton - 1].GetWidget();
|
||||
|
||||
cancelButton->SetHighlightStyle(kControlButtonPart, true);
|
||||
@@ -555,7 +560,7 @@ namespace PortabilityLayer
|
||||
int16_t hit = 0;
|
||||
do
|
||||
{
|
||||
hit = dialog->ExecuteModal(nullptr, PubPopUpAlertUIFilter);
|
||||
hit = dialog->ExecuteModal(nullptr, PL_FILTER_FUNC(FileBrowserUIImpl_PopUpAlertUIFilter));
|
||||
} while (hit != kOkayButton && hit != kCancelButton);
|
||||
|
||||
dialog->Destroy();
|
||||
@@ -709,7 +714,7 @@ namespace PortabilityLayer
|
||||
|
||||
do
|
||||
{
|
||||
hit = dialog->ExecuteModal(&uiImpl, FileBrowserUIImpl::PubFileBrowserUIFilter);
|
||||
hit = dialog->ExecuteModal(&uiImpl, PL_FILTER_FUNC(FileBrowserUIImpl_FileBrowserUIFilter));
|
||||
|
||||
if (hit == kFileListScrollBar)
|
||||
uiImpl.SetScrollOffset(scrollBar->GetState());
|
||||
@@ -806,3 +811,6 @@ namespace PortabilityLayer
|
||||
return confirmed;
|
||||
}
|
||||
}
|
||||
|
||||
PL_IMPLEMENT_FILTER_FUNCTION(FileBrowserUIImpl_FileBrowserUIFilter)
|
||||
PL_IMPLEMENT_FILTER_FUNCTION(FileBrowserUIImpl_PopUpAlertUIFilter)
|
||||
|
||||
@@ -100,6 +100,8 @@ namespace PortabilityLayer
|
||||
if (!stream)
|
||||
return nullptr;
|
||||
|
||||
fprintf(stderr, "Composite file opened\n");
|
||||
|
||||
ZipFileProxy *zipFile = ZipFileProxy::Create(stream);
|
||||
if (!zipFile)
|
||||
{
|
||||
@@ -107,6 +109,8 @@ namespace PortabilityLayer
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
fprintf(stderr, "Zip proxy created\n");
|
||||
|
||||
size_t metaIndex = 0;
|
||||
if (!zipFile->IndexFile("!!meta", metaIndex))
|
||||
{
|
||||
@@ -114,6 +118,8 @@ namespace PortabilityLayer
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
fprintf(stderr, "Meta file indexed\n");
|
||||
|
||||
MacFilePropertiesSerialized mfps;
|
||||
|
||||
GpIOStream *metaStream = zipFile->OpenFile(metaIndex);
|
||||
@@ -124,6 +130,8 @@ namespace PortabilityLayer
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
fprintf(stderr, "Meta data deserialized\n");
|
||||
|
||||
if (!metaStream->ReadExact(mfps.m_data, sizeof(mfps.m_data)))
|
||||
{
|
||||
metaStream->Close();
|
||||
@@ -152,6 +160,8 @@ namespace PortabilityLayer
|
||||
stream = nullptr;
|
||||
}
|
||||
|
||||
fprintf(stderr, "Composite constructed\n");
|
||||
|
||||
CompositeFile *compositeFile = CompositeFileImpl::Create(dirID, filename, stream, zipFile, mfp, hasResources, hasData, hasData ? dataIndex : 0);
|
||||
if (!compositeFile)
|
||||
{
|
||||
|
||||
@@ -32,8 +32,8 @@ struct IGpDisplayDriver;
|
||||
class GpAppInterface
|
||||
{
|
||||
public:
|
||||
virtual void ApplicationInit() = 0;
|
||||
virtual int ApplicationMain() = 0;
|
||||
GP_ASYNCIFY_PARANOID_VIRTUAL void ApplicationInit() GP_ASYNCIFY_PARANOID_PURE;
|
||||
GP_ASYNCIFY_PARANOID_VIRTUAL int ApplicationMain() GP_ASYNCIFY_PARANOID_PURE;
|
||||
virtual void PL_IncrementTickCounter(uint32_t count) = 0;
|
||||
virtual void PL_Render(IGpDisplayDriver *displayDriver) = 0;
|
||||
virtual GpDriverCollection *PL_GetDriverCollection() = 0;
|
||||
|
||||
@@ -1,17 +1,17 @@
|
||||
#include "HostSuspendHook.h"
|
||||
#include "HostSuspendHook.h"
|
||||
#include "HostSuspendCallArgument.h"
|
||||
|
||||
#include "DisplayDeviceManager.h"
|
||||
|
||||
#include "PLDrivers.h"
|
||||
#include "IGpDisplayDriver.h"
|
||||
|
||||
|
||||
namespace PortabilityLayer
|
||||
{
|
||||
#include "IGpDisplayDriver.h"
|
||||
|
||||
|
||||
namespace PortabilityLayer
|
||||
{
|
||||
void RenderFrames(unsigned int ticks)
|
||||
{
|
||||
{
|
||||
PLDrivers::GetDisplayDriver()->ServeTicks(ticks);
|
||||
DisplayDeviceManager::GetInstance()->IncrementTickCount(ticks);
|
||||
}
|
||||
}
|
||||
DisplayDeviceManager::GetInstance()->IncrementTickCount(ticks);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -22,6 +22,7 @@
|
||||
#include "PLPasStr.h"
|
||||
#include "PLResources.h"
|
||||
#include "PLStandardColors.h"
|
||||
#include "PLSysCalls.h"
|
||||
#include "PLTimeTaggedVOSEvent.h"
|
||||
#include "PLQDOffscreen.h"
|
||||
|
||||
@@ -153,7 +154,7 @@ namespace PortabilityLayer
|
||||
uint16_t GetMenuBarHeight() const override;
|
||||
|
||||
bool FindMenuShortcut(uint16_t &menuID, uint16_t &itemID, uint8_t shortcutChar) override;
|
||||
void MenuSelect(const Vec2i &initialPoint, int16_t *outMenu, uint16_t *outItem) override;
|
||||
void MenuSelect(const Vec2i &initialPoint, int16_t *outMenu, uint16_t *outItem) GP_ASYNCIFY_PARANOID_OVERRIDE;
|
||||
void PopupMenuSelect(const THandle<Menu> &menu, const Vec2i &popupMenuPos, const Vec2i &initialPoint, size_t initialItem, uint16_t *outItem) override;
|
||||
|
||||
void DrawMenuBar() override;
|
||||
@@ -709,7 +710,13 @@ namespace PortabilityLayer
|
||||
bool canDismiss = false;
|
||||
while (!canDismiss)
|
||||
{
|
||||
if (WaitForEvent(&evt, 1))
|
||||
bool haveEvent = false;
|
||||
{
|
||||
PL_ASYNCIFY_PARANOID_DISARM_FOR_SCOPE();
|
||||
haveEvent = WaitForEvent(&evt, 1);
|
||||
}
|
||||
|
||||
if (haveEvent)
|
||||
{
|
||||
if (evt.m_vosEvent.m_eventType == GpVOSEventTypes::kMouseInput)
|
||||
{
|
||||
@@ -1576,4 +1583,11 @@ namespace PortabilityLayer
|
||||
{
|
||||
return MenuManagerImpl::GetInstance();
|
||||
}
|
||||
|
||||
#ifdef GP_ASYNCIFY_PARANOID
|
||||
void MenuManager::MenuSelect(const Vec2i &initialPoint, int16_t *outMenu, uint16_t *outItem)
|
||||
{
|
||||
static_cast<MenuManagerImpl*>(this)->MenuSelect(initialPoint, outMenu, outItem);
|
||||
}
|
||||
#endif
|
||||
}
|
||||
|
||||
@@ -4,6 +4,7 @@
|
||||
#include <stddef.h>
|
||||
|
||||
#include "PLErrorCodes.h"
|
||||
#include "CoreDefs.h"
|
||||
|
||||
template<class T>
|
||||
class THandle;
|
||||
@@ -48,7 +49,7 @@ namespace PortabilityLayer
|
||||
virtual uint16_t GetMenuBarHeight() const = 0;
|
||||
|
||||
virtual bool FindMenuShortcut(uint16_t &menuID, uint16_t &itemID, uint8_t shortcutChar) = 0;
|
||||
virtual void MenuSelect(const Vec2i &initialPoint, int16_t *outMenu, uint16_t *outItem) = 0;
|
||||
GP_ASYNCIFY_PARANOID_VIRTUAL void MenuSelect(const Vec2i &initialPoint, int16_t *outMenu, uint16_t *outItem) GP_ASYNCIFY_PARANOID_PURE;
|
||||
virtual void PopupMenuSelect(const THandle<Menu> &menu, const Vec2i &popupMenuPos, const Vec2i &initialPoint, size_t initialItem, uint16_t *outItem) = 0;
|
||||
|
||||
virtual void DrawMenuBar() = 0;
|
||||
|
||||
@@ -1,10 +1,11 @@
|
||||
#include "PLButtonWidget.h"
|
||||
#include "PLCore.h"
|
||||
#include "PLControlDefinitions.h"
|
||||
#include "PLRegions.h"
|
||||
#include "PLTimeTaggedVOSEvent.h"
|
||||
#include "PLStandardColors.h"
|
||||
#include "PLQDraw.h"
|
||||
#include "PLRegions.h"
|
||||
#include "PLStandardColors.h"
|
||||
#include "PLSysCalls.h"
|
||||
#include "PLTimeTaggedVOSEvent.h"
|
||||
#include "FontFamily.h"
|
||||
#include "RenderedFont.h"
|
||||
#include "GpRenderedFontMetrics.h"
|
||||
@@ -13,10 +14,10 @@
|
||||
|
||||
#include <algorithm>
|
||||
|
||||
static const int kLightGray = 238;
|
||||
static const int kMidGray = 221;
|
||||
static const int kMidDarkGray = 170;
|
||||
static const int kDarkGray = 102;
|
||||
static const int kButtonLightGray = 238;
|
||||
static const int kButtonMidGray = 221;
|
||||
static const int kButtonMidDarkGray = 170;
|
||||
static const int kButtonDarkGray = 102;
|
||||
|
||||
#ifdef CLR
|
||||
#undef CLR
|
||||
@@ -27,28 +28,28 @@ static const int kDarkGray = 102;
|
||||
static const PortabilityLayer::RGBAColor gs_buttonTopLeftCornerGraphicPixels[] =
|
||||
{
|
||||
CLR(0), CLR(0), CLR(0),
|
||||
CLR(0), CLR(0), CLR(kMidGray),
|
||||
CLR(0), CLR(kMidGray), CLR(255)
|
||||
CLR(0), CLR(0), CLR(kButtonMidGray),
|
||||
CLR(0), CLR(kButtonMidGray), CLR(255)
|
||||
};
|
||||
|
||||
static const PortabilityLayer::RGBAColor gs_buttonTopRightCornerGraphicPixels[] =
|
||||
{
|
||||
CLR(0), CLR(0), CLR(0),
|
||||
CLR(kMidGray), CLR(0), CLR(0),
|
||||
CLR(255), CLR(kMidGray), CLR(0)
|
||||
CLR(kButtonMidGray), CLR(0), CLR(0),
|
||||
CLR(255), CLR(kButtonMidGray), CLR(0)
|
||||
};
|
||||
|
||||
static const PortabilityLayer::RGBAColor gs_buttonBottomLeftCornerGraphicPixels[] =
|
||||
{
|
||||
CLR(0), CLR(kMidGray), CLR(255),
|
||||
CLR(0), CLR(0), CLR(kMidGray),
|
||||
CLR(0), CLR(kButtonMidGray), CLR(255),
|
||||
CLR(0), CLR(0), CLR(kButtonMidGray),
|
||||
CLR(0), CLR(0), CLR(0)
|
||||
};
|
||||
|
||||
static const PortabilityLayer::RGBAColor gs_buttonBottomRightCornerGraphicPixels[] =
|
||||
{
|
||||
CLR(kMidGray), CLR(kDarkGray), CLR(0),
|
||||
CLR(kDarkGray), CLR(0), CLR(0),
|
||||
CLR(kButtonMidGray), CLR(kButtonDarkGray), CLR(0),
|
||||
CLR(kButtonDarkGray), CLR(0), CLR(0),
|
||||
CLR(0), CLR(0), CLR(0)
|
||||
};
|
||||
|
||||
@@ -57,28 +58,28 @@ static const PortabilityLayer::RGBAColor gs_buttonBottomRightCornerGraphicPixels
|
||||
static const PortabilityLayer::RGBAColor gs_buttonPressedTopLeftCornerGraphicPixels[] =
|
||||
{
|
||||
CLR(0), CLR(0), CLR(0),
|
||||
CLR(0), CLR(0), CLR(kDarkGray),
|
||||
CLR(0), CLR(kDarkGray), CLR(kDarkGray)
|
||||
CLR(0), CLR(0), CLR(kButtonDarkGray),
|
||||
CLR(0), CLR(kButtonDarkGray), CLR(kButtonDarkGray)
|
||||
};
|
||||
|
||||
static const PortabilityLayer::RGBAColor gs_buttonPressedTopRightCornerGraphicPixels[] =
|
||||
{
|
||||
CLR(0), CLR(0), CLR(0),
|
||||
CLR(kDarkGray), CLR(0), CLR(0),
|
||||
CLR(kDarkGray), CLR(kDarkGray), CLR(0)
|
||||
CLR(kButtonDarkGray), CLR(0), CLR(0),
|
||||
CLR(kButtonDarkGray), CLR(kButtonDarkGray), CLR(0)
|
||||
};
|
||||
|
||||
static const PortabilityLayer::RGBAColor gs_buttonPressedBottomLeftCornerGraphicPixels[] =
|
||||
{
|
||||
CLR(0), CLR(kDarkGray), CLR(kDarkGray),
|
||||
CLR(0), CLR(0), CLR(kDarkGray),
|
||||
CLR(0), CLR(kButtonDarkGray), CLR(kButtonDarkGray),
|
||||
CLR(0), CLR(0), CLR(kButtonDarkGray),
|
||||
CLR(0), CLR(0), CLR(0)
|
||||
};
|
||||
|
||||
static const PortabilityLayer::RGBAColor gs_buttonPressedBottomRightCornerGraphicPixels[] =
|
||||
{
|
||||
CLR(kDarkGray), CLR(kDarkGray), CLR(0),
|
||||
CLR(kDarkGray), CLR(0), CLR(0),
|
||||
CLR(kButtonDarkGray), CLR(kButtonDarkGray), CLR(0),
|
||||
CLR(kButtonDarkGray), CLR(0), CLR(0),
|
||||
CLR(0), CLR(0), CLR(0)
|
||||
};
|
||||
|
||||
@@ -86,30 +87,30 @@ static const PortabilityLayer::RGBAColor gs_buttonPressedBottomRightCornerGraphi
|
||||
|
||||
static const PortabilityLayer::RGBAColor gs_buttonDisabledTopLeftCornerGraphicPixels[] =
|
||||
{
|
||||
CLR(kDarkGray), CLR(kDarkGray), CLR(kDarkGray),
|
||||
CLR(kDarkGray), CLR(kDarkGray), CLR(kLightGray),
|
||||
CLR(kDarkGray), CLR(kLightGray), CLR(kLightGray)
|
||||
CLR(kButtonDarkGray), CLR(kButtonDarkGray), CLR(kButtonDarkGray),
|
||||
CLR(kButtonDarkGray), CLR(kButtonDarkGray), CLR(kButtonLightGray),
|
||||
CLR(kButtonDarkGray), CLR(kButtonLightGray), CLR(kButtonLightGray)
|
||||
};
|
||||
|
||||
static const PortabilityLayer::RGBAColor gs_buttonDisabledTopRightCornerGraphicPixels[] =
|
||||
{
|
||||
CLR(kDarkGray), CLR(kDarkGray), CLR(kDarkGray),
|
||||
CLR(kLightGray), CLR(kDarkGray), CLR(kDarkGray),
|
||||
CLR(kLightGray), CLR(kLightGray), CLR(kDarkGray)
|
||||
CLR(kButtonDarkGray), CLR(kButtonDarkGray), CLR(kButtonDarkGray),
|
||||
CLR(kButtonLightGray), CLR(kButtonDarkGray), CLR(kButtonDarkGray),
|
||||
CLR(kButtonLightGray), CLR(kButtonLightGray), CLR(kButtonDarkGray)
|
||||
};
|
||||
|
||||
static const PortabilityLayer::RGBAColor gs_buttonDisabledBottomLeftCornerGraphicPixels[] =
|
||||
{
|
||||
CLR(kDarkGray), CLR(kLightGray), CLR(kLightGray),
|
||||
CLR(kDarkGray), CLR(kDarkGray), CLR(kLightGray),
|
||||
CLR(kDarkGray), CLR(kDarkGray), CLR(kDarkGray)
|
||||
CLR(kButtonDarkGray), CLR(kButtonLightGray), CLR(kButtonLightGray),
|
||||
CLR(kButtonDarkGray), CLR(kButtonDarkGray), CLR(kButtonLightGray),
|
||||
CLR(kButtonDarkGray), CLR(kButtonDarkGray), CLR(kButtonDarkGray)
|
||||
};
|
||||
|
||||
static const PortabilityLayer::RGBAColor gs_buttonDisabledBottomRightCornerGraphicPixels[] =
|
||||
{
|
||||
CLR(kLightGray), CLR(kLightGray), CLR(kDarkGray),
|
||||
CLR(kLightGray), CLR(kDarkGray), CLR(kDarkGray),
|
||||
CLR(kDarkGray), CLR(kDarkGray), CLR(kDarkGray)
|
||||
CLR(kButtonLightGray), CLR(kButtonLightGray), CLR(kButtonDarkGray),
|
||||
CLR(kButtonLightGray), CLR(kButtonDarkGray), CLR(kButtonDarkGray),
|
||||
CLR(kButtonDarkGray), CLR(kButtonDarkGray), CLR(kButtonDarkGray)
|
||||
};
|
||||
|
||||
// Default boundary
|
||||
@@ -118,35 +119,35 @@ static const PortabilityLayer::RGBAColor gs_buttonDefaultTopLeftCornerGraphicPix
|
||||
{
|
||||
CLR(0), CLR(0), CLR(0), CLR(0), CLR(0),
|
||||
CLR(0), CLR(0), CLR(0), CLR(0), CLR(255),
|
||||
CLR(0), CLR(0), CLR(0), CLR(255), CLR(kMidGray),
|
||||
CLR(0), CLR(0), CLR(255), CLR(kMidGray), CLR(kMidGray),
|
||||
CLR(0), CLR(255), CLR(kMidGray), CLR(kMidGray), CLR(0),
|
||||
CLR(0), CLR(0), CLR(0), CLR(255), CLR(kButtonMidGray),
|
||||
CLR(0), CLR(0), CLR(255), CLR(kButtonMidGray), CLR(kButtonMidGray),
|
||||
CLR(0), CLR(255), CLR(kButtonMidGray), CLR(kButtonMidGray), CLR(0),
|
||||
};
|
||||
|
||||
static const PortabilityLayer::RGBAColor gs_buttonDefaultTopRightCornerGraphicPixels[] =
|
||||
{
|
||||
CLR(0), CLR(0), CLR(0), CLR(0), CLR(0),
|
||||
CLR(255), CLR(0), CLR(0), CLR(0), CLR(0),
|
||||
CLR(kMidGray), CLR(kMidGray), CLR(0), CLR(0), CLR(0),
|
||||
CLR(kMidGray), CLR(kMidGray), CLR(kMidGray), CLR(0), CLR(0),
|
||||
CLR(0), CLR(kMidGray), CLR(kMidGray), CLR(kDarkGray), CLR(0),
|
||||
CLR(kButtonMidGray), CLR(kButtonMidGray), CLR(0), CLR(0), CLR(0),
|
||||
CLR(kButtonMidGray), CLR(kButtonMidGray), CLR(kButtonMidGray), CLR(0), CLR(0),
|
||||
CLR(0), CLR(kButtonMidGray), CLR(kButtonMidGray), CLR(kButtonDarkGray), CLR(0),
|
||||
};
|
||||
|
||||
static const PortabilityLayer::RGBAColor gs_buttonDefaultBottomLeftCornerGraphicPixels[] =
|
||||
{
|
||||
CLR(0), CLR(255), CLR(kMidGray), CLR(kMidGray), CLR(0),
|
||||
CLR(0), CLR(0), CLR(kMidGray), CLR(kMidGray), CLR(kMidGray),
|
||||
CLR(0), CLR(0), CLR(0), CLR(kMidGray), CLR(kMidGray),
|
||||
CLR(0), CLR(0), CLR(0), CLR(0), CLR(kDarkGray),
|
||||
CLR(0), CLR(255), CLR(kButtonMidGray), CLR(kButtonMidGray), CLR(0),
|
||||
CLR(0), CLR(0), CLR(kButtonMidGray), CLR(kButtonMidGray), CLR(kButtonMidGray),
|
||||
CLR(0), CLR(0), CLR(0), CLR(kButtonMidGray), CLR(kButtonMidGray),
|
||||
CLR(0), CLR(0), CLR(0), CLR(0), CLR(kButtonDarkGray),
|
||||
CLR(0), CLR(0), CLR(0), CLR(0), CLR(0),
|
||||
};
|
||||
|
||||
static const PortabilityLayer::RGBAColor gs_buttonDefaultBottomRightCornerGraphicPixels[] =
|
||||
{
|
||||
CLR(0), CLR(kMidGray), CLR(kMidGray), CLR(kDarkGray), CLR(0),
|
||||
CLR(kMidGray), CLR(kMidGray), CLR(kDarkGray), CLR(0), CLR(0),
|
||||
CLR(kMidGray), CLR(kDarkGray), CLR(0), CLR(0), CLR(0),
|
||||
CLR(kDarkGray), CLR(0), CLR(0), CLR(0), CLR(0),
|
||||
CLR(0), CLR(kButtonMidGray), CLR(kButtonMidGray), CLR(kButtonDarkGray), CLR(0),
|
||||
CLR(kButtonMidGray), CLR(kButtonMidGray), CLR(kButtonDarkGray), CLR(0), CLR(0),
|
||||
CLR(kButtonMidGray), CLR(kButtonDarkGray), CLR(0), CLR(0), CLR(0),
|
||||
CLR(kButtonDarkGray), CLR(0), CLR(0), CLR(0), CLR(0),
|
||||
CLR(0), CLR(0), CLR(0), CLR(0), CLR(0),
|
||||
};
|
||||
|
||||
@@ -154,15 +155,15 @@ static const PortabilityLayer::RGBAColor gs_buttonRadioGraphicPixels[] =
|
||||
{
|
||||
CLR(0),CLR(0),CLR(0),CLR(0),CLR(0),CLR(0),CLR(0),CLR(0),CLR(0),CLR(0),CLR(0),CLR(0),
|
||||
CLR(0),CLR(0),CLR(0),CLR(255),CLR(255),CLR(255),CLR(255),CLR(255),CLR(255),CLR(0),CLR(0),CLR(0),
|
||||
CLR(0),CLR(0),CLR(255),CLR(255),CLR(kLightGray),CLR(kLightGray),CLR(kLightGray),CLR(kLightGray),CLR(kMidGray),CLR(kMidGray),CLR(0),CLR(0),
|
||||
CLR(0),CLR(255),CLR(255),CLR(kLightGray),CLR(kLightGray),CLR(kMidGray),CLR(kMidGray),CLR(kMidGray),CLR(kMidGray),CLR(kMidGray),CLR(kDarkGray),CLR(0),
|
||||
CLR(0),CLR(255),CLR(kLightGray),CLR(kLightGray),CLR(kMidGray),CLR(kMidGray),CLR(kMidGray),CLR(kMidGray),CLR(kMidGray),CLR(kMidDarkGray),CLR(kDarkGray),CLR(0),
|
||||
CLR(0),CLR(255),CLR(kLightGray),CLR(kMidGray),CLR(kMidGray),CLR(kMidGray),CLR(kMidGray),CLR(kMidGray),CLR(kMidGray),CLR(kMidDarkGray),CLR(kDarkGray),CLR(0),
|
||||
CLR(0),CLR(255),CLR(kLightGray),CLR(kMidGray),CLR(kMidGray),CLR(kMidGray),CLR(kMidGray),CLR(kMidGray),CLR(kMidGray),CLR(kMidDarkGray),CLR(kDarkGray),CLR(0),
|
||||
CLR(0),CLR(255),CLR(kLightGray),CLR(kMidGray),CLR(kMidGray),CLR(kMidGray),CLR(kMidGray),CLR(kMidGray),CLR(kMidDarkGray),CLR(kMidDarkGray),CLR(kDarkGray),CLR(0),
|
||||
CLR(0),CLR(255),CLR(kMidGray),CLR(kMidGray),CLR(kMidGray),CLR(kMidGray),CLR(kMidGray),CLR(kMidDarkGray),CLR(kMidDarkGray),CLR(kDarkGray),CLR(kDarkGray),CLR(0),
|
||||
CLR(0),CLR(0),CLR(kMidGray),CLR(kMidGray),CLR(kMidDarkGray),CLR(kMidDarkGray),CLR(kMidDarkGray),CLR(kMidDarkGray),CLR(kDarkGray),CLR(kDarkGray),CLR(0),CLR(0),
|
||||
CLR(0),CLR(0),CLR(0),CLR(kDarkGray),CLR(kDarkGray),CLR(kDarkGray),CLR(kDarkGray),CLR(kDarkGray),CLR(kDarkGray),CLR(0),CLR(0),CLR(0),
|
||||
CLR(0),CLR(0),CLR(255),CLR(255),CLR(kButtonLightGray),CLR(kButtonLightGray),CLR(kButtonLightGray),CLR(kButtonLightGray),CLR(kButtonMidGray),CLR(kButtonMidGray),CLR(0),CLR(0),
|
||||
CLR(0),CLR(255),CLR(255),CLR(kButtonLightGray),CLR(kButtonLightGray),CLR(kButtonMidGray),CLR(kButtonMidGray),CLR(kButtonMidGray),CLR(kButtonMidGray),CLR(kButtonMidGray),CLR(kButtonDarkGray),CLR(0),
|
||||
CLR(0),CLR(255),CLR(kButtonLightGray),CLR(kButtonLightGray),CLR(kButtonMidGray),CLR(kButtonMidGray),CLR(kButtonMidGray),CLR(kButtonMidGray),CLR(kButtonMidGray),CLR(kButtonMidDarkGray),CLR(kButtonDarkGray),CLR(0),
|
||||
CLR(0),CLR(255),CLR(kButtonLightGray),CLR(kButtonMidGray),CLR(kButtonMidGray),CLR(kButtonMidGray),CLR(kButtonMidGray),CLR(kButtonMidGray),CLR(kButtonMidGray),CLR(kButtonMidDarkGray),CLR(kButtonDarkGray),CLR(0),
|
||||
CLR(0),CLR(255),CLR(kButtonLightGray),CLR(kButtonMidGray),CLR(kButtonMidGray),CLR(kButtonMidGray),CLR(kButtonMidGray),CLR(kButtonMidGray),CLR(kButtonMidGray),CLR(kButtonMidDarkGray),CLR(kButtonDarkGray),CLR(0),
|
||||
CLR(0),CLR(255),CLR(kButtonLightGray),CLR(kButtonMidGray),CLR(kButtonMidGray),CLR(kButtonMidGray),CLR(kButtonMidGray),CLR(kButtonMidGray),CLR(kButtonMidDarkGray),CLR(kButtonMidDarkGray),CLR(kButtonDarkGray),CLR(0),
|
||||
CLR(0),CLR(255),CLR(kButtonMidGray),CLR(kButtonMidGray),CLR(kButtonMidGray),CLR(kButtonMidGray),CLR(kButtonMidGray),CLR(kButtonMidDarkGray),CLR(kButtonMidDarkGray),CLR(kButtonDarkGray),CLR(kButtonDarkGray),CLR(0),
|
||||
CLR(0),CLR(0),CLR(kButtonMidGray),CLR(kButtonMidGray),CLR(kButtonMidDarkGray),CLR(kButtonMidDarkGray),CLR(kButtonMidDarkGray),CLR(kButtonMidDarkGray),CLR(kButtonDarkGray),CLR(kButtonDarkGray),CLR(0),CLR(0),
|
||||
CLR(0),CLR(0),CLR(0),CLR(kButtonDarkGray),CLR(kButtonDarkGray),CLR(kButtonDarkGray),CLR(kButtonDarkGray),CLR(kButtonDarkGray),CLR(kButtonDarkGray),CLR(0),CLR(0),CLR(0),
|
||||
CLR(0),CLR(0),CLR(0),CLR(0),CLR(0),CLR(0),CLR(0),CLR(0),CLR(0),CLR(0),CLR(0),CLR(0),
|
||||
};
|
||||
|
||||
@@ -222,7 +223,7 @@ namespace PortabilityLayer
|
||||
}
|
||||
|
||||
ButtonWidget::ButtonWidget(const WidgetBasicState &state)
|
||||
: WidgetSpec<ButtonWidget>(state)
|
||||
: WidgetSpec<ButtonWidget, WidgetTypes::kButton>(state)
|
||||
, m_text(state.m_text)
|
||||
, m_haveHighlightOverride(false)
|
||||
, m_buttonStyle(kButtonStyle_Button)
|
||||
@@ -280,7 +281,13 @@ namespace PortabilityLayer
|
||||
}
|
||||
|
||||
TimeTaggedVOSEvent evt;
|
||||
if (WaitForEvent(&evt, 1))
|
||||
bool haveEvent = false;
|
||||
{
|
||||
PL_ASYNCIFY_PARANOID_DISARM_FOR_SCOPE();
|
||||
haveEvent = WaitForEvent(&evt, 1);
|
||||
}
|
||||
|
||||
if (haveEvent)
|
||||
{
|
||||
if (evt.m_vosEvent.m_eventType == GpVOSEventTypes::kMouseInput)
|
||||
{
|
||||
@@ -363,45 +370,45 @@ namespace PortabilityLayer
|
||||
if (!m_enabled)
|
||||
{
|
||||
cornerGraphics = gs_buttonDisabledCornerGraphics;
|
||||
topStripeColors[0] = PortabilityLayer::RGBAColor::Create(kLightGray, kLightGray, kLightGray, 255);
|
||||
topStripeColors[1] = PortabilityLayer::RGBAColor::Create(kLightGray, kLightGray, kLightGray, 255);
|
||||
leftStripeColors[0] = PortabilityLayer::RGBAColor::Create(kLightGray, kLightGray, kLightGray, 255);
|
||||
leftStripeColors[1] = PortabilityLayer::RGBAColor::Create(kLightGray, kLightGray, kLightGray, 255);
|
||||
bottomStripeColors[0] = PortabilityLayer::RGBAColor::Create(kLightGray, kLightGray, kLightGray, 255);
|
||||
bottomStripeColors[1] = PortabilityLayer::RGBAColor::Create(kLightGray, kLightGray, kLightGray, 255);
|
||||
rightStripeColors[0] = PortabilityLayer::RGBAColor::Create(kLightGray, kLightGray, kLightGray, 255);
|
||||
rightStripeColors[1] = PortabilityLayer::RGBAColor::Create(kLightGray, kLightGray, kLightGray, 255);
|
||||
centerColor = PortabilityLayer::RGBAColor::Create(kLightGray, kLightGray, kLightGray, 255);
|
||||
textColor = PortabilityLayer::RGBAColor::Create(kDarkGray, kDarkGray, kDarkGray, 255);
|
||||
borderColor = PortabilityLayer::RGBAColor::Create(kDarkGray, kDarkGray, kDarkGray, 255);
|
||||
topStripeColors[0] = PortabilityLayer::RGBAColor::Create(kButtonLightGray, kButtonLightGray, kButtonLightGray, 255);
|
||||
topStripeColors[1] = PortabilityLayer::RGBAColor::Create(kButtonLightGray, kButtonLightGray, kButtonLightGray, 255);
|
||||
leftStripeColors[0] = PortabilityLayer::RGBAColor::Create(kButtonLightGray, kButtonLightGray, kButtonLightGray, 255);
|
||||
leftStripeColors[1] = PortabilityLayer::RGBAColor::Create(kButtonLightGray, kButtonLightGray, kButtonLightGray, 255);
|
||||
bottomStripeColors[0] = PortabilityLayer::RGBAColor::Create(kButtonLightGray, kButtonLightGray, kButtonLightGray, 255);
|
||||
bottomStripeColors[1] = PortabilityLayer::RGBAColor::Create(kButtonLightGray, kButtonLightGray, kButtonLightGray, 255);
|
||||
rightStripeColors[0] = PortabilityLayer::RGBAColor::Create(kButtonLightGray, kButtonLightGray, kButtonLightGray, 255);
|
||||
rightStripeColors[1] = PortabilityLayer::RGBAColor::Create(kButtonLightGray, kButtonLightGray, kButtonLightGray, 255);
|
||||
centerColor = PortabilityLayer::RGBAColor::Create(kButtonLightGray, kButtonLightGray, kButtonLightGray, 255);
|
||||
textColor = PortabilityLayer::RGBAColor::Create(kButtonDarkGray, kButtonDarkGray, kButtonDarkGray, 255);
|
||||
borderColor = PortabilityLayer::RGBAColor::Create(kButtonDarkGray, kButtonDarkGray, kButtonDarkGray, 255);
|
||||
}
|
||||
else if (inverted || m_haveHighlightOverride)
|
||||
{
|
||||
cornerGraphics = gs_buttonPressedCornerGraphics;
|
||||
topStripeColors[0] = PortabilityLayer::RGBAColor::Create(kDarkGray, kDarkGray, kDarkGray, 255);
|
||||
topStripeColors[1] = PortabilityLayer::RGBAColor::Create(kDarkGray, kDarkGray, kDarkGray, 255);
|
||||
leftStripeColors[0] = PortabilityLayer::RGBAColor::Create(kDarkGray, kDarkGray, kDarkGray, 255);
|
||||
leftStripeColors[1] = PortabilityLayer::RGBAColor::Create(kDarkGray, kDarkGray, kDarkGray, 255);
|
||||
bottomStripeColors[0] = PortabilityLayer::RGBAColor::Create(kDarkGray, kDarkGray, kDarkGray, 255);
|
||||
bottomStripeColors[1] = PortabilityLayer::RGBAColor::Create(kDarkGray, kDarkGray, kDarkGray, 255);
|
||||
rightStripeColors[0] = PortabilityLayer::RGBAColor::Create(kDarkGray, kDarkGray, kDarkGray, 255);
|
||||
rightStripeColors[1] = PortabilityLayer::RGBAColor::Create(kDarkGray, kDarkGray, kDarkGray, 255);
|
||||
centerColor = PortabilityLayer::RGBAColor::Create(kDarkGray, kDarkGray, kDarkGray, 255);
|
||||
topStripeColors[0] = PortabilityLayer::RGBAColor::Create(kButtonDarkGray, kButtonDarkGray, kButtonDarkGray, 255);
|
||||
topStripeColors[1] = PortabilityLayer::RGBAColor::Create(kButtonDarkGray, kButtonDarkGray, kButtonDarkGray, 255);
|
||||
leftStripeColors[0] = PortabilityLayer::RGBAColor::Create(kButtonDarkGray, kButtonDarkGray, kButtonDarkGray, 255);
|
||||
leftStripeColors[1] = PortabilityLayer::RGBAColor::Create(kButtonDarkGray, kButtonDarkGray, kButtonDarkGray, 255);
|
||||
bottomStripeColors[0] = PortabilityLayer::RGBAColor::Create(kButtonDarkGray, kButtonDarkGray, kButtonDarkGray, 255);
|
||||
bottomStripeColors[1] = PortabilityLayer::RGBAColor::Create(kButtonDarkGray, kButtonDarkGray, kButtonDarkGray, 255);
|
||||
rightStripeColors[0] = PortabilityLayer::RGBAColor::Create(kButtonDarkGray, kButtonDarkGray, kButtonDarkGray, 255);
|
||||
rightStripeColors[1] = PortabilityLayer::RGBAColor::Create(kButtonDarkGray, kButtonDarkGray, kButtonDarkGray, 255);
|
||||
centerColor = PortabilityLayer::RGBAColor::Create(kButtonDarkGray, kButtonDarkGray, kButtonDarkGray, 255);
|
||||
textColor = StdColors::White();
|
||||
borderColor = StdColors::Black();
|
||||
}
|
||||
else
|
||||
{
|
||||
cornerGraphics = gs_buttonCornerGraphics;
|
||||
topStripeColors[0] = PortabilityLayer::RGBAColor::Create(kMidGray, kMidGray, kMidGray, 255);
|
||||
topStripeColors[0] = PortabilityLayer::RGBAColor::Create(kButtonMidGray, kButtonMidGray, kButtonMidGray, 255);
|
||||
topStripeColors[1] = StdColors::White();
|
||||
leftStripeColors[0] = PortabilityLayer::RGBAColor::Create(kMidGray, kMidGray, kMidGray, 255);
|
||||
leftStripeColors[0] = PortabilityLayer::RGBAColor::Create(kButtonMidGray, kButtonMidGray, kButtonMidGray, 255);
|
||||
leftStripeColors[1] = StdColors::White();
|
||||
bottomStripeColors[0] = PortabilityLayer::RGBAColor::Create(kDarkGray, kDarkGray, kDarkGray, 255);
|
||||
bottomStripeColors[1] = PortabilityLayer::RGBAColor::Create(kMidGray, kMidGray, kMidGray, 255);
|
||||
rightStripeColors[0] = PortabilityLayer::RGBAColor::Create(kDarkGray, kDarkGray, kDarkGray, 255);
|
||||
rightStripeColors[1] = PortabilityLayer::RGBAColor::Create(kMidGray, kMidGray, kMidGray, 255);
|
||||
centerColor = PortabilityLayer::RGBAColor::Create(kMidGray, kMidGray, kMidGray, 255);
|
||||
bottomStripeColors[0] = PortabilityLayer::RGBAColor::Create(kButtonDarkGray, kButtonDarkGray, kButtonDarkGray, 255);
|
||||
bottomStripeColors[1] = PortabilityLayer::RGBAColor::Create(kButtonMidGray, kButtonMidGray, kButtonMidGray, 255);
|
||||
rightStripeColors[0] = PortabilityLayer::RGBAColor::Create(kButtonDarkGray, kButtonDarkGray, kButtonDarkGray, 255);
|
||||
rightStripeColors[1] = PortabilityLayer::RGBAColor::Create(kButtonMidGray, kButtonMidGray, kButtonMidGray, 255);
|
||||
centerColor = PortabilityLayer::RGBAColor::Create(kButtonMidGray, kButtonMidGray, kButtonMidGray, 255);
|
||||
textColor = StdColors::Black();
|
||||
borderColor = StdColors::Black();
|
||||
}
|
||||
@@ -469,9 +476,9 @@ namespace PortabilityLayer
|
||||
ResolveCachingColor *checkEraseColor = nullptr;
|
||||
ResolveCachingColor *textColor = nullptr;
|
||||
|
||||
ResolveCachingColor midGrayColor = RGBAColor::Create(kMidGray, kMidGray, kMidGray, 255);
|
||||
ResolveCachingColor lightGrayColor = RGBAColor::Create(kLightGray, kLightGray, kLightGray, 255);
|
||||
ResolveCachingColor darkGrayColor = RGBAColor::Create(kDarkGray, kDarkGray, kDarkGray, 255);
|
||||
ResolveCachingColor midGrayColor = RGBAColor::Create(kButtonMidGray, kButtonMidGray, kButtonMidGray, 255);
|
||||
ResolveCachingColor lightGrayColor = RGBAColor::Create(kButtonLightGray, kButtonLightGray, kButtonLightGray, 255);
|
||||
ResolveCachingColor darkGrayColor = RGBAColor::Create(kButtonDarkGray, kButtonDarkGray, kButtonDarkGray, 255);
|
||||
ResolveCachingColor blackColor = StdColors::Black();
|
||||
|
||||
if (!m_enabled)
|
||||
@@ -558,9 +565,9 @@ namespace PortabilityLayer
|
||||
ResolveCachingColor *radioColor = nullptr;
|
||||
ResolveCachingColor *textColor = nullptr;
|
||||
|
||||
ResolveCachingColor midGrayColor = RGBAColor::Create(kMidGray, kMidGray, kMidGray, 255);
|
||||
ResolveCachingColor lightGrayColor = RGBAColor::Create(kLightGray, kLightGray, kLightGray, 255);
|
||||
ResolveCachingColor darkGrayColor = RGBAColor::Create(kDarkGray, kDarkGray, kDarkGray, 255);
|
||||
ResolveCachingColor midGrayColor = RGBAColor::Create(kButtonMidGray, kButtonMidGray, kButtonMidGray, 255);
|
||||
ResolveCachingColor lightGrayColor = RGBAColor::Create(kButtonLightGray, kButtonLightGray, kButtonLightGray, 255);
|
||||
ResolveCachingColor darkGrayColor = RGBAColor::Create(kButtonDarkGray, kButtonDarkGray, kButtonDarkGray, 255);
|
||||
|
||||
if (!m_enabled)
|
||||
{
|
||||
@@ -613,15 +620,15 @@ namespace PortabilityLayer
|
||||
|
||||
RGBAColor upperLeftStripeColors[3] =
|
||||
{
|
||||
RGBAColor::Create(kMidGray, kMidGray, kMidGray, 255),
|
||||
RGBAColor::Create(kButtonMidGray, kButtonMidGray, kButtonMidGray, 255),
|
||||
StdColors::White(),
|
||||
StdColors::Black(),
|
||||
};
|
||||
|
||||
RGBAColor bottomRightStripeColors[3] =
|
||||
{
|
||||
RGBAColor::Create(kMidGray, kMidGray, kMidGray, 255),
|
||||
RGBAColor::Create(kDarkGray, kDarkGray, kDarkGray, 255),
|
||||
RGBAColor::Create(kButtonMidGray, kButtonMidGray, kButtonMidGray, 255),
|
||||
RGBAColor::Create(kButtonDarkGray, kButtonDarkGray, kButtonDarkGray, 255),
|
||||
StdColors::Black(),
|
||||
};
|
||||
|
||||
@@ -653,3 +660,5 @@ namespace PortabilityLayer
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
PL_IMPLEMENT_WIDGET_TYPE(PortabilityLayer::WidgetTypes::kButton, PortabilityLayer::ButtonWidget)
|
||||
|
||||
@@ -5,7 +5,7 @@
|
||||
|
||||
namespace PortabilityLayer
|
||||
{
|
||||
class ButtonWidget final : public WidgetSpec<ButtonWidget>
|
||||
class ButtonWidget final : public WidgetSpec<ButtonWidget, WidgetTypes::kButton>
|
||||
{
|
||||
public:
|
||||
enum ButtonStyle
|
||||
@@ -30,10 +30,10 @@ namespace PortabilityLayer
|
||||
void SetString(const PLPasStr &str) override;
|
||||
PLPasStr GetString() const override;
|
||||
|
||||
WidgetHandleState_t ProcessEvent(void *captureContext, const TimeTaggedVOSEvent &evt) override;
|
||||
WidgetHandleState_t ProcessEvent(void *captureContext, const TimeTaggedVOSEvent &evt) GP_ASYNCIFY_PARANOID_OVERRIDE;
|
||||
void OnEnabledChanged() override;
|
||||
void OnStateChanged() override;
|
||||
int16_t Capture(void *captureContext, const Point &pos, WidgetUpdateCallback_t callback) override;
|
||||
int16_t Capture(void *captureContext, const Point &pos, WidgetUpdateCallback_t callback) GP_ASYNCIFY_PARANOID_OVERRIDE;
|
||||
void SetHighlightStyle(int16_t style, bool enabled) override;
|
||||
|
||||
static void DrawDefaultButtonChrome(const Rect &rect, DrawSurface *surface);
|
||||
|
||||
@@ -89,26 +89,6 @@ void SelectDialogItemText(Dialog *dialog, int item, int firstSelChar, int lastSe
|
||||
widget->SetSelection(firstSelChar, lastSelCharExclusive);
|
||||
}
|
||||
|
||||
ModalFilterUPP NewModalFilterUPP(ModalFilterUPP func)
|
||||
{
|
||||
return func;
|
||||
}
|
||||
|
||||
void ModalDialog(ModalFilterUPP filter, short *item)
|
||||
{
|
||||
PL_NotYetImplemented();
|
||||
}
|
||||
|
||||
void DisposeModalFilterUPP(ModalFilterUPP upp)
|
||||
{
|
||||
PL_NotYetImplemented();
|
||||
}
|
||||
|
||||
void ShowDialogItem(Dialog *dialog, int item)
|
||||
{
|
||||
PL_NotYetImplemented();
|
||||
}
|
||||
|
||||
void HideDialogItem(Dialog *dialog, int item)
|
||||
{
|
||||
PortabilityLayer::Widget *widget = dialog->GetItems()[item - 1].GetWidget();
|
||||
|
||||
@@ -14,7 +14,79 @@ class PLPasStr;
|
||||
struct Control;
|
||||
struct Dialog;
|
||||
|
||||
#if GP_ASYNCIFY_PARANOID
|
||||
namespace DialogFilterFuncs
|
||||
{
|
||||
enum DialogFilterFunc
|
||||
{
|
||||
kBlowerFilter,
|
||||
kFurnitureFilter,
|
||||
kCustPictFilter,
|
||||
kSwitchFilter,
|
||||
kTriggerFilter,
|
||||
kApplianceFilter,
|
||||
kMicrowaveFilter,
|
||||
kGreaseFilter,
|
||||
kInvisBonusFilter,
|
||||
kTransFilter,
|
||||
kEnemyFilter,
|
||||
kFlowerFilter,
|
||||
kLightFilter,
|
||||
kGoToFilter,
|
||||
kRoomFilter,
|
||||
kOriginalArtFilter,
|
||||
|
||||
kAboutFilter,
|
||||
kLicenseReaderFilter,
|
||||
kLoadFilter,
|
||||
kAboutFrameworkFilter,
|
||||
kBrainsFilter,
|
||||
kNameFilter,
|
||||
kBannerFilter,
|
||||
kControlFilter,
|
||||
kSoundFilter,
|
||||
kHouseFilter,
|
||||
kDisplayFilter,
|
||||
kPrefsFilter,
|
||||
|
||||
kFileBrowserUIImpl_PopUpAlertUIFilter,
|
||||
kFileBrowserUIImpl_FileBrowserUIFilter,
|
||||
kDialogManagerImpl_AlertFilter,
|
||||
};
|
||||
|
||||
template<int TFilterFuncID>
|
||||
int16_t InvokeWrapperThunk(void *context, Dialog *dialog, const TimeTaggedVOSEvent *evt);
|
||||
|
||||
template<DialogFilterFunc TFilterFuncID>
|
||||
class InvokeWrapper
|
||||
{
|
||||
public:
|
||||
inline int16_t operator()(void *context, Dialog *dialog, const TimeTaggedVOSEvent *evt) const
|
||||
{
|
||||
return InvokeWrapperThunk<TFilterFuncID>(context, dialog, evt);
|
||||
}
|
||||
};
|
||||
}
|
||||
|
||||
typedef DialogFilterFuncs::DialogFilterFunc DialogFilterFunc_t;
|
||||
|
||||
#define PL_FILTER_FUNC(f) DialogFilterFuncs::k##f, DialogFilterFuncs::InvokeWrapper<DialogFilterFuncs::k##f>()
|
||||
#define PL_IMPLEMENT_FILTER_FUNCTION_THUNK(f, impl) \
|
||||
template<> \
|
||||
int16_t DialogFilterFuncs::InvokeWrapperThunk<DialogFilterFuncs::k##f>(void *context, Dialog *dialog, const TimeTaggedVOSEvent *evt) \
|
||||
{ \
|
||||
return impl(context, dialog, evt); \
|
||||
}
|
||||
|
||||
#define PL_IMPLEMENT_FILTER_FUNCTION(f) PL_IMPLEMENT_FILTER_FUNCTION_THUNK(f, f)
|
||||
|
||||
#else
|
||||
typedef int16_t(*DialogFilterFunc_t)(void *context, Dialog *dialog, const TimeTaggedVOSEvent *evt);
|
||||
#define PL_FILTER_FUNC(f) f
|
||||
#define PL_IMPLEMENT_FILTER_FUNCTION_THUNK(f, impl)
|
||||
#define PL_IMPLEMENT_FILTER_FUNCTION(f)
|
||||
|
||||
#endif
|
||||
|
||||
struct DialogTextSubstitutions
|
||||
{
|
||||
@@ -39,7 +111,12 @@ struct Dialog
|
||||
|
||||
virtual void SetItemVisibility(unsigned int itemIndex, bool isVisible) = 0;
|
||||
|
||||
#if GP_ASYNCIFY_PARANOID
|
||||
template<class TFilterFunc>
|
||||
int16_t ExecuteModal(void *captureContext, DialogFilterFunc_t filterFuncID, const TFilterFunc &filterFunc);
|
||||
#else
|
||||
virtual int16_t ExecuteModal(void *captureContext, DialogFilterFunc_t filterFunc) = 0;
|
||||
#endif
|
||||
|
||||
virtual bool ReplaceWidget(unsigned int itemIndex, PortabilityLayer::Widget *widget) = 0;
|
||||
};
|
||||
@@ -56,7 +133,5 @@ void SetDialogItemText(THandle<Control> handle, const PLPasStr &str);
|
||||
|
||||
void SelectDialogItemText(Dialog *dialog, int item, int firstSelChar, int lastSelCharExclusive);
|
||||
|
||||
void ModalDialog(ModalFilterUPP filter, short *item);
|
||||
|
||||
void ShowDialogItem(Dialog *dialog, int item);
|
||||
void HideDialogItem(Dialog *dialog, int item);
|
||||
|
||||
@@ -26,7 +26,7 @@
|
||||
namespace PortabilityLayer
|
||||
{
|
||||
EditboxWidget::EditboxWidget(const WidgetBasicState &state)
|
||||
: WidgetSpec<EditboxWidget>(state)
|
||||
: WidgetSpec<EditboxWidget, WidgetTypes::kEditbox>(state)
|
||||
, m_capacity(255)
|
||||
, m_length(0)
|
||||
, m_chars(nullptr)
|
||||
@@ -351,6 +351,11 @@ namespace PortabilityLayer
|
||||
return WidgetHandleStates::kIgnored;
|
||||
}
|
||||
|
||||
int16_t EditboxWidget::Capture(void *captureContext, const Point &pos, WidgetUpdateCallback_t callback)
|
||||
{
|
||||
return DefaultCapture(captureContext, pos, callback);
|
||||
}
|
||||
|
||||
Rect EditboxWidget::GetExpandedRect() const
|
||||
{
|
||||
return GetRect().Inset(-3, -3);
|
||||
@@ -1394,4 +1399,7 @@ namespace PortabilityLayer
|
||||
{ 0xf5, EditboxWidget::CharacterCategory_AlphaNumeric },
|
||||
{ 0xff, EditboxWidget::CharacterCategory_Punctuation },
|
||||
};
|
||||
|
||||
}
|
||||
|
||||
PL_IMPLEMENT_WIDGET_TYPE(PortabilityLayer::WidgetTypes::kEditbox, PortabilityLayer::EditboxWidget)
|
||||
|
||||
@@ -8,7 +8,7 @@ struct DrawSurface;
|
||||
|
||||
namespace PortabilityLayer
|
||||
{
|
||||
class EditboxWidget final : public WidgetSpec<EditboxWidget>
|
||||
class EditboxWidget final : public WidgetSpec<EditboxWidget, WidgetTypes::kEditbox>
|
||||
{
|
||||
public:
|
||||
typedef bool (*CharacterFilterCallback_t)(void *context, uint8_t character);
|
||||
@@ -25,7 +25,8 @@ namespace PortabilityLayer
|
||||
void GainFocus() override;
|
||||
void LoseFocus() override;
|
||||
|
||||
WidgetHandleState_t ProcessEvent(void *captureContext, const TimeTaggedVOSEvent &evt) override;
|
||||
WidgetHandleState_t ProcessEvent(void *captureContext, const TimeTaggedVOSEvent &evt) GP_ASYNCIFY_PARANOID_OVERRIDE;
|
||||
int16_t Capture(void *captureContext, const Point &pos, WidgetUpdateCallback_t callback) GP_ASYNCIFY_PARANOID_OVERRIDE;
|
||||
|
||||
Rect GetExpandedRect() const override;
|
||||
|
||||
|
||||
@@ -9,7 +9,7 @@
|
||||
namespace PortabilityLayer
|
||||
{
|
||||
IconWidget::IconWidget(const WidgetBasicState &state)
|
||||
: WidgetSpec<IconWidget>(state)
|
||||
: WidgetSpec<IconWidget, WidgetTypes::kIcon>(state)
|
||||
{
|
||||
}
|
||||
|
||||
@@ -58,4 +58,11 @@ namespace PortabilityLayer
|
||||
else
|
||||
return WidgetHandleStates::kIgnored;
|
||||
}
|
||||
|
||||
int16_t IconWidget::Capture(void *captureContext, const Point &pos, WidgetUpdateCallback_t callback)
|
||||
{
|
||||
return DefaultCapture(captureContext, pos, callback);
|
||||
}
|
||||
}
|
||||
|
||||
PL_IMPLEMENT_WIDGET_TYPE(PortabilityLayer::WidgetTypes::kIcon, PortabilityLayer::IconWidget)
|
||||
|
||||
@@ -7,7 +7,7 @@ namespace PortabilityLayer
|
||||
{
|
||||
class PixMapImpl;
|
||||
|
||||
class IconWidget final : public WidgetSpec<IconWidget>
|
||||
class IconWidget final : public WidgetSpec<IconWidget, WidgetTypes::kIcon>
|
||||
{
|
||||
public:
|
||||
IconWidget(const WidgetBasicState &state);
|
||||
@@ -17,7 +17,8 @@ namespace PortabilityLayer
|
||||
|
||||
void DrawControl(DrawSurface *surface) override;
|
||||
|
||||
WidgetHandleState_t ProcessEvent(void *captureContext, const TimeTaggedVOSEvent &evt) override;
|
||||
WidgetHandleState_t ProcessEvent(void *captureContext, const TimeTaggedVOSEvent &evt) GP_ASYNCIFY_PARANOID_OVERRIDE;
|
||||
int16_t Capture(void *captureContext, const Point &pos, WidgetUpdateCallback_t callback) GP_ASYNCIFY_PARANOID_OVERRIDE;
|
||||
|
||||
private:
|
||||
THandle<PixMapImpl> m_iconImage;
|
||||
|
||||
@@ -5,7 +5,7 @@
|
||||
namespace PortabilityLayer
|
||||
{
|
||||
ImageWidget::ImageWidget(const WidgetBasicState &state)
|
||||
: WidgetSpec<ImageWidget>(state)
|
||||
: WidgetSpec<ImageWidget, WidgetTypes::kImage>(state)
|
||||
{
|
||||
}
|
||||
|
||||
@@ -28,4 +28,16 @@ namespace PortabilityLayer
|
||||
if (m_pict && m_rect.IsValid())
|
||||
surface->DrawPicture(m_pict, m_rect);
|
||||
}
|
||||
|
||||
WidgetHandleState_t ImageWidget::ProcessEvent(void *captureContext, const TimeTaggedVOSEvent &evt)
|
||||
{
|
||||
return DefaultProcessEvent(captureContext, evt);
|
||||
}
|
||||
|
||||
int16_t ImageWidget::Capture(void *captureContext, const Point &pos, WidgetUpdateCallback_t callback)
|
||||
{
|
||||
return DefaultCapture(captureContext, pos, callback);
|
||||
}
|
||||
}
|
||||
|
||||
PL_IMPLEMENT_WIDGET_TYPE(PortabilityLayer::WidgetTypes::kImage, PortabilityLayer::ImageWidget)
|
||||
|
||||
@@ -7,7 +7,7 @@ struct BitmapImage;
|
||||
|
||||
namespace PortabilityLayer
|
||||
{
|
||||
class ImageWidget final : public WidgetSpec<ImageWidget>
|
||||
class ImageWidget final : public WidgetSpec<ImageWidget, WidgetTypes::kImage>
|
||||
{
|
||||
public:
|
||||
ImageWidget(const WidgetBasicState &state);
|
||||
@@ -16,6 +16,9 @@ namespace PortabilityLayer
|
||||
bool Init(const WidgetBasicState &state, const void *additionalData) override;
|
||||
void DrawControl(DrawSurface *surface) override;
|
||||
|
||||
WidgetHandleState_t ProcessEvent(void *captureContext, const TimeTaggedVOSEvent &evt) GP_ASYNCIFY_PARANOID_OVERRIDE;
|
||||
int16_t Capture(void *captureContext, const Point &pos, WidgetUpdateCallback_t callback) GP_ASYNCIFY_PARANOID_OVERRIDE;
|
||||
|
||||
private:
|
||||
THandle<BitmapImage> m_pict;
|
||||
};
|
||||
|
||||
@@ -5,7 +5,7 @@
|
||||
namespace PortabilityLayer
|
||||
{
|
||||
InvisibleWidget::InvisibleWidget(const WidgetBasicState &state)
|
||||
: WidgetSpec<InvisibleWidget>(state)
|
||||
: WidgetSpec<InvisibleWidget, WidgetTypes::kInvisible>(state)
|
||||
, m_clickable(state.m_enabled)
|
||||
{
|
||||
}
|
||||
@@ -31,4 +31,11 @@ namespace PortabilityLayer
|
||||
else
|
||||
return WidgetHandleStates::kIgnored;
|
||||
}
|
||||
|
||||
int16_t InvisibleWidget::Capture(void *captureContext, const Point &pos, WidgetUpdateCallback_t callback)
|
||||
{
|
||||
return DefaultCapture(captureContext, pos, callback);
|
||||
}
|
||||
}
|
||||
|
||||
PL_IMPLEMENT_WIDGET_TYPE(PortabilityLayer::WidgetTypes::kInvisible, PortabilityLayer::InvisibleWidget)
|
||||
|
||||
@@ -4,7 +4,7 @@
|
||||
|
||||
namespace PortabilityLayer
|
||||
{
|
||||
class InvisibleWidget final : public WidgetSpec<InvisibleWidget>
|
||||
class InvisibleWidget final : public WidgetSpec<InvisibleWidget, WidgetTypes::kInvisible>
|
||||
{
|
||||
public:
|
||||
explicit InvisibleWidget(const WidgetBasicState &state);
|
||||
@@ -12,7 +12,8 @@ namespace PortabilityLayer
|
||||
|
||||
bool Init(const WidgetBasicState &state, const void *additionalData) override;
|
||||
|
||||
WidgetHandleState_t ProcessEvent(void *captureContext, const TimeTaggedVOSEvent &evt) override;
|
||||
WidgetHandleState_t ProcessEvent(void *captureContext, const TimeTaggedVOSEvent &evt) GP_ASYNCIFY_PARANOID_OVERRIDE;
|
||||
int16_t Capture(void *captureContext, const Point &pos, WidgetUpdateCallback_t callback) GP_ASYNCIFY_PARANOID_OVERRIDE;
|
||||
|
||||
private:
|
||||
bool m_clickable;
|
||||
|
||||
@@ -11,7 +11,7 @@
|
||||
namespace PortabilityLayer
|
||||
{
|
||||
LabelWidget::LabelWidget(const WidgetBasicState &state)
|
||||
: WidgetSpec<LabelWidget>(state)
|
||||
: WidgetSpec<LabelWidget, WidgetTypes::kLabel>(state)
|
||||
, m_text(state.m_text)
|
||||
{
|
||||
}
|
||||
@@ -46,4 +46,16 @@ namespace PortabilityLayer
|
||||
|
||||
surface->DrawStringWrap(textStartPoint, m_rect, m_text.ToShortStr(), blackColor, sysFont);
|
||||
}
|
||||
|
||||
WidgetHandleState_t LabelWidget::ProcessEvent(void *captureContext, const TimeTaggedVOSEvent &evt)
|
||||
{
|
||||
return DefaultProcessEvent(captureContext, evt);
|
||||
}
|
||||
|
||||
int16_t LabelWidget::Capture(void *captureContext, const Point &pos, WidgetUpdateCallback_t callback)
|
||||
{
|
||||
return DefaultCapture(captureContext, pos, callback);
|
||||
}
|
||||
}
|
||||
|
||||
PL_IMPLEMENT_WIDGET_TYPE(PortabilityLayer::WidgetTypes::kLabel, PortabilityLayer::LabelWidget)
|
||||
|
||||
@@ -5,7 +5,7 @@
|
||||
|
||||
namespace PortabilityLayer
|
||||
{
|
||||
class LabelWidget final : public WidgetSpec<LabelWidget>
|
||||
class LabelWidget final : public WidgetSpec<LabelWidget, WidgetTypes::kLabel>
|
||||
{
|
||||
public:
|
||||
LabelWidget(const WidgetBasicState &state);
|
||||
@@ -17,6 +17,9 @@ namespace PortabilityLayer
|
||||
|
||||
void DrawControl(DrawSurface *surface) override;
|
||||
|
||||
WidgetHandleState_t ProcessEvent(void *captureContext, const TimeTaggedVOSEvent &evt) GP_ASYNCIFY_PARANOID_OVERRIDE;
|
||||
int16_t Capture(void *captureContext, const Point &pos, WidgetUpdateCallback_t callback) GP_ASYNCIFY_PARANOID_OVERRIDE;
|
||||
|
||||
private:
|
||||
PascalStr<255> m_text;
|
||||
};
|
||||
|
||||
@@ -12,15 +12,15 @@
|
||||
#include "FontFamily.h"
|
||||
#include "Vec2i.h"
|
||||
|
||||
static const int kLightGray = 238;
|
||||
static const int kMidGray = 221;
|
||||
static const int kMidDarkGray = 170;
|
||||
static const int kDarkGray = 102;
|
||||
static const int kPopupMenuLightGray = 238;
|
||||
static const int kPopupMenuMidGray = 221;
|
||||
static const int kPopupMenuMidDarkGray = 170;
|
||||
static const int kPopupMenuDarkGray = 102;
|
||||
|
||||
namespace PortabilityLayer
|
||||
{
|
||||
PopupMenuWidget::PopupMenuWidget(const WidgetBasicState &state)
|
||||
: WidgetSpec<PopupMenuWidget>(state)
|
||||
: WidgetSpec<PopupMenuWidget, WidgetTypes::kPopupMenu>(state)
|
||||
{
|
||||
}
|
||||
|
||||
@@ -82,8 +82,8 @@ namespace PortabilityLayer
|
||||
|
||||
PortabilityLayer::ResolveCachingColor whiteColor = StdColors::White();
|
||||
PortabilityLayer::ResolveCachingColor blackColor = StdColors::Black();
|
||||
PortabilityLayer::ResolveCachingColor midGrayColor = RGBAColor::Create(kMidGray, kMidGray, kMidGray, 255);
|
||||
PortabilityLayer::ResolveCachingColor darkGrayColor = RGBAColor::Create(kDarkGray, kDarkGray, kDarkGray, 255);
|
||||
PortabilityLayer::ResolveCachingColor midGrayColor = RGBAColor::Create(kPopupMenuMidGray, kPopupMenuMidGray, kPopupMenuMidGray, 255);
|
||||
PortabilityLayer::ResolveCachingColor darkGrayColor = RGBAColor::Create(kPopupMenuDarkGray, kPopupMenuDarkGray, kPopupMenuDarkGray, 255);
|
||||
|
||||
const Rect rect = m_rect;
|
||||
const Rect innerRect = rect.Inset(2, 2);
|
||||
@@ -144,3 +144,5 @@ namespace PortabilityLayer
|
||||
return m_menu;
|
||||
}
|
||||
}
|
||||
|
||||
PL_IMPLEMENT_WIDGET_TYPE(PortabilityLayer::WidgetTypes::kPopupMenu, PortabilityLayer::PopupMenuWidget)
|
||||
|
||||
@@ -7,15 +7,15 @@ struct Menu;
|
||||
|
||||
namespace PortabilityLayer
|
||||
{
|
||||
class PopupMenuWidget final : public WidgetSpec<PopupMenuWidget>
|
||||
class PopupMenuWidget final : public WidgetSpec<PopupMenuWidget, WidgetTypes::kPopupMenu>
|
||||
{
|
||||
public:
|
||||
explicit PopupMenuWidget(const WidgetBasicState &state);
|
||||
|
||||
bool Init(const WidgetBasicState &state, const void *additionalData) override;
|
||||
|
||||
WidgetHandleState_t ProcessEvent(void *captureContext, const TimeTaggedVOSEvent &evt) override;
|
||||
int16_t Capture(void *captureContext, const Point &pos, WidgetUpdateCallback_t callback) override;
|
||||
WidgetHandleState_t ProcessEvent(void *captureContext, const TimeTaggedVOSEvent &evt) GP_ASYNCIFY_PARANOID_OVERRIDE;
|
||||
int16_t Capture(void *captureContext, const Point &pos, WidgetUpdateCallback_t callback) GP_ASYNCIFY_PARANOID_OVERRIDE;
|
||||
void DrawControl(DrawSurface *surface) override;
|
||||
|
||||
void OnStateChanged() override;
|
||||
|
||||
@@ -184,9 +184,12 @@ namespace PortabilityLayer
|
||||
GpIOStream *fStream = nullptr;
|
||||
ZipFileProxy *proxy = nullptr;
|
||||
bool proxyIsShared = false;
|
||||
|
||||
fprintf(stderr, "Trying to open resource file\n");
|
||||
if (file->OpenResources(fStream, proxy, proxyIsShared) != PLErrors::kNone)
|
||||
return nullptr;
|
||||
|
||||
fprintf(stderr, "Creating resource archive\n");
|
||||
IResourceArchive *archive = ResourceArchiveZipFile::Create(proxy, proxyIsShared, fStream);
|
||||
if (!archive)
|
||||
{
|
||||
|
||||
@@ -9,7 +9,7 @@
|
||||
namespace PortabilityLayer
|
||||
{
|
||||
ScrollBarWidget::ScrollBarWidget(const WidgetBasicState &state)
|
||||
: WidgetSpec<ScrollBarWidget>(state)
|
||||
: WidgetSpec<ScrollBarWidget, WidgetTypes::kScrollBar>(state)
|
||||
, m_min(0)
|
||||
, m_max(0)
|
||||
, m_gripSize(0)
|
||||
@@ -260,11 +260,11 @@ namespace PortabilityLayer
|
||||
void ScrollBarWidget::SetState(int16_t state)
|
||||
{
|
||||
if (state < m_min)
|
||||
WidgetSpec<ScrollBarWidget>::SetState(m_min);
|
||||
WidgetSpec<ScrollBarWidget, WidgetTypes::kScrollBar>::SetState(m_min);
|
||||
else if (state > m_max)
|
||||
WidgetSpec<ScrollBarWidget>::SetState(m_max);
|
||||
WidgetSpec<ScrollBarWidget, WidgetTypes::kScrollBar>::SetState(m_max);
|
||||
else
|
||||
WidgetSpec<ScrollBarWidget>::SetState(state);
|
||||
WidgetSpec<ScrollBarWidget, WidgetTypes::kScrollBar>::SetState(state);
|
||||
}
|
||||
|
||||
void ScrollBarWidget::OnStateChanged()
|
||||
@@ -486,3 +486,5 @@ namespace PortabilityLayer
|
||||
return kControlDownButtonPart;
|
||||
}
|
||||
}
|
||||
|
||||
PL_IMPLEMENT_WIDGET_TYPE(PortabilityLayer::WidgetTypes::kScrollBar, PortabilityLayer::ScrollBarWidget)
|
||||
|
||||
@@ -7,7 +7,7 @@ struct Rect;
|
||||
|
||||
namespace PortabilityLayer
|
||||
{
|
||||
class ScrollBarWidget final : public WidgetSpec<ScrollBarWidget>
|
||||
class ScrollBarWidget final : public WidgetSpec<ScrollBarWidget, WidgetTypes::kScrollBar>
|
||||
{
|
||||
public:
|
||||
explicit ScrollBarWidget(const WidgetBasicState &state);
|
||||
@@ -15,7 +15,7 @@ namespace PortabilityLayer
|
||||
bool Init(const WidgetBasicState &state, const void *additionalData) override;
|
||||
|
||||
void OnEnabledChanged() override;
|
||||
WidgetHandleState_t ProcessEvent(void *captureContext, const TimeTaggedVOSEvent &evt) override;
|
||||
WidgetHandleState_t ProcessEvent(void *captureContext, const TimeTaggedVOSEvent &evt) GP_ASYNCIFY_PARANOID_OVERRIDE;
|
||||
void DrawControl(DrawSurface *surface) override;
|
||||
|
||||
void SetState(int16_t state) override;
|
||||
@@ -24,7 +24,7 @@ namespace PortabilityLayer
|
||||
void SetMin(int32_t v) override;
|
||||
void SetMax(int32_t v) override;
|
||||
|
||||
int16_t Capture(void *captureContext, const Point &pos, WidgetUpdateCallback_t callback) override;
|
||||
int16_t Capture(void *captureContext, const Point &pos, WidgetUpdateCallback_t callback) GP_ASYNCIFY_PARANOID_OVERRIDE;
|
||||
|
||||
int ResolvePart(const Point &point) const override;
|
||||
|
||||
|
||||
@@ -15,6 +15,7 @@
|
||||
#include "MacRomanConversion.h"
|
||||
|
||||
#include "PLDrivers.h"
|
||||
#include "CoreDefs.h"
|
||||
|
||||
#include <assert.h>
|
||||
#include <setjmp.h>
|
||||
@@ -173,10 +174,35 @@ static void ImportVOSEvents(uint32_t timestamp)
|
||||
|
||||
namespace PLSysCalls
|
||||
{
|
||||
// Asyncify disarm checks are for manually checking that a stack has no indirect calls.
|
||||
// They should not be nested!
|
||||
#if GP_DEBUG_CONFIG && GP_ASYNCIFY_PARANOID
|
||||
static bool g_asyncifyParanoidDisarmed = false;
|
||||
|
||||
void AsyncifyParanoidSetDisarmed(bool state)
|
||||
{
|
||||
assert(g_asyncifyParanoidDisarmed != state);
|
||||
g_asyncifyParanoidDisarmed = state;
|
||||
}
|
||||
|
||||
AsyncifyDisarmScope::AsyncifyDisarmScope()
|
||||
{
|
||||
AsyncifyParanoidSetDisarmed(true);
|
||||
}
|
||||
|
||||
AsyncifyDisarmScope::~AsyncifyDisarmScope()
|
||||
{
|
||||
AsyncifyParanoidSetDisarmed(false);
|
||||
}
|
||||
#endif
|
||||
|
||||
void Sleep(uint32_t ticks)
|
||||
{
|
||||
#if GP_DEBUG_CONFIG && GP_ASYNCIFY_PARANOID
|
||||
assert(g_asyncifyParanoidDisarmed);
|
||||
#endif
|
||||
if (ticks > 0)
|
||||
{
|
||||
{
|
||||
PortabilityLayer::RenderFrames(ticks);
|
||||
|
||||
ImportVOSEvents(PortabilityLayer::DisplayDeviceManager::GetInstance()->GetTickCount());
|
||||
@@ -190,8 +216,12 @@ namespace PLSysCalls
|
||||
|
||||
void Exit(int exitCode)
|
||||
{
|
||||
#if GP_ASYNCIFY_PARANOID
|
||||
exit(exitCode);
|
||||
#else
|
||||
gs_exitCode = exitCode;
|
||||
longjmp(gs_mainExitWrapper, 1);
|
||||
#endif
|
||||
}
|
||||
|
||||
int MainExitWrapper(int (*mainFunc)())
|
||||
|
||||
@@ -1,5 +1,6 @@
|
||||
#pragma once
|
||||
|
||||
#include "CoreDefs.h"
|
||||
#include "VirtualDirectory.h"
|
||||
|
||||
#include <stdint.h>
|
||||
@@ -9,5 +10,18 @@ namespace PLSysCalls
|
||||
void Sleep(uint32_t ticks);
|
||||
void Exit(int exitCode);
|
||||
|
||||
#if GP_DEBUG_CONFIG && GP_ASYNCIFY_PARANOID
|
||||
class AsyncifyDisarmScope
|
||||
{
|
||||
public:
|
||||
AsyncifyDisarmScope();
|
||||
~AsyncifyDisarmScope();
|
||||
};
|
||||
|
||||
#define PL_ASYNCIFY_PARANOID_DISARM_FOR_SCOPE() PLSysCalls::AsyncifyDisarmScope disarmScope
|
||||
#else
|
||||
#define PL_ASYNCIFY_PARANOID_DISARM_FOR_SCOPE()
|
||||
#endif
|
||||
|
||||
int MainExitWrapper(int (*mainFunc)());
|
||||
}
|
||||
|
||||
@@ -17,14 +17,14 @@ namespace PortabilityLayer
|
||||
{
|
||||
}
|
||||
|
||||
WidgetHandleState_t Widget::ProcessEvent(void *captureContext, const TimeTaggedVOSEvent &evt)
|
||||
WidgetHandleState_t Widget::DefaultProcessEvent(void *captureContext, const TimeTaggedVOSEvent &evt)
|
||||
{
|
||||
(void)evt;
|
||||
|
||||
return WidgetHandleStates::kIgnored;
|
||||
}
|
||||
|
||||
int16_t Widget::Capture(void *captureContext, const Point &pos, WidgetUpdateCallback_t callback)
|
||||
int16_t Widget::DefaultCapture(void *captureContext, const Point &pos, WidgetUpdateCallback_t callback)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
@@ -34,6 +34,68 @@ namespace PortabilityLayer
|
||||
(void)surface;
|
||||
}
|
||||
|
||||
#if GP_ASYNCIFY_PARANOID
|
||||
WidgetHandleState_t Widget::ProcessEvent(void *captureContext, const TimeTaggedVOSEvent &evt)
|
||||
{
|
||||
switch (this->GetWidgetType())
|
||||
{
|
||||
case WidgetTypes::kButton:
|
||||
return DispatchDynProcessEvent<WidgetTypes::kButton>(this, captureContext, evt);
|
||||
case WidgetTypes::kPopupMenu:
|
||||
return DispatchDynProcessEvent<WidgetTypes::kPopupMenu>(this, captureContext, evt);
|
||||
case WidgetTypes::kEditbox:
|
||||
return DispatchDynProcessEvent<WidgetTypes::kEditbox>(this, captureContext, evt);
|
||||
case WidgetTypes::kIcon:
|
||||
return DispatchDynProcessEvent<WidgetTypes::kIcon>(this, captureContext, evt);
|
||||
case WidgetTypes::kImage:
|
||||
return DispatchDynProcessEvent<WidgetTypes::kImage>(this, captureContext, evt);
|
||||
case WidgetTypes::kInvisible:
|
||||
return DispatchDynProcessEvent<WidgetTypes::kInvisible>(this, captureContext, evt);
|
||||
case WidgetTypes::kLabel:
|
||||
return DispatchDynProcessEvent<WidgetTypes::kLabel>(this, captureContext, evt);
|
||||
case WidgetTypes::kScrollBar:
|
||||
return DispatchDynProcessEvent<WidgetTypes::kScrollBar>(this, captureContext, evt);
|
||||
default:
|
||||
return WidgetHandleStates::kIgnored;
|
||||
}
|
||||
}
|
||||
|
||||
int16_t Widget::Capture(void *captureContext, const Point &pos, WidgetUpdateCallback_t callback)
|
||||
{
|
||||
switch (this->GetWidgetType())
|
||||
{
|
||||
case WidgetTypes::kButton:
|
||||
return DispatchDynCapture<WidgetTypes::kButton>(this, captureContext, pos, callback);
|
||||
case WidgetTypes::kPopupMenu:
|
||||
return DispatchDynCapture<WidgetTypes::kPopupMenu>(this, captureContext, pos, callback);
|
||||
case WidgetTypes::kEditbox:
|
||||
return DispatchDynCapture<WidgetTypes::kEditbox>(this, captureContext, pos, callback);
|
||||
case WidgetTypes::kIcon:
|
||||
return DispatchDynCapture<WidgetTypes::kIcon>(this, captureContext, pos, callback);
|
||||
case WidgetTypes::kImage:
|
||||
return DispatchDynCapture<WidgetTypes::kImage>(this, captureContext, pos, callback);
|
||||
case WidgetTypes::kInvisible:
|
||||
return DispatchDynCapture<WidgetTypes::kInvisible>(this, captureContext, pos, callback);
|
||||
case WidgetTypes::kLabel:
|
||||
return DispatchDynCapture<WidgetTypes::kLabel>(this, captureContext, pos, callback);
|
||||
case WidgetTypes::kScrollBar:
|
||||
return DispatchDynCapture<WidgetTypes::kScrollBar>(this, captureContext, pos, callback);
|
||||
default:
|
||||
return -1;
|
||||
}
|
||||
}
|
||||
#else
|
||||
WidgetHandleState_t Widget::ProcessEvent(void *captureContext, const TimeTaggedVOSEvent &evt)
|
||||
{
|
||||
return this->DefaultProcessEvent(captureContext, evt);
|
||||
}
|
||||
|
||||
int16_t Widget::Capture(void *captureContext, const Point &pos, WidgetUpdateCallback_t callback)
|
||||
{
|
||||
return this->DefaultCapture(captureContext, pos, callback);
|
||||
}
|
||||
#endif
|
||||
|
||||
void Widget::SetMin(int32_t v)
|
||||
{
|
||||
}
|
||||
|
||||
@@ -25,7 +25,47 @@ namespace PortabilityLayer
|
||||
|
||||
typedef WidgetHandleStates::WidgetHandleState WidgetHandleState_t;
|
||||
|
||||
typedef void (*WidgetUpdateCallback_t)(void *captureContext, Widget *control, int part);
|
||||
namespace WidgetTypes
|
||||
{
|
||||
enum WidgetType
|
||||
{
|
||||
kButton,
|
||||
kPopupMenu,
|
||||
kEditbox,
|
||||
kIcon,
|
||||
kImage,
|
||||
kInvisible,
|
||||
kLabel,
|
||||
kScrollBar,
|
||||
};
|
||||
}
|
||||
|
||||
typedef WidgetTypes::WidgetType WidgetType_t;
|
||||
|
||||
typedef void(*WidgetUpdateCallback_t)(void *captureContext, Widget *control, int part);
|
||||
|
||||
#if GP_ASYNCIFY_PARANOID
|
||||
template<WidgetType_t TWidgetType>
|
||||
WidgetHandleState_t DispatchDynProcessEvent(Widget *widget, void *captureContext, const TimeTaggedVOSEvent &evt);
|
||||
|
||||
template<WidgetType_t TWidgetType>
|
||||
int16_t DispatchDynCapture(Widget *widget, void *captureContext, const Point &pos, WidgetUpdateCallback_t callback);
|
||||
|
||||
#define PL_IMPLEMENT_WIDGET_TYPE(typeID, type) \
|
||||
template<> \
|
||||
PortabilityLayer::WidgetHandleState_t PortabilityLayer::DispatchDynProcessEvent<typeID>(Widget *widget, void *captureContext, const TimeTaggedVOSEvent &evt) \
|
||||
{ \
|
||||
return static_cast<type*>(widget)->ProcessEvent(captureContext, evt); \
|
||||
} \
|
||||
template<> \
|
||||
int16_t PortabilityLayer::DispatchDynCapture<typeID>(Widget *widget, void *captureContext, const Point &pos, WidgetUpdateCallback_t callback) \
|
||||
{ \
|
||||
return static_cast<type*>(widget)->Capture(captureContext, pos, callback); \
|
||||
}
|
||||
|
||||
#else
|
||||
#define PL_IMPLEMENT_WIDGET_TYPE(typeID, type)
|
||||
#endif
|
||||
|
||||
struct WidgetBasicState
|
||||
{
|
||||
@@ -48,9 +88,12 @@ namespace PortabilityLayer
|
||||
{
|
||||
public:
|
||||
virtual bool Init(const WidgetBasicState &state, const void *additionalData) = 0;
|
||||
virtual WidgetType_t GetWidgetType() const = 0;
|
||||
|
||||
GP_ASYNCIFY_PARANOID_VIRTUAL WidgetHandleState_t ProcessEvent(void *captureContext, const TimeTaggedVOSEvent &evt) GP_ASYNCIFY_PARANOID_PURE;
|
||||
GP_ASYNCIFY_PARANOID_VIRTUAL int16_t Capture(void *captureContext, const Point &pos, WidgetUpdateCallback_t callback) GP_ASYNCIFY_PARANOID_PURE;
|
||||
|
||||
virtual void Destroy() = 0;
|
||||
virtual WidgetHandleState_t ProcessEvent(void *captureContext, const TimeTaggedVOSEvent &evt);
|
||||
virtual int16_t Capture(void *captureContext, const Point &pos, WidgetUpdateCallback_t callback);
|
||||
virtual void DrawControl(DrawSurface *surface);
|
||||
|
||||
virtual void SetMin(int32_t v);
|
||||
@@ -100,6 +143,9 @@ namespace PortabilityLayer
|
||||
static void BaseRelease(void *storage);
|
||||
static void *BaseAlloc(size_t sz);
|
||||
|
||||
WidgetHandleState_t DefaultProcessEvent(void *captureContext, const TimeTaggedVOSEvent &evt);
|
||||
int16_t DefaultCapture(void *captureContext, const Point &pos, WidgetUpdateCallback_t callback);
|
||||
|
||||
Window *m_window;
|
||||
Rect m_rect;
|
||||
uint32_t m_referenceConstant;
|
||||
@@ -115,7 +161,7 @@ namespace PortabilityLayer
|
||||
|
||||
namespace PortabilityLayer
|
||||
{
|
||||
template<class T>
|
||||
template<class T, WidgetType_t TWidgetType>
|
||||
class WidgetSpec : public Widget
|
||||
{
|
||||
public:
|
||||
@@ -130,6 +176,11 @@ namespace PortabilityLayer
|
||||
Widget::BaseRelease(static_cast<T*>(this));
|
||||
}
|
||||
|
||||
WidgetType_t GetWidgetType() const override
|
||||
{
|
||||
return TWidgetType;
|
||||
}
|
||||
|
||||
static T *Create(const WidgetBasicState &state, const void *additionalData)
|
||||
{
|
||||
void *storage = Widget::BaseAlloc(sizeof(T));
|
||||
@@ -139,7 +190,7 @@ namespace PortabilityLayer
|
||||
T *widgetT = new (storage) T(state);
|
||||
|
||||
// Conversion check
|
||||
WidgetSpec<T> *downcastWidget = widgetT;
|
||||
WidgetSpec<T, TWidgetType> *downcastWidget = widgetT;
|
||||
(void)downcastWidget;
|
||||
|
||||
Widget *widget = widgetT;
|
||||
|
||||
86
PortabilityLayer/PortabilityLayer_Combined.cpp
Normal file
86
PortabilityLayer/PortabilityLayer_Combined.cpp
Normal file
@@ -0,0 +1,86 @@
|
||||
#include "AntiAliasTable.cpp"
|
||||
#include "AppEventHandler.cpp"
|
||||
#include "BinHex4.cpp"
|
||||
#include "BitmapImage.cpp"
|
||||
#include "ByteSwap.cpp"
|
||||
#include "CFileStream.cpp"
|
||||
#include "DeflateCodec.cpp"
|
||||
#include "DialogManager.cpp"
|
||||
#include "DisplayDeviceManager.cpp"
|
||||
#include "EllipsePlotter.cpp"
|
||||
#include "FileBrowserUI.cpp"
|
||||
#include "FileManager.cpp"
|
||||
#include "FileSectionStream.cpp"
|
||||
#include "FontFamily.cpp"
|
||||
#include "FontManager.cpp"
|
||||
#include "FontRenderer.cpp"
|
||||
#include "GPArchive.cpp"
|
||||
#include "HostSuspendHook.cpp"
|
||||
#include "IconLoader.cpp"
|
||||
#include "InflateStream.cpp"
|
||||
#include "InputManager.cpp"
|
||||
#include "LinePlotter.cpp"
|
||||
#include "MacBinary2.cpp"
|
||||
#include "MacFileInfo.cpp"
|
||||
#include "MacFileMem.cpp"
|
||||
#include "MemoryManager.cpp"
|
||||
#include "MemReaderStream.cpp"
|
||||
#include "MenuManager.cpp"
|
||||
#include "MMBlock.cpp"
|
||||
#include "MMHandleBlock.cpp"
|
||||
#include "PLApplication.cpp"
|
||||
#include "PLButtonWidget.cpp"
|
||||
#include "PLControlDefinitions.cpp"
|
||||
#include "PLCore.cpp"
|
||||
#include "PLCTabReducer.cpp"
|
||||
#include "PLDialogs.cpp"
|
||||
#include "PLDrivers.cpp"
|
||||
#include "PLEditboxWidget.cpp"
|
||||
#include "PLEventQueue.cpp"
|
||||
#include "PLHacks.cpp"
|
||||
#include "PLHandle.cpp"
|
||||
#include "PLIconWidget.cpp"
|
||||
#include "PLImageWidget.cpp"
|
||||
#include "PLInvisibleWidget.cpp"
|
||||
#include "PLKeyEncoding.cpp"
|
||||
#include "PLLabelWidget.cpp"
|
||||
#include "PLMenus.cpp"
|
||||
#include "PLMovies.cpp"
|
||||
#include "PLNumberFormatting.cpp"
|
||||
#include "PLPopupMenuWidget.cpp"
|
||||
#include "PLQDOffscreen.cpp"
|
||||
#include "PLQDraw.cpp"
|
||||
#include "PLResourceManager.cpp"
|
||||
#include "PLResources.cpp"
|
||||
#include "PLScrollBarWidget.cpp"
|
||||
#include "PLSound.cpp"
|
||||
#include "PLStandardColors.cpp"
|
||||
#include "PLStringCompare.cpp"
|
||||
#include "PLSysCalls.cpp"
|
||||
#include "PLTimeTaggedVOSEvent.cpp"
|
||||
#include "PLWidgets.cpp"
|
||||
#include "QDGraf.cpp"
|
||||
#include "QDManager.cpp"
|
||||
#include "QDPictDecoder.cpp"
|
||||
#include "QDPictEmitContext.cpp"
|
||||
#include "QDPictHeader.cpp"
|
||||
#include "QDPixMap.cpp"
|
||||
#include "QDPort.cpp"
|
||||
#include "QDStandardPalette.cpp"
|
||||
#include "RandomNumberGenerator.cpp"
|
||||
#include "ResolveCachingColor.cpp"
|
||||
#include "ResourceCompiledRef.cpp"
|
||||
#include "ResourceFile.cpp"
|
||||
#include "ScanlineMask.cpp"
|
||||
#include "ScanlineMaskBuilder.cpp"
|
||||
#include "ScanlineMaskConverter.cpp"
|
||||
#include "ScanlineMaskIterator.cpp"
|
||||
#include "SimpleGraphic.cpp"
|
||||
#include "TextPlacer.cpp"
|
||||
#include "UTF8.cpp"
|
||||
#include "UTF16.cpp"
|
||||
#include "WindowDef.cpp"
|
||||
#include "WindowManager.cpp"
|
||||
#include "WorkerThread.cpp"
|
||||
#include "XModemCRC.cpp"
|
||||
#include "ZipFileProxy.cpp"
|
||||
@@ -188,8 +188,8 @@ namespace PortabilityLayer
|
||||
bool GetWindowChromeInteractionZone(Window *window, const Vec2i &point, RegionID_t &outRegion) const override;
|
||||
void SwapExclusiveWindow(Window *& windowRef) override;
|
||||
|
||||
void FlickerWindowIn(Window *window, int32_t velocity) override;
|
||||
void FlickerWindowOut(Window *window, int32_t velocity) override;
|
||||
void FlickerWindowIn(Window *window, int32_t velocity) GP_ASYNCIFY_PARANOID_OVERRIDE;
|
||||
void FlickerWindowOut(Window *window, int32_t velocity) GP_ASYNCIFY_PARANOID_OVERRIDE;
|
||||
|
||||
void SetWindowDesaturation(Window *window, float desaturationLevel) override;
|
||||
|
||||
@@ -1324,6 +1324,7 @@ namespace PortabilityLayer
|
||||
|
||||
void WindowManagerImpl::FlickerWindowIn(Window *window, int32_t velocity)
|
||||
{
|
||||
PL_ASYNCIFY_PARANOID_DISARM_FOR_SCOPE();
|
||||
m_flickerWindow = static_cast<WindowImpl*>(window);
|
||||
|
||||
int32_t chromeLead = 64;
|
||||
@@ -1353,6 +1354,7 @@ namespace PortabilityLayer
|
||||
|
||||
void WindowManagerImpl::FlickerWindowOut(Window *window, int32_t velocity)
|
||||
{
|
||||
PL_ASYNCIFY_PARANOID_DISARM_FOR_SCOPE();
|
||||
m_flickerWindow = static_cast<WindowImpl*>(window);
|
||||
|
||||
int32_t chromeLead = 64;
|
||||
@@ -1689,4 +1691,16 @@ namespace PortabilityLayer
|
||||
{
|
||||
return WindowManagerImpl::GetInstance();
|
||||
}
|
||||
|
||||
#if GP_ASYNCIFY_PARANOID
|
||||
void WindowManager::FlickerWindowIn(Window *window, int32_t velocity)
|
||||
{
|
||||
static_cast<WindowManagerImpl*>(this)->FlickerWindowIn(window, velocity);
|
||||
}
|
||||
|
||||
void WindowManager::FlickerWindowOut(Window *window, int32_t velocity)
|
||||
{
|
||||
static_cast<WindowManagerImpl*>(this)->FlickerWindowOut(window, velocity);
|
||||
}
|
||||
#endif
|
||||
}
|
||||
|
||||
@@ -3,6 +3,7 @@
|
||||
#include <stdint.h>
|
||||
|
||||
#include "PLRegions.h"
|
||||
#include "PLSysCalls.h"
|
||||
|
||||
struct Window;
|
||||
struct DrawSurface;
|
||||
@@ -39,8 +40,8 @@ namespace PortabilityLayer
|
||||
virtual bool GetWindowChromeInteractionZone(Window *window, const Vec2i &point, RegionID_t &outRegion) const = 0;
|
||||
virtual void SwapExclusiveWindow(Window *& windowRef) = 0;
|
||||
|
||||
virtual void FlickerWindowIn(Window *window, int32_t velocity) = 0;
|
||||
virtual void FlickerWindowOut(Window *window, int32_t velocity) = 0;
|
||||
GP_ASYNCIFY_PARANOID_VIRTUAL void FlickerWindowIn(Window *window, int32_t velocity) GP_ASYNCIFY_PARANOID_PURE;
|
||||
GP_ASYNCIFY_PARANOID_VIRTUAL void FlickerWindowOut(Window *window, int32_t velocity) GP_ASYNCIFY_PARANOID_PURE;
|
||||
|
||||
virtual void SetWindowDesaturation(Window *window, float desaturationLevel) = 0;
|
||||
|
||||
|
||||
@@ -285,17 +285,29 @@ namespace PortabilityLayer
|
||||
MemoryManager *mm = MemoryManager::GetInstance();
|
||||
|
||||
if (!stream->SeekEnd(sizeof(ZipEndOfCentralDirectoryRecord)))
|
||||
{
|
||||
fprintf(stderr, "Seek end failed\n");
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
ZipEndOfCentralDirectoryRecord eocd;
|
||||
if (stream->Read(&eocd, sizeof(eocd)) != sizeof(eocd))
|
||||
{
|
||||
fprintf(stderr, "EOCD read failed\n");
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
if (eocd.m_signature != ZipEndOfCentralDirectoryRecord::kSignature)
|
||||
{
|
||||
fprintf(stderr, "EOCD sig check failed\n");
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
if (!stream->SeekStart(eocd.m_centralDirStartOffset))
|
||||
{
|
||||
fprintf(stderr, "CDir seek failed\n");
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
const size_t centralDirSize = eocd.m_centralDirectorySizeBytes;
|
||||
void *centralDirImage = nullptr;
|
||||
@@ -318,6 +330,8 @@ namespace PortabilityLayer
|
||||
|
||||
if (stream->Read(centralDirImage, centralDirSize) != centralDirSize)
|
||||
{
|
||||
fprintf(stderr, "CDir image read failed\n");
|
||||
|
||||
mm->Release(centralDirFiles);
|
||||
mm->Release(centralDirImage);
|
||||
return nullptr;
|
||||
@@ -334,6 +348,8 @@ namespace PortabilityLayer
|
||||
{
|
||||
if (centralDirEnd - centralDirCursor < sizeof(ZipCentralDirectoryFileHeader))
|
||||
{
|
||||
fprintf(stderr, "CDir read failed point 1\n");
|
||||
|
||||
failed = true;
|
||||
break;
|
||||
}
|
||||
@@ -345,18 +361,24 @@ namespace PortabilityLayer
|
||||
|
||||
if (centralDirHeader.m_signature != ZipCentralDirectoryFileHeader::kSignature)
|
||||
{
|
||||
fprintf(stderr, "CDir read failed point 2\n");
|
||||
|
||||
failed = true;
|
||||
break;
|
||||
}
|
||||
|
||||
if (centralDirEnd - centralDirCursor < centralDirHeader.m_fileNameLength)
|
||||
{
|
||||
fprintf(stderr, "CDir read failed point 3\n");
|
||||
|
||||
failed = true;
|
||||
break;
|
||||
}
|
||||
|
||||
if (!CheckAndFixFileName(centralDirCursor, centralDirHeader.m_fileNameLength))
|
||||
{
|
||||
fprintf(stderr, "CDir read failed point 4\n");
|
||||
|
||||
failed = true;
|
||||
break;
|
||||
}
|
||||
@@ -365,6 +387,8 @@ namespace PortabilityLayer
|
||||
|
||||
if (centralDirEnd - centralDirCursor < centralDirHeader.m_extraFieldLength)
|
||||
{
|
||||
fprintf(stderr, "CDir read failed point 5\n");
|
||||
|
||||
failed = true;
|
||||
break;
|
||||
}
|
||||
@@ -373,6 +397,8 @@ namespace PortabilityLayer
|
||||
|
||||
if (centralDirEnd - centralDirCursor < centralDirHeader.m_commentLength)
|
||||
{
|
||||
fprintf(stderr, "CDir read failed point 6\n");
|
||||
|
||||
failed = true;
|
||||
break;
|
||||
}
|
||||
@@ -396,6 +422,8 @@ namespace PortabilityLayer
|
||||
{
|
||||
if (ZipDirectorySortPredicate(centralDirFiles + (i - 1), centralDirFiles + i) == 0)
|
||||
{
|
||||
fprintf(stderr, "File names were duplicated\n");
|
||||
|
||||
// Duplicate file names
|
||||
mm->Release(centralDirFiles);
|
||||
mm->Release(centralDirImage);
|
||||
|
||||
Reference in New Issue
Block a user