#include "common.h" #include "progress_dialog.h" #define ID_PROGTIMER 101 // message loop messages #define WMU_NEWPROGRESSWINDOW (WM_USER + 0x200) #define WMU_KILLPROGRESSWINDOW (WM_USER + 0x201) HWND hwndProgress = 0; unsigned int dwProgressThreadId = 0; HANDLE hProgSyncEvent = 0; INT_PTR CALLBACK DlgProcProgress(HWND hwndDlg, UINT msg, WPARAM wParam, LPARAM lParam) { switch ( msg ) { case WM_INITDIALOG: TranslateDialogDefault( hwndDlg ); SetWindowLongPtr(hwndDlg, GWLP_USERDATA, 0); SendMessage(hwndDlg, WM_SETICON, ICON_SMALL, (LPARAM)LoadIconEx(I_CHKUPD)); SendMessage(hwndDlg, WM_SETICON, ICON_BIG, (LPARAM)LoadIconEx(I_CHKUPD, true)); SAVEWINDOWPOS swp; swp.hwnd=hwndDlg; swp.hContact=0; swp.szModule=MODULE; swp.szNamePrefix="ProgressWindow"; CallService(MS_UTILS_RESTOREWINDOWPOSITION, RWPF_NOSIZE | RWPF_NOACTIVATE, (LPARAM)&swp); PostMessage(hwndDlg, WMU_SETPROGRESS, 0, 0); return FALSE; case WM_TIMER: if(wParam == ID_PROGTIMER) { TCHAR text[512]; GetDlgItemText(hwndDlg, IDC_PROGMSG, text, 512); size_t len = _tcslen(text); INT_PTR pos = (INT_PTR)GetWindowLongPtr(hwndDlg, GWLP_USERDATA); if(len >= 3 && len < 511) { pos = (pos + 1) % 4; if(pos == 0) text[len - 3] = 0; else _tcscat(text, _T(".")); SetDlgItemText(hwndDlg, IDC_PROGMSG, text); SetWindowLongPtr(hwndDlg, GWLP_USERDATA, pos); } return TRUE; } break; case WMU_SETMESSAGE: KillTimer(hwndDlg, ID_PROGTIMER); SetDlgItemText(hwndDlg, IDC_PROGMSG, (TCHAR *)wParam); SetWindowLongPtr(hwndDlg, GWLP_USERDATA, 0); SetTimer(hwndDlg, ID_PROGTIMER, (WPARAM)500, 0); return TRUE; case WMU_SETPROGRESS: SendDlgItemMessage(hwndDlg, IDC_PROGRESS, PBM_SETPOS, wParam, 0); { TCHAR buff[512]; mir_sntprintf(buff, SIZEOF(buff), TranslateT("Progress - %d%%"), wParam); SetWindowText(hwndDlg, buff); } return TRUE; case WM_COMMAND: return TRUE; // disable esc, enter, etc case WM_CLOSE: PostThreadMessage(dwProgressThreadId, WMU_KILLPROGRESSWINDOW, 0, 0); break; case WM_DESTROY: KillTimer(hwndDlg, ID_PROGTIMER); Utils_SaveWindowPosition(hwndDlg,0,MODULE,"ProgressWindow"); ReleaseIconEx((HICON)SendMessage(hwndDlg, WM_SETICON, ICON_SMALL, (LPARAM)0)); ReleaseIconEx((HICON)SendMessage(hwndDlg, WM_SETICON, ICON_BIG, (LPARAM)0)); break; } return FALSE; } //DWORD CALLBACK ProgressWindowThread(LPVOID param) { unsigned int CALLBACK ProgressWindowThread(void *param) { if(param) SetEvent((HANDLE)param); MSG hwndMsg = {0}; while(GetMessage(&hwndMsg, 0, 0, 0) > 0 && !Miranda_Terminated()) { switch(hwndMsg.message) { case WMU_NEWPROGRESSWINDOW: if(hwndProgress) DestroyWindow(hwndProgress); hwndProgress = CreateDialog(hInst, MAKEINTRESOURCE(IDD_PROGRESS), 0, DlgProcProgress); SetWindowPos(hwndProgress, HWND_TOPMOST, 0, 0, 0, 0, SWP_NOMOVE | SWP_NOSIZE | SWP_NOACTIVATE | SWP_SHOWWINDOW); //ShowWindow(hwndProgress, SW_SHOWNOACTIVATE); UpdateWindow(hwndProgress); if(param) SetEvent((HANDLE)param); break; case WMU_KILLPROGRESSWINDOW: if(hwndProgress) { DestroyWindow(hwndProgress); hwndProgress = 0; } break; default: if(!IsDialogMessage(hwndProgress, &hwndMsg)) { TranslateMessage(&hwndMsg); DispatchMessage(&hwndMsg); } break; } } if(hwndProgress) DestroyWindow(hwndProgress); hwndProgress = 0; return 0; } void MakeProgressWindowThread() { hProgSyncEvent = CreateEvent(0, 0, 0, 0); CloseHandle(mir_forkthreadex(ProgressWindowThread, hProgSyncEvent, 0, &dwProgressThreadId)); WaitForSingleObject(hProgSyncEvent, INFINITE); } void KillProgressWindowThread() { PostThreadMessage(dwProgressThreadId, WM_QUIT, 0, 0); CloseHandle(hProgSyncEvent); } void CreateProgressWindow() { ResetEvent(hProgSyncEvent); PostThreadMessage(dwProgressThreadId, WMU_NEWPROGRESSWINDOW, 0, 0); WaitForSingleObject(hProgSyncEvent, INFINITE); } void ProgressWindowDone() { PostThreadMessage(dwProgressThreadId, WMU_KILLPROGRESSWINDOW, 0, 0); }