mirror of
https://github.com/bsnes-emu/bsnes.git
synced 2025-08-24 02:53:11 +02:00
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:
@@ -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 {
|
||||
|
@@ -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,
|
||||
|
@@ -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 {};
|
||||
}
|
||||
|
||||
}
|
||||
|
@@ -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);
|
||||
}
|
||||
|
@@ -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
|
||||
|
@@ -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;
|
||||
|
Reference in New Issue
Block a user