Use input method protocol from wayland-protocols

Signed-off-by: Jonas Ådahl <jadahl@gmail.com>
Reviewed-by: Mariusz Ceier <mceier+wayland@gmail.com>
Reviewed-by: Jan Arne Petersen <janarne@gmail.com>
Reviewed-by: Pekka Paalanen <pekka.paalanen@collabora.co.uk>
This commit is contained in:
Jonas Ådahl
2015-11-17 16:00:30 +08:00
committed by Pekka Paalanen
parent 3bcba347a2
commit b57f472c84
7 changed files with 199 additions and 470 deletions
+92 -82
View File
@@ -32,15 +32,15 @@
#include <cairo.h>
#include "window.h"
#include "input-method-client-protocol.h"
#include "input-method-unstable-v1-client-protocol.h"
#include "text-input-unstable-v1-client-protocol.h"
struct keyboard;
struct virtual_keyboard {
struct wl_input_panel *input_panel;
struct wl_input_method *input_method;
struct wl_input_method_context *context;
struct zwp_input_panel_v1 *input_panel;
struct zwp_input_method_v1 *input_method;
struct zwp_input_method_context_v1 *context;
struct display *display;
struct output *output;
char *preedit_string;
@@ -427,11 +427,11 @@ virtual_keyboard_commit_preedit(struct virtual_keyboard *keyboard)
strlen(keyboard->preedit_string) == 0)
return;
wl_input_method_context_cursor_position(keyboard->context,
0, 0);
wl_input_method_context_commit_string(keyboard->context,
keyboard->serial,
keyboard->preedit_string);
zwp_input_method_context_v1_cursor_position(keyboard->context,
0, 0);
zwp_input_method_context_v1_commit_string(keyboard->context,
keyboard->serial,
keyboard->preedit_string);
if (keyboard->surrounding_text) {
surrounding_text = insert_text(keyboard->surrounding_text,
@@ -456,18 +456,18 @@ virtual_keyboard_send_preedit(struct virtual_keyboard *keyboard,
uint32_t index = strlen(keyboard->preedit_string);
if (keyboard->preedit_style)
wl_input_method_context_preedit_styling(keyboard->context,
0,
strlen(keyboard->preedit_string),
keyboard->preedit_style);
zwp_input_method_context_v1_preedit_styling(keyboard->context,
0,
strlen(keyboard->preedit_string),
keyboard->preedit_style);
if (cursor > 0)
index = cursor;
wl_input_method_context_preedit_cursor(keyboard->context,
index);
wl_input_method_context_preedit_string(keyboard->context,
keyboard->serial,
keyboard->preedit_string,
keyboard->preedit_string);
zwp_input_method_context_v1_preedit_cursor(keyboard->context,
index);
zwp_input_method_context_v1_preedit_string(keyboard->context,
keyboard->serial,
keyboard->preedit_string,
keyboard->preedit_string);
}
static const char *
@@ -499,12 +499,12 @@ delete_before_cursor(struct virtual_keyboard *keyboard)
end = keyboard->surrounding_text + keyboard->surrounding_cursor;
wl_input_method_context_delete_surrounding_text(keyboard->context,
(start - keyboard->surrounding_text) - keyboard->surrounding_cursor,
end - start);
wl_input_method_context_commit_string(keyboard->context,
keyboard->serial,
"");
zwp_input_method_context_v1_delete_surrounding_text(keyboard->context,
(start - keyboard->surrounding_text) - keyboard->surrounding_cursor,
end - start);
zwp_input_method_context_v1_commit_string(keyboard->context,
keyboard->serial,
"");
/* Update surrounding text */
keyboard->surrounding_cursor = start - keyboard->surrounding_text;
@@ -571,10 +571,10 @@ keyboard_handle_key(struct keyboard *keyboard, uint32_t time, const struct key *
break;
case keytype_enter:
virtual_keyboard_commit_preedit(keyboard->keyboard);
wl_input_method_context_keysym(keyboard->keyboard->context,
display_get_serial(keyboard->keyboard->display),
time,
XKB_KEY_Return, key_state, mod_mask);
zwp_input_method_context_v1_keysym(keyboard->keyboard->context,
display_get_serial(keyboard->keyboard->display),
time,
XKB_KEY_Return, key_state, mod_mask);
break;
case keytype_space:
if (state != WL_POINTER_BUTTON_STATE_PRESSED)
@@ -615,38 +615,38 @@ keyboard_handle_key(struct keyboard *keyboard, uint32_t time, const struct key *
break;
case keytype_tab:
virtual_keyboard_commit_preedit(keyboard->keyboard);
wl_input_method_context_keysym(keyboard->keyboard->context,
display_get_serial(keyboard->keyboard->display),
time,
XKB_KEY_Tab, key_state, mod_mask);
zwp_input_method_context_v1_keysym(keyboard->keyboard->context,
display_get_serial(keyboard->keyboard->display),
time,
XKB_KEY_Tab, key_state, mod_mask);
break;
case keytype_arrow_up:
virtual_keyboard_commit_preedit(keyboard->keyboard);
wl_input_method_context_keysym(keyboard->keyboard->context,
display_get_serial(keyboard->keyboard->display),
time,
XKB_KEY_Up, key_state, mod_mask);
zwp_input_method_context_v1_keysym(keyboard->keyboard->context,
display_get_serial(keyboard->keyboard->display),
time,
XKB_KEY_Up, key_state, mod_mask);
break;
case keytype_arrow_left:
virtual_keyboard_commit_preedit(keyboard->keyboard);
wl_input_method_context_keysym(keyboard->keyboard->context,
display_get_serial(keyboard->keyboard->display),
time,
XKB_KEY_Left, key_state, mod_mask);
zwp_input_method_context_v1_keysym(keyboard->keyboard->context,
display_get_serial(keyboard->keyboard->display),
time,
XKB_KEY_Left, key_state, mod_mask);
break;
case keytype_arrow_right:
virtual_keyboard_commit_preedit(keyboard->keyboard);
wl_input_method_context_keysym(keyboard->keyboard->context,
display_get_serial(keyboard->keyboard->display),
time,
XKB_KEY_Right, key_state, mod_mask);
zwp_input_method_context_v1_keysym(keyboard->keyboard->context,
display_get_serial(keyboard->keyboard->display),
time,
XKB_KEY_Right, key_state, mod_mask);
break;
case keytype_arrow_down:
virtual_keyboard_commit_preedit(keyboard->keyboard);
wl_input_method_context_keysym(keyboard->keyboard->context,
display_get_serial(keyboard->keyboard->display),
time,
XKB_KEY_Down, key_state, mod_mask);
zwp_input_method_context_v1_keysym(keyboard->keyboard->context,
display_get_serial(keyboard->keyboard->display),
time,
XKB_KEY_Down, key_state, mod_mask);
break;
case keytype_style:
if (state != WL_POINTER_BUTTON_STATE_PRESSED)
@@ -750,7 +750,7 @@ touch_up_handler(struct widget *widget, struct input *input,
static void
handle_surrounding_text(void *data,
struct wl_input_method_context *context,
struct zwp_input_method_context_v1 *context,
const char *text,
uint32_t cursor,
uint32_t anchor)
@@ -765,7 +765,7 @@ handle_surrounding_text(void *data,
static void
handle_reset(void *data,
struct wl_input_method_context *context)
struct zwp_input_method_context_v1 *context)
{
struct virtual_keyboard *keyboard = data;
@@ -779,7 +779,7 @@ handle_reset(void *data,
static void
handle_content_type(void *data,
struct wl_input_method_context *context,
struct zwp_input_method_context_v1 *context,
uint32_t hint,
uint32_t purpose)
{
@@ -791,7 +791,7 @@ handle_content_type(void *data,
static void
handle_invoke_action(void *data,
struct wl_input_method_context *context,
struct zwp_input_method_context_v1 *context,
uint32_t button,
uint32_t index)
{
@@ -805,7 +805,7 @@ handle_invoke_action(void *data,
static void
handle_commit_state(void *data,
struct wl_input_method_context *context,
struct zwp_input_method_context_v1 *context,
uint32_t serial)
{
struct virtual_keyboard *keyboard = data;
@@ -822,15 +822,19 @@ handle_commit_state(void *data,
layout->columns * key_width,
layout->rows * key_height);
wl_input_method_context_language(context, keyboard->serial, layout->language);
wl_input_method_context_text_direction(context, keyboard->serial, layout->text_direction);
zwp_input_method_context_v1_language(context,
keyboard->serial,
layout->language);
zwp_input_method_context_v1_text_direction(context,
keyboard->serial,
layout->text_direction);
widget_schedule_redraw(keyboard->keyboard->widget);
}
static void
handle_preferred_language(void *data,
struct wl_input_method_context *context,
struct zwp_input_method_context_v1 *context,
const char *language)
{
struct virtual_keyboard *keyboard = data;
@@ -844,7 +848,7 @@ handle_preferred_language(void *data,
keyboard->preferred_language = strdup(language);
}
static const struct wl_input_method_context_listener input_method_context_listener = {
static const struct zwp_input_method_context_v1_listener input_method_context_listener = {
handle_surrounding_text,
handle_reset,
handle_content_type,
@@ -855,8 +859,8 @@ static const struct wl_input_method_context_listener input_method_context_listen
static void
input_method_activate(void *data,
struct wl_input_method *input_method,
struct wl_input_method_context *context)
struct zwp_input_method_v1 *input_method,
struct zwp_input_method_context_v1 *context)
{
struct virtual_keyboard *keyboard = data;
struct wl_array modifiers_map;
@@ -865,7 +869,7 @@ input_method_activate(void *data,
keyboard->keyboard->state = KEYBOARD_STATE_DEFAULT;
if (keyboard->context)
wl_input_method_context_destroy(keyboard->context);
zwp_input_method_context_v1_destroy(keyboard->context);
if (keyboard->preedit_string)
free(keyboard->preedit_string);
@@ -881,15 +885,15 @@ input_method_activate(void *data,
keyboard->serial = 0;
keyboard->context = context;
wl_input_method_context_add_listener(context,
&input_method_context_listener,
keyboard);
zwp_input_method_context_v1_add_listener(context,
&input_method_context_listener,
keyboard);
wl_array_init(&modifiers_map);
keysym_modifiers_add(&modifiers_map, "Shift");
keysym_modifiers_add(&modifiers_map, "Control");
keysym_modifiers_add(&modifiers_map, "Mod1");
wl_input_method_context_modifiers_map(context, &modifiers_map);
zwp_input_method_context_v1_modifiers_map(context, &modifiers_map);
keyboard->keysym.shift_mask = keysym_modifiers_get_mask(&modifiers_map, "Shift");
wl_array_release(&modifiers_map);
@@ -899,27 +903,31 @@ input_method_activate(void *data,
layout->columns * key_width,
layout->rows * key_height);
wl_input_method_context_language(context, keyboard->serial, layout->language);
wl_input_method_context_text_direction(context, keyboard->serial, layout->text_direction);
zwp_input_method_context_v1_language(context,
keyboard->serial,
layout->language);
zwp_input_method_context_v1_text_direction(context,
keyboard->serial,
layout->text_direction);
widget_schedule_redraw(keyboard->keyboard->widget);
}
static void
input_method_deactivate(void *data,
struct wl_input_method *input_method,
struct wl_input_method_context *context)
struct zwp_input_method_v1 *input_method,
struct zwp_input_method_context_v1 *context)
{
struct virtual_keyboard *keyboard = data;
if (!keyboard->context)
return;
wl_input_method_context_destroy(keyboard->context);
zwp_input_method_context_v1_destroy(keyboard->context);
keyboard->context = NULL;
}
static const struct wl_input_method_listener input_method_listener = {
static const struct zwp_input_method_v1_listener input_method_listener = {
input_method_activate,
input_method_deactivate
};
@@ -930,14 +938,16 @@ global_handler(struct display *display, uint32_t name,
{
struct virtual_keyboard *keyboard = data;
if (!strcmp(interface, "wl_input_panel")) {
if (!strcmp(interface, "zwp_input_panel_v1")) {
keyboard->input_panel =
display_bind(display, name, &wl_input_panel_interface, 1);
} else if (!strcmp(interface, "wl_input_method")) {
display_bind(display, name, &zwp_input_panel_v1_interface, 1);
} else if (!strcmp(interface, "zwp_input_method_v1")) {
keyboard->input_method =
display_bind(display, name,
&wl_input_method_interface, 1);
wl_input_method_add_listener(keyboard->input_method, &input_method_listener, keyboard);
&zwp_input_method_v1_interface, 1);
zwp_input_method_v1_add_listener(keyboard->input_method,
&input_method_listener,
keyboard);
}
}
@@ -946,7 +956,7 @@ keyboard_create(struct output *output, struct virtual_keyboard *virtual_keyboard
{
struct keyboard *keyboard;
const struct layout *layout;
struct wl_input_panel_surface *ips;
struct zwp_input_panel_surface_v1 *ips;
layout = get_current_layout(virtual_keyboard);
@@ -971,12 +981,12 @@ keyboard_create(struct output *output, struct virtual_keyboard *virtual_keyboard
layout->rows * key_height);
ips = wl_input_panel_get_input_panel_surface(virtual_keyboard->input_panel,
window_get_wl_surface(keyboard->window));
ips = zwp_input_panel_v1_get_input_panel_surface(virtual_keyboard->input_panel,
window_get_wl_surface(keyboard->window));
wl_input_panel_surface_set_toplevel(ips,
output_get_wl_output(output),
WL_INPUT_PANEL_SURFACE_POSITION_CENTER_BOTTOM);
zwp_input_panel_surface_v1_set_toplevel(ips,
output_get_wl_output(output),
ZWP_INPUT_PANEL_SURFACE_V1_POSITION_CENTER_BOTTOM);
}
int
+67 -63
View File
@@ -33,7 +33,7 @@
#include <linux/input.h>
#include "window.h"
#include "input-method-client-protocol.h"
#include "input-method-unstable-v1-client-protocol.h"
enum compose_state {
state_normal,
@@ -54,8 +54,8 @@ typedef void (*keyboard_input_key_handler_t)(struct simple_im *keyboard,
enum wl_keyboard_key_state state);
struct simple_im {
struct wl_input_method *input_method;
struct wl_input_method_context *context;
struct zwp_input_method_v1 *input_method;
struct zwp_input_method_context_v1 *context;
struct wl_display *display;
struct wl_registry *registry;
struct wl_keyboard *keyboard;
@@ -105,7 +105,7 @@ static const uint32_t ignore_keys_on_compose[] = {
static void
handle_surrounding_text(void *data,
struct wl_input_method_context *context,
struct zwp_input_method_context_v1 *context,
const char *text,
uint32_t cursor,
uint32_t anchor)
@@ -115,7 +115,7 @@ handle_surrounding_text(void *data,
static void
handle_reset(void *data,
struct wl_input_method_context *context)
struct zwp_input_method_context_v1 *context)
{
struct simple_im *keyboard = data;
@@ -126,7 +126,7 @@ handle_reset(void *data,
static void
handle_content_type(void *data,
struct wl_input_method_context *context,
struct zwp_input_method_context_v1 *context,
uint32_t hint,
uint32_t purpose)
{
@@ -134,7 +134,7 @@ handle_content_type(void *data,
static void
handle_invoke_action(void *data,
struct wl_input_method_context *context,
struct zwp_input_method_context_v1 *context,
uint32_t button,
uint32_t index)
{
@@ -142,7 +142,7 @@ handle_invoke_action(void *data,
static void
handle_commit_state(void *data,
struct wl_input_method_context *context,
struct zwp_input_method_context_v1 *context,
uint32_t serial)
{
struct simple_im *keyboard = data;
@@ -152,12 +152,12 @@ handle_commit_state(void *data,
static void
handle_preferred_language(void *data,
struct wl_input_method_context *context,
struct zwp_input_method_context_v1 *context,
const char *language)
{
}
static const struct wl_input_method_context_listener input_method_context_listener = {
static const struct zwp_input_method_context_v1_listener input_method_context_listener = {
handle_surrounding_text,
handle_reset,
handle_content_type,
@@ -256,7 +256,7 @@ input_method_keyboard_modifiers(void *data,
uint32_t group)
{
struct simple_im *keyboard = data;
struct wl_input_method_context *context = keyboard->context;
struct zwp_input_method_context_v1 *context = keyboard->context;
xkb_mod_mask_t mask;
xkb_state_update_mask(keyboard->state, mods_depressed,
@@ -273,9 +273,9 @@ input_method_keyboard_modifiers(void *data,
if (mask & keyboard->shift_mask)
keyboard->modifiers |= MOD_SHIFT_MASK;
wl_input_method_context_modifiers(context, serial,
mods_depressed, mods_depressed,
mods_latched, group);
zwp_input_method_context_v1_modifiers(context, serial,
mods_depressed, mods_depressed,
mods_latched, group);
}
static const struct wl_keyboard_listener input_method_keyboard_listener = {
@@ -288,23 +288,23 @@ static const struct wl_keyboard_listener input_method_keyboard_listener = {
static void
input_method_activate(void *data,
struct wl_input_method *input_method,
struct wl_input_method_context *context)
struct zwp_input_method_v1 *input_method,
struct zwp_input_method_context_v1 *context)
{
struct simple_im *keyboard = data;
if (keyboard->context)
wl_input_method_context_destroy(keyboard->context);
zwp_input_method_context_v1_destroy(keyboard->context);
keyboard->compose_state = state_normal;
keyboard->serial = 0;
keyboard->context = context;
wl_input_method_context_add_listener(context,
&input_method_context_listener,
keyboard);
keyboard->keyboard = wl_input_method_context_grab_keyboard(context);
zwp_input_method_context_v1_add_listener(context,
&input_method_context_listener,
keyboard);
keyboard->keyboard = zwp_input_method_context_v1_grab_keyboard(context);
wl_keyboard_add_listener(keyboard->keyboard,
&input_method_keyboard_listener,
keyboard);
@@ -312,19 +312,19 @@ input_method_activate(void *data,
static void
input_method_deactivate(void *data,
struct wl_input_method *input_method,
struct wl_input_method_context *context)
struct zwp_input_method_v1 *input_method,
struct zwp_input_method_context_v1 *context)
{
struct simple_im *keyboard = data;
if (!keyboard->context)
return;
wl_input_method_context_destroy(keyboard->context);
zwp_input_method_context_v1_destroy(keyboard->context);
keyboard->context = NULL;
}
static const struct wl_input_method_listener input_method_listener = {
static const struct zwp_input_method_v1_listener input_method_listener = {
input_method_activate,
input_method_deactivate
};
@@ -335,12 +335,12 @@ registry_handle_global(void *data, struct wl_registry *registry,
{
struct simple_im *keyboard = data;
if (!strcmp(interface, "wl_input_method")) {
if (!strcmp(interface, "zwp_input_method_v1")) {
keyboard->input_method =
wl_registry_bind(registry, name,
&wl_input_method_interface, 1);
wl_input_method_add_listener(keyboard->input_method,
&input_method_listener, keyboard);
&zwp_input_method_v1_interface, 1);
zwp_input_method_v1_add_listener(keyboard->input_method,
&input_method_listener, keyboard);
}
}
@@ -379,7 +379,7 @@ simple_im_key_handler(struct simple_im *keyboard,
uint32_t serial, uint32_t time, uint32_t key, uint32_t sym,
enum wl_keyboard_key_state state)
{
struct wl_input_method_context *context = keyboard->context;
struct zwp_input_method_context_v1 *context = keyboard->context;
char text[64];
if (sym == XKB_KEY_Multi_key &&
@@ -399,7 +399,11 @@ simple_im_key_handler(struct simple_im *keyboard,
for (i = 0; i < sizeof(ignore_keys_on_compose) / sizeof(ignore_keys_on_compose[0]); i++) {
if (sym == ignore_keys_on_compose[i]) {
wl_input_method_context_key(context, keyboard->serial, time, key, state);
zwp_input_method_context_v1_key(context,
keyboard->serial,
time,
key,
state);
return;
}
}
@@ -414,16 +418,16 @@ simple_im_key_handler(struct simple_im *keyboard,
if (cs) {
if (cs->keys[i + 1] == 0) {
wl_input_method_context_preedit_cursor(keyboard->context,
0);
wl_input_method_context_preedit_string(keyboard->context,
keyboard->serial,
"", "");
wl_input_method_context_cursor_position(keyboard->context,
0, 0);
wl_input_method_context_commit_string(keyboard->context,
keyboard->serial,
cs->text);
zwp_input_method_context_v1_preedit_cursor(keyboard->context,
0);
zwp_input_method_context_v1_preedit_string(keyboard->context,
keyboard->serial,
"", "");
zwp_input_method_context_v1_cursor_position(keyboard->context,
0, 0);
zwp_input_method_context_v1_commit_string(keyboard->context,
keyboard->serial,
cs->text);
keyboard->compose_state = state_normal;
} else {
uint32_t j = 0, idx = 0;
@@ -432,12 +436,12 @@ simple_im_key_handler(struct simple_im *keyboard,
idx += xkb_keysym_to_utf8(cs->keys[j], text + idx, sizeof(text) - idx);
}
wl_input_method_context_preedit_cursor(keyboard->context,
strlen(text));
wl_input_method_context_preedit_string(keyboard->context,
keyboard->serial,
text,
text);
zwp_input_method_context_v1_preedit_cursor(keyboard->context,
strlen(text));
zwp_input_method_context_v1_preedit_string(keyboard->context,
keyboard->serial,
text,
text);
}
} else {
uint32_t j = 0, idx = 0;
@@ -445,34 +449,34 @@ simple_im_key_handler(struct simple_im *keyboard,
for (; j <= i; j++) {
idx += xkb_keysym_to_utf8(keyboard->compose_seq.keys[j], text + idx, sizeof(text) - idx);
}
wl_input_method_context_preedit_cursor(keyboard->context,
0);
wl_input_method_context_preedit_string(keyboard->context,
keyboard->serial,
"", "");
wl_input_method_context_cursor_position(keyboard->context,
0, 0);
wl_input_method_context_commit_string(keyboard->context,
keyboard->serial,
text);
zwp_input_method_context_v1_preedit_cursor(keyboard->context,
0);
zwp_input_method_context_v1_preedit_string(keyboard->context,
keyboard->serial,
"", "");
zwp_input_method_context_v1_cursor_position(keyboard->context,
0, 0);
zwp_input_method_context_v1_commit_string(keyboard->context,
keyboard->serial,
text);
keyboard->compose_state = state_normal;
}
return;
}
if (xkb_keysym_to_utf8(sym, text, sizeof(text)) <= 0) {
wl_input_method_context_key(context, serial, time, key, state);
zwp_input_method_context_v1_key(context, serial, time, key, state);
return;
}
if (state == WL_KEYBOARD_KEY_STATE_PRESSED)
return;
wl_input_method_context_cursor_position(keyboard->context,
0, 0);
wl_input_method_context_commit_string(keyboard->context,
keyboard->serial,
text);
zwp_input_method_context_v1_cursor_position(keyboard->context,
0, 0);
zwp_input_method_context_v1_commit_string(keyboard->context,
keyboard->serial,
text);
}
int