static void DebugChannels_OnNotify(HWND hDlg, LPARAM lParam) { NMHDR* nmh = (NMHDR*)lParam; switch (nmh->code) { case NM_CLICK: if (nmh->idFrom == IDC_DEBUG_CHANNELS_LIST) { LVHITTESTINFO lhti; HWND hChannelLV; HANDLE hProcess; NMITEMACTIVATE* nmia = (NMITEMACTIVATE*)lParam; hProcess = OpenProcess(PROCESS_VM_OPERATION | PROCESS_VM_READ | PROCESS_VM_WRITE, FALSE, get_selected_pid()); if (!hProcess) return; /* FIXME message box */ lhti.pt = nmia->ptAction; hChannelLV = GetDlgItem(hDlg, IDC_DEBUG_CHANNELS_LIST); SendMessageW(hChannelLV, LVM_SUBITEMHITTEST, 0, (LPARAM)&lhti); if (nmia->iSubItem >= 1 && nmia->iSubItem <= 4) { WCHAR val[2]; char name[32]; unsigned bitmask = 1 << (lhti.iSubItem - 1); struct cce_user user; ListView_GetItemTextA(hChannelLV, lhti.iItem, 0, name, sizeof(name) / sizeof(name[0])); ListView_GetItemTextW(hChannelLV, lhti.iItem, lhti.iSubItem, val, sizeof(val) / sizeof(val[0])); user.name = name; user.value = (val[0] == 'x') ? 0 : bitmask; user.mask = bitmask; user.done = user.notdone = 0; enum_channel(hProcess, change_channel_CB, &user); if (user.done) { val[0] ^= ('x' ^ ' '); ListView_SetItemTextW(hChannelLV, lhti.iItem, lhti.iSubItem, val); } if (user.notdone) printf("Some channel instances weren't correctly set\n"); } CloseHandle(hProcess); } break; } }
INT_PTR CALLBACK FindWindowDlgProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam) { switch (msg) { case WM_INITDIALOG: SendDlgItemMessage(hwnd, IDC_SBAR, SB_SETTEXT, 0, (LPARAM)TranslateT("Enter a string to search the database for")); CheckDlgButton(hwnd, IDC_MODNAME, BST_CHECKED); CheckDlgButton(hwnd, IDC_SETTINGNAME, BST_CHECKED); CheckDlgButton(hwnd, IDC_SETTINGVALUE, BST_CHECKED); CheckDlgButton(hwnd, IDC_FOUND, BST_CHECKED); SendMessage(hwnd, WM_SETICON, ICON_BIG, (LPARAM)LoadIcon(hInst, MAKEINTRESOURCE(ICO_REGEDIT))); SetWindowLongPtr(GetDlgItem(hwnd, IDC_REPLACE), GWLP_USERDATA, 0); SetWindowLongPtr(GetDlgItem(hwnd, IDC_SEARCH), GWLP_USERDATA, 0); SetWindowLong(hwnd, GWL_EXSTYLE, GetWindowLong(hwnd, GWL_EXSTYLE) | WS_EX_APPWINDOW); // taskbar icon TranslateDialogDefault(hwnd); ListView_SetExtendedListViewStyle(GetDlgItem(hwnd, IDC_LIST), 32 | LVS_EX_LABELTIP); // LVS_EX_GRIDLINES loadListSettings(GetDlgItem(hwnd, IDC_LIST), csResultList); Utils_RestoreWindowPositionNoMove(hwnd, NULL, modname, "Search_"); return TRUE; case WM_COMMAND: switch (LOWORD(wParam)) { case IDOK: case IDC_SEARCH: if (GetWindowLongPtr(GetDlgItem(hwnd, IDC_SEARCH), GWLP_USERDATA)) // stop the search SetWindowLongPtr(GetDlgItem(hwnd, IDC_SEARCH), GWLP_USERDATA, 0); else { TCHAR text[FLD_SIZE]; TCHAR replace[FLD_SIZE] = {0}; if (!GetDlgItemText(hwnd, IDC_TEXT, text, _countof(text)) && !IsDlgButtonChecked(hwnd, IDC_EXACT)) break; // empty replace is done only for exact match or entire replace if (LOWORD(wParam) == IDOK && !GetDlgItemText(hwnd, IDC_REPLACE, replace, _countof(replace)) && (!IsDlgButtonChecked(hwnd, IDC_ENTIRELY) && !IsDlgButtonChecked(hwnd, IDC_EXACT))) break; if (BST_UNCHECKED == IsDlgButtonChecked(hwnd, IDC_MODNAME) && BST_UNCHECKED == IsDlgButtonChecked(hwnd, IDC_SETTINGNAME) && BST_UNCHECKED == IsDlgButtonChecked(hwnd, IDC_SETTINGVALUE)) break; FindInfo *fi = (FindInfo*)mir_calloc(sizeof(FindInfo)); if (!fi) break; fi->hwnd = GetDlgItem(hwnd, IDC_LIST); fi->options = (IsDlgButtonChecked(hwnd, IDC_CASESENSITIVE) ? F_CASE : 0) | (IsDlgButtonChecked(hwnd, IDC_EXACT) ? F_EXACT : 0) | (IsDlgButtonChecked(hwnd, IDC_MODNAME) ? F_MODNAME : 0) | (IsDlgButtonChecked(hwnd, IDC_SETTINGNAME) ? F_SETNAME : 0) | (IsDlgButtonChecked(hwnd, IDC_SETTINGVALUE) ? F_SETVAL : 0); if (LOWORD(wParam) == IDOK) { if (IsDlgButtonChecked(hwnd, IDC_ENTIRELY)) fi->options |= F_ENTIRE; fi->replace = mir_tstrdup(replace); SetDlgItemText(hwnd, IDOK, TranslateT("Stop")); EnableWindow(GetDlgItem(hwnd, IDC_SEARCH), 0); } else { SetDlgItemText(hwnd, IDC_SEARCH, TranslateT("Stop")); EnableWindow(GetDlgItem(hwnd, IDOK), 0); } fi->search = mir_tstrdup(text); ListView_DeleteAllItems(fi->hwnd); SetWindowLongPtr(GetDlgItem(hwnd, IDC_SEARCH), GWLP_USERDATA, 1); EnableWindow(GetDlgItem(hwnd, IDCANCEL), 0); mir_forkthread(FindSettings, fi); } break; case IDCANCEL: DestroyWindow(hwnd); break; } break; case WM_GETMINMAXINFO: { MINMAXINFO *mmi = (MINMAXINFO*)lParam; mmi->ptMinTrackSize.x = 610; mmi->ptMinTrackSize.y = 300; } return 0; case WM_SIZE: Utils_ResizeDialog(hwnd, hInst, MAKEINTRESOURCEA(IDD_FIND), FindDialogResize); break; case WM_NOTIFY: if (LOWORD(wParam) != IDC_LIST) break; switch (((NMHDR*)lParam)->code) { case NM_DBLCLK: { LVHITTESTINFO hti; LVITEM lvi; HWND hwndResults = GetDlgItem(hwnd, IDC_LIST); hti.pt = ((NMLISTVIEW*)lParam)->ptAction; if (ListView_SubItemHitTest(hwndResults, &hti) > -1) { if (hti.flags&LVHT_ONITEM) { lvi.mask = LVIF_PARAM; lvi.iItem = hti.iItem; lvi.iSubItem = 0; if (ListView_GetItem(hwndResults, &lvi)) { ItemInfo ii = {0}; ii.hContact = (MCONTACT)lvi.lParam; ListView_GetItemTextA(hwndResults, hti.iItem, 2, ii.module, _countof(ii.module)); ListView_GetItemTextA(hwndResults, hti.iItem, 3, ii.setting, _countof(ii.setting)); if (ii.setting[0]) ii.type = FW_SETTINGNAME; else if (ii.module[0]) ii.type = FW_MODULE; SendMessage(hwnd2mainWindow, WM_FINDITEM, (WPARAM)&ii, 0); } } } break; } case LVN_COLUMNCLICK: { LPNMLISTVIEW lv = (LPNMLISTVIEW)lParam; ColumnsSortParams params; params.hList = GetDlgItem(hwnd, IDC_LIST); params.column = lv->iSubItem; params.last = lastColumn; ListView_SortItemsEx(params.hList, ColumnsCompare, (LPARAM)¶ms); lastColumn = (params.column == lastColumn) ? -1 : params.column; break; } } // switch break; case WM_DESTROY: ListView_DeleteAllItems(GetDlgItem(hwnd, IDC_LIST)); saveListSettings(GetDlgItem(hwnd, IDC_LIST), csResultList); Utils_SaveWindowPosition(hwnd, NULL, modname, "Search_"); break; } return 0; }