From 521d007311155920f7a77e3bec42f4a587de01fc Mon Sep 17 00:00:00 2001 From: Amartya Parijat Date: Thu, 20 Nov 2025 15:36:21 +0100 Subject: [PATCH] Handle Checkbox ImageList scaling in Table in win32 This commit handles scaling of ImageList in a table on DPI_CHANGE event by destroying the current imagelist and recalculating the height of the table item and then creating a new imagelist using the new size. --- .../win32/org/eclipse/swt/widgets/Table.java | 22 +++++++++++++++++-- 1 file changed, 20 insertions(+), 2 deletions(-) diff --git a/bundles/org.eclipse.swt/Eclipse SWT/win32/org/eclipse/swt/widgets/Table.java b/bundles/org.eclipse.swt/Eclipse SWT/win32/org/eclipse/swt/widgets/Table.java index c8cd58635b..6b02369bb9 100644 --- a/bundles/org.eclipse.swt/Eclipse SWT/win32/org/eclipse/swt/widgets/Table.java +++ b/bundles/org.eclipse.swt/Eclipse SWT/win32/org/eclipse/swt/widgets/Table.java @@ -7336,6 +7336,19 @@ LRESULT wmNotifyToolTip (NMTTCUSTOMDRAW nmcd, long lParam) { return null; } +void destroyImageList() { + long oldStateImageList = OS.SendMessage(handle, OS.LVM_GETIMAGELIST, OS.LVSIL_STATE, 0); + long oldhImageList = OS.SendMessage(handle, OS.LVM_GETIMAGELIST, OS.LVSIL_SMALL, 0); + long hImageList = OS.ImageList_Create (1, 1, 0, 0, 0); + OS.SendMessage (handle, OS.LVM_SETIMAGELIST, OS.LVSIL_STATE, hImageList); + OS.SendMessage (handle, OS.LVM_SETIMAGELIST, OS.LVSIL_SMALL, hImageList); + OS.ImageList_Destroy(oldStateImageList); + OS.ImageList_Destroy(oldhImageList); + OS.SendMessage (handle, OS.LVM_SETIMAGELIST, OS.LVSIL_STATE, 0); + OS.SendMessage (handle, OS.LVM_SETIMAGELIST, OS.LVSIL_SMALL, 0); + OS.ImageList_Destroy(hImageList); +} + @Override void handleDPIChange(Event event, float scalingFactor) { super.handleDPIChange(event, scalingFactor); @@ -7358,6 +7371,12 @@ void handleDPIChange(Event event, float scalingFactor) { imageList = null; } + if((style & SWT.CHECK) != 0 ) { + destroyImageList(); + int size = getItemHeightInPixels(); + setCheckboxImageList(size, size, false); + } + // if the item height was set at least once programmatically with CDDS_SUBITEMPREPAINT, // the item height of the table is not managed by the OS anymore e.g. when the zoom // on the monitor is changed, the height of the item will stay at the fixed size. @@ -7375,7 +7394,6 @@ void handleDPIChange(Event event, float scalingFactor) { // Update scrollbar width if no columns are available setScrollWidth(scrollWidth); } - fixCheckboxImageListColor (true); - settingItemHeight = false; + settingItemHeight = false; } }