Update to v106r48 release.

byuu says:

The problems with the Windows and Qt4 ports have all been resolved,
although there's a fairly gross hack on a few Qt widgets to not destruct
once Application::quit() is called to avoid a double free crash (I'm
unsure where Qt is destructing the widgets internally.) The Cocoa port
compiles again at least, though it's bound to have endless problems. I
improved the Label painting in the GTK ports, which fixes the background
color on labels inside TabFrame widgets.

I've optimized the Makefile system even further.

I added a "redo state" command to bsnes, which is created whenever you
load the undo state. There are also hotkeys for both now, although I
don't think they're really something you want to map hotkeys to.

I moved the nall::Locale object inside hiro::Application, so that it can
be used to translate the BrowserDialog and MessageDialog window strings.

I improved the Super Game Boy emulation of `MLT_REQ`, fixing Pokemon
Yellow's custom border and probably more stuff.

Lots of other small fixes and improvements. Things are finally stable
once again after the harrowing layout redesign catastrophe.

Errata:

  - ICD::joypID should be set to 3 on reset(). joypWrite() may as well
    take uint1 instead of bool.
  - hiro/Qt: remove pWindow::setMaximumSize() comment; found a
    workaround for it
  - nall/GNUmakefile: don't set object.path if it's already set (allow
    overrides before including the file)
This commit is contained in:
Tim Allen
2018-07-16 16:16:26 +10:00
parent 6090c63958
commit 393c2395bb
78 changed files with 701 additions and 658 deletions

View File

@@ -131,6 +131,7 @@ auto pApplication::initialize() -> void {
#endif
pKeyboard::initialize();
pWindow::initialize();
}
static auto Application_keyboardProc(HWND hwnd, UINT msg, WPARAM wparam, LPARAM lparam) -> bool {

View File

@@ -1,12 +1,5 @@
namespace hiro {
struct pFont;
struct pObject;
struct pWindow;
struct pMenu;
struct pLayout;
struct pWidget;
struct AppMessage {
enum : uint {
None = WM_APP,

View File

@@ -6,37 +6,49 @@ auto pStatusBar::construct() -> void {
if(auto parent = _parent()) {
hwnd = CreateWindow(STATUSCLASSNAME, L"", WS_CHILD, 0, 0, 0, 0, parent->hwnd, nullptr, GetModuleHandle(0), 0);
SetWindowLongPtr(hwnd, GWLP_USERDATA, (LONG_PTR)&reference);
setEnabled(self().enabled(true));
setFont(self().font(true));
setEnabled(self().enabled());
setFont(self().font());
setText(self().text());
setVisible(self().visible(true));
setVisible(self().visible());
}
}
auto pStatusBar::destruct() -> void {
if(hfont) { DeleteObject(hfont); hfont = nullptr; }
if(hwnd) { DestroyWindow(hwnd); hwnd = nullptr; }
if(auto parent = _parent()) {
parent->setGeometry(parent->state().geometry);
}
}
auto pStatusBar::setEnabled(bool enabled) -> void {
auto pStatusBar::setEnabled(bool) -> void {
//unsupported
}
auto pStatusBar::setFont(const Font& font) -> void {
auto pStatusBar::setFont(const Font&) -> void {
auto font = self().font(true);
if(hfont) DeleteObject(hfont);
hfont = pFont::create(font);
if(hwnd) SendMessage(hwnd, WM_SETFONT, (WPARAM)hfont, 0);
SendMessage(hwnd, WM_SETFONT, (WPARAM)hfont, 0);
auto& text = state().text;
auto height = font.size(text ? text : " ").height();
SendMessage(hwnd, SB_SETMINHEIGHT, (WPARAM)height, 0);
if(auto parent = _parent()) {
parent->setGeometry(parent->state().geometry);
}
}
auto pStatusBar::setText(const string& text) -> void {
if(hwnd) SendMessage(hwnd, SB_SETTEXT, 0, (LPARAM)(wchar_t*)utf16_t(text));
auto pStatusBar::setText(const string&) -> void {
auto& text = state().text;
SendMessage(hwnd, WM_SETTEXT, 0, (LPARAM)(wchar_t*)utf16_t(text));
}
auto pStatusBar::setVisible(bool visible) -> void {
if(hwnd) ShowWindow(hwnd, visible ? SW_SHOWNORMAL : SW_HIDE);
auto pStatusBar::setVisible(bool) -> void {
ShowWindow(hwnd, self().visible() ? SW_SHOWNORMAL : SW_HIDE);
if(auto parent = _parent()) {
parent->setGeometry(parent->state().geometry);
}
@@ -46,7 +58,7 @@ auto pStatusBar::_parent() -> maybe<pWindow&> {
if(auto parent = self().parentWindow(true)) {
if(auto self = parent->self()) return *self;
}
return nothing;
return {};
}
}

View File

@@ -219,6 +219,20 @@ static auto CALLBACK Shared_windowProc(WindowProc windowProc, HWND hwnd, UINT ms
break;
}
case WM_GETMINMAXINFO: {
auto info = (LPMINMAXINFO)lparam;
auto frameMargin = pWindow->frameMargin();
if(auto minimumSize = window->state.minimumSize) {
info->ptMinTrackSize.x = minimumSize.width() + frameMargin.width();
info->ptMinTrackSize.y = minimumSize.height() + frameMargin.height();
}
if(auto maximumSize = window->state.maximumSize) {
info->ptMaxTrackSize.x = maximumSize.width() + frameMargin.width();
info->ptMaxTrackSize.y = maximumSize.height() + frameMargin.height();
}
break;
}
case WM_MENUCOMMAND: {
return Menu_windowProc(hwnd, msg, wparam, lparam);
}

View File

@@ -5,6 +5,19 @@ namespace hiro {
static const uint FixedStyle = WS_SYSMENU | WS_CAPTION | WS_MINIMIZEBOX | WS_BORDER | WS_CLIPCHILDREN;
static const uint ResizableStyle = WS_SYSMENU | WS_CAPTION | WS_MINIMIZEBOX | WS_MAXIMIZEBOX | WS_THICKFRAME | WS_CLIPCHILDREN;
uint pWindow::minimumStatusHeight = 0;
auto pWindow::initialize() -> void {
HWND hwnd = CreateWindow(L"hiroWindow", L"", ResizableStyle, 128, 128, 256, 256, 0, 0, GetModuleHandle(0), 0);
HWND hstatus = CreateWindow(STATUSCLASSNAME, L"", WS_CHILD, 0, 0, 0, 0, hwnd, nullptr, GetModuleHandle(0), 0);
SetWindowPos(hstatus, nullptr, 0, 0, 0, 0, SWP_NOACTIVATE | SWP_NOZORDER | SWP_FRAMECHANGED);
RECT rc;
GetWindowRect(hstatus, &rc);
minimumStatusHeight = rc.bottom - rc.top;
DestroyWindow(hstatus);
DestroyWindow(hwnd);
}
auto pWindow::construct() -> void {
hwnd = CreateWindow(L"hiroWindow", L"", ResizableStyle, 128, 128, 256, 256, 0, 0, GetModuleHandle(0), 0);
SetWindowLongPtr(hwnd, GWLP_USERDATA, (LONG_PTR)&reference);
@@ -35,21 +48,11 @@ auto pWindow::focused() const -> bool {
}
auto pWindow::frameMargin() const -> Geometry {
unsigned style = state().resizable ? ResizableStyle : FixedStyle;
if(state().fullScreen) style = 0;
RECT rc{0, 0, 640, 480};
AdjustWindowRect(&rc, style, (bool)GetMenu(hwnd));
signed statusHeight = 0;
if(auto& statusBar = state().statusBar) {
if(auto self = statusBar->self()) {
if(statusBar->visible()) {
RECT src;
GetClientRect(self->hwnd, &src);
statusHeight = src.bottom - src.top;
}
}
}
return {abs(rc.left), abs(rc.top), (rc.right - rc.left) - 640, (rc.bottom - rc.top) + statusHeight - 480};
uint style = state().fullScreen ? 0 : state().resizable ? ResizableStyle : FixedStyle;
bool menuVisible = state().menuBar && state().menuBar->visible();
AdjustWindowRect(&rc, style, menuVisible);
return {abs(rc.left), abs(rc.top), (rc.right - rc.left) - 640, (rc.bottom - rc.top) + _statusHeight() - 480};
}
auto pWindow::remove(sMenuBar menuBar) -> void {
@@ -183,14 +186,9 @@ auto pWindow::setTitle(string text) -> void {
}
auto pWindow::setVisible(bool visible) -> void {
lock();
auto lock = acquire();
ShowWindow(hwnd, visible ? SW_SHOWNORMAL : SW_HIDE);
if(!visible) setModal(false);
if(auto& sizable = state().sizable) {
if(auto self = sizable->self()) self->setVisible(sizable->visible(true));
}
unlock();
}
//
@@ -301,6 +299,18 @@ auto pWindow::_modalityUpdate() -> void {
}
}
auto pWindow::_statusHeight() const -> int {
int height = 0;
if(auto& statusBar = state().statusBar) {
if(statusBar->visible()) {
auto& text = statusBar->state.text;
height = statusBar->font(true).size(text ? text : " ").height();
height = max(height, minimumStatusHeight);
}
}
return height;
}
}
#endif

View File

@@ -5,6 +5,10 @@ namespace hiro {
struct pWindow : pObject {
Declare(Window, Object)
static auto initialize() -> void;
static uint minimumStatusHeight;
auto append(sMenuBar menuBar) -> void;
auto append(sSizable sizable) -> void;
auto append(sStatusBar statusBar) -> void;
@@ -42,6 +46,7 @@ struct pWindow : pObject {
auto _modalityCount() -> unsigned;
auto _modalityDisabled() -> bool;
auto _modalityUpdate() -> void;
auto _statusHeight() const -> int;
HWND hwnd = nullptr;
HFONT hstatusfont = nullptr;