Skip to content

Commit f00e037

Browse files
committed
add multi-window support to accessibility system
- Adds app-wide accessibility root, that owns all windows within the same process - AccessibilityConfiguration was removed since it is no longer needed
1 parent 0fb9eb6 commit f00e037

33 files changed

+733
-481
lines changed

src/engraving/internal/engravingcontextconfiguration.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -35,9 +35,9 @@ double EngravingContextConfiguration::guiScaling() const
3535

3636
bool EngravingContextConfiguration::isAccessibleEnabled() const
3737
{
38-
if (!accessibilityConfiguration()) {
38+
if (!accessibilityController()) {
3939
return false;
4040
}
4141

42-
return accessibilityConfiguration()->isAccessibleEnabled();
42+
return accessibilityController()->isEnabled();
4343
}

src/engraving/internal/engravingcontextconfiguration.h

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -26,13 +26,13 @@
2626

2727
#include "modularity/ioc.h"
2828
#include "ui/iuicontextconfiguration.h"
29-
#include "accessibility/iaccessibilitycontextconfiguration.h"
29+
#include "accessibility/iaccessibilitycontroller.h"
3030

3131
namespace mu::engraving {
3232
class EngravingContextConfiguration : public IEngravingContextConfiguration, public muse::Contextable
3333
{
3434
muse::ContextInject<muse::ui::IUiContextConfiguration> uiConfiguration = { this };
35-
muse::ContextInject<muse::accessibility::IAccessibilityContextConfiguration> accessibilityConfiguration = { this };
35+
muse::ContextInject<muse::accessibility::IAccessibilityController> accessibilityController = { this };
3636

3737
public:
3838
EngravingContextConfiguration(const muse::modularity::ContextPtr& iocCtx)

src/framework/accessibility/CMakeLists.txt

Lines changed: 5 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -24,16 +24,19 @@ target_sources(muse_accessibility PRIVATE
2424
accessibilitymodule.cpp
2525
accessibilitymodule.h
2626
iaccessible.h
27+
iaccessibleapprootobject.h
2728
iaccessibilitycontroller.h
28-
iaccessibilityconfiguration.h
29-
iaccessibilitycontextconfiguration.h
3029
iqaccessibleinterfaceregister.h
3130

3231
api/accessibilityapi.cpp
3332
api/accessibilityapi.h
3433

3534
internal/accessibilitycontroller.cpp
3635
internal/accessibilitycontroller.h
36+
internal/accessibleapprootobject.cpp
37+
internal/accessibleapprootobject.h
38+
internal/accessibleapprootinterface.cpp
39+
internal/accessibleapprootinterface.h
3740
internal/accessibleobject.cpp
3841
internal/accessibleobject.h
3942
internal/accessiblestub.cpp
@@ -42,10 +45,6 @@ target_sources(muse_accessibility PRIVATE
4245
internal/accessibleiteminterface.h
4346
internal/accessiblewindowinterface.cpp
4447
internal/accessiblewindowinterface.h
45-
internal/accessibilityconfiguration.cpp
46-
internal/accessibilityconfiguration.h
47-
internal/accessibilitycontextconfiguration.cpp
48-
internal/accessibilitycontextconfiguration.h
4948
internal/qaccessibleinterfaceregister.cpp
5049
internal/qaccessibleinterfaceregister.h
5150
)

src/framework/accessibility/accessibilitymodule.cpp

Lines changed: 4 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -23,9 +23,9 @@
2323

2424
#include "modularity/ioc.h"
2525

26+
#include "iaccessibleapprootobject.h"
2627
#include "internal/accessibilitycontroller.h"
27-
#include "internal/accessibilityconfiguration.h"
28-
#include "internal/accessibilitycontextconfiguration.h"
28+
#include "internal/accessibleapprootobject.h"
2929
#include "internal/qaccessibleinterfaceregister.h"
3030

3131
#include "global/api/iapiregister.h"
@@ -43,10 +43,8 @@ std::string AccessibilityModule::moduleName() const
4343

4444
void AccessibilityModule::registerExports()
4545
{
46-
m_configuration = std::make_shared<AccessibilityConfiguration>();
47-
48-
globalIoc()->registerExport<IAccessibilityConfiguration>(mname, m_configuration);
4946
globalIoc()->registerExport<IQAccessibleInterfaceRegister>(mname, new QAccessibleInterfaceRegister());
47+
globalIoc()->registerExport<IAccessibleAppRootObject>(mname, new AccessibleAppRootObject());
5048
}
5149

5250
void AccessibilityModule::resolveImports()
@@ -57,6 +55,7 @@ void AccessibilityModule::resolveImports()
5755
accr->registerInterfaceGetter("QQuickWindow", AccessibilityController::accessibleInterface);
5856
#endif
5957
accr->registerInterfaceGetter("muse::accessibility::AccessibleObject", AccessibleObject::accessibleInterface);
58+
accr->registerInterfaceGetter("muse::accessibility::AccessibleAppRootObject", AccessibleAppRootObject::accessibleInterface);
6059
}
6160
}
6261

@@ -72,7 +71,6 @@ void AccessibilityModule::registerApi()
7271

7372
void AccessibilityModule::onInit(const IApplication::RunMode&)
7473
{
75-
m_configuration->init();
7674
}
7775

7876
IContextSetup* AccessibilityModule::newContext(const muse::modularity::ContextPtr& ctx) const
@@ -87,8 +85,6 @@ void AccessibilityContext::registerExports()
8785
// It probably needs to be split into two separate classes.
8886
m_controller = std::make_shared<AccessibilityController>(iocContext());
8987
ioc()->registerExport<IAccessibilityController>(mname, m_controller);
90-
91-
ioc()->registerExport<IAccessibilityContextConfiguration>(mname, new AccessibilityContextConfiguration(iocContext()));
9288
}
9389

9490
void AccessibilityContext::onPreInit(const IApplication::RunMode&)

src/framework/accessibility/accessibilitymodule.h

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,6 @@
2828
#include "modularity/imodulesetup.h"
2929

3030
namespace muse::accessibility {
31-
class AccessibilityConfiguration;
3231
class AccessibilityController;
3332
class AccessibilityModule : public modularity::IModuleSetup
3433
{
@@ -42,9 +41,6 @@ class AccessibilityModule : public modularity::IModuleSetup
4241
void onInit(const IApplication::RunMode& mode) override;
4342

4443
modularity::IContextSetup* newContext(const muse::modularity::ContextPtr& ctx) const override;
45-
46-
private:
47-
std::shared_ptr<AccessibilityConfiguration> m_configuration;
4844
};
4945

5046
class AccessibilityContext : public modularity::IContextSetup

src/framework/accessibility/iaccessibilityconfiguration.h

Lines changed: 0 additions & 35 deletions
This file was deleted.

src/framework/accessibility/iaccessibilitycontextconfiguration.h

Lines changed: 0 additions & 37 deletions
This file was deleted.

src/framework/accessibility/iaccessibilitycontroller.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -47,6 +47,8 @@ class IAccessibilityController : MODULE_CONTEXT_INTERFACE
4747
virtual bool needToVoicePanelInfo() const = 0;
4848
virtual QString currentPanelAccessibleName() const = 0;
4949

50+
virtual bool isEnabled() const = 0;
51+
5052
virtual void setIgnoreQtAccessibilityEvents(bool ignore) = 0;
5153
};
5254
}
Lines changed: 50 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,50 @@
1+
/*
2+
* SPDX-License-Identifier: GPL-3.0-only
3+
* MuseScore-Studio-CLA-applies
4+
*
5+
* MuseScore Studio
6+
* Music Composition & Notation
7+
*
8+
* Copyright (C) 2026 MuseScore Limited
9+
*
10+
* This program is free software: you can redistribute it and/or modify
11+
* it under the terms of the GNU General Public License version 3 as
12+
* published by the Free Software Foundation.
13+
*
14+
* This program is distributed in the hope that it will be useful,
15+
* but WITHOUT ANY WARRANTY; without even the implied warranty of
16+
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
17+
* GNU General Public License for more details.
18+
*
19+
* You should have received a copy of the GNU General Public License
20+
* along with this program. If not, see <https://www.gnu.org/licenses/>.
21+
*/
22+
#pragma once
23+
24+
#include "modularity/imoduleinterface.h"
25+
26+
class QObject;
27+
class QWindow;
28+
29+
namespace muse::accessibility {
30+
class AccessibleObject;
31+
32+
class IAccessibleAppRootObject : MODULE_GLOBAL_INTERFACE
33+
{
34+
INTERFACE_ID(IAccessibleAppRootObject)
35+
public:
36+
virtual ~IAccessibleAppRootObject() = default;
37+
38+
virtual QObject* asQObject() = 0;
39+
40+
virtual void registerWindow(QWindow* window, AccessibleObject* windowRoot) = 0;
41+
virtual void unregisterWindow(QWindow* window) = 0;
42+
43+
virtual int windowCount() const = 0;
44+
virtual QWindow* windowAt(int index) const = 0;
45+
virtual AccessibleObject* windowRoot(int index) const = 0;
46+
virtual AccessibleObject* windowRoot(QWindow* window) const = 0;
47+
48+
virtual bool isAccessibilityActive() const = 0;
49+
};
50+
}

src/framework/accessibility/internal/accessibilityconfiguration.cpp

Lines changed: 0 additions & 74 deletions
This file was deleted.

0 commit comments

Comments
 (0)