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

Reply via email to