explorerframe: Handle keyboard events.
This commit is contained in:
parent
f0d6d95ef8
commit
b349072687
|
@ -54,6 +54,8 @@ typedef struct {
|
||||||
HWND hwnd_main;
|
HWND hwnd_main;
|
||||||
HWND hwnd_tv;
|
HWND hwnd_tv;
|
||||||
|
|
||||||
|
WNDPROC tv_oldwndproc;
|
||||||
|
|
||||||
NSTCSTYLE style;
|
NSTCSTYLE style;
|
||||||
NSTCSTYLE2 style2;
|
NSTCSTYLE2 style2;
|
||||||
struct list roots;
|
struct list roots;
|
||||||
|
@ -69,6 +71,9 @@ static const DWORD unsupported_styles2 =
|
||||||
NSTCS2_INTERRUPTNOTIFICATIONS | NSTCS2_SHOWNULLSPACEMENU | NSTCS2_DISPLAYPADDING |
|
NSTCS2_INTERRUPTNOTIFICATIONS | NSTCS2_SHOWNULLSPACEMENU | NSTCS2_DISPLAYPADDING |
|
||||||
NSTCS2_DISPLAYPINNEDONLY | NTSCS2_NOSINGLETONAUTOEXPAND | NTSCS2_NEVERINSERTNONENUMERATED;
|
NSTCS2_DISPLAYPINNEDONLY | NTSCS2_NOSINGLETONAUTOEXPAND | NTSCS2_NEVERINSERTNONENUMERATED;
|
||||||
|
|
||||||
|
/* Forward declarations */
|
||||||
|
static LRESULT CALLBACK tv_wndproc(HWND hWnd, UINT uMessage, WPARAM wParam, LPARAM lParam);
|
||||||
|
|
||||||
/*************************************************************************
|
/*************************************************************************
|
||||||
* NamespaceTree event wrappers
|
* NamespaceTree event wrappers
|
||||||
*/
|
*/
|
||||||
|
@ -145,6 +150,13 @@ static HRESULT events_OnSelectionChanged(NSTC2Impl *This, IShellItemArray *psia)
|
||||||
return INameSpaceTreeControlEvents_OnSelectionChanged(This->pnstce, psia);
|
return INameSpaceTreeControlEvents_OnSelectionChanged(This->pnstce, psia);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static HRESULT events_OnKeyboardInput(NSTC2Impl *This, UINT uMsg, WPARAM wParam, LPARAM lParam)
|
||||||
|
{
|
||||||
|
if(!This->pnstce) return S_OK;
|
||||||
|
|
||||||
|
return INameSpaceTreeControlEvents_OnKeyboardInput(This->pnstce, uMsg, wParam, lParam);
|
||||||
|
}
|
||||||
|
|
||||||
/*************************************************************************
|
/*************************************************************************
|
||||||
* NamespaceTree helper functions
|
* NamespaceTree helper functions
|
||||||
*/
|
*/
|
||||||
|
@ -325,6 +337,16 @@ static UINT fill_sublevel(NSTC2Impl *This, HTREEITEM hitem)
|
||||||
return added;
|
return added;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static HTREEITEM get_selected_treeitem(NSTC2Impl *This)
|
||||||
|
{
|
||||||
|
return (HTREEITEM)SendMessageW(This->hwnd_tv, TVM_GETNEXTITEM, TVGN_CARET, 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
static IShellItem *get_selected_shellitem(NSTC2Impl *This)
|
||||||
|
{
|
||||||
|
return shellitem_from_treeitem(This, get_selected_treeitem(This));
|
||||||
|
}
|
||||||
|
|
||||||
/*************************************************************************
|
/*************************************************************************
|
||||||
* NamespaceTree window functions
|
* NamespaceTree window functions
|
||||||
*/
|
*/
|
||||||
|
@ -378,6 +400,12 @@ static LRESULT create_namespacetree(HWND hWnd, CREATESTRUCTW *crs)
|
||||||
|
|
||||||
INameSpaceTreeControl_AddRef((INameSpaceTreeControl*)This);
|
INameSpaceTreeControl_AddRef((INameSpaceTreeControl*)This);
|
||||||
|
|
||||||
|
/* Subclass the treeview to get the keybord events. */
|
||||||
|
This->tv_oldwndproc = (WNDPROC)SetWindowLongPtrW(This->hwnd_tv, GWLP_WNDPROC,
|
||||||
|
(ULONG_PTR)tv_wndproc);
|
||||||
|
if(This->tv_oldwndproc)
|
||||||
|
SetPropA(This->hwnd_tv, "PROP_THIS", This);
|
||||||
|
|
||||||
return TRUE;
|
return TRUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -396,6 +424,13 @@ static LRESULT destroy_namespacetree(NSTC2Impl *This)
|
||||||
{
|
{
|
||||||
TRACE("%p\n", This);
|
TRACE("%p\n", This);
|
||||||
|
|
||||||
|
/* Undo the subclassing */
|
||||||
|
if(This->tv_oldwndproc)
|
||||||
|
{
|
||||||
|
SetWindowLongPtrW(This->hwnd_tv, GWLP_WNDPROC, (ULONG_PTR)This->tv_oldwndproc);
|
||||||
|
RemovePropA(This->hwnd_tv, "PROP_THIS");
|
||||||
|
}
|
||||||
|
|
||||||
INameSpaceTreeControl_RemoveAllRoots((INameSpaceTreeControl*)This);
|
INameSpaceTreeControl_RemoveAllRoots((INameSpaceTreeControl*)This);
|
||||||
|
|
||||||
/* This reference was added in create_namespacetree */
|
/* This reference was added in create_namespacetree */
|
||||||
|
@ -535,6 +570,56 @@ static LRESULT on_tvn_selchangedw(NSTC2Impl *This, LPARAM lParam)
|
||||||
return TRUE;
|
return TRUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static LRESULT on_kbd_event(NSTC2Impl *This, UINT uMsg, WPARAM wParam, LPARAM lParam)
|
||||||
|
{
|
||||||
|
IShellItem *psi;
|
||||||
|
HTREEITEM hitem;
|
||||||
|
TRACE("%p : %d, %lx, %lx\n", This, uMsg, wParam, lParam);
|
||||||
|
|
||||||
|
/* Handled by the client? */
|
||||||
|
if(FAILED(events_OnKeyboardInput(This, uMsg, wParam, lParam)))
|
||||||
|
return TRUE;
|
||||||
|
|
||||||
|
if(uMsg == WM_KEYDOWN)
|
||||||
|
{
|
||||||
|
switch(wParam)
|
||||||
|
{
|
||||||
|
case VK_DELETE:
|
||||||
|
psi = get_selected_shellitem(This);
|
||||||
|
FIXME("Deletion of file requested (shellitem: %p).\n", psi);
|
||||||
|
return TRUE;
|
||||||
|
|
||||||
|
case VK_F2:
|
||||||
|
hitem = get_selected_treeitem(This);
|
||||||
|
SendMessageW(This->hwnd_tv, TVM_EDITLABELW, 0, (LPARAM)hitem);
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Let the TreeView handle the key */
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
|
static LRESULT CALLBACK tv_wndproc(HWND hWnd, UINT uMessage, WPARAM wParam, LPARAM lParam)
|
||||||
|
{
|
||||||
|
NSTC2Impl *This = (NSTC2Impl*)GetPropA(hWnd, "PROP_THIS");
|
||||||
|
|
||||||
|
switch(uMessage) {
|
||||||
|
case WM_KEYDOWN:
|
||||||
|
case WM_KEYUP:
|
||||||
|
case WM_CHAR:
|
||||||
|
case WM_SYSKEYDOWN:
|
||||||
|
case WM_SYSKEYUP:
|
||||||
|
case WM_SYSCHAR:
|
||||||
|
if(on_kbd_event(This, uMessage, wParam, lParam))
|
||||||
|
return TRUE;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Pass the message on to the treeview */
|
||||||
|
return CallWindowProcW(This->tv_oldwndproc, hWnd, uMessage, wParam, lParam);
|
||||||
|
}
|
||||||
|
|
||||||
static LRESULT CALLBACK NSTC2_WndProc(HWND hWnd, UINT uMessage,
|
static LRESULT CALLBACK NSTC2_WndProc(HWND hWnd, UINT uMessage,
|
||||||
WPARAM wParam, LPARAM lParam)
|
WPARAM wParam, LPARAM lParam)
|
||||||
{
|
{
|
||||||
|
|
|
@ -160,6 +160,8 @@ static HRESULT WINAPI NSTCEvents_fnOnKeyboardInput(
|
||||||
LPARAM lParam)
|
LPARAM lParam)
|
||||||
{
|
{
|
||||||
NSTCE_IMPL(iface)->count[OnKeyboardInput]++;
|
NSTCE_IMPL(iface)->count[OnKeyboardInput]++;
|
||||||
|
ok(wParam == 0x1234, "Got unexpected wParam %lx\n", wParam);
|
||||||
|
ok(lParam == 0x1234, "Got unexpected lParam %lx\n", lParam);
|
||||||
return E_NOTIMPL;
|
return E_NOTIMPL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1252,6 +1254,12 @@ static void test_events(void)
|
||||||
if(hwnd_tv)
|
if(hwnd_tv)
|
||||||
{
|
{
|
||||||
HTREEITEM hroot, hitem;
|
HTREEITEM hroot, hitem;
|
||||||
|
UINT i;
|
||||||
|
static const UINT kbd_msgs_event[] = {
|
||||||
|
WM_KEYDOWN, WM_KEYUP, WM_CHAR, WM_SYSKEYDOWN, WM_SYSKEYUP,
|
||||||
|
WM_SYSCHAR, 0 };
|
||||||
|
static const UINT kbd_msgs_noevent[] ={
|
||||||
|
WM_DEADCHAR, WM_SYSDEADCHAR, WM_UNICHAR, 0 };
|
||||||
|
|
||||||
/* Test On*Expand */
|
/* Test On*Expand */
|
||||||
hroot = (HTREEITEM)SendMessageW(hwnd_tv, TVM_GETNEXTITEM, TVGN_ROOT, 0);
|
hroot = (HTREEITEM)SendMessageW(hwnd_tv, TVM_GETNEXTITEM, TVGN_ROOT, 0);
|
||||||
|
@ -1275,6 +1283,26 @@ static void test_events(void)
|
||||||
process_msgs();
|
process_msgs();
|
||||||
ok_event_count(pnstceimpl, OnSelectionChanged, 1);
|
ok_event_count(pnstceimpl, OnSelectionChanged, 1);
|
||||||
ok_no_events(pnstceimpl);
|
ok_no_events(pnstceimpl);
|
||||||
|
|
||||||
|
/* Test OnKeyboardInput */
|
||||||
|
for(i = 0; kbd_msgs_event[i] != 0; i++)
|
||||||
|
{
|
||||||
|
SendMessageW(hwnd_tv, kbd_msgs_event[i], 0x1234, 0x1234);
|
||||||
|
ok(pnstceimpl->count[OnKeyboardInput] == 1,
|
||||||
|
"%d (%x): Got count %d\n",
|
||||||
|
kbd_msgs_event[i], kbd_msgs_event[i], pnstceimpl->count[OnKeyboardInput]);
|
||||||
|
pnstceimpl->count[OnKeyboardInput] = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
for(i = 0; kbd_msgs_noevent[i] != 0; i++)
|
||||||
|
{
|
||||||
|
SendMessageW(hwnd_tv, kbd_msgs_noevent[i], 0x1234, 0x1234);
|
||||||
|
ok(pnstceimpl->count[OnKeyboardInput] == 0,
|
||||||
|
"%d (%x): Got count %d\n",
|
||||||
|
kbd_msgs_noevent[i], kbd_msgs_noevent[i], pnstceimpl->count[OnKeyboardInput]);
|
||||||
|
pnstceimpl->count[OnKeyboardInput] = 0;
|
||||||
|
}
|
||||||
|
ok_no_events(pnstceimpl);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
skip("Skipping some tests.\n");
|
skip("Skipping some tests.\n");
|
||||||
|
|
Loading…
Reference in New Issue