Keep the window alive on close; add a system toggle to VisibilityController
- Main.qml: ignore close requests (Alt+F4, task manager), so the window can't be hidden without VisibilityController knowing. - main.cpp: don't quit when the last window closes; KWin only restarts the input method after a crash. - VisibilityController::setEnabled(): when false, the keyboard is hidden regardless of other state; changing it clears show()/hide() overrides. Not wired to KWin's tray toggle yet. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
@@ -36,6 +36,9 @@ Window {
|
|||||||
visible: false
|
visible: false
|
||||||
color: "transparent"
|
color: "transparent"
|
||||||
|
|
||||||
|
// Alt+F4 or the task manager would hide it behind the visibility
|
||||||
|
// controller's back; the dismiss key and the tray toggle hide it instead.
|
||||||
|
onClosing: close => close.accepted = false
|
||||||
onInputRegionChanged: placement?.setInputRegion(inputRegion)
|
onInputRegionChanged: placement?.setInputRegion(inputRegion)
|
||||||
onBlurRegionChanged: placement?.setBlurRegion(blurRegion, Theme.windowRadius)
|
onBlurRegionChanged: placement?.setBlurRegion(blurRegion, Theme.windowRadius)
|
||||||
// For CollapseController.
|
// For CollapseController.
|
||||||
|
|||||||
@@ -157,6 +157,8 @@ int main(int argc, char *argv[])
|
|||||||
// libwayland unsets it once connected.
|
// libwayland unsets it once connected.
|
||||||
const bool launchedByKWin = qEnvironmentVariableIsSet("WAYLAND_SOCKET");
|
const bool launchedByKWin = qEnvironmentVariableIsSet("WAYLAND_SOCKET");
|
||||||
QGuiApplication app(argc, argv);
|
QGuiApplication app(argc, argv);
|
||||||
|
// KWin relaunches it only after a crash: a closed window mustn't quit it.
|
||||||
|
QGuiApplication::setQuitOnLastWindowClosed(false);
|
||||||
quitOnSignal();
|
quitOnSignal();
|
||||||
QGuiApplication::setApplicationName(QStringLiteral("sloposk"));
|
QGuiApplication::setApplicationName(QStringLiteral("sloposk"));
|
||||||
QGuiApplication::setOrganizationName(QStringLiteral("sloposk")); // ~/.config/sloposk/sloposk.conf
|
QGuiApplication::setOrganizationName(QStringLiteral("sloposk")); // ~/.config/sloposk/sloposk.conf
|
||||||
|
|||||||
@@ -26,6 +26,13 @@ void VisibilityController::setAlwaysVisible(bool always)
|
|||||||
update();
|
update();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void VisibilityController::setEnabled(bool enabled)
|
||||||
|
{
|
||||||
|
m_enabled = enabled;
|
||||||
|
m_override.reset();
|
||||||
|
update();
|
||||||
|
}
|
||||||
|
|
||||||
void VisibilityController::show()
|
void VisibilityController::show()
|
||||||
{
|
{
|
||||||
m_override = true;
|
m_override = true;
|
||||||
@@ -46,7 +53,8 @@ void VisibilityController::toggle()
|
|||||||
|
|
||||||
void VisibilityController::update()
|
void VisibilityController::update()
|
||||||
{
|
{
|
||||||
const bool visible = m_override.value_or(m_alwaysVisible || m_standalone || (m_fieldActive && m_showOnField));
|
const bool visible =
|
||||||
|
m_enabled && m_override.value_or(m_alwaysVisible || m_standalone || (m_fieldActive && m_showOnField));
|
||||||
if (visible == m_visible)
|
if (visible == m_visible)
|
||||||
return;
|
return;
|
||||||
m_visible = visible;
|
m_visible = visible;
|
||||||
|
|||||||
@@ -9,6 +9,7 @@
|
|||||||
// standalone (no input-method connection)
|
// standalone (no input-method connection)
|
||||||
// - show()/hide()/toggle() override that until the focus changes, also
|
// - show()/hide()/toggle() override that until the focus changes, also
|
||||||
// from one field straight to another
|
// from one field straight to another
|
||||||
|
// - never while the system's virtual keyboard toggle is off
|
||||||
class VisibilityController : public QObject
|
class VisibilityController : public QObject
|
||||||
{
|
{
|
||||||
Q_OBJECT
|
Q_OBJECT
|
||||||
@@ -24,6 +25,8 @@ public:
|
|||||||
void setShowOnField(bool show);
|
void setShowOnField(bool show);
|
||||||
void setStandalone(bool standalone);
|
void setStandalone(bool standalone);
|
||||||
void setAlwaysVisible(bool always);
|
void setAlwaysVisible(bool always);
|
||||||
|
// The system toggle (KWin's tray icon); off hides it whatever else says.
|
||||||
|
void setEnabled(bool enabled);
|
||||||
|
|
||||||
void show();
|
void show();
|
||||||
void hide();
|
void hide();
|
||||||
@@ -39,6 +42,7 @@ private:
|
|||||||
bool m_showOnField = true;
|
bool m_showOnField = true;
|
||||||
bool m_standalone = false;
|
bool m_standalone = false;
|
||||||
bool m_alwaysVisible = false;
|
bool m_alwaysVisible = false;
|
||||||
|
bool m_enabled = true;
|
||||||
std::optional<bool> m_override;
|
std::optional<bool> m_override;
|
||||||
bool m_visible = false;
|
bool m_visible = false;
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -70,6 +70,19 @@ private Q_SLOTS:
|
|||||||
QVERIFY(!v.isVisible());
|
QVERIFY(!v.isVisible());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void systemToggleGatesEverything()
|
||||||
|
{
|
||||||
|
VisibilityController v;
|
||||||
|
v.setAlwaysVisible(true);
|
||||||
|
v.setEnabled(false);
|
||||||
|
QVERIFY(!v.isVisible());
|
||||||
|
v.show();
|
||||||
|
QVERIFY(!v.isVisible());
|
||||||
|
v.hide();
|
||||||
|
v.setEnabled(true); // turning it back on forgets the dismiss
|
||||||
|
QVERIFY(v.isVisible());
|
||||||
|
}
|
||||||
|
|
||||||
void standaloneAlwaysVisible()
|
void standaloneAlwaysVisible()
|
||||||
{
|
{
|
||||||
VisibilityController v;
|
VisibilityController v;
|
||||||
|
|||||||
Reference in New Issue
Block a user