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

Commit 74e9c6f

Browse files
Split keyevent channel into own class (#56911)
Split the channel messaging out of the system channels to make them simpler to understand and refactor. The new channel classes could be automatically generated in a second phase, e.g. using Pigeon to reduce code usage. The new classes don't have tests as they will already be covered by the existing code.
1 parent 49a9622 commit 74e9c6f

File tree

6 files changed

+226
-60
lines changed

6 files changed

+226
-60
lines changed

ci/licenses_golden/licenses_flutter

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -45108,6 +45108,8 @@ ORIGIN: ../../../flutter/shell/platform/linux/fl_key_embedder_responder_private.
4510845108
ORIGIN: ../../../flutter/shell/platform/linux/fl_key_embedder_responder_test.cc + ../../../flutter/LICENSE
4510945109
ORIGIN: ../../../flutter/shell/platform/linux/fl_key_event.cc + ../../../flutter/LICENSE
4511045110
ORIGIN: ../../../flutter/shell/platform/linux/fl_key_event.h + ../../../flutter/LICENSE
45111+
ORIGIN: ../../../flutter/shell/platform/linux/fl_key_event_channel.cc + ../../../flutter/LICENSE
45112+
ORIGIN: ../../../flutter/shell/platform/linux/fl_key_event_channel.h + ../../../flutter/LICENSE
4511145113
ORIGIN: ../../../flutter/shell/platform/linux/fl_keyboard_channel.cc + ../../../flutter/LICENSE
4511245114
ORIGIN: ../../../flutter/shell/platform/linux/fl_keyboard_channel.h + ../../../flutter/LICENSE
4511345115
ORIGIN: ../../../flutter/shell/platform/linux/fl_keyboard_handler.cc + ../../../flutter/LICENSE
@@ -48064,6 +48066,8 @@ FILE: ../../../flutter/shell/platform/linux/fl_key_embedder_responder_private.h
4806448066
FILE: ../../../flutter/shell/platform/linux/fl_key_embedder_responder_test.cc
4806548067
FILE: ../../../flutter/shell/platform/linux/fl_key_event.cc
4806648068
FILE: ../../../flutter/shell/platform/linux/fl_key_event.h
48069+
FILE: ../../../flutter/shell/platform/linux/fl_key_event_channel.cc
48070+
FILE: ../../../flutter/shell/platform/linux/fl_key_event_channel.h
4806748071
FILE: ../../../flutter/shell/platform/linux/fl_keyboard_channel.cc
4806848072
FILE: ../../../flutter/shell/platform/linux/fl_keyboard_channel.h
4806948073
FILE: ../../../flutter/shell/platform/linux/fl_keyboard_handler.cc

shell/platform/linux/BUILD.gn

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -116,6 +116,7 @@ source_set("flutter_linux_sources") {
116116
"fl_key_channel_responder.cc",
117117
"fl_key_embedder_responder.cc",
118118
"fl_key_event.cc",
119+
"fl_key_event_channel.cc",
119120
"fl_keyboard_channel.cc",
120121
"fl_keyboard_handler.cc",
121122
"fl_keyboard_layout.cc",

shell/platform/linux/fl_key_channel_responder.cc

Lines changed: 13 additions & 57 deletions
Original file line numberDiff line numberDiff line change
@@ -7,23 +7,7 @@
77
#include <gtk/gtk.h>
88
#include <cinttypes>
99

10-
#include "flutter/shell/platform/linux/public/flutter_linux/fl_basic_message_channel.h"
11-
#include "flutter/shell/platform/linux/public/flutter_linux/fl_json_message_codec.h"
12-
13-
static constexpr char kChannelName[] = "flutter/keyevent";
14-
static constexpr char kTypeKey[] = "type";
15-
static constexpr char kTypeValueUp[] = "keyup";
16-
static constexpr char kTypeValueDown[] = "keydown";
17-
static constexpr char kKeymapKey[] = "keymap";
18-
static constexpr char kKeyCodeKey[] = "keyCode";
19-
static constexpr char kScanCodeKey[] = "scanCode";
20-
static constexpr char kModifiersKey[] = "modifiers";
21-
static constexpr char kToolkitKey[] = "toolkit";
22-
static constexpr char kSpecifiedLogicalKey[] = "specifiedLogicalKey";
23-
static constexpr char kUnicodeScalarValuesKey[] = "unicodeScalarValues";
24-
25-
static constexpr char kGtkToolkit[] = "gtk";
26-
static constexpr char kLinuxKeymap[] = "linux";
10+
#include "flutter/shell/platform/linux/fl_key_event_channel.h"
2711

2812
/* Declare and define FlKeyChannelUserData */
2913

@@ -93,7 +77,7 @@ static FlKeyChannelUserData* fl_key_channel_user_data_new(
9377
struct _FlKeyChannelResponder {
9478
GObject parent_instance;
9579

96-
FlBasicMessageChannel* channel;
80+
FlKeyEventChannel* channel;
9781
};
9882

9983
G_DEFINE_TYPE(FlKeyChannelResponder, fl_key_channel_responder, G_TYPE_OBJECT)
@@ -111,19 +95,11 @@ static void handle_response(GObject* object,
11195
return;
11296
}
11397

98+
gboolean handled = FALSE;
11499
g_autoptr(GError) error = nullptr;
115-
FlBasicMessageChannel* messageChannel = FL_BASIC_MESSAGE_CHANNEL(object);
116-
FlValue* message =
117-
fl_basic_message_channel_send_finish(messageChannel, result, &error);
118-
bool handled = false;
119-
if (error != nullptr) {
100+
if (!fl_key_event_channel_send_finish(object, result, &handled, &error)) {
120101
g_warning("Unable to retrieve framework response: %s", error->message);
121-
} else {
122-
g_autoptr(FlValue) handled_value =
123-
fl_value_lookup_string(message, "handled");
124-
handled = fl_value_get_bool(handled_value);
125102
}
126-
127103
data->callback(handled, data->user_data);
128104
}
129105

@@ -155,9 +131,7 @@ FlKeyChannelResponder* fl_key_channel_responder_new(
155131
FlKeyChannelResponder* self = FL_KEY_CHANNEL_RESPONDER(
156132
g_object_new(fl_key_channel_responder_get_type(), nullptr));
157133

158-
g_autoptr(FlJsonMessageCodec) codec = fl_json_message_codec_new();
159-
self->channel = fl_basic_message_channel_new(messenger, kChannelName,
160-
FL_MESSAGE_CODEC(codec));
134+
self->channel = fl_key_event_channel_new(messenger);
161135

162136
return self;
163137
}
@@ -171,10 +145,11 @@ void fl_key_channel_responder_handle_event(
171145
g_return_if_fail(event != nullptr);
172146
g_return_if_fail(callback != nullptr);
173147

174-
const gchar* type =
175-
fl_key_event_get_is_press(event) ? kTypeValueDown : kTypeValueUp;
148+
FlKeyEventType type = fl_key_event_get_is_press(event)
149+
? FL_KEY_EVENT_TYPE_KEYDOWN
150+
: FL_KEY_EVENT_TYPE_KEYUP;
176151
int64_t scan_code = fl_key_event_get_keycode(event);
177-
int64_t unicode_scarlar_values =
152+
int64_t unicode_scalar_values =
178153
gdk_keyval_to_unicode(fl_key_event_get_keyval(event));
179154

180155
// For most modifier keys, GTK keeps track of the "pressed" state of the
@@ -223,29 +198,10 @@ void fl_key_channel_responder_handle_event(
223198
state |= (shift_lock_pressed || caps_lock_pressed) ? GDK_LOCK_MASK : 0x0;
224199
state |= num_lock_pressed ? GDK_MOD2_MASK : 0x0;
225200

226-
g_autoptr(FlValue) message = fl_value_new_map();
227-
fl_value_set_string_take(message, kTypeKey, fl_value_new_string(type));
228-
fl_value_set_string_take(message, kKeymapKey,
229-
fl_value_new_string(kLinuxKeymap));
230-
fl_value_set_string_take(message, kScanCodeKey, fl_value_new_int(scan_code));
231-
fl_value_set_string_take(message, kToolkitKey,
232-
fl_value_new_string(kGtkToolkit));
233-
fl_value_set_string_take(message, kKeyCodeKey,
234-
fl_value_new_int(fl_key_event_get_keyval(event)));
235-
fl_value_set_string_take(message, kModifiersKey, fl_value_new_int(state));
236-
if (unicode_scarlar_values != 0) {
237-
fl_value_set_string_take(message, kUnicodeScalarValuesKey,
238-
fl_value_new_int(unicode_scarlar_values));
239-
}
240-
241-
if (specified_logical_key != 0) {
242-
fl_value_set_string_take(message, kSpecifiedLogicalKey,
243-
fl_value_new_int(specified_logical_key));
244-
}
245-
246201
FlKeyChannelUserData* data =
247202
fl_key_channel_user_data_new(self, callback, user_data);
248-
// Send the message off to the framework for handling (or not).
249-
fl_basic_message_channel_send(self->channel, message, nullptr,
250-
handle_response, data);
203+
fl_key_event_channel_send(self->channel, type, scan_code,
204+
fl_key_event_get_keyval(event), state,
205+
unicode_scalar_values, specified_logical_key,
206+
nullptr, handle_response, data);
251207
}

shell/platform/linux/fl_key_channel_responder.h

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -7,9 +7,6 @@
77

88
#include "flutter/shell/platform/linux/fl_key_event.h"
99
#include "flutter/shell/platform/linux/public/flutter_linux/fl_binary_messenger.h"
10-
#include "flutter/shell/platform/linux/public/flutter_linux/fl_value.h"
11-
12-
typedef FlValue* (*FlValueConverter)(FlValue*);
1310

1411
G_BEGIN_DECLS
1512

Lines changed: 122 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,122 @@
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_key_event_channel.h"
6+
7+
#include "flutter/shell/platform/linux/public/flutter_linux/fl_basic_message_channel.h"
8+
#include "flutter/shell/platform/linux/public/flutter_linux/fl_json_message_codec.h"
9+
10+
static constexpr char kChannelName[] = "flutter/keyevent";
11+
static constexpr char kTypeKey[] = "type";
12+
static constexpr char kTypeValueUp[] = "keyup";
13+
static constexpr char kTypeValueDown[] = "keydown";
14+
static constexpr char kKeymapKey[] = "keymap";
15+
static constexpr char kKeyCodeKey[] = "keyCode";
16+
static constexpr char kScanCodeKey[] = "scanCode";
17+
static constexpr char kModifiersKey[] = "modifiers";
18+
static constexpr char kToolkitKey[] = "toolkit";
19+
static constexpr char kSpecifiedLogicalKey[] = "specifiedLogicalKey";
20+
static constexpr char kUnicodeScalarValuesKey[] = "unicodeScalarValues";
21+
22+
static constexpr char kGtkToolkit[] = "gtk";
23+
static constexpr char kLinuxKeymap[] = "linux";
24+
25+
static constexpr int64_t kUnicodeScalarValuesUnset = 0;
26+
static constexpr int64_t kSpecifiedLogicalKeyUnset = 0;
27+
28+
struct _FlKeyEventChannel {
29+
GObject parent_instance;
30+
31+
FlBasicMessageChannel* channel;
32+
};
33+
34+
G_DEFINE_TYPE(FlKeyEventChannel, fl_key_event_channel, G_TYPE_OBJECT)
35+
36+
static void fl_key_event_channel_dispose(GObject* object) {
37+
FlKeyEventChannel* self = FL_KEY_EVENT_CHANNEL(object);
38+
39+
g_clear_object(&self->channel);
40+
41+
G_OBJECT_CLASS(fl_key_event_channel_parent_class)->dispose(object);
42+
}
43+
44+
static void fl_key_event_channel_class_init(FlKeyEventChannelClass* klass) {
45+
G_OBJECT_CLASS(klass)->dispose = fl_key_event_channel_dispose;
46+
}
47+
48+
static void fl_key_event_channel_init(FlKeyEventChannel* self) {}
49+
50+
FlKeyEventChannel* fl_key_event_channel_new(FlBinaryMessenger* messenger) {
51+
g_return_val_if_fail(FL_IS_BINARY_MESSENGER(messenger), nullptr);
52+
53+
FlKeyEventChannel* self = FL_KEY_EVENT_CHANNEL(
54+
g_object_new(fl_key_event_channel_get_type(), nullptr));
55+
56+
g_autoptr(FlJsonMessageCodec) codec = fl_json_message_codec_new();
57+
self->channel = fl_basic_message_channel_new(messenger, kChannelName,
58+
FL_MESSAGE_CODEC(codec));
59+
60+
return self;
61+
}
62+
63+
void fl_key_event_channel_send(FlKeyEventChannel* self,
64+
FlKeyEventType type,
65+
int64_t scan_code,
66+
int64_t key_code,
67+
int64_t modifiers,
68+
int64_t unicode_scalar_values,
69+
int64_t specified_logical_key,
70+
GCancellable* cancellable,
71+
GAsyncReadyCallback callback,
72+
gpointer user_data) {
73+
g_return_if_fail(FL_IS_KEY_EVENT_CHANNEL(self));
74+
75+
const gchar* type_string;
76+
switch (type) {
77+
case FL_KEY_EVENT_TYPE_KEYUP:
78+
type_string = kTypeValueUp;
79+
break;
80+
case FL_KEY_EVENT_TYPE_KEYDOWN:
81+
type_string = kTypeValueDown;
82+
break;
83+
default:
84+
g_assert_not_reached();
85+
}
86+
87+
g_autoptr(FlValue) message = fl_value_new_map();
88+
fl_value_set_string_take(message, kTypeKey, fl_value_new_string(type_string));
89+
fl_value_set_string_take(message, kKeymapKey,
90+
fl_value_new_string(kLinuxKeymap));
91+
fl_value_set_string_take(message, kScanCodeKey, fl_value_new_int(scan_code));
92+
fl_value_set_string_take(message, kToolkitKey,
93+
fl_value_new_string(kGtkToolkit));
94+
fl_value_set_string_take(message, kKeyCodeKey, fl_value_new_int(key_code));
95+
fl_value_set_string_take(message, kModifiersKey, fl_value_new_int(modifiers));
96+
if (unicode_scalar_values != kUnicodeScalarValuesUnset) {
97+
fl_value_set_string_take(message, kUnicodeScalarValuesKey,
98+
fl_value_new_int(unicode_scalar_values));
99+
}
100+
if (specified_logical_key != kSpecifiedLogicalKeyUnset) {
101+
fl_value_set_string_take(message, kSpecifiedLogicalKey,
102+
fl_value_new_int(specified_logical_key));
103+
}
104+
fl_basic_message_channel_send(self->channel, message, cancellable, callback,
105+
user_data);
106+
}
107+
108+
gboolean fl_key_event_channel_send_finish(GObject* object,
109+
GAsyncResult* result,
110+
gboolean* handled,
111+
GError** error) {
112+
FlValue* message = fl_basic_message_channel_send_finish(
113+
FL_BASIC_MESSAGE_CHANNEL(object), result, error);
114+
if (message == nullptr) {
115+
return FALSE;
116+
}
117+
118+
g_autoptr(FlValue) handled_value = fl_value_lookup_string(message, "handled");
119+
*handled = fl_value_get_bool(handled_value);
120+
121+
return TRUE;
122+
}
Lines changed: 86 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,86 @@
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_KEY_EVENT_CHANNEL_H_
6+
#define FLUTTER_SHELL_PLATFORM_LINUX_FL_KEY_EVENT_CHANNEL_H_
7+
8+
#include "flutter/shell/platform/linux/public/flutter_linux/fl_binary_messenger.h"
9+
10+
G_BEGIN_DECLS
11+
12+
G_DECLARE_FINAL_TYPE(FlKeyEventChannel,
13+
fl_key_event_channel,
14+
FL,
15+
KEY_EVENT_CHANNEL,
16+
GObject);
17+
18+
/**
19+
* FlKeyEventChannel:
20+
*
21+
* #FlKeyEventChannel is a channel that implements the shell side
22+
* of SystemChannels.keyEvent from the Flutter services library.
23+
*/
24+
25+
typedef enum {
26+
FL_KEY_EVENT_TYPE_KEYUP,
27+
FL_KEY_EVENT_TYPE_KEYDOWN,
28+
} FlKeyEventType;
29+
30+
/**
31+
* fl_key_event_channel_new:
32+
* @messenger: an #FlBinaryMessenger
33+
*
34+
* Creates a new channel that implements SystemChannels.keyEvent from the
35+
* Flutter services library.
36+
*
37+
* Returns: a new #FlKeyEventChannel.
38+
*/
39+
FlKeyEventChannel* fl_key_event_channel_new(FlBinaryMessenger* messenger);
40+
41+
/**
42+
* fl_key_event_channel_send:
43+
* @channel: an #FlKeyEventChannel
44+
* @type: event type.
45+
* @scan_code: scan code.
46+
* @key_code: key code.
47+
* @modifiers: modifiers.
48+
* @unicode_scarlar_values:
49+
* @specified_logical_key:
50+
* @cancellable: (allow-none): a #GCancellable or %NULL.
51+
* @callback: (scope async): a #GAsyncReadyCallback to call when the method
52+
* returns.
53+
* @user_data: (closure): user data to pass to @callback.
54+
*
55+
* Send a key event to the platform.
56+
*/
57+
void fl_key_event_channel_send(FlKeyEventChannel* channel,
58+
FlKeyEventType type,
59+
int64_t scan_code,
60+
int64_t key_code,
61+
int64_t modifiers,
62+
int64_t unicode_scarlar_values,
63+
int64_t specified_logical_key,
64+
GCancellable* cancellable,
65+
GAsyncReadyCallback callback,
66+
gpointer user_data);
67+
68+
/**
69+
* fl_key_event_channel_send_finish:
70+
* @object:
71+
* @result: a #GAsyncResult.
72+
* @error: (allow-none): #GError location to store the error occurring, or %NULL
73+
* to ignore.
74+
*
75+
* Completes request started with fl_key_event_channel_send().
76+
*
77+
* Returns: %TRUE on success.
78+
*/
79+
gboolean fl_key_event_channel_send_finish(GObject* object,
80+
GAsyncResult* result,
81+
gboolean* handled,
82+
GError** error);
83+
84+
G_END_DECLS
85+
86+
#endif // FLUTTER_SHELL_PLATFORM_LINUX_FL_KEY_EVENT_CHANNEL_H_

0 commit comments

Comments
 (0)