From 6f9c72878ceeb51045498a079eee40feaf87f4a4 Mon Sep 17 00:00:00 2001 From: Thomas Bluemel Date: Thu, 11 Oct 2007 20:23:26 +0000 Subject: [PATCH] Display a context menu for the selected monitor svn path=/trunk/; revision=29517 --- reactos/dll/cpl/desk/desk.c | 27 +++++++ reactos/dll/cpl/desk/desk.h | 4 + reactos/dll/cpl/desk/lang/bg-BG.rc | 12 +++ reactos/dll/cpl/desk/lang/cs-CZ.rc | 12 +++ reactos/dll/cpl/desk/lang/de-DE.rc | 12 +++ reactos/dll/cpl/desk/lang/el-GR.rc | 12 +++ reactos/dll/cpl/desk/lang/en-US.rc | 12 +++ reactos/dll/cpl/desk/lang/es-ES.rc | 12 +++ reactos/dll/cpl/desk/lang/fr-FR.rc | 12 +++ reactos/dll/cpl/desk/lang/hu-HU.rc | 12 +++ reactos/dll/cpl/desk/lang/id-ID.rc | 12 +++ reactos/dll/cpl/desk/lang/it-IT.rc | 12 +++ reactos/dll/cpl/desk/lang/ja-JP.rc | 12 +++ reactos/dll/cpl/desk/lang/nl-NL.rc | 12 +++ reactos/dll/cpl/desk/lang/pl-PL.rc | 12 +++ reactos/dll/cpl/desk/lang/ru-RU.rc | 12 +++ reactos/dll/cpl/desk/lang/sk-SK.rc | 12 +++ reactos/dll/cpl/desk/lang/sv-SE.rc | 12 +++ reactos/dll/cpl/desk/lang/uk-UA.rc | 12 +++ reactos/dll/cpl/desk/monslctl.c | 122 +++++++++++++++++++++++++---- reactos/dll/cpl/desk/monslctl.h | 48 +++++++++++- reactos/dll/cpl/desk/resource.h | 6 ++ reactos/dll/cpl/desk/settings.c | 100 +++++++++++++++++++++++ 23 files changed, 494 insertions(+), 17 deletions(-) diff --git a/reactos/dll/cpl/desk/desk.c b/reactos/dll/cpl/desk/desk.c index 8462514499d..8a395c92050 100644 --- a/reactos/dll/cpl/desk/desk.c +++ b/reactos/dll/cpl/desk/desk.c @@ -34,6 +34,33 @@ APPLET Applets[NUM_APPLETS] = } }; +HMENU +LoadPopupMenu(IN HINSTANCE hInstance, + IN LPCTSTR lpMenuName) +{ + HMENU hMenu, hSubMenu = NULL; + + hMenu = LoadMenu(hInstance, + lpMenuName); + + if (hMenu != NULL) + { + hSubMenu = GetSubMenu(hMenu, + 0); + if (hSubMenu != NULL && + !RemoveMenu(hMenu, + 0, + MF_BYPOSITION)) + { + hSubMenu = NULL; + } + + DestroyMenu(hMenu); + } + + return hSubMenu; +} + static BOOL CALLBACK PropSheetAddPage(HPROPSHEETPAGE hpage, LPARAM lParam) { diff --git a/reactos/dll/cpl/desk/desk.h b/reactos/dll/cpl/desk/desk.h index f7f6a341b60..8a5322f2b6e 100644 --- a/reactos/dll/cpl/desk/desk.h +++ b/reactos/dll/cpl/desk/desk.h @@ -35,6 +35,10 @@ typedef struct _DIBITMAP extern HINSTANCE hApplet; +HMENU +LoadPopupMenu(IN HINSTANCE hInstance, + IN LPCTSTR lpMenuName); + PDIBITMAP DibLoadImage(LPTSTR lpFilename); VOID DibFreeImage(PDIBITMAP lpBitmap); diff --git a/reactos/dll/cpl/desk/lang/bg-BG.rc b/reactos/dll/cpl/desk/lang/bg-BG.rc index 1a2bae714bb..94d6cac73a6 100644 --- a/reactos/dll/cpl/desk/lang/bg-BG.rc +++ b/reactos/dll/cpl/desk/lang/bg-BG.rc @@ -135,6 +135,18 @@ BEGIN MENUITEM "Èçáðàíî", ID_MENU_SELECTED END +IDM_MONITOR_MENU MENU +BEGIN + POPUP "" + BEGIN + MENUITEM "&Attached", ID_MENU_ATTACHED + MENUITEM "&Primary", ID_MENU_PRIMARY + MENUITEM SEPARATOR + MENUITEM "&Identify", ID_MENU_IDENTIFY + MENUITEM "P&roperties", ID_MENU_PROPERTIES + END +END + STRINGTABLE BEGIN IDS_MULTIPLEMONITORS "(Multiple Monitors)" diff --git a/reactos/dll/cpl/desk/lang/cs-CZ.rc b/reactos/dll/cpl/desk/lang/cs-CZ.rc index 4222f8c0691..4f82f82ab3a 100644 --- a/reactos/dll/cpl/desk/lang/cs-CZ.rc +++ b/reactos/dll/cpl/desk/lang/cs-CZ.rc @@ -132,6 +132,18 @@ BEGIN MENUITEM "Vybráno", ID_MENU_SELECTED END +IDM_MONITOR_MENU MENU +BEGIN + POPUP "" + BEGIN + MENUITEM "&Attached", ID_MENU_ATTACHED + MENUITEM "&Primary", ID_MENU_PRIMARY + MENUITEM SEPARATOR + MENUITEM "&Identify", ID_MENU_IDENTIFY + MENUITEM "P&roperties", ID_MENU_PROPERTIES + END +END + STRINGTABLE BEGIN IDS_CPLNAME "Obrazovka" diff --git a/reactos/dll/cpl/desk/lang/de-DE.rc b/reactos/dll/cpl/desk/lang/de-DE.rc index 524896b47e8..a7a3b451822 100644 --- a/reactos/dll/cpl/desk/lang/de-DE.rc +++ b/reactos/dll/cpl/desk/lang/de-DE.rc @@ -131,6 +131,18 @@ BEGIN MENUITEM "Ausgewählt", ID_MENU_SELECTED END +IDM_MONITOR_MENU MENU +BEGIN + POPUP "" + BEGIN + MENUITEM "&Attached", ID_MENU_ATTACHED + MENUITEM "&Primary", ID_MENU_PRIMARY + MENUITEM SEPARATOR + MENUITEM "&Identify", ID_MENU_IDENTIFY + MENUITEM "P&roperties", ID_MENU_PROPERTIES + END +END + STRINGTABLE BEGIN IDS_MULTIPLEMONITORS "(Mehrere Monitore)" diff --git a/reactos/dll/cpl/desk/lang/el-GR.rc b/reactos/dll/cpl/desk/lang/el-GR.rc index a479229df58..372440cd1e9 100644 --- a/reactos/dll/cpl/desk/lang/el-GR.rc +++ b/reactos/dll/cpl/desk/lang/el-GR.rc @@ -131,6 +131,18 @@ BEGIN MENUITEM "Selected", ID_MENU_SELECTED END +IDM_MONITOR_MENU MENU +BEGIN + POPUP "" + BEGIN + MENUITEM "&Attached", ID_MENU_ATTACHED + MENUITEM "&Primary", ID_MENU_PRIMARY + MENUITEM SEPARATOR + MENUITEM "&Identify", ID_MENU_IDENTIFY + MENUITEM "P&roperties", ID_MENU_PROPERTIES + END +END + STRINGTABLE BEGIN IDS_MULTIPLEMONITORS "(Multiple Monitors)" diff --git a/reactos/dll/cpl/desk/lang/en-US.rc b/reactos/dll/cpl/desk/lang/en-US.rc index 578c2684a21..13b6a3bd5de 100644 --- a/reactos/dll/cpl/desk/lang/en-US.rc +++ b/reactos/dll/cpl/desk/lang/en-US.rc @@ -133,6 +133,18 @@ BEGIN MENUITEM "Selected", ID_MENU_SELECTED END +IDM_MONITOR_MENU MENU +BEGIN + POPUP "" + BEGIN + MENUITEM "&Attached", ID_MENU_ATTACHED + MENUITEM "&Primary", ID_MENU_PRIMARY + MENUITEM SEPARATOR + MENUITEM "&Identify", ID_MENU_IDENTIFY + MENUITEM "P&roperties", ID_MENU_PROPERTIES + END +END + STRINGTABLE BEGIN IDS_MULTIPLEMONITORS "(Multiple Monitors)" diff --git a/reactos/dll/cpl/desk/lang/es-ES.rc b/reactos/dll/cpl/desk/lang/es-ES.rc index 735e8baa537..0bb98ce41ad 100644 --- a/reactos/dll/cpl/desk/lang/es-ES.rc +++ b/reactos/dll/cpl/desk/lang/es-ES.rc @@ -138,6 +138,18 @@ BEGIN MENUITEM "Selected", ID_MENU_SELECTED END +IDM_MONITOR_MENU MENU +BEGIN + POPUP "" + BEGIN + MENUITEM "&Attached", ID_MENU_ATTACHED + MENUITEM "&Primary", ID_MENU_PRIMARY + MENUITEM SEPARATOR + MENUITEM "&Identify", ID_MENU_IDENTIFY + MENUITEM "P&roperties", ID_MENU_PROPERTIES + END +END + STRINGTABLE BEGIN IDS_MULTIPLEMONITORS "(Multiple Monitors)" diff --git a/reactos/dll/cpl/desk/lang/fr-FR.rc b/reactos/dll/cpl/desk/lang/fr-FR.rc index 496c3c0ad46..12bfd0aea56 100644 --- a/reactos/dll/cpl/desk/lang/fr-FR.rc +++ b/reactos/dll/cpl/desk/lang/fr-FR.rc @@ -134,6 +134,18 @@ BEGIN MENUITEM "Sélectionné", ID_MENU_SELECTED END +IDM_MONITOR_MENU MENU +BEGIN + POPUP "" + BEGIN + MENUITEM "&Attached", ID_MENU_ATTACHED + MENUITEM "&Primary", ID_MENU_PRIMARY + MENUITEM SEPARATOR + MENUITEM "&Identify", ID_MENU_IDENTIFY + MENUITEM "P&roperties", ID_MENU_PROPERTIES + END +END + STRINGTABLE BEGIN IDS_MULTIPLEMONITORS "(Moniteurs multiples)" diff --git a/reactos/dll/cpl/desk/lang/hu-HU.rc b/reactos/dll/cpl/desk/lang/hu-HU.rc index 33c67ee05d6..d3452e2c4f8 100644 --- a/reactos/dll/cpl/desk/lang/hu-HU.rc +++ b/reactos/dll/cpl/desk/lang/hu-HU.rc @@ -132,6 +132,18 @@ BEGIN MENUITEM "Selected", ID_MENU_SELECTED END +IDM_MONITOR_MENU MENU +BEGIN + POPUP "" + BEGIN + MENUITEM "&Attached", ID_MENU_ATTACHED + MENUITEM "&Primary", ID_MENU_PRIMARY + MENUITEM SEPARATOR + MENUITEM "&Identify", ID_MENU_IDENTIFY + MENUITEM "P&roperties", ID_MENU_PROPERTIES + END +END + STRINGTABLE BEGIN IDS_MULTIPLEMONITORS "(Multiple Monitors)" diff --git a/reactos/dll/cpl/desk/lang/id-ID.rc b/reactos/dll/cpl/desk/lang/id-ID.rc index 35eda627e0b..31c08fa9a9d 100644 --- a/reactos/dll/cpl/desk/lang/id-ID.rc +++ b/reactos/dll/cpl/desk/lang/id-ID.rc @@ -131,6 +131,18 @@ BEGIN MENUITEM "Dipilih", ID_MENU_SELECTED END +IDM_MONITOR_MENU MENU +BEGIN + POPUP "" + BEGIN + MENUITEM "&Attached", ID_MENU_ATTACHED + MENUITEM "&Primary", ID_MENU_PRIMARY + MENUITEM SEPARATOR + MENUITEM "&Identify", ID_MENU_IDENTIFY + MENUITEM "P&roperties", ID_MENU_PROPERTIES + END +END + STRINGTABLE BEGIN IDS_MULTIPLEMONITORS "(Multiple Monitors)" diff --git a/reactos/dll/cpl/desk/lang/it-IT.rc b/reactos/dll/cpl/desk/lang/it-IT.rc index e8c385e0ebd..8b6a6a24909 100644 --- a/reactos/dll/cpl/desk/lang/it-IT.rc +++ b/reactos/dll/cpl/desk/lang/it-IT.rc @@ -131,6 +131,18 @@ BEGIN MENUITEM "Selected", ID_MENU_SELECTED END +IDM_MONITOR_MENU MENU +BEGIN + POPUP "" + BEGIN + MENUITEM "&Attached", ID_MENU_ATTACHED + MENUITEM "&Primary", ID_MENU_PRIMARY + MENUITEM SEPARATOR + MENUITEM "&Identify", ID_MENU_IDENTIFY + MENUITEM "P&roperties", ID_MENU_PROPERTIES + END +END + STRINGTABLE BEGIN IDS_MULTIPLEMONITORS "(Multiple Monitors)" diff --git a/reactos/dll/cpl/desk/lang/ja-JP.rc b/reactos/dll/cpl/desk/lang/ja-JP.rc index fab6557e8ee..9bb8f9f5d64 100644 --- a/reactos/dll/cpl/desk/lang/ja-JP.rc +++ b/reactos/dll/cpl/desk/lang/ja-JP.rc @@ -131,6 +131,18 @@ BEGIN MENUITEM "Selected", ID_MENU_SELECTED END +IDM_MONITOR_MENU MENU +BEGIN + POPUP "" + BEGIN + MENUITEM "&Attached", ID_MENU_ATTACHED + MENUITEM "&Primary", ID_MENU_PRIMARY + MENUITEM SEPARATOR + MENUITEM "&Identify", ID_MENU_IDENTIFY + MENUITEM "P&roperties", ID_MENU_PROPERTIES + END +END + STRINGTABLE BEGIN IDS_MULTIPLEMONITORS "(Multiple Monitors)" diff --git a/reactos/dll/cpl/desk/lang/nl-NL.rc b/reactos/dll/cpl/desk/lang/nl-NL.rc index 63e683b3320..e915c19b9cb 100644 --- a/reactos/dll/cpl/desk/lang/nl-NL.rc +++ b/reactos/dll/cpl/desk/lang/nl-NL.rc @@ -133,6 +133,18 @@ BEGIN MENUITEM "Selected", ID_MENU_SELECTED END +IDM_MONITOR_MENU MENU +BEGIN + POPUP "" + BEGIN + MENUITEM "&Attached", ID_MENU_ATTACHED + MENUITEM "&Primary", ID_MENU_PRIMARY + MENUITEM SEPARATOR + MENUITEM "&Identify", ID_MENU_IDENTIFY + MENUITEM "P&roperties", ID_MENU_PROPERTIES + END +END + STRINGTABLE BEGIN IDS_MULTIPLEMONITORS "(Multiple Monitors)" diff --git a/reactos/dll/cpl/desk/lang/pl-PL.rc b/reactos/dll/cpl/desk/lang/pl-PL.rc index f0e336ec68c..69dda731973 100644 --- a/reactos/dll/cpl/desk/lang/pl-PL.rc +++ b/reactos/dll/cpl/desk/lang/pl-PL.rc @@ -137,6 +137,18 @@ BEGIN MENUITEM "Wybrany", ID_MENU_SELECTED END +IDM_MONITOR_MENU MENU +BEGIN + POPUP "" + BEGIN + MENUITEM "&Attached", ID_MENU_ATTACHED + MENUITEM "&Primary", ID_MENU_PRIMARY + MENUITEM SEPARATOR + MENUITEM "&Identify", ID_MENU_IDENTIFY + MENUITEM "P&roperties", ID_MENU_PROPERTIES + END +END + STRINGTABLE BEGIN IDS_MULTIPLEMONITORS "(Multiple Monitors)" diff --git a/reactos/dll/cpl/desk/lang/ru-RU.rc b/reactos/dll/cpl/desk/lang/ru-RU.rc index 3987bac2344..4c91fe0b8e1 100644 --- a/reactos/dll/cpl/desk/lang/ru-RU.rc +++ b/reactos/dll/cpl/desk/lang/ru-RU.rc @@ -131,6 +131,18 @@ BEGIN MENUITEM "Âûáðàííàÿ", ID_MENU_SELECTED END +IDM_MONITOR_MENU MENU +BEGIN + POPUP "" + BEGIN + MENUITEM "&Attached", ID_MENU_ATTACHED + MENUITEM "&Primary", ID_MENU_PRIMARY + MENUITEM SEPARATOR + MENUITEM "&Identify", ID_MENU_IDENTIFY + MENUITEM "P&roperties", ID_MENU_PROPERTIES + END +END + STRINGTABLE BEGIN IDS_MULTIPLEMONITORS "(Multiple Monitors)" diff --git a/reactos/dll/cpl/desk/lang/sk-SK.rc b/reactos/dll/cpl/desk/lang/sk-SK.rc index d61a4486a6b..69463758ba2 100644 --- a/reactos/dll/cpl/desk/lang/sk-SK.rc +++ b/reactos/dll/cpl/desk/lang/sk-SK.rc @@ -140,6 +140,18 @@ BEGIN MENUITEM "Selected", ID_MENU_SELECTED END +IDM_MONITOR_MENU MENU +BEGIN + POPUP "" + BEGIN + MENUITEM "&Attached", ID_MENU_ATTACHED + MENUITEM "&Primary", ID_MENU_PRIMARY + MENUITEM SEPARATOR + MENUITEM "&Identify", ID_MENU_IDENTIFY + MENUITEM "P&roperties", ID_MENU_PROPERTIES + END +END + STRINGTABLE BEGIN IDS_MULTIPLEMONITORS "(Viacero monitorov)" diff --git a/reactos/dll/cpl/desk/lang/sv-SE.rc b/reactos/dll/cpl/desk/lang/sv-SE.rc index be6c6aad3da..5865fa52129 100644 --- a/reactos/dll/cpl/desk/lang/sv-SE.rc +++ b/reactos/dll/cpl/desk/lang/sv-SE.rc @@ -134,6 +134,18 @@ BEGIN MENUITEM "Selected", ID_MENU_SELECTED END +IDM_MONITOR_MENU MENU +BEGIN + POPUP "" + BEGIN + MENUITEM "&Attached", ID_MENU_ATTACHED + MENUITEM "&Primary", ID_MENU_PRIMARY + MENUITEM SEPARATOR + MENUITEM "&Identify", ID_MENU_IDENTIFY + MENUITEM "P&roperties", ID_MENU_PROPERTIES + END +END + STRINGTABLE BEGIN IDS_MULTIPLEMONITORS "(Multiple Monitors)" diff --git a/reactos/dll/cpl/desk/lang/uk-UA.rc b/reactos/dll/cpl/desk/lang/uk-UA.rc index e07e1cef9a9..0eef7c46244 100644 --- a/reactos/dll/cpl/desk/lang/uk-UA.rc +++ b/reactos/dll/cpl/desk/lang/uk-UA.rc @@ -139,6 +139,18 @@ BEGIN MENUITEM "Âèáðàíå", ID_MENU_SELECTED END +IDM_MONITOR_MENU MENU +BEGIN + POPUP "" + BEGIN + MENUITEM "&Attached", ID_MENU_ATTACHED + MENUITEM "&Primary", ID_MENU_PRIMARY + MENUITEM SEPARATOR + MENUITEM "&Identify", ID_MENU_IDENTIFY + MENUITEM "P&roperties", ID_MENU_PROPERTIES + END +END + STRINGTABLE BEGIN IDS_MULTIPLEMONITORS "(Äåê³ëüêà ìîí³òîð³â)" diff --git a/reactos/dll/cpl/desk/monslctl.c b/reactos/dll/cpl/desk/monslctl.c index d8efe44ea85..eee3aaa5ad7 100644 --- a/reactos/dll/cpl/desk/monslctl.c +++ b/reactos/dll/cpl/desk/monslctl.c @@ -496,6 +496,32 @@ MonSelGetMonitorInfo(IN PMONITORSELWND infoPtr, return FALSE; } +static INT +MonSelGetMonitorRect(IN OUT PMONITORSELWND infoPtr, + IN INT Index, + OUT PRECT prc) +{ + RECT rc, rcClient; + + if (Index < 0 || Index >= infoPtr->MonitorsCount) + return -1; + + if (!infoPtr->CanDisplay) + return 0; + + MonSelRectToScreen(infoPtr, + &infoPtr->Monitors[Index].rc, + prc); + + rcClient.left = rcClient.top = 0; + rcClient.right = infoPtr->ClientSize.cx; + rcClient.bottom = infoPtr->ClientSize.cy; + + return IntersectRect(&rc, + &rcClient, + prc) != FALSE; +} + static BOOL MonSelSetCurSelMonitor(IN OUT PMONITORSELWND infoPtr, IN INT Index, @@ -568,7 +594,8 @@ MonSelCreate(IN OUT PMONITORSELWND infoPtr) infoPtr->SelectionFrame.cx = infoPtr->SelectionFrame.cy = 4; infoPtr->Margin.cx = infoPtr->Margin.cy = 20; infoPtr->SelectedMonitor = -1; - infoPtr->ControlExStyle = MSLM_EX_ALLOWSELECTDISABLED; + infoPtr->ControlExStyle = MSLM_EX_ALLOWSELECTDISABLED | MSLM_EX_HIDENUMBERONSINGLE | + MSLM_EX_SELECTONRIGHTCLICK; return; } @@ -709,6 +736,10 @@ MonSelPaint(IN OUT PMONITORSELWND infoPtr, DWORD Index; RECT rc, rctmp; INT iPrevBkMode; + BOOL bHideNumber; + + bHideNumber = (infoPtr->ControlExStyle & MSLM_EX_HIDENUMBERS) || + ((infoPtr->MonitorsCount == 1) && (infoPtr->ControlExStyle & MSLM_EX_HIDENUMBERONSINGLE)); hbBk = GetSysColorBrush(COLOR_BACKGROUND); hpFg = CreatePen(PS_SOLID, @@ -773,22 +804,25 @@ MonSelPaint(IN OUT PMONITORSELWND infoPtr, -1, -1); - hFont = MonSelGetMonitorFont(infoPtr, - hDC, - Index); - if (hFont != NULL) + if (!bHideNumber) { - hPrevFont = SelectObject(hDC, - hFont); + hFont = MonSelGetMonitorFont(infoPtr, + hDC, + Index); + if (hFont != NULL) + { + hPrevFont = SelectObject(hDC, + hFont); - DrawText(hDC, - infoPtr->Monitors[Index].szCaption, - -1, - &rc, - DT_VCENTER | DT_CENTER | DT_NOPREFIX | DT_SINGLELINE); + DrawText(hDC, + infoPtr->Monitors[Index].szCaption, + -1, + &rc, + DT_VCENTER | DT_CENTER | DT_NOPREFIX | DT_SINGLELINE); - SelectObject(hDC, - hPrevFont); + SelectObject(hDC, + hPrevFont); + } } if (infoPtr->MonitorInfo[Index].Flags & MSL_MIF_DISABLED) @@ -813,6 +847,41 @@ MonSelPaint(IN OUT PMONITORSELWND infoPtr, hbOldBk); } +static VOID +MonSelContextMenu(IN OUT PMONITORSELWND infoPtr, + IN SHORT x, + IN SHORT y) +{ + MONSL_MONNMBUTTONCLICKED nm; + INT Index; + + if (!infoPtr->HasFocus) + SetFocus(infoPtr->hSelf); + + nm.pt.x = x; + nm.pt.y = y; + + Index = MonSelHitTest(infoPtr, + &nm.pt); + + MonSelNotifyMonitor(infoPtr, + MSLN_RBUTTONUP, + Index, + (PMONSL_MONNMHDR)&nm); + + /* Send a WM_CONTEXTMENU notification */ + MapWindowPoints(infoPtr->hSelf, + NULL, + &nm.pt, + 1); + + SendMessage(infoPtr->hSelf, + WM_CONTEXTMENU, + (WPARAM)infoPtr->hSelf, + MAKELPARAM(nm.pt.x, + nm.pt.y)); +} + static LRESULT CALLBACK MonitorSelWndProc(IN HWND hwnd, IN UINT uMsg, @@ -873,9 +942,16 @@ MonitorSelWndProc(IN HWND hwnd, break; } + case WM_RBUTTONDOWN: + { + if (!(infoPtr->ControlExStyle & MSLM_EX_SELECTONRIGHTCLICK)) + break; + + /* fall through */ + } + case WM_LBUTTONDBLCLK: case WM_LBUTTONDOWN: - case WM_RBUTTONDOWN: { INT Index; POINT pt; @@ -902,6 +978,14 @@ MonitorSelWndProc(IN HWND hwnd, break; } + case WM_RBUTTONUP: + { + MonSelContextMenu(infoPtr, + (SHORT)LOWORD(lParam), + (SHORT)HIWORD(lParam)); + break; + } + case WM_GETDLGCODE: { INT virtKey; @@ -1081,6 +1165,14 @@ MonitorSelWndProc(IN HWND hwnd, break; } + case MSLM_GETMONITORRECT: + { + Ret = (LRESULT)MonSelGetMonitorRect(infoPtr, + (INT)wParam, + (PRECT)lParam); + break; + } + case WM_CREATE: { infoPtr = (PMONITORSELWND) HeapAlloc(GetProcessHeap(), diff --git a/reactos/dll/cpl/desk/monslctl.h b/reactos/dll/cpl/desk/monslctl.h index 036a0c1516c..f3a7828995f 100644 --- a/reactos/dll/cpl/desk/monslctl.h +++ b/reactos/dll/cpl/desk/monslctl.h @@ -4,6 +4,9 @@ /* Control extended styles */ #define MSLM_EX_ALLOWSELECTNONE 0x1 #define MSLM_EX_ALLOWSELECTDISABLED 0x2 +#define MSLM_EX_HIDENUMBERONSINGLE 0x4 +#define MSLM_EX_HIDENUMBERS 0x8 +#define MSLM_EX_SELECTONRIGHTCLICK 0x10 /* MONSL_MONINFO Flags */ #define MSL_MIF_DISABLED 0x1 @@ -24,6 +27,13 @@ typedef struct _MONSL_MONNMHDR MONSL_MONINFO MonitorInfo; } MONSL_MONNMHDR, *PMONSL_MONNMHDR; +typedef struct _MONSL_MONNMBUTTONCLICKED +{ + /* Used with MSLN_MONITORCHANGING */ + MONSL_MONNMHDR hdr; + POINT pt; +} MONSL_MONNMBUTTONCLICKED, *PMONSL_MONNMBUTTONCLICKED; + typedef struct _MONSL_MONNMMONITORCHANGING { /* Used with MSLN_MONITORCHANGING */ @@ -52,7 +62,19 @@ typedef struct _MONSL_MONNMMONITORCHANGING * * lParam: PMONSL_MONNMHDR */ -#define MSLN_MONITORCHANGED 101 +#define MSLN_MONITORCHANGED 102 + +/* + * MSLN_RBUTTONUP + * This notification code is sent through WM_NOTIFY after the user did a + * right click on the control. If the control's extended style + * MSLM_EX_SELECTONRIGHTCLICK is set and the user clicked on a monitor, + * that monitor is selected and relevant notifications are sent before + * this notification is sent. + * + * lParam: PMONSL_MONNMBUTTONCLICKED + */ +#define MSLN_RBUTTONUP 103 /* * MSLM_SETMONITORSINFO @@ -146,7 +168,15 @@ typedef struct _MONSL_MONNMMONITORCHANGING * Allow deselecting a monitor by clicking into * unused areas of the control. * * MSLM_EX_ALLOWSELECTDISABLED - * Allow selecting disabled monitors + * Allow selecting disabled monitors. + * * MSLM_EX_HIDENUMBERONSINGLE + * Hides the monitor number if the control only + * displays one monitor. + * * MSLM_EX_HIDENUMBERS + * Does not show monitor numbers. + * * MSLM_EX_SELECTONRIGHTCLICK + * Selects a monitor when the user right clicks + * on it. * * Returns non-zero value if successful. */ @@ -161,6 +191,20 @@ typedef struct _MONSL_MONNMMONITORCHANGING */ #define MSLM_GETEXSTYLE (WM_USER + 0x19) +/* + * MSLM_GETMONITORRECT + * wParam: INT + * Index of the monitor whose display rectangle is queried. + * lParam: PRECT + * Pointer to a RECT structure that receives the rectangle + * in coordinates relative to the control's client area. + * + * Returns a positive value if the rectangle is visible. + * Returns zero if the rectangle is invisible. + * Returns a negative value if the index is not valid. + */ +#define MSLM_GETMONITORRECT (WM_USER + 0x20) + BOOL RegisterMonitorSelectionControl(IN HINSTANCE hInstance); VOID UnregisterMonitorSelectionControl(IN HINSTANCE hInstance); diff --git a/reactos/dll/cpl/desk/resource.h b/reactos/dll/cpl/desk/resource.h index 4da7497fef8..137d6544e4e 100644 --- a/reactos/dll/cpl/desk/resource.h +++ b/reactos/dll/cpl/desk/resource.h @@ -71,6 +71,12 @@ #define ID_MENU_DISABLED 2102 #define ID_MENU_SELECTED 2103 +#define IDM_MONITOR_MENU 2110 +#define ID_MENU_ATTACHED 2111 +#define ID_MENU_PRIMARY 2112 +#define ID_MENU_IDENTIFY 2113 +#define ID_MENU_PROPERTIES 2114 + /* Settings Page */ #define IDS_PIXEL 2301 diff --git a/reactos/dll/cpl/desk/settings.c b/reactos/dll/cpl/desk/settings.c index 508e47e4777..ff71f4a1e20 100644 --- a/reactos/dll/cpl/desk/settings.c +++ b/reactos/dll/cpl/desk/settings.c @@ -644,6 +644,106 @@ SettingsPageProc(IN HWND hwndDlg, IN UINT uMsg, IN WPARAM wParam, IN LPARAM lPar break; } + case WM_CONTEXTMENU: + { + HWND hwndMonSel; + HMENU hPopup; + UINT uiCmd; + POINT pt, ptClient; + INT Index; + + pt.x = (SHORT)LOWORD(lParam); + pt.y = (SHORT)HIWORD(lParam); + + hwndMonSel = GetDlgItem(hwndDlg, + IDC_SETTINGS_MONSEL); + if ((HWND)wParam == hwndMonSel) + { + if (pt.x == -1 && pt.y == -1) + { + RECT rcMon; + + Index = (INT)SendMessage(hwndMonSel, + MSLM_GETCURSEL, + 0, + 0); + + if (Index >= 0 && + (INT)SendMessage(hwndMonSel, + MSLM_GETMONITORRECT, + Index, + (LPARAM)&rcMon) > 0) + { + pt.x = rcMon.left + ((rcMon.right - rcMon.left) / 2); + pt.y = rcMon.top + ((rcMon.bottom - rcMon.top) / 2); + } + else + pt.x = pt.y = 0; + + MapWindowPoints(hwndMonSel, + NULL, + &pt, + 1); + } + else + { + ptClient = pt; + MapWindowPoints(NULL, + hwndMonSel, + &ptClient, + 1); + + Index = (INT)SendMessage(hwndMonSel, + MSLM_HITTEST, + (WPARAM)&ptClient, + 0); + } + + if (Index >= 0) + { + hPopup = LoadPopupMenu(hApplet, + MAKEINTRESOURCE(IDM_MONITOR_MENU)); + if (hPopup != NULL) + { + /* FIXME: Enable/Disable menu items */ + EnableMenuItem(hPopup, + ID_MENU_ATTACHED, + MF_BYCOMMAND | MF_DISABLED | MF_GRAYED); + EnableMenuItem(hPopup, + ID_MENU_PRIMARY, + MF_BYCOMMAND | MF_DISABLED | MF_GRAYED); + EnableMenuItem(hPopup, + ID_MENU_IDENTIFY, + MF_BYCOMMAND | MF_DISABLED | MF_GRAYED); + EnableMenuItem(hPopup, + ID_MENU_PROPERTIES, + MF_BYCOMMAND | MF_DISABLED | MF_GRAYED); + + uiCmd = (UINT)TrackPopupMenu(hPopup, + TPM_RETURNCMD | TPM_RIGHTBUTTON, + pt.x, + pt.y, + 0, + hwndDlg, + NULL); + + switch (uiCmd) + { + case ID_MENU_ATTACHED: + case ID_MENU_PRIMARY: + case ID_MENU_IDENTIFY: + case ID_MENU_PROPERTIES: + /* FIXME: Implement */ + break; + } + + DestroyMenu(hPopup); + } + } + } + break; + } + case WM_DESTROY: { PDISPLAY_DEVICE_ENTRY Current = pGlobalData->DisplayDeviceList; -- 2.17.1