From cd5a04fd95f08282f93cfcbe4a4ceacc27f92d4c Mon Sep 17 00:00:00 2001 From: Alexandre Julliard Date: Tue, 24 Oct 2006 12:27:28 +0200 Subject: [PATCH] notepad: Fallback to default position if saved position if off-screen. --- programs/notepad/main.c | 60 ++++++++++++++++++++++++----------------- programs/notepad/main.h | 5 ---- 2 files changed, 36 insertions(+), 29 deletions(-) diff --git a/programs/notepad/main.c b/programs/notepad/main.c index 3ffa14becde..4012c842b38 100644 --- a/programs/notepad/main.c +++ b/programs/notepad/main.c @@ -34,6 +34,7 @@ NOTEPAD_GLOBALS Globals; static ATOM aFINDMSGSTRING; +static RECT main_rect; static const WCHAR notepad_reg_key[] = {'S','o','f','t','w','a','r','e','\\', 'M','i','c','r','o','s','o','f','t','\\','N','o','t','e','p','a','d','\0'}; @@ -111,20 +112,15 @@ static VOID NOTEPAD_SaveSettingToRegistry(void) REG_OPTION_NON_VOLATILE, KEY_ALL_ACCESS, NULL, &hkey, &disp) == ERROR_SUCCESS) { DWORD data; - RECT rect; - - GetWindowRect(Globals.hMainWnd, &rect); - Globals.iWindowPosX = rect.left; - Globals.iWindowPosY = rect.top; - Globals.iWindowPosDX = rect.right - rect.left; - Globals.iWindowPosDY = rect.bottom - rect.top; -#define SET_NOTEPAD_REG(hkey, value_name, value_data) do { DWORD data = (DWORD)value_data; RegSetValueEx(hkey, value_name, 0, REG_DWORD, (LPBYTE)&data, sizeof(DWORD)); }while(0) + GetWindowRect(Globals.hMainWnd, &main_rect); + +#define SET_NOTEPAD_REG(hkey, value_name, value_data) do { DWORD data = (DWORD)(value_data); RegSetValueEx(hkey, value_name, 0, REG_DWORD, (LPBYTE)&data, sizeof(DWORD)); }while(0) SET_NOTEPAD_REG(hkey, value_fWrap, Globals.bWrapLongLines); - SET_NOTEPAD_REG(hkey, value_iWindowPosX, Globals.iWindowPosX); - SET_NOTEPAD_REG(hkey, value_iWindowPosY, Globals.iWindowPosY); - SET_NOTEPAD_REG(hkey, value_iWindowPosDX, Globals.iWindowPosDX); - SET_NOTEPAD_REG(hkey, value_iWindowPosDY, Globals.iWindowPosDY); + SET_NOTEPAD_REG(hkey, value_iWindowPosX, main_rect.left); + SET_NOTEPAD_REG(hkey, value_iWindowPosY, main_rect.top); + SET_NOTEPAD_REG(hkey, value_iWindowPosDX, main_rect.right - main_rect.left); + SET_NOTEPAD_REG(hkey, value_iWindowPosDY, main_rect.bottom - main_rect.top); SET_NOTEPAD_REG(hkey, value_lfCharSet, Globals.lfFont.lfCharSet); SET_NOTEPAD_REG(hkey, value_lfClipPrecision, Globals.lfFont.lfClipPrecision); SET_NOTEPAD_REG(hkey, value_lfEscapement, Globals.lfFont.lfEscapement); @@ -158,15 +154,14 @@ static VOID NOTEPAD_LoadSettingFromRegistry(void) { static const WCHAR systemW[] = { 'S','y','s','t','e','m','\0' }; HKEY hkey; - INT base_length; + INT base_length, dx, dy; base_length = (GetSystemMetrics(SM_CXSCREEN) > GetSystemMetrics(SM_CYSCREEN))? GetSystemMetrics(SM_CYSCREEN) : GetSystemMetrics(SM_CXSCREEN); - Globals.iWindowPosX = 0; - Globals.iWindowPosY = 0; - Globals.iWindowPosDX = base_length * .95; - Globals.iWindowPosDY = Globals.iWindowPosDX * 3 / 4; + dx = base_length * .95; + dy = dx * 3 / 4; + SetRect( &main_rect, 0, 0, dx, dy ); Globals.bWrapLongLines = TRUE; @@ -192,10 +187,10 @@ static VOID NOTEPAD_LoadSettingFromRegistry(void) #define QUERY_NOTEPAD_REG(hkey, value_name, ret) do { DWORD type, data; DWORD size = sizeof(DWORD); if(RegQueryValueEx(hkey, value_name, 0, &type, (LPBYTE)&data, &size) == ERROR_SUCCESS) if(type == REG_DWORD) ret = (typeof(ret))data; } while(0) QUERY_NOTEPAD_REG(hkey, value_fWrap, Globals.bWrapLongLines); - QUERY_NOTEPAD_REG(hkey, value_iWindowPosX, Globals.iWindowPosX); - QUERY_NOTEPAD_REG(hkey, value_iWindowPosY, Globals.iWindowPosY); - QUERY_NOTEPAD_REG(hkey, value_iWindowPosDX, Globals.iWindowPosDX); - QUERY_NOTEPAD_REG(hkey, value_iWindowPosDY, Globals.iWindowPosDY); + QUERY_NOTEPAD_REG(hkey, value_iWindowPosX, main_rect.left); + QUERY_NOTEPAD_REG(hkey, value_iWindowPosY, main_rect.top); + QUERY_NOTEPAD_REG(hkey, value_iWindowPosDX, dx); + QUERY_NOTEPAD_REG(hkey, value_iWindowPosDY, dy); QUERY_NOTEPAD_REG(hkey, value_lfCharSet, Globals.lfFont.lfCharSet); QUERY_NOTEPAD_REG(hkey, value_lfClipPrecision, Globals.lfFont.lfClipPrecision); QUERY_NOTEPAD_REG(hkey, value_lfEscapement, Globals.lfFont.lfEscapement); @@ -209,6 +204,9 @@ static VOID NOTEPAD_LoadSettingFromRegistry(void) QUERY_NOTEPAD_REG(hkey, value_lfWeight, Globals.lfFont.lfWeight); #undef QUERY_NOTEPAD_REG + main_rect.right = main_rect.left + dx; + main_rect.bottom = main_rect.top + dy; + size = sizeof(DWORD); if(RegQueryValueEx(hkey, value_iPointSize, 0, &type, (LPBYTE)&data, &size) == ERROR_SUCCESS) if(type == REG_DWORD) @@ -593,6 +591,9 @@ int PASCAL WinMain(HINSTANCE hInstance, HINSTANCE prev, LPSTR cmdline, int show) MSG msg; HACCEL hAccel; WNDCLASSEX class; + HMONITOR monitor; + MONITORINFO info; + INT x, y; static const WCHAR className[] = {'N','o','t','e','p','a','d',0}; static const WCHAR winName[] = {'N','o','t','e','p','a','d',0}; @@ -616,10 +617,21 @@ int PASCAL WinMain(HINSTANCE hInstance, HINSTANCE prev, LPSTR cmdline, int show) /* Setup windows */ + monitor = MonitorFromRect( &main_rect, MONITOR_DEFAULTTOPRIMARY ); + info.cbSize = sizeof(info); + GetMonitorInfoW( monitor, &info ); + + x = main_rect.left; + y = main_rect.top; + if (main_rect.left >= info.rcWork.right || + main_rect.top >= info.rcWork.bottom || + main_rect.right < info.rcWork.left || + main_rect.bottom < info.rcWork.top) + x = y = CW_USEDEFAULT; + Globals.hMainWnd = - CreateWindow(className, winName, WS_OVERLAPPEDWINDOW, - Globals.iWindowPosX, Globals.iWindowPosY, - Globals.iWindowPosDX, Globals.iWindowPosDY, + CreateWindow(className, winName, WS_OVERLAPPEDWINDOW, x, y, + main_rect.right - main_rect.left, main_rect.bottom - main_rect.top, NULL, NULL, Globals.hInstance, NULL); if (!Globals.hMainWnd) { diff --git a/programs/notepad/main.h b/programs/notepad/main.h index 075a248dcbf..a0c5e5e48d1 100644 --- a/programs/notepad/main.h +++ b/programs/notepad/main.h @@ -45,11 +45,6 @@ typedef struct WCHAR szHeader[MAX_PATH]; WCHAR szFooter[MAX_PATH]; - INT iWindowPosX; - INT iWindowPosY; - INT iWindowPosDX; - INT iWindowPosDY; - FINDREPLACE find; FINDREPLACE lastFind; HGLOBAL hDevMode; /* printer mode */