Extracted from r14281

* 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
This commit is contained in:
Lars Gullik Bjønnes 2006-07-08 22:06:50 +00:00
parent 1f831d0a99
commit ae348f8af9
5 changed files with 123 additions and 65 deletions

View 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"
@ -64,14 +63,12 @@
#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();

View 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

View File

@ -40,12 +40,14 @@
#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

View 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

View 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: