Skip to content
This repository was archived by the owner on Feb 25, 2025. It is now read-only.

Commit bd85c20

Browse files
committed
Add initial accessibility support to the Linux shell
1 parent 4a5cf14 commit bd85c20

File tree

12 files changed

+868
-0
lines changed

12 files changed

+868
-0
lines changed

ci/licenses_golden/licenses_flutter

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1299,6 +1299,10 @@ FILE: ../../../flutter/shell/platform/glfw/text_input_plugin.h
12991299
FILE: ../../../flutter/shell/platform/linux/egl_utils.cc
13001300
FILE: ../../../flutter/shell/platform/linux/egl_utils.h
13011301
FILE: ../../../flutter/shell/platform/linux/egl_utils_test.cc
1302+
FILE: ../../../flutter/shell/platform/linux/fl_accessibility_plugin.cc
1303+
FILE: ../../../flutter/shell/platform/linux/fl_accessibility_plugin.h
1304+
FILE: ../../../flutter/shell/platform/linux/fl_accessibile.cc
1305+
FILE: ../../../flutter/shell/platform/linux/fl_accessibile.h
13021306
FILE: ../../../flutter/shell/platform/linux/fl_basic_message_channel.cc
13031307
FILE: ../../../flutter/shell/platform/linux/fl_basic_message_channel_test.cc
13041308
FILE: ../../../flutter/shell/platform/linux/fl_binary_codec.cc
@@ -1359,6 +1363,8 @@ FILE: ../../../flutter/shell/platform/linux/fl_text_input_plugin.h
13591363
FILE: ../../../flutter/shell/platform/linux/fl_value.cc
13601364
FILE: ../../../flutter/shell/platform/linux/fl_value_test.cc
13611365
FILE: ../../../flutter/shell/platform/linux/fl_view.cc
1366+
FILE: ../../../flutter/shell/platform/linux/fl_view_accessible.cc
1367+
FILE: ../../../flutter/shell/platform/linux/fl_view_accessible.h
13621368
FILE: ../../../flutter/shell/platform/linux/public/flutter_linux/fl_basic_message_channel.h
13631369
FILE: ../../../flutter/shell/platform/linux/public/flutter_linux/fl_binary_codec.h
13641370
FILE: ../../../flutter/shell/platform/linux/public/flutter_linux/fl_binary_messenger.h

shell/platform/linux/BUILD.gn

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -88,6 +88,8 @@ source_set("flutter_linux_sources") {
8888

8989
sources = [
9090
"egl_utils.cc",
91+
"fl_accessibility_plugin.cc",
92+
"fl_accessible.cc",
9193
"fl_basic_message_channel.cc",
9294
"fl_binary_codec.cc",
9395
"fl_binary_messenger.cc",
@@ -116,6 +118,7 @@ source_set("flutter_linux_sources") {
116118
"fl_text_input_plugin.cc",
117119
"fl_value.cc",
118120
"fl_view.cc",
121+
"fl_view_accessible.cc",
119122
]
120123

121124
# Set flag to stop headers being directly included (library users should not do this)
Lines changed: 58 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,58 @@
1+
// Copyright 2013 The Flutter Authors. All rights reserved.
2+
// Use of this source code is governed by a BSD-style license that can be
3+
// found in the LICENSE file.
4+
5+
#include "flutter/shell/platform/linux/fl_accessibility_plugin.h"
6+
#include "flutter/shell/platform/linux/fl_accessible.h"
7+
#include "flutter/shell/platform/linux/fl_view_accessible.h"
8+
9+
struct _FlAccessibilityPlugin {
10+
GObject parent_instance;
11+
12+
FlView* view;
13+
};
14+
15+
G_DEFINE_TYPE(FlAccessibilityPlugin, fl_accessibility_plugin, G_TYPE_OBJECT)
16+
17+
static void view_weak_notify_cb(gpointer user_data, GObject* object) {
18+
FlAccessibilityPlugin* self = FL_ACCESSIBILITY_PLUGIN(object);
19+
self->view = nullptr;
20+
}
21+
22+
static void fl_accessibility_plugin_dispose(GObject* object) {
23+
FlAccessibilityPlugin* self = FL_ACCESSIBILITY_PLUGIN(object);
24+
25+
if (self->view != nullptr) {
26+
g_object_weak_unref(G_OBJECT(self->view), view_weak_notify_cb, self);
27+
self->view = nullptr;
28+
}
29+
30+
G_OBJECT_CLASS(fl_accessibility_plugin_parent_class)->dispose(object);
31+
}
32+
33+
static void fl_accessibility_plugin_class_init(
34+
FlAccessibilityPluginClass* klass) {
35+
G_OBJECT_CLASS(klass)->dispose = fl_accessibility_plugin_dispose;
36+
}
37+
38+
static void fl_accessibility_plugin_init(FlAccessibilityPlugin* self) {}
39+
40+
FlAccessibilityPlugin* fl_accessibility_plugin_new(FlView* view) {
41+
FlAccessibilityPlugin* self = FL_ACCESSIBILITY_PLUGIN(
42+
g_object_new(fl_accessibility_plugin_get_type(), nullptr));
43+
44+
self->view = view;
45+
g_object_weak_ref(G_OBJECT(view), view_weak_notify_cb, self);
46+
47+
return self;
48+
}
49+
50+
void fl_accessibility_plugin_handle_update_semantics_node(
51+
FlAccessibilityPlugin* self,
52+
const FlutterSemanticsNode* node) {
53+
if (self->view != nullptr) {
54+
AtkObject* accessible = gtk_widget_get_accessible(GTK_WIDGET(self->view));
55+
fl_view_accessible_handle_update_semantics_node(
56+
FL_VIEW_ACCESSIBLE(accessible), node);
57+
}
58+
}
Lines changed: 50 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,50 @@
1+
// Copyright 2013 The Flutter Authors. All rights reserved.
2+
// Use of this source code is governed by a BSD-style license that can be
3+
// found in the LICENSE file.
4+
5+
#ifndef FLUTTER_SHELL_PLATFORM_LINUX_FL_ACCESSIBILITY_PLUGIN_H_
6+
#define FLUTTER_SHELL_PLATFORM_LINUX_FL_ACCESSIBILITY_PLUGIN_H_
7+
8+
#include "flutter/shell/platform/linux/public/flutter_linux/fl_view.h"
9+
10+
#include "flutter/shell/platform/embedder/embedder.h"
11+
12+
G_BEGIN_DECLS
13+
14+
G_DECLARE_FINAL_TYPE(FlAccessibilityPlugin,
15+
fl_accessibility_plugin,
16+
FL,
17+
ACCESSIBILITY_PLUGIN,
18+
GObject);
19+
20+
/**
21+
* FlAccessibilityPlugin:
22+
*
23+
* #FlAccessibilityPlugin is a plugin that handles semantic node updates and
24+
* converts them to ATK events.
25+
*/
26+
27+
/**
28+
* fl_accessibility_plugin_new:
29+
* @view: an #FlView to export accessibility information to.
30+
*
31+
* Creates a new plugin handles semantic node updates.
32+
*
33+
* Returns: a new #FlAccessibilityPlugin.
34+
*/
35+
FlAccessibilityPlugin* fl_accessibility_plugin_new(FlView* view);
36+
37+
/**
38+
* fl_accessibility_plugin_handle_update_semantics_node:
39+
* @plugin: an #FlAccessibilityPlugin.
40+
* @node: semantic node information.
41+
*
42+
* Handle a semantics node update.
43+
*/
44+
void fl_accessibility_plugin_handle_update_semantics_node(
45+
FlAccessibilityPlugin* plugin,
46+
const FlutterSemanticsNode* node);
47+
48+
G_END_DECLS
49+
50+
#endif // FLUTTER_SHELL_PLATFORM_LINUX_FL_ACCESSIBILITY_PLUGIN_H_

0 commit comments

Comments
 (0)