[NETSHELL] Implement Right click menu (#7959)

This implements the right click menu on the network icon that is in the taskbar.

CORE-9055

Note that Repair isn't implemented and emits a "not implemented" message,
because as far as I see ReactOS has no repair functionality for internet.
This commit is contained in:
Petru Răzvan
2025-05-04 23:41:20 +03:00
committed by GitHub
parent 986c4778fa
commit 24c2e4433b
30 changed files with 239 additions and 3 deletions

View File

@@ -163,6 +163,7 @@ BEGIN
IDS_NET_DELETE "Изтриване"
IDS_NET_RENAME "Преименуване"
IDS_NET_PROPERTIES "Свойства"
IDS_NET_OPEN_CONNECTIONS "Open Network Connections"
IDS_FORMAT_BIT "%u бита/с"
IDS_FORMAT_KBIT "%u КБ/с"
IDS_FORMAT_MBIT "%u МБ/с"

View File

@@ -163,6 +163,7 @@ BEGIN
IDS_NET_DELETE "Smazat"
IDS_NET_RENAME "Přejmenovat"
IDS_NET_PROPERTIES "Vlasnosti"
IDS_NET_OPEN_CONNECTIONS "Open Network Connections"
IDS_FORMAT_BIT "%u Bit/s"
IDS_FORMAT_KBIT "%u KBit/s"
IDS_FORMAT_MBIT "%u MBit/s"

View File

@@ -163,6 +163,7 @@ BEGIN
IDS_NET_DELETE "Delete"
IDS_NET_RENAME "Rename"
IDS_NET_PROPERTIES "Properties"
IDS_NET_OPEN_CONNECTIONS "Open Network Connections"
IDS_FORMAT_BIT "%u Bit/s"
IDS_FORMAT_KBIT "%u KBit/s"
IDS_FORMAT_MBIT "%u MBit/s"

View File

@@ -163,6 +163,7 @@ BEGIN
IDS_NET_DELETE "Löschen"
IDS_NET_RENAME "Umbenennen"
IDS_NET_PROPERTIES "Eigenschaften"
IDS_NET_OPEN_CONNECTIONS "Open Network Connections"
IDS_FORMAT_BIT "%u Bit/s"
IDS_FORMAT_KBIT "%u KBit/s"
IDS_FORMAT_MBIT "%u MBit/s"

View File

@@ -163,6 +163,7 @@ BEGIN
IDS_NET_DELETE "Delete"
IDS_NET_RENAME "Rename"
IDS_NET_PROPERTIES "Properties"
IDS_NET_OPEN_CONNECTIONS "Open Network Connections"
IDS_FORMAT_BIT "%u Bit/s"
IDS_FORMAT_KBIT "%u KBit/s"
IDS_FORMAT_MBIT "%u MBit/s"

View File

@@ -163,6 +163,7 @@ BEGIN
IDS_NET_DELETE "Delete"
IDS_NET_RENAME "Rename"
IDS_NET_PROPERTIES "Properties"
IDS_NET_OPEN_CONNECTIONS "Open Network Connections"
IDS_FORMAT_BIT "%u Bit/s"
IDS_FORMAT_KBIT "%u KBit/s"
IDS_FORMAT_MBIT "%u MBit/s"

View File

@@ -171,6 +171,7 @@ BEGIN
IDS_NET_DELETE "Borrar"
IDS_NET_RENAME "Cambiar nombre"
IDS_NET_PROPERTIES "Propiedades"
IDS_NET_OPEN_CONNECTIONS "Open Network Connections"
IDS_FORMAT_BIT "%u Bit/s"
IDS_FORMAT_KBIT "%u KBit/s"
IDS_FORMAT_MBIT "%u MBit/s"

View File

@@ -163,6 +163,7 @@ BEGIN
IDS_NET_DELETE "Supprimer"
IDS_NET_RENAME "Renommer"
IDS_NET_PROPERTIES "Propriétés"
IDS_NET_OPEN_CONNECTIONS "Open Network Connections"
IDS_FORMAT_BIT "%u Bit/s"
IDS_FORMAT_KBIT "%u KBit/s"
IDS_FORMAT_MBIT "%u MBit/s"

View File

@@ -163,6 +163,7 @@ BEGIN
IDS_NET_DELETE "מחק"
IDS_NET_RENAME "שנה שם"
IDS_NET_PROPERTIES "מאפיינים"
IDS_NET_OPEN_CONNECTIONS "Open Network Connections"
IDS_FORMAT_BIT "%u Bit/s"
IDS_FORMAT_KBIT "%u KBit/s"
IDS_FORMAT_MBIT "%u MBit/s"

View File

@@ -169,6 +169,7 @@ BEGIN
IDS_NET_DELETE "हटाए"
IDS_NET_RENAME "नाम बदलें"
IDS_NET_PROPERTIES "गुण"
IDS_NET_OPEN_CONNECTIONS "Open Network Connections"
IDS_FORMAT_BIT "%u बिट/सेकंड"
IDS_FORMAT_KBIT "%u किलोबिट/सेकंड"
IDS_FORMAT_MBIT "%u मेगाबिट/सेकंड"

View File

@@ -163,6 +163,7 @@ BEGIN
IDS_NET_DELETE "Törlés"
IDS_NET_RENAME "Átnevezés"
IDS_NET_PROPERTIES "Tulajdonságok"
IDS_NET_OPEN_CONNECTIONS "Open Network Connections"
IDS_FORMAT_BIT "%u Bit/s"
IDS_FORMAT_KBIT "%u KBit/s"
IDS_FORMAT_MBIT "%u MBit/s"

View File

@@ -163,6 +163,7 @@ BEGIN
IDS_NET_DELETE "Delete"
IDS_NET_RENAME "Rename"
IDS_NET_PROPERTIES "Properties"
IDS_NET_OPEN_CONNECTIONS "Open Network Connections"
IDS_FORMAT_BIT "%u Bit/s"
IDS_FORMAT_KBIT "%u KBit/s"
IDS_FORMAT_MBIT "%u MBit/s"

View File

@@ -163,6 +163,7 @@ BEGIN
IDS_NET_DELETE "Cancella"
IDS_NET_RENAME "Rinomina"
IDS_NET_PROPERTIES "Proprietà"
IDS_NET_OPEN_CONNECTIONS "Open Network Connections"
IDS_FORMAT_BIT "%u Bit/s"
IDS_FORMAT_KBIT "%u KBit/s"
IDS_FORMAT_MBIT "%u MBit/s"

View File

@@ -162,6 +162,7 @@ BEGIN
IDS_NET_DELETE "削除"
IDS_NET_RENAME "名前の変更"
IDS_NET_PROPERTIES "プロパティ"
IDS_NET_OPEN_CONNECTIONS "Open Network Connections"
IDS_FORMAT_BIT "%u Bit/s"
IDS_FORMAT_KBIT "%u KBit/s"
IDS_FORMAT_MBIT "%u MBit/s"

View File

@@ -163,6 +163,7 @@ BEGIN
IDS_NET_DELETE "Verwijderen"
IDS_NET_RENAME "Hernoemen"
IDS_NET_PROPERTIES "Eigenschappen"
IDS_NET_OPEN_CONNECTIONS "Open Network Connections"
IDS_FORMAT_BIT "%u Bit/s"
IDS_FORMAT_KBIT "%u KBit/s"
IDS_FORMAT_MBIT "%u MBit/s"

View File

@@ -163,6 +163,7 @@ BEGIN
IDS_NET_DELETE "Slett"
IDS_NET_RENAME "Rename"
IDS_NET_PROPERTIES "Egenskaper"
IDS_NET_OPEN_CONNECTIONS "Open Network Connections"
IDS_FORMAT_BIT "%u Bit/s"
IDS_FORMAT_KBIT "%u KBit/s"
IDS_FORMAT_MBIT "%u MBit/s"

View File

@@ -165,6 +165,7 @@ BEGIN
IDS_NET_DELETE "Usuń"
IDS_NET_RENAME "Zmień nazwę"
IDS_NET_PROPERTIES "Właściwości"
IDS_NET_OPEN_CONNECTIONS "Open Network Connections"
IDS_FORMAT_BIT "%u Bit/s"
IDS_FORMAT_KBIT "%u KBit/s"
IDS_FORMAT_MBIT "%u MBit/s"

View File

@@ -170,6 +170,7 @@ BEGIN
IDS_NET_DELETE "Eliminar"
IDS_NET_RENAME "Mudar o nome"
IDS_NET_PROPERTIES "Propriedades"
IDS_NET_OPEN_CONNECTIONS "Open Network Connections"
IDS_FORMAT_BIT "%u Bit/s"
IDS_FORMAT_KBIT "%u KBit/s"
IDS_FORMAT_MBIT "%u MBit/s"

View File

@@ -172,6 +172,7 @@ BEGIN
IDS_NET_DELETE "Ștergere"
IDS_NET_RENAME "Redenumire"
IDS_NET_PROPERTIES "Proprietăți"
IDS_NET_OPEN_CONNECTIONS "Deschide Conexiuni de rețea"
IDS_FORMAT_BIT "%u biți/s"
IDS_FORMAT_KBIT "%u kbiți/s"
IDS_FORMAT_MBIT "%u Mbiți/s"

View File

@@ -163,6 +163,7 @@ BEGIN
IDS_NET_DELETE "Удалить"
IDS_NET_RENAME "Переименовать"
IDS_NET_PROPERTIES "Свойства"
IDS_NET_OPEN_CONNECTIONS "Open Network Connections"
IDS_FORMAT_BIT "%u бит/с"
IDS_FORMAT_KBIT "%u Кбит/с"
IDS_FORMAT_MBIT "%u Мбит/с"

View File

@@ -165,6 +165,7 @@ BEGIN
IDS_NET_DELETE "Odstrániť"
IDS_NET_RENAME "Premenovať"
IDS_NET_PROPERTIES "Vlastnosti"
IDS_NET_OPEN_CONNECTIONS "Open Network Connections"
IDS_FORMAT_BIT "%u Bitov/s"
IDS_FORMAT_KBIT "%u KBitov/s"
IDS_FORMAT_MBIT "%u MBitov/s"

View File

@@ -165,6 +165,7 @@ BEGIN
IDS_NET_DELETE "Fshi"
IDS_NET_RENAME "Riemërtoj"
IDS_NET_PROPERTIES "Karaktiristsikat"
IDS_NET_OPEN_CONNECTIONS "Open Network Connections"
IDS_FORMAT_BIT "%u Bit/s"
IDS_FORMAT_KBIT "%u KBit/s"
IDS_FORMAT_MBIT "%u MBit/s"

View File

@@ -163,6 +163,7 @@ BEGIN
IDS_NET_DELETE "Delete"
IDS_NET_RENAME "Rename"
IDS_NET_PROPERTIES "Properties"
IDS_NET_OPEN_CONNECTIONS "Open Network Connections"
IDS_FORMAT_BIT "%u Bit/s"
IDS_FORMAT_KBIT "%u KBit/s"
IDS_FORMAT_MBIT "%u MBit/s"

View File

@@ -165,6 +165,7 @@ BEGIN
IDS_NET_DELETE "Sil"
IDS_NET_RENAME "Yeniden Adlandır"
IDS_NET_PROPERTIES "Özellikler"
IDS_NET_OPEN_CONNECTIONS "Open Network Connections"
IDS_FORMAT_BIT "%u Bit/s"
IDS_FORMAT_KBIT "%u KBit/s"
IDS_FORMAT_MBIT "%u MBit/s"

View File

@@ -169,6 +169,7 @@ BEGIN
IDS_NET_DELETE "Видалити"
IDS_NET_RENAME "Rename"
IDS_NET_PROPERTIES "Властивості"
IDS_NET_OPEN_CONNECTIONS "Open Network Connections"
IDS_FORMAT_BIT "%u біт/с"
IDS_FORMAT_KBIT "%u Кбіт/с"
IDS_FORMAT_MBIT "%u Мбіт/с"

View File

@@ -171,6 +171,7 @@ BEGIN
IDS_NET_DELETE "删除"
IDS_NET_RENAME "重命名"
IDS_NET_PROPERTIES "属性"
IDS_NET_OPEN_CONNECTIONS "Open Network Connections"
IDS_FORMAT_BIT "%u Bit/秒"
IDS_FORMAT_KBIT "%u KBit/秒"
IDS_FORMAT_MBIT "%u MBit/秒"

View File

@@ -171,6 +171,7 @@ BEGIN
IDS_NET_DELETE "刪除"
IDS_NET_RENAME "重新命名"
IDS_NET_PROPERTIES "內容"
IDS_NET_OPEN_CONNECTIONS "Open Network Connections"
IDS_FORMAT_BIT "%u Bit秒"
IDS_FORMAT_KBIT "%u KBit秒"
IDS_FORMAT_MBIT "%u MBit秒"

View File

@@ -171,6 +171,7 @@ BEGIN
IDS_NET_DELETE "刪除"
IDS_NET_RENAME "重新命名"
IDS_NET_PROPERTIES "內容"
IDS_NET_OPEN_CONNECTIONS "Open Network Connections"
IDS_FORMAT_BIT "%u Bit秒"
IDS_FORMAT_KBIT "%u KBit秒"
IDS_FORMAT_MBIT "%u MBit秒"

View File

@@ -826,6 +826,118 @@ ShowStatusPropertyDialog(
}
}
VOID ShowNetworkIconContextMenu(
_In_ HWND hwndOwner,
_In_ LANSTATUSUI_CONTEXT *pContext)
{
if (!pContext || !pContext->pNet)
return;
HMENU hMenu = CreatePopupMenu();
if (!hMenu)
return;
POINT pt;
GetCursorPos(&pt);
SetForegroundWindow(hwndOwner);
// The context menu items, set to their default values.
struct
{
UINT uID;
UINT uFlags;
UINT_PTR uIDNewItem;
} MenuItems[] =
{
{IDS_NET_ACTIVATE, MF_GRAYED, IDM_NETICON_ENABLE},
{IDS_NET_STATUS, MF_GRAYED, IDM_NETICON_STATUS},
{IDS_NET_REPAIR, MF_GRAYED, IDM_NETICON_REPAIR},
{UINT_MAX, 0, 0}, // Separator
{IDS_NET_OPEN_CONNECTIONS, MF_ENABLED, IDM_NETICON_OPEN_CONNECTIONS},
{IDS_NET_PROPERTIES, MF_ENABLED | MFS_DEFAULT, IDM_NETICON_PROPERTIES},
};
NETCON_PROPERTIES *pProps = NULL;
HRESULT hr = pContext->pNet->GetProperties(&pProps);
if (SUCCEEDED(hr) && pProps)
{
if (pProps->Status == NCS_HARDWARE_DISABLED ||
pProps->Status == NCS_MEDIA_DISCONNECTED ||
pProps->Status == NCS_DISCONNECTED)
{
MenuItems[0].uID = IDS_NET_ACTIVATE;
MenuItems[0].uFlags = MF_ENABLED | MFS_DEFAULT;
MenuItems[0].uIDNewItem = IDM_NETICON_ENABLE;
MenuItems[5].uFlags = MF_ENABLED;
}
else
{
MenuItems[0].uID = IDS_NET_DEACTIVATE;
MenuItems[0].uFlags = MF_ENABLED;
MenuItems[0].uIDNewItem = IDM_NETICON_DISABLE;
}
if (pProps->Status == NCS_CONNECTED)
{
MenuItems[1].uFlags = MF_ENABLED;
MenuItems[2].uFlags = MF_ENABLED;
}
else if (pProps->Status == NCS_CONNECTING)
{
MenuItems[1].uFlags = MF_ENABLED;
MenuItems[2].uFlags = MF_GRAYED;
}
else
{
MenuItems[1].uFlags = MF_GRAYED;
MenuItems[2].uFlags = MF_GRAYED;
}
NcFreeNetconProperties(pProps);
pProps = NULL;
}
else
{
MenuItems[0].uFlags = MF_GRAYED;
MenuItems[1].uFlags = MF_GRAYED;
MenuItems[2].uFlags = MF_GRAYED;
MenuItems[5].uFlags = MF_GRAYED;
}
// Set the "Properties" item as default, if the Network "Enable/Disable" item isn't.
if (!(MenuItems[0].uFlags & MFS_DEFAULT))
MenuItems[5].uFlags |= MFS_DEFAULT;
WCHAR szMenuItem[128];
for (USHORT i = 0; i < _countof(MenuItems); ++i)
{
if (MenuItems[i].uID != UINT_MAX)
{
if (LoadStringW(netshell_hInstance, MenuItems[i].uID, szMenuItem, _countof(szMenuItem)))
AppendMenuW(hMenu, MF_STRING | MenuItems[i].uFlags, MenuItems[i].uIDNewItem, szMenuItem);
}
else
{
AppendMenuW(hMenu, MF_SEPARATOR, 0, NULL);
}
}
TrackPopupMenuEx(hMenu, TPM_LEFTALIGN | TPM_BOTTOMALIGN | TPM_RIGHTBUTTON, pt.x, pt.y, hwndOwner, NULL);
PostMessage(hwndOwner, WM_NULL, 0, 0);
DestroyMenu(hMenu);
}
HRESULT RepairConnection(INetConnection *pNet, HWND hwndOwner)
{
SHELL_ErrorBox(hwndOwner, HRESULT_FROM_WIN32(ERROR_NOT_SUPPORTED));
return E_NOTIMPL;
}
INT_PTR
CALLBACK
LANStatusDlg(
@@ -841,8 +953,20 @@ LANStatusDlg(
case WM_INITDIALOG:
pContext = (LANSTATUSUI_CONTEXT *)lParam;
SetWindowLongPtr(hwndDlg, DWLP_USER, (LONG_PTR)lParam);
pContext->hwndStatusDlg = hwndDlg;
pContext->nIDEvent = SetTimer(hwndDlg, NETTIMERID, 1000, NULL);
return TRUE;
case WM_DESTROY:
pContext = (LANSTATUSUI_CONTEXT*)GetWindowLongPtr(hwndDlg, DWLP_USER);
if (pContext && pContext->nIDEvent)
{
KillTimer(hwndDlg, pContext->nIDEvent);
pContext->nIDEvent = 0;
}
SetWindowLongPtr(hwndDlg, DWLP_USER, (LONG_PTR)NULL);
break;
case WM_TIMER:
pContext = (LANSTATUSUI_CONTEXT*)GetWindowLongPtr(hwndDlg, DWLP_USER);
if (wParam == (WPARAM)pContext->nIDEvent)
@@ -850,11 +974,29 @@ LANStatusDlg(
UpdateLanStatus(pContext->hwndDlg, pContext);
}
break;
case WM_SHOWSTATUSDLG:
if (LOWORD(lParam) == WM_LBUTTONUP)
pContext = (LANSTATUSUI_CONTEXT*)GetWindowLongPtr(hwndDlg, DWLP_USER);
if (!pContext)
break;
switch (LOWORD(lParam))
{
pContext = (LANSTATUSUI_CONTEXT*)GetWindowLongPtr(hwndDlg, DWLP_USER);
if (!pContext)
case WM_LBUTTONUP:
if (pContext->hwndDlg)
{
HWND hwndSheet = GetParent(pContext->hwndDlg);
if (hwndSheet)
{
ShowWindow(hwndSheet, SW_RESTORE);
SetForegroundWindow(hwndSheet);
BringWindowToTop(hwndSheet);
}
}
else
{
ShowStatusPropertyDialog(pContext, hwndDlg);
}
break;
if (pContext->hwndDlg)
@@ -867,8 +1009,63 @@ LANStatusDlg(
ShowStatusPropertyDialog(pContext, hwndDlg);
}
break;
case WM_RBUTTONUP:
case WM_CONTEXTMENU:
ShowNetworkIconContextMenu(hwndDlg, pContext);
break;
}
break;
case WM_COMMAND:
{
pContext = (LANSTATUSUI_CONTEXT*)GetWindowLongPtr(hwndDlg, DWLP_USER);
if (!pContext || !pContext->pNet)
break;
switch (LOWORD(wParam))
{
case IDM_NETICON_ENABLE:
pContext->pNet->Connect();
UpdateLanStatus(NULL, pContext);
break;
case IDM_NETICON_DISABLE:
pContext->pNet->Disconnect();
UpdateLanStatus(NULL, pContext);
break;
case IDM_NETICON_STATUS:
if (pContext->hwndDlg)
{
HWND hwndSheet = GetParent(pContext->hwndDlg);
if (hwndSheet)
{
ShowWindow(hwndSheet, SW_RESTORE);
SetForegroundWindow(hwndSheet);
BringWindowToTop(hwndSheet);
}
}
else
{
ShowStatusPropertyDialog(pContext, hwndDlg);
}
break;
case IDM_NETICON_REPAIR:
RepairConnection(pContext->pNet, hwndDlg);
break;
case IDM_NETICON_PROPERTIES:
ShowNetConnectionProperties(pContext->pNet, hwndDlg);
break;
case IDM_NETICON_OPEN_CONNECTIONS:
ShellExecuteW(hwndDlg, NULL, L"control", L"netconnections", NULL, SW_SHOWNORMAL);
break;
}
break;
}
}
return FALSE;
}

View File

@@ -51,6 +51,17 @@
#define IDC_CLOSE 1300
/* Network right click menu defines */
#define IDM_NETICON_CONTEXT_BASE 1400
#define IDM_NETICON_ENABLE (IDM_NETICON_CONTEXT_BASE + 0)
#define IDM_NETICON_DISABLE (IDM_NETICON_CONTEXT_BASE + 1)
#define IDM_NETICON_STATUS (IDM_NETICON_CONTEXT_BASE + 2)
#define IDM_NETICON_REPAIR (IDM_NETICON_CONTEXT_BASE + 3)
#define IDM_NETICON_OPEN_CONNECTIONS (IDM_NETICON_CONTEXT_BASE + 5)
#define IDM_NETICON_PROPERTIES (IDM_NETICON_CONTEXT_BASE + 6)
#define IDS_NET_OPEN_CONNECTIONS 10108
/* Network setup wizard pages */
#define IDD_NETWORKINITPAGE 3400
#define IDC_INSTALL_PROGRESS 3401