blob: 6480fb377d74006a9d4ba31771a5f5350f19bc12 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2020 Syntevo and others.
*
* This program and the accompanying materials
* are made available under the terms of the Eclipse Public License 2.0
* which accompanies this distribution, and is available at
* https://www.eclipse.org/legal/epl-2.0/
*
* SPDX-License-Identifier: EPL-2.0
*
* Contributors:
* Syntevo - initial API and implementation
*******************************************************************************/
package org.eclipse.swt.tests.manual;
import org.eclipse.swt.*;
import org.eclipse.swt.graphics.*;
import org.eclipse.swt.layout.*;
import org.eclipse.swt.widgets.*;
public class Bug561444_JvmCrash_SetRedraw {
static Text textS;
static Text textM;
static void paintRightSide(Control control) {
GC gc = new GC(control);
gc.setBackground(control.getDisplay().getSystemColor(SWT.COLOR_RED));
Point size = control.getSize();
int sizeX3 = size.x / 3;
gc.fillRectangle(new Rectangle(size.x - sizeX3, 0, sizeX3, size.y));
gc.dispose();
}
static void paintLeftSide(Control control, GC gc) {
gc.setBackground(control.getDisplay().getSystemColor(SWT.COLOR_BLUE));
Point size = control.getSize();
int sizeX3 = size.x / 3;
gc.fillRectangle(new Rectangle(0, 0, sizeX3, size.y));
}
public static void main(String[] args) {
Display display = new Display();
Shell shell = new Shell(display);
shell.setLayout(new RowLayout(SWT.VERTICAL));
final Text hint = new Text(shell, SWT.READ_ONLY | SWT.MULTI);
hint.setText(
"How to enable XIM input method\n" +
"----\n" +
" On GNOME, use env var:\n" +
" GTK_IM_MODULE=xim\n" +
" On XFCE, configure:\n" +
" OS \"Applications\" menu | Settings | Input Method Selector\n" +
" 'Use X compose table'\n" +
"\n" +
"Bugs with XIM\n" +
"----\n" +
"1) Uncheck 'Control.setRedraw()'\n" +
" SWT will crash with 'received an X Window System error'\n" +
"2) Click 'GC()' button\n" +
" SWT will crash with 'received an X Window System error'\n" +
"\n" +
"Bugs without XIM\n" +
"----\n" +
"1) Uncheck and check 'Control.setRedraw()'\n" +
" Single-line Text will stop responding to mouse events\n" +
"2) Click 'GC()', then Control.setRedraw()\n" +
" Single-line Text will not be redrawn\n"
);
textS = new Text(shell, SWT.NONE);
textS.setText("Single-line text");
textM = new Text(shell, SWT.MULTI);
textM.setText("Multi-line text");
Button button;
button = new Button(shell, SWT.NONE);
button.setText("Control.getMonitor(): report to console");
button.addListener(SWT.Selection, e -> {
Monitor monitor1 = shell.getMonitor();
Monitor monitor2 = textS.getMonitor();
Monitor monitor3 = textM.getMonitor();
if (monitor1.equals(monitor2) && monitor2.equals(monitor3))
System.out.println("All good");
else
System.out.println("Some monitors are wrong");
});
button = new Button(shell, SWT.CHECK);
button.setText("Control.setRedraw()");
button.setSelection(true);
button.addListener(SWT.Selection, e -> {
final boolean isSelected = ((Button)e.widget).getSelection();
textS.setRedraw(isSelected);
textM.setRedraw(isSelected);
});
final Listener paintLeftSideListener = e -> {
paintLeftSide((Control)e.widget, e.gc);
};
button = new Button(shell, SWT.CHECK);
button.setText("Control.gtk_draw(): paint left side (also click button below and then 'Control.redrawWidget()')");
button.addListener(SWT.Selection, e -> {
final boolean isSelected = ((Button)e.widget).getSelection();
if (isSelected) {
textM.addListener(SWT.Paint, paintLeftSideListener);
textS.addListener(SWT.Paint, paintLeftSideListener);
} else {
textM.removeListener(SWT.Paint, paintLeftSideListener);
textS.removeListener(SWT.Paint, paintLeftSideListener);
}
});
button = new Button(shell, SWT.NONE);
button.setText("Remove default background of Text (required for painting left side)");
button.addListener(SWT.Selection, e -> {
// Without disabling default background, anything we paint in SWT.Paint gets over-painted by default 'draw' in GTK
textS.setData("org.eclipse.swt.internal.gtk.css", "entry {background-color: transparent;}");
textM.setData("org.eclipse.swt.internal.gtk.css", "textview {background-color: transparent;} textview text {background-color: transparent;}");
});
button = new Button(shell, SWT.NONE);
button.setText("GC(): paint right side");
button.addListener(SWT.Selection, e -> {
paintRightSide(textS);
paintRightSide(textM);
});
button = new Button(shell, SWT.NONE);
button.setText("Control.redrawWidget()");
button.addListener(SWT.Selection, e -> {
textS.redraw();
textM.redraw();
});
button = new Button(shell, SWT.NONE);
button.setText("Text.setCursor()");
button.addListener(SWT.Selection, e -> {
textS.setCursor(new Cursor(display, SWT.CURSOR_HAND));
textM.setCursor(new Cursor(display, SWT.CURSOR_HAND));
});
shell.pack();
shell.open();
while (!shell.isDisposed()) {
if (!display.readAndDispatch())
display.sleep();
}
display.dispose();
}
}