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

Commit 9dd044e

Browse files
committed
Add FlKeyEventChannel
1 parent b71a50e commit 9dd044e

File tree

5 files changed

+374
-3
lines changed

5 files changed

+374
-3
lines changed

ci/licenses_golden/licenses_flutter

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1195,6 +1195,8 @@ FILE: ../../../flutter/shell/platform/linux/fl_engine.cc
11951195
FILE: ../../../flutter/shell/platform/linux/fl_engine_private.h
11961196
FILE: ../../../flutter/shell/platform/linux/fl_json_message_codec.cc
11971197
FILE: ../../../flutter/shell/platform/linux/fl_json_message_codec_test.cc
1198+
FILE: ../../../flutter/shell/platform/linux/fl_key_event_channel.cc
1199+
FILE: ../../../flutter/shell/platform/linux/fl_key_event_channel.h
11981200
FILE: ../../../flutter/shell/platform/linux/fl_message_codec.cc
11991201
FILE: ../../../flutter/shell/platform/linux/fl_message_codec_test.cc
12001202
FILE: ../../../flutter/shell/platform/linux/fl_renderer.cc

shell/platform/linux/BUILD.gn

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -72,6 +72,7 @@ source_set("flutter_linux") {
7272
"fl_dart_project.cc",
7373
"fl_engine.cc",
7474
"fl_json_message_codec.cc",
75+
"fl_key_event_channel.cc",
7576
"fl_message_codec.cc",
7677
"fl_renderer.cc",
7778
"fl_renderer_x11.cc",
Lines changed: 83 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,83 @@
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+
#include "flutter/shell/platform/linux/public/flutter_linux/fl_basic_message_channel.h"
7+
#include "flutter/shell/platform/linux/public/flutter_linux/fl_json_message_codec.h"
8+
9+
static constexpr char kChannelName[] = "flutter/keyevent";
10+
static constexpr char kTypeKey[] = "type";
11+
static constexpr char kTypeValueUp[] = "keyup";
12+
static constexpr char kTypeValueDown[] = "keydown";
13+
static constexpr char kKeymapKey[] = "keymap";
14+
static constexpr char kKeyCodeKey[] = "keyCode";
15+
static constexpr char kScanCodeKey[] = "scanCode";
16+
static constexpr char kModifiersKey[] = "modifiers";
17+
static constexpr char kToolkitKey[] = "toolkit";
18+
static constexpr char kUnicodeScalarValuesKey[] = "unicodeScalarValues";
19+
20+
struct _FlKeyEventChannel {
21+
GObject parent_instance;
22+
23+
FlBasicMessageChannel* channel;
24+
};
25+
26+
G_DEFINE_TYPE(FlKeyEventChannel, fl_key_event_channel, G_TYPE_OBJECT)
27+
28+
static void fl_key_event_channel_dispose(GObject* object) {
29+
FlKeyEventChannel* self = FL_KEY_EVENT_CHANNEL(object);
30+
31+
g_clear_object(&self->channel);
32+
33+
G_OBJECT_CLASS(fl_key_event_channel_parent_class)->dispose(object);
34+
}
35+
36+
static void fl_key_event_channel_class_init(FlKeyEventChannelClass* klass) {
37+
G_OBJECT_CLASS(klass)->dispose = fl_key_event_channel_dispose;
38+
}
39+
40+
static void fl_key_event_channel_init(FlKeyEventChannel* self) {}
41+
42+
FlKeyEventChannel* fl_key_event_channel_new(FlBinaryMessenger* messenger) {
43+
g_return_val_if_fail(FL_IS_BINARY_MESSENGER(messenger), nullptr);
44+
45+
FlKeyEventChannel* self = FL_KEY_EVENT_CHANNEL(
46+
g_object_new(fl_key_event_channel_get_type(), nullptr));
47+
48+
g_autoptr(FlJsonMessageCodec) codec = fl_json_message_codec_new();
49+
self->channel = fl_basic_message_channel_new(messenger, kChannelName,
50+
FL_MESSAGE_CODEC(codec));
51+
52+
return self;
53+
}
54+
55+
void fl_key_event_channel_send_key_event(FlKeyEventChannel* self,
56+
FlKeyEventType type,
57+
const gchar* keymap,
58+
int64_t scan_code,
59+
const gchar* toolkit,
60+
int64_t key_code,
61+
int64_t modifiers,
62+
int64_t unicodeScalarValues) {
63+
g_return_if_fail(FL_IS_KEY_EVENT_CHANNEL(self));
64+
g_return_if_fail(type == KEY_EVENT_TYPE_DOWN || type == KEY_EVENT_TYPE_UP);
65+
g_return_if_fail(keymap != nullptr);
66+
g_return_if_fail(toolkit != nullptr);
67+
68+
fl_value_set_string_take(
69+
message, kTypeKey,
70+
fl_value_new_string(type == KEY_EVENT_TYPE_DOWN ? kTypeValueDown
71+
: kTypeValueUp));
72+
fl_value_set_string_take(message, kKeymapKey, fl_value_new_string(keymap));
73+
fl_value_set_string_take(message, kScanCodeKey, fl_value_new_int(scan_code));
74+
fl_value_set_string_take(message, kToolkitKey, fl_value_new_string(toolkit));
75+
fl_value_set_string_take(message, kKeyCodeKey, fl_value_new_int(key_code));
76+
fl_value_set_string_take(message, kModifiersKey, fl_value_new_int(modifiers));
77+
if (unicodeScalarValues != 0)
78+
fl_value_set_string_take(message, kUnicodeScalarValuesKey,
79+
fl_value_new_int(unicodeScalarValues));
80+
81+
fl_basic_message_channel_send(self->channel, message, nullptr, nullptr,
82+
nullptr);
83+
}
Lines changed: 72 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,72 @@
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+
/**
13+
* FlKeyEventType:
14+
* @FL_KEY_EVENT_TYPE_DOWN: Key is pressed.
15+
* @FL_KEY_EVENT_TYPE_UP: Key is released.
16+
*
17+
* Types of key events.
18+
*/
19+
typedef enum {
20+
FL_KEY_EVENT_TYPE_UP,
21+
FL_KEY_EVENT_TYPE_DOWN,
22+
} FlKeyEventType;
23+
24+
G_DECLARE_FINAL_TYPE(FlKeyEventChannel,
25+
fl_key_event_channel,
26+
FL,
27+
KEY_EVENT_CHANNEL,
28+
GObject);
29+
30+
/**
31+
* FlKeyEventChannel:
32+
*
33+
* #FlKeyEventChannel is a platform channel that implements the shell side
34+
* of SystemChannels.keyEvent from the Flutter services library.
35+
*/
36+
37+
/**
38+
* fl_key_event_channel_new:
39+
* @messenger: an #FlBinaryMessenger.
40+
*
41+
* Creates a #FlKeyEventChannel.
42+
*
43+
* Returns: a new #FlKeyEventChannel.
44+
*/
45+
FlKeyEventChannel* fl_key_event_channel_new(FlBinaryMessenger* messenger);
46+
47+
/**
48+
* fl_key_event_channel_send_key_event:
49+
* @channel: an #FlKeyEventChannel.
50+
* @type: an #FlKeyEventType.
51+
* @keymap: keymap in use, e.g. "linux".
52+
* @scan_code: hardware scan code from @keymap.
53+
* @toolkit: toolkit generating the event, e.g. "glfw".
54+
* @key_code: key that has changed state (value defined by @toolkit).
55+
* @modifiers: modifiers active (value defined by @toolkit).
56+
* @unicodeScalarValues: Unicode character associated with this key or 0 for
57+
* none.
58+
*
59+
* Sends a key event to Flutter.
60+
*/
61+
void fl_key_event_channel_send_key_event(FlKeyEventChannel* channel,
62+
FlKeyEventType type,
63+
const gchar* keymap,
64+
int64_t scan_code,
65+
const gchar* toolkit,
66+
int64_t key_code,
67+
int64_t modifiers,
68+
int64_t unicodeScalarValues);
69+
70+
G_END_DECLS
71+
72+
#endif // FLUTTER_SHELL_PLATFORM_LINUX_FL_KEY_EVENT_CHANNEL_H_

0 commit comments

Comments
 (0)