- Add source hashing to stamp system (functions.sh) for detecting when dependencies need rebuild based on source file changes - Update build-pcbnew.sh to use source stamps for wxWidgets - Add global-setup.ts to clean logs before test runs - Add maximize_test standalone test to verify wxFrame::Maximize() works correctly in WASM (it does - window is 1280x720) - Update Makefile.wasm with maximize test build rules The maximize_test proves wxWidgets display detection works fine. KiCad's 20x20 window bug is KiCad-specific, not a wxWidgets issue. 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
179 lines
5.1 KiB
C++
179 lines
5.1 KiB
C++
// Maximize Test - Tests wxFrame::Maximize() which KiCad uses
|
|
// This reproduces the bug where Maximize() returns a tiny window when
|
|
// GetScreenSize() returns incorrect values at startup.
|
|
|
|
#include "wx/wxprec.h"
|
|
|
|
#ifndef WX_PRECOMP
|
|
#include "wx/wx.h"
|
|
#endif
|
|
|
|
#include "wx/display.h"
|
|
|
|
#ifdef __EMSCRIPTEN__
|
|
#include <emscripten/emscripten.h>
|
|
#endif
|
|
|
|
class MaximizeTestApp : public wxApp
|
|
{
|
|
public:
|
|
virtual bool OnInit() override;
|
|
};
|
|
|
|
class MaximizeTestFrame : public wxFrame
|
|
{
|
|
public:
|
|
MaximizeTestFrame();
|
|
|
|
private:
|
|
wxStaticText* m_sizeLabel;
|
|
wxStaticText* m_displayLabel;
|
|
|
|
void UpdateSizeDisplay();
|
|
void OnSize(wxSizeEvent& evt);
|
|
void OnMaximize(wxCommandEvent& evt);
|
|
void OnRestore(wxCommandEvent& evt);
|
|
|
|
wxDECLARE_EVENT_TABLE();
|
|
};
|
|
|
|
enum {
|
|
ID_MAXIMIZE = wxID_HIGHEST + 1,
|
|
ID_RESTORE
|
|
};
|
|
|
|
wxBEGIN_EVENT_TABLE(MaximizeTestFrame, wxFrame)
|
|
EVT_SIZE(MaximizeTestFrame::OnSize)
|
|
EVT_BUTTON(ID_MAXIMIZE, MaximizeTestFrame::OnMaximize)
|
|
EVT_BUTTON(ID_RESTORE, MaximizeTestFrame::OnRestore)
|
|
wxEND_EVENT_TABLE()
|
|
|
|
wxIMPLEMENT_APP(MaximizeTestApp);
|
|
|
|
bool MaximizeTestApp::OnInit()
|
|
{
|
|
if (!wxApp::OnInit())
|
|
return false;
|
|
|
|
// Create frame WITHOUT explicit size - uses wxDefaultSize
|
|
// This is what KiCad does
|
|
MaximizeTestFrame* frame = new MaximizeTestFrame();
|
|
|
|
// KiCad calls Maximize() after creation
|
|
frame->Maximize(true);
|
|
|
|
frame->Show(true);
|
|
return true;
|
|
}
|
|
|
|
MaximizeTestFrame::MaximizeTestFrame()
|
|
: wxFrame(nullptr, wxID_ANY, "Maximize Test",
|
|
wxDefaultPosition, wxDefaultSize) // No explicit size!
|
|
{
|
|
wxBoxSizer* mainSizer = new wxBoxSizer(wxVERTICAL);
|
|
|
|
wxStaticText* desc = new wxStaticText(this, wxID_ANY,
|
|
"Maximize Test\n\n"
|
|
"This test reproduces the KiCad startup issue.\n"
|
|
"The frame is created with wxDefaultSize and Maximize() is called.\n"
|
|
"If display size detection works, the window should be fullscreen.");
|
|
mainSizer->Add(desc, 0, wxALL, 10);
|
|
|
|
// Display info
|
|
wxStaticBoxSizer* infoBox = new wxStaticBoxSizer(wxVERTICAL, this, "Display Info");
|
|
|
|
m_displayLabel = new wxStaticText(this, wxID_ANY, "Display: querying...");
|
|
infoBox->Add(m_displayLabel, 0, wxALL, 5);
|
|
|
|
m_sizeLabel = new wxStaticText(this, wxID_ANY, "Window size: querying...");
|
|
infoBox->Add(m_sizeLabel, 0, wxALL, 5);
|
|
|
|
mainSizer->Add(infoBox, 0, wxEXPAND | wxALL, 10);
|
|
|
|
// Buttons
|
|
wxBoxSizer* btnSizer = new wxBoxSizer(wxHORIZONTAL);
|
|
btnSizer->Add(new wxButton(this, ID_MAXIMIZE, "Maximize"), 0, wxALL, 5);
|
|
btnSizer->Add(new wxButton(this, ID_RESTORE, "Restore"), 0, wxALL, 5);
|
|
mainSizer->Add(btnSizer, 0, wxALIGN_CENTER | wxALL, 10);
|
|
|
|
SetSizer(mainSizer);
|
|
|
|
// Query display info
|
|
wxDisplay display(wxDisplay::GetFromWindow(this));
|
|
wxRect geom = display.GetGeometry();
|
|
wxRect client = display.GetClientArea();
|
|
|
|
wxString displayInfo = wxString::Format(
|
|
"Display geometry: %dx%d, Client area: %dx%d",
|
|
geom.GetWidth(), geom.GetHeight(),
|
|
client.GetWidth(), client.GetHeight());
|
|
m_displayLabel->SetLabel(displayInfo);
|
|
|
|
#ifdef __EMSCRIPTEN__
|
|
EM_ASM({
|
|
console.log('[MAXIMIZE_TEST] Display geometry: ' + $0 + 'x' + $1);
|
|
console.log('[MAXIMIZE_TEST] Client area: ' + $2 + 'x' + $3);
|
|
}, geom.GetWidth(), geom.GetHeight(), client.GetWidth(), client.GetHeight());
|
|
#endif
|
|
|
|
// Update size display after creation
|
|
CallAfter(&MaximizeTestFrame::UpdateSizeDisplay);
|
|
|
|
#ifdef __EMSCRIPTEN__
|
|
EM_ASM({
|
|
console.log('[MAXIMIZE_TEST] Maximize test app started');
|
|
});
|
|
#endif
|
|
}
|
|
|
|
void MaximizeTestFrame::UpdateSizeDisplay()
|
|
{
|
|
wxSize size = GetSize();
|
|
wxSize clientSize = GetClientSize();
|
|
|
|
wxString sizeInfo = wxString::Format(
|
|
"Window size: %dx%d, Client: %dx%d, Maximized: %s",
|
|
size.GetWidth(), size.GetHeight(),
|
|
clientSize.GetWidth(), clientSize.GetHeight(),
|
|
IsMaximized() ? "YES" : "NO");
|
|
m_sizeLabel->SetLabel(sizeInfo);
|
|
|
|
#ifdef __EMSCRIPTEN__
|
|
EM_ASM({
|
|
console.log('[MAXIMIZE_TEST] Window size: ' + $0 + 'x' + $1);
|
|
console.log('[MAXIMIZE_TEST] Client size: ' + $2 + 'x' + $3);
|
|
console.log('[MAXIMIZE_TEST] Is maximized: ' + ($4 ? 'YES' : 'NO'));
|
|
|
|
// Test assertion: window should be larger than 100px if maximize worked
|
|
if ($0 < 100 || $1 < 100) {
|
|
console.error('[MAXIMIZE_TEST] FAIL: Window is too small! Expected fullscreen, got ' + $0 + 'x' + $1);
|
|
} else {
|
|
console.log('[MAXIMIZE_TEST] PASS: Window size is reasonable');
|
|
}
|
|
}, size.GetWidth(), size.GetHeight(),
|
|
clientSize.GetWidth(), clientSize.GetHeight(),
|
|
IsMaximized() ? 1 : 0);
|
|
#endif
|
|
}
|
|
|
|
void MaximizeTestFrame::OnSize(wxSizeEvent& evt)
|
|
{
|
|
evt.Skip();
|
|
CallAfter(&MaximizeTestFrame::UpdateSizeDisplay);
|
|
}
|
|
|
|
void MaximizeTestFrame::OnMaximize(wxCommandEvent& WXUNUSED(evt))
|
|
{
|
|
#ifdef __EMSCRIPTEN__
|
|
EM_ASM({ console.log('[MAXIMIZE_TEST] Maximize button clicked'); });
|
|
#endif
|
|
Maximize(true);
|
|
}
|
|
|
|
void MaximizeTestFrame::OnRestore(wxCommandEvent& WXUNUSED(evt))
|
|
{
|
|
#ifdef __EMSCRIPTEN__
|
|
EM_ASM({ console.log('[MAXIMIZE_TEST] Restore button clicked'); });
|
|
#endif
|
|
Maximize(false);
|
|
}
|