Merge pull request #94 from RaiKoHoff/Bugfixes_0929+

Fixing DPI awareness
This commit is contained in:
Derick Payne 2017-09-29 15:51:32 +02:00 committed by GitHub
commit f7645193f2
5 changed files with 471 additions and 385 deletions

View File

@ -31,7 +31,7 @@
</compatibility>
<asmv3:application xmlns:asmv3="urn:schemas-microsoft-com:asm.v3">
<asmv3:windowsSettings xmlns="http://schemas.microsoft.com/SMI/2005/WindowsSettings">
<dpiAware>false</dpiAware>
<dpiAware>true</dpiAware>
</asmv3:windowsSettings>
</asmv3:application>
</assembly>

View File

@ -46,6 +46,9 @@
#define LCMAP_TITLECASE 0x00000300 // Title Case Letters bit mask
#endif
#define DEFAULT_SCROLL_WIDTH 4096 // 4K
extern HWND hwndMain;
extern HWND hwndEdit;
extern HINSTANCE g_hInstance;
@ -80,6 +83,7 @@ extern int iMarkOccurrencesMaxCount;
#define DELIM_BUFFER 258
char DelimChars[DELIM_BUFFER] = { '\0' };
char DelimCharsAccel[DELIM_BUFFER] = { '\0' };
char WordCharsDefault[DELIM_BUFFER] = { '\0' };
char WhiteSpaceCharsDefault[DELIM_BUFFER] = { '\0' };
char PunctuationCharsDefault[DELIM_BUFFER] = { '\0' };
@ -285,7 +289,7 @@ HWND EditCreate(HWND hwndParent)
SendMessage(hwnd,SCI_SETPASTECONVERTENDINGS,1,0);
SendMessage(hwnd,SCI_SETMODEVENTMASK,/*SC_MODEVENTMASKALL*/SC_MOD_INSERTTEXT|SC_MOD_DELETETEXT|SC_MOD_CONTAINER,0);
SendMessage(hwnd,SCI_USEPOPUP,FALSE,0);
SendMessage(hwnd,SCI_SETSCROLLWIDTH,2048,0);
SendMessage(hwnd,SCI_SETSCROLLWIDTH, DEFAULT_SCROLL_WIDTH,0);
SendMessage(hwnd,SCI_SETSCROLLWIDTHTRACKING,TRUE,0);
SendMessage(hwnd,SCI_SETENDATLASTLINE,TRUE,0);
SendMessage(hwnd,SCI_SETCARETSTICKY,FALSE,0);
@ -296,7 +300,8 @@ HWND EditCreate(HWND hwndParent)
SendMessage(hwnd,SCI_SETVIRTUALSPACEOPTIONS,(bVirtualSpaceInRectSelection ? SCVS_RECTANGULARSELECTION : SCVS_NONE),0);
SendMessage(hwnd,SCI_SETADDITIONALCARETSBLINK,FALSE,0);
SendMessage(hwnd,SCI_SETADDITIONALCARETSVISIBLE,FALSE,0);
SendMessage(hwnd,SCI_SETMOUSEWHEELCAPTURES,FALSE,0);
SendMessage(hwnd,SCI_ASSIGNCMDKEY,(SCK_NEXT + (SCMOD_CTRL << 16)),SCI_PARADOWN);
SendMessage(hwnd,SCI_ASSIGNCMDKEY,(SCK_PRIOR + (SCMOD_CTRL << 16)),SCI_PARAUP);
SendMessage(hwnd,SCI_ASSIGNCMDKEY,(SCK_NEXT + ((SCMOD_CTRL | SCMOD_SHIFT) << 16)),SCI_PARADOWNEXTEND);
@ -326,7 +331,6 @@ HWND EditCreate(HWND hwndParent)
//
void EditInitWordDelimiter(HWND hwnd)
{
ZeroMemory(WordCharsDefault, COUNTOF(WordCharsDefault));
ZeroMemory(WhiteSpaceCharsDefault, COUNTOF(WhiteSpaceCharsDefault));
ZeroMemory(PunctuationCharsDefault, COUNTOF(PunctuationCharsDefault));
@ -338,9 +342,12 @@ void EditInitWordDelimiter(HWND hwnd)
SendMessage(hwnd, SCI_GETWORDCHARS, 0, (LPARAM)WordCharsDefault);
SendMessage(hwnd, SCI_GETWHITESPACECHARS,0,(LPARAM)WhiteSpaceCharsDefault);
SendMessage(hwnd, SCI_GETPUNCTUATIONCHARS,0,(LPARAM)PunctuationCharsDefault);
// delim chars are whitespace & punctuation
// default word delimiter chars are whitespace & punctuation & line ends
const char* lineEnds = "\r\n";
StringCchCopyA(DelimChars,COUNTOF(DelimChars),WhiteSpaceCharsDefault);
StringCchCatA(DelimChars,COUNTOF(DelimChars),PunctuationCharsDefault);
StringCchCatA(DelimChars,COUNTOF(DelimChars), lineEnds);
// 2nd get user settings
WCHAR buffer[DELIM_BUFFER] = { L'\0' };
@ -374,7 +381,11 @@ void EditInitWordDelimiter(HWND hwnd)
StringCchCatNA(WordCharsAccelerated, COUNTOF(WordCharsAccelerated), &(PunctuationCharsDefault[i]), 1);
}
}
// construct accelerated delimiters
StringCchCopyA(DelimCharsAccel, COUNTOF(DelimCharsAccel), WhiteSpaceCharsDefault);
StringCchCatA(DelimCharsAccel, COUNTOF(DelimCharsAccel), lineEnds);
}
@ -398,7 +409,7 @@ void EditSetNewText(HWND hwnd,char* lpstrText,DWORD cbText)
UndoRedoSelectionMap(-1,NULL);
SendMessage(hwnd,SCI_CLEARALL,0,0);
SendMessage(hwnd,SCI_MARKERDELETEALL,(WPARAM)-1,0);
SendMessage(hwnd,SCI_SETSCROLLWIDTH,2048,0);
SendMessage(hwnd,SCI_SETSCROLLWIDTH, DEFAULT_SCROLL_WIDTH,0);
SendMessage(hwnd,SCI_SETXOFFSET,0,0);
FileVars_Apply(hwnd,&fvCurFile);
@ -5914,7 +5925,7 @@ struct WLIST {
void CompleteWord(HWND hwnd, BOOL autoInsert)
{
const char* NON_WORD = bAccelWordNavigation ? WhiteSpaceCharsAccelerated : DelimChars;
const char* NON_WORD = bAccelWordNavigation ? DelimCharsAccel : DelimChars;
int iCurrentPos = (int)SendMessage(hwnd, SCI_GETCURRENTPOS, 0, 0);
int iLine = (int)SendMessage(hwnd, SCI_LINEFROMPOSITION, iCurrentPos, 0);
@ -6092,7 +6103,7 @@ void EditMarkAll(HWND hwnd, int iMarkOccurrences, BOOL bMarkOccurrencesMatchCase
if (bMarkOccurrencesMatchWords)
{
int iSelStart2 = 0;
const char* delims = (bAccelWordNavigation ? WhiteSpaceCharsAccelerated : DelimChars);
const char* delims = (bAccelWordNavigation ? DelimCharsAccel : DelimChars);
while ((iSelStart2 <= iSelCount) && pszText[iSelStart2])
{
if (StrChrIA(delims,pszText[iSelStart2]))

View File

@ -1144,11 +1144,8 @@ WININFO GetMyWindowPlacement(HWND hwnd,MONITORINFO* hMonitorInfo)
//
LRESULT CALLBACK MainWndProc(HWND hwnd,UINT umsg,WPARAM wParam,LPARAM lParam)
{
static BOOL bShutdownOK;
switch(umsg)
{
// Quickly handle painting and sizing messages, found in ScintillaWin.cxx
// Cool idea, don't know if this has any effect... ;-)
case WM_MOVE:
@ -1170,64 +1167,9 @@ LRESULT CALLBACK MainWndProc(HWND hwnd,UINT umsg,WPARAM wParam,LPARAM lParam)
case WM_DESTROY:
case WM_ENDSESSION:
if (!bShutdownOK) {
// Terminate file watching
InstallFileWatching(NULL);
// GetWindowPlacement
wininfo = GetMyWindowPlacement(hwnd,NULL);
DragAcceptFiles(hwnd,FALSE);
// Terminate clipboard watching
if (flagPasteBoard) {
KillTimer(hwnd,ID_PASTEBOARDTIMER);
ChangeClipboardChain(hwnd,hwndNextCBChain);
}
// Destroy find / replace dialog
if (IsWindow(hDlgFindReplace))
DestroyWindow(hDlgFindReplace);
// call SaveSettings() when hwndToolbar is still valid
SaveSettings(FALSE);
if (StringCchLen(szIniFile) != 0) {
// Cleanup unwanted MRU's
if (!bSaveRecentFiles) {
MRU_Empty(pFileMRU);
MRU_Save(pFileMRU);
}
else
MRU_MergeSave(pFileMRU,TRUE,flagRelativeFileMRU,flagPortableMyDocs);
MRU_Destroy(pFileMRU);
if (!bSaveFindReplace) {
MRU_Empty(mruFind);
MRU_Empty(mruReplace);
MRU_Save(mruFind);
MRU_Save(mruReplace);
}
else {
MRU_MergeSave(mruFind,FALSE,FALSE,FALSE);
MRU_MergeSave(mruReplace,FALSE,FALSE,FALSE);
}
MRU_Destroy(mruFind);
MRU_Destroy(mruReplace);
}
// Remove tray icon if necessary
ShowNotifyIcon(hwnd,FALSE);
bShutdownOK = TRUE;
}
if (umsg == WM_DESTROY)
PostQuitMessage(0);
MsgEndSession(hwnd,umsg);
break;
case WM_CLOSE:
if (FileSave(FALSE,TRUE,FALSE,FALSE))
DestroyWindow(hwnd);
@ -1277,203 +1219,22 @@ LRESULT CALLBACK MainWndProc(HWND hwnd,UINT umsg,WPARAM wParam,LPARAM lParam)
case WM_DROPFILES:
{
WCHAR szBuf[MAX_PATH+40];
HDROP hDrop = (HDROP)wParam;
// Reset Change Notify
//bPendingChangeNotify = FALSE;
if (IsIconic(hwnd))
ShowWindow(hwnd,SW_RESTORE);
//SetForegroundWindow(hwnd);
DragQueryFile(hDrop,0,szBuf,COUNTOF(szBuf));
if (PathIsDirectory(szBuf)) {
WCHAR tchFile[MAX_PATH] = { L'\0' };
if (OpenFileDlg(hwndMain,tchFile,COUNTOF(tchFile),szBuf))
FileLoad(FALSE,FALSE,FALSE,FALSE,tchFile);
}
else
FileLoad(FALSE,FALSE,FALSE,FALSE,szBuf);
if (DragQueryFile(hDrop,(UINT)(-1),NULL,0) > 1)
MsgBox(MBWARN,IDS_ERR_DROP);
DragFinish(hDrop);
}
MsgDropFiles(hwnd, wParam, lParam);
break;
case WM_COPYDATA:
{
PCOPYDATASTRUCT pcds = (PCOPYDATASTRUCT)lParam;
// Reset Change Notify
//bPendingChangeNotify = FALSE;
SetDlgItemInt(hwnd,IDC_REUSELOCK,GetTickCount(),FALSE);
if (pcds->dwData == DATA_NOTEPAD3_PARAMS) {
LPnp3params params = LocalAlloc(LPTR,pcds->cbData);
CopyMemory(params,pcds->lpData,pcds->cbData);
if (params->flagLexerSpecified)
flagLexerSpecified = 1;
if (params->flagQuietCreate)
flagQuietCreate = 1;
if (params->flagFileSpecified) {
BOOL bOpened = FALSE;
Encoding_Source(params->iSrcEncoding);
if (PathIsDirectory(&params->wchData)) {
WCHAR tchFile[MAX_PATH] = { L'\0' };
if (OpenFileDlg(hwndMain,tchFile,COUNTOF(tchFile),&params->wchData))
bOpened = FileLoad(FALSE,FALSE,FALSE,FALSE,tchFile);
}
else
bOpened = FileLoad(FALSE,FALSE,FALSE,FALSE,&params->wchData);
if (bOpened) {
if (params->flagChangeNotify == 1) {
iFileWatchingMode = 0;
bResetFileWatching = TRUE;
InstallFileWatching(szCurFile);
}
else if (params->flagChangeNotify == 2) {
iFileWatchingMode = 2;
bResetFileWatching = TRUE;
InstallFileWatching(szCurFile);
}
if (0 != params->flagSetEncoding) {
flagSetEncoding = params->flagSetEncoding;
SendMessage(
hwnd,
WM_COMMAND,
MAKELONG(IDM_ENCODING_ANSI + flagSetEncoding -1,1),
0);
flagSetEncoding = 0;
}
if (0 != params->flagSetEOLMode) {
flagSetEOLMode = params->flagSetEOLMode;
SendMessage(
hwndMain,
WM_COMMAND,
MAKELONG(IDM_LINEENDINGS_CRLF + flagSetEOLMode -1,1),
0);
flagSetEOLMode = 0;
}
if (params->flagLexerSpecified) {
if (params->iInitialLexer < 0) {
WCHAR wchExt[32] = L".";
StringCchCopyN(CharNext(wchExt),32,StrEnd(&params->wchData) + 1,31);
Style_SetLexerFromName(hwndEdit,&params->wchData,wchExt);
}
else if (params->iInitialLexer >=0 && params->iInitialLexer < NUMLEXERS)
Style_SetLexerFromID(hwndEdit,params->iInitialLexer);
}
if (params->flagTitleExcerpt) {
StringCchCopyN(szTitleExcerpt,COUNTOF(szTitleExcerpt),StrEnd(&params->wchData) + 1,COUNTOF(szTitleExcerpt));
}
}
// reset
Encoding_Source(CPI_NONE);
}
if (params->flagJumpTo) {
if (params->iInitialLine == 0)
params->iInitialLine = 1;
EditJumpTo(hwndEdit,params->iInitialLine,params->iInitialColumn);
EditEnsureSelectionVisible(hwndEdit);
}
flagLexerSpecified = 0;
flagQuietCreate = 0;
LocalFree(params);
UpdateToolbar();
UpdateStatusbar();
}
}
return TRUE;
return MsgCopyData(hwnd, wParam, lParam);
case WM_CONTEXTMENU:
{
HMENU hmenu;
int imenu = 0;
POINT pt;
int nID = GetDlgCtrlID((HWND)wParam);
if ((nID != IDC_EDIT) && (nID != IDC_STATUSBAR) &&
(nID != IDC_REBAR) && (nID != IDC_TOOLBAR))
return DefWindowProc(hwnd,umsg,wParam,lParam);
hmenu = LoadMenu(g_hInstance,MAKEINTRESOURCE(IDR_POPUPMENU));
//SetMenuDefaultItem(GetSubMenu(hmenu,1),0,FALSE);
pt.x = (int)(short)LOWORD(lParam);
pt.y = (int)(short)HIWORD(lParam);
switch(nID)
{
case IDC_EDIT:
{
if (SendMessage(hwndEdit, SCI_GETSELECTIONEMPTY, 0, 0) && (pt.x != -1) && (pt.y != -1))
{
int iNewPos;
POINT ptc;
ptc.x = pt.x; ptc.y = pt.y;
ScreenToClient(hwndEdit,&ptc);
iNewPos = (int)SendMessage(hwndEdit,SCI_POSITIONFROMPOINT,(WPARAM)ptc.x,(LPARAM)ptc.y);
SendMessage(hwndEdit,SCI_GOTOPOS,(WPARAM)iNewPos,0);
}
if (pt.x == -1 && pt.y == -1)
{
int iCurrentPos = (int)SendMessage(hwndEdit,SCI_GETCURRENTPOS,0,0);
pt.x = (int)SendMessage(hwndEdit,SCI_POINTXFROMPOSITION,0,(LPARAM)iCurrentPos);
pt.y = (int)SendMessage(hwndEdit,SCI_POINTYFROMPOSITION,0,(LPARAM)iCurrentPos);
ClientToScreen(hwndEdit,&pt);
}
imenu = 0;
}
break;
case IDC_TOOLBAR:
case IDC_STATUSBAR:
case IDC_REBAR:
if (pt.x == -1 && pt.y == -1)
GetCursorPos(&pt);
imenu = 1;
break;
}
TrackPopupMenuEx(GetSubMenu(hmenu,imenu),
TPM_LEFTBUTTON | TPM_RIGHTBUTTON,pt.x+1,pt.y+1,hwnd,NULL);
DestroyMenu(hmenu);
}
break;
return MsgContextMenu(hwnd, umsg, wParam, lParam);
case WM_INITMENU:
MsgInitMenu(hwnd,wParam,lParam);
break;
case WM_MOUSEWHEEL:
return DefWindowProc(hwnd,umsg,wParam,lParam);
case WM_NOTIFY:
return MsgNotify(hwnd,wParam,lParam);
@ -1491,80 +1252,12 @@ LRESULT CALLBACK MainWndProc(HWND hwnd,UINT umsg,WPARAM wParam,LPARAM lParam)
case WM_COMMAND:
return MsgCommand(hwnd,wParam,lParam);
case WM_SYSCOMMAND:
switch (wParam)
{
case SC_MINIMIZE:
ShowOwnedPopups(hwnd,FALSE);
if (bMinimizeToTray) {
MinimizeWndToTray(hwnd);
ShowNotifyIcon(hwnd,TRUE);
SetNotifyIconTitle(hwnd);
return(0);
}
else
return DefWindowProc(hwnd,umsg,wParam,lParam);
return MsgSysCommand(hwnd, umsg, wParam, lParam);
case SC_RESTORE: {
LRESULT lrv = DefWindowProc(hwnd,umsg,wParam,lParam);
ShowOwnedPopups(hwnd,TRUE);
return(lrv);
}
}
return DefWindowProc(hwnd,umsg,wParam,lParam);
case WM_CHANGENOTIFY:
if (iFileWatchingMode == 1 || bModified || Encoding_HasChanged(CPI_GET))
SetForegroundWindow(hwnd);
if (PathFileExists(szCurFile)) {
if ((iFileWatchingMode == 2 && !bModified && !Encoding_HasChanged(CPI_GET)) ||
MsgBox(MBYESNO,IDS_FILECHANGENOTIFY) == IDYES) {
int iCurPos = (int)SendMessage(hwndEdit,SCI_GETCURRENTPOS,0,0);
int iAnchorPos = (int)SendMessage(hwndEdit,SCI_GETANCHOR,0,0);
int iVisTopLine = (int)SendMessage(hwndEdit,SCI_GETFIRSTVISIBLELINE,0,0);
int iDocTopLine = (int)SendMessage(hwndEdit,SCI_DOCLINEFROMVISIBLE,(WPARAM)iVisTopLine,0);
int iXOffset = (int)SendMessage(hwndEdit,SCI_GETXOFFSET,0,0);
BOOL bIsTail = (iCurPos == iAnchorPos) && (iCurPos == SendMessage(hwndEdit,SCI_GETLENGTH,0,0));
Encoding_SrcWeak(Encoding_Current(CPI_GET));
if (FileLoad(TRUE,FALSE,TRUE,FALSE,szCurFile)) {
if (bIsTail && iFileWatchingMode == 2) {
EditJumpTo(hwndEdit,-1,0);
EditEnsureSelectionVisible(hwndEdit);
}
else if (SendMessage(hwndEdit,SCI_GETLENGTH,0,0) >= 4) {
char tch[5] = { '\0' };
SendMessage(hwndEdit,SCI_GETTEXT,5,(LPARAM)tch);
if (StringCchCompareXA(tch,".LOG") != 0) {
int iNewTopLine;
SendMessage(hwndEdit,SCI_SETSEL,iAnchorPos,iCurPos);
SendMessage(hwndEdit,SCI_ENSUREVISIBLE,(WPARAM)iDocTopLine,0);
iNewTopLine = (int)SendMessage(hwndEdit,SCI_GETFIRSTVISIBLELINE,0,0);
SendMessage(hwndEdit,SCI_LINESCROLL,0,(LPARAM)iVisTopLine - iNewTopLine);
SendMessage(hwndEdit,SCI_SETXOFFSET,(WPARAM)iXOffset,0);
}
}
}
}
}
else {
if (MsgBox(MBYESNO,IDS_FILECHANGENOTIFY2) == IDYES)
FileSave(TRUE,FALSE,FALSE,FALSE);
}
if (!bRunningWatch)
InstallFileWatching(szCurFile);
break;
case WM_CHANGENOTIFY:
MsgChangeNotify(hwnd, wParam, lParam);
break;
//// This message is posted before Notepad3 reactivates itself
@ -1592,65 +1285,19 @@ LRESULT CALLBACK MainWndProc(HWND hwnd,UINT umsg,WPARAM wParam,LPARAM lParam)
case WM_TRAYMESSAGE:
switch(lParam)
{
case WM_RBUTTONUP: {
HMENU hMenu = LoadMenu(g_hInstance,MAKEINTRESOURCE(IDR_POPUPMENU));
HMENU hMenuPopup = GetSubMenu(hMenu,2);
POINT pt;
int iCmd;
SetForegroundWindow(hwnd);
GetCursorPos(&pt);
SetMenuDefaultItem(hMenuPopup,IDM_TRAY_RESTORE,FALSE);
iCmd = TrackPopupMenu(hMenuPopup,
TPM_NONOTIFY|TPM_RETURNCMD|TPM_LEFTBUTTON|TPM_RIGHTBUTTON,
pt.x,pt.y,0,hwnd,NULL);
PostMessage(hwnd,WM_NULL,0,0);
DestroyMenu(hMenu);
if (iCmd == IDM_TRAY_RESTORE) {
ShowNotifyIcon(hwnd,FALSE);
RestoreWndFromTray(hwnd);
ShowOwnedPopups(hwnd,TRUE);
}
else if (iCmd == IDM_TRAY_EXIT) {
//ShowNotifyIcon(hwnd,FALSE);
SendMessage(hwnd,WM_CLOSE,0,0);
}
}
return TRUE;
case WM_LBUTTONUP:
ShowNotifyIcon(hwnd,FALSE);
RestoreWndFromTray(hwnd);
ShowOwnedPopups(hwnd,TRUE);
return TRUE;
}
break;
return MsgTrayMessage(hwnd, wParam, lParam);
default:
if (umsg == msgTaskbarCreated) {
if (!IsWindowVisible(hwnd))
ShowNotifyIcon(hwnd,TRUE);
SetNotifyIconTitle(hwnd);
return(0);
SetNotifyIconTitle(hwnd);
}
return DefWindowProc(hwnd,umsg,wParam,lParam);
return DefWindowProc(hwnd, umsg, wParam, lParam);
}
return(0);
return 0;
}
@ -2029,6 +1676,74 @@ void CreateBars(HWND hwnd,HINSTANCE hInstance)
}
//=============================================================================
//
// MsgEndSession() - Handle WM_ENDSESSION,WM_DESTROY
//
//
void MsgEndSession(HWND hwnd, UINT umsg)
{
static BOOL bShutdownOK = FALSE;
if (!bShutdownOK) {
// Terminate file watching
InstallFileWatching(NULL);
// GetWindowPlacement
wininfo = GetMyWindowPlacement(hwnd, NULL);
DragAcceptFiles(hwnd, FALSE);
// Terminate clipboard watching
if (flagPasteBoard) {
KillTimer(hwnd, ID_PASTEBOARDTIMER);
ChangeClipboardChain(hwnd, hwndNextCBChain);
}
// Destroy find / replace dialog
if (IsWindow(hDlgFindReplace))
DestroyWindow(hDlgFindReplace);
// call SaveSettings() when hwndToolbar is still valid
SaveSettings(FALSE);
if (StringCchLen(szIniFile) != 0) {
// Cleanup unwanted MRU's
if (!bSaveRecentFiles) {
MRU_Empty(pFileMRU);
MRU_Save(pFileMRU);
}
else
MRU_MergeSave(pFileMRU, TRUE, flagRelativeFileMRU, flagPortableMyDocs);
MRU_Destroy(pFileMRU);
if (!bSaveFindReplace) {
MRU_Empty(mruFind);
MRU_Empty(mruReplace);
MRU_Save(mruFind);
MRU_Save(mruReplace);
}
else {
MRU_MergeSave(mruFind, FALSE, FALSE, FALSE);
MRU_MergeSave(mruReplace, FALSE, FALSE, FALSE);
}
MRU_Destroy(mruFind);
MRU_Destroy(mruReplace);
}
// Remove tray icon if necessary
ShowNotifyIcon(hwnd, FALSE);
bShutdownOK = TRUE;
}
if (umsg == WM_DESTROY)
PostQuitMessage(0);
}
//=============================================================================
//
// MsgThemeChanged() - Handle WM_THEMECHANGED
@ -2166,10 +1881,334 @@ void MsgSize(HWND hwnd,WPARAM wParam,LPARAM lParam)
UNUSED(hwnd);
UNUSED(lParam);
}
//=============================================================================
//
// MsgDropFiles() - Handles WM_DROPFILES
//
//
void MsgDropFiles(HWND hwnd, WPARAM wParam, LPARAM lParam)
{
WCHAR szBuf[MAX_PATH + 40];
HDROP hDrop = (HDROP)wParam;
// Reset Change Notify
//bPendingChangeNotify = FALSE;
if (IsIconic(hwnd))
ShowWindow(hwnd, SW_RESTORE);
//SetForegroundWindow(hwnd);
DragQueryFile(hDrop, 0, szBuf, COUNTOF(szBuf));
if (PathIsDirectory(szBuf)) {
WCHAR tchFile[MAX_PATH] = { L'\0' };
if (OpenFileDlg(hwndMain, tchFile, COUNTOF(tchFile), szBuf))
FileLoad(FALSE, FALSE, FALSE, FALSE, tchFile);
}
else
FileLoad(FALSE, FALSE, FALSE, FALSE, szBuf);
if (DragQueryFile(hDrop, (UINT)(-1), NULL, 0) > 1)
MsgBox(MBWARN, IDS_ERR_DROP);
DragFinish(hDrop);
UNUSED(lParam);
}
//=============================================================================
//
// MsgCopyData() - Handles WM_COPYDATA
//
//
LRESULT MsgCopyData(HWND hwnd, WPARAM wParam, LPARAM lParam)
{
PCOPYDATASTRUCT pcds = (PCOPYDATASTRUCT)lParam;
// Reset Change Notify
//bPendingChangeNotify = FALSE;
SetDlgItemInt(hwnd, IDC_REUSELOCK, GetTickCount(), FALSE);
if (pcds->dwData == DATA_NOTEPAD3_PARAMS) {
LPnp3params params = LocalAlloc(LPTR, pcds->cbData);
CopyMemory(params, pcds->lpData, pcds->cbData);
if (params->flagLexerSpecified)
flagLexerSpecified = 1;
if (params->flagQuietCreate)
flagQuietCreate = 1;
if (params->flagFileSpecified) {
BOOL bOpened = FALSE;
Encoding_Source(params->iSrcEncoding);
if (PathIsDirectory(&params->wchData)) {
WCHAR tchFile[MAX_PATH] = { L'\0' };
if (OpenFileDlg(hwndMain, tchFile, COUNTOF(tchFile), &params->wchData))
bOpened = FileLoad(FALSE, FALSE, FALSE, FALSE, tchFile);
}
else
bOpened = FileLoad(FALSE, FALSE, FALSE, FALSE, &params->wchData);
if (bOpened) {
if (params->flagChangeNotify == 1) {
iFileWatchingMode = 0;
bResetFileWatching = TRUE;
InstallFileWatching(szCurFile);
}
else if (params->flagChangeNotify == 2) {
iFileWatchingMode = 2;
bResetFileWatching = TRUE;
InstallFileWatching(szCurFile);
}
if (0 != params->flagSetEncoding) {
flagSetEncoding = params->flagSetEncoding;
SendMessage(
hwnd,
WM_COMMAND,
MAKELONG(IDM_ENCODING_ANSI + flagSetEncoding - 1, 1),
0);
flagSetEncoding = 0;
}
if (0 != params->flagSetEOLMode) {
flagSetEOLMode = params->flagSetEOLMode;
SendMessage(
hwndMain,
WM_COMMAND,
MAKELONG(IDM_LINEENDINGS_CRLF + flagSetEOLMode - 1, 1),
0);
flagSetEOLMode = 0;
}
if (params->flagLexerSpecified) {
if (params->iInitialLexer < 0) {
WCHAR wchExt[32] = L".";
StringCchCopyN(CharNext(wchExt), 32, StrEnd(&params->wchData) + 1, 31);
Style_SetLexerFromName(hwndEdit, &params->wchData, wchExt);
}
else if (params->iInitialLexer >= 0 && params->iInitialLexer < NUMLEXERS)
Style_SetLexerFromID(hwndEdit, params->iInitialLexer);
}
if (params->flagTitleExcerpt) {
StringCchCopyN(szTitleExcerpt, COUNTOF(szTitleExcerpt), StrEnd(&params->wchData) + 1, COUNTOF(szTitleExcerpt));
}
}
// reset
Encoding_Source(CPI_NONE);
}
if (params->flagJumpTo) {
if (params->iInitialLine == 0)
params->iInitialLine = 1;
EditJumpTo(hwndEdit, params->iInitialLine, params->iInitialColumn);
EditEnsureSelectionVisible(hwndEdit);
}
flagLexerSpecified = 0;
flagQuietCreate = 0;
LocalFree(params);
UpdateToolbar();
UpdateStatusbar();
}
UNUSED(wParam);
return TRUE;
}
//=============================================================================
//
// MsgContextMenu() - Handles WM_CONTEXTMENU
//
//
LRESULT MsgContextMenu(HWND hwnd, UINT umsg, WPARAM wParam, LPARAM lParam)
{
HMENU hmenu;
int imenu = 0;
POINT pt;
int nID = GetDlgCtrlID((HWND)wParam);
if ((nID != IDC_EDIT) && (nID != IDC_STATUSBAR) &&
(nID != IDC_REBAR) && (nID != IDC_TOOLBAR))
return DefWindowProc(hwnd, umsg, wParam, lParam);
hmenu = LoadMenu(g_hInstance, MAKEINTRESOURCE(IDR_POPUPMENU));
//SetMenuDefaultItem(GetSubMenu(hmenu,1),0,FALSE);
pt.x = (int)(short)LOWORD(lParam);
pt.y = (int)(short)HIWORD(lParam);
switch (nID) {
case IDC_EDIT:
{
if (SendMessage(hwndEdit, SCI_GETSELECTIONEMPTY, 0, 0) && (pt.x != -1) && (pt.y != -1)) {
int iNewPos;
POINT ptc;
ptc.x = pt.x; ptc.y = pt.y;
ScreenToClient(hwndEdit, &ptc);
iNewPos = (int)SendMessage(hwndEdit, SCI_POSITIONFROMPOINT, (WPARAM)ptc.x, (LPARAM)ptc.y);
SendMessage(hwndEdit, SCI_GOTOPOS, (WPARAM)iNewPos, 0);
}
if (pt.x == -1 && pt.y == -1) {
int iCurrentPos = (int)SendMessage(hwndEdit, SCI_GETCURRENTPOS, 0, 0);
pt.x = (int)SendMessage(hwndEdit, SCI_POINTXFROMPOSITION, 0, (LPARAM)iCurrentPos);
pt.y = (int)SendMessage(hwndEdit, SCI_POINTYFROMPOSITION, 0, (LPARAM)iCurrentPos);
ClientToScreen(hwndEdit, &pt);
}
imenu = 0;
}
break;
case IDC_TOOLBAR:
case IDC_STATUSBAR:
case IDC_REBAR:
if (pt.x == -1 && pt.y == -1)
GetCursorPos(&pt);
imenu = 1;
break;
}
TrackPopupMenuEx(GetSubMenu(hmenu, imenu),
TPM_LEFTBUTTON | TPM_RIGHTBUTTON, pt.x + 1, pt.y + 1, hwnd, NULL);
DestroyMenu(hmenu);
return 0;
}
//=============================================================================
//
// MsgChangeNotify() - Handles WM_CHANGENOTIFY
//
//
void MsgChangeNotify(HWND hwnd, WPARAM wParam, LPARAM lParam)
{
if (iFileWatchingMode == 1 || bModified || Encoding_HasChanged(CPI_GET))
SetForegroundWindow(hwnd);
if (PathFileExists(szCurFile)) {
if ((iFileWatchingMode == 2 && !bModified && !Encoding_HasChanged(CPI_GET)) ||
MsgBox(MBYESNO, IDS_FILECHANGENOTIFY) == IDYES) {
int iCurPos = (int)SendMessage(hwndEdit, SCI_GETCURRENTPOS, 0, 0);
int iAnchorPos = (int)SendMessage(hwndEdit, SCI_GETANCHOR, 0, 0);
int iVisTopLine = (int)SendMessage(hwndEdit, SCI_GETFIRSTVISIBLELINE, 0, 0);
int iDocTopLine = (int)SendMessage(hwndEdit, SCI_DOCLINEFROMVISIBLE, (WPARAM)iVisTopLine, 0);
int iXOffset = (int)SendMessage(hwndEdit, SCI_GETXOFFSET, 0, 0);
BOOL bIsTail = (iCurPos == iAnchorPos) && (iCurPos == SendMessage(hwndEdit, SCI_GETLENGTH, 0, 0));
Encoding_SrcWeak(Encoding_Current(CPI_GET));
if (FileLoad(TRUE, FALSE, TRUE, FALSE, szCurFile)) {
if (bIsTail && iFileWatchingMode == 2) {
EditJumpTo(hwndEdit, -1, 0);
EditEnsureSelectionVisible(hwndEdit);
}
else if (SendMessage(hwndEdit, SCI_GETLENGTH, 0, 0) >= 4) {
char tch[5] = { '\0' };
SendMessage(hwndEdit, SCI_GETTEXT, 5, (LPARAM)tch);
if (StringCchCompareXA(tch, ".LOG") != 0) {
int iNewTopLine;
SendMessage(hwndEdit, SCI_SETSEL, iAnchorPos, iCurPos);
SendMessage(hwndEdit, SCI_ENSUREVISIBLE, (WPARAM)iDocTopLine, 0);
iNewTopLine = (int)SendMessage(hwndEdit, SCI_GETFIRSTVISIBLELINE, 0, 0);
SendMessage(hwndEdit, SCI_LINESCROLL, 0, (LPARAM)iVisTopLine - iNewTopLine);
SendMessage(hwndEdit, SCI_SETXOFFSET, (WPARAM)iXOffset, 0);
}
}
}
}
}
else {
if (MsgBox(MBYESNO, IDS_FILECHANGENOTIFY2) == IDYES)
FileSave(TRUE, FALSE, FALSE, FALSE);
}
if (!bRunningWatch)
InstallFileWatching(szCurFile);
UNUSED(wParam);
UNUSED(lParam);
}
//=============================================================================
//
// MsgTrayMessage() - Handles WM_TRAYMESSAGE
//
//
LRESULT MsgTrayMessage(HWND hwnd, WPARAM wParam, LPARAM lParam)
{
switch (lParam) {
case WM_RBUTTONUP:
{
HMENU hMenu = LoadMenu(g_hInstance, MAKEINTRESOURCE(IDR_POPUPMENU));
HMENU hMenuPopup = GetSubMenu(hMenu, 2);
POINT pt;
int iCmd;
SetForegroundWindow(hwnd);
GetCursorPos(&pt);
SetMenuDefaultItem(hMenuPopup, IDM_TRAY_RESTORE, FALSE);
iCmd = TrackPopupMenu(hMenuPopup,
TPM_NONOTIFY | TPM_RETURNCMD | TPM_LEFTBUTTON | TPM_RIGHTBUTTON,
pt.x, pt.y, 0, hwnd, NULL);
PostMessage(hwnd, WM_NULL, 0, 0);
DestroyMenu(hMenu);
if (iCmd == IDM_TRAY_RESTORE) {
ShowNotifyIcon(hwnd, FALSE);
RestoreWndFromTray(hwnd);
ShowOwnedPopups(hwnd, TRUE);
}
else if (iCmd == IDM_TRAY_EXIT) {
//ShowNotifyIcon(hwnd,FALSE);
SendMessage(hwnd, WM_CLOSE, 0, 0);
}
}
return TRUE;
case WM_LBUTTONUP:
ShowNotifyIcon(hwnd, FALSE);
RestoreWndFromTray(hwnd);
ShowOwnedPopups(hwnd, TRUE);
return TRUE;
}
UNUSED(wParam);
return 0;
}
//=============================================================================
//
// MsgInitMenu() - Handles WM_INITMENU
@ -2440,6 +2479,35 @@ void MsgInitMenu(HWND hwnd,WPARAM wParam,LPARAM lParam)
}
//=============================================================================
//
// MsgSysCommand() - Handles WM_SYSCOMMAND
//
//
LRESULT MsgSysCommand(HWND hwnd, UINT umsg, WPARAM wParam, LPARAM lParam)
{
switch (wParam) {
case SC_MINIMIZE:
ShowOwnedPopups(hwnd, FALSE);
if (bMinimizeToTray) {
MinimizeWndToTray(hwnd);
ShowNotifyIcon(hwnd, TRUE);
SetNotifyIconTitle(hwnd);
return(0);
}
else
return DefWindowProc(hwnd, umsg, wParam, lParam);
case SC_RESTORE:
{
LRESULT lrv = DefWindowProc(hwnd, umsg, wParam, lParam);
ShowOwnedPopups(hwnd, TRUE);
return(lrv);
}
}
return DefWindowProc(hwnd, umsg, wParam, lParam);
}
//=============================================================================
//
// MsgCommand() - Handles WM_COMMAND

View File

@ -158,14 +158,21 @@ BOOL OpenFileDlg(HWND,LPWSTR,int,LPCWSTR);
BOOL SaveFileDlg(HWND,LPWSTR,int,LPCWSTR);
LRESULT CALLBACK MainWndProc(HWND,UINT,WPARAM,LPARAM);
LRESULT MsgCreate(HWND,WPARAM,LPARAM);
void CreateBars(HWND,HINSTANCE);
void MsgThemeChanged(HWND,WPARAM,LPARAM);
void MsgSize(HWND,WPARAM,LPARAM);
void MsgInitMenu(HWND,WPARAM,LPARAM);
LRESULT MsgCommand(HWND,WPARAM,LPARAM);
LRESULT MsgNotify(HWND,WPARAM,LPARAM);
LRESULT CALLBACK MainWndProc(HWND, UINT, WPARAM, LPARAM);
LRESULT MsgCreate(HWND, WPARAM, LPARAM);
void MsgEndSession(HWND, UINT);
void CreateBars(HWND, HINSTANCE);
void MsgThemeChanged(HWND, WPARAM, LPARAM);
void MsgSize(HWND, WPARAM, LPARAM);
void MsgDropFiles(HWND, WPARAM, LPARAM);
LRESULT MsgCopyData(HWND, WPARAM, LPARAM);
LRESULT MsgContextMenu(HWND, UINT, WPARAM, LPARAM);
void MsgInitMenu(HWND, WPARAM, LPARAM);
void MsgChangeNotify(HWND, WPARAM, LPARAM);
LRESULT MsgTrayMessage(HWND, WPARAM, LPARAM);
LRESULT MsgSysCommand(HWND, UINT, WPARAM, LPARAM);
LRESULT MsgCommand(HWND, WPARAM, LPARAM);
LRESULT MsgNotify(HWND, WPARAM, LPARAM);
#endif //_NP3_NOTEPAD3_H_

Binary file not shown.