]> git.lyx.org Git - lyx.git/blobdiff - src/frontends/qt4/GuiWorkArea.cpp
QDialogButtonBox for the remaining dialogs.
[lyx.git] / src / frontends / qt4 / GuiWorkArea.cpp
index be1b4d4dcc5f8ac561fe61dd8fde3235d850f22f..e6d993c2735ad8bd16eb43c394b7e91c51ee1c51 100644 (file)
@@ -270,6 +270,7 @@ GuiWorkArea::Private::~Private()
 GuiWorkArea::GuiWorkArea(QWidget * /* w */)
 : d(new Private(this))
 {
+       new CompressorProxy(this); // not a leak
 }
 
 
@@ -659,10 +660,10 @@ void GuiWorkArea::Private::updateScrollbar()
        // the signal valueChanged. (#10311)
        QObject::disconnect(p->verticalScrollBar(), SIGNAL(valueChanged(int)),
                            p, SLOT(scrollTo(int)));
-       ScrollbarParameters const & scroll_ = buffer_view_->scrollbarParameters();
-       p->verticalScrollBar()->setRange(scroll_.min, scroll_.max);
-       p->verticalScrollBar()->setPageStep(scroll_.page_step);
-       p->verticalScrollBar()->setSingleStep(scroll_.single_step);
+       ScrollbarParameters const & scroll = buffer_view_->scrollbarParameters();
+       p->verticalScrollBar()->setRange(scroll.min, scroll.max);
+       p->verticalScrollBar()->setPageStep(scroll.page_step);
+       p->verticalScrollBar()->setSingleStep(scroll.single_step);
        p->verticalScrollBar()->setSliderPosition(0);
        // Connect to the vertical scroll bar
        QObject::connect(p->verticalScrollBar(), SIGNAL(valueChanged(int)),
@@ -1035,13 +1036,15 @@ void GuiWorkArea::generateSyntheticMouseEvent()
 
 
 // CompressorProxy adapted from Kuba Ober https://stackoverflow.com/a/21006207
-CompressorProxy::CompressorProxy(GuiWorkArea * wa) : QObject(wa)
+CompressorProxy::CompressorProxy(GuiWorkArea * wa) : QObject(wa), flag_(false)
 {
        qRegisterMetaType<KeySymbol>("KeySymbol");
        qRegisterMetaType<KeyModifier>("KeyModifier");
-       connect(wa, &GuiWorkArea::compressKeySym, this, &CompressorProxy::slot,
+       connect(wa, SIGNAL(compressKeySym(KeySymbol, KeyModifier, bool)),
+               this, SLOT(slot(KeySymbol, KeyModifier, bool)),
                Qt::QueuedConnection);
-       connect(this, &CompressorProxy::signal, wa, &GuiWorkArea::processKeySym);
+       connect(this, SIGNAL(signal(KeySymbol, KeyModifier)),
+               wa, SLOT(processKeySym(KeySymbol, KeyModifier)));
 }
 
 
@@ -1244,6 +1247,18 @@ void GuiWorkArea::Private::paintPreeditText(GuiPainter & pain)
 
 void GuiWorkArea::paintEvent(QPaintEvent * ev)
 {
+       // Do not trigger the painting machinery if we are not ready (see
+       // bug #10989). The second test triggers when in the middle of a
+       // dispatch operation.
+       if (view().busy() || d->buffer_view_->buffer().undo().activeUndoGroup()) {
+               // Since macOS has turned the screen black at this point, our
+               // backing store has to be copied to screen (this is a no-op
+               // except on macOS).
+               d->updateScreen(ev->rect());
+               ev->accept();
+               return;
+       }
+
        // LYXERR(Debug::PAINTING, "paintEvent begin: x: " << rc.x()
        //      << " y: " << rc.y() << " w: " << rc.width() << " h: " << rc.height());
 
@@ -1278,11 +1293,13 @@ void GuiWorkArea::inputMethodEvent(QInputMethodEvent * e)
 
        // insert the processed text in the document (handles undo)
        if (!e->commitString().isEmpty()) {
-               d->buffer_view_->cursor().beginUndoGroup();
-               d->buffer_view_->cursor().insert(qstring_to_ucs4(e->commitString()));
+               FuncRequest cmd(LFUN_SELF_INSERT,
+                               qstring_to_ucs4(e->commitString()),
+                               FuncRequest::KEYBOARD);
+               dispatch(cmd);
+               // FIXME: this is supposed to remove traces from preedit
+               // string. Can we avoid calling it explicitely?
                d->buffer_view_->updateMetrics();
-               d->buffer_view_->cursor().endUndoGroup();
-               viewport()->update();
        }
 
        // Hide the caret during the test transformation.