Skip to content

Commit

Permalink
Added a Doomsday Script binding for DisplayMode_OriginalMode()
Browse files Browse the repository at this point in the history
The native script module DisplayMode now has one function
"originalMode" that binds to DisplayMode_OriginalMode().

Moved initialization of DisplayMode before App::initSubsystems() so
that it will be available for Config.de.
  • Loading branch information
skyjake committed Dec 8, 2012
1 parent b89af2d commit 191dd68
Show file tree
Hide file tree
Showing 2 changed files with 67 additions and 3 deletions.
13 changes: 11 additions & 2 deletions doomsday/engine/src/dd_init.cpp
Expand Up @@ -155,14 +155,23 @@ int main(int argc, char** argv)
de2LegacyCore = LegacyCore_New(&dengApp);
LegacyCore_SetTerminateFunc(handleLegacyCoreTerminate);

if(useGUI)
{
// Config needs DisplayMode, so let's initialize it before the configuration.
DisplayMode_Init();

/**
* @todo DisplayMode should be moved under de::App's ownership, so
* this is handled automatically.
*/
}

dengApp.initSubsystems();

Libdeng_Init();

if(useGUI)
{
DisplayMode_Init();

// Check for updates automatically.
Updater_Init();

Expand Down
57 changes: 56 additions & 1 deletion doomsday/engine/src/ui/displaymode.cpp
Expand Up @@ -22,13 +22,22 @@
#include "ui/displaymode.h"
#include "ui/displaymode_native.h"

#include <de/App>
#include <de/Record>
#include <de/FunctionValue>
#include <de/DictionaryValue>
#include <de/ArrayValue>
#include <de/TextValue>
#include <de/NumberValue>

#include <vector>
#include <set>
#include <algorithm>
#include <de/Log>

static bool inited = false;
static displaycolortransfer_t originalColorTransfer;
static de::Record *bindings;

static float differenceToOriginalHz(float hz);

Expand Down Expand Up @@ -135,6 +144,7 @@ struct Mode : public DisplayMode
};

typedef std::set<Mode> Modes; // note: no duplicates

static Modes modes;
static Mode originalMode;
static bool captured;
Expand All @@ -144,6 +154,47 @@ static float differenceToOriginalHz(float hz)
return qAbs(hz - originalMode.refreshRate);
}

static de::Value *Binding_DisplayMode_OriginalMode(de::Context &, de::Function::ArgumentValues const &)
{
using de::NumberValue;
using de::TextValue;

DisplayMode const *mode = DisplayMode_OriginalMode();

de::DictionaryValue *dict = new de::DictionaryValue;
dict->add(new TextValue("width"), new NumberValue(mode->width));
dict->add(new TextValue("height"), new NumberValue(mode->height));
dict->add(new TextValue("depth"), new NumberValue(mode->depth));
dict->add(new TextValue("refreshRate"), new NumberValue(mode->refreshRate));

de::ArrayValue *ratio = new de::ArrayValue;
*ratio << NumberValue(mode->ratioX) << NumberValue(mode->ratioY);
dict->add(new TextValue("ratio"), ratio);

return dict;
}

static void setupBindings()
{
de::Function::registerNativeEntryPoint("DisplayMode_OriginalMode", Binding_DisplayMode_OriginalMode);

bindings = new de::Record;

de::Function *func = new de::Function("DisplayMode_OriginalMode");
bindings->addFunction("originalMode", func);
func->release(); // we don't keep a ref

de::App::app().addNativeModule("DisplayMode", *bindings);
}

static void tearDownBindings()
{
delete bindings; // App observes
bindings = 0;

de::Function::unregisterNativeEntryPoint("DisplayMode_OriginalMode");
}

int DisplayMode_Init(void)
{
if(inited) return true;
Expand Down Expand Up @@ -174,6 +225,8 @@ int DisplayMode_Init(void)
i->debugPrint();
}

setupBindings();

inited = true;
return true;
}
Expand All @@ -182,6 +235,8 @@ void DisplayMode_Shutdown(void)
{
if(!inited) return;

tearDownBindings();

LOG_INFO("Restoring original display mode due to shutdown.");

// Back to the original mode.
Expand All @@ -202,7 +257,7 @@ void DisplayMode_SaveOriginalColorTransfer(void)
DisplayMode_Native_GetColorTransfer(&originalColorTransfer);
}

const DisplayMode* DisplayMode_OriginalMode(void)
DisplayMode const *DisplayMode_OriginalMode(void)
{
return &originalMode;
}
Expand Down

0 comments on commit 191dd68

Please sign in to comment.