Added the ability to size the window to a specific resolution, closes #1362;
Fixed unsolicited mouse captures after a double-click in an open file dialog, fixes #1367.
This commit is contained in:
@@ -28,6 +28,7 @@
|
|||||||
#define DLG_STATUS 102 /* top-level dialog */
|
#define DLG_STATUS 102 /* top-level dialog */
|
||||||
#define DLG_SND_GAIN 103 /* top-level dialog */
|
#define DLG_SND_GAIN 103 /* top-level dialog */
|
||||||
#define DLG_NEW_FLOPPY 104 /* top-level dialog */
|
#define DLG_NEW_FLOPPY 104 /* top-level dialog */
|
||||||
|
#define DLG_SPECIFY_DIM 105 /* top-level dialog */
|
||||||
#define DLG_CONFIG 110 /* top-level dialog */
|
#define DLG_CONFIG 110 /* top-level dialog */
|
||||||
#define DLG_CFG_MACHINE 111 /* sub-dialog of config */
|
#define DLG_CFG_MACHINE 111 /* sub-dialog of config */
|
||||||
#define DLG_CFG_VIDEO 112 /* sub-dialog of config */
|
#define DLG_CFG_VIDEO 112 /* sub-dialog of config */
|
||||||
@@ -256,7 +257,6 @@
|
|||||||
#define IDC_COMBO_DISK_SIZE 1201
|
#define IDC_COMBO_DISK_SIZE 1201
|
||||||
#define IDC_COMBO_RPM_MODE 1202
|
#define IDC_COMBO_RPM_MODE 1202
|
||||||
|
|
||||||
|
|
||||||
/* For the DeviceConfig code, re-do later. */
|
/* For the DeviceConfig code, re-do later. */
|
||||||
#define IDC_CONFIG_BASE 1300
|
#define IDC_CONFIG_BASE 1300
|
||||||
#define IDC_CONFIGURE_VID 1300
|
#define IDC_CONFIGURE_VID 1300
|
||||||
@@ -277,6 +277,10 @@
|
|||||||
#define IDC_RENDER 1381
|
#define IDC_RENDER 1381
|
||||||
#define IDC_STATUS 1382
|
#define IDC_STATUS 1382
|
||||||
|
|
||||||
|
#define IDC_EDIT_WIDTH 1400 /* specify main window dimensions dialog */
|
||||||
|
#define IDC_WIDTHSPIN 1401
|
||||||
|
#define IDC_EDIT_HEIGHT 1402
|
||||||
|
#define IDC_HEIGHTSPIN 1403
|
||||||
|
|
||||||
#define IDM_ABOUT 40001
|
#define IDM_ABOUT 40001
|
||||||
#define IDC_ABOUT_ICON 65535
|
#define IDC_ABOUT_ICON 65535
|
||||||
@@ -308,12 +312,13 @@
|
|||||||
#define IDM_VID_SCALE_2X 40056
|
#define IDM_VID_SCALE_2X 40056
|
||||||
#define IDM_VID_SCALE_3X 40057
|
#define IDM_VID_SCALE_3X 40057
|
||||||
#define IDM_VID_SCALE_4X 40058
|
#define IDM_VID_SCALE_4X 40058
|
||||||
#define IDM_VID_HIDPI 40059
|
#define IDM_VID_HIDPI 40059
|
||||||
#define IDM_VID_FULLSCREEN 40060
|
#define IDM_VID_FULLSCREEN 40060
|
||||||
#define IDM_VID_FS_FULL 40061
|
#define IDM_VID_FS_FULL 40061
|
||||||
#define IDM_VID_FS_43 40062
|
#define IDM_VID_FS_43 40062
|
||||||
#define IDM_VID_FS_KEEPRATIO 40063
|
#define IDM_VID_FS_KEEPRATIO 40063
|
||||||
#define IDM_VID_FS_INT 40064
|
#define IDM_VID_FS_INT 40064
|
||||||
|
#define IDM_VID_SPECIFY_DIM 40065
|
||||||
#define IDM_VID_FORCE43 40066
|
#define IDM_VID_FORCE43 40066
|
||||||
#define IDM_VID_OVERSCAN 40067
|
#define IDM_VID_OVERSCAN 40067
|
||||||
#define IDM_VID_INVERT 40069
|
#define IDM_VID_INVERT 40069
|
||||||
|
|||||||
@@ -174,6 +174,10 @@ extern void SoundGainDialogCreate(HWND hwnd);
|
|||||||
extern void NewFloppyDialogCreate(HWND hwnd, int id, int part);
|
extern void NewFloppyDialogCreate(HWND hwnd, int id, int part);
|
||||||
|
|
||||||
|
|
||||||
|
/* Functions in win_specify_dim.c: */
|
||||||
|
extern void SpecifyDimensionsDialogCreate(HWND hwnd);
|
||||||
|
|
||||||
|
|
||||||
/* Functions in win_settings.c: */
|
/* Functions in win_settings.c: */
|
||||||
#define SETTINGS_PAGE_MACHINE 0
|
#define SETTINGS_PAGE_MACHINE 0
|
||||||
#define SETTINGS_PAGE_VIDEO 1
|
#define SETTINGS_PAGE_VIDEO 1
|
||||||
|
|||||||
@@ -71,6 +71,7 @@ BEGIN
|
|||||||
#endif
|
#endif
|
||||||
END
|
END
|
||||||
MENUITEM SEPARATOR
|
MENUITEM SEPARATOR
|
||||||
|
MENUITEM "Specify dimensions", IDM_VID_SPECIFY_DIM
|
||||||
MENUITEM "F&orce 4:3 display ratio", IDM_VID_FORCE43
|
MENUITEM "F&orce 4:3 display ratio", IDM_VID_FORCE43
|
||||||
POPUP "&Window scale factor"
|
POPUP "&Window scale factor"
|
||||||
BEGIN
|
BEGIN
|
||||||
@@ -342,6 +343,25 @@ BEGIN
|
|||||||
#endif
|
#endif
|
||||||
END
|
END
|
||||||
|
|
||||||
|
DLG_SPECIFY_DIM DIALOG DISCARDABLE 0, 0, 175, 47
|
||||||
|
STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU
|
||||||
|
CAPTION "Specify Main Window Dimensions"
|
||||||
|
FONT 9, "Segoe UI"
|
||||||
|
BEGIN
|
||||||
|
LTEXT "Width:",IDT_1709,7,9,24,12
|
||||||
|
EDITTEXT IDC_EDIT_WIDTH,33,7,45,12,ES_AUTOHSCROLL | ES_NUMBER
|
||||||
|
CONTROL "",IDC_WIDTHSPIN,"msctls_updown32",UDS_SETBUDDYINT |
|
||||||
|
UDS_ALIGNRIGHT | UDS_ARROWKEYS | UDS_NOTHOUSANDS,76,6,
|
||||||
|
12,12
|
||||||
|
LTEXT "Height:",IDT_1710,97,9,24,12
|
||||||
|
EDITTEXT IDC_EDIT_HEIGHT,123,7,45,12,ES_AUTOHSCROLL | ES_NUMBER
|
||||||
|
CONTROL "",IDC_HEIGHTSPIN,"msctls_updown32",UDS_SETBUDDYINT |
|
||||||
|
UDS_ALIGNRIGHT | UDS_ARROWKEYS | UDS_NOTHOUSANDS,166,6,
|
||||||
|
12,12
|
||||||
|
DEFPUSHBUTTON "OK",IDOK,30,26,50,14
|
||||||
|
PUSHBUTTON "Cancel",IDCANCEL,99,26,50,14
|
||||||
|
END
|
||||||
|
|
||||||
DLG_CFG_MACHINE DIALOG DISCARDABLE 107, 0, 305, 200
|
DLG_CFG_MACHINE DIALOG DISCARDABLE 107, 0, 305, 200
|
||||||
STYLE DS_CONTROL | WS_CHILD
|
STYLE DS_CONTROL | WS_CHILD
|
||||||
FONT 9, "Segoe UI"
|
FONT 9, "Segoe UI"
|
||||||
|
|||||||
@@ -447,7 +447,7 @@ else
|
|||||||
UIOBJ := win_ui.o win_stbar.o \
|
UIOBJ := win_ui.o win_stbar.o \
|
||||||
win_sdl.o \
|
win_sdl.o \
|
||||||
win_dialog.o win_about.o \
|
win_dialog.o win_about.o \
|
||||||
win_settings.o win_devconf.o win_snd_gain.o \
|
win_settings.o win_devconf.o win_snd_gain.o win_specify_dim.o \
|
||||||
win_new_floppy.o win_jsconf.o win_media_menu.o
|
win_new_floppy.o win_jsconf.o win_media_menu.o
|
||||||
endif
|
endif
|
||||||
|
|
||||||
|
|||||||
157
src/win/win_specify_dim.c
Normal file
157
src/win/win_specify_dim.c
Normal file
@@ -0,0 +1,157 @@
|
|||||||
|
/*
|
||||||
|
* 86Box A hypervisor and IBM PC system emulator that specializes in
|
||||||
|
* running old operating systems and software designed for IBM
|
||||||
|
* PC systems and compatibles from 1981 through fairly recent
|
||||||
|
* system designs based on the PCI bus.
|
||||||
|
*
|
||||||
|
* This file is part of the 86Box distribution.
|
||||||
|
*
|
||||||
|
* Handle the dialog for specifying the dimensions of the main window.
|
||||||
|
*
|
||||||
|
*
|
||||||
|
*
|
||||||
|
* Authors: Miran Grca, <mgrca8@gmail.com>
|
||||||
|
*
|
||||||
|
* Copyright 2016-2018 Miran Grca.
|
||||||
|
*/
|
||||||
|
#define UNICODE
|
||||||
|
#define BITMAP WINDOWS_BITMAP
|
||||||
|
#include <windows.h>
|
||||||
|
#include <windowsx.h>
|
||||||
|
#undef BITMAP
|
||||||
|
#include <commctrl.h>
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <stdint.h>
|
||||||
|
#include <string.h>
|
||||||
|
#include <stdlib.h>
|
||||||
|
#include <wchar.h>
|
||||||
|
#include <86box/86box.h>
|
||||||
|
#include <86box/config.h>
|
||||||
|
#include <86box/plat.h>
|
||||||
|
#include <86box/sound.h>
|
||||||
|
#include <86box/win.h>
|
||||||
|
|
||||||
|
|
||||||
|
#if defined(__amd64__) || defined(__aarch64__)
|
||||||
|
static LRESULT CALLBACK
|
||||||
|
#else
|
||||||
|
static BOOL CALLBACK
|
||||||
|
#endif
|
||||||
|
SpecifyDimensionsDialogProcedure(HWND hdlg, UINT message, WPARAM wParam, LPARAM lParam)
|
||||||
|
{
|
||||||
|
HWND h, h2;
|
||||||
|
HMENU hmenu;
|
||||||
|
UDACCEL accel, accel2;
|
||||||
|
RECT r;
|
||||||
|
uint32_t temp_x = 0, temp_y = 0;
|
||||||
|
int dpi = 96;
|
||||||
|
LPTSTR lptsTemp;
|
||||||
|
char *stransi;
|
||||||
|
|
||||||
|
switch (message) {
|
||||||
|
case WM_INITDIALOG:
|
||||||
|
GetWindowRect(hwndRender, &r);
|
||||||
|
|
||||||
|
h = GetDlgItem(hdlg, IDC_WIDTHSPIN);
|
||||||
|
h2 = GetDlgItem(hdlg, IDC_EDIT_WIDTH);
|
||||||
|
SendMessage(h, UDM_SETBUDDY, (WPARAM)h2, 0);
|
||||||
|
SendMessage(h, UDM_SETRANGE, 0, (120 << 16) | 2048);
|
||||||
|
accel.nSec = 0;
|
||||||
|
accel.nInc = 8;
|
||||||
|
SendMessage(h, UDM_SETACCEL, 1, (LPARAM)&accel);
|
||||||
|
SendMessage(h, UDM_SETPOS, 0, r.right - r.left);
|
||||||
|
|
||||||
|
h = GetDlgItem(hdlg, IDC_HEIGHTSPIN);
|
||||||
|
h2 = GetDlgItem(hdlg, IDC_EDIT_HEIGHT);
|
||||||
|
SendMessage(h, UDM_SETBUDDY, (WPARAM)h2, 0);
|
||||||
|
SendMessage(h, UDM_SETRANGE, 0, (120 << 16) | 2048);
|
||||||
|
accel2.nSec = 0;
|
||||||
|
accel2.nInc = 8;
|
||||||
|
SendMessage(h, UDM_SETACCEL, 1, (LPARAM)&accel2);
|
||||||
|
SendMessage(h, UDM_SETPOS, 0, r.bottom - r.top);
|
||||||
|
break;
|
||||||
|
|
||||||
|
case WM_COMMAND:
|
||||||
|
switch (LOWORD(wParam)) {
|
||||||
|
case IDOK:
|
||||||
|
lptsTemp = (LPTSTR) malloc(512 * sizeof(WCHAR));
|
||||||
|
stransi = (char *)malloc(512);
|
||||||
|
|
||||||
|
h = GetDlgItem(hdlg, IDC_EDIT_WIDTH);
|
||||||
|
SendMessage(h, WM_GETTEXT, 255, (LPARAM) lptsTemp);
|
||||||
|
wcstombs(stransi, lptsTemp, 512);
|
||||||
|
sscanf(stransi, "%u", &temp_x);
|
||||||
|
|
||||||
|
h = GetDlgItem(hdlg, IDC_EDIT_HEIGHT);
|
||||||
|
SendMessage(h, WM_GETTEXT, 255, (LPARAM) lptsTemp);
|
||||||
|
wcstombs(stransi, lptsTemp, 512);
|
||||||
|
sscanf(stransi, "%u", &temp_y);
|
||||||
|
|
||||||
|
window_remember = 1;
|
||||||
|
vid_resize = 1;
|
||||||
|
hmenu = GetMenu(hwndMain);
|
||||||
|
CheckMenuItem(hmenu, IDM_VID_RESIZE, MF_CHECKED);
|
||||||
|
|
||||||
|
SetWindowLongPtr(hwndMain, GWL_STYLE, (WS_OVERLAPPEDWINDOW) | WS_VISIBLE);
|
||||||
|
|
||||||
|
/* scale the screen base on DPI */
|
||||||
|
if (dpi_scale) {
|
||||||
|
dpi = win_get_dpi(hwndMain);
|
||||||
|
temp_x = MulDiv(temp_x, dpi, 96);
|
||||||
|
temp_y = MulDiv(temp_y, dpi, 96);
|
||||||
|
} else {
|
||||||
|
temp_x = temp_x;
|
||||||
|
temp_y = temp_y;
|
||||||
|
}
|
||||||
|
|
||||||
|
ResizeWindowByClientArea(hwndMain, temp_x, temp_y + sbar_height);
|
||||||
|
|
||||||
|
if (mouse_capture)
|
||||||
|
ClipCursor(&r);
|
||||||
|
|
||||||
|
CheckMenuItem(hmenu, IDM_VID_SCALE_1X + scale, MF_UNCHECKED);
|
||||||
|
CheckMenuItem(hmenu, IDM_VID_SCALE_2X, MF_CHECKED);
|
||||||
|
scale = 1;
|
||||||
|
EnableMenuItem(hmenu, IDM_VID_SCALE_1X, MF_GRAYED);
|
||||||
|
EnableMenuItem(hmenu, IDM_VID_SCALE_2X, MF_GRAYED);
|
||||||
|
EnableMenuItem(hmenu, IDM_VID_SCALE_3X, MF_GRAYED);
|
||||||
|
EnableMenuItem(hmenu, IDM_VID_SCALE_4X, MF_GRAYED);
|
||||||
|
|
||||||
|
scrnsz_x = temp_x;
|
||||||
|
scrnsz_y = temp_y;
|
||||||
|
doresize = 1;
|
||||||
|
|
||||||
|
CheckMenuItem(hmenu, IDM_VID_REMEMBER, MF_CHECKED);
|
||||||
|
GetWindowRect(hwndMain, &r);
|
||||||
|
window_x = r.left;
|
||||||
|
window_y = r.top;
|
||||||
|
window_w = r.right - r.left;
|
||||||
|
window_h = r.bottom - r.top;
|
||||||
|
|
||||||
|
config_save();
|
||||||
|
|
||||||
|
free(stransi);
|
||||||
|
free(lptsTemp);
|
||||||
|
|
||||||
|
EndDialog(hdlg, 0);
|
||||||
|
return TRUE;
|
||||||
|
|
||||||
|
case IDCANCEL:
|
||||||
|
EndDialog(hdlg, 0);
|
||||||
|
return TRUE;
|
||||||
|
|
||||||
|
default:
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
return(FALSE);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void
|
||||||
|
SpecifyDimensionsDialogCreate(HWND hwnd)
|
||||||
|
{
|
||||||
|
DialogBox(hinstance, (LPCTSTR)DLG_SPECIFY_DIM, hwnd, SpecifyDimensionsDialogProcedure);
|
||||||
|
}
|
||||||
@@ -61,9 +61,9 @@ HWND hwndMain, /* application main window */
|
|||||||
HMENU menuMain; /* application main menu */
|
HMENU menuMain; /* application main menu */
|
||||||
HICON hIcon[256]; /* icon data loaded from resources */
|
HICON hIcon[256]; /* icon data loaded from resources */
|
||||||
RECT oldclip; /* mouse rect */
|
RECT oldclip; /* mouse rect */
|
||||||
int sbar_height = 23; /* statusbar height */
|
int sbar_height = 23; /* statusbar height */
|
||||||
int minimized = 0;
|
int minimized = 0;
|
||||||
int infocus = 1;
|
int infocus = 1, button_down = 0;
|
||||||
int rctrl_is_lalt = 0;
|
int rctrl_is_lalt = 0;
|
||||||
int user_resize = 0;
|
int user_resize = 0;
|
||||||
|
|
||||||
@@ -456,10 +456,14 @@ input_proc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
|
|||||||
#endif
|
#endif
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
case WM_LBUTTONDOWN:
|
||||||
|
button_down |= 1;
|
||||||
|
break;
|
||||||
|
|
||||||
case WM_LBUTTONUP:
|
case WM_LBUTTONUP:
|
||||||
pclog("video_fullscreen = %i\n", video_fullscreen);
|
if ((button_down & 1) && !video_fullscreen)
|
||||||
if (! video_fullscreen)
|
|
||||||
plat_mouse_capture(1);
|
plat_mouse_capture(1);
|
||||||
|
button_down &= ~1;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case WM_MBUTTONUP:
|
case WM_MBUTTONUP:
|
||||||
@@ -511,12 +515,12 @@ MainWindowProcedure(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
|
|||||||
break;
|
break;
|
||||||
|
|
||||||
#ifdef MTR_ENABLED
|
#ifdef MTR_ENABLED
|
||||||
case IDM_ACTION_BEGIN_TRACE:
|
case IDM_ACTION_BEGIN_TRACE:
|
||||||
case IDM_ACTION_END_TRACE:
|
case IDM_ACTION_END_TRACE:
|
||||||
case IDM_ACTION_TRACE:
|
case IDM_ACTION_TRACE:
|
||||||
tracing_on = !tracing_on;
|
tracing_on = !tracing_on;
|
||||||
handle_trace(hmenu, tracing_on);
|
handle_trace(hmenu, tracing_on);
|
||||||
break;
|
break;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
case IDM_ACTION_HRESET:
|
case IDM_ACTION_HRESET:
|
||||||
@@ -696,6 +700,10 @@ MainWindowProcedure(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
|
|||||||
config_save();
|
config_save();
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
case IDM_VID_SPECIFY_DIM:
|
||||||
|
SpecifyDimensionsDialogCreate(hwnd);
|
||||||
|
break;
|
||||||
|
|
||||||
case IDM_VID_FORCE43:
|
case IDM_VID_FORCE43:
|
||||||
video_toggle_option(hmenu, &force_43, IDM_VID_FORCE43);
|
video_toggle_option(hmenu, &force_43, IDM_VID_FORCE43);
|
||||||
video_force_resize_set(1);
|
video_force_resize_set(1);
|
||||||
@@ -1063,9 +1071,14 @@ static LRESULT CALLBACK
|
|||||||
SubWindowProcedure(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
|
SubWindowProcedure(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
|
||||||
{
|
{
|
||||||
switch (message) {
|
switch (message) {
|
||||||
|
case WM_LBUTTONDOWN:
|
||||||
|
button_down |= 2;
|
||||||
|
break;
|
||||||
|
|
||||||
case WM_LBUTTONUP:
|
case WM_LBUTTONUP:
|
||||||
if (! video_fullscreen)
|
if ((button_down & 2) && !video_fullscreen)
|
||||||
plat_mouse_capture(1);
|
plat_mouse_capture(1);
|
||||||
|
button_down &= ~2;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case WM_MBUTTONUP:
|
case WM_MBUTTONUP:
|
||||||
|
|||||||
Reference in New Issue
Block a user