Thanks to visit codestin.com
Credit goes to github.com

Skip to content

Commit f2e3c97

Browse files
author
zhourenjian
committed
Fix bug that MESSAGE queue order is modified inside Display readAndDispatch call. Try to keep its original order.
1 parent 1d7f736 commit f2e3c97

File tree

1 file changed

+47
-26
lines changed
  • sources/net.sf.j2s.java.org.eclipse.swt/src/org/eclipse/swt/widgets

1 file changed

+47
-26
lines changed

sources/net.sf.j2s.java.org.eclipse.swt/src/org/eclipse/swt/widgets/Display.java

Lines changed: 47 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -2641,7 +2641,18 @@ public void run() {
26412641
* C_$.createC_$Window_ = Console.createC_$Window;
26422642
* C_$.createConsoleWindow = C_$.createC_$Window = function (parentEl) {
26432643
* var console = C_$.createC_$Window_ (parentEl);
2644-
* console.style.display = "none";
2644+
* if (O$.isIE) {
2645+
* var consoleStyle = console.style;
2646+
* consoleStyle.display = "block"
2647+
* consoleStyle.position = "absolute";
2648+
* consoleStyle.width = "200px";
2649+
* consoleStyle.height = "200px";
2650+
* consoleStyle.left = "-400px";
2651+
* consoleStyle.top = "-400px";
2652+
* consoleStyle.overflow = "hidden";
2653+
* } else {
2654+
* console.style.display = "none";
2655+
* }
26452656
* $wt.widgets.Display.insertOpenConsoleLink(console);
26462657
* return console;
26472658
* };
@@ -3375,9 +3386,7 @@ public void run() {
33753386
if (msgs.length != 0) {
33763387
messageLoop = true;
33773388
// System.out.println("msgs.legnth" + msgs.length);
3378-
MESSAGE[] defered = new MESSAGE[0];
3379-
3380-
int defsize = 0;
3389+
int idx = 0;
33813390
for (int i = msgs.length - 1; i >= 0; i--) {
33823391
MESSAGE m1 = msgs[i];
33833392
if (m1 == null) {
@@ -3393,31 +3402,33 @@ public void run() {
33933402
}
33943403

33953404
if(m1.type == MESSAGE.CONTROL_LAYOUT){
3396-
if(m1.control.parent != null && m1.control.parent.waitingForLayout){
3405+
Composite p = m1.control.parent;
3406+
if(p != null && p.waitingForLayout){
33973407
// System.out.println(m1.control.getName()+ " is waiting for parent " +
3398-
// m1.control.parent.getName());
3408+
// p.getName());
33993409
m1.defer = true;
3400-
defered[defsize++] = m1;
34013410
}
34023411
}
34033412

34043413
}
34053414
long time = 0;
34063415

3416+
boolean deferred = false;
34073417

34083418
for (int i = 0; i < msgs.length; i++) {
34093419
// for (int i = msgs.length - 1; i >= 0; i--) {
34103420
MESSAGE m = msgs[i];
34113421

34123422
if(m != null && m.defer){
3423+
deferred = true;
34133424
// System.out.println("deffer " + m.control.getName());
34143425
continue;
34153426
}
34163427
msgs[i] = null;
34173428
if (m != null && m.type == MESSAGE.CONTROL_LAYOUT) {
34183429
m.control.waitingForLayout = false;
34193430
if (!m.control.isVisible()) { continue; }
3420-
Date d = new Date();
3431+
long d = new Date().getTime();
34213432
Composite c = (Composite) m.control;
34223433
if(c.waitingForLayoutWithResize){
34233434
c.setResizeChildren (false);
@@ -3437,41 +3448,50 @@ public void run() {
34373448
} else {
34383449
c.layout();
34393450
}
3440-
time += new Date().getTime() - d.getTime();
3451+
time += new Date().getTime() - d;
34413452
// System.err.println(c.getName() + " cost " + (time));
34423453
if (time > 200) {
34433454
// System.out.println("before deferring:" + msgs.length);
3444-
for (int j = i + 1; j < msgs.length; j++) {
3445-
msgs[j - i - 1] = msgs[j];
3455+
idx = 0;
3456+
if (deferred) {
3457+
for (int j = 0; j < i + 1; j++) {
3458+
m = msgs[j];
3459+
if (m != null && m.defer) {
3460+
msgs[idx++] = m;
3461+
}
3462+
msgs[j] = null;
3463+
}
34463464
}
3447-
// for (int j = 0; j < i; j++) {
3448-
// msgs[msgs.length - 1 - j] = null;
3449-
// }
3450-
int length = msgs.length - i - 1;
3451-
for(int j = 0; j < defsize; j++){
3452-
msgs[length + j] = defered[j];
3465+
for (int j = i + 1; j < msgs.length; j++) {
3466+
msgs[idx++] = msgs[j];
3467+
msgs[j] = null;
34533468
}
34543469
/**
34553470
* @j2sNativeSrc
3456-
* msgs.length -= i + 1;
3471+
* msgs.length = idx;
34573472
* @j2sNative
3458-
* a.length -= f + 1;
3473+
* a.length = b;
34593474
*/ {}
34603475
// System.out.println("after deferring:" + msgs.length);
34613476
return ;
34623477
}
34633478
}
34643479
}
3480+
idx = 0;
3481+
if (deferred) {
3482+
for(int j = 0; j < msgs.length; j++){
3483+
MESSAGE m = msgs[j];
3484+
if (m != null && m.defer) {
3485+
msgs[idx++] = m;
3486+
}
3487+
}
3488+
}
34653489
/**
34663490
* @j2sNativeSrc
3467-
* msgs.length = 0;
3491+
* msgs.length = idx;
34683492
* @j2sNative
3469-
* a.length = 0;
3493+
* a.length = b;
34703494
*/ {}
3471-
Display.this.msgs = defered;
3472-
// for(int j = 0; j < defsize; j++){
3473-
// msgs[j] = defered[j];
3474-
// }
34753495
}
34763496
}
34773497
}, 100);
@@ -3746,6 +3766,7 @@ void releaseDisplay () {
37463766
filterTable = null;
37473767
if (messageProc != 0) {
37483768
window.clearInterval(messageProc);
3769+
messageProc = 0;
37493770
}
37503771
msgs = null;
37513772
}
@@ -4016,7 +4037,7 @@ boolean runPopups () {
40164037
boolean runTimer (int id) {
40174038
if (timerList != null && timerIds != null) {
40184039
int index = 0;
4019-
while (index <timerIds.length) {
4040+
while (index < timerIds.length) {
40204041
if (timerIds [index] == id) {
40214042
//OS.KillTimer (hwndMessage, timerIds [index]);
40224043
window.clearInterval(timerIds [index]);

0 commit comments

Comments
 (0)