123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471 |
- #include "ConfigDlg.h"
- #include "gen_hotkeys.h"
- #include "accelBlock.h"
- #define ListView_InsertColumnW(hwnd, iCol, pcol) \
- (int)SNDMSG((hwnd), LVM_INSERTCOLUMNW, (WPARAM)(int)(iCol), (LPARAM)(const LV_COLUMNW *)(pcol))
- #define ListView_InsertItemW(hwnd, pitem) \
- (int)SNDMSG((hwnd), LVM_INSERTITEMW, 0, (LPARAM)(const LV_ITEMW *)(pitem))
- #define ListView_SetItemTextW(hwndLV, i, iSubItem_, pszText_) \
- { LV_ITEMW _macro_lvi;\
- _macro_lvi.iSubItem = (iSubItem_);\
- _macro_lvi.pszText = (pszText_);\
- SNDMSG((hwndLV), LVM_SETITEMTEXTW, (WPARAM)(i), (LPARAM)(LV_ITEMW *)&_macro_lvi);\
- }
- #define ListView_SetItemW(hwnd, pitem) \
- (BOOL)SNDMSG((hwnd), LVM_SETITEMW, 0, (LPARAM)(LV_ITEMW *)(pitem))
- void SetListItem(HWND hwHKList, HWND hwHK, HOTKEY_DATA *hk_data, int idx = -1, int failed = 0);
- static AcceleratorBlocker *pAccelBlock = NULL;
- static bool changed = false;
- static int setCheckedStuff(HWND hwndDlg)
- {
- int checked = SendMessage(GetDlgItem(hwndDlg, IDC_ENABLED), BM_GETCHECK, 0, 0) == BST_CHECKED;
- EnableWindow(GetDlgItem(hwndDlg,IDC_HKLIST),checked);
- EnableWindow(GetDlgItem(hwndDlg,IDC_COMBO),checked);
- EnableWindow(GetDlgItem(hwndDlg,IDC_HOTKEY),checked);
- EnableWindow(GetDlgItem(hwndDlg,IDC_ADD),checked);
- if (!checked)
- {
- EnableWindow(GetDlgItem(hwndDlg,IDC_SAVE),0);
- EnableWindow(GetDlgItem(hwndDlg,IDC_REMOVE),0);
- }
- EnableWindow(GetDlgItem(hwndDlg,IDC_DEFAULT),checked);
- return checked;
- }
- int ResizeComboBoxDropDown(HWND hwndDlg, UINT id, const char* str, int width){
- SIZE size = {0};
- HWND control = GetDlgItem(hwndDlg, id);
- HDC hdc = GetDC(control);
- // get and select parent dialog's font so that it'll calculate things correctly
- HFONT font = (HFONT)SendMessage(hwndDlg,WM_GETFONT,0,0), oldfont = (HFONT)SelectObject(hdc,font);
- GetTextExtentPoint32(hdc, str, lstrlen(str)+1, &size);
- int ret = width;
- if(size.cx > width)
- {
- SendDlgItemMessageW(hwndDlg, id, CB_SETDROPPEDWIDTH, size.cx, 0);
- ret = size.cx;
- }
- SelectObject(hdc, oldfont);
- ReleaseDC(control, hdc);
- return ret;
- }
- int ResizeComboBoxDropDownW(HWND hwndDlg, UINT id, const wchar_t *str, int width){
- SIZE size = {0};
- HWND control = GetDlgItem(hwndDlg, id);
- HDC hdc = GetDC(control);
- // get and select parent dialog's font so that it'll calculate things correctly
- HFONT font = (HFONT)SendMessage(hwndDlg,WM_GETFONT,0,0), oldfont = (HFONT)SelectObject(hdc,font);
- GetTextExtentPoint32W(hdc, str, (int)wcslen(str)+1, &size);
- int ret = width;
- if(size.cx > width)
- {
- SendDlgItemMessageW(hwndDlg, id, CB_SETDROPPEDWIDTH, size.cx, 0);
- ret = size.cx;
- }
- SelectObject(hdc, oldfont);
- ReleaseDC(control, hdc);
- return ret;
- }
- BOOL CALLBACK ConfigProc(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam)
- {
- HWND hwHKList = GetDlgItem(hwndDlg, IDC_HKLIST);
- HWND hwCombo = GetDlgItem(hwndDlg, IDC_COMBO);
- HWND hwHK = GetDlgItem(hwndDlg, IDC_HOTKEY);
- switch (uMsg)
- {
- case WM_INITDIALOG:
- {
- int colwidth1 = -1, colwidth2 = -1;
- if (hwHKList && hwHK)
- {
- RECT r;
- SendMessage(hwHKList, WM_SETREDRAW, FALSE, 0);
- ListView_SetExtendedListViewStyle(hwHKList, LVS_EX_FULLROWSELECT | LVS_EX_INFOTIP);
- GetClientRect(hwHKList, &r);
- colwidth2 = GetPrivateProfileIntW(L"gen_hotkeys", L"col2", -1, g_iniFile);
- LVCOLUMNW lc = {LVCF_TEXT | LVCF_WIDTH, 0,
- (colwidth2==-1?((r.right / 2) - GetSystemMetrics(SM_CYHSCROLL)):colwidth2),
- WASABI_API_LNGSTRINGW(IDS_GHK_HOTKEY_COLUMN), 0, 0
- };
- ListView_InsertColumnW(hwHKList, 0, &lc);
- lc.mask = LVCF_TEXT | LVCF_WIDTH | LVCF_SUBITEM;
- colwidth1 = GetPrivateProfileIntW(L"gen_hotkeys", L"col1", -1, g_iniFile);
- lc.cx = (colwidth1==-1?(r.right - lc.cx - GetSystemMetrics(SM_CYHSCROLL)):colwidth1);
- lc.pszText = WASABI_API_LNGSTRINGW(IDS_GHK_ACTION_COLUMN);
- lc.iSubItem = 1;
- ListView_InsertColumnW(hwHKList, 0, &lc);
- }
- changed = false;
- SubclassEditBox(hwHK);
- if (NULL != hwHK && NULL == pAccelBlock)
- pAccelBlock = new AcceleratorBlocker(hwHK);
-
- HBITMAP hBitmap = LoadBitmap(psPlugin.hDllInstance, MAKEINTRESOURCE(IDB_LVSTATE));
- HIMAGELIST hImageList = ImageList_Create(14, 14, ILC_COLOR8|ILC_MASK, 1, 0);
- ImageList_AddMasked(hImageList, hBitmap, RGB(252, 254, 252));
- ListView_SetImageList(hwHKList, hImageList, LVSIL_STATE);
- DeleteObject(hBitmap);
- ListView_SetItemCount(hwHKList, g_dwHotkeys);
- // We don't want our hot keys while in the config
- for (size_t i = 0; i < g_dwHotkeys; i++)
- {
- SetLastError(0);
- UnregisterHotkey(g_hotkeys + i);
- SetListItem(hwHKList, hwHK, &g_hotkeys[i].hkd, -1, g_hotkeys[i].failed);
- }
- hotkeysClear();
- if(colwidth1==-1)
- ListView_SetColumnWidth(hwHKList, 0, LVSCW_AUTOSIZE);
- if(colwidth2==-1)
- ListView_SetColumnWidth(hwHKList, 1, LVSCW_AUTOSIZE);
- // clear
- SendMessage(hwHK, wmHKCtlSet, 0, 0);
- ListView_SetItemState(hwHKList, -1, 0, LVIS_SELECTED);
- SendMessage(hwHKList, WM_SETREDRAW, TRUE, 0);
- int width = 0;
- for (size_t i = 0; i < GetCommandsNum(); i++)
- {
- bool unicode = 0;
- char *cmdname = GetCommandName((unsigned int)i, &unicode);
- if (*cmdname)
- {
- LRESULT pos;
- if (unicode)
- {
- pos = SendMessageW(hwCombo, CB_ADDSTRING, 0, (LPARAM) cmdname);
- width = ResizeComboBoxDropDownW(hwndDlg, IDC_COMBO, (wchar_t*)cmdname, width);
- }
- else
- {
- pos = SendMessageA(hwCombo, CB_ADDSTRING, 0, (LPARAM) cmdname);
- width = ResizeComboBoxDropDown(hwndDlg, IDC_COMBO, cmdname, width);
- }
- SendMessage(hwCombo, CB_SETITEMDATA, pos, i);
- }
- }
- // Set the enabled checkbox
- CheckDlgButton(hwndDlg,IDC_ENABLED,GetPrivateProfileIntW(L"gen_hotkeys", L"enabled", 0, g_iniFile));
- CheckDlgButton(hwndDlg,IDC_ENABLED_WM_APPCOMMAND,GetPrivateProfileIntW(L"gen_hotkeys", L"appcommand", 0, g_iniFile));
- setCheckedStuff(hwndDlg);
- if (NULL != WASABI_API_APP)
- WASABI_API_APP->DirectMouseWheel_EnableConvertToMouseWheel(hwHKList, TRUE);
- break;
- }
- case WM_COMMAND:
- {
- // we don't want accelerator keys working when the hotkey window is focused
- // that could be a problem if someone wants to bind Alt+D for example...
- if (GetFocus() == hwHK)
- break;
- switch (LOWORD(wParam))
- {
- case IDC_ADD:
- {
- HOTKEY_DATA hkd;
- DWORD dwHotKey = (unsigned long)SendMessage(hwHK, wmHKCtlGet, 0, 0);
- UINT iCommand = (unsigned int)SendMessage(hwCombo, CB_GETITEMDATA, SendMessage(hwCombo, CB_GETCURSEL, 0, 0), 0);
- if (!dwHotKey || iCommand == CB_ERR)
- break;
- hkd.dwHotKey = dwHotKey;
- hkd.iCommand = iCommand;
- changed = true;
- SetListItem(hwHKList, hwHK, &hkd);
- break;
- }
- case IDC_REMOVE:
- {
- int i = ListView_GetNextItem(hwHKList, -1, LVNI_SELECTED);
- while (i != -1)
- {
- LVITEM lvi = {LVIF_PARAM, i};
- ListView_GetItem(hwHKList, &lvi);
- HOTKEY_DATA *hkd = (HOTKEY_DATA *) lvi.lParam;
- delete hkd;
-
- changed = true;
- ListView_DeleteItem(hwHKList, i);
- i = ListView_GetNextItem(hwHKList, -1, LVNI_SELECTED);
- }
- EnableWindow(GetDlgItem(hwndDlg, IDC_REMOVE), 0);
- break;
- }
- case IDC_SAVE:
- {
- if (ListView_GetSelectedCount(hwHKList) != 1)
- break;
- int iSel = ListView_GetNextItem(hwHKList, -1, LVNI_SELECTED);
- LVITEMW lvi = {LVIF_PARAM, iSel};
- ListView_GetItem(hwHKList, &lvi);
- HOTKEY_DATA *hkd = (HOTKEY_DATA *) lvi.lParam;
- if (hkd)
- {
- DWORD dwHotKey = (unsigned long)SendMessage(hwHK, wmHKCtlGet, 0, 0);
- UINT iCommand = (unsigned int)SendMessage(hwCombo, CB_GETITEMDATA, SendMessage(hwCombo, CB_GETCURSEL, 0, 0), 0);
- if (!dwHotKey || iCommand == CB_ERR)
- break;
- hkd->dwHotKey = dwHotKey;
- hkd->iCommand = iCommand;
- changed = true;
- SetListItem(hwHKList, hwHK, hkd, iSel);
- }
- break;
- }
- case IDC_ENABLED:
- if (setCheckedStuff(hwndDlg))
- {
- DWORD dwSelected = ListView_GetSelectedCount(hwHKList);
- EnableWindow(GetDlgItem(hwndDlg, IDC_SAVE), dwSelected == 1);
- EnableWindow(GetDlgItem(hwndDlg, IDC_REMOVE), dwSelected);
- changed = true;
- }
- break;
- case IDC_DEFAULT:
- {
- DWORD i;
- SendMessage(hwndDlg, WM_SETREDRAW, FALSE, 0);
- DWORD dwCount = (DWORD)ListView_GetItemCount(hwHKList);
- if (dwCount)
- {
- for (i = 0; i < dwCount; i++)
- {
- LVITEM lvi = {LVIF_PARAM,(int)i};
- ListView_GetItem(hwHKList, &lvi);
- HOTKEY_DATA *hkd = (HOTKEY_DATA *) lvi.lParam;
- delete hkd;
- }
- }
- changed = true;
- ListView_DeleteAllItems(hwHKList);
- for (i = 0; i < DEFHKDS_NUM; i++)
- {
- SetListItem(hwHKList, hwHK, g_defhkds + i);
- }
- // restore the size of the columns on a reset as well
- ListView_SetColumnWidth(hwHKList, 0, LVSCW_AUTOSIZE);
- ListView_SetColumnWidth(hwHKList, 1, LVSCW_AUTOSIZE);
- ListView_SetItemState(hwHKList, -1, 0, LVIS_SELECTED);
- SendMessage(hwndDlg, WM_SETREDRAW, TRUE, 0);
- InvalidateRect(hwndDlg, 0, 0);
- break;
- }
- }
- break;
- }
- case WM_NOTIFY:
- {
- LPNMHDR nmhdr = (LPNMHDR) lParam;
- if (nmhdr && nmhdr->idFrom == IDC_HKLIST)
- {
- if (nmhdr->code == LVN_ITEMCHANGED)
- {
- LPNMLISTVIEW pnmv = (LPNMLISTVIEW) lParam;
- DWORD dwSelected = ListView_GetSelectedCount(hwHKList);
- EnableWindow(GetDlgItem(hwndDlg, IDC_SAVE), dwSelected == 1);
- EnableWindow(GetDlgItem(hwndDlg, IDC_REMOVE), dwSelected);
- SendMessage(hwHK, wmHKCtlSet, 0, 0);
- SendMessage(hwCombo, CB_SETCURSEL, -1, 0);
- if (dwSelected == 1 && (pnmv->uNewState & LVIS_SELECTED))
- {
- HOTKEY_DATA *hkd = (HOTKEY_DATA *) pnmv->lParam;
- if (hkd)
- {
- SendMessage(hwHK, wmHKCtlSet, hkd->dwHotKey, 0);
- bool unicode = 0;
- char *cmd = GetCommandName(hkd->iCommand, &unicode);
- if (*cmd)
- {
- if(unicode) SendMessageW(hwCombo, CB_SELECTSTRING, -1, (LPARAM) cmd);
- else SendMessageA(hwCombo, CB_SELECTSTRING, -1, (LPARAM) cmd);
- }
- }
- }
- }
- else if(nmhdr->code == LVN_KEYDOWN)
- {
- LPNMLVKEYDOWN pnmv = (LPNMLVKEYDOWN) lParam;
- if(pnmv->wVKey == VK_DELETE)
- {
- changed = true;
- SendMessage(hwndDlg,WM_COMMAND,MAKEWPARAM(IDC_REMOVE,0),0);
- }
- else if(pnmv->wVKey == 'A' && GetAsyncKeyState(VK_CONTROL))
- {
- for(int i = 0; i < ListView_GetItemCount(hwHKList); i++)
- {
- ListView_SetItemState(hwHKList,i,LVIS_SELECTED,LVIS_SELECTED);
- }
- }
- }
- }
- }
- break;
- case WM_DESTROY:
- {
- int checked = (SendMessage(GetDlgItem(hwndDlg, IDC_ENABLED), BM_GETCHECK, 0, 0) == BST_CHECKED);
- writePrivateProfileInt(L"enabled", checked);
- writePrivateProfileInt(L"appcommand",
- (SendMessage(GetDlgItem(hwndDlg, IDC_ENABLED_WM_APPCOMMAND), BM_GETCHECK, 0, 0) == BST_CHECKED));
- hotkeysClear();
- int iCount = ListView_GetItemCount(hwHKList);
- HOTKEY_DATA *hkds = NULL;
- if (iCount)
- {
- hkds = new HOTKEY_DATA[iCount]; // TODO: could alloca this
- memset(hkds, 0, iCount * sizeof(HOTKEY_DATA));
- }
- if (hkds || !iCount)
- {
- for (size_t i = 0; i < (unsigned int)iCount; i++)
- {
- LVITEM lvi = {LVIF_PARAM, (int)i};
- ListView_GetItem(hwHKList, &lvi);
- HOTKEY_DATA *hkd = (HOTKEY_DATA *) lvi.lParam;
- if (hkd)
- {
- hkds[i] = *hkd;
- delete hkd;
- }
- }
- hotkeysLoad(hkds, iCount, checked);
- if (changed) hotkeysSave(hkds, iCount);
- delete [] hkds;
- }
- writePrivateProfileInt(L"col1", ListView_GetColumnWidth(hwHKList,0));
- writePrivateProfileInt(L"col2", ListView_GetColumnWidth(hwHKList,1));
- RegisterShellHookWindow(psPlugin.hwndParent);
- if (NULL != pAccelBlock && hwHK == pAccelBlock->GetHwnd())
- {
- delete(pAccelBlock);
- pAccelBlock = NULL;
- }
- if (NULL != WASABI_API_APP)
- WASABI_API_APP->DirectMouseWheel_EnableConvertToMouseWheel(hwHKList, FALSE);
- }
- break;
- }
- return FALSE;
- }
- // idx = -1 for insertion
- void SetListItem(HWND hwHKList, HWND hwHK, HOTKEY_DATA *hk_data, int idx, int failed)
- {
- wchar_t szHK[1024] = {L""};
- SendMessage(hwHK, wmHKCtlSet, hk_data->dwHotKey, 0);
- GetWindowTextW(hwHK, szHK, sizeof(szHK));
- HOTKEY_DATA *hk_data_allocated = 0;
- if (idx < 0)
- hk_data_allocated = new HOTKEY_DATA;
- if (idx >= 0 || hk_data_allocated)
- {
- if (idx < 0)
- *hk_data_allocated = *hk_data;
- int pos = ListView_GetItemCount(hwHKList);
- if (idx >= 0)
- pos = idx;
- // Add item to the list
- bool unicode = 0;
- LVITEM lvi = {
- LVIF_PARAM | LVIF_TEXT | LVIF_STATE,
- pos,
- 0,
- LVIS_SELECTED | INDEXTOSTATEIMAGEMASK(failed ? (UINT)1 : 0) | LVIS_FOCUSED,
- LVIS_SELECTED | LVIS_STATEIMAGEMASK | LVIS_FOCUSED,
- GetCommandName(hk_data->iCommand, &unicode),
- 0,
- 0,
- (LPARAM) hk_data_allocated
- };
- char tmp[1024] = {0};
- if (!lvi.pszText || !*lvi.pszText)
- {
- if (hk_data->szCommand)
- {
- StringCchPrintf(tmp, 1024, "[%s]", hk_data->szCommand);
- lvi.pszText = tmp;
- }
- }
- if (!lvi.pszText || !*lvi.pszText)
- lvi.pszText = WASABI_API_LNGSTRING(IDS_GHK_ACTION_NOT_FOUND);
- if (idx >= 0)
- {
- lvi.mask ^= LVIF_PARAM;
- if(unicode) ListView_SetItemW(hwHKList, &lvi);
- else ListView_SetItem(hwHKList, &lvi);
- }
- else
- {
- ListView_SetItemState(hwHKList, -1, 0, LVIS_SELECTED | LVIS_FOCUSED);
- if(unicode) ListView_InsertItemW(hwHKList, &lvi);
- else ListView_InsertItem(hwHKList, &lvi);
- }
- ListView_SetItemTextW(hwHKList, pos, 1, szHK);
- }
- }
|