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)