/* Copyright (C) 2017-2020, Dirk Krause SPDX-License-Identifier: BSD-3-Clause */ /* WARNING: This file was generated by the dkct program (see http://dktools.sourceforge.net/ for details). Changes you make here will be lost if dkct is run again! You should modify the original source and run dkct on it. Original source: ScreenSizeFrame.wxc */ /** @file ScreenSizeFrame.cpp The ScreenSizeFrame module. */ #line 309 "ScreenSizeFrame.wxc" #define AUTO_EXIT_ONLY_ON_SUCCESS 1 #include "dk4conf.h" #include "dk4mem.h" #include "wxdkscrsz.h" #include #include "dk4maoxd.h" #if !defined(__WXMSW__) #include "gui-img/icons/wxdkscrsz.xpm" #endif #line 325 "ScreenSizeFrame.wxc" static const wxChar * const settingsNames[] = { /* 0 */ wxT("screen.size.normal.width"), /* 1 */ wxT("screen.size.normal.height"), /* 2 */ wxT("screen.size.alternative.width"), /* 3 */ wxT("screen.size.alternative.height"), NULL #line 335 "ScreenSizeFrame.wxc" }; /* __CHANGE__ 017: Add further events. */ /* __CHANGE__ 008: Remove OnIdle if no idle processing required. */ #if wxCHECK_VERSION(3,0,0) wxBEGIN_EVENT_TABLE(ScreenSizeFrame,wxFrame) #else BEGIN_EVENT_TABLE(ScreenSizeFrame,wxFrame) #endif EVT_MENU(ScreenSizeFrame_Quit, ScreenSizeFrame::OnQuit) EVT_MENU(ScreenSizeFrame_Help_About, ScreenSizeFrame::OnAbout) EVT_MENU(ScreenSizeFrame_Help_Contents, ScreenSizeFrame::OnHelpContents) EVT_IDLE(ScreenSizeFrame::OnIdle) #if wxCHECK_VERSION(3,0,0) wxEND_EVENT_TABLE() #else END_EVENT_TABLE() #endif #line 359 "ScreenSizeFrame.wxc" ScreenSizeFrame::ScreenSizeFrame( int wxid, Dk4WxApplicationHelper *applicationHelper, Dk4WxHelpController *hc, int argc, wxChar **argv, wxChar const * const *localizedTexts, wxChar const * const *nlWx, dkChar const * const *nlDk ) : Dk4WxFrame(nlWx[0], applicationHelper, hc, wxid), cGreen(0, 127, 0), cRed(127, 0, 0) { /* __CHANGE__ 012: Add further local variables. */ /* __CHANGE__ 012: Initialize further local variables. */ sTexts = localizedTexts; sNlWx = nlWx; sNlDk = nlDk; #if defined(__WXMSW__) wxIcon wxdkscrsz_icon(sNlWx[4]); #else wxIcon wxdkscrsz_icon(xpm_wxdkscrsz); #endif /* __CHANGE__ 011: Initialize further class members. */ bActive = true; iArgc = argc; ppArgv = argv; dkctGUILayoutOK = false; dkctGUIContentsPanel = NULL; mainSizer = NULL; mbMain = NULL; menuFile = NULL; menuHelp = NULL; miFileExit = NULL; miHelpAbout = NULL; miHelpContents = NULL; verticalSizer = NULL; contentsSizer = NULL; lOldSize = NULL; lOldWidth = NULL; vOldWidth = NULL; lOldHeight = NULL; vOldHeight = NULL; lNewSize = NULL; lNewWidth = NULL; vNewWidth = NULL; lNewHeight = NULL; vNewHeight = NULL; lResult = NULL; lSsc = NULL; lSsr = NULL; dkctGUIContentsPanel = new wxPanel(this); if(!(dkctGUIContentsPanel)) { goto dkctGUILayoutFinished; } #if wxUSE_MENUS mbMain = new wxMenuBar( ); if(!(mbMain)) { goto dkctGUILayoutFinished; } menuFile = new wxMenu( ); if(!(menuFile)) { goto dkctGUILayoutFinished; } miFileExit = menuFile->Append( ScreenSizeFrame_Quit, sTexts[1], sTexts[2] ); if(!(miFileExit)) { goto dkctGUILayoutFinished; } mbMain->Append(menuFile, sTexts[0]); menuHelp = new wxMenu( ); if(!(menuHelp)) { goto dkctGUILayoutFinished; } miHelpAbout = menuHelp->Append( ScreenSizeFrame_Help_About, sTexts[4], sTexts[5] ); if(!(miHelpAbout)) { goto dkctGUILayoutFinished; } miHelpContents = menuHelp->Append( ScreenSizeFrame_Help_Contents, sTexts[6], sTexts[7] ); if(!(miHelpContents)) { goto dkctGUILayoutFinished; } mbMain->Append(menuHelp, sTexts[3]); SetMenuBar(mbMain); #endif mainSizer = new wxBoxSizer( wxHORIZONTAL ); if(!(mainSizer)) { goto dkctGUILayoutFinished; } mainSizer->Add(10, 10, 0); verticalSizer = new wxBoxSizer( wxVERTICAL ); if(!(verticalSizer)) { goto dkctGUILayoutFinished; } verticalSizer->Add(10, 10, 0); contentsSizer = new wxGridBagSizer( 5, 5 ); if(!(contentsSizer)) { goto dkctGUILayoutFinished; } lOldSize = new wxStaticText( dkctGUIContentsPanel, wxID_ANY, sTexts[25], wxDefaultPosition, wxDefaultSize, wxALIGN_CENTRE ); if(!(lOldSize)) { goto dkctGUILayoutFinished; } contentsSizer->Add( lOldSize, wxGBPosition(0, 0), wxGBSpan(1, 2), wxALIGN_CENTER_HORIZONTAL ); lOldWidth = new wxStaticText( dkctGUIContentsPanel, wxID_ANY, sTexts[26], wxDefaultPosition, wxDefaultSize, wxALIGN_RIGHT ); if(!(lOldWidth)) { goto dkctGUILayoutFinished; } contentsSizer->Add( lOldWidth, wxGBPosition(1, 0), wxGBSpan(1, 1), wxALIGN_RIGHT ); vOldWidth = new wxStaticText( dkctGUIContentsPanel, wxID_ANY, sTexts[28], wxDefaultPosition, wxDefaultSize, wxALIGN_LEFT ); if(!(vOldWidth)) { goto dkctGUILayoutFinished; } contentsSizer->Add( vOldWidth, wxGBPosition(1, 1), wxGBSpan(1, 1), wxALIGN_LEFT ); lOldHeight = new wxStaticText( dkctGUIContentsPanel, wxID_ANY, sTexts[27], wxDefaultPosition, wxDefaultSize, wxALIGN_RIGHT ); if(!(lOldHeight)) { goto dkctGUILayoutFinished; } contentsSizer->Add( lOldHeight, wxGBPosition(2, 0), wxGBSpan(1, 1), wxALIGN_RIGHT ); vOldHeight = new wxStaticText( dkctGUIContentsPanel, wxID_ANY, sTexts[28], wxDefaultPosition, wxDefaultSize, wxALIGN_LEFT ); if(!(vOldHeight)) { goto dkctGUILayoutFinished; } contentsSizer->Add( vOldHeight, wxGBPosition(2, 1), wxGBSpan(1, 1), wxALIGN_LEFT ); contentsSizer->Add(1, 5, wxGBPosition(3, 0), wxGBSpan(1, 1)); lNewSize = new wxStaticText( dkctGUIContentsPanel, wxID_ANY, sTexts[29], wxDefaultPosition, wxDefaultSize, wxALIGN_CENTRE ); if(!(lNewSize)) { goto dkctGUILayoutFinished; } contentsSizer->Add( lNewSize, wxGBPosition(4, 0), wxGBSpan(1, 2), wxALIGN_CENTER_HORIZONTAL ); lNewWidth = new wxStaticText( dkctGUIContentsPanel, wxID_ANY, sTexts[26], wxDefaultPosition, wxDefaultSize, wxALIGN_RIGHT ); if(!(lNewWidth)) { goto dkctGUILayoutFinished; } contentsSizer->Add( lNewWidth, wxGBPosition(5, 0), wxGBSpan(1, 1), wxALIGN_RIGHT ); vNewWidth = new wxStaticText( dkctGUIContentsPanel, wxID_ANY, sTexts[28], wxDefaultPosition, wxDefaultSize, wxALIGN_LEFT ); if(!(vNewWidth)) { goto dkctGUILayoutFinished; } contentsSizer->Add( vNewWidth, wxGBPosition(5, 1), wxGBSpan(1, 1), wxALIGN_LEFT ); lNewHeight = new wxStaticText( dkctGUIContentsPanel, wxID_ANY, sTexts[27], wxDefaultPosition, wxDefaultSize, wxALIGN_RIGHT ); if(!(lNewHeight)) { goto dkctGUILayoutFinished; } contentsSizer->Add( lNewHeight, wxGBPosition(6, 0), wxGBSpan(1, 1), wxALIGN_RIGHT ); vNewHeight = new wxStaticText( dkctGUIContentsPanel, wxID_ANY, sTexts[28], wxDefaultPosition, wxDefaultSize, wxALIGN_LEFT ); if(!(vNewHeight)) { goto dkctGUILayoutFinished; } contentsSizer->Add( vNewHeight, wxGBPosition(6, 1), wxGBSpan(1, 1), wxALIGN_LEFT ); contentsSizer->Add(1, 5, wxGBPosition(7, 0), wxGBSpan(1, 1)); lResult = new wxStaticText( dkctGUIContentsPanel, wxID_ANY, sTexts[30], wxDefaultPosition, wxDefaultSize, wxALIGN_CENTRE ); if(!(lResult)) { goto dkctGUILayoutFinished; } contentsSizer->Add( lResult, wxGBPosition(8, 0), wxGBSpan(1, 2), wxALIGN_CENTER_HORIZONTAL ); lSsc = new wxStaticText( dkctGUIContentsPanel, wxID_ANY, sTexts[13], wxDefaultPosition, wxDefaultSize, wxALIGN_RIGHT ); if(!(lSsc)) { goto dkctGUILayoutFinished; } contentsSizer->Add( lSsc, wxGBPosition(9, 0), wxGBSpan(1, 1), wxALIGN_RIGHT ); lSsr = new wxStaticText( dkctGUIContentsPanel, wxID_ANY, sTexts[14], wxDefaultPosition, wxDefaultSize, wxALIGN_LEFT ); if(!(lSsr)) { goto dkctGUILayoutFinished; } contentsSizer->Add( lSsr, wxGBPosition(9, 1), wxGBSpan(1, 1), wxALIGN_LEFT ); verticalSizer->Add( contentsSizer ); verticalSizer->Add(10, 10, 0); mainSizer->Add( verticalSizer, 1, wxGROW ); mainSizer->Add(10, 10, 0); dkctGUIContentsPanel->SetSizer(mainSizer); SetIcon(wxdkscrsz_icon); dkctGUILayoutOK = true; dkctGUILayoutFinished: #if wxUSE_STATUSBAR if(dkctGUILayoutOK) { CreateStatusBar(1); SetStatusText(sTexts[8]); } #endif if(dkctGUILayoutOK) { mainSizer->Fit(this); mainSizer->SetSizeHints(this); } #line 394 "ScreenSizeFrame.wxc" if(dkctGUILayoutOK) { SetTitle(nlWx[0]); oAsc.SetAutoStart(true); oAsc.SetAutoExit(true); } /* __CHANGE__ 012: Release resources allocated by local variables. */ } #line 405 "ScreenSizeFrame.wxc" ScreenSizeFrame::~ScreenSizeFrame() { /* __CHANGE__ 011: Release resources allocated by further class members. */ } bool ScreenSizeFrame::CanClose(bool isLast) { bool back = true; /* __CHANGE__ 013: Check for unsaved data. */ return back; } void ScreenSizeFrame::OnQuit(wxCommandEvent & event) { Close(); } void ScreenSizeFrame::OnAbout(wxCommandEvent & event) { wxString text(wxT("")); wxString title(wxT("")); /* Construct message text. */ text.Append(sNlWx[0]); text.Append(sNlWx[7]); text.Append(sNlWx[1]); text.Append(sNlWx[8]); text.Append(sTexts[9]); text.Append(sNlWx[2]); text.Append(sNlWx[8]); text.Append(sNlWx[8]); text.Append(sTexts[11]); text.Append(sNlWx[8]); text.Append(sNlWx[9]); text.Append(sNlWx[8]); text.Append(sNlWx[8]); text.Append(sTexts[12]); text.Append(sNlWx[8]); text.Append(sNlWx[10]); text.Append(sNlWx[8]); text.Append(sNlWx[11]); text.Append(sNlWx[8]); text.Append(sNlWx[12]); text.Append(sNlWx[8]); text.Append(sNlWx[13]); text.Append(sNlWx[8]); text.Append(sNlWx[14]); text.Append(sNlWx[8]); text.Append(sNlWx[15]); text.Append(sNlWx[8]); /* Construct dialog box title. */ title.Append(sTexts[10]); title.Append(sNlWx[0]); /* Show dialog box. */ wxMessageBox(text, title); /* __CHANGE__ 019: Create better about box. */ } void ScreenSizeFrame::OnHelpContents(wxCommandEvent & event) { DisplayContents(); } /* __CHANGE__ 017: Event handlers for further events. */ /* __CHANGE__ 014: Implementation of further methods. */ #if DK4_ON_WINDOWS /** Current device mode. */ static DEVMODE devmode; /** New device mode. */ static DEVMODE newmode; #endif bool ScreenSizeFrame::ModifyScreenSize(const unsigned long *ulp, int action) { wxChar b1[64]; wxChar b2[64]; wxChar b3[64]; wxChar b4[64]; #if DK4_ON_WINDOWS DWORD dmfm = (DM_PELSWIDTH | DM_PELSHEIGHT); DWORD dwfl = 0; LONG res = 0L; #endif bool back = false; dk4ma_write_wx_decimal_unsigned( b1, DK4_SIZEOF(b1,wxChar), (dk4_um_t)(ulp[0]), 0, NULL ); dk4ma_write_wx_decimal_unsigned( b2, DK4_SIZEOF(b2,wxChar), (dk4_um_t)(ulp[1]), 0, NULL ); dk4ma_write_wx_decimal_unsigned( b3, DK4_SIZEOF(b3,wxChar), (dk4_um_t)(ulp[2]), 0, NULL ); dk4ma_write_wx_decimal_unsigned( b4, DK4_SIZEOF(b4,wxChar), (dk4_um_t)(ulp[3]), 0, NULL ); switch (action) { case ACTION_TOGGLE_SCREEN_SIZE : { vOldWidth->SetLabel(b3); vOldHeight->SetLabel(b4); vNewWidth->SetLabel(b1); vNewHeight->SetLabel(b2); } break; default : { vNewWidth->SetLabel(b1); vNewHeight->SetLabel(b2); } break; } Refresh(); Update(); #if DK4_ON_WINDOWS SecureZeroMemory(&devmode, sizeof(DEVMODE)); SecureZeroMemory(&newmode, sizeof(DEVMODE)); if (EnumDisplaySettingsW(NULL, ENUM_CURRENT_SETTINGS, &devmode)) { if (dmfm == (dmfm & (devmode.dmFields))) { DK4_MEMCPY(&newmode, &devmode, sizeof(DEVMODE)); dk4ma_write_wx_decimal_unsigned( b1, DK4_SIZEOF(b1,wxChar), (dk4_um_t)(devmode.dmPelsWidth), 0, NULL ); dk4ma_write_wx_decimal_unsigned( b2, DK4_SIZEOF(b2,wxChar), (dk4_um_t)(devmode.dmPelsHeight), 0, NULL ); vOldWidth->SetLabel(b1); vOldHeight->SetLabel(b2); Refresh(); Update(); switch (action) { case ACTION_TOGGLE_SCREEN_SIZE : { if (ulp[0] == devmode.dmPelsWidth) { if (ulp[1] == devmode.dmPelsHeight) { newmode.dmPelsWidth = ulp[2]; newmode.dmPelsHeight = ulp[3]; vOldWidth->SetLabel(b1); vOldHeight->SetLabel(b2); vNewWidth->SetLabel(b3); vNewHeight->SetLabel(b4); Refresh(); Update(); } else { newmode.dmPelsWidth = ulp[0]; newmode.dmPelsHeight = ulp[1]; } } else { newmode.dmPelsWidth = ulp[0]; newmode.dmPelsHeight = ulp[1]; } } break; default : { newmode.dmPelsWidth = ulp[0]; newmode.dmPelsHeight = ulp[1]; } break; } newmode.dmFields |= dmfm; res = ChangeDisplaySettingsEx(NULL, &newmode, NULL, dwfl, NULL); if (DISP_CHANGE_SUCCESSFUL == res) { back = true; } else { /* ERROR: Failed to change screen size */ wxMessageBox( sTexts[20], sTexts[18], (wxOK | wxCENTRE | wxICON_ERROR) ); } } else { /* ERROR: Failed to retrieve current settings */ wxMessageBox( sTexts[19], sTexts[18], (wxOK | wxCENTRE | wxICON_ERROR) ); } } else { /* ERROR: Failed to retrieve current settings */ wxMessageBox( sTexts[19], sTexts[18], (wxOK | wxCENTRE | wxICON_ERROR) ); } #else wxMessageBox( sTexts[21], sTexts[18], (wxOK | wxCENTRE | wxICON_ERROR) ); back = false; #endif return back; } void ScreenSizeFrame::ShowUnusableText(const wxChar *str) { wxString s(sTexts[22]); s.Append(str); s.Append(sTexts[23]); wxMessageBox(s, sTexts[18], (wxOK | wxCENTRE | wxICON_ERROR)); } bool ScreenSizeFrame::ChangeScreenSize(void) { const wxChar *ep = NULL; long lv[] = { 0L, 0L, 0L, 0L }; unsigned long ulv[] = { 0UL, 0UL, 0UL, 0UL }; int action = ACTION_SET_SCREEN_SIZE; int res = 0; bool back = false; bool found = false; #line 650 "ScreenSizeFrame.wxc" switch (iArgc) { case 5 : { back = true; ep = NULL; res = dk4ma_input_wx_dec_ulong(&(ulv[0]), ppArgv[1], &ep, 1, NULL); if (0 == res) { back = false; ShowUnusableText(ppArgv[1]); } if (back) { ep = NULL; res = dk4ma_input_wx_dec_ulong(&(ulv[1]),ppArgv[2],&ep,1,NULL); if (0 == res) { ShowUnusableText(ppArgv[2]); back = false; } } if (back) { ep = NULL; res = dk4ma_input_wx_dec_ulong(&(ulv[2]),ppArgv[3],&ep,1,NULL); if (0 == res) { ShowUnusableText(ppArgv[3]); back = false; } } if (back) { ep = NULL; res = dk4ma_input_wx_dec_ulong(&(ulv[3]),ppArgv[4],&ep,1,NULL); if (0 == res) { ShowUnusableText(ppArgv[4]); back = false; } } if (back) { back = ModifyScreenSize(ulv, ACTION_TOGGLE_SCREEN_SIZE); } } break; case 3 : { back = true; ep = NULL; res = dk4ma_input_wx_dec_ulong(&(ulv[0]), ppArgv[1], &ep, 1, NULL); if (0 == res) { ShowUnusableText(ppArgv[1]); back = false; } if (back) { ep = NULL; res = dk4ma_input_wx_dec_ulong(&(ulv[1]),ppArgv[2],&ep,1,NULL); if (0 == res) { ShowUnusableText(ppArgv[2]); back = false; } } if (back) { back = ModifyScreenSize(ulv, ACTION_SET_SCREEN_SIZE); } } break; case 1 : { action = ACTION_REPORT_NO_ARGS_NO_SETTINGS; if (pAppHelp->GetMultiple(settingsNames, lv, 4)) { if (0L < lv[0]) { if (0L < lv[1]) { if (0L < lv[2]) { if (0L < lv[3]) { ulv[0] = (unsigned long)(lv[0]); ulv[1] = (unsigned long)(lv[1]); ulv[2] = (unsigned long)(lv[2]); ulv[3] = (unsigned long)(lv[3]); found = true; back = ModifyScreenSize( ulv, ACTION_TOGGLE_SCREEN_SIZE ); } } else { ulv[0] = (unsigned long)(lv[0]); ulv[1] = (unsigned long)(lv[1]); found = true; back = ModifyScreenSize( ulv, ACTION_SET_SCREEN_SIZE ); } } } } else { } if (!(found)) { wxMessageBox( sTexts[24], sTexts[18], (wxOK | wxCENTRE | wxICON_ERROR) ); } } break; default : { wxMessageBox( sTexts[24], sTexts[18], (wxOK | wxCENTRE | wxICON_ERROR) ); } break; } if (back) { lSsr->SetLabel(sTexts[16]); lSsr->SetForegroundColour(cGreen); } else { lSsr->SetLabel(sTexts[17]); lSsr->SetForegroundColour(cRed); } Refresh(); Update(); #line 761 "ScreenSizeFrame.wxc" return back; } /* __CHANGE__ 008: Remove OnIdle if no idle processing required. */ void ScreenSizeFrame::OnIdle(wxIdleEvent & event) { #if AUTO_EXIT_ONLY_ON_SUCCESS bool bSuccess; #endif #line 775 "ScreenSizeFrame.wxc" /* __CHANGE__ */ if (bActive) { switch (oAsc.GetReaction()) { #if 0 case Dk4WxAutostartController::REACTION_IGNORE : { } break; #endif case Dk4WxAutostartController::REACTION_START : { oAsc.StartProcessing(); #if AUTO_EXIT_ONLY_ON_SUCCESS bSuccess = ChangeScreenSize(); oAsc.EndProcessing(bSuccess); #else (void)ChangeScreenSize(); oAsc.EndProcessing(true); #endif } break; case Dk4WxAutostartController::REACTION_MORE : { } break; case Dk4WxAutostartController::REACTION_EXIT : { bActive = false; Close(); } break; } event.RequestMore(); } #line 803 "ScreenSizeFrame.wxc" event.Skip(); } /* vim: set ai sw=4 ts=4 : */