Le 19/06/2015 16:31, Kornel Benko a écrit :
From memory:
1.) start lyx, the minibuffer is already displayed.
2.) open any file
3.) M-x, the cursor is displayed in the minibuffer
4.) M-x, in the minibuffer appears 'x'
5.) click on a view, cursor is displayed in both, minibuffer and buffer
6.) enter 'abcd', it goes to minibuffer and not to buffer
Try this one. It fixes this problem and:
- do not close the minibuffer if the action gave an error; currently it
relies on DispatchResult::error()
- simplifies the code: get rid of the spacial "off" parameter to
command-execute.
- get rid of the hard-coded M-x to close the minibuffer.
I understand that the behavior of the patch is still not optimal.
Comments are welcome.
JMarc
>From ab30fc380428defa66e16d594aac3f0ff88bc089 Mon Sep 17 00:00:00 2001
From: Jean-Marc Lasgouttes <lasgout...@lyx.org>
Date: Sat, 18 Apr 2015 19:10:33 +0200
Subject: [PATCH] Auto feature for minibuffer toolbar
Now the minibuffer toolbar is "auto" by default. It is opened by
command-execute (M-x) and closed when the command is executed without error.
* make lyx::dispatch return a DispatchResult struct
* there is a new MINIBUFFER type of toolbar, that can be used for this use.
* remove special handling of M-x in minnibuffer; Escape can be used instead. Fix focus in this case.
* when minibuffer toolbar is "auto", make the toolbar close itself after
- a command has been executed without error
- an empty command has been executed
- the Escape key has been used
---
lib/ui/default.ui | 2 +-
src/LyX.cpp | 4 +--
src/LyX.h | 4 +--
src/frontends/Application.h | 2 +-
src/frontends/qt4/GuiApplication.cpp | 8 +++++-
src/frontends/qt4/GuiApplication.h | 2 +-
src/frontends/qt4/GuiCommandBuffer.cpp | 47 +++++++++++++-------------------
src/frontends/qt4/GuiCommandBuffer.h | 10 +++----
src/frontends/qt4/GuiCommandEdit.cpp | 8 ------
src/frontends/qt4/GuiCommandEdit.h | 2 --
src/frontends/qt4/GuiToolbar.cpp | 6 +++-
src/frontends/qt4/GuiView.cpp | 21 ++++++++------
src/frontends/qt4/GuiView.h | 5 ++++
src/frontends/qt4/Toolbars.cpp | 2 ++
src/frontends/qt4/Toolbars.h | 3 +-
15 files changed, 63 insertions(+), 63 deletions(-)
diff --git a/lib/ui/default.ui b/lib/ui/default.ui
index fa20f1d..34f5651 100644
--- a/lib/ui/default.ui
+++ b/lib/ui/default.ui
@@ -56,5 +56,5 @@ Toolbars
"math" "auto,math,bottom"
"mathmacrotemplate" "auto,mathmacrotemplate,bottom"
"ipa" "auto,ipa,bottom"
- "minibuffer" "off,bottom"
+ "minibuffer" "auto,minibuffer,bottom"
End
diff --git a/src/LyX.cpp b/src/LyX.cpp
index d70c6b0..8b713aa 100644
--- a/src/LyX.cpp
+++ b/src/LyX.cpp
@@ -1352,7 +1352,7 @@ FuncStatus getStatus(FuncRequest const & action)
}
-void dispatch(FuncRequest const & action)
+DispatchResult const & dispatch(FuncRequest const & action)
{
LAPPERR(theApp());
return theApp()->dispatch(action);
@@ -1362,7 +1362,7 @@ void dispatch(FuncRequest const & action)
void dispatch(FuncRequest const & action, DispatchResult & dr)
{
LAPPERR(theApp());
- return theApp()->dispatch(action, dr);
+ theApp()->dispatch(action, dr);
}
diff --git a/src/LyX.h b/src/LyX.h
index ccce7a3..9980ab5 100644
--- a/src/LyX.h
+++ b/src/LyX.h
@@ -135,7 +135,7 @@ private:
bool first_start;
friend FuncStatus getStatus(FuncRequest const & action);
- friend void dispatch(FuncRequest const & action);
+ friend DispatchResult const & dispatch(FuncRequest const & action);
friend void dispatch(FuncRequest const & action, DispatchResult & dr);
friend std::vector<std::string> & theFilesToLoad();
friend BufferList & theBufferList();
@@ -175,7 +175,7 @@ void execBatchCommands();
FuncStatus getStatus(FuncRequest const & action);
///
-void dispatch(FuncRequest const & action);
+DispatchResult const & dispatch(FuncRequest const & action);
///
void dispatch(FuncRequest const & action, DispatchResult & dr);
diff --git a/src/frontends/Application.h b/src/frontends/Application.h
index ca5ea44..df0be95 100644
--- a/src/frontends/Application.h
+++ b/src/frontends/Application.h
@@ -177,7 +177,7 @@ public:
/// Every user command is processed here, either invocated from
/// keyboard or from the GUI. All GUI objects, including buttons and
/// menus should use this class and never call kernel functions directly.
- virtual void dispatch(FuncRequest const &) = 0;
+ virtual DispatchResult const & dispatch(FuncRequest const &) = 0;
/// LyX dispatcher: executes lyx actions and returns result.
virtual void dispatch(FuncRequest const &, DispatchResult & dr) = 0;
diff --git a/src/frontends/qt4/GuiApplication.cpp b/src/frontends/qt4/GuiApplication.cpp
index 8bd22c8..fa66871 100644
--- a/src/frontends/qt4/GuiApplication.cpp
+++ b/src/frontends/qt4/GuiApplication.cpp
@@ -965,6 +965,9 @@ struct GuiApplication::Private
///
KeyModifier meta_fake_bit;
+ /// The result of last dispatch action
+ DispatchResult dispatch_result_;
+
/// Multiple views container.
/**
* Warning: This must not be a smart pointer as the destruction of the
@@ -1372,7 +1375,7 @@ static docstring makeDispatchMessage(docstring const & msg,
}
-void GuiApplication::dispatch(FuncRequest const & cmd)
+DispatchResult const & GuiApplication::dispatch(FuncRequest const & cmd)
{
Buffer * buffer = 0;
if (current_view_ && current_view_->currentBufferView()) {
@@ -1392,6 +1395,9 @@ void GuiApplication::dispatch(FuncRequest const & cmd)
// the buffer may have been closed by one action
if (theBufferList().isLoaded(buffer))
buffer->undo().endUndoGroup();
+
+ d->dispatch_result_ = dr;
+ return d->dispatch_result_;
}
diff --git a/src/frontends/qt4/GuiApplication.h b/src/frontends/qt4/GuiApplication.h
index bfc242c..344a862 100644
--- a/src/frontends/qt4/GuiApplication.h
+++ b/src/frontends/qt4/GuiApplication.h
@@ -62,7 +62,7 @@ public:
/// \name Methods inherited from Application class
//@{
- void dispatch(FuncRequest const &);
+ DispatchResult const & dispatch(FuncRequest const &);
void dispatch(FuncRequest const &, DispatchResult & dr);
FuncStatus getStatus(FuncRequest const & cmd) const;
void restoreGuiSession();
diff --git a/src/frontends/qt4/GuiCommandBuffer.cpp b/src/frontends/qt4/GuiCommandBuffer.cpp
index c9ddf4a..9880e2b 100644
--- a/src/frontends/qt4/GuiCommandBuffer.cpp
+++ b/src/frontends/qt4/GuiCommandBuffer.cpp
@@ -108,12 +108,11 @@ GuiCommandBuffer::GuiCommandBuffer(GuiView * view)
edit_->setMinimumSize(edit_->sizeHint());
edit_->setFocusPolicy(Qt::ClickFocus);
- connect(edit_, SIGNAL(escapePressed()), this, SLOT(cancel()));
connect(edit_, SIGNAL(returnPressed()), this, SLOT(dispatch()));
connect(edit_, SIGNAL(tabPressed()), this, SLOT(complete()));
connect(edit_, SIGNAL(upPressed()), this, SLOT(up()));
connect(edit_, SIGNAL(downPressed()), this, SLOT(down()));
- connect(edit_, SIGNAL(hidePressed()), this, SLOT(hideParent()));
+ connect(edit_, SIGNAL(escapePressed()), this, SLOT(hideParent()));
layout->addWidget(upPB, 0);
layout->addWidget(downPB, 0);
@@ -138,22 +137,19 @@ GuiCommandBuffer::GuiCommandBuffer(GuiView * view)
}
-void GuiCommandBuffer::cancel()
-{
- view_->setFocus();
- edit_->setText(QString());
-}
-
-
void GuiCommandBuffer::dispatch()
{
- QString const cmd = edit_->text();
- view_->setFocus();
- edit_->setText(QString());
- edit_->clearFocus();
- std::string const cmd_ = fromqstr(cmd);
- theSession().lastCommands().add(cmd_);
- dispatch(cmd_);
+ std::string const cmd = fromqstr(edit_->text());
+ if (!cmd.empty())
+ theSession().lastCommands().add(cmd);
+ DispatchResult const & dr = dispatch(cmd);
+ if (!dr.error()) {
+ view_->setFocus();
+ edit_->setText(QString());
+ edit_->clearFocus();
+ // If the toolbar was "auto", it is not needed anymore
+ view_->resetCommandExecute();
+ }
}
@@ -257,9 +253,9 @@ void GuiCommandBuffer::down()
void GuiCommandBuffer::hideParent()
{
view_->setFocus();
+ view_->resetCommandExecute();
edit_->setText(QString());
edit_->clearFocus();
- hide();
}
@@ -301,13 +297,6 @@ docstring const GuiCommandBuffer::getCurrentState() const
}
-void GuiCommandBuffer::hide() const
-{
- FuncRequest cmd(LFUN_COMMAND_EXECUTE, "off");
- lyx::dispatch(cmd);
-}
-
-
vector<string> const
GuiCommandBuffer::completions(string const & prefix, string & new_prefix)
{
@@ -347,10 +336,12 @@ GuiCommandBuffer::completions(string const & prefix, string & new_prefix)
}
-void GuiCommandBuffer::dispatch(string const & str)
+DispatchResult const & GuiCommandBuffer::dispatch(string const & str)
{
- if (str.empty())
- return;
+ if (str.empty()) {
+ static DispatchResult empty_dr;
+ return empty_dr;
+ }
history_.push_back(trim(str));
history_pos_ = history_.end();
@@ -358,7 +349,7 @@ void GuiCommandBuffer::dispatch(string const & str)
downPB->setEnabled(history_pos_ != history_.end());
FuncRequest func = lyxaction.lookupFunc(str);
func.setOrigin(FuncRequest::COMMANDBUFFER);
- lyx::dispatch(func);
+ return lyx::dispatch(func);
}
} // namespace frontend
diff --git a/src/frontends/qt4/GuiCommandBuffer.h b/src/frontends/qt4/GuiCommandBuffer.h
index 0737087..8225ec7 100644
--- a/src/frontends/qt4/GuiCommandBuffer.h
+++ b/src/frontends/qt4/GuiCommandBuffer.h
@@ -24,6 +24,9 @@
class QListWidgetItem;
namespace lyx {
+
+class DispatchResult;
+
namespace frontend {
class GuiView;
@@ -37,8 +40,6 @@ public:
GuiCommandBuffer(GuiView * view);
public Q_SLOTS:
- /// cancel command compose
- void cancel();
/// dispatch a command
void dispatch();
/// tab-complete
@@ -67,9 +68,6 @@ private:
/// return the font and depth in the active BufferView as a message.
docstring const getCurrentState() const;
- /// hide the command buffer.
- void hide() const;
-
/// open a listbox and show the contents of the list. When reversed
/// is true, the contents of the list is filled bottom-up.
void showList(std::vector<std::string> const & list,
@@ -80,7 +78,7 @@ private:
std::string & new_prefix);
/// dispatch a command
- void dispatch(std::string const & str);
+ DispatchResult const & dispatch(std::string const & str);
/// available command names
std::vector<std::string> commands_;
diff --git a/src/frontends/qt4/GuiCommandEdit.cpp b/src/frontends/qt4/GuiCommandEdit.cpp
index 6dbec41..22dd9c8 100644
--- a/src/frontends/qt4/GuiCommandEdit.cpp
+++ b/src/frontends/qt4/GuiCommandEdit.cpp
@@ -45,14 +45,6 @@ void GuiCommandEdit::keyPressEvent(QKeyEvent * e)
downPressed();
break;
- case Qt::Key_X:
- if (e->modifiers() == Qt::AltModifier
- || e->modifiers() == Qt::MetaModifier) {
- // emit signal
- hidePressed();
- break;
- }
-
default:
QLineEdit::keyPressEvent(e);
break;
diff --git a/src/frontends/qt4/GuiCommandEdit.h b/src/frontends/qt4/GuiCommandEdit.h
index 5968b6f..7683311 100644
--- a/src/frontends/qt4/GuiCommandEdit.h
+++ b/src/frontends/qt4/GuiCommandEdit.h
@@ -35,8 +35,6 @@ Q_SIGNALS:
void downPressed();
/// complete
void tabPressed();
- /// leave and hide command buffer
- void hidePressed();
protected:
///
diff --git a/src/frontends/qt4/GuiToolbar.cpp b/src/frontends/qt4/GuiToolbar.cpp
index 11413a6..77471c9 100644
--- a/src/frontends/qt4/GuiToolbar.cpp
+++ b/src/frontends/qt4/GuiToolbar.cpp
@@ -323,8 +323,12 @@ void GuiToolbar::add(ToolbarItem const & item)
void GuiToolbar::update(int context)
{
- if (visibility_ & Toolbars::AUTO)
+ if (visibility_ & Toolbars::AUTO) {
+ bool const was_visible = isVisible();
setVisible(visibility_ & context & Toolbars::ALLOWAUTO);
+ if (isVisible() && !was_visible && commandBuffer())
+ commandBuffer()->setFocus();
+ }
// update visible toolbars only
if (!isVisible())
diff --git a/src/frontends/qt4/GuiView.cpp b/src/frontends/qt4/GuiView.cpp
index 9a8664d..ed7835f 100644
--- a/src/frontends/qt4/GuiView.cpp
+++ b/src/frontends/qt4/GuiView.cpp
@@ -508,7 +508,8 @@ QSet<Buffer const *> GuiView::GuiViewPrivate::busyBuffers;
GuiView::GuiView(int id)
- : d(*new GuiViewPrivate(this)), id_(id), closing_(false), busy_(0)
+ : d(*new GuiViewPrivate(this)), id_(id), closing_(false), busy_(0),
+ command_execute_(false)
{
// GuiToolbars *must* be initialised before the menu bar.
normalSizedIcons(); // at least on Mac the default is 32 otherwise, which is huge
@@ -1343,6 +1344,13 @@ void GuiView::setBusy(bool busy)
}
+void GuiView::resetCommandExecute()
+{
+ command_execute_ = false;
+ updateToolbars();
+}
+
+
double GuiView::pixelRatio() const
{
#if QT_VERSION >= 0x050000
@@ -1547,6 +1555,8 @@ void GuiView::updateToolbars()
context |= Toolbars::MATHMACROTEMPLATE;
if (lyx::getStatus(FuncRequest(LFUN_IN_IPA)).enabled())
context |= Toolbars::IPA;
+ if (command_execute_)
+ context |= Toolbars::MINIBUFFER;
for (ToolbarMap::iterator it = d.toolbars_.begin(); it != end; ++it)
it->second->update(context);
@@ -3624,14 +3634,7 @@ void GuiView::dispatch(FuncRequest const & cmd, DispatchResult & dr)
break;
case LFUN_COMMAND_EXECUTE: {
- bool const show_it = cmd.argument() != "off";
- // FIXME: this is a hack, "minibuffer" should not be
- // hardcoded.
- if (GuiToolbar * t = toolbar("minibuffer")) {
- t->setVisible(show_it);
- if (show_it && t->commandBuffer())
- t->commandBuffer()->setFocus();
- }
+ command_execute_ = true;
break;
}
case LFUN_DROP_LAYOUTS_CHOICE:
diff --git a/src/frontends/qt4/GuiView.h b/src/frontends/qt4/GuiView.h
index 43b9b98..74aad81 100644
--- a/src/frontends/qt4/GuiView.h
+++ b/src/frontends/qt4/GuiView.h
@@ -84,6 +84,8 @@ public:
/// are we busy ?
bool busy() const;
+ /// Signal that the any "auto" minibuffer can be closed now.
+ void resetCommandExecute();
/// \name Generic accessor functions
//@{
@@ -450,6 +452,9 @@ private:
/// functions that call setBusy;
int busy_;
+ /// Request to open the command toolbar if it is "auto"
+ bool command_execute_;
+
};
} // namespace frontend
diff --git a/src/frontends/qt4/Toolbars.cpp b/src/frontends/qt4/Toolbars.cpp
index c961025..20eee93 100644
--- a/src/frontends/qt4/Toolbars.cpp
+++ b/src/frontends/qt4/Toolbars.cpp
@@ -348,6 +348,8 @@ void Toolbars::readToolbarSettings(Lexer & lex)
flag = MATHMACROTEMPLATE;
else if (!compare_ascii_no_case(*cit, "review"))
flag = REVIEW;
+ else if (!compare_ascii_no_case(*cit, "minibuffer"))
+ flag = MINIBUFFER;
else if (!compare_ascii_no_case(*cit, "top"))
flag = TOP;
else if (!compare_ascii_no_case(*cit, "bottom"))
diff --git a/src/frontends/qt4/Toolbars.h b/src/frontends/qt4/Toolbars.h
index 3e6ac57..02d0ebe 100644
--- a/src/frontends/qt4/Toolbars.h
+++ b/src/frontends/qt4/Toolbars.h
@@ -110,7 +110,8 @@ public:
MATHMACROTEMPLATE = 1024, //< show in math macro template
SAMEROW = 2048, //place to the current row, no new line
IPA = 4096, //< show when in IPA inset
- ALLOWAUTO = MATH | TABLE | REVIEW | MATHMACROTEMPLATE | IPA
+ MINIBUFFER = 8192, //< show when command-execute has been invoked
+ ALLOWAUTO = MATH | TABLE | REVIEW | MATHMACROTEMPLATE | IPA | MINIBUFFER
};
typedef std::vector<ToolbarInfo> Infos;
--
1.7.9.5