ime: wip: add text-input object to seat

This commit is contained in:
Daniel Eklöf 2020-10-10 22:14:35 +02:00
parent d58d0601f6
commit 148bb1ff13
No known key found for this signature in database
GPG key ID: 5BBD4992C116573F
5 changed files with 147 additions and 0 deletions

97
ime.c Normal file
View file

@ -0,0 +1,97 @@
#include "ime.h"
#include "text-input-unstable-v3.h"
#define LOG_MODULE "ime"
#define LOG_ENABLE_DBG 1
#include "log.h"
#include "terminal.h"
#include "wayland.h"
static void
enter(void *data, struct zwp_text_input_v3 *zwp_text_input_v3,
struct wl_surface *surface)
{
struct seat *seat = data;
LOG_DBG("enter: seat=%s", seat->name);
assert(seat->kbd_focus != NULL);
switch (term_surface_kind(seat->kbd_focus, surface)) {
case TERM_SURF_GRID:
zwp_text_input_v3_enable(seat->wl_text_input);
zwp_text_input_v3_set_content_type(
seat->wl_text_input,
ZWP_TEXT_INPUT_V3_CONTENT_HINT_NONE,
ZWP_TEXT_INPUT_V3_CONTENT_PURPOSE_TERMINAL);
/* TODO: set cursor rectangle */
zwp_text_input_v3_set_cursor_rectangle(seat->wl_text_input, 0, 0, 15, 15);
break;
case TERM_SURF_SEARCH:
/* TODO */
/* FALLTHROUGH */
case TERM_SURF_NONE:
case TERM_SURF_SCROLLBACK_INDICATOR:
case TERM_SURF_RENDER_TIMER:
case TERM_SURF_TITLE:
case TERM_SURF_BORDER_LEFT:
case TERM_SURF_BORDER_RIGHT:
case TERM_SURF_BORDER_TOP:
case TERM_SURF_BORDER_BOTTOM:
case TERM_SURF_BUTTON_MINIMIZE:
case TERM_SURF_BUTTON_MAXIMIZE:
case TERM_SURF_BUTTON_CLOSE:
zwp_text_input_v3_disable(seat->wl_text_input);
break;
}
zwp_text_input_v3_commit(seat->wl_text_input);
}
static void
leave(void *data, struct zwp_text_input_v3 *zwp_text_input_v3,
struct wl_surface *surface)
{
struct seat *seat = data;
LOG_DBG("leave: seat=%s", seat->name);
}
static void
preedit_string(void *data, struct zwp_text_input_v3 *zwp_text_input_v3,
const char *text, int32_t cursor_begin, int32_t cursor_end)
{
LOG_DBG("preedit-strig: text=%s, begin=%d, end=%d", text, cursor_begin, cursor_end);
}
static void
commit_string(void *data, struct zwp_text_input_v3 *zwp_text_input_v3,
const char *text)
{
LOG_DBG("commit: text=%s", text);
}
static void
delete_surrounding_text(void *data, struct zwp_text_input_v3 *zwp_text_input_v3,
uint32_t before_length, uint32_t after_length)
{
LOG_DBG("delete-surrounding: before=%d, after=%d", before_length, after_length);
}
static void
done(void *data, struct zwp_text_input_v3 *zwp_text_input_v3,
uint32_t serial)
{
LOG_DBG("done: serial=%u", serial);
}
const struct zwp_text_input_v3_listener text_input_listener = {
.enter = &enter,
.leave = &leave,
.preedit_string = &preedit_string,
.commit_string = &commit_string,
.delete_surrounding_text = &delete_surrounding_text,
.done = &done,
};

5
ime.h Normal file
View file

@ -0,0 +1,5 @@
#pragma once
#include "text-input-unstable-v3.h"
extern const struct zwp_text_input_v3_listener text_input_listener;

View file

@ -78,6 +78,7 @@ foreach prot : [
wayland_protocols_datadir + '/unstable/xdg-output/xdg-output-unstable-v1.xml',
wayland_protocols_datadir + '/unstable/primary-selection/primary-selection-unstable-v1.xml',
wayland_protocols_datadir + '/stable/presentation-time/presentation-time.xml',
wayland_protocols_datadir + '/unstable/text-input/text-input-unstable-v3.xml',
]
wl_proto_headers += custom_target(
@ -147,6 +148,7 @@ executable(
'commands.c', 'commands.h',
'extract.c', 'extract.h',
'fdm.c', 'fdm.h',
'ime.c', 'ime.h',
'input.c', 'input.h',
'main.c',
'quirks.c', 'quirks.h',

View file

@ -18,6 +18,7 @@
#include <tllist.h>
#include <xdg-output-unstable-v1.h>
#include <xdg-decoration-unstable-v1.h>
#include <text-input-unstable-v3.h>
#define LOG_MODULE "wayland"
#define LOG_ENABLE_DBG 0
@ -25,6 +26,7 @@
#include "config.h"
#include "terminal.h"
#include "ime.h"
#include "input.h"
#include "render.h"
#include "selection.h"
@ -111,6 +113,23 @@ seat_add_primary_selection(struct seat *seat)
primary_selection_device, &primary_selection_device_listener, seat);
}
static void
seat_add_text_input(struct seat *seat)
{
if (seat->wayl->text_input_manager == NULL)
return;
struct zwp_text_input_v3 *text_input
= zwp_text_input_manager_v3_get_text_input(
seat->wayl->text_input_manager, seat->wl_seat);
if (text_input == NULL)
return;
seat->wl_text_input = text_input;
zwp_text_input_v3_add_listener(text_input, &text_input_listener, seat);
}
static void
seat_destroy(struct seat *seat)
{
@ -165,6 +184,8 @@ seat_destroy(struct seat *seat)
wl_keyboard_release(seat->wl_keyboard);
if (seat->wl_pointer != NULL)
wl_pointer_release(seat->wl_pointer);
if (seat->wl_text_input != NULL)
zwp_text_input_v3_destroy(seat->wl_text_input);
if (seat->wl_seat != NULL)
wl_seat_release(seat->wl_seat);
@ -815,6 +836,7 @@ handle_global(void *data, struct wl_registry *registry,
seat_add_data_device(seat);
seat_add_primary_selection(seat);
seat_add_text_input(seat);
wl_seat_add_listener(wl_seat, &seat_listener, seat);
}
@ -895,6 +917,18 @@ handle_global(void *data, struct wl_registry *registry,
wayl->presentation, &presentation_listener, wayl);
}
}
else if (strcmp(interface, zwp_text_input_manager_v3_interface.name) == 0) {
const uint32_t required = 1;
if (!verify_iface_version(interface, version, required))
return;
wayl->text_input_manager = wl_registry_bind(
wayl->registry, name, &zwp_text_input_manager_v3_interface, required);
tll_foreach(wayl->seats, it)
seat_add_text_input(&it->item);
}
}
static void
@ -1154,6 +1188,8 @@ wayl_destroy(struct wayland *wayl)
seat_destroy(&it->item);
tll_free(wayl->seats);
if (wayl->text_input_manager != NULL)
zwp_text_input_manager_v3_destroy(wayl->text_input_manager);
if (wayl->xdg_output_manager != NULL)
zxdg_output_manager_v1_destroy(wayl->xdg_output_manager);
if (wayl->shell != NULL)

View file

@ -220,6 +220,11 @@ struct seat {
struct wl_clipboard clipboard;
struct wl_primary primary;
/* Input Method Editor */
struct zwp_text_input_v3 *wl_text_input;
//struct {
//} ime;
};
enum csd_surface {
@ -374,6 +379,8 @@ struct wayland {
struct wp_presentation *presentation;
uint32_t presentation_clock_id;
struct zwp_text_input_manager_v3 *text_input_manager;
bool have_argb8888;
tll(struct monitor) monitors; /* All available outputs */
tll(struct seat) seats;