diff --git a/src/include/86box/resource.h b/src/include/86box/resource.h index 28abd983b..27f8f8d0e 100644 --- a/src/include/86box/resource.h +++ b/src/include/86box/resource.h @@ -28,6 +28,7 @@ #define DLG_STATUS 102 /* top-level dialog */ #define DLG_SND_GAIN 103 /* 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_CFG_MACHINE 111 /* 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_RPM_MODE 1202 - /* For the DeviceConfig code, re-do later. */ #define IDC_CONFIG_BASE 1300 #define IDC_CONFIGURE_VID 1300 @@ -277,6 +277,10 @@ #define IDC_RENDER 1381 #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 IDC_ABOUT_ICON 65535 @@ -308,12 +312,13 @@ #define IDM_VID_SCALE_2X 40056 #define IDM_VID_SCALE_3X 40057 #define IDM_VID_SCALE_4X 40058 -#define IDM_VID_HIDPI 40059 +#define IDM_VID_HIDPI 40059 #define IDM_VID_FULLSCREEN 40060 #define IDM_VID_FS_FULL 40061 #define IDM_VID_FS_43 40062 #define IDM_VID_FS_KEEPRATIO 40063 #define IDM_VID_FS_INT 40064 +#define IDM_VID_SPECIFY_DIM 40065 #define IDM_VID_FORCE43 40066 #define IDM_VID_OVERSCAN 40067 #define IDM_VID_INVERT 40069 diff --git a/src/include/86box/win.h b/src/include/86box/win.h index 7c642cbc2..0f0162c11 100644 --- a/src/include/86box/win.h +++ b/src/include/86box/win.h @@ -174,6 +174,10 @@ extern void SoundGainDialogCreate(HWND hwnd); 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: */ #define SETTINGS_PAGE_MACHINE 0 #define SETTINGS_PAGE_VIDEO 1 diff --git a/src/win/86Box.rc b/src/win/86Box.rc index 2fc62098e..cfa2275ab 100644 --- a/src/win/86Box.rc +++ b/src/win/86Box.rc @@ -71,6 +71,7 @@ BEGIN #endif END MENUITEM SEPARATOR + MENUITEM "Specify dimensions", IDM_VID_SPECIFY_DIM MENUITEM "F&orce 4:3 display ratio", IDM_VID_FORCE43 POPUP "&Window scale factor" BEGIN @@ -342,6 +343,25 @@ BEGIN #endif 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 STYLE DS_CONTROL | WS_CHILD FONT 9, "Segoe UI" diff --git a/src/win/Makefile.mingw b/src/win/Makefile.mingw index 1c9245198..7f493d925 100644 --- a/src/win/Makefile.mingw +++ b/src/win/Makefile.mingw @@ -447,7 +447,7 @@ else UIOBJ := win_ui.o win_stbar.o \ win_sdl.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 endif diff --git a/src/win/win_specify_dim.c b/src/win/win_specify_dim.c new file mode 100644 index 000000000..42bc4edd3 --- /dev/null +++ b/src/win/win_specify_dim.c @@ -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, + * + * Copyright 2016-2018 Miran Grca. + */ +#define UNICODE +#define BITMAP WINDOWS_BITMAP +#include +#include +#undef BITMAP +#include +#include +#include +#include +#include +#include +#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); +} diff --git a/src/win/win_ui.c b/src/win/win_ui.c index de0dba0d8..e690a0706 100644 --- a/src/win/win_ui.c +++ b/src/win/win_ui.c @@ -61,9 +61,9 @@ HWND hwndMain, /* application main window */ HMENU menuMain; /* application main menu */ HICON hIcon[256]; /* icon data loaded from resources */ RECT oldclip; /* mouse rect */ -int sbar_height = 23; /* statusbar height */ +int sbar_height = 23; /* statusbar height */ int minimized = 0; -int infocus = 1; +int infocus = 1, button_down = 0; int rctrl_is_lalt = 0; int user_resize = 0; @@ -456,10 +456,14 @@ input_proc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam) #endif break; + case WM_LBUTTONDOWN: + button_down |= 1; + break; + case WM_LBUTTONUP: - pclog("video_fullscreen = %i\n", video_fullscreen); - if (! video_fullscreen) + if ((button_down & 1) && !video_fullscreen) plat_mouse_capture(1); + button_down &= ~1; break; case WM_MBUTTONUP: @@ -511,12 +515,12 @@ MainWindowProcedure(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam) break; #ifdef MTR_ENABLED - case IDM_ACTION_BEGIN_TRACE: - case IDM_ACTION_END_TRACE: - case IDM_ACTION_TRACE: - tracing_on = !tracing_on; - handle_trace(hmenu, tracing_on); - break; + case IDM_ACTION_BEGIN_TRACE: + case IDM_ACTION_END_TRACE: + case IDM_ACTION_TRACE: + tracing_on = !tracing_on; + handle_trace(hmenu, tracing_on); + break; #endif case IDM_ACTION_HRESET: @@ -696,6 +700,10 @@ MainWindowProcedure(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam) config_save(); break; + case IDM_VID_SPECIFY_DIM: + SpecifyDimensionsDialogCreate(hwnd); + break; + case IDM_VID_FORCE43: video_toggle_option(hmenu, &force_43, IDM_VID_FORCE43); video_force_resize_set(1); @@ -1063,9 +1071,14 @@ static LRESULT CALLBACK SubWindowProcedure(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam) { switch (message) { + case WM_LBUTTONDOWN: + button_down |= 2; + break; + case WM_LBUTTONUP: - if (! video_fullscreen) + if ((button_down & 2) && !video_fullscreen) plat_mouse_capture(1); + button_down &= ~2; break; case WM_MBUTTONUP: