Author: gadamopoulos Date: Sat Nov 3 21:00:10 2012 New Revision: 57671
URL: http://svn.reactos.org/svn/reactos?rev=57671&view=rev Log: [explorer] - Implement calling IShellView_TranslateAccelerator - Fixes accelerators like Ctrl+c , Ctrl+v, etc in windows
Modified: trunk/reactos/base/shell/explorer/desktop/desktop.cpp trunk/reactos/base/shell/explorer/desktop/desktop.h trunk/reactos/base/shell/explorer/shell/shellbrowser.cpp trunk/reactos/base/shell/explorer/shell/shellbrowser.h trunk/reactos/base/shell/explorer/utility/window.cpp trunk/reactos/base/shell/explorer/utility/window.h
Modified: trunk/reactos/base/shell/explorer/desktop/desktop.cpp URL: http://svn.reactos.org/svn/reactos/trunk/reactos/base/shell/explorer/desktop... ============================================================================== --- trunk/reactos/base/shell/explorer/desktop/desktop.cpp [iso-8859-1] (original) +++ trunk/reactos/base/shell/explorer/desktop/desktop.cpp [iso-8859-1] Sat Nov 3 21:00:10 2012 @@ -479,6 +479,26 @@ SendMessage(g_Globals._hwndShellView, nmsg, wparam, lparam); break;
+ case PM_TRANSLATE_MSG: + { + /* TranslateAccelerator is called for all explorer windows that are open + so we have to decide if this is the correct recipient */ + LPMSG lpmsg = (LPMSG)lparam; + HWND hwnd = lpmsg->hwnd; + + while(hwnd) + { + if(hwnd == _hwnd) + break; + + hwnd = GetParent(hwnd); + } + + if (hwnd) + return _pShellView->TranslateAccelerator(lpmsg) == S_OK; + return false; + } + default: def: return super::WndProc(nmsg, wparam, lparam); }
Modified: trunk/reactos/base/shell/explorer/desktop/desktop.h URL: http://svn.reactos.org/svn/reactos/trunk/reactos/base/shell/explorer/desktop... ============================================================================== --- trunk/reactos/base/shell/explorer/desktop/desktop.h [iso-8859-1] (original) +++ trunk/reactos/base/shell/explorer/desktop/desktop.h [iso-8859-1] Sat Nov 3 21:00:10 2012 @@ -48,9 +48,9 @@
/// Implementation of the Explorer desktop window -struct DesktopWindow : public Window, public IShellBrowserImpl +struct DesktopWindow : public PreTranslateWindow, public IShellBrowserImpl { - typedef Window super; + typedef PreTranslateWindow super;
DesktopWindow(HWND hwnd); ~DesktopWindow();
Modified: trunk/reactos/base/shell/explorer/shell/shellbrowser.cpp URL: http://svn.reactos.org/svn/reactos/trunk/reactos/base/shell/explorer/shell/s... ============================================================================== --- trunk/reactos/base/shell/explorer/shell/shellbrowser.cpp [iso-8859-1] (original) +++ trunk/reactos/base/shell/explorer/shell/shellbrowser.cpp [iso-8859-1] Sat Nov 3 21:00:10 2012 @@ -599,6 +599,27 @@ return false; }
+bool ShellBrowser::TranslateAccelerator(LPMSG lpmsg) +{ + HWND hwnd; + + /* TranslateAccelerator is called for all explorer windows that are open + so we have to decide if this is the correct recipient */ + hwnd = lpmsg->hwnd; + + while(hwnd) + { + if(hwnd == _hwnd) + break; + + hwnd = GetParent(hwnd); + } + + if (hwnd) + return _pShellView->TranslateAccelerator(lpmsg) == S_OK; + + return false; +}
bool ShellBrowser::select_folder(Entry* entry, bool expand) { @@ -707,6 +728,9 @@ SendMessage(_right_hwnd, WM_SYSCOLORCHANGE, 0, 0); break;
+ case PM_TRANSLATE_MSG: + return _shellBrowser->TranslateAccelerator((MSG*)lparam); + default: return super::WndProc(nmsg, wparam, lparam); }
Modified: trunk/reactos/base/shell/explorer/shell/shellbrowser.h URL: http://svn.reactos.org/svn/reactos/trunk/reactos/base/shell/explorer/shell/s... ============================================================================== --- trunk/reactos/base/shell/explorer/shell/shellbrowser.h [iso-8859-1] (original) +++ trunk/reactos/base/shell/explorer/shell/shellbrowser.h [iso-8859-1] Sat Nov 3 21:00:10 2012 @@ -141,6 +141,8 @@
void invalidate_cache();
+ bool TranslateAccelerator(LPMSG lpmsg); + protected: HWND _hwnd; HWND _hwndFrame;
Modified: trunk/reactos/base/shell/explorer/utility/window.cpp URL: http://svn.reactos.org/svn/reactos/trunk/reactos/base/shell/explorer/utility... ============================================================================== --- trunk/reactos/base/shell/explorer/utility/window.cpp [iso-8859-1] (original) +++ trunk/reactos/base/shell/explorer/utility/window.cpp [iso-8859-1] Sat Nov 3 21:00:10 2012 @@ -591,6 +591,14 @@
BOOL Window::pretranslate_msg(LPMSG pmsg) { + if ((pmsg->message != WM_KEYDOWN) && + (pmsg->message != WM_SYSKEYDOWN) && + (pmsg->message != WM_SYSCHAR) && + (pmsg->message != WM_CHAR)) + { + return FALSE; + } + for(WindowSet::const_iterator it=Window::s_pretranslate_windows.begin(); it!=s_pretranslate_windows.end(); ++it) if (SendMessage(*it, PM_TRANSLATE_MSG, 0, (LPARAM)pmsg)) return TRUE;
Modified: trunk/reactos/base/shell/explorer/utility/window.h URL: http://svn.reactos.org/svn/reactos/trunk/reactos/base/shell/explorer/utility... ============================================================================== --- trunk/reactos/base/shell/explorer/utility/window.h [iso-8859-1] (original) +++ trunk/reactos/base/shell/explorer/utility/window.h [iso-8859-1] Sat Nov 3 21:00:10 2012 @@ -283,12 +283,27 @@
/** + PreTranslateWindow is used to register windows to be called by Window::pretranslate_msg(). + This way you get PM_TRANSLATE_MSG messages before the message loop dispatches messages. + You can then for example use TranslateAccelerator() to implement key shortcuts. + */ +struct PreTranslateWindow : public Window +{ + typedef Window super; + + PreTranslateWindow(HWND); + ~PreTranslateWindow(); +}; + + + + /** Class ChildWindow represents MDI child windows. It is used with class MainFrame. */ -struct ChildWindow : public Window -{ - typedef Window super; +struct ChildWindow : public PreTranslateWindow +{ + typedef PreTranslateWindow super;
ChildWindow(HWND hwnd, const ChildWndInfo& info);
@@ -323,20 +338,6 @@ };
#define PM_SETSTATUSTEXT (WM_APP+0x1E) - - - /** - PreTranslateWindow is used to register windows to be called by Window::pretranslate_msg(). - This way you get PM_TRANSLATE_MSG messages before the message loop dispatches messages. - You can then for example use TranslateAccelerator() to implement key shortcuts. - */ -struct PreTranslateWindow : public Window -{ - typedef Window super; - - PreTranslateWindow(HWND); - ~PreTranslateWindow(); -};
/**