Update to v094r42 release.

byuu says:

I imagine you guys will like this WIP very much.

Changelog:
- ListView check boxes on Windows
- ListView removal of columns on reset (changing input dropdowns)
- DirectSound audio duplication on latency change
- DirectSound crash on 20ms latency
- Fullscreen window sizing in multi-monitor setups
- Allow joypad bindings of hotkeys
- Allow triggers to be mapped (Xbox 360 / XInput / Windows only)
- Support joypad rumble for Game Boy Player
- Video scale settings modified from {1x,2x,3x} to {2x,3x,4x}
- System menu now renames to active emulation core
- Added fast forward hotkey

Not changing for v095:
- not adding input focus settings yet
- not adding shaders yet

Not changing at all:
- not implementing maximize
This commit is contained in:
Tim Allen
2015-08-24 19:42:11 +10:00
parent 7081f46e45
commit c45633550e
21 changed files with 136 additions and 75 deletions

View File

@@ -6,7 +6,7 @@ static const unsigned WindowsVista = 0x0600;
static const unsigned Windows7 = 0x0601;
static auto OsVersion() -> unsigned {
OSVERSIONINFO versionInfo = {0};
OSVERSIONINFO versionInfo{0};
versionInfo.dwOSVersionInfoSize = sizeof(OSVERSIONINFO);
GetVersionEx(&versionInfo);
return (versionInfo.dwMajorVersion << 8) + (versionInfo.dwMajorVersion << 0);
@@ -283,6 +283,20 @@ static auto CALLBACK Shared_windowProc(WindowProc windowProc, HWND hwnd, UINT ms
}
case WM_NOTIFY: {
//WC_TABCONTROL requires parenting widgets to it; rather than the WINDOW
//without doing this; backgrounds on transparent controls (eg STATIC) are painted wrong
//this causes some WC_LISTVIEW WM_NOTIFY messages to only go to the WC_TABCONTROL WNDPROC
//all other controls also send their messages to the WC_TABCONTROL WNDPROC
//to avoid duplicating all message logic, hiro shares a WNDPROC with Window and TabFrame
//LVN_ITEM(ACTIVATE,CHANGED) are only sent to the TabFrame, as expected
//yet for unknown reasons, LVN_COLUMNCLICK and NM_(CLICK,DBLCLK,RCLICK) are
//sent to both the TabFrame, and then again to the Window's WNDPROC
//this causes on(Sort,Toggle,Context) to trigger callbacks twice
//if we try to block propagation to the Window (via return instead of break); then
//this will result in the LVN_ITEM(ACTIVATE,CHANGED) never being invoked (unsure why)
//as a workaround; we must detect these message to the Windows' WNDPROC, and block them
bool isWindowCallback = (object == window);
auto header = (LPNMHDR)lparam;
auto object = (mObject*)GetWindowLongPtr((HWND)header->hwndFrom, GWLP_USERDATA);
if(!object) break;
@@ -298,15 +312,16 @@ static auto CALLBACK Shared_windowProc(WindowProc windowProc, HWND hwnd, UINT ms
break;
}
if(header->code == LVN_COLUMNCLICK) {
listView->self()->onSort(lparam);
if(!isWindowCallback) listView->self()->onSort(lparam);
break;
}
if(header->code == NM_CLICK || header->code == NM_DBLCLK) {
listView->self()->onToggle(lparam);
//onToggle performs the test to ensure the ListViewItem clicked was checkable
if(!isWindowCallback) listView->self()->onToggle(lparam);
break;
}
if(header->code == NM_RCLICK) {
listView->self()->onContext(lparam);
if(!isWindowCallback) listView->self()->onContext(lparam);
break;
}
if(header->code == NM_CUSTOMDRAW) {

View File

@@ -52,6 +52,10 @@ auto pListView::append(sListViewItem item) -> void {
}
auto pListView::remove(sListViewHeader header) -> void {
LVCOLUMN lvColumn{LVCF_WIDTH};
while(ListView_GetColumn(hwnd, 0, &lvColumn)) {
ListView_DeleteColumn(hwnd, 0);
}
}
auto pListView::remove(sListViewItem item) -> void {

View File

@@ -91,10 +91,8 @@ auto pWindow::setFont(const string& font) -> void {
auto pWindow::setFullScreen(bool fullScreen) -> void {
auto style = GetWindowLongPtr(hwnd, GWL_STYLE) & WS_VISIBLE;
lock();
if(fullScreen == false) {
SetWindowLongPtr(hwnd, GWL_STYLE, style | (state().resizable ? ResizableStyle : FixedStyle));
setGeometry(state().geometry);
} else {
if(fullScreen) {
windowedGeometry = self().geometry();
HMONITOR monitor = MonitorFromWindow(hwnd, MONITOR_DEFAULTTONEAREST);
MONITORINFOEX info;
memset(&info, 0, sizeof(MONITORINFOEX));
@@ -104,10 +102,13 @@ auto pWindow::setFullScreen(bool fullScreen) -> void {
Geometry geometry = {rc.left, rc.top, rc.right - rc.left, rc.bottom - rc.top};
SetWindowLongPtr(hwnd, GWL_STYLE, style | WS_POPUP);
Geometry margin = frameMargin();
setGeometry({
self().setGeometry({
geometry.x() + margin.x(), geometry.y() + margin.y(),
geometry.width() - margin.width(), geometry.height() - margin.height()
});
} else {
SetWindowLongPtr(hwnd, GWL_STYLE, style | (state().resizable ? ResizableStyle : FixedStyle));
self().setGeometry(windowedGeometry);
}
unlock();
}
@@ -116,7 +117,7 @@ auto pWindow::setGeometry(Geometry geometry) -> void {
lock();
Geometry margin = frameMargin();
SetWindowPos(
hwnd, NULL,
hwnd, nullptr,
geometry.x() - margin.x(), geometry.y() - margin.y(),
geometry.width() + margin.width(), geometry.height() + margin.height(),
SWP_NOZORDER | SWP_FRAMECHANGED

View File

@@ -42,6 +42,7 @@ struct pWindow : pObject {
HFONT hstatusfont = nullptr;
HBRUSH hbrush = nullptr;
COLORREF hbrushColor = 0;
Geometry windowedGeometry{128, 128, 256, 256};
};
}