Skip to content

Commit

Permalink
[HOTPLUG] **WIP** Implement confirm devices list
Browse files Browse the repository at this point in the history
  • Loading branch information
TAN-Gaming committed Oct 28, 2023
1 parent ba889e1 commit 571cfed
Show file tree
Hide file tree
Showing 3 changed files with 138 additions and 21 deletions.
122 changes: 119 additions & 3 deletions dll/cpl/hotplug/eject.c
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,105 @@

#include "hotplug.h"

static
HTREEITEM
GetTopLevelItemOfSelectedDevice(
_In_ HWND hwndDeviceTree)
{
HTREEITEM hTreeItem;

hTreeItem = TreeView_GetSelection(hwndDeviceTree);
if (!hTreeItem)
return NULL;

while (TreeView_GetParent(hwndDeviceTree, hTreeItem))
{
hTreeItem = TreeView_GetParent(hwndDeviceTree, hTreeItem);
}

return hTreeItem;
}

static
VOID
InsertConfirmDeviceListItem(
_In_ HWND hwndDeviceTree,
_In_ HWND hwndCfmDeviceList,
_In_ HTREEITEM hDevTreeItem)
{
TVITEMW tvItem;
WCHAR szDisplayName[40];
LVITEMW lvItem;

/* Retrieve data from the source tree-view item */
ZeroMemory(&tvItem, sizeof(tvItem));
tvItem.mask = TVIF_TEXT | TVIF_IMAGE | TVIF_PARAM;
tvItem.hItem = hDevTreeItem;
tvItem.pszText = szDisplayName;
tvItem.cchTextMax = ARRAYSIZE(szDisplayName);
TreeView_GetItem(hwndDeviceTree, &tvItem);

/* Copy data to the new list-view item */
ZeroMemory(&lvItem, sizeof(lvItem));
lvItem.mask = LVIF_TEXT | LVIF_IMAGE | LVIF_PARAM;
lvItem.iItem = ListView_GetItemCount(hwndCfmDeviceList);
lvItem.pszText = szDisplayName;
lvItem.iImage = tvItem.iImage;
lvItem.lParam = tvItem.lParam;
ListView_InsertItem(hwndCfmDeviceList, &lvItem);
}

static
VOID
FillConfirmDeviceList(
_In_ HWND hwndDeviceTree,
_In_ HWND hwndCfmDeviceList)
{
HTREEITEM hTreeItem;
LVCOLUMNW lvColumn;

hTreeItem = GetTopLevelItemOfSelectedDevice(hwndDeviceTree);
if (!hTreeItem)
return;

ZeroMemory(&lvColumn, sizeof(lvColumn));
lvColumn.mask = LVCF_FMT | LVCF_ORDER;

lvColumn.fmt = LVCFMT_IMAGE;
lvColumn.iOrder = 0;
ListView_InsertColumn(hwndCfmDeviceList, 0, &lvColumn);

lvColumn.fmt = LVCFMT_LEFT;
lvColumn.iOrder = 1;
ListView_InsertColumn(hwndCfmDeviceList, 1, &lvColumn);

InsertConfirmDeviceListItem(hwndDeviceTree, hwndCfmDeviceList, hTreeItem);

ListView_SetColumnWidth(hwndCfmDeviceList, 0, LVSCW_AUTOSIZE);
ListView_SetColumnWidth(hwndCfmDeviceList, 1, LVSCW_AUTOSIZE_USEHEADER);
}

static
DEVINST
GetDeviceInstForRemoval(
_In_ HWND hwndDeviceTree)
{
HTREEITEM hTreeItem;
TVITEMW item;

hTreeItem = GetTopLevelItemOfSelectedDevice(hwndDeviceTree);
if (!hTreeItem)
return 0;

ZeroMemory(&item, sizeof(item));
item.mask = TVIF_PARAM;
item.hItem = hTreeItem;

TreeView_GetItem(hwndDeviceTree, &item);

return item.lParam;
}

static
VOID
SafeRemoveDevice(
Expand All @@ -32,20 +131,33 @@ ConfirmRemovalDlgProc(
WPARAM wParam,
LPARAM lParam)
{
static DEVINST selectedDev;
PHOTPLUG_DATA pHotplugData;

pHotplugData = (PHOTPLUG_DATA)GetWindowLongPtrW(hwndDlg, DWLP_USER);

switch (uMsg)
{
case WM_INITDIALOG:
selectedDev = lParam;
{
pHotplugData = (PHOTPLUG_DATA)lParam;
SetWindowLongPtrW(hwndDlg, DWLP_USER, (LONG_PTR)pHotplugData);

ListView_SetImageList(GetDlgItem(hwndDlg, IDC_CONFIRM_STOP_DEVICE_LIST),
pHotplugData->ImageListData.ImageList,
LVSIL_NORMAL);

FillConfirmDeviceList(pHotplugData->hwndDeviceTree,
GetDlgItem(hwndDlg, IDC_CONFIRM_STOP_DEVICE_LIST));

return TRUE;
}

case WM_COMMAND:
{
switch (LOWORD(wParam))
{
case IDOK:
SafeRemoveDevice(selectedDev);
SafeRemoveDevice(GetDeviceInstForRemoval(pHotplugData->hwndDeviceTree));
EndDialog(hwndDlg, TRUE);
break;

Expand All @@ -56,6 +168,10 @@ ConfirmRemovalDlgProc(

break;
}

case WM_DESTROY:
SetWindowLongPtrW(hwndDlg, DWLP_USER, (LONG_PTR)NULL);
break;
}

return FALSE;
Expand Down
28 changes: 10 additions & 18 deletions dll/cpl/hotplug/hotplug.c
Original file line number Diff line number Diff line change
Expand Up @@ -14,17 +14,6 @@
#define NDEBUG
#include <debug.h>


typedef struct _HOTPLUG_DATA
{
HICON hIcon;
HICON hIconSm;
SP_CLASSIMAGELIST_DATA ImageListData;
HMENU hPopupMenu;
DWORD dwFlags;
} HOTPLUG_DATA, *PHOTPLUG_DATA;


// globals
HINSTANCE hApplet = 0;

Expand Down Expand Up @@ -456,7 +445,7 @@ SafeRemovalDlgProc(
SetupDiGetClassImageList(&pHotplugData->ImageListData);

pHotplugData->hPopupMenu = LoadMenu(hApplet, MAKEINTRESOURCE(IDM_POPUP_DEVICE_TREE));

pHotplugData->hwndDeviceTree = GetDlgItem(hwndDlg, IDC_SAFE_REMOVE_DEVICE_TREE);
pHotplugData->dwFlags = GetHotPlugFlags();

if (pHotplugData->dwFlags & HOTPLUG_DISPLAY_DEVICE_COMPONENTS)
Expand Down Expand Up @@ -509,12 +498,15 @@ SafeRemovalDlgProc(
case IDC_SAFE_REMOVE_STOP:
case IDM_STOP:
{
HWND hwndDevTree = GetDlgItem(hwndDlg, IDC_SAFE_REMOVE_DEVICE_TREE);
DialogBoxParamW(hApplet,
MAKEINTRESOURCEW(IDD_CONFIRM_STOP_HARDWARE_DIALOG),
hwndDlg,
ConfirmRemovalDlgProc,
(LPARAM)GetSelectedDeviceInst(hwndDevTree));
if (pHotplugData != NULL)
{
DialogBoxParamW(hApplet,
MAKEINTRESOURCEW(IDD_CONFIRM_STOP_HARDWARE_DIALOG),
hwndDlg,
ConfirmRemovalDlgProc,
(LPARAM)pHotplugData);
}

break;
}
}
Expand Down
9 changes: 9 additions & 0 deletions dll/cpl/hotplug/hotplug.h
Original file line number Diff line number Diff line change
Expand Up @@ -38,6 +38,15 @@ typedef struct
APPLET_PROC AppletProc;
}APPLET, *PAPPLET;

typedef struct _HOTPLUG_DATA
{
HICON hIcon;
HICON hIconSm;
SP_CLASSIMAGELIST_DATA ImageListData;
HMENU hPopupMenu;
HWND hwndDeviceTree;
DWORD dwFlags;
} HOTPLUG_DATA, *PHOTPLUG_DATA;

// eject.c
INT_PTR
Expand Down

0 comments on commit 571cfed

Please sign in to comment.