@@ -8,10 +8,12 @@ namespace app { | |||||
struct MenuBar : widget::OpaqueWidget { | struct MenuBar : widget::OpaqueWidget { | ||||
MenuBar(); | |||||
void draw(const DrawArgs &args) override; | void draw(const DrawArgs &args) override; | ||||
}; | }; | ||||
MenuBar *createMenuBar(); | |||||
} // namespace app | } // namespace app | ||||
} // namespace rack | } // namespace rack |
@@ -12,9 +12,10 @@ namespace rack { | |||||
namespace app { | namespace app { | ||||
extern const char APP_NAME[]; | |||||
extern const char APP_VERSION[]; | |||||
extern const char API_URL[]; | |||||
extern std::string APP_NAME; | |||||
extern std::string APP_VERSION; | |||||
extern std::string APP_NEW_VERSION; | |||||
extern std::string API_URL; | |||||
static const float SVG_DPI = 75.0; | static const float SVG_DPI = 75.0; | ||||
static const float MM_PER_IN = 25.4; | static const float MM_PER_IN = 25.4; | ||||
@@ -47,5 +48,8 @@ static const math::Vec RACK_OFFSET = RACK_GRID_SIZE.mult(math::Vec(2000, 100)); | |||||
static const math::Vec BUS_BOARD_GRID_SIZE = math::Vec(RACK_GRID_WIDTH * 20, RACK_GRID_HEIGHT); | static const math::Vec BUS_BOARD_GRID_SIZE = math::Vec(RACK_GRID_WIDTH * 20, RACK_GRID_HEIGHT); | ||||
void init(); | |||||
} // namespace app | } // namespace app | ||||
} // namespace rack | } // namespace rack |
@@ -34,7 +34,6 @@ extern int threadCount; | |||||
extern bool paramTooltip; | extern bool paramTooltip; | ||||
extern bool cpuMeter; | extern bool cpuMeter; | ||||
extern bool lockModules; | extern bool lockModules; | ||||
extern bool checkVersion; | |||||
extern float frameRateLimit; | extern float frameRateLimit; | ||||
extern bool frameRateSync; | extern bool frameRateSync; | ||||
extern bool skipLoadOnLaunch; | extern bool skipLoadOnLaunch; | ||||
@@ -34,6 +34,29 @@ struct MenuButton : ui::Button { | |||||
if (APP->event->draggedWidget == this) | if (APP->event->draggedWidget == this) | ||||
state = BND_ACTIVE; | state = BND_ACTIVE; | ||||
bndMenuItem(args.vg, 0.0, 0.0, box.size.x, box.size.y, state, -1, text.c_str()); | bndMenuItem(args.vg, 0.0, 0.0, box.size.x, box.size.y, state, -1, text.c_str()); | ||||
Widget::draw(args); | |||||
} | |||||
}; | |||||
struct NotificationIcon : widget::Widget { | |||||
void draw(const DrawArgs &args) override { | |||||
nvgBeginPath(args.vg); | |||||
float radius = 4; | |||||
nvgCircle(args.vg, radius, radius, radius); | |||||
nvgFillColor(args.vg, nvgRGBf(1.0, 0.0, 0.0)); | |||||
nvgFill(args.vg); | |||||
nvgStrokeColor(args.vg, nvgRGBf(0.5, 0.0, 0.0)); | |||||
nvgStroke(args.vg); | |||||
} | |||||
}; | |||||
struct UrlItem : ui::MenuItem { | |||||
std::string url; | |||||
void onAction(const event::Action &e) override { | |||||
std::thread t([=]() { | |||||
system::openBrowser(url); | |||||
}); | |||||
t.detach(); | |||||
} | } | ||||
}; | }; | ||||
@@ -421,15 +444,6 @@ struct EngineButton : MenuButton { | |||||
static bool isLoggingIn = false; | static bool isLoggingIn = false; | ||||
struct RegisterItem : ui::MenuItem { | |||||
void onAction(const event::Action &e) override { | |||||
std::thread t([]() { | |||||
system::openBrowser("https://vcvrack.com/"); | |||||
}); | |||||
t.detach(); | |||||
} | |||||
}; | |||||
struct AccountEmailField : ui::TextField { | struct AccountEmailField : ui::TextField { | ||||
ui::TextField *passwordField; | ui::TextField *passwordField; | ||||
void onSelectKey(const event::SelectKey &e) override { | void onSelectKey(const event::SelectKey &e) override { | ||||
@@ -478,15 +492,6 @@ struct LogInItem : ui::MenuItem { | |||||
} | } | ||||
}; | }; | ||||
struct ManageItem : ui::MenuItem { | |||||
void onAction(const event::Action &e) override { | |||||
std::thread t([]() { | |||||
system::openBrowser("https://vcvrack.com/plugins.html"); | |||||
}); | |||||
t.detach(); | |||||
} | |||||
}; | |||||
struct SyncItem : ui::MenuItem { | struct SyncItem : ui::MenuItem { | ||||
void onAction(const event::Action &e) override { | void onAction(const event::Action &e) override { | ||||
std::thread t([=]() { | std::thread t([=]() { | ||||
@@ -496,16 +501,6 @@ struct SyncItem : ui::MenuItem { | |||||
} | } | ||||
}; | }; | ||||
struct UpdateItem : ui::MenuItem { | |||||
std::string changelogUrl; | |||||
void onAction(const event::Action &e) override { | |||||
std::thread t([=]() { | |||||
system::openBrowser(changelogUrl); | |||||
}); | |||||
t.detach(); | |||||
} | |||||
}; | |||||
#if 0 | #if 0 | ||||
struct SyncButton : ui::Button { | struct SyncButton : ui::Button { | ||||
bool checked = false; | bool checked = false; | ||||
@@ -589,8 +584,9 @@ struct PluginsMenu : ui::Menu { | |||||
} | } | ||||
if (plugin::isLoggedIn()) { | if (plugin::isLoggedIn()) { | ||||
ManageItem *manageItem = new ManageItem; | |||||
UrlItem *manageItem = new UrlItem; | |||||
manageItem->text = "Manage"; | manageItem->text = "Manage"; | ||||
manageItem->url = "https://vcvrack.com/plugins.html"; | |||||
addChild(manageItem); | addChild(manageItem); | ||||
LogOutItem *logOutItem = new LogOutItem; | LogOutItem *logOutItem = new LogOutItem; | ||||
@@ -610,22 +606,23 @@ struct PluginsMenu : ui::Menu { | |||||
addChild(updatesLabel); | addChild(updatesLabel); | ||||
for (const plugin::Update &update : plugin::updates) { | for (const plugin::Update &update : plugin::updates) { | ||||
UpdateItem *updateItem = new UpdateItem; | |||||
UrlItem *updateItem = new UrlItem; | |||||
updateItem->text = update.pluginSlug; | updateItem->text = update.pluginSlug; | ||||
plugin::Plugin *p = plugin::getPlugin(update.pluginSlug); | plugin::Plugin *p = plugin::getPlugin(update.pluginSlug); | ||||
if (p) { | if (p) { | ||||
updateItem->rightText += "v" + p->version + " → "; | updateItem->rightText += "v" + p->version + " → "; | ||||
} | } | ||||
updateItem->rightText += "v" + update.version; | updateItem->rightText += "v" + update.version; | ||||
updateItem->changelogUrl = update.changelogUrl; | |||||
updateItem->url = update.changelogUrl; | |||||
updateItem->disabled = update.changelogUrl.empty(); | updateItem->disabled = update.changelogUrl.empty(); | ||||
addChild(updateItem); | addChild(updateItem); | ||||
} | } | ||||
} | } | ||||
} | } | ||||
else { | else { | ||||
RegisterItem *registerItem = new RegisterItem; | |||||
UrlItem *registerItem = new UrlItem; | |||||
registerItem->text = "Register VCV account"; | registerItem->text = "Register VCV account"; | ||||
registerItem->url = "https://vcvrack.com/"; | |||||
addChild(registerItem); | addChild(registerItem); | ||||
AccountEmailField *emailField = new AccountEmailField; | AccountEmailField *emailField = new AccountEmailField; | ||||
@@ -649,24 +646,23 @@ struct PluginsMenu : ui::Menu { | |||||
}; | }; | ||||
struct PluginsButton : MenuButton { | struct PluginsButton : MenuButton { | ||||
NotificationIcon *notification; | |||||
PluginsButton() { | |||||
notification = new NotificationIcon; | |||||
addChild(notification); | |||||
} | |||||
void onAction(const event::Action &e) override { | void onAction(const event::Action &e) override { | ||||
ui::Menu *menu = createMenu<PluginsMenu>(); | ui::Menu *menu = createMenu<PluginsMenu>(); | ||||
menu->box.pos = getAbsoluteOffset(math::Vec(0, box.size.y)); | menu->box.pos = getAbsoluteOffset(math::Vec(0, box.size.y)); | ||||
menu->box.size.x = box.size.x; | menu->box.size.x = box.size.x; | ||||
} | } | ||||
void draw(const DrawArgs &args) override { | |||||
MenuButton::draw(args); | |||||
if (0) { | |||||
// Notification circle | |||||
nvgBeginPath(args.vg); | |||||
nvgCircle(args.vg, 4, 2, 4.0); | |||||
nvgFillColor(args.vg, nvgRGBf(1.0, 0.0, 0.0)); | |||||
nvgFill(args.vg); | |||||
nvgStrokeColor(args.vg, nvgRGBf(0.5, 0.0, 0.0)); | |||||
nvgStroke(args.vg); | |||||
} | |||||
void step() override { | |||||
notification->box.pos = math::Vec(0, 0); | |||||
notification->visible = false; | |||||
MenuButton::step(); | |||||
} | } | ||||
}; | }; | ||||
@@ -674,26 +670,6 @@ struct PluginsButton : MenuButton { | |||||
// Help | // Help | ||||
//////////////////// | //////////////////// | ||||
struct ManualItem : ui::MenuItem { | |||||
void onAction(const event::Action &e) override { | |||||
std::thread t(system::openBrowser, "https://vcvrack.com/manual/"); | |||||
t.detach(); | |||||
} | |||||
}; | |||||
struct WebsiteItem : ui::MenuItem { | |||||
void onAction(const event::Action &e) override { | |||||
std::thread t(system::openBrowser, "https://vcvrack.com/"); | |||||
t.detach(); | |||||
} | |||||
}; | |||||
struct CheckVersionItem : ui::MenuItem { | |||||
void onAction(const event::Action &e) override { | |||||
settings::checkVersion ^= true; | |||||
} | |||||
}; | |||||
struct UserFolderItem : ui::MenuItem { | struct UserFolderItem : ui::MenuItem { | ||||
void onAction(const event::Action &e) override { | void onAction(const event::Action &e) override { | ||||
std::thread t(system::openFolder, asset::user("")); | std::thread t(system::openFolder, asset::user("")); | ||||
@@ -702,43 +678,75 @@ struct UserFolderItem : ui::MenuItem { | |||||
}; | }; | ||||
struct HelpButton : MenuButton { | struct HelpButton : MenuButton { | ||||
NotificationIcon *notification; | |||||
HelpButton() { | |||||
notification = new NotificationIcon; | |||||
addChild(notification); | |||||
} | |||||
void onAction(const event::Action &e) override { | void onAction(const event::Action &e) override { | ||||
ui::Menu *menu = createMenu(); | ui::Menu *menu = createMenu(); | ||||
menu->box.pos = getAbsoluteOffset(math::Vec(0, box.size.y)); | menu->box.pos = getAbsoluteOffset(math::Vec(0, box.size.y)); | ||||
menu->box.size.x = box.size.x; | menu->box.size.x = box.size.x; | ||||
ManualItem *manualItem = new ManualItem; | |||||
UrlItem *manualItem = new UrlItem; | |||||
manualItem->text = "Manual"; | manualItem->text = "Manual"; | ||||
manualItem->rightText = "F1"; | manualItem->rightText = "F1"; | ||||
manualItem->url = "https://vcvrack.com/manual/"; | |||||
menu->addChild(manualItem); | menu->addChild(manualItem); | ||||
WebsiteItem *websiteItem = new WebsiteItem; | |||||
UrlItem *websiteItem = new UrlItem; | |||||
websiteItem->text = "VCVRack.com"; | websiteItem->text = "VCVRack.com"; | ||||
websiteItem->url = "https://vcvrack.com/"; | |||||
menu->addChild(websiteItem); | menu->addChild(websiteItem); | ||||
CheckVersionItem *checkVersionItem = new CheckVersionItem; | |||||
checkVersionItem->text = "Check version on launch"; | |||||
checkVersionItem->rightText = CHECKMARK(settings::checkVersion); | |||||
menu->addChild(checkVersionItem); | |||||
if (hasUpdate()) { | |||||
UrlItem *updateItem = new UrlItem; | |||||
updateItem->text = "Update " + APP_NAME; | |||||
updateItem->rightText = APP_VERSION + " → " + APP_NEW_VERSION; | |||||
updateItem->url = "https://vcvrack.com/"; | |||||
menu->addChild(updateItem); | |||||
} | |||||
UserFolderItem *folderItem = new UserFolderItem; | UserFolderItem *folderItem = new UserFolderItem; | ||||
folderItem->text = "Open user folder"; | folderItem->text = "Open user folder"; | ||||
menu->addChild(folderItem); | menu->addChild(folderItem); | ||||
} | } | ||||
void step() override { | |||||
notification->box.pos = math::Vec(0, 0); | |||||
notification->visible = hasUpdate(); | |||||
MenuButton::step(); | |||||
} | |||||
bool hasUpdate() { | |||||
return !APP_NEW_VERSION.empty() && APP_NEW_VERSION != APP_VERSION; | |||||
} | |||||
}; | }; | ||||
//////////////////// | //////////////////// | ||||
// MenuBar | // MenuBar | ||||
//////////////////// | //////////////////// | ||||
MenuBar::MenuBar() { | |||||
void MenuBar::draw(const DrawArgs &args) { | |||||
bndMenuBackground(args.vg, 0.0, 0.0, box.size.x, box.size.y, BND_CORNER_ALL); | |||||
bndBevel(args.vg, 0.0, 0.0, box.size.x, box.size.y); | |||||
Widget::draw(args); | |||||
} | |||||
MenuBar *createMenuBar() { | |||||
MenuBar *menuBar = new MenuBar; | |||||
const float margin = 5; | const float margin = 5; | ||||
box.size.y = BND_WIDGET_HEIGHT + 2*margin; | |||||
menuBar->box.size.y = BND_WIDGET_HEIGHT + 2*margin; | |||||
ui::SequentialLayout *layout = new ui::SequentialLayout; | ui::SequentialLayout *layout = new ui::SequentialLayout; | ||||
layout->box.pos = math::Vec(margin, margin); | layout->box.pos = math::Vec(margin, margin); | ||||
layout->spacing = math::Vec(0, 0); | layout->spacing = math::Vec(0, 0); | ||||
addChild(layout); | |||||
menuBar->addChild(layout); | |||||
FileButton *fileButton = new FileButton; | FileButton *fileButton = new FileButton; | ||||
fileButton->text = "File"; | fileButton->text = "File"; | ||||
@@ -763,13 +771,8 @@ MenuBar::MenuBar() { | |||||
HelpButton *helpButton = new HelpButton; | HelpButton *helpButton = new HelpButton; | ||||
helpButton->text = "Help"; | helpButton->text = "Help"; | ||||
layout->addChild(helpButton); | layout->addChild(helpButton); | ||||
} | |||||
void MenuBar::draw(const DrawArgs &args) { | |||||
bndMenuBackground(args.vg, 0.0, 0.0, box.size.x, box.size.y, BND_CORNER_ALL); | |||||
bndBevel(args.vg, 0.0, 0.0, box.size.x, box.size.y); | |||||
Widget::draw(args); | |||||
return menuBar; | |||||
} | } | ||||
@@ -21,7 +21,7 @@ Scene::Scene() { | |||||
rack = rackScroll->rackWidget; | rack = rackScroll->rackWidget; | ||||
menuBar = new MenuBar; | |||||
menuBar = createMenuBar(); | |||||
addChild(menuBar); | addChild(menuBar); | ||||
rackScroll->box.pos.y = menuBar->box.size.y; | rackScroll->box.pos.y = menuBar->box.size.y; | ||||
@@ -46,24 +46,6 @@ void Scene::step() { | |||||
settings::save(asset::user("settings.json")); | settings::save(asset::user("settings.json")); | ||||
} | } | ||||
// Request latest version from server | |||||
if (!settings::devMode && checkVersion && !checkedVersion) { | |||||
std::thread t(&Scene::runCheckVersion, this); | |||||
t.detach(); | |||||
checkedVersion = true; | |||||
} | |||||
// Version popup message | |||||
if (!latestVersion.empty()) { | |||||
std::string versionMessage = string::f("Rack v%s is available.\n\nYou have Rack v%s.\n\nClose Rack and download new version on the website?", latestVersion.c_str(), app::APP_VERSION); | |||||
if (osdialog_message(OSDIALOG_INFO, OSDIALOG_OK_CANCEL, versionMessage.c_str())) { | |||||
std::thread t(system::openBrowser, "https://vcvrack.com/"); | |||||
t.detach(); | |||||
APP->window->close(); | |||||
} | |||||
latestVersion = ""; | |||||
} | |||||
Widget::step(); | Widget::step(); | ||||
} | } | ||||
@@ -166,23 +148,6 @@ void Scene::onPathDrop(const event::PathDrop &e) { | |||||
} | } | ||||
} | } | ||||
void Scene::runCheckVersion() { | |||||
std::string versionUrl = app::API_URL; | |||||
versionUrl += "/version"; | |||||
json_t *versionResJ = network::requestJson(network::METHOD_GET, versionUrl, NULL); | |||||
if (versionResJ) { | |||||
json_t *versionJ = json_object_get(versionResJ, "version"); | |||||
if (versionJ) { | |||||
std::string version = json_string_value(versionJ); | |||||
if (version != app::APP_VERSION) { | |||||
latestVersion = version; | |||||
} | |||||
} | |||||
json_decref(versionResJ); | |||||
} | |||||
} | |||||
} // namespace app | } // namespace app | ||||
} // namespace rack | } // namespace rack |
@@ -1,14 +1,43 @@ | |||||
#include "app/common.hpp" | #include "app/common.hpp" | ||||
#include "settings.hpp" | |||||
#include "network.hpp" | |||||
#include <thread> | |||||
namespace rack { | namespace rack { | ||||
namespace app { | namespace app { | ||||
const char APP_NAME[] = "VCV Rack"; | |||||
const char APP_VERSION[] = TOSTRING(VERSION); | |||||
const char API_URL[] = "https://api.vcvrack.com"; | |||||
std::string APP_NAME = "VCV Rack"; | |||||
std::string APP_VERSION = TOSTRING(VERSION); | |||||
std::string APP_NEW_VERSION; | |||||
std::string API_URL = "https://api.vcvrack.com"; | |||||
static void checkVersion() { | |||||
std::string versionUrl = app::API_URL + "/version2"; | |||||
json_t *versionResJ = network::requestJson(network::METHOD_GET, versionUrl, NULL); | |||||
if (!versionResJ) { | |||||
WARN("Request for version failed"); | |||||
return; | |||||
} | |||||
DEFER({ | |||||
json_decref(versionResJ); | |||||
}); | |||||
json_t *versionJ = json_object_get(versionResJ, "version"); | |||||
if (versionJ) | |||||
APP_NEW_VERSION = json_string_value(versionJ); | |||||
} | |||||
void init() { | |||||
// TODO | |||||
if (!settings::devMode || 1) { | |||||
std::thread t([] { | |||||
checkVersion(); | |||||
}); | |||||
t.detach(); | |||||
} | |||||
} | |||||
} // namespace app | } // namespace app | ||||
@@ -48,7 +48,7 @@ int main(int argc, char *argv[]) { | |||||
#if defined ARCH_WIN | #if defined ARCH_WIN | ||||
// Windows global mutex to prevent multiple instances | // Windows global mutex to prevent multiple instances | ||||
// Handle will be closed by Windows when the process ends | // Handle will be closed by Windows when the process ends | ||||
HANDLE instanceMutex = CreateMutexA(NULL, true, app::APP_NAME); | |||||
HANDLE instanceMutex = CreateMutexA(NULL, true, app::APP_NAME.c_str()); | |||||
if (GetLastError() == ERROR_ALREADY_EXISTS) { | if (GetLastError() == ERROR_ALREADY_EXISTS) { | ||||
osdialog_message(OSDIALOG_ERROR, OSDIALOG_OK, "Rack is already running. Multiple Rack instances are not supported."); | osdialog_message(OSDIALOG_ERROR, OSDIALOG_OK, "Rack is already running. Multiple Rack instances are not supported."); | ||||
exit(1); | exit(1); | ||||
@@ -104,7 +104,7 @@ int main(int argc, char *argv[]) { | |||||
#endif | #endif | ||||
// Log environment | // Log environment | ||||
INFO("%s v%s", app::APP_NAME, app::APP_VERSION); | |||||
INFO("%s v%s", app::APP_NAME.c_str(), app::APP_VERSION.c_str()); | |||||
INFO("%s", system::getOperatingSystemInfo().c_str()); | INFO("%s", system::getOperatingSystemInfo().c_str()); | ||||
if (settings::devMode) | if (settings::devMode) | ||||
INFO("Development mode"); | INFO("Development mode"); | ||||
@@ -139,6 +139,7 @@ int main(int argc, char *argv[]) { | |||||
keyboard::init(); | keyboard::init(); | ||||
gamepad::init(); | gamepad::init(); | ||||
plugin::init(); | plugin::init(); | ||||
app::init(); | |||||
if (!settings::headless) { | if (!settings::headless) { | ||||
ui::init(); | ui::init(); | ||||
windowInit(); | windowInit(); | ||||
@@ -230,7 +230,7 @@ json_t *PatchManager::toJson() { | |||||
json_t *rootJ = json_object(); | json_t *rootJ = json_object(); | ||||
// version | // version | ||||
json_t *versionJ = json_string(app::APP_VERSION); | |||||
json_t *versionJ = json_string(app::APP_VERSION.c_str()); | |||||
json_object_set_new(rootJ, "version", versionJ); | json_object_set_new(rootJ, "version", versionJ); | ||||
// Merge with RackWidget JSON | // Merge with RackWidget JSON | ||||
@@ -251,7 +251,7 @@ void PatchManager::fromJson(json_t *rootJ) { | |||||
if (versionJ) | if (versionJ) | ||||
version = json_string_value(versionJ); | version = json_string_value(versionJ); | ||||
if (version != app::APP_VERSION) { | if (version != app::APP_VERSION) { | ||||
INFO("Patch was made with Rack v%s, current Rack version is v%s", version.c_str(), app::APP_VERSION); | |||||
INFO("Patch was made with Rack v%s, current Rack version is v%s", version.c_str(), app::APP_VERSION.c_str()); | |||||
} | } | ||||
// Detect old patches with ModuleWidget::params/inputs/outputs indices. | // Detect old patches with ModuleWidget::params/inputs/outputs indices. | ||||
@@ -166,8 +166,7 @@ static bool syncUpdate(const Update &update) { | |||||
std::string arch = "lin"; | std::string arch = "lin"; | ||||
#endif | #endif | ||||
std::string downloadUrl = app::API_URL; | |||||
downloadUrl += "/download"; | |||||
std::string downloadUrl = app::API_URL + "/download"; | |||||
downloadUrl += "?token=" + network::encodeUrl(settings::token); | downloadUrl += "?token=" + network::encodeUrl(settings::token); | ||||
downloadUrl += "&slug=" + network::encodeUrl(update.pluginSlug); | downloadUrl += "&slug=" + network::encodeUrl(update.pluginSlug); | ||||
downloadUrl += "&version=" + network::encodeUrl(update.version); | downloadUrl += "&version=" + network::encodeUrl(update.version); | ||||
@@ -350,8 +349,7 @@ void logIn(const std::string &email, const std::string &password) { | |||||
json_t *reqJ = json_object(); | json_t *reqJ = json_object(); | ||||
json_object_set(reqJ, "email", json_string(email.c_str())); | json_object_set(reqJ, "email", json_string(email.c_str())); | ||||
json_object_set(reqJ, "password", json_string(password.c_str())); | json_object_set(reqJ, "password", json_string(password.c_str())); | ||||
std::string url = app::API_URL; | |||||
url += "/token"; | |||||
std::string url = app::API_URL + "/token"; | |||||
json_t *resJ = network::requestJson(network::METHOD_POST, url, reqJ); | json_t *resJ = network::requestJson(network::METHOD_POST, url, reqJ); | ||||
json_decref(reqJ); | json_decref(reqJ); | ||||
@@ -391,8 +389,7 @@ void queryUpdates() { | |||||
// Get user's plugins list | // Get user's plugins list | ||||
json_t *pluginsReqJ = json_object(); | json_t *pluginsReqJ = json_object(); | ||||
json_object_set(pluginsReqJ, "token", json_string(settings::token.c_str())); | json_object_set(pluginsReqJ, "token", json_string(settings::token.c_str())); | ||||
std::string pluginsUrl = app::API_URL; | |||||
pluginsUrl += "/plugins"; | |||||
std::string pluginsUrl = app::API_URL + "/plugins"; | |||||
json_t *pluginsResJ = network::requestJson(network::METHOD_GET, pluginsUrl, pluginsReqJ); | json_t *pluginsResJ = network::requestJson(network::METHOD_GET, pluginsUrl, pluginsReqJ); | ||||
json_decref(pluginsReqJ); | json_decref(pluginsReqJ); | ||||
if (!pluginsResJ) { | if (!pluginsResJ) { | ||||
@@ -410,8 +407,7 @@ void queryUpdates() { | |||||
} | } | ||||
// Get community manifests | // Get community manifests | ||||
std::string manifestsUrl = app::API_URL; | |||||
manifestsUrl += "/community/manifests"; | |||||
std::string manifestsUrl = app::API_URL + "/community/manifests"; | |||||
json_t *manifestsResJ = network::requestJson(network::METHOD_GET, manifestsUrl, NULL); | json_t *manifestsResJ = network::requestJson(network::METHOD_GET, manifestsUrl, NULL); | ||||
if (!manifestsResJ) { | if (!manifestsResJ) { | ||||
WARN("Request for community manifests failed"); | WARN("Request for community manifests failed"); | ||||
@@ -29,7 +29,6 @@ int threadCount = 1; | |||||
bool paramTooltip = false; | bool paramTooltip = false; | ||||
bool cpuMeter = false; | bool cpuMeter = false; | ||||
bool lockModules = false; | bool lockModules = false; | ||||
bool checkVersion = true; | |||||
float frameRateLimit = 70.0; | float frameRateLimit = 70.0; | ||||
bool frameRateSync = true; | bool frameRateSync = true; | ||||
bool skipLoadOnLaunch = false; | bool skipLoadOnLaunch = false; | ||||
@@ -76,8 +75,6 @@ json_t *toJson() { | |||||
json_object_set_new(rootJ, "lockModules", json_boolean(lockModules)); | json_object_set_new(rootJ, "lockModules", json_boolean(lockModules)); | ||||
json_object_set_new(rootJ, "checkVersion", json_boolean(checkVersion)); | |||||
json_object_set_new(rootJ, "frameRateLimit", json_real(frameRateLimit)); | json_object_set_new(rootJ, "frameRateLimit", json_real(frameRateLimit)); | ||||
json_object_set_new(rootJ, "frameRateSync", json_boolean(frameRateSync)); | json_object_set_new(rootJ, "frameRateSync", json_boolean(frameRateSync)); | ||||
@@ -174,10 +171,6 @@ void fromJson(json_t *rootJ) { | |||||
if (lockModulesJ) | if (lockModulesJ) | ||||
lockModules = json_boolean_value(lockModulesJ); | lockModules = json_boolean_value(lockModulesJ); | ||||
json_t *checkVersionJ = json_object_get(rootJ, "checkVersion"); | |||||
if (checkVersionJ) | |||||
checkVersion = json_boolean_value(checkVersionJ); | |||||
json_t *frameRateLimitJ = json_object_get(rootJ, "frameRateLimit"); | json_t *frameRateLimitJ = json_object_get(rootJ, "frameRateLimit"); | ||||
if (frameRateLimitJ) | if (frameRateLimitJ) | ||||
frameRateLimit = json_number_value(frameRateLimitJ); | frameRateLimit = json_number_value(frameRateLimitJ); | ||||
@@ -327,10 +327,7 @@ void Window::run() { | |||||
gamepad::step(); | gamepad::step(); | ||||
// Set window title | // Set window title | ||||
std::string windowTitle; | |||||
windowTitle = app::APP_NAME; | |||||
windowTitle += " v"; | |||||
windowTitle += app::APP_VERSION; | |||||
std::string windowTitle = app::APP_NAME + " v" + app::APP_VERSION; | |||||
if (!APP->patch->path.empty()) { | if (!APP->patch->path.empty()) { | ||||
windowTitle += " - "; | windowTitle += " - "; | ||||
if (!APP->history->isSaved()) | if (!APP->history->isSaved()) | ||||