mirror of
https://git.lyx.org/repos/lyx.git
synced 2024-12-23 05:25:26 +00:00
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:
parent
1f831d0a99
commit
ae348f8af9
@ -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();
|
||||
|
@ -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
|
||||
|
@ -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
|
||||
|
@ -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
|
||||
|
@ -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:
|
||||
|
Loading…
Reference in New Issue
Block a user