diff options
-rw-r--r-- | bundles/org.eclipse.swt/Eclipse SWT/gtk/org/eclipse/swt/widgets/Control.java | 11 | ||||
-rw-r--r-- | tests/org.eclipse.swt.tests/BugSnippets/Bug528415_CTabFolder_tabs_are_painted_wrong.java | 47 |
2 files changed, 52 insertions, 6 deletions
diff --git a/bundles/org.eclipse.swt/Eclipse SWT/gtk/org/eclipse/swt/widgets/Control.java b/bundles/org.eclipse.swt/Eclipse SWT/gtk/org/eclipse/swt/widgets/Control.java index 73cbefe741..a217a5948e 100644 --- a/bundles/org.eclipse.swt/Eclipse SWT/gtk/org/eclipse/swt/widgets/Control.java +++ b/bundles/org.eclipse.swt/Eclipse SWT/gtk/org/eclipse/swt/widgets/Control.java @@ -3458,18 +3458,17 @@ long /*int*/ gtk_draw (long /*int*/ widget, long /*int*/ cairo) { OS.gdk_cairo_get_clip_rectangle (cairo, rect); Event event = new Event (); event.count = 1; - Rectangle eventRect = new Rectangle (rect.x, rect.y, rect.width, rect.height); - event.setBounds (DPIUtil.autoScaleDown (eventRect)); - if ((style & SWT.MIRRORED) != 0) event.x = DPIUtil.autoScaleDown (getClientWidth ()) - event.width - event.x; + Rectangle eventBounds = DPIUtil.autoScaleDown (new Rectangle (rect.x, rect.y, rect.width, rect.height)); + if ((style & SWT.MIRRORED) != 0) eventBounds.x = DPIUtil.autoScaleDown (getClientWidth ()) - eventBounds.width - eventBounds.x; + event.setBounds (eventBounds); GCData data = new GCData (); // data.damageRgn = gdkEvent.region; if (OS.GTK_VERSION <= OS.VERSION (3, 9, 0)) { data.cairo = cairo; } GC gc = event.gc = GC.gtk_new (this, data); - Rectangle rect2 = DPIUtil.autoScaleDown(new Rectangle(rect.x, rect.y, rect.width, rect.height)); - // Caveat: rect2 is necessary because GC#setClipping(Rectangle) got broken by bug 446075 - gc.setClipping (rect2.x, rect2.y, rect2.width, rect2.height); + // Note: use GC#setClipping(x,y,width,height) because GC#setClipping(Rectangle) got broken by bug 446075 + gc.setClipping (eventBounds.x, eventBounds.y, eventBounds.width, eventBounds.height); drawWidget (gc); sendEvent (SWT.Paint, event); gc.dispose (); diff --git a/tests/org.eclipse.swt.tests/BugSnippets/Bug528415_CTabFolder_tabs_are_painted_wrong.java b/tests/org.eclipse.swt.tests/BugSnippets/Bug528415_CTabFolder_tabs_are_painted_wrong.java new file mode 100644 index 0000000000..2d346bca84 --- /dev/null +++ b/tests/org.eclipse.swt.tests/BugSnippets/Bug528415_CTabFolder_tabs_are_painted_wrong.java @@ -0,0 +1,47 @@ +import org.eclipse.swt.SWT; +import org.eclipse.swt.custom.CTabFolder; +import org.eclipse.swt.custom.CTabItem; +import org.eclipse.swt.layout.FillLayout; +import org.eclipse.swt.widgets.Display; +import org.eclipse.swt.widgets.Shell; + +/** + * Description: CTabItem in CTabFolder disappears on mouse over. + * Steps to reproduce: + * <ol> + * <li>mouse over a tab which has style SWT.RIGHT_TO_LEFT</li> + * </ol> + * Expected results: Tab is visible during and after mouse-over. + * Actual results: Tab is not visible during and after mouse-over, until another shell becomes active. + */ +public class Bug528415_CTabFolder_tabs_are_painted_wrong { + + public static void main(String[] args) { + Display display = new Display(); + Shell shell = new Shell(display); + shell.setSize(400, 200); + shell.setLayout(new FillLayout(SWT.VERTICAL)); + shell.setText("Bug 528415: tab hovering is broken"); + + CTabFolder tabFolder = new CTabFolder(shell, SWT.RIGHT_TO_LEFT); + CTabItem tab1 = new CTabItem(tabFolder, SWT.NONE); + tab1.setText("Bad Tab 1"); + CTabItem tab2 = new CTabItem(tabFolder, SWT.NONE); + tab2.setText("Bad Tab 2"); + + tabFolder = new CTabFolder(shell, SWT.LEFT_TO_RIGHT); + tab1 = new CTabItem(tabFolder, SWT.NONE); + tab1.setText("Good Tab 1"); + tab2 = new CTabItem(tabFolder, SWT.NONE); + tab2.setText("Good Tab 2"); + + shell.open(); + + while (!shell.isDisposed()) { + if (!display.readAndDispatch()) { + display.sleep(); + } + } + display.dispose(); + } +} |