diff --git a/src/LScreens.c b/src/LScreens.c index cb44d161b..23e267acf 100644 --- a/src/LScreens.c +++ b/src/LScreens.c @@ -221,13 +221,7 @@ static void UseModeEnhanced(void* w) { ChooseMode_Click(false, false); } static void UseModeClassicHax(void* w) { ChooseMode_Click(true, true); } static void UseModeClassic(void* w) { ChooseMode_Click(true, false); } -static void ChooseModeScreen_Show(struct LScreen* s_) { - struct ChooseModeScreen* s = (struct ChooseModeScreen*)s_; - - s->widgets = chooseMode_widgets; - s->maxWidgets = Array_Elems(chooseMode_widgets); - s->numWidgets = 0; - +static void ChooseModeScreen_AddWidgets(struct ChooseModeScreen* s) { LLine_Init(s, &s->seps[0], 490, mode_seps0); LLine_Init(s, &s->seps[1], 490, mode_seps1); @@ -254,6 +248,15 @@ static void ChooseModeScreen_Show(struct LScreen* s_) { } } +static void ChooseModeScreen_Show(struct LScreen* s_) { + struct ChooseModeScreen* s = (struct ChooseModeScreen*)s_; + + s->widgets = chooseMode_widgets; + s->maxWidgets = Array_Elems(chooseMode_widgets); + s->numWidgets = 0; + ChooseModeScreen_AddWidgets(s); +} + void ChooseModeScreen_SetActive(cc_bool firstTime) { struct ChooseModeScreen* s = &ChooseModeScreen; LScreen_Reset((struct LScreen*)s); @@ -417,8 +420,8 @@ static void ColoursScreen_Init(struct LScreen* s_) { LButton_Init(s, &s->btnBack, 80, 35, "Back", SwitchToThemes, clr_btnBack); - LCheckbox_Init(s, &s->cbClassic, "Classic style", clr_cbClassic); - s->cbClassic.ValueChanged = ColoursScreen_ToggleBG; + LCheckbox_Init(s, &s->cbClassic, "Classic style", + ColoursScreen_ToggleBG, clr_cbClassic); } static void ColoursScreen_Show(struct LScreen* s_) { @@ -1401,13 +1404,17 @@ static void SettingsScreen_AddWidgets(struct SettingsScreen* s) { } #if defined CC_BUILD_MOBILE - LCheckbox_Init(s, &s->cbExtra, "Force landscape", set_cbExtra); + LCheckbox_Init(s, &s->cbExtra, "Force landscape", + SettingsScreen_LockOrientation, set_cbExtra); #else - LCheckbox_Init(s, &s->cbExtra, "Close this after game starts", set_cbExtra); + LCheckbox_Init(s, &s->cbExtra, "Close this after game starts", + SettingsScreen_AutoClose, set_cbExtra); #endif - LCheckbox_Init(s, &s->cbEmpty, "Show empty servers in list", set_cbEmpty); - LCheckbox_Init(s, &s->cbScale, "Use display scaling", set_cbScale); + LCheckbox_Init(s, &s->cbEmpty, "Show empty servers in list", + SettingsScreen_ShowEmpty, set_cbEmpty); + LCheckbox_Init(s, &s->cbScale, "Use display scaling", + SettingsScreen_DPIScaling, set_cbScale); LButton_Init(s, &s->btnBack, 80, 35, "Back", SwitchToMain, set_btnBack); } @@ -1421,17 +1428,12 @@ static void SettingsScreen_Show(struct LScreen* s_) { SettingsScreen_AddWidgets(s); #if defined CC_BUILD_MOBILE - s->cbExtra.ValueChanged = SettingsScreen_LockOrientation; LCheckbox_Set(&s->cbExtra, Options_GetBool(OPT_LANDSCAPE_MODE, false)); #else - s->cbExtra.ValueChanged = SettingsScreen_AutoClose; LCheckbox_Set(&s->cbExtra, Options_GetBool(LOPT_AUTO_CLOSE, false)); #endif - s->cbEmpty.ValueChanged = SettingsScreen_ShowEmpty; LCheckbox_Set(&s->cbEmpty, Launcher_ShowEmptyServers); - - s->cbScale.ValueChanged = SettingsScreen_DPIScaling; LCheckbox_Set(&s->cbScale, DisplayInfo.DPIScaling); } @@ -1679,11 +1681,8 @@ static void UpdatesScreen_Rel_1(void* w) { UpdatesScreen_Get(true, 1); } static void UpdatesScreen_Dev_0(void* w) { UpdatesScreen_Get(false, 0); } static void UpdatesScreen_Dev_1(void* w) { UpdatesScreen_Get(false, 1); } -static void UpdatesScreen_Init(struct LScreen* s_) { - struct UpdatesScreen* s = (struct UpdatesScreen*)s_; - int builds = Updater_Info.numBuilds; - s->widgets = updates_widgets; - s->maxWidgets = Array_Elems(updates_widgets); +static void UpdatesScreen_AddWidgets(struct UpdatesScreen* s) { + int builds = Updater_Info.numBuilds; LLine_Init(s, &s->seps[0], 320, upd_seps0); LLine_Init(s, &s->seps[1], 320, upd_seps1); @@ -1716,6 +1715,11 @@ static void UpdatesScreen_Show(struct LScreen* s_) { cc_uint64 buildTime; cc_result res; + s->widgets = updates_widgets; + s->maxWidgets = Array_Elems(updates_widgets); + s->numWidgets = 0; + UpdatesScreen_AddWidgets(s); + /* Initially fill out with update check result from main menu */ if (CheckUpdateTask.Base.completed && CheckUpdateTask.Base.success) { UpdatesScreen_FormatBoth(s); @@ -1748,10 +1752,9 @@ static void UpdatesScreen_Free(struct LScreen* s_) { void UpdatesScreen_SetActive(void) { struct UpdatesScreen* s = &UpdatesScreen; LScreen_Reset((struct LScreen*)s); - s->Init = UpdatesScreen_Init; - s->Show = UpdatesScreen_Show; - s->Tick = UpdatesScreen_Tick; - s->Free = UpdatesScreen_Free; + s->Show = UpdatesScreen_Show; + s->Tick = UpdatesScreen_Tick; + s->Free = UpdatesScreen_Free; s->title = "Update game"; s->onEscapeWidget = (struct LWidget*)&s->btnBack; diff --git a/src/LWidgets.c b/src/LWidgets.c index d9e175568..207efbc3d 100644 --- a/src/LWidgets.c +++ b/src/LWidgets.c @@ -147,11 +147,12 @@ static const struct LWidgetVTABLE lcheckbox_VTABLE = { NULL, NULL /* Select */ }; void LCheckbox_Init(void* screen, struct LCheckbox* w, const char* text, - const struct LLayout* layouts) { + LCheckboxChanged onChanged, const struct LLayout* layouts) { w->VTABLE = &lcheckbox_VTABLE; w->type = LWIDGET_CHECKBOX; w->layouts = layouts; w->autoSelectable = true; + w->ValueChanged = onChanged; w->text = String_FromReadonly(text); LBackend_CheckboxInit(w); diff --git a/src/LWidgets.h b/src/LWidgets.h index 06755ed5d..94284ad83 100644 --- a/src/LWidgets.h +++ b/src/LWidgets.h @@ -44,7 +44,6 @@ struct LWidgetVTABLE { }; - #define LWidget_Layout \ const struct LWidgetVTABLE* VTABLE; /* General widget functions */ \ int x, y, width, height; /* Top left corner and dimensions of this widget */ \ @@ -78,14 +77,15 @@ CC_NOINLINE void LButton_SetConst(struct LButton* w, const char* text); CC_NOINLINE void LButton_DrawBackground(struct Context2D* ctx, int x, int y, int width, int height, cc_bool active); struct LCheckbox; +typedef void (*LCheckboxChanged)(struct LCheckbox* cb); struct LCheckbox { LWidget_Layout cc_bool value; cc_string text; - void (*ValueChanged)(struct LCheckbox* w); + LCheckboxChanged ValueChanged; }; CC_NOINLINE void LCheckbox_Init(void* screen, struct LCheckbox* w, const char* text, - const struct LLayout* layouts); + LCheckboxChanged onChanged, const struct LLayout* layouts); CC_NOINLINE void LCheckbox_Set(struct LCheckbox* w, cc_bool value); struct LInput; diff --git a/src/Platform_Windows.c b/src/Platform_Windows.c index 8a11568b0..e4f26fefc 100644 --- a/src/Platform_Windows.c +++ b/src/Platform_Windows.c @@ -785,9 +785,21 @@ cc_bool DynamicLib_DescribeError(cc_string* dst) { /* Plugin may have been compiled to load symbols from ClassiCube.exe, */ /* but the user might have renamed it to something else */ - if (res == ERROR_MOD_NOT_FOUND && loadingPlugin) { + if (res == ERROR_MOD_NOT_FOUND && loadingPlugin) { String_AppendConst(dst, "\n Make sure the ClassiCube executable is named ClassiCube.exe"); } + if (res == ERROR_PROC_NOT_FOUND && loadingPlugin) { + String_AppendConst(dst, "\n The plugin or your game may be outdated"); + } + + /* User might be trying to use 32 bit plugin with 64 bit executable, or vice versa */ + if (res == ERROR_BAD_EXE_FORMAT && loadingPlugin) { + if (sizeof(cc_uintptr) == 4) { + String_AppendConst(dst, "\n Try using a 32 bit version of the plugin instead"); + } else { + String_AppendConst(dst, "\n Try using a 64 bit version of the plugin instead"); + } + } return true; }