summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/defaults.cpp1
-rw-r--r--src/gui/chatwindow.cpp29
-rw-r--r--src/gui/setup_chat.cpp3
3 files changed, 29 insertions, 4 deletions
diff --git a/src/defaults.cpp b/src/defaults.cpp
index dead34aaf..0e2f89579 100644
--- a/src/defaults.cpp
+++ b/src/defaults.cpp
@@ -279,6 +279,7 @@ DefaultsData* getConfigDefaults()
AddDEF("ministatussaved", 0);
AddDEF("allowscreensaver", false);
AddDEF("debugOpenGL", 0);
+ AddDEF("protectChatFocus", true);
return configData;
}
diff --git a/src/gui/chatwindow.cpp b/src/gui/chatwindow.cpp
index 7919fff24..11f399537 100644
--- a/src/gui/chatwindow.cpp
+++ b/src/gui/chatwindow.cpp
@@ -79,7 +79,8 @@ class ChatInput final : public TextField, public gcn::FocusListener
TextField(window, "", false),
gcn::FocusListener(),
mWindow(window),
- mChatTabs(tabs)
+ mChatTabs(tabs),
+ mFocusGaining(false)
{
setVisible(false);
addFocusListener(this);
@@ -93,9 +94,17 @@ class ChatInput final : public TextField, public gcn::FocusListener
*/
void focusLost(const gcn::Event &event A_UNUSED)
{
- processVisible(false);
- if (chatWindow)
- chatWindow->updateVisibility();
+ if (mFocusGaining || !config.getBoolValue("protectChatFocus"))
+ {
+ processVisible(false);
+ if (chatWindow)
+ chatWindow->updateVisibility();
+ mFocusGaining = false;
+ return;
+ }
+ mFocusGaining = true;
+ requestFocus();
+ mFocusGaining = false;
}
void processVisible(const bool n)
@@ -103,14 +112,25 @@ class ChatInput final : public TextField, public gcn::FocusListener
if (!mWindow || isVisible() == n)
return;
+ if (!n)
+ mFocusGaining = true;
setVisible(n);
if (config.getBoolValue("hideChatInput"))
mWindow->adjustTabSize();
}
+ void unprotectFocus()
+ { mFocusGaining = true; }
+
+ void setVisible(bool visible)
+ {
+ TextField::setVisible(visible);
+ }
+
private:
ChatWindow *mWindow;
TabbedArea *mChatTabs;
+ bool mFocusGaining;
};
const char *COLOR_NAME[14] =
@@ -503,6 +523,7 @@ void ChatWindow::action(const gcn::ActionEvent &event)
if (message.empty() || !mReturnToggles)
{
// Remove focus and hide input
+ mChatInput->unprotectFocus();
if (mFocusHandler)
mFocusHandler->focusNone();
diff --git a/src/gui/setup_chat.cpp b/src/gui/setup_chat.cpp
index b03211872..7b4cdeb2a 100644
--- a/src/gui/setup_chat.cpp
+++ b/src/gui/setup_chat.cpp
@@ -56,6 +56,9 @@ Setup_Chat::Setup_Chat(const Widget2 *const widget) :
new SetupItemCheckBox(_("Auto hide chat window."), "",
"autohideChat", this, "autohideChatEvent");
+ new SetupItemCheckBox(_("Protect chat focus."), "",
+ "protectChatFocus", this, "protectChatFocusEvent");
+
new SetupItemLabel(_("Colors"), "", this);