https://git.reactos.org/?p=reactos.git;a=commitdiff;h=2de6e7559ed24dd8d5a3f3eba90efc096aad0740
commit 2de6e7559ed24dd8d5a3f3eba90efc096aad0740 Author: Katayama Hirofumi MZ <katayama.hirofumi...@gmail.com> AuthorDate: Mon Dec 11 07:52:18 2023 +0900 Commit: GitHub <nore...@github.com> CommitDate: Mon Dec 11 07:52:18 2023 +0900 [SHIMGVW] Refactor Part 3 (#6148) Improve code flexibility. - Remove g_fnPrevProc, g_hDispWnd, g_hToolBar, and g_Anime global variables. - Declare PREVIEW_DATA structure and use it. - Encapsulate preview window by using user data. CORE-19358 --- dll/win32/shimgvw/shimgvw.c | 290 +++++++++++++++++++++++++++----------------- dll/win32/shimgvw/shimgvw.h | 4 - 2 files changed, 177 insertions(+), 117 deletions(-) diff --git a/dll/win32/shimgvw/shimgvw.c b/dll/win32/shimgvw/shimgvw.c index 82775a85d55..fc3bbdbf2ec 100644 --- a/dll/win32/shimgvw/shimgvw.c +++ b/dll/win32/shimgvw/shimgvw.c @@ -13,16 +13,14 @@ #include <shlobj.h> #include <shellapi.h> +/* Toolbar image size */ +#define TB_IMAGE_WIDTH 16 +#define TB_IMAGE_HEIGHT 16 + HINSTANCE g_hInstance; SHIMGVW_SETTINGS g_Settings; SHIMGVW_FILENODE *g_pCurrentFile; GpImage *g_pImage = NULL; -WNDPROC g_fnPrevProc = NULL; - -HWND g_hDispWnd = NULL; -HWND g_hToolBar = NULL; - -ANIME g_Anime; /* Animation */ /* zooming */ static UINT s_nZoomPercents = 100; @@ -92,31 +90,49 @@ static const TB_BUTTON_CONFIG s_ButtonConfig[] = DEFINE_BTN_CONFIG(HELP_TOC) }; -static VOID UpdateZoom(UINT NewZoom, BOOL bEnableBestFit, BOOL bEnableRealSize) +typedef struct tagPREVIEW_DATA +{ + HWND m_hwnd; + HWND m_hwndZoom; + HWND m_hwndToolBar; + INT m_nZoomPercents; + WNDPROC m_fnPrevProc; + ANIME m_Anime; /* Animation */ +} PREVIEW_DATA, *PPREVIEW_DATA; + +PPREVIEW_DATA Preview_GetData(HWND hwnd) +{ + return (PPREVIEW_DATA)GetWindowLongPtrW(hwnd, GWLP_USERDATA); +} + +static VOID +Preview_UpdateZoom(PPREVIEW_DATA pData, UINT NewZoom, BOOL bEnableBestFit, BOOL bEnableRealSize) { BOOL bEnableZoomIn, bEnableZoomOut; + HWND hToolBar = pData->m_hwndToolBar; /* If zoom has not been changed, ignore it */ - if (s_nZoomPercents == NewZoom) + if (pData->m_nZoomPercents == NewZoom) return; - s_nZoomPercents = NewZoom; + pData->m_nZoomPercents = NewZoom; /* Check if a zoom button of the toolbar must be grayed */ bEnableZoomIn = (NewZoom < MAX_ZOOM); bEnableZoomOut = (NewZoom > MIN_ZOOM); /* Update toolbar buttons */ - SendMessageW(g_hToolBar, TB_ENABLEBUTTON, IDC_ZOOM_OUT, bEnableZoomOut); - SendMessageW(g_hToolBar, TB_ENABLEBUTTON, IDC_ZOOM_IN, bEnableZoomIn); - SendMessageW(g_hToolBar, TB_ENABLEBUTTON, IDC_BEST_FIT, bEnableBestFit); - SendMessageW(g_hToolBar, TB_ENABLEBUTTON, IDC_REAL_SIZE, bEnableRealSize); + SendMessageW(hToolBar, TB_ENABLEBUTTON, IDC_ZOOM_OUT, bEnableZoomOut); + SendMessageW(hToolBar, TB_ENABLEBUTTON, IDC_ZOOM_IN, bEnableZoomIn); + SendMessageW(hToolBar, TB_ENABLEBUTTON, IDC_BEST_FIT, bEnableBestFit); + SendMessageW(hToolBar, TB_ENABLEBUTTON, IDC_REAL_SIZE, bEnableRealSize); /* Redraw the display window */ - InvalidateRect(g_hDispWnd, NULL, FALSE); + InvalidateRect(pData->m_hwndZoom, NULL, FALSE); } -static VOID ZoomInOrOut(BOOL bZoomIn) +static VOID +Preview_ZoomInOrOut(PPREVIEW_DATA pData, BOOL bZoomIn) { UINT i, NewZoom; @@ -146,10 +162,11 @@ static VOID ZoomInOrOut(BOOL bZoomIn) } /* Update toolbar and refresh screen */ - UpdateZoom(NewZoom, TRUE, TRUE); + Preview_UpdateZoom(pData, NewZoom, TRUE, TRUE); } -static VOID ResetZoom(VOID) +static VOID +Preview_ResetZoom(PPREVIEW_DATA pData) { RECT Rect; UINT ImageWidth, ImageHeight, NewZoom; @@ -158,7 +175,7 @@ static VOID ResetZoom(VOID) return; /* get disp window size and image size */ - GetClientRect(g_hDispWnd, &Rect); + GetClientRect(pData->m_hwndZoom, &Rect); GdipGetImageWidth(g_pImage, &ImageWidth); GdipGetImageHeight(g_pImage, &ImageHeight); @@ -191,12 +208,31 @@ static VOID ResetZoom(VOID) } } - UpdateZoom(NewZoom, FALSE, TRUE); + Preview_UpdateZoom(pData, NewZoom, FALSE, TRUE); +} + +static VOID +Preview_UpdateTitle(PPREVIEW_DATA pData, LPCWSTR FileName) +{ + WCHAR szText[MAX_PATH + 100]; + LPWSTR pchFileTitle; + + LoadStringW(g_hInstance, IDS_APPTITLE, szText, _countof(szText)); + + pchFileTitle = PathFindFileNameW(FileName); + if (pchFileTitle && *pchFileTitle) + { + StringCchCatW(szText, _countof(szText), L" - "); + StringCchCatW(szText, _countof(szText), pchFileTitle); + } + + SetWindowTextW(pData->m_hwnd, szText); } -static VOID pLoadImage(LPCWSTR szOpenFileName) +static VOID +Preview_pLoadImage(PPREVIEW_DATA pData, LPCWSTR szOpenFileName) { - Anime_FreeInfo(&g_Anime); + Anime_FreeInfo(&pData->m_Anime); if (g_pImage) { @@ -208,6 +244,7 @@ static VOID pLoadImage(LPCWSTR szOpenFileName) if (!szOpenFileName || GetFileAttributesW(szOpenFileName) == 0xFFFFFFFF) { DPRINT1("File %s not found!\n", szOpenFileName); + Preview_UpdateTitle(pData, NULL); return; } @@ -216,19 +253,29 @@ static VOID pLoadImage(LPCWSTR szOpenFileName) if (!g_pImage) { DPRINT1("GdipLoadImageFromFile() failed\n"); + Preview_UpdateTitle(pData, NULL); return; } - Anime_LoadInfo(&g_Anime); + Anime_LoadInfo(&pData->m_Anime); if (szOpenFileName && szOpenFileName[0]) SHAddToRecentDocs(SHARD_PATHW, szOpenFileName); /* Reset zoom and redraw display */ - ResetZoom(); + Preview_ResetZoom(pData); + + Preview_UpdateTitle(pData, szOpenFileName); } -static VOID pSaveImageAs(HWND hwnd) +static VOID +Preview_pLoadImageFromNode(PPREVIEW_DATA pData, SHIMGVW_FILENODE *pNode) +{ + Preview_pLoadImage(pData, (pNode ? pNode->FileName : NULL)); +} + +static VOID +Preview_pSaveImageAs(PPREVIEW_DATA pData) { OPENFILENAMEW sfn; ImageCodecInfo *codecInfo; @@ -238,6 +285,7 @@ static VOID pSaveImageAs(HWND hwnd) UINT num, size, j; size_t sizeRemain; WCHAR *c; + HWND hwnd = pData->m_hwnd; if (g_pImage == NULL) return; @@ -306,14 +354,14 @@ static VOID pSaveImageAs(HWND hwnd) if (GetSaveFileNameW(&sfn)) { - Anime_Pause(&g_Anime); + Anime_Pause(&pData->m_Anime); if (GdipSaveImageToFile(g_pImage, szSaveFileName, &codecInfo[sfn.nFilterIndex - 1].Clsid, NULL) != Ok) { DPRINT1("GdipSaveImageToFile() failed\n"); } - Anime_Start(&g_Anime, 0); + Anime_Start(&pData->m_Anime, 0); } QuickFree(szFilterMask); @@ -321,42 +369,18 @@ static VOID pSaveImageAs(HWND hwnd) } static VOID -pPrintImage(HWND hwnd) +Preview_pPrintImage(PPREVIEW_DATA pData) { /* FIXME */ } static VOID -Preview_UpdateUI(HWND hwnd) +Preview_UpdateUI(PPREVIEW_DATA pData) { BOOL bEnable = (g_pImage != NULL); - SendMessageW(g_hToolBar, TB_ENABLEBUTTON, IDC_SAVEAS, bEnable); - SendMessageW(g_hToolBar, TB_ENABLEBUTTON, IDC_PRINT, bEnable); - InvalidateRect(g_hDispWnd, NULL, FALSE); -} - -static BOOL -pLoadImageFromNode(SHIMGVW_FILENODE *node, HWND hwnd) -{ - WCHAR szText[MAX_PATH + 100]; - LPWSTR pchFileTitle; - - pLoadImage(node ? node->FileName : NULL); - - if (node == NULL) - return FALSE; - - LoadStringW(g_hInstance, IDS_APPTITLE, szText, _countof(szText)); - - pchFileTitle = PathFindFileNameW(node->FileName); - if (pchFileTitle && *pchFileTitle) - { - StringCchCatW(szText, _countof(szText), L" - "); - StringCchCatW(szText, _countof(szText), pchFileTitle); - } - SetWindowTextW(hwnd, szText); - - return g_pImage != NULL; + SendMessageW(pData->m_hwndToolBar, TB_ENABLEBUTTON, IDC_SAVEAS, bEnable); + SendMessageW(pData->m_hwndToolBar, TB_ENABLEBUTTON, IDC_PRINT, bEnable); + InvalidateRect(pData->m_hwndZoom, NULL, FALSE); } static SHIMGVW_FILENODE* @@ -670,43 +694,45 @@ ImageView_SaveSettings(VOID) } static BOOL -Preview_CreateToolBar(HWND hwnd) +Preview_CreateToolBar(PPREVIEW_DATA pData) { - g_hToolBar = CreateWindowExW(0, TOOLBARCLASSNAMEW, NULL, - WS_CHILD | WS_VISIBLE | TBSTYLE_FLAT | CCS_BOTTOM | TBSTYLE_TOOLTIPS, - 0, 0, 0, 0, hwnd, NULL, g_hInstance, NULL); - if (g_hToolBar != NULL) - { - HIMAGELIST hImageList; + HWND hwndToolBar; + HIMAGELIST hImageList, hOldImageList; + const DWORD style = WS_CHILD | WS_VISIBLE | TBSTYLE_FLAT | CCS_BOTTOM | TBSTYLE_TOOLTIPS; - SendMessageW(g_hToolBar, TB_SETEXTENDEDSTYLE, 0, TBSTYLE_EX_HIDECLIPPEDBUTTONS); + hwndToolBar = CreateWindowExW(0, TOOLBARCLASSNAMEW, NULL, style, + 0, 0, 0, 0, pData->m_hwnd, NULL, g_hInstance, NULL); + if (!hwndToolBar) + return FALSE; - SendMessageW(g_hToolBar, TB_BUTTONSTRUCTSIZE, sizeof(s_Buttons[0]), 0); + pData->m_hwndToolBar = hwndToolBar; - hImageList = ImageList_Create(TB_IMAGE_WIDTH, TB_IMAGE_HEIGHT, ILC_MASK | ILC_COLOR24, 1, 1); - if (hImageList == NULL) - return FALSE; + SendMessageW(hwndToolBar, TB_BUTTONSTRUCTSIZE, sizeof(s_Buttons[0]), 0); + SendMessageW(hwndToolBar, TB_SETEXTENDEDSTYLE, 0, TBSTYLE_EX_HIDECLIPPEDBUTTONS); - for (UINT n = 0; n < _countof(s_ButtonConfig); n++) - { - ImageList_AddMasked(hImageList, LoadImageW(g_hInstance, MAKEINTRESOURCEW(s_ButtonConfig[n].idb), IMAGE_BITMAP, - TB_IMAGE_WIDTH, TB_IMAGE_HEIGHT, LR_DEFAULTCOLOR), RGB(255, 255, 255)); - } + hImageList = ImageList_Create(TB_IMAGE_WIDTH, TB_IMAGE_HEIGHT, ILC_MASK | ILC_COLOR24, 1, 1); + if (hImageList == NULL) + return FALSE; - ImageList_Destroy((HIMAGELIST)SendMessageW(g_hToolBar, TB_SETIMAGELIST, - 0, (LPARAM)hImageList)); + for (UINT n = 0; n < _countof(s_ButtonConfig); n++) + { + HBITMAP hBitmap = LoadBitmapW(g_hInstance, MAKEINTRESOURCEW(s_ButtonConfig[n].idb)); + ImageList_AddMasked(hImageList, hBitmap, RGB(255, 255, 255)); + DeleteObject(hBitmap); + } - SendMessageW(g_hToolBar, TB_ADDBUTTONS, _countof(s_Buttons), (LPARAM)s_Buttons); + hOldImageList = (HIMAGELIST)SendMessageW(hwndToolBar, TB_SETIMAGELIST, 0, (LPARAM)hImageList); + ImageList_Destroy(hOldImageList); - return TRUE; - } + SendMessageW(hwndToolBar, TB_ADDBUTTONS, _countof(s_Buttons), (LPARAM)s_Buttons); - return FALSE; + return TRUE; } LRESULT CALLBACK ZoomWndProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam) { + PPREVIEW_DATA pData = (PPREVIEW_DATA)GetWindowLongPtrW(hwnd, GWLP_USERDATA); switch (uMsg) { case WM_PAINT: @@ -716,12 +742,14 @@ ZoomWndProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam) } case WM_TIMER: { - if (Anime_OnTimer(&g_Anime, wParam)) + if (Anime_OnTimer(&pData->m_Anime, wParam)) InvalidateRect(hwnd, NULL, FALSE); break; } default: - return CallWindowProcW(g_fnPrevProc, hwnd, uMsg, wParam, lParam); + { + return CallWindowProcW(pData->m_fnPrevProc, hwnd, uMsg, wParam, lParam); + } } return 0; } @@ -729,17 +757,35 @@ ZoomWndProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam) static BOOL Preview_OnCreate(HWND hwnd, LPCREATESTRUCT pCS) { + HWND hwndZoom; + PPREVIEW_DATA pData = QuickAlloc(sizeof(PREVIEW_DATA), TRUE); + pData->m_hwnd = hwnd; + SetWindowLongPtrW(hwnd, GWLP_USERDATA, (LONG_PTR)pData); + DragAcceptFiles(hwnd, TRUE); - g_hDispWnd = CreateWindowExW(WS_EX_CLIENTEDGE, WC_STATIC, L"", - WS_CHILD | WS_VISIBLE, - 0, 0, 0, 0, hwnd, NULL, g_hInstance, NULL); + hwndZoom = CreateWindowExW(WS_EX_CLIENTEDGE, WC_STATIC, NULL, WS_CHILD | WS_VISIBLE, + 0, 0, 0, 0, hwnd, NULL, g_hInstance, NULL); + if (!hwndZoom) + { + QuickFree(pData); + return FALSE; + } + + pData->m_hwndZoom = hwndZoom; + SetWindowLongPtrW(hwndZoom, GWLP_USERDATA, (LONG_PTR)pData); - SetClassLongPtr(g_hDispWnd, GCL_STYLE, CS_HREDRAW | CS_VREDRAW); - g_fnPrevProc = (WNDPROC)SetWindowLongPtr(g_hDispWnd, GWLP_WNDPROC, (LPARAM)ZoomWndProc); + SetClassLongPtr(pData->m_hwndZoom, GCL_STYLE, CS_HREDRAW | CS_VREDRAW); + pData->m_fnPrevProc = (WNDPROC)SetWindowLongPtr(pData->m_hwndZoom, + GWLP_WNDPROC, (LPARAM)ZoomWndProc); - Preview_CreateToolBar(hwnd); - Anime_SetTimerWnd(&g_Anime, g_hDispWnd); + if (!Preview_CreateToolBar(pData)) + { + QuickFree(pData); + return FALSE; + } + + Anime_SetTimerWnd(&pData->m_Anime, pData->m_hwndZoom); if (pCS && pCS->lpCreateParams) { @@ -751,8 +797,8 @@ Preview_OnCreate(HWND hwnd, LPCREATESTRUCT pCS) PathUnquoteSpacesW(szFile); g_pCurrentFile = pBuildFileList(szFile); - pLoadImageFromNode(g_pCurrentFile, hwnd); - Preview_UpdateUI(hwnd); + Preview_pLoadImageFromNode(pData, g_pCurrentFile); + Preview_UpdateUI(pData); } return TRUE; @@ -761,10 +807,11 @@ Preview_OnCreate(HWND hwnd, LPCREATESTRUCT pCS) static VOID Preview_OnMouseWheel(HWND hwnd, INT x, INT y, INT zDelta, UINT fwKeys) { + PPREVIEW_DATA pData = Preview_GetData(hwnd); if (zDelta != 0) { if (GetKeyState(VK_CONTROL) < 0) - ZoomInOrOut(zDelta > 0); + Preview_ZoomInOrOut(pData, zDelta > 0); } } @@ -792,23 +839,26 @@ static VOID Preview_OnSize(HWND hwnd, UINT state, INT cx, INT cy) { RECT rc; + PPREVIEW_DATA pData = Preview_GetData(hwnd); + HWND hToolBar = pData->m_hwndToolBar; - SendMessageW(g_hToolBar, TB_AUTOSIZE, 0, 0); + SendMessageW(hToolBar, TB_AUTOSIZE, 0, 0); - GetWindowRect(g_hToolBar, &rc); + GetWindowRect(hToolBar, &rc); - MoveWindow(g_hDispWnd, 0, 0, cx, cy - (rc.bottom - rc.top), TRUE); + MoveWindow(pData->m_hwndZoom, 0, 0, cx, cy - (rc.bottom - rc.top), TRUE); if (!IsIconic(hwnd)) /* Is it not minimized? */ - ResetZoom(); + Preview_ResetZoom(pData); Preview_OnMoveSize(hwnd); } static VOID -Preview_Delete(HWND hwnd) +Preview_Delete(PPREVIEW_DATA pData) { WCHAR szCurFile[MAX_PATH + 1], szNextFile[MAX_PATH]; + HWND hwnd = pData->m_hwnd; SHFILEOPSTRUCTW FileOp = { hwnd, FO_DELETE }; if (!g_pCurrentFile) @@ -836,14 +886,14 @@ Preview_Delete(HWND hwnd) { DPRINT("Preview_Delete: SHFileOperationW() failed or canceled\n"); - pLoadImage(szCurFile); + Preview_pLoadImage(pData, szCurFile); return; } /* Reload the file list and go next file */ pFreeFileList(g_pCurrentFile); g_pCurrentFile = pBuildFileList(szNextFile); - pLoadImageFromNode(g_pCurrentFile, hwnd); + Preview_pLoadImageFromNode(pData, g_pCurrentFile); } static VOID @@ -872,14 +922,16 @@ Preview_Edit(HWND hwnd) static VOID Preview_OnCommand(HWND hwnd, UINT nCommandID) { + PPREVIEW_DATA pData = Preview_GetData(hwnd); + switch (nCommandID) { case IDC_PREV_PIC: if (g_pCurrentFile) { g_pCurrentFile = g_pCurrentFile->Prev; - pLoadImageFromNode(g_pCurrentFile, hwnd); - Preview_UpdateUI(hwnd); + Preview_pLoadImageFromNode(pData, g_pCurrentFile); + Preview_UpdateUI(pData); } break; @@ -887,17 +939,17 @@ Preview_OnCommand(HWND hwnd, UINT nCommandID) if (g_pCurrentFile) { g_pCurrentFile = g_pCurrentFile->Next; - pLoadImageFromNode(g_pCurrentFile, hwnd); - Preview_UpdateUI(hwnd); + Preview_pLoadImageFromNode(pData, g_pCurrentFile); + Preview_UpdateUI(pData); } break; case IDC_BEST_FIT: - ResetZoom(); + Preview_ResetZoom(pData); break; case IDC_REAL_SIZE: - UpdateZoom(100, TRUE, FALSE); + Preview_UpdateZoom(pData, 100, TRUE, FALSE); break; case IDC_SLIDE_SHOW: @@ -905,19 +957,19 @@ Preview_OnCommand(HWND hwnd, UINT nCommandID) break; case IDC_ZOOM_IN: - ZoomInOrOut(TRUE); + Preview_ZoomInOrOut(pData, TRUE); break; case IDC_ZOOM_OUT: - ZoomInOrOut(FALSE); + Preview_ZoomInOrOut(pData, FALSE); break; case IDC_SAVEAS: - pSaveImageAs(hwnd); + Preview_pSaveImageAs(pData); break; case IDC_PRINT: - pPrintImage(hwnd); + Preview_pPrintImage(pData); break; case IDC_ROT_CLOCKW: @@ -937,13 +989,13 @@ Preview_OnCommand(HWND hwnd, UINT nCommandID) break; case IDC_DELETE: - Preview_Delete(hwnd); - Preview_UpdateUI(hwnd); + Preview_Delete(pData); + Preview_UpdateUI(pData); break; case IDC_MODIFY: Preview_Edit(hwnd); - Preview_UpdateUI(hwnd); + Preview_UpdateUI(pData); break; } } @@ -967,6 +1019,8 @@ Preview_OnNotify(HWND hwnd, LPNMHDR pnmhdr) static VOID Preview_OnDestroy(HWND hwnd) { + PPREVIEW_DATA pData = Preview_GetData(hwnd); + pFreeFileList(g_pCurrentFile); g_pCurrentFile = NULL; @@ -976,9 +1030,18 @@ Preview_OnDestroy(HWND hwnd) g_pImage = NULL; } - Anime_FreeInfo(&g_Anime); + Anime_FreeInfo(&pData->m_Anime); + + SetWindowLongPtr(pData->m_hwndZoom, GWLP_WNDPROC, (LPARAM)pData->m_fnPrevProc); + SetWindowLongPtr(pData->m_hwndZoom, GWLP_USERDATA, 0); + DestroyWindow(pData->m_hwndZoom); + pData->m_hwndZoom = NULL; + + DestroyWindow(pData->m_hwndToolBar); + pData->m_hwndToolBar = NULL; + + QuickFree(pData); - SetWindowLongPtr(g_hDispWnd, GWLP_WNDPROC, (LPARAM)g_fnPrevProc); PostQuitMessage(0); } @@ -986,12 +1049,13 @@ static VOID Preview_OnDropFiles(HWND hwnd, HDROP hDrop) { WCHAR szFile[MAX_PATH]; + PPREVIEW_DATA pData = Preview_GetData(hwnd); DragQueryFileW(hDrop, 0, szFile, _countof(szFile)); pFreeFileList(g_pCurrentFile); g_pCurrentFile = pBuildFileList(szFile); - pLoadImageFromNode(g_pCurrentFile, hwnd); + Preview_pLoadImageFromNode(pData, g_pCurrentFile); DragFinish(hDrop); } diff --git a/dll/win32/shimgvw/shimgvw.h b/dll/win32/shimgvw/shimgvw.h index a9a7b7b8daa..cebbaea06b3 100644 --- a/dll/win32/shimgvw/shimgvw.h +++ b/dll/win32/shimgvw/shimgvw.h @@ -29,11 +29,7 @@ #include "resource.h" -#define TB_IMAGE_WIDTH 16 -#define TB_IMAGE_HEIGHT 16 - extern HINSTANCE g_hInstance; -extern HWND g_hDispWnd; extern GpImage *g_pImage; typedef struct