diff -r 85266cc22c7f -r f40128debb5d javauis/eswt_qt/org.eclipse.swt/Eclipse SWT/qt/org/eclipse/swt/widgets/Shell.java --- a/javauis/eswt_qt/org.eclipse.swt/Eclipse SWT/qt/org/eclipse/swt/widgets/Shell.java Fri Jun 11 13:33:44 2010 +0300 +++ b/javauis/eswt_qt/org.eclipse.swt/Eclipse SWT/qt/org/eclipse/swt/widgets/Shell.java Wed Jun 23 18:07:10 2010 +0300 @@ -141,6 +141,14 @@ WindowSurface windowSurface; /** + * When QMainWindow/QDialog visibility is changed, Qt may send a resize event. + * eSWT application may have a Shell.setVisible() call in Shell's resize event + * handler, which would cause an infinite loop. To prevent this suppress resize + * events when Shell visibility is being changed. + */ +boolean suppressResizeEvent; + +/** * Constructs a new instance of this class. This is equivalent * to calling Shell((Display) null). * @@ -467,11 +475,15 @@ Point size = computeSize(area.width, area.height, true); size.x -= windowFrameTrim() * 2; size.y -= windowTitleTrim() + windowFrameTrim(); + + // These values will be returned if the size is queried before the Shell + // is made visible (and they are not set again). + OS.QWidget_resize(topHandle, size.x, size.y); + if(OS.windowServer == OS.WS_SYMBIAN_S60 && parent == null) { setRestoreState(OS.QT_WINDOWMAXIMIZED, false); - } else { - OS.QWidget_resize(topHandle, size.x, size.y); } + return size; } @@ -991,7 +1003,15 @@ } // This shell - super.setVisible(visible); + try { + if (visible) { + suppressResizeEvent = true; + } + super.setVisible(visible); + } finally { + suppressResizeEvent = false; + } + if(isDisposed()) return; // Dialog shells. @@ -1132,6 +1152,10 @@ return defBounds; } +void qt_swt_event_widgetResized_pp(int widgetHandle, int oldWidth, int oldHeight, int width, int height, boolean sendResizeEvent) { + super.qt_swt_event_widgetResized_pp(widgetHandle, oldWidth, oldHeight, width, height, !suppressResizeEvent); +} + WindowSurface getWindowSurface() { checkWidget(); // Only top level shells have window surface