Files
86Box/src/win/win_specify_dim.c
2022-01-09 18:38:18 +01:00

179 lines
4.7 KiB
C

/*
* 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, lock;
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);
h = GetDlgItem(hdlg, IDC_CHECK_LOCK_SIZE);
SendMessage(h, BM_SETCHECK, !!(vid_resize & 2), 0);
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);
fixed_size_x = temp_x;
h = GetDlgItem(hdlg, IDC_EDIT_HEIGHT);
SendMessage(h, WM_GETTEXT, 255, (LPARAM) lptsTemp);
wcstombs(stransi, lptsTemp, 512);
sscanf(stransi, "%u", &temp_y);
fixed_size_y = temp_y;
h = GetDlgItem(hdlg, IDC_CHECK_LOCK_SIZE);
lock = SendMessage(h, BM_GETCHECK, 0, 0);
if (lock) {
vid_resize = 2;
window_remember = 0;
} else {
vid_resize = 1;
window_remember = 1;
}
hmenu = GetMenu(hwndMain);
CheckMenuItem(hmenu, IDM_VID_REMEMBER, (window_remember == 1) ? MF_CHECKED : MF_UNCHECKED);
CheckMenuItem(hmenu, IDM_VID_RESIZE, (vid_resize == 1) ? MF_CHECKED : MF_UNCHECKED);
EnableMenuItem(hmenu, IDM_VID_RESIZE, (vid_resize & 2) ? MF_GRAYED : MF_ENABLED);
if (vid_resize == 1)
SetWindowLongPtr(hwndMain, GWL_STYLE, (WS_OVERLAPPEDWINDOW) | WS_VISIBLE);
else
SetWindowLongPtr(hwndMain, GWL_STYLE, (WS_OVERLAPPEDWINDOW & ~WS_SIZEBOX & ~WS_MAXIMIZEBOX) | 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);
}
ResizeWindowByClientArea(hwndMain, temp_x, temp_y + sbar_height + tbar_height);
if (vid_resize) {
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, vid_resize ? MF_GRAYED : MF_ENABLED);
EnableMenuItem(hmenu, IDM_VID_SCALE_2X, vid_resize ? MF_GRAYED : MF_ENABLED);
EnableMenuItem(hmenu, IDM_VID_SCALE_3X, vid_resize ? MF_GRAYED : MF_ENABLED);
EnableMenuItem(hmenu, IDM_VID_SCALE_4X, vid_resize ? MF_GRAYED : MF_ENABLED);
scrnsz_x = fixed_size_x;
scrnsz_y = fixed_size_y;
atomic_flag_clear(&doresize);
GetWindowRect(hwndMain, &r);
if (mouse_capture)
ClipCursor(&r);
if (window_remember || (vid_resize & 2)) {
window_x = r.left;
window_y = r.top;
if (!(vid_resize & 2)) {
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);
}