]> git.lyx.org Git - lyx.git/commitdiff
Extracted from r14281
authorLars Gullik Bjønnes <larsbj@gullik.org>
Sat, 8 Jul 2006 22:06:50 +0000 (22:06 +0000)
committerLars Gullik Bjønnes <larsbj@gullik.org>
Sat, 8 Jul 2006 22:06:50 +0000 (22:06 +0000)
* BufferView:
    - hideCursor(): deleted
* frontends/WorkArea:
    - now each instance handles its blinking cursor independently.
    - hideCursor(), howCursor(), toggleCursor(): new methods

git-svn-id: svn://svn.lyx.org/lyx/lyx-devel/trunk@14387 a592a061-630c-0410-9148-cb99ea01b6c8

src/BufferView_pimpl.C
src/BufferView_pimpl.h
src/frontends/WorkArea.C
src/frontends/WorkArea.h
src/lyxfunc.C

index f21bed37fc3e51df6cc6239980c6246ea5cc1965..ea31aa1c4615c75395d540e904dacffd9b73d2e6 100644 (file)
@@ -48,7 +48,6 @@
 #include "paragraph_funcs.h"
 #include "ParagraphParameters.h"
 #include "pariterator.h"
-#include "rowpainter.h"
 #include "toc.h"
 #include "undo.h"
 #include "vspace.h"
 #include "frontends/font_metrics.h"
 #include "frontends/Gui.h"
 #include "frontends/LyXView.h"
-#include "frontends/WorkArea.h"
 
 #include "graphics/Previews.h"
 
 #include "support/convert.h"
 #include "support/filefilterlist.h"
 #include "support/filetools.h"
-#include "support/forkedcontr.h"
 #include "support/package.h"
 #include "support/types.h"
 
@@ -81,7 +78,6 @@
 #include <functional>
 #include <vector>
 
-using lyx::frontend::WorkArea;
 using lyx::frontend::Clipboard;
 using lyx::frontend::Gui;
 
@@ -91,7 +87,6 @@ using lyx::support::addPath;
 using lyx::support::bformat;
 using lyx::support::FileFilterList;
 using lyx::support::fileSearch;
-using lyx::support::ForkedcallsController;
 using lyx::support::isDirWriteable;
 using lyx::support::makeDisplayPath;
 using lyx::support::makeAbsPath;
@@ -113,13 +108,6 @@ namespace {
 
 unsigned int const saved_positions_num = 20;
 
-// All the below connection objects are needed because of a bug in some
-// versions of GCC (<=2.96 are on the suspects list.) By having and assigning
-// to these connections we avoid a segfault upon startup, and also at exit.
-// (Lgb)
-
-boost::signals::connection timecon;
-
 /// Return an inset of this class if it exists at the current cursor position
 template <class T>
 T * getInsetByCode(LCursor & cur, InsetBase::Code code)
@@ -137,18 +125,12 @@ T * getInsetByCode(LCursor & cur, InsetBase::Code code)
 
 
 BufferView::Pimpl::Pimpl(BufferView & bv, LyXView * owner)
-       : bv_(&bv), owner_(owner), buffer_(0), wh_(0), cursor_timeout(400),
+       : bv_(&bv), owner_(owner), buffer_(0), wh_(0),
          cursor_(bv),
          multiparsel_cache_(false), anchor_ref_(0), offset_ref_(0), needs_redraw_(false)
 {
        xsel_cache_.set = false;
 
-       // Setup the signals
-       timecon = cursor_timeout.timeout
-               .connect(boost::bind(&BufferView::Pimpl::cursorToggle, this));
-
-       cursor_timeout.start();
-
        saved_positions.resize(saved_positions_num);
        // load saved bookmarks
        lyx::Session::BookmarkList & bmList = LyX::ref().session().loadBookmarks();
@@ -512,8 +494,6 @@ void BufferView::Pimpl::scrollDocView(int value)
        if (!buffer_)
                return;
 
-       owner_->gui().guiCursor().hide();
-
        LyXText & t = *bv_->text();
 
        float const bar = value / float(wh_ * t.paragraphs().size());
@@ -583,16 +563,6 @@ void BufferView::Pimpl::workAreaKeyPress(LyXKeySymPtr key,
                                         key_modifier::state state)
 {
        owner_->getLyXFunc().processKeySym(key, state);
-
-       /* This is perhaps a bit of a hack. When we move
-        * around, or type, it's nice to be able to see
-        * the cursor immediately after the keypress. So
-        * we reset the toggle timeout and force the visibility
-        * of the cursor. Note we cannot do this inside
-        * dispatch() itself, because that's called recursively.
-        */
-       if (available())
-               owner_->gui().guiCursor().show(*bv_);
 }
 
 
@@ -627,7 +597,6 @@ void BufferView::Pimpl::selectionRequested()
 void BufferView::Pimpl::selectionLost()
 {
        if (available()) {
-               owner_->gui().guiCursor().hide();
                cursor_.clearSelection();
                xsel_cache_.set = false;
        }
@@ -725,23 +694,6 @@ void BufferView::Pimpl::update(Update::flags flags)
 }
 
 
-// Callback for cursor timer
-void BufferView::Pimpl::cursorToggle()
-{
-       if (buffer_) {
-               owner_->gui().guiCursor().toggle(*bv_);
-
-               // Use this opportunity to deal with any child processes that
-               // have finished but are waiting to communicate this fact
-               // to the rest of LyX.
-               ForkedcallsController & fcc = ForkedcallsController::get();
-               fcc.handleCompletedProcesses();
-       }
-
-       cursor_timeout.restart();
-}
-
-
 bool BufferView::Pimpl::available() const
 {
        return buffer_ && bv_->text();
@@ -982,8 +934,6 @@ bool BufferView::Pimpl::workAreaDispatch(FuncRequest const & cmd0)
        if (!available())
                return false;
 
-       owner_->gui().guiCursor().hide();
-
        // Either the inset under the cursor or the
        // surrounding LyXText will handle this event.
 
@@ -1018,10 +968,6 @@ bool BufferView::Pimpl::workAreaDispatch(FuncRequest const & cmd0)
                        update(Update::FitCursor | Update::MultiParSel);
        }
 
-       // See workAreaKeyPress
-       cursor_timeout.restart();
-       owner_->gui().guiCursor().show(*bv_);
-
        // Skip these when selecting
        if (cmd.action != LFUN_MOUSE_MOTION) {
                owner_->updateLayoutChoice();
index 27c4655a5d6d5429ba20c7450a29dd9a2991ec3f..8b1e33fb854e471b303bc82ae00584da9026525c 100644 (file)
@@ -24,7 +24,6 @@
 #include "metricsinfo.h"
 
 #include "frontends/LyXKeySym.h"
-#include "frontends/Timeout.h"
 
 #include "support/types.h"
 
@@ -80,8 +79,6 @@ public:
        ///
        void selectionLost();
        ///
-       void cursorToggle();
-       ///
        bool available() const;
        /// get the change at the cursor position
        Change const getCurrentChange();
@@ -185,8 +182,6 @@ private:
        /// Estimated average par height for scrollbar
        int wh_;
        ///
-       Timeout cursor_timeout;
-       ///
        class Position {
        public:
                /// Filename
index 52318b89dbd1a3f89543c8a03515edfa8974e8eb..21fa3fb9b0036661fd0b55bf0b27ef3f573139a6 100644 (file)
 #include "graphics/GraphicsLoader.h"
 
 #include "support/filetools.h" // LibFileSearch
+#include "support/forkedcontr.h"
 
 #include <boost/utility.hpp>
 #include <boost/bind.hpp>
 #include <boost/signals/trackable.hpp>
 
 using lyx::support::libFileSearch;
+using lyx::support::ForkedcallsController;
 
 using std::endl;
 using std::min;
@@ -53,6 +55,17 @@ using std::max;
 using std::string;
 
 
+namespace {
+
+// All the below connection objects are needed because of a bug in some
+// versions of GCC (<=2.96 are on the suspects list.) By having and assigning
+// to these connections we avoid a segfault upon startup, and also at exit.
+// (Lgb)
+
+boost::signals::connection timecon;
+
+} // anon namespace
+
 namespace lyx {
 namespace frontend {
 
@@ -119,7 +132,8 @@ SplashScreen::SplashScreen()
 }
 
 WorkArea::WorkArea(BufferView * buffer_view)
-       :  buffer_view_(buffer_view), greyed_out_(true)
+       : buffer_view_(buffer_view), greyed_out_(true),
+         cursor_visible_(false), cursor_timeout_(400)
 {
        // Start loading the pixmap as soon as possible
        if (lyxrc.show_banner) {
@@ -127,6 +141,12 @@ WorkArea::WorkArea(BufferView * buffer_view)
                splash.connect(boost::bind(&WorkArea::checkAndGreyOut, this));
                splash.startLoading();
        }
+
+       // Setup the signals
+       timecon = cursor_timeout_.timeout
+               .connect(boost::bind(&WorkArea::toggleCursor, this));
+
+       cursor_timeout_.start();
 }
 
 
@@ -193,7 +213,19 @@ void WorkArea::redraw()
 
 void WorkArea::processKeySym(LyXKeySymPtr key, key_modifier::state state)
 {
+       hideCursor();
+
        buffer_view_->workAreaKeyPress(key, state);
+       /* This is perhaps a bit of a hack. When we move
+        * around, or type, it's nice to be able to see
+        * the cursor immediately after the keypress. So
+        * we reset the toggle timeout and force the visibility
+        * of the cursor. Note we cannot do this inside
+        * dispatch() itself, because that's called recursively.
+        */
+       //     if (buffer_view_->available())
+       toggleCursor();
+
 }
 
 
@@ -228,5 +260,80 @@ void WorkArea::greyOut()
        getPainter().end();
 }
 
+
+void WorkArea::showCursor()
+{
+       if (cursor_visible_)
+               return;
+
+       if (!buffer_view_->available())
+               return;
+
+       CursorShape shape = BAR_SHAPE;
+
+       LyXText const & text = *buffer_view_->getLyXText();
+       LyXFont const & realfont = text.real_current_font;
+       BufferParams const & bp = buffer_view_->buffer()->params();
+       bool const samelang = realfont.language() == bp.language;
+       bool const isrtl = realfont.isVisibleRightToLeft();
+
+       if (!samelang || isrtl != bp.language->rightToLeft()) {
+               shape = L_SHAPE;
+               if (isrtl)
+                       shape = REVERSED_L_SHAPE;
+       }
+
+       // The ERT language hack needs fixing up
+       if (realfont.language() == latex_language)
+               shape = BAR_SHAPE;
+
+       LyXFont const font = buffer_view_->cursor().getFont();
+       int const asc = font_metrics::maxAscent(font);
+       int const des = font_metrics::maxDescent(font);
+       int h = asc + des;
+       int x = 0;
+       int y = 0;
+       buffer_view_->cursor().getPos(x, y);
+       y -= asc;
+
+       // if it doesn't touch the screen, don't try to show it
+       if (y + h < 0 || y >= height())
+               return;
+
+       cursor_visible_ = true;
+       showCursor(x, y, h, shape);
+}
+
+
+void WorkArea::hideCursor()
+{
+       if (!cursor_visible_)
+               return;
+
+       cursor_visible_ = false;
+       removeCursor();
+}
+
+
+void WorkArea::toggleCursor()
+{
+       if (buffer_view_->buffer()) {
+
+               if (cursor_visible_)
+                       hideCursor();
+               else
+                       showCursor();
+
+               // Use this opportunity to deal with any child processes that
+               // have finished but are waiting to communicate this fact
+               // to the rest of LyX.
+               ForkedcallsController & fcc = ForkedcallsController::get();
+               fcc.handleCompletedProcesses();
+       }
+
+       cursor_timeout_.restart();
+}
+
+
 } // namespace frontend
 } // namespace lyx
index 9ae7c497a8177cb8806fe579029f1f60cd0c6120..c8a846c9f537dc9924e6225708d3c61aab3e94ca 100644 (file)
@@ -18,6 +18,7 @@
 
 #include "frontends/key_state.h"
 #include "frontends/LyXKeySym.h"
+#include "frontends/Timeout.h"
 
 class BufferView;
 
@@ -78,6 +79,13 @@ public:
        /// hide the cursor
        virtual void removeCursor() = 0;
 
+       /// Show the cursor
+       void showCursor();
+       /// Hide the cursor
+       void hideCursor();
+       /// toggle the cursor's visibility
+       void toggleCursor();
+
 protected:
        /// cause the display of the given area of the work area
        virtual void expose(int x, int y, int w, int h) = 0;
@@ -91,6 +99,12 @@ private:
 
        ///
        bool greyed_out_;
+
+       ///
+       bool cursor_visible_;
+
+       ///
+       Timeout cursor_timeout_;
 };
 
 } // namespace frontend
index 132b8ec52da4ab95383e2365d0131b4b100215c9..e229185689564487e9e2e74e1532314d63ef19d6 100644 (file)
@@ -738,10 +738,6 @@ void LyXFunc::dispatch(FuncRequest const & cmd)
                       << endl;
                setErrorMessage(flag.message());
        } else {
-
-               if (view()->available())
-                       view()->hideCursor();
-
                switch (action) {
 
                case LFUN_WORD_FIND_FORWARD: