Now we handle start menu popups via StartMenuRoot::TrackStartmenu().

svn path=/trunk/; revision=5919
This commit is contained in:
Martin Fuchs 2003-08-29 14:52:57 +00:00
parent 5db07c0a15
commit 5b3f0e0806
7 changed files with 64 additions and 56 deletions

View file

@ -30,3 +30,4 @@
26.08.2003 m. fuchs implemented tooltips and launching of date/time control panel applet for clock display 26.08.2003 m. fuchs implemented tooltips and launching of date/time control panel applet for clock display
27.08.2003 m. fuchs partly implemented control panel window 27.08.2003 m. fuchs partly implemented control panel window
28.08.2003 m. fuchs control panel window in cabinet view mode 28.08.2003 m. fuchs control panel window in cabinet view mode
29.09.2003 m. fuchs Now we handle start menu popups via StartMenuRoot::TrackStartmenu().

View file

@ -46,7 +46,7 @@ RSC=rc.exe
# PROP Ignore_Export_Lib 0 # PROP Ignore_Export_Lib 0
# PROP Target_Dir "" # PROP Target_Dir ""
# ADD BASE CPP /nologo /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /c # ADD BASE CPP /nologo /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /c
# ADD CPP /nologo /MT /W3 /GX /O1 /D "NDEBUG" /D "WIN32" /D "_ROS_" /D _WIN32_IE=0x0501 /D _WIN32_WINNT=0x0501 /YX /FD /c # ADD CPP /nologo /MD /W3 /GR /GX /O1 /D "NDEBUG" /D "WIN32" /D "_ROS_" /D _WIN32_IE=0x0501 /D _WIN32_WINNT=0x0501 /YX /FD /c
# ADD BASE RSC /l 0x407 /d "NDEBUG" # ADD BASE RSC /l 0x407 /d "NDEBUG"
# ADD RSC /l 0x407 /d "NDEBUG" # ADD RSC /l 0x407 /d "NDEBUG"
BSC32=bscmake.exe BSC32=bscmake.exe
@ -71,7 +71,7 @@ LINK32=link.cmd
# PROP Ignore_Export_Lib 0 # PROP Ignore_Export_Lib 0
# PROP Target_Dir "" # PROP Target_Dir ""
# ADD BASE CPP /nologo /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /GZ /c # ADD BASE CPP /nologo /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /GZ /c
# ADD CPP /nologo /MTd /W3 /Gm /GX /ZI /Od /D "_DEBUG" /D "WIN32" /D "_ROS_" /D _WIN32_IE=0x0501 /D _WIN32_WINNT=0x0501 /FR /YX /FD /GZ /c # ADD CPP /nologo /MDd /W3 /Gm /GR /GX /ZI /Od /D "_DEBUG" /D "WIN32" /D "_ROS_" /D _WIN32_IE=0x0501 /D _WIN32_WINNT=0x0501 /FR /YX /FD /GZ /c
# ADD BASE RSC /l 0x407 /d "_DEBUG" # ADD BASE RSC /l 0x407 /d "_DEBUG"
# ADD RSC /l 0x407 /d "_DEBUG" # ADD RSC /l 0x407 /d "_DEBUG"
BSC32=bscmake.exe BSC32=bscmake.exe
@ -97,7 +97,7 @@ LINK32=link.cmd
# PROP Ignore_Export_Lib 0 # PROP Ignore_Export_Lib 0
# PROP Target_Dir "" # PROP Target_Dir ""
# ADD BASE CPP /nologo /W3 /GX /O2 /D "NDEBUG" /D "WIN32" /D "_ROS_" /YX /FD /c # ADD BASE CPP /nologo /W3 /GX /O2 /D "NDEBUG" /D "WIN32" /D "_ROS_" /YX /FD /c
# ADD CPP /nologo /MT /W3 /GX /Zi /O2 /D "NDEBUG" /D "WIN32" /D "_ROS_" /D _WIN32_IE=0x0501 /D _WIN32_WINNT=0x0501 /FR /YX /FD /c # ADD CPP /nologo /MD /W3 /GR /GX /Zi /O2 /D "NDEBUG" /D "WIN32" /D "_ROS_" /D _WIN32_IE=0x0501 /D _WIN32_WINNT=0x0501 /FR /YX /FD /c
# ADD BASE RSC /l 0x407 /d "NDEBUG" # ADD BASE RSC /l 0x407 /d "NDEBUG"
# ADD RSC /l 0x407 /d "NDEBUG" # ADD RSC /l 0x407 /d "NDEBUG"
BSC32=bscmake.exe BSC32=bscmake.exe
@ -123,7 +123,7 @@ LINK32=link.cmd
# PROP Ignore_Export_Lib 0 # PROP Ignore_Export_Lib 0
# PROP Target_Dir "" # PROP Target_Dir ""
# ADD BASE CPP /nologo /W3 /GX /O2 /D "NDEBUG" /D "WIN32" /D "UNICODE" /D "_ROS_" /YX /FD /c # ADD BASE CPP /nologo /W3 /GX /O2 /D "NDEBUG" /D "WIN32" /D "UNICODE" /D "_ROS_" /YX /FD /c
# ADD CPP /nologo /MT /W3 /GX /O2 /D "NDEBUG" /D "UNICODE" /D "WIN32" /D "_ROS_" /D _WIN32_IE=0x0501 /D _WIN32_WINNT=0x0501 /YX /FD /c # ADD CPP /nologo /MD /W3 /GR /GX /O2 /D "NDEBUG" /D "UNICODE" /D "WIN32" /D "_ROS_" /D _WIN32_IE=0x0501 /D _WIN32_WINNT=0x0501 /YX /FD /c
# ADD BASE RSC /l 0x407 /d "NDEBUG" # ADD BASE RSC /l 0x407 /d "NDEBUG"
# ADD RSC /l 0x407 /d "NDEBUG" # ADD RSC /l 0x407 /d "NDEBUG"
BSC32=bscmake.exe BSC32=bscmake.exe
@ -149,7 +149,7 @@ LINK32=link.cmd
# PROP Ignore_Export_Lib 0 # PROP Ignore_Export_Lib 0
# PROP Target_Dir "" # PROP Target_Dir ""
# ADD BASE CPP /nologo /W3 /Gm /GX /ZI /Od /D "_DEBUG" /D "WIN32" /D "UNICODE" /D "_ROS_" /FR /YX /FD /GZ /c # ADD BASE CPP /nologo /W3 /Gm /GX /ZI /Od /D "_DEBUG" /D "WIN32" /D "UNICODE" /D "_ROS_" /FR /YX /FD /GZ /c
# ADD CPP /nologo /MTd /W3 /Gm /GX /ZI /Od /D "_DEBUG" /D "UNICODE" /D "WIN32" /D "_ROS_" /D _WIN32_IE=0x0501 /D _WIN32_WINNT=0x0501 /FR /YX /FD /GZ /c # ADD CPP /nologo /MDd /W3 /Gm /GR /GX /ZI /Od /D "_DEBUG" /D "UNICODE" /D "WIN32" /D "_ROS_" /D _WIN32_IE=0x0501 /D _WIN32_WINNT=0x0501 /FR /YX /FD /GZ /c
# ADD BASE RSC /l 0x407 /d "_DEBUG" # ADD BASE RSC /l 0x407 /d "_DEBUG"
# ADD RSC /l 0x407 /d "_DEBUG" # ADD RSC /l 0x407 /d "_DEBUG"
BSC32=bscmake.exe BSC32=bscmake.exe
@ -175,7 +175,7 @@ LINK32=link.cmd
# PROP Ignore_Export_Lib 0 # PROP Ignore_Export_Lib 0
# PROP Target_Dir "" # PROP Target_Dir ""
# ADD BASE CPP /nologo /MTd /W3 /Gm /GX /ZI /Od /D "_DEBUG" /D "WIN32" /D "_ROS_" /D _WIN32_IE=0x0501 /D _WIN32_WINNT=0x0501 /FR /YX /FD /GZ /c # ADD BASE CPP /nologo /MTd /W3 /Gm /GX /ZI /Od /D "_DEBUG" /D "WIN32" /D "_ROS_" /D _WIN32_IE=0x0501 /D _WIN32_WINNT=0x0501 /FR /YX /FD /GZ /c
# ADD CPP /nologo /MTd /W3 /Gm /GX /ZI /Od /D "_DEBUG" /D "WIN32" /D "_ROS_" /D _WIN32_IE=0x0501 /D _WIN32_WINNT=0x0501 /D "_NO_COMUTIL" /FR /YX /FD /GZ /c # ADD CPP /nologo /MDd /W3 /Gm /GR /GX /ZI /Od /D "_DEBUG" /D "WIN32" /D "_ROS_" /D _WIN32_IE=0x0501 /D _WIN32_WINNT=0x0501 /D "_NO_COMUTIL" /FR /YX /FD /GZ /c
# ADD BASE RSC /l 0x407 /d "_DEBUG" # ADD BASE RSC /l 0x407 /d "_DEBUG"
# ADD RSC /l 0x407 /d "_DEBUG" # ADD RSC /l 0x407 /d "_DEBUG"
BSC32=bscmake.exe BSC32=bscmake.exe

View file

@ -151,7 +151,7 @@ LRESULT DesktopBar::WndProc(UINT nmsg, WPARAM wparam, LPARAM lparam)
else else
return 0; // disable any other resizing return 0; // disable any other resizing
} else if (wparam == SC_TASKLIST) } else if (wparam == SC_TASKLIST)
ToggleStartmenu(); ShowStartMenu();
goto def; goto def;
case WM_SIZE: { case WM_SIZE: {
@ -176,14 +176,6 @@ LRESULT DesktopBar::WndProc(UINT nmsg, WPARAM wparam, LPARAM lparam)
case WM_CLOSE: case WM_CLOSE:
break; break;
case PM_STARTMENU_CLOSED:
_startMenuRoot = 0;
break;
case WM_SETFOCUS:
CloseStartMenu();
goto def;
case WM_HOTKEY: case WM_HOTKEY:
ProcessHotKey(wparam); ProcessHotKey(wparam);
break; break;
@ -203,7 +195,7 @@ int DesktopBar::Command(int id, int code)
{ {
switch(id) { switch(id) {
case IDC_START: //TODO: startmenu should popup for WM_LBUTTONDOWN, not for WM_COMMAND case IDC_START: //TODO: startmenu should popup for WM_LBUTTONDOWN, not for WM_COMMAND
ToggleStartmenu(); ShowStartMenu();
break; break;
default: default:
@ -215,25 +207,13 @@ int DesktopBar::Command(int id, int code)
} }
void DesktopBar::ToggleStartmenu() void DesktopBar::ShowStartMenu()
{ {
if (_startMenuRoot && IsWindow(_startMenuRoot)) { // IsWindow(): safety first // create Startmenu
// dispose Startmenu StartMenuRoot* startMenuRoot = GET_WINDOW(StartMenuRoot, StartMenuRoot::Create(_hwnd));
DestroyWindow(_startMenuRoot);
_startMenuRoot = 0;
} else {
// create Startmenu
_startMenuRoot = StartMenuRoot::Create(_hwnd);
}
}
void DesktopBar::CloseStartMenu() if (startMenuRoot)
{ startMenuRoot->TrackStartmenu();
if (_startMenuRoot) {
DestroyWindow(_startMenuRoot);
_startMenuRoot = 0;
}
} }

View file

@ -80,12 +80,10 @@ protected:
void RegisterHotkeys(); void RegisterHotkeys();
void ProcessHotKey(int id_hotkey); void ProcessHotKey(int id_hotkey);
void ToggleStartmenu(); void ShowStartMenu();
void CloseStartMenu();
LRESULT ProcessCopyData(COPYDATASTRUCT* pcd); LRESULT ProcessCopyData(COPYDATASTRUCT* pcd);
WindowHandle _hwndTaskBar; WindowHandle _hwndTaskBar;
WindowHandle _startMenuRoot;
WindowHandle _hwndNotify; WindowHandle _hwndNotify;
WindowHandle _hwndQuickLaunch; WindowHandle _hwndQuickLaunch;
}; };

View file

@ -181,9 +181,6 @@ LRESULT StartMenu::WndProc(UINT nmsg, WPARAM wparam, LPARAM lparam)
CloseStartMenu(); CloseStartMenu();
break; break;
case WM_SETFOCUS:
break; // don't post WM_CANCELMODE in Window::WndProc when focusing the startmenu
case PM_STARTENTRY_FOCUSED: { //TODO: use TrackMouseEvent() and WM_MOUSEHOVER to wait a bit before opening submenus case PM_STARTENTRY_FOCUSED: { //TODO: use TrackMouseEvent() and WM_MOUSEHOVER to wait a bit before opening submenus
BOOL hasSubmenu = wparam; BOOL hasSubmenu = wparam;
HWND hctrl = (HWND)lparam; HWND hctrl = (HWND)lparam;
@ -467,13 +464,13 @@ LRESULT StartMenuButton::WndProc(UINT nmsg, WPARAM wparam, LPARAM lparam)
case WM_SETFOCUS: case WM_SETFOCUS:
PostParent(PM_STARTENTRY_FOCUSED, _hasSubmenu, (LPARAM)_hwnd); PostParent(PM_STARTENTRY_FOCUSED, _hasSubmenu, (LPARAM)_hwnd);
return CallWindowProc(_orgWndProc, _hwnd, nmsg, wparam, lparam); // don't post WM_CANCELMODE in Window::WndProc when focusing the startmenu goto def;
case WM_CANCELMODE: case WM_CANCELMODE:
// route WM_CANCELMODE to the startmenu window // route WM_CANCELMODE to the startmenu window
return SendParent(nmsg, wparam, lparam); return SendParent(nmsg, wparam, lparam);
default: default: def:
return super::WndProc(nmsg, wparam, lparam); return super::WndProc(nmsg, wparam, lparam);
} }
@ -564,11 +561,32 @@ HWND StartMenuRoot::Create(HWND hwndDesktopBar)
void StartMenuRoot::TrackStartmenu() void StartMenuRoot::TrackStartmenu()
{ {
//TODO
MSG msg; MSG msg;
HWND hwnd = _hwnd;
while(IsWindow(hwnd)) {
if (!GetMessage(&msg, 0, 0, 0)) {
PostQuitMessage(msg.wParam);
break;
}
// Check for a mouse click on any window, which is not part of the start menu
if (msg.message==WM_LBUTTONDOWN || msg.message==WM_MBUTTONDOWN || msg.message==WM_RBUTTONDOWN) {
StartMenu* menu_wnd = NULL;
for(HWND hwnd=msg.hwnd; hwnd; hwnd=GetParent(hwnd)) {
menu_wnd = WINDOW_DYNAMIC_CAST(StartMenu, hwnd);
if (menu_wnd)
break;
}
if (!menu_wnd) {
DestroyWindow(_hwnd);
break;
}
}
while(GetMessage(&msg, 0, 0, 0)) {
try { try {
if (pretranslate_msg(&msg)) if (pretranslate_msg(&msg))
continue; continue;
@ -587,8 +605,6 @@ void StartMenuRoot::TrackStartmenu()
HandleException(e, g_Globals._hMainWnd); HandleException(e, g_Globals._hMainWnd);
} }
} }
//@@return msg.wParam;
} }

View file

@ -222,15 +222,16 @@ LRESULT CALLBACK Window::WindowWndProc(HWND hwnd, UINT nmsg, WPARAM wparam, LPAR
LRESULT Window::WndProc(UINT nmsg, WPARAM wparam, LPARAM lparam) LRESULT Window::WndProc(UINT nmsg, WPARAM wparam, LPARAM lparam)
{ {
/*@@TODO: replaced by StartMenu::TrackStartmenu()
HWND hwnd = _hwnd; HWND hwnd = _hwnd;
/*@@TODO: replace by StartMenu::TrackStartmenu()
// close startup menu and other popup menus // close startup menu and other popup menus
// This functionality is for tray notification icons missing in MS Windows. // This functionality is for tray notification icons missing in MS Windows.
if (nmsg == WM_SETFOCUS) if (nmsg == WM_SETFOCUS)
CancelModes((HWND)wparam); //@@ erronesly cancels desktop bar resize when switching from another process CancelModes((HWND)wparam); // erronesly cancels desktop bar resize when switching from another process
*/ */
return DefWindowProc(hwnd, nmsg, wparam, lparam);
return DefWindowProc(_hwnd, nmsg, wparam, lparam);
} }
int Window::Command(int id, int code) int Window::Command(int id, int code)
@ -263,11 +264,12 @@ SubclassedWindow::SubclassedWindow(HWND hwnd)
LRESULT SubclassedWindow::WndProc(UINT nmsg, WPARAM wparam, LPARAM lparam) LRESULT SubclassedWindow::WndProc(UINT nmsg, WPARAM wparam, LPARAM lparam)
{ {
/*@@TODO: replaced by StartMenu::TrackStartmenu()
// close startup menu and other popup menus // close startup menu and other popup menus
// This functionality is for tray notification icons missing in MS Windows. // This functionality is for tray notification icons missing in MS Windows.
if (nmsg == WM_SETFOCUS) if (nmsg == WM_SETFOCUS)
CancelModes((HWND)wparam); CancelModes((HWND)wparam);
*/
return CallWindowProc(_orgWndProc, _hwnd, nmsg, wparam, lparam); return CallWindowProc(_orgWndProc, _hwnd, nmsg, wparam, lparam);
} }

View file

@ -77,8 +77,8 @@ struct Window : public WindowHandle
static Window* get_window(HWND hwnd); static Window* get_window(HWND hwnd);
#ifndef _MSC_VER #ifndef _MSC_VER
template<typename WNDCLASS> static WNDCLASS* get_window(HWND hwnd) {return static_cast<WNDCLASS*>(get_window(hwnd));} template<typename CLASS> static CLASS* get_window(HWND hwnd) {return static_cast<CLASS*>(get_window(hwnd));}
#define GET_WINDOW(WNDCLASS, hwnd) Window::get_window<WNDCLASS>(hwnd) #define GET_WINDOW(CLASS, hwnd) Window::get_window<CLASS>(hwnd)
#endif #endif
static void register_pretranslate(HWND hwnd); static void register_pretranslate(HWND hwnd);
@ -122,15 +122,26 @@ protected:
#ifdef _MSC_VER #ifdef _MSC_VER
template<typename WNDCLASS> struct GetWindowHelper { template<typename CLASS> struct GetWindowHelper
static WNDCLASS* get_window(HWND hwnd) { {
return static_cast<WNDCLASS*>(Window::get_window(hwnd)); static CLASS* get_window(HWND hwnd) {
return static_cast<CLASS*>(Window::get_window(hwnd));
} }
}; };
#define GET_WINDOW(WNDCLASS, hwnd) GetWindowHelper<WNDCLASS>::get_window(hwnd) #define GET_WINDOW(CLASS, hwnd) GetWindowHelper<CLASS>::get_window(hwnd)
#endif #endif
template<typename CLASS> struct TypeCheck
{
static CLASS* dyn_cast(Window* wnd)
{return dynamic_cast<CLASS*>(wnd);}
};
#define WINDOW_DYNAMIC_CAST(CLASS, hwnd) \
TypeCheck<CLASS>::dyn_cast(Window::get_window(hwnd))
/** /**
SubclassedWindow is used to wrap already existing window handles SubclassedWindow is used to wrap already existing window handles
into C++ Window objects. To construct a object, use the "new" operator into C++ Window objects. To construct a object, use the "new" operator