1 /*
2     SPDX-FileCopyrightText: 2021 Roman Glig <subdiff@gmail.com>
3 
4     SPDX-License-Identifier: LGPL-2.1-only OR LGPL-3.0-only
5 */
6 #include "input_method_v2.h"
7 
8 #include "display.h"
9 #include "keyboard_p.h"
10 #include "seat_p.h"
11 #include "surface_p.h"
12 #include "text_input_v3_p.h"
13 
14 #include <wayland-input-method-unstable-v2-server-protocol.h>
15 
16 namespace Wrapland::Server
17 {
18 
19 constexpr uint32_t input_method_manager_v2_version = 1;
20 using input_method_manager_v2_global
21     = Wayland::Global<input_method_manager_v2, input_method_manager_v2_version>;
22 using input_method_manager_v2_bind = Wayland::Bind<input_method_manager_v2_global>;
23 
24 class input_method_manager_v2::Private : public input_method_manager_v2_global
25 {
26 private:
27     static void
28     get_input_method_callback(input_method_manager_v2_bind* bind, wl_resource* wlSeat, uint32_t id);
29 
30     static struct zwp_input_method_manager_v2_interface const s_interface;
31 
32 public:
33     Private(Display* display, input_method_manager_v2* q);
34 };
35 
36 class input_method_v2::Private : public Wayland::Resource<input_method_v2>
37 {
38 private:
39     static struct zwp_input_method_v2_interface const s_interface;
40 
41 public:
42     Private(Client* client, uint32_t version, uint32_t id, input_method_v2* q);
43 
44     Seat* seat{nullptr};
45     uint32_t serial{0};
46 
47     input_method_v2_state current;
48     input_method_v2_state pending;
49 
50     input_method_v2* q_ptr;
51 
52 private:
53     static void commit_string_callback([[maybe_unused]] wl_client* wlClient,
54                                        wl_resource* wlResource,
55                                        char const* text);
56     static void preedit_string_callback([[maybe_unused]] wl_client* wlClient,
57                                         wl_resource* wlResource,
58                                         char const* text,
59                                         int32_t cursor_begin,
60                                         int32_t cursor_end);
61     static void delete_surrounding_text_callback([[maybe_unused]] wl_client* wlClient,
62                                                  wl_resource* wlResource,
63                                                  uint32_t beforeBytes,
64                                                  uint32_t afterBytes);
65     static void
66     commit_callback([[maybe_unused]] wl_client* wlClient, wl_resource* wlResource, uint32_t serial);
67     static void get_input_popup_surface_callback([[maybe_unused]] wl_client* wlClient,
68                                                  wl_resource* wlResource,
69                                                  uint32_t id,
70                                                  wl_resource* wlSurface);
71     static void grab_keyboard_callback([[maybe_unused]] wl_client* wlClient,
72                                        wl_resource* wlResource,
73                                        uint32_t id);
74 };
75 
76 class input_method_keyboard_grab_v2::Private
77     : public Wayland::Resource<input_method_keyboard_grab_v2>
78 {
79 private:
80     static struct zwp_input_method_keyboard_grab_v2_interface const s_interface;
81 
82 public:
83     Private(Client* client,
84             uint32_t version,
85             uint32_t id,
86             Seat* seat,
87             input_method_keyboard_grab_v2* q);
88 
89     Seat* seat;
90     file_wrap keymap;
91 };
92 
93 class input_method_popup_surface_v2::Private
94     : public Wayland::Resource<input_method_popup_surface_v2>
95 {
96 private:
97     static struct zwp_input_popup_surface_v2_interface const s_interface;
98 
99 public:
100     Private(Client* client,
101             uint32_t version,
102             uint32_t id,
103             Surface* surface,
104             input_method_popup_surface_v2* q);
105 
106     Surface* surface;
107 };
108 
109 }
110