diff --git a/Dockerfile b/Dockerfile index a2ba905..778566f 100644 --- a/Dockerfile +++ b/Dockerfile @@ -13,7 +13,6 @@ RUN pacman -Syu --noconfirm --needed \ python \ ttf-dejavu \ ttf-jigmo \ - wayland \ which \ xcb-imdkit \ dbus \ diff --git a/LICENSES/README.md b/LICENSES/README.md index 49d3d33..67e519e 100644 --- a/LICENSES/README.md +++ b/LICENSES/README.md @@ -8,6 +8,5 @@ version. - License texts and provenance for the historically bundled fonts are retained in `font/`; no font binary remains in the source tree. -- Generated Wayland files include their MIT-style notices in each file. No repository-wide license has been declared for original strans source. diff --git a/Makefile b/Makefile index 65e69d2..63ce7e3 100644 --- a/Makefile +++ b/Makefile @@ -1,7 +1,7 @@ CC = 9c LD = 9l -PKG_CFLAGS = $(shell pkg-config --cflags dbus-1 wayland-client xkbcommon) -PKG_LIBS = $(shell pkg-config --libs dbus-1 wayland-client xkbcommon) +PKG_CFLAGS = $(shell pkg-config --cflags dbus-1 xkbcommon) +PKG_LIBS = $(shell pkg-config --libs dbus-1 xkbcommon) FT_CFLAGS = $(shell pkg-config --cflags freetype2) FT_LIBS = $(shell pkg-config --libs freetype2) CFLAGS = -Wall -Wextra -O2 -g $(PKG_CFLAGS) @@ -20,8 +20,6 @@ $(PROG): $(OBJS) $(OBJS): dat.h fn.h ipc.h font.o: CFLAGS += $(FT_CFLAGS) -wayland.o: input-method-unstable-v2-client-protocol.h \ - virtual-keyboard-unstable-v1-client-protocol.h clean: rm -f $(OBJS) $(PROG) diff --git a/README.md b/README.md index e1a817c..c6910cb 100644 --- a/README.md +++ b/README.md @@ -1,10 +1,9 @@ # strans strans is a small, single-user input method for Korean, Japanese, English, -and emoji on X11 and Wayland. It provides one engine shared by XIM, GTK 3, -IBus, and Wayland input-method-v2 frontends. The existing Vietnamese Telex -mode remains available for compatibility, but is not an actively developed -language mode. +and emoji. It provides one engine shared by IBus, XIM, and GTK 3 frontends. +The existing Vietnamese Telex mode remains available for compatibility, but +is not an actively developed language mode. ## Input behavior @@ -75,7 +74,7 @@ build steps. The resulting runtime artifacts are: ```text -strans daemon, IBus and Wayland frontends +strans daemon and IBus frontend xim/strans-xim XIM frontend gtk/im-strans.so GTK 3 frontend ``` @@ -152,10 +151,9 @@ For IBus clients such as kitty: GLFW_IM_MODULE=ibus kitty ``` -Wayland needs no environment variable. Start `strans` after a compositor -that supports input-method-v2. Neither ibus-daemon nor fcitx is required. -Starting without `DISPLAY` is supported: the optional X popup is disabled, -while input processing and non-X frontends continue to run. +strans provides its own IBus endpoint; neither ibus-daemon nor fcitx is +required. Starting without `DISPLAY` is supported: input processing and IBus +continue to run while the optional X popup is disabled. ## Ownership and rendering constraints @@ -165,15 +163,14 @@ composition and transfers ownership. Reset, focus loss, context destruction, and disconnect affect the engine only when they come from its active owner; stale events cannot clear a newer owner's preedit. -The popup is an optional X window, including when the active frontend is -Wayland. It uses the explicit font-file order and fixed-width rune cells; -U+FE0E and U+FE0F variation selectors use zero cells. It does not perform -OpenType shaping, color-emoji rendering, or general grapheme clustering, and -there is no native Wayland popup renderer. Multi-rune emoji are committed -intact but are drawn as their constituent rune cells under this boundary. A -supplied caret rectangle is used when available, with the pointer as fallback. -The X renderer accepts only a 24-depth, 32-bpp TrueColor root format and -disables itself cleanly on other visuals. +The popup is an optional X window. It uses the explicit font-file order and +fixed-width rune cells; U+FE0E and U+FE0F variation selectors use zero cells. +It does not perform OpenType shaping, color-emoji rendering, or general +grapheme clustering. Multi-rune emoji are committed intact but are drawn as +their constituent rune cells under this boundary. A supplied caret rectangle +is used when available, with the pointer as fallback. The X renderer accepts +only a 24-depth, 32-bpp TrueColor root format and disables itself cleanly on +other visuals. ## Data, third-party code, and licensing @@ -189,6 +186,6 @@ the BSD 3-Clause license in [`LICENSES/BSD-3-Clause-libhangul-hanja.txt`](LICENSES/BSD-3-Clause-libhangul-hanja.txt). The repository does not currently declare a license for the strans project -source as a whole. The licenses of bundled data, historical font assets, -generated protocol code, and third-party components do not by themselves -license the original strans source. +source as a whole. The licenses of bundled data, historical font assets, and +third-party components do not by themselves license the original strans +source. diff --git a/dat.h b/dat.h index 5042b1d..32b2bcc 100644 --- a/dat.h +++ b/dat.h @@ -28,7 +28,6 @@ enum Maxclients = 64, Maxkouho = 32, Maxdisp = 9, - Wlkeymax = 0x300, Imgw = (Maxrunes + 3) * Fontsz, Imgh = (Maxdisp + 1) * Fontsz, @@ -44,17 +43,6 @@ struct Str int n; }; -typedef struct Wlstate Wlstate; -struct Wlstate -{ - uchar down[Wlkeymax]; - u32int repeatkey; - uvlong repeatat; - int rate; - int delay; - int repeating; -}; - typedef struct Emit Emit; struct Emit { diff --git a/docs/PROVENANCE.md b/docs/PROVENANCE.md index dcb132e..c5b3b78 100644 --- a/docs/PROVENANCE.md +++ b/docs/PROVENANCE.md @@ -72,26 +72,6 @@ are `/usr/share/licenses/ttf-dejavu/LICENSE` and as the DejaVu custom license and CC0 1.0, respectively. These packages are test fixtures, not names or paths hard-coded into the daemon. -## Generated Wayland protocol code - -The four checked-in Wayland protocol C/header files were added in commit -`7629ec5fe8976812655c9d12b447a62abc8bb671`: - -- `input-method-unstable-v2-client-protocol.h` -- `input-method-unstable-v2-protocol.c` -- `virtual-keyboard-unstable-v1-client-protocol.h` -- `virtual-keyboard-unstable-v1-protocol.c` - -Their embedded notices identify the protocols as input-method-unstable-v2 -and virtual-keyboard-unstable-v1 and include the applicable MIT-style license -terms. The input-method files report generation by wayland-scanner 1.21.0; -the virtual-keyboard files report wayland-scanner 1.23.1. The source XML -files and their upstream repository revisions were not committed or recorded -in history, so these generated files cannot honestly be regenerated -byte-for-byte from repository artifacts. Do not edit them manually. A -future regeneration should commit the source XML or record its immutable -upstream revision and the scanner command/version. - ## Git submodules `cutest` is pinned by the repository as the unit-test framework. XIM uses diff --git a/fn.h b/fn.h index b74fc16..b474c55 100644 --- a/fn.h +++ b/fn.h @@ -42,15 +42,6 @@ uvlong ownernew(void); int srvreadkey(int, Keyreq*); void srvthread(void*); void ibusthread(void*); -void waylandthread(void*); -void wlstateinit(Wlstate*); -int wlstatepress(Wlstate*, u32int, int, int, uvlong); -int wlstaterelease(Wlstate*, u32int); -void wlstaterepeatinfo(Wlstate*, int, int); -void wlstatecancelrepeat(Wlstate*); -void wlstateclear(Wlstate*); -int wlstatetimeout(Wlstate*, uvlong); -int wlstaterepeat(Wlstate*, uvlong, u32int*); void* emalloc(ulong); void* erealloc(void*, ulong); diff --git a/input-method-unstable-v2-client-protocol.h b/input-method-unstable-v2-client-protocol.h deleted file mode 100644 index 8eaf66f..0000000 --- a/input-method-unstable-v2-client-protocol.h +++ /dev/null @@ -1,955 +0,0 @@ -/* Generated by wayland-scanner 1.21.0 */ - -#ifndef INPUT_METHOD_UNSTABLE_V2_CLIENT_PROTOCOL_H -#define INPUT_METHOD_UNSTABLE_V2_CLIENT_PROTOCOL_H - -#include -#include -#include "wayland-client.h" - -#ifdef __cplusplus -extern "C" { -#endif - -/** - * @page page_input_method_unstable_v2 The input_method_unstable_v2 protocol - * Protocol for creating input methods - * - * @section page_desc_input_method_unstable_v2 Description - * - * This protocol allows applications to act as input methods for compositors. - * - * An input method context is used to manage the state of the input method. - * - * Text strings are UTF-8 encoded, their indices and lengths are in bytes. - * - * This document adheres to the RFC 2119 when using words like "must", - * "should", "may", etc. - * - * Warning! The protocol described in this file is experimental and - * backward incompatible changes may be made. Backward compatible changes - * may be added together with the corresponding interface version bump. - * Backward incompatible changes are done by bumping the version number in - * the protocol and interface names and resetting the interface version. - * Once the protocol is to be declared stable, the 'z' prefix and the - * version number in the protocol and interface names are removed and the - * interface version number is reset. - * - * @section page_ifaces_input_method_unstable_v2 Interfaces - * - @subpage page_iface_zwp_input_method_v2 - input method - * - @subpage page_iface_zwp_input_popup_surface_v2 - popup surface - * - @subpage page_iface_zwp_input_method_keyboard_grab_v2 - keyboard grab - * - @subpage page_iface_zwp_input_method_manager_v2 - input method manager - * @section page_copyright_input_method_unstable_v2 Copyright - *
- *
- * Copyright © 2008-2011 Kristian Høgsberg
- * Copyright © 2010-2011 Intel Corporation
- * Copyright © 2012-2013 Collabora, Ltd.
- * Copyright © 2012, 2013 Intel Corporation
- * Copyright © 2015, 2016 Jan Arne Petersen
- * Copyright © 2017, 2018 Red Hat, Inc.
- * Copyright © 2018       Purism SPC
- *
- * Permission is hereby granted, free of charge, to any person obtaining a
- * copy of this software and associated documentation files (the "Software"),
- * to deal in the Software without restriction, including without limitation
- * the rights to use, copy, modify, merge, publish, distribute, sublicense,
- * and/or sell copies of the Software, and to permit persons to whom the
- * Software is furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice (including the next
- * paragraph) shall be included in all copies or substantial portions of the
- * Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
- * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
- * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
- * DEALINGS IN THE SOFTWARE.
- * 
- */ -struct wl_seat; -struct wl_surface; -struct zwp_input_method_keyboard_grab_v2; -struct zwp_input_method_manager_v2; -struct zwp_input_method_v2; -struct zwp_input_popup_surface_v2; - -#ifndef ZWP_INPUT_METHOD_V2_INTERFACE -#define ZWP_INPUT_METHOD_V2_INTERFACE -/** - * @page page_iface_zwp_input_method_v2 zwp_input_method_v2 - * @section page_iface_zwp_input_method_v2_desc Description - * - * An input method object allows for clients to compose text. - * - * The objects connects the client to a text input in an application, and - * lets the client to serve as an input method for a seat. - * - * The zwp_input_method_v2 object can occupy two distinct states: active and - * inactive. In the active state, the object is associated to and - * communicates with a text input. In the inactive state, there is no - * associated text input, and the only communication is with the compositor. - * Initially, the input method is in the inactive state. - * - * Requests issued in the inactive state must be accepted by the compositor. - * Because of the serial mechanism, and the state reset on activate event, - * they will not have any effect on the state of the next text input. - * - * There must be no more than one input method object per seat. - * @section page_iface_zwp_input_method_v2_api API - * See @ref iface_zwp_input_method_v2. - */ -/** - * @defgroup iface_zwp_input_method_v2 The zwp_input_method_v2 interface - * - * An input method object allows for clients to compose text. - * - * The objects connects the client to a text input in an application, and - * lets the client to serve as an input method for a seat. - * - * The zwp_input_method_v2 object can occupy two distinct states: active and - * inactive. In the active state, the object is associated to and - * communicates with a text input. In the inactive state, there is no - * associated text input, and the only communication is with the compositor. - * Initially, the input method is in the inactive state. - * - * Requests issued in the inactive state must be accepted by the compositor. - * Because of the serial mechanism, and the state reset on activate event, - * they will not have any effect on the state of the next text input. - * - * There must be no more than one input method object per seat. - */ -extern const struct wl_interface zwp_input_method_v2_interface; -#endif -#ifndef ZWP_INPUT_POPUP_SURFACE_V2_INTERFACE -#define ZWP_INPUT_POPUP_SURFACE_V2_INTERFACE -/** - * @page page_iface_zwp_input_popup_surface_v2 zwp_input_popup_surface_v2 - * @section page_iface_zwp_input_popup_surface_v2_desc Description - * - * This interface marks a surface as a popup for interacting with an input - * method. - * - * The compositor should place it near the active text input area. It must - * be visible if and only if the input method is in the active state. - * - * The client must not destroy the underlying wl_surface while the - * zwp_input_popup_surface_v2 object exists. - * @section page_iface_zwp_input_popup_surface_v2_api API - * See @ref iface_zwp_input_popup_surface_v2. - */ -/** - * @defgroup iface_zwp_input_popup_surface_v2 The zwp_input_popup_surface_v2 interface - * - * This interface marks a surface as a popup for interacting with an input - * method. - * - * The compositor should place it near the active text input area. It must - * be visible if and only if the input method is in the active state. - * - * The client must not destroy the underlying wl_surface while the - * zwp_input_popup_surface_v2 object exists. - */ -extern const struct wl_interface zwp_input_popup_surface_v2_interface; -#endif -#ifndef ZWP_INPUT_METHOD_KEYBOARD_GRAB_V2_INTERFACE -#define ZWP_INPUT_METHOD_KEYBOARD_GRAB_V2_INTERFACE -/** - * @page page_iface_zwp_input_method_keyboard_grab_v2 zwp_input_method_keyboard_grab_v2 - * @section page_iface_zwp_input_method_keyboard_grab_v2_desc Description - * - * The zwp_input_method_keyboard_grab_v2 interface represents an exclusive - * grab of the wl_keyboard interface associated with the seat. - * @section page_iface_zwp_input_method_keyboard_grab_v2_api API - * See @ref iface_zwp_input_method_keyboard_grab_v2. - */ -/** - * @defgroup iface_zwp_input_method_keyboard_grab_v2 The zwp_input_method_keyboard_grab_v2 interface - * - * The zwp_input_method_keyboard_grab_v2 interface represents an exclusive - * grab of the wl_keyboard interface associated with the seat. - */ -extern const struct wl_interface zwp_input_method_keyboard_grab_v2_interface; -#endif -#ifndef ZWP_INPUT_METHOD_MANAGER_V2_INTERFACE -#define ZWP_INPUT_METHOD_MANAGER_V2_INTERFACE -/** - * @page page_iface_zwp_input_method_manager_v2 zwp_input_method_manager_v2 - * @section page_iface_zwp_input_method_manager_v2_desc Description - * - * The input method manager allows the client to become the input method on - * a chosen seat. - * - * No more than one input method must be associated with any seat at any - * given time. - * @section page_iface_zwp_input_method_manager_v2_api API - * See @ref iface_zwp_input_method_manager_v2. - */ -/** - * @defgroup iface_zwp_input_method_manager_v2 The zwp_input_method_manager_v2 interface - * - * The input method manager allows the client to become the input method on - * a chosen seat. - * - * No more than one input method must be associated with any seat at any - * given time. - */ -extern const struct wl_interface zwp_input_method_manager_v2_interface; -#endif - -#ifndef ZWP_INPUT_METHOD_V2_ERROR_ENUM -#define ZWP_INPUT_METHOD_V2_ERROR_ENUM -enum zwp_input_method_v2_error { - /** - * wl_surface has another role - */ - ZWP_INPUT_METHOD_V2_ERROR_ROLE = 0, -}; -#endif /* ZWP_INPUT_METHOD_V2_ERROR_ENUM */ - -/** - * @ingroup iface_zwp_input_method_v2 - * @struct zwp_input_method_v2_listener - */ -struct zwp_input_method_v2_listener { - /** - * input method has been requested - * - * Notification that a text input focused on this seat requested - * the input method to be activated. - * - * This event serves the purpose of providing the compositor with - * an active input method. - * - * This event resets all state associated with previous - * surrounding_text, text_change_cause, and content_type events, as - * well as the state associated with set_preedit_string, - * commit_string, and delete_surrounding_text requests. In - * addition, it marks the zwp_input_method_v2 object as active, and - * makes any existing zwp_input_popup_surface_v2 objects visible. - * - * The surrounding_text, and content_type events must follow before - * the next done event if the text input supports the respective - * functionality. - * - * State set with this event is double-buffered. It will get - * applied on the next zwp_input_method_v2.done event, and stay - * valid until changed. - */ - void (*activate)(void *data, - struct zwp_input_method_v2 *zwp_input_method_v2); - /** - * deactivate event - * - * Notification that no focused text input currently needs an - * active input method on this seat. - * - * This event marks the zwp_input_method_v2 object as inactive. The - * compositor must make all existing zwp_input_popup_surface_v2 - * objects invisible until the next activate event. - * - * State set with this event is double-buffered. It will get - * applied on the next zwp_input_method_v2.done event, and stay - * valid until changed. - */ - void (*deactivate)(void *data, - struct zwp_input_method_v2 *zwp_input_method_v2); - /** - * surrounding text event - * - * Updates the surrounding plain text around the cursor, - * excluding the preedit text. - * - * If any preedit text is present, it is replaced with the cursor - * for the purpose of this event. - * - * The argument text is a buffer containing the surrounding text, - * and must include the cursor position, and the complete - * selection. It should contain additional characters before and - * after these. There is a maximum length of wayland messages, so - * text can not be longer than 4000 bytes. - * - * cursor is the byte offset of the cursor within the text buffer. - * - * anchor is the byte offset of the selection anchor within the - * text buffer. If there is no selected text, anchor must be the - * same as cursor. - * - * If this event does not arrive before the first done event, the - * input method may assume that the text input does not support - * this functionality and ignore following surrounding_text events. - * - * Values set with this event are double-buffered. They will get - * applied and set to initial values on the next - * zwp_input_method_v2.done event. - * - * The initial state for affected fields is empty, meaning that the - * text input does not support sending surrounding text. If the - * empty values get applied, subsequent attempts to change them may - * have no effect. - */ - void (*surrounding_text)(void *data, - struct zwp_input_method_v2 *zwp_input_method_v2, - const char *text, - uint32_t cursor, - uint32_t anchor); - /** - * indicates the cause of surrounding text change - * - * Tells the input method why the text surrounding the cursor - * changed. - * - * Whenever the client detects an external change in text, cursor, - * or anchor position, it must issue this request to the - * compositor. This request is intended to give the input method a - * chance to update the preedit text in an appropriate way, e.g. by - * removing it when the user starts typing with a keyboard. - * - * cause describes the source of the change. - * - * The value set with this event is double-buffered. It will get - * applied and set to its initial value on the next - * zwp_input_method_v2.done event. - * - * The initial value of cause is input_method. - */ - void (*text_change_cause)(void *data, - struct zwp_input_method_v2 *zwp_input_method_v2, - uint32_t cause); - /** - * content purpose and hint - * - * Indicates the content type and hint for the current - * zwp_input_method_v2 instance. - * - * Values set with this event are double-buffered. They will get - * applied on the next zwp_input_method_v2.done event. - * - * The initial value for hint is none, and the initial value for - * purpose is normal. - */ - void (*content_type)(void *data, - struct zwp_input_method_v2 *zwp_input_method_v2, - uint32_t hint, - uint32_t purpose); - /** - * apply state - * - * Atomically applies state changes recently sent to the client. - * - * The done event establishes and updates the state of the client, - * and must be issued after any changes to apply them. - * - * Text input state (content purpose, content hint, surrounding - * text, and change cause) is conceptually double-buffered within - * an input method context. - * - * Events modify the pending state, as opposed to the current state - * in use by the input method. A done event atomically applies all - * pending state, replacing the current state. After done, the new - * pending state is as documented for each related request. - * - * Events must be applied in the order of arrival. - * - * Neither current nor pending state are modified unless noted - * otherwise. - */ - void (*done)(void *data, - struct zwp_input_method_v2 *zwp_input_method_v2); - /** - * input method unavailable - * - * The input method ceased to be available. - * - * The compositor must issue this event as the only event on the - * object if there was another input_method object associated with - * the same seat at the time of its creation. - * - * The compositor must issue this request when the object is no - * longer usable, e.g. due to seat removal. - * - * The input method context becomes inert and should be destroyed - * after deactivation is handled. Any further requests and events - * except for the destroy request must be ignored. - */ - void (*unavailable)(void *data, - struct zwp_input_method_v2 *zwp_input_method_v2); -}; - -/** - * @ingroup iface_zwp_input_method_v2 - */ -static inline int -zwp_input_method_v2_add_listener(struct zwp_input_method_v2 *zwp_input_method_v2, - const struct zwp_input_method_v2_listener *listener, void *data) -{ - return wl_proxy_add_listener((struct wl_proxy *) zwp_input_method_v2, - (void (**)(void)) listener, data); -} - -#define ZWP_INPUT_METHOD_V2_COMMIT_STRING 0 -#define ZWP_INPUT_METHOD_V2_SET_PREEDIT_STRING 1 -#define ZWP_INPUT_METHOD_V2_DELETE_SURROUNDING_TEXT 2 -#define ZWP_INPUT_METHOD_V2_COMMIT 3 -#define ZWP_INPUT_METHOD_V2_GET_INPUT_POPUP_SURFACE 4 -#define ZWP_INPUT_METHOD_V2_GRAB_KEYBOARD 5 -#define ZWP_INPUT_METHOD_V2_DESTROY 6 - -/** - * @ingroup iface_zwp_input_method_v2 - */ -#define ZWP_INPUT_METHOD_V2_ACTIVATE_SINCE_VERSION 1 -/** - * @ingroup iface_zwp_input_method_v2 - */ -#define ZWP_INPUT_METHOD_V2_DEACTIVATE_SINCE_VERSION 1 -/** - * @ingroup iface_zwp_input_method_v2 - */ -#define ZWP_INPUT_METHOD_V2_SURROUNDING_TEXT_SINCE_VERSION 1 -/** - * @ingroup iface_zwp_input_method_v2 - */ -#define ZWP_INPUT_METHOD_V2_TEXT_CHANGE_CAUSE_SINCE_VERSION 1 -/** - * @ingroup iface_zwp_input_method_v2 - */ -#define ZWP_INPUT_METHOD_V2_CONTENT_TYPE_SINCE_VERSION 1 -/** - * @ingroup iface_zwp_input_method_v2 - */ -#define ZWP_INPUT_METHOD_V2_DONE_SINCE_VERSION 1 -/** - * @ingroup iface_zwp_input_method_v2 - */ -#define ZWP_INPUT_METHOD_V2_UNAVAILABLE_SINCE_VERSION 1 - -/** - * @ingroup iface_zwp_input_method_v2 - */ -#define ZWP_INPUT_METHOD_V2_COMMIT_STRING_SINCE_VERSION 1 -/** - * @ingroup iface_zwp_input_method_v2 - */ -#define ZWP_INPUT_METHOD_V2_SET_PREEDIT_STRING_SINCE_VERSION 1 -/** - * @ingroup iface_zwp_input_method_v2 - */ -#define ZWP_INPUT_METHOD_V2_DELETE_SURROUNDING_TEXT_SINCE_VERSION 1 -/** - * @ingroup iface_zwp_input_method_v2 - */ -#define ZWP_INPUT_METHOD_V2_COMMIT_SINCE_VERSION 1 -/** - * @ingroup iface_zwp_input_method_v2 - */ -#define ZWP_INPUT_METHOD_V2_GET_INPUT_POPUP_SURFACE_SINCE_VERSION 1 -/** - * @ingroup iface_zwp_input_method_v2 - */ -#define ZWP_INPUT_METHOD_V2_GRAB_KEYBOARD_SINCE_VERSION 1 -/** - * @ingroup iface_zwp_input_method_v2 - */ -#define ZWP_INPUT_METHOD_V2_DESTROY_SINCE_VERSION 1 - -/** @ingroup iface_zwp_input_method_v2 */ -static inline void -zwp_input_method_v2_set_user_data(struct zwp_input_method_v2 *zwp_input_method_v2, void *user_data) -{ - wl_proxy_set_user_data((struct wl_proxy *) zwp_input_method_v2, user_data); -} - -/** @ingroup iface_zwp_input_method_v2 */ -static inline void * -zwp_input_method_v2_get_user_data(struct zwp_input_method_v2 *zwp_input_method_v2) -{ - return wl_proxy_get_user_data((struct wl_proxy *) zwp_input_method_v2); -} - -static inline uint32_t -zwp_input_method_v2_get_version(struct zwp_input_method_v2 *zwp_input_method_v2) -{ - return wl_proxy_get_version((struct wl_proxy *) zwp_input_method_v2); -} - -/** - * @ingroup iface_zwp_input_method_v2 - * - * Send the commit string text for insertion to the application. - * - * Inserts a string at current cursor position (see commit event - * sequence). The string to commit could be either just a single character - * after a key press or the result of some composing. - * - * The argument text is a buffer containing the string to insert. There is - * a maximum length of wayland messages, so text can not be longer than - * 4000 bytes. - * - * Values set with this event are double-buffered. They must be applied - * and reset to initial on the next zwp_text_input_v3.commit request. - * - * The initial value of text is an empty string. - */ -static inline void -zwp_input_method_v2_commit_string(struct zwp_input_method_v2 *zwp_input_method_v2, const char *text) -{ - wl_proxy_marshal_flags((struct wl_proxy *) zwp_input_method_v2, - ZWP_INPUT_METHOD_V2_COMMIT_STRING, NULL, wl_proxy_get_version((struct wl_proxy *) zwp_input_method_v2), 0, text); -} - -/** - * @ingroup iface_zwp_input_method_v2 - * - * Send the pre-edit string text to the application text input. - * - * Place a new composing text (pre-edit) at the current cursor position. - * Any previously set composing text must be removed. Any previously - * existing selected text must be removed. The cursor is moved to a new - * position within the preedit string. - * - * The argument text is a buffer containing the preedit string. There is - * a maximum length of wayland messages, so text can not be longer than - * 4000 bytes. - * - * The arguments cursor_begin and cursor_end are counted in bytes relative - * to the beginning of the submitted string buffer. Cursor should be - * hidden by the text input when both are equal to -1. - * - * cursor_begin indicates the beginning of the cursor. cursor_end - * indicates the end of the cursor. It may be equal or different than - * cursor_begin. - * - * Values set with this event are double-buffered. They must be applied on - * the next zwp_input_method_v2.commit event. - * - * The initial value of text is an empty string. The initial value of - * cursor_begin, and cursor_end are both 0. - */ -static inline void -zwp_input_method_v2_set_preedit_string(struct zwp_input_method_v2 *zwp_input_method_v2, const char *text, int32_t cursor_begin, int32_t cursor_end) -{ - wl_proxy_marshal_flags((struct wl_proxy *) zwp_input_method_v2, - ZWP_INPUT_METHOD_V2_SET_PREEDIT_STRING, NULL, wl_proxy_get_version((struct wl_proxy *) zwp_input_method_v2), 0, text, cursor_begin, cursor_end); -} - -/** - * @ingroup iface_zwp_input_method_v2 - * - * Remove the surrounding text. - * - * before_length and after_length are the number of bytes before and after - * the current cursor index (excluding the preedit text) to delete. - * - * If any preedit text is present, it is replaced with the cursor for the - * purpose of this event. In effect before_length is counted from the - * beginning of preedit text, and after_length from its end (see commit - * event sequence). - * - * Values set with this event are double-buffered. They must be applied - * and reset to initial on the next zwp_input_method_v2.commit request. - * - * The initial values of both before_length and after_length are 0. - */ -static inline void -zwp_input_method_v2_delete_surrounding_text(struct zwp_input_method_v2 *zwp_input_method_v2, uint32_t before_length, uint32_t after_length) -{ - wl_proxy_marshal_flags((struct wl_proxy *) zwp_input_method_v2, - ZWP_INPUT_METHOD_V2_DELETE_SURROUNDING_TEXT, NULL, wl_proxy_get_version((struct wl_proxy *) zwp_input_method_v2), 0, before_length, after_length); -} - -/** - * @ingroup iface_zwp_input_method_v2 - * - * Apply state changes from commit_string, set_preedit_string and - * delete_surrounding_text requests. - * - * The state relating to these events is double-buffered, and each one - * modifies the pending state. This request replaces the current state - * with the pending state. - * - * The connected text input is expected to proceed by evaluating the - * changes in the following order: - * - * 1. Replace existing preedit string with the cursor. - * 2. Delete requested surrounding text. - * 3. Insert commit string with the cursor at its end. - * 4. Calculate surrounding text to send. - * 5. Insert new preedit text in cursor position. - * 6. Place cursor inside preedit text. - * - * The serial number reflects the last state of the zwp_input_method_v2 - * object known to the client. The value of the serial argument must be - * equal to the number of done events already issued by that object. When - * the compositor receives a commit request with a serial different than - * the number of past done events, it must proceed as normal, except it - * should not change the current state of the zwp_input_method_v2 object. - */ -static inline void -zwp_input_method_v2_commit(struct zwp_input_method_v2 *zwp_input_method_v2, uint32_t serial) -{ - wl_proxy_marshal_flags((struct wl_proxy *) zwp_input_method_v2, - ZWP_INPUT_METHOD_V2_COMMIT, NULL, wl_proxy_get_version((struct wl_proxy *) zwp_input_method_v2), 0, serial); -} - -/** - * @ingroup iface_zwp_input_method_v2 - * - * Creates a new zwp_input_popup_surface_v2 object wrapping a given - * surface. - * - * The surface gets assigned the "input_popup" role. If the surface - * already has an assigned role, the compositor must issue a protocol - * error. - */ -static inline struct zwp_input_popup_surface_v2 * -zwp_input_method_v2_get_input_popup_surface(struct zwp_input_method_v2 *zwp_input_method_v2, struct wl_surface *surface) -{ - struct wl_proxy *id; - - id = wl_proxy_marshal_flags((struct wl_proxy *) zwp_input_method_v2, - ZWP_INPUT_METHOD_V2_GET_INPUT_POPUP_SURFACE, &zwp_input_popup_surface_v2_interface, wl_proxy_get_version((struct wl_proxy *) zwp_input_method_v2), 0, NULL, surface); - - return (struct zwp_input_popup_surface_v2 *) id; -} - -/** - * @ingroup iface_zwp_input_method_v2 - * - * Allow an input method to receive hardware keyboard input and process - * key events to generate text events (with pre-edit) over the wire. This - * allows input methods which compose multiple key events for inputting - * text like it is done for CJK languages. - * - * The compositor should send all keyboard events on the seat to the grab - * holder via the returned wl_keyboard object. Nevertheless, the - * compositor may decide not to forward any particular event. The - * compositor must not further process any event after it has been - * forwarded to the grab holder. - * - * Releasing the resulting wl_keyboard object releases the grab. - */ -static inline struct zwp_input_method_keyboard_grab_v2 * -zwp_input_method_v2_grab_keyboard(struct zwp_input_method_v2 *zwp_input_method_v2) -{ - struct wl_proxy *keyboard; - - keyboard = wl_proxy_marshal_flags((struct wl_proxy *) zwp_input_method_v2, - ZWP_INPUT_METHOD_V2_GRAB_KEYBOARD, &zwp_input_method_keyboard_grab_v2_interface, wl_proxy_get_version((struct wl_proxy *) zwp_input_method_v2), 0, NULL); - - return (struct zwp_input_method_keyboard_grab_v2 *) keyboard; -} - -/** - * @ingroup iface_zwp_input_method_v2 - * - * Destroys the zwp_text_input_v2 object and any associated child - * objects, i.e. zwp_input_popup_surface_v2 and - * zwp_input_method_keyboard_grab_v2. - */ -static inline void -zwp_input_method_v2_destroy(struct zwp_input_method_v2 *zwp_input_method_v2) -{ - wl_proxy_marshal_flags((struct wl_proxy *) zwp_input_method_v2, - ZWP_INPUT_METHOD_V2_DESTROY, NULL, wl_proxy_get_version((struct wl_proxy *) zwp_input_method_v2), WL_MARSHAL_FLAG_DESTROY); -} - -/** - * @ingroup iface_zwp_input_popup_surface_v2 - * @struct zwp_input_popup_surface_v2_listener - */ -struct zwp_input_popup_surface_v2_listener { - /** - * set text input area position - * - * Notify about the position of the area of the text input - * expressed as a rectangle in surface local coordinates. - * - * This is a hint to the input method telling it the relative - * position of the text being entered. - */ - void (*text_input_rectangle)(void *data, - struct zwp_input_popup_surface_v2 *zwp_input_popup_surface_v2, - int32_t x, - int32_t y, - int32_t width, - int32_t height); -}; - -/** - * @ingroup iface_zwp_input_popup_surface_v2 - */ -static inline int -zwp_input_popup_surface_v2_add_listener(struct zwp_input_popup_surface_v2 *zwp_input_popup_surface_v2, - const struct zwp_input_popup_surface_v2_listener *listener, void *data) -{ - return wl_proxy_add_listener((struct wl_proxy *) zwp_input_popup_surface_v2, - (void (**)(void)) listener, data); -} - -#define ZWP_INPUT_POPUP_SURFACE_V2_DESTROY 0 - -/** - * @ingroup iface_zwp_input_popup_surface_v2 - */ -#define ZWP_INPUT_POPUP_SURFACE_V2_TEXT_INPUT_RECTANGLE_SINCE_VERSION 1 - -/** - * @ingroup iface_zwp_input_popup_surface_v2 - */ -#define ZWP_INPUT_POPUP_SURFACE_V2_DESTROY_SINCE_VERSION 1 - -/** @ingroup iface_zwp_input_popup_surface_v2 */ -static inline void -zwp_input_popup_surface_v2_set_user_data(struct zwp_input_popup_surface_v2 *zwp_input_popup_surface_v2, void *user_data) -{ - wl_proxy_set_user_data((struct wl_proxy *) zwp_input_popup_surface_v2, user_data); -} - -/** @ingroup iface_zwp_input_popup_surface_v2 */ -static inline void * -zwp_input_popup_surface_v2_get_user_data(struct zwp_input_popup_surface_v2 *zwp_input_popup_surface_v2) -{ - return wl_proxy_get_user_data((struct wl_proxy *) zwp_input_popup_surface_v2); -} - -static inline uint32_t -zwp_input_popup_surface_v2_get_version(struct zwp_input_popup_surface_v2 *zwp_input_popup_surface_v2) -{ - return wl_proxy_get_version((struct wl_proxy *) zwp_input_popup_surface_v2); -} - -/** - * @ingroup iface_zwp_input_popup_surface_v2 - */ -static inline void -zwp_input_popup_surface_v2_destroy(struct zwp_input_popup_surface_v2 *zwp_input_popup_surface_v2) -{ - wl_proxy_marshal_flags((struct wl_proxy *) zwp_input_popup_surface_v2, - ZWP_INPUT_POPUP_SURFACE_V2_DESTROY, NULL, wl_proxy_get_version((struct wl_proxy *) zwp_input_popup_surface_v2), WL_MARSHAL_FLAG_DESTROY); -} - -/** - * @ingroup iface_zwp_input_method_keyboard_grab_v2 - * @struct zwp_input_method_keyboard_grab_v2_listener - */ -struct zwp_input_method_keyboard_grab_v2_listener { - /** - * keyboard mapping - * - * This event provides a file descriptor to the client which can - * be memory-mapped to provide a keyboard mapping description. - * @param format keymap format - * @param fd keymap file descriptor - * @param size keymap size, in bytes - */ - void (*keymap)(void *data, - struct zwp_input_method_keyboard_grab_v2 *zwp_input_method_keyboard_grab_v2, - uint32_t format, - int32_t fd, - uint32_t size); - /** - * key event - * - * A key was pressed or released. The time argument is a - * timestamp with millisecond granularity, with an undefined base. - * @param serial serial number of the key event - * @param time timestamp with millisecond granularity - * @param key key that produced the event - * @param state physical state of the key - */ - void (*key)(void *data, - struct zwp_input_method_keyboard_grab_v2 *zwp_input_method_keyboard_grab_v2, - uint32_t serial, - uint32_t time, - uint32_t key, - uint32_t state); - /** - * modifier and group state - * - * Notifies clients that the modifier and/or group state has - * changed, and it should update its local state. - * @param serial serial number of the modifiers event - * @param mods_depressed depressed modifiers - * @param mods_latched latched modifiers - * @param mods_locked locked modifiers - * @param group keyboard layout - */ - void (*modifiers)(void *data, - struct zwp_input_method_keyboard_grab_v2 *zwp_input_method_keyboard_grab_v2, - uint32_t serial, - uint32_t mods_depressed, - uint32_t mods_latched, - uint32_t mods_locked, - uint32_t group); - /** - * repeat rate and delay - * - * Informs the client about the keyboard's repeat rate and delay. - * - * This event is sent as soon as the - * zwp_input_method_keyboard_grab_v2 object has been created, and - * is guaranteed to be received by the client before any key press - * event. - * - * Negative values for either rate or delay are illegal. A rate of - * zero will disable any repeating (regardless of the value of - * delay). - * - * This event can be sent later on as well with a new value if - * necessary, so clients should continue listening for the event - * past the creation of zwp_input_method_keyboard_grab_v2. - * @param rate the rate of repeating keys in characters per second - * @param delay delay in milliseconds since key down until repeating starts - */ - void (*repeat_info)(void *data, - struct zwp_input_method_keyboard_grab_v2 *zwp_input_method_keyboard_grab_v2, - int32_t rate, - int32_t delay); -}; - -/** - * @ingroup iface_zwp_input_method_keyboard_grab_v2 - */ -static inline int -zwp_input_method_keyboard_grab_v2_add_listener(struct zwp_input_method_keyboard_grab_v2 *zwp_input_method_keyboard_grab_v2, - const struct zwp_input_method_keyboard_grab_v2_listener *listener, void *data) -{ - return wl_proxy_add_listener((struct wl_proxy *) zwp_input_method_keyboard_grab_v2, - (void (**)(void)) listener, data); -} - -#define ZWP_INPUT_METHOD_KEYBOARD_GRAB_V2_RELEASE 0 - -/** - * @ingroup iface_zwp_input_method_keyboard_grab_v2 - */ -#define ZWP_INPUT_METHOD_KEYBOARD_GRAB_V2_KEYMAP_SINCE_VERSION 1 -/** - * @ingroup iface_zwp_input_method_keyboard_grab_v2 - */ -#define ZWP_INPUT_METHOD_KEYBOARD_GRAB_V2_KEY_SINCE_VERSION 1 -/** - * @ingroup iface_zwp_input_method_keyboard_grab_v2 - */ -#define ZWP_INPUT_METHOD_KEYBOARD_GRAB_V2_MODIFIERS_SINCE_VERSION 1 -/** - * @ingroup iface_zwp_input_method_keyboard_grab_v2 - */ -#define ZWP_INPUT_METHOD_KEYBOARD_GRAB_V2_REPEAT_INFO_SINCE_VERSION 1 - -/** - * @ingroup iface_zwp_input_method_keyboard_grab_v2 - */ -#define ZWP_INPUT_METHOD_KEYBOARD_GRAB_V2_RELEASE_SINCE_VERSION 1 - -/** @ingroup iface_zwp_input_method_keyboard_grab_v2 */ -static inline void -zwp_input_method_keyboard_grab_v2_set_user_data(struct zwp_input_method_keyboard_grab_v2 *zwp_input_method_keyboard_grab_v2, void *user_data) -{ - wl_proxy_set_user_data((struct wl_proxy *) zwp_input_method_keyboard_grab_v2, user_data); -} - -/** @ingroup iface_zwp_input_method_keyboard_grab_v2 */ -static inline void * -zwp_input_method_keyboard_grab_v2_get_user_data(struct zwp_input_method_keyboard_grab_v2 *zwp_input_method_keyboard_grab_v2) -{ - return wl_proxy_get_user_data((struct wl_proxy *) zwp_input_method_keyboard_grab_v2); -} - -static inline uint32_t -zwp_input_method_keyboard_grab_v2_get_version(struct zwp_input_method_keyboard_grab_v2 *zwp_input_method_keyboard_grab_v2) -{ - return wl_proxy_get_version((struct wl_proxy *) zwp_input_method_keyboard_grab_v2); -} - -/** @ingroup iface_zwp_input_method_keyboard_grab_v2 */ -static inline void -zwp_input_method_keyboard_grab_v2_destroy(struct zwp_input_method_keyboard_grab_v2 *zwp_input_method_keyboard_grab_v2) -{ - wl_proxy_destroy((struct wl_proxy *) zwp_input_method_keyboard_grab_v2); -} - -/** - * @ingroup iface_zwp_input_method_keyboard_grab_v2 - */ -static inline void -zwp_input_method_keyboard_grab_v2_release(struct zwp_input_method_keyboard_grab_v2 *zwp_input_method_keyboard_grab_v2) -{ - wl_proxy_marshal_flags((struct wl_proxy *) zwp_input_method_keyboard_grab_v2, - ZWP_INPUT_METHOD_KEYBOARD_GRAB_V2_RELEASE, NULL, wl_proxy_get_version((struct wl_proxy *) zwp_input_method_keyboard_grab_v2), WL_MARSHAL_FLAG_DESTROY); -} - -#define ZWP_INPUT_METHOD_MANAGER_V2_GET_INPUT_METHOD 0 -#define ZWP_INPUT_METHOD_MANAGER_V2_DESTROY 1 - - -/** - * @ingroup iface_zwp_input_method_manager_v2 - */ -#define ZWP_INPUT_METHOD_MANAGER_V2_GET_INPUT_METHOD_SINCE_VERSION 1 -/** - * @ingroup iface_zwp_input_method_manager_v2 - */ -#define ZWP_INPUT_METHOD_MANAGER_V2_DESTROY_SINCE_VERSION 1 - -/** @ingroup iface_zwp_input_method_manager_v2 */ -static inline void -zwp_input_method_manager_v2_set_user_data(struct zwp_input_method_manager_v2 *zwp_input_method_manager_v2, void *user_data) -{ - wl_proxy_set_user_data((struct wl_proxy *) zwp_input_method_manager_v2, user_data); -} - -/** @ingroup iface_zwp_input_method_manager_v2 */ -static inline void * -zwp_input_method_manager_v2_get_user_data(struct zwp_input_method_manager_v2 *zwp_input_method_manager_v2) -{ - return wl_proxy_get_user_data((struct wl_proxy *) zwp_input_method_manager_v2); -} - -static inline uint32_t -zwp_input_method_manager_v2_get_version(struct zwp_input_method_manager_v2 *zwp_input_method_manager_v2) -{ - return wl_proxy_get_version((struct wl_proxy *) zwp_input_method_manager_v2); -} - -/** - * @ingroup iface_zwp_input_method_manager_v2 - * - * Request a new input zwp_input_method_v2 object associated with a given - * seat. - */ -static inline struct zwp_input_method_v2 * -zwp_input_method_manager_v2_get_input_method(struct zwp_input_method_manager_v2 *zwp_input_method_manager_v2, struct wl_seat *seat) -{ - struct wl_proxy *input_method; - - input_method = wl_proxy_marshal_flags((struct wl_proxy *) zwp_input_method_manager_v2, - ZWP_INPUT_METHOD_MANAGER_V2_GET_INPUT_METHOD, &zwp_input_method_v2_interface, wl_proxy_get_version((struct wl_proxy *) zwp_input_method_manager_v2), 0, seat, NULL); - - return (struct zwp_input_method_v2 *) input_method; -} - -/** - * @ingroup iface_zwp_input_method_manager_v2 - * - * Destroys the zwp_input_method_manager_v2 object. - * - * The zwp_input_method_v2 objects originating from it remain valid. - */ -static inline void -zwp_input_method_manager_v2_destroy(struct zwp_input_method_manager_v2 *zwp_input_method_manager_v2) -{ - wl_proxy_marshal_flags((struct wl_proxy *) zwp_input_method_manager_v2, - ZWP_INPUT_METHOD_MANAGER_V2_DESTROY, NULL, wl_proxy_get_version((struct wl_proxy *) zwp_input_method_manager_v2), WL_MARSHAL_FLAG_DESTROY); -} - -#ifdef __cplusplus -} -#endif - -#endif diff --git a/input-method-unstable-v2-protocol.c b/input-method-unstable-v2-protocol.c deleted file mode 100644 index 9e49406..0000000 --- a/input-method-unstable-v2-protocol.c +++ /dev/null @@ -1,132 +0,0 @@ -/* Generated by wayland-scanner 1.21.0 */ - -/* - * Copyright © 2008-2011 Kristian Høgsberg - * Copyright © 2010-2011 Intel Corporation - * Copyright © 2012-2013 Collabora, Ltd. - * Copyright © 2012, 2013 Intel Corporation - * Copyright © 2015, 2016 Jan Arne Petersen - * Copyright © 2017, 2018 Red Hat, Inc. - * Copyright © 2018 Purism SPC - * - * Permission is hereby granted, free of charge, to any person obtaining a - * copy of this software and associated documentation files (the "Software"), - * to deal in the Software without restriction, including without limitation - * the rights to use, copy, modify, merge, publish, distribute, sublicense, - * and/or sell copies of the Software, and to permit persons to whom the - * Software is furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice (including the next - * paragraph) shall be included in all copies or substantial portions of the - * Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL - * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING - * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER - * DEALINGS IN THE SOFTWARE. - */ - -#include -#include -#include "wayland-util.h" - -#ifndef __has_attribute -# define __has_attribute(x) 0 /* Compatibility with non-clang compilers. */ -#endif - -#if (__has_attribute(visibility) || defined(__GNUC__) && __GNUC__ >= 4) -#define WL_PRIVATE __attribute__ ((visibility("hidden"))) -#else -#define WL_PRIVATE -#endif - -extern const struct wl_interface wl_seat_interface; -extern const struct wl_interface wl_surface_interface; -extern const struct wl_interface zwp_input_method_keyboard_grab_v2_interface; -extern const struct wl_interface zwp_input_method_v2_interface; -extern const struct wl_interface zwp_input_popup_surface_v2_interface; - -static const struct wl_interface *input_method_unstable_v2_types[] = { - NULL, - NULL, - NULL, - NULL, - NULL, - &zwp_input_popup_surface_v2_interface, - &wl_surface_interface, - &zwp_input_method_keyboard_grab_v2_interface, - &wl_seat_interface, - &zwp_input_method_v2_interface, -}; - -static const struct wl_message zwp_input_method_v2_requests[] = { - { "commit_string", "s", input_method_unstable_v2_types + 0 }, - { "set_preedit_string", "sii", input_method_unstable_v2_types + 0 }, - { "delete_surrounding_text", "uu", input_method_unstable_v2_types + 0 }, - { "commit", "u", input_method_unstable_v2_types + 0 }, - { "get_input_popup_surface", "no", input_method_unstable_v2_types + 5 }, - { "grab_keyboard", "n", input_method_unstable_v2_types + 7 }, - { "destroy", "", input_method_unstable_v2_types + 0 }, -}; - -static const struct wl_message zwp_input_method_v2_events[] = { - { "activate", "", input_method_unstable_v2_types + 0 }, - { "deactivate", "", input_method_unstable_v2_types + 0 }, - { "surrounding_text", "suu", input_method_unstable_v2_types + 0 }, - { "text_change_cause", "u", input_method_unstable_v2_types + 0 }, - { "content_type", "uu", input_method_unstable_v2_types + 0 }, - { "done", "", input_method_unstable_v2_types + 0 }, - { "unavailable", "", input_method_unstable_v2_types + 0 }, -}; - -WL_PRIVATE const struct wl_interface zwp_input_method_v2_interface = { - "zwp_input_method_v2", 1, - 7, zwp_input_method_v2_requests, - 7, zwp_input_method_v2_events, -}; - -static const struct wl_message zwp_input_popup_surface_v2_requests[] = { - { "destroy", "", input_method_unstable_v2_types + 0 }, -}; - -static const struct wl_message zwp_input_popup_surface_v2_events[] = { - { "text_input_rectangle", "iiii", input_method_unstable_v2_types + 0 }, -}; - -WL_PRIVATE const struct wl_interface zwp_input_popup_surface_v2_interface = { - "zwp_input_popup_surface_v2", 1, - 1, zwp_input_popup_surface_v2_requests, - 1, zwp_input_popup_surface_v2_events, -}; - -static const struct wl_message zwp_input_method_keyboard_grab_v2_requests[] = { - { "release", "", input_method_unstable_v2_types + 0 }, -}; - -static const struct wl_message zwp_input_method_keyboard_grab_v2_events[] = { - { "keymap", "uhu", input_method_unstable_v2_types + 0 }, - { "key", "uuuu", input_method_unstable_v2_types + 0 }, - { "modifiers", "uuuuu", input_method_unstable_v2_types + 0 }, - { "repeat_info", "ii", input_method_unstable_v2_types + 0 }, -}; - -WL_PRIVATE const struct wl_interface zwp_input_method_keyboard_grab_v2_interface = { - "zwp_input_method_keyboard_grab_v2", 1, - 1, zwp_input_method_keyboard_grab_v2_requests, - 4, zwp_input_method_keyboard_grab_v2_events, -}; - -static const struct wl_message zwp_input_method_manager_v2_requests[] = { - { "get_input_method", "on", input_method_unstable_v2_types + 8 }, - { "destroy", "", input_method_unstable_v2_types + 0 }, -}; - -WL_PRIVATE const struct wl_interface zwp_input_method_manager_v2_interface = { - "zwp_input_method_manager_v2", 1, - 2, zwp_input_method_manager_v2_requests, - 0, NULL, -}; - diff --git a/main.c b/main.c index e7ea24a..c7a6d81 100644 --- a/main.c +++ b/main.c @@ -68,8 +68,6 @@ threadmain(int argc, char **argv) die("can't create server worker"); if(proccreate(ibusthread, nil, 32768) < 0) die("can't create IBus worker"); - if(proccreate(waylandthread, nil, 32768) < 0) - die("can't create Wayland worker"); if(threadcreate(dictthread, nil, 16384) < 0) die("can't create dictionary worker"); imthread(nil); diff --git a/tests/Makefile b/tests/Makefile index a037b9a..94354f5 100644 --- a/tests/Makefile +++ b/tests/Makefile @@ -7,11 +7,11 @@ LIBS = -lthread -lbio $(FT_LIBS) PROG = unit_test TESTSRC = unit_test.c test_util.c str_test.c hash_test.c trie_test.c \ - ko_test.c vi_test.c engine_test.c dict_test.c ipc_test.c wayland_test.c \ + ko_test.c vi_test.c engine_test.c dict_test.c ipc_test.c \ popup_test.c font_test.c TESTOBJ = $(TESTSRC:.c=.o) -PARENTSRC = str.c hash.c trie.c dict.c ko.c vi.c ipc.c wayland_state.c \ - popup_layout.c font.c +PARENTSRC = str.c hash.c trie.c dict.c ko.c vi.c ipc.c popup_layout.c \ + font.c PARENTOBJ = $(PARENTSRC:%.c=unit_%.o) OBJS = $(TESTOBJ) $(PARENTOBJ) diff --git a/tests/test.h b/tests/test.h index 4c3095f..dc37e75 100644 --- a/tests/test.h +++ b/tests/test.h @@ -17,9 +17,6 @@ void hmap_long_utf8_keys(struct ct*); void hmap_binary_keys_and_invalid_lengths(struct ct*); void trie_exact_prefix_and_duplicate(struct ct*); void trie_optional_outputs_and_invalid_lengths(struct ct*); -void wayland_press_release_state(struct ct*); -void wayland_repeat_state(struct ct*); -void wayland_repeat_cancellation(struct ct*); void popup_layout(struct ct*); void font_render(struct ct*); void production_maps_load(struct ct*); diff --git a/tests/unit_test.c b/tests/unit_test.c index 26f580a..80a88be 100644 --- a/tests/unit_test.c +++ b/tests/unit_test.c @@ -71,9 +71,6 @@ static const struct ct_test tests[] = { { "hmap/binary-invalid-lengths", hmap_binary_keys_and_invalid_lengths }, { "trie/exact-prefix-duplicate", trie_exact_prefix_and_duplicate }, { "trie/optional-invalid-lengths", trie_optional_outputs_and_invalid_lengths }, - { "wayland/press-release", wayland_press_release_state }, - { "wayland/repeat", wayland_repeat_state }, - { "wayland/repeat-cancellation", wayland_repeat_cancellation }, { "popup/layout", popup_layout }, { "font/render", font_render }, { "map/production-lifecycle", production_maps_load }, diff --git a/tests/wayland_test.c b/tests/wayland_test.c deleted file mode 100644 index 1e52299..0000000 --- a/tests/wayland_test.c +++ /dev/null @@ -1,66 +0,0 @@ -#include "test.h" - -void -wayland_press_release_state(struct ct *t) -{ - Wlstate s; - - wlstateinit(&s); - CT_CHECK(t, wlstatepress(&s, 30, 1, 0, 0)); - CT_CHECK(t, !wlstaterelease(&s, 30)); - CT_CHECK(t, wlstaterelease(&s, 30)); - CT_CHECK(t, wlstatepress(&s, 31, 0, 0, 0)); - CT_CHECK(t, wlstaterelease(&s, 31)); - CT_CHECK(t, !wlstatepress(&s, Wlkeymax, 1, 0, 0)); - CT_CHECK(t, wlstaterelease(&s, Wlkeymax)); -} - -void -wayland_repeat_state(struct ct *t) -{ - Wlstate s; - u32int key; - - wlstateinit(&s); - wlstaterepeatinfo(&s, 25, 400); - CT_CHECK(t, wlstatepress(&s, 14, 1, 1, 100)); - CT_EQ_INT(t, 400, wlstatetimeout(&s, 100)); - CT_CHECK(t, !wlstaterepeat(&s, 499, &key)); - CT_CHECK(t, wlstaterepeat(&s, 500, &key)); - CT_EQ_UINT(t, 14, key); - CT_EQ_INT(t, 40, wlstatetimeout(&s, 500)); - CT_CHECK(t, !wlstaterelease(&s, 14)); - CT_EQ_INT(t, -1, wlstatetimeout(&s, 500)); - - CT_CHECK(t, wlstatepress(&s, 15, 1, 0, 600)); - CT_EQ_INT(t, -1, wlstatetimeout(&s, 600)); - CT_CHECK(t, !wlstaterelease(&s, 15)); - CT_CHECK(t, wlstatepress(&s, 16, 0, 1, 600)); - CT_EQ_INT(t, -1, wlstatetimeout(&s, 600)); - CT_CHECK(t, wlstaterelease(&s, 16)); -} - -void -wayland_repeat_cancellation(struct ct *t) -{ - Wlstate s; - - wlstateinit(&s); - wlstaterepeatinfo(&s, 20, 300); - CT_CHECK(t, wlstatepress(&s, 20, 1, 1, 0)); - CT_CHECK(t, wlstatepress(&s, 19, 0, 0, 10)); - CT_EQ_INT(t, -1, wlstatetimeout(&s, 10)); - CT_CHECK(t, !wlstaterelease(&s, 20)); - CT_CHECK(t, wlstaterelease(&s, 19)); - CT_CHECK(t, wlstatepress(&s, 20, 1, 1, 0)); - wlstaterepeatinfo(&s, 30, 200); - CT_EQ_INT(t, -1, wlstatetimeout(&s, 0)); - CT_CHECK(t, !wlstaterelease(&s, 20)); - CT_CHECK(t, wlstatepress(&s, 21, 1, 1, 0)); - wlstatecancelrepeat(&s); - CT_EQ_INT(t, -1, wlstatetimeout(&s, 0)); - CT_CHECK(t, !wlstaterelease(&s, 21)); - CT_CHECK(t, wlstatepress(&s, 22, 1, 1, 0)); - wlstateclear(&s); - CT_CHECK(t, wlstaterelease(&s, 22)); -} diff --git a/virtual-keyboard-unstable-v1-client-protocol.h b/virtual-keyboard-unstable-v1-client-protocol.h deleted file mode 100644 index 81cac0b..0000000 --- a/virtual-keyboard-unstable-v1-client-protocol.h +++ /dev/null @@ -1,280 +0,0 @@ -/* Generated by wayland-scanner 1.23.1 */ - -#ifndef VIRTUAL_KEYBOARD_UNSTABLE_V1_CLIENT_PROTOCOL_H -#define VIRTUAL_KEYBOARD_UNSTABLE_V1_CLIENT_PROTOCOL_H - -#include -#include -#include "wayland-client.h" - -#ifdef __cplusplus -extern "C" { -#endif - -/** - * @page page_virtual_keyboard_unstable_v1 The virtual_keyboard_unstable_v1 protocol - * @section page_ifaces_virtual_keyboard_unstable_v1 Interfaces - * - @subpage page_iface_zwp_virtual_keyboard_v1 - virtual keyboard - * - @subpage page_iface_zwp_virtual_keyboard_manager_v1 - virtual keyboard manager - * @section page_copyright_virtual_keyboard_unstable_v1 Copyright - *
- *
- * Copyright © 2008-2011  Kristian Høgsberg
- * Copyright © 2010-2013  Intel Corporation
- * Copyright © 2012-2013  Collabora, Ltd.
- * Copyright © 2018       Purism SPC
- *
- * Permission is hereby granted, free of charge, to any person obtaining a
- * copy of this software and associated documentation files (the "Software"),
- * to deal in the Software without restriction, including without limitation
- * the rights to use, copy, modify, merge, publish, distribute, sublicense,
- * and/or sell copies of the Software, and to permit persons to whom the
- * Software is furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice (including the next
- * paragraph) shall be included in all copies or substantial portions of the
- * Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
- * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
- * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
- * DEALINGS IN THE SOFTWARE.
- * 
- */ -struct wl_seat; -struct zwp_virtual_keyboard_manager_v1; -struct zwp_virtual_keyboard_v1; - -#ifndef ZWP_VIRTUAL_KEYBOARD_V1_INTERFACE -#define ZWP_VIRTUAL_KEYBOARD_V1_INTERFACE -/** - * @page page_iface_zwp_virtual_keyboard_v1 zwp_virtual_keyboard_v1 - * @section page_iface_zwp_virtual_keyboard_v1_desc Description - * - * The virtual keyboard provides an application with requests which emulate - * the behaviour of a physical keyboard. - * - * This interface can be used by clients on its own to provide raw input - * events, or it can accompany the input method protocol. - * @section page_iface_zwp_virtual_keyboard_v1_api API - * See @ref iface_zwp_virtual_keyboard_v1. - */ -/** - * @defgroup iface_zwp_virtual_keyboard_v1 The zwp_virtual_keyboard_v1 interface - * - * The virtual keyboard provides an application with requests which emulate - * the behaviour of a physical keyboard. - * - * This interface can be used by clients on its own to provide raw input - * events, or it can accompany the input method protocol. - */ -extern const struct wl_interface zwp_virtual_keyboard_v1_interface; -#endif -#ifndef ZWP_VIRTUAL_KEYBOARD_MANAGER_V1_INTERFACE -#define ZWP_VIRTUAL_KEYBOARD_MANAGER_V1_INTERFACE -/** - * @page page_iface_zwp_virtual_keyboard_manager_v1 zwp_virtual_keyboard_manager_v1 - * @section page_iface_zwp_virtual_keyboard_manager_v1_desc Description - * - * A virtual keyboard manager allows an application to provide keyboard - * input events as if they came from a physical keyboard. - * @section page_iface_zwp_virtual_keyboard_manager_v1_api API - * See @ref iface_zwp_virtual_keyboard_manager_v1. - */ -/** - * @defgroup iface_zwp_virtual_keyboard_manager_v1 The zwp_virtual_keyboard_manager_v1 interface - * - * A virtual keyboard manager allows an application to provide keyboard - * input events as if they came from a physical keyboard. - */ -extern const struct wl_interface zwp_virtual_keyboard_manager_v1_interface; -#endif - -#ifndef ZWP_VIRTUAL_KEYBOARD_V1_ERROR_ENUM -#define ZWP_VIRTUAL_KEYBOARD_V1_ERROR_ENUM -enum zwp_virtual_keyboard_v1_error { - /** - * No keymap was set - */ - ZWP_VIRTUAL_KEYBOARD_V1_ERROR_NO_KEYMAP = 0, -}; -#endif /* ZWP_VIRTUAL_KEYBOARD_V1_ERROR_ENUM */ - -#define ZWP_VIRTUAL_KEYBOARD_V1_KEYMAP 0 -#define ZWP_VIRTUAL_KEYBOARD_V1_KEY 1 -#define ZWP_VIRTUAL_KEYBOARD_V1_MODIFIERS 2 -#define ZWP_VIRTUAL_KEYBOARD_V1_DESTROY 3 - - -/** - * @ingroup iface_zwp_virtual_keyboard_v1 - */ -#define ZWP_VIRTUAL_KEYBOARD_V1_KEYMAP_SINCE_VERSION 1 -/** - * @ingroup iface_zwp_virtual_keyboard_v1 - */ -#define ZWP_VIRTUAL_KEYBOARD_V1_KEY_SINCE_VERSION 1 -/** - * @ingroup iface_zwp_virtual_keyboard_v1 - */ -#define ZWP_VIRTUAL_KEYBOARD_V1_MODIFIERS_SINCE_VERSION 1 -/** - * @ingroup iface_zwp_virtual_keyboard_v1 - */ -#define ZWP_VIRTUAL_KEYBOARD_V1_DESTROY_SINCE_VERSION 1 - -/** @ingroup iface_zwp_virtual_keyboard_v1 */ -static inline void -zwp_virtual_keyboard_v1_set_user_data(struct zwp_virtual_keyboard_v1 *zwp_virtual_keyboard_v1, void *user_data) -{ - wl_proxy_set_user_data((struct wl_proxy *) zwp_virtual_keyboard_v1, user_data); -} - -/** @ingroup iface_zwp_virtual_keyboard_v1 */ -static inline void * -zwp_virtual_keyboard_v1_get_user_data(struct zwp_virtual_keyboard_v1 *zwp_virtual_keyboard_v1) -{ - return wl_proxy_get_user_data((struct wl_proxy *) zwp_virtual_keyboard_v1); -} - -static inline uint32_t -zwp_virtual_keyboard_v1_get_version(struct zwp_virtual_keyboard_v1 *zwp_virtual_keyboard_v1) -{ - return wl_proxy_get_version((struct wl_proxy *) zwp_virtual_keyboard_v1); -} - -/** - * @ingroup iface_zwp_virtual_keyboard_v1 - * - * Provide a file descriptor to the compositor which can be - * memory-mapped to provide a keyboard mapping description. - * - * Format carries a value from the keymap_format enumeration. - */ -static inline void -zwp_virtual_keyboard_v1_keymap(struct zwp_virtual_keyboard_v1 *zwp_virtual_keyboard_v1, uint32_t format, int32_t fd, uint32_t size) -{ - wl_proxy_marshal_flags((struct wl_proxy *) zwp_virtual_keyboard_v1, - ZWP_VIRTUAL_KEYBOARD_V1_KEYMAP, NULL, wl_proxy_get_version((struct wl_proxy *) zwp_virtual_keyboard_v1), 0, format, fd, size); -} - -/** - * @ingroup iface_zwp_virtual_keyboard_v1 - * - * A key was pressed or released. - * The time argument is a timestamp with millisecond granularity, with an - * undefined base. All requests regarding a single object must share the - * same clock. - * - * Keymap must be set before issuing this request. - * - * State carries a value from the key_state enumeration. - */ -static inline void -zwp_virtual_keyboard_v1_key(struct zwp_virtual_keyboard_v1 *zwp_virtual_keyboard_v1, uint32_t time, uint32_t key, uint32_t state) -{ - wl_proxy_marshal_flags((struct wl_proxy *) zwp_virtual_keyboard_v1, - ZWP_VIRTUAL_KEYBOARD_V1_KEY, NULL, wl_proxy_get_version((struct wl_proxy *) zwp_virtual_keyboard_v1), 0, time, key, state); -} - -/** - * @ingroup iface_zwp_virtual_keyboard_v1 - * - * Notifies the compositor that the modifier and/or group state has - * changed, and it should update state. - * - * The client should use wl_keyboard.modifiers event to synchronize its - * internal state with seat state. - * - * Keymap must be set before issuing this request. - */ -static inline void -zwp_virtual_keyboard_v1_modifiers(struct zwp_virtual_keyboard_v1 *zwp_virtual_keyboard_v1, uint32_t mods_depressed, uint32_t mods_latched, uint32_t mods_locked, uint32_t group) -{ - wl_proxy_marshal_flags((struct wl_proxy *) zwp_virtual_keyboard_v1, - ZWP_VIRTUAL_KEYBOARD_V1_MODIFIERS, NULL, wl_proxy_get_version((struct wl_proxy *) zwp_virtual_keyboard_v1), 0, mods_depressed, mods_latched, mods_locked, group); -} - -/** - * @ingroup iface_zwp_virtual_keyboard_v1 - */ -static inline void -zwp_virtual_keyboard_v1_destroy(struct zwp_virtual_keyboard_v1 *zwp_virtual_keyboard_v1) -{ - wl_proxy_marshal_flags((struct wl_proxy *) zwp_virtual_keyboard_v1, - ZWP_VIRTUAL_KEYBOARD_V1_DESTROY, NULL, wl_proxy_get_version((struct wl_proxy *) zwp_virtual_keyboard_v1), WL_MARSHAL_FLAG_DESTROY); -} - -#ifndef ZWP_VIRTUAL_KEYBOARD_MANAGER_V1_ERROR_ENUM -#define ZWP_VIRTUAL_KEYBOARD_MANAGER_V1_ERROR_ENUM -enum zwp_virtual_keyboard_manager_v1_error { - /** - * client not authorized to use the interface - */ - ZWP_VIRTUAL_KEYBOARD_MANAGER_V1_ERROR_UNAUTHORIZED = 0, -}; -#endif /* ZWP_VIRTUAL_KEYBOARD_MANAGER_V1_ERROR_ENUM */ - -#define ZWP_VIRTUAL_KEYBOARD_MANAGER_V1_CREATE_VIRTUAL_KEYBOARD 0 - - -/** - * @ingroup iface_zwp_virtual_keyboard_manager_v1 - */ -#define ZWP_VIRTUAL_KEYBOARD_MANAGER_V1_CREATE_VIRTUAL_KEYBOARD_SINCE_VERSION 1 - -/** @ingroup iface_zwp_virtual_keyboard_manager_v1 */ -static inline void -zwp_virtual_keyboard_manager_v1_set_user_data(struct zwp_virtual_keyboard_manager_v1 *zwp_virtual_keyboard_manager_v1, void *user_data) -{ - wl_proxy_set_user_data((struct wl_proxy *) zwp_virtual_keyboard_manager_v1, user_data); -} - -/** @ingroup iface_zwp_virtual_keyboard_manager_v1 */ -static inline void * -zwp_virtual_keyboard_manager_v1_get_user_data(struct zwp_virtual_keyboard_manager_v1 *zwp_virtual_keyboard_manager_v1) -{ - return wl_proxy_get_user_data((struct wl_proxy *) zwp_virtual_keyboard_manager_v1); -} - -static inline uint32_t -zwp_virtual_keyboard_manager_v1_get_version(struct zwp_virtual_keyboard_manager_v1 *zwp_virtual_keyboard_manager_v1) -{ - return wl_proxy_get_version((struct wl_proxy *) zwp_virtual_keyboard_manager_v1); -} - -/** @ingroup iface_zwp_virtual_keyboard_manager_v1 */ -static inline void -zwp_virtual_keyboard_manager_v1_destroy(struct zwp_virtual_keyboard_manager_v1 *zwp_virtual_keyboard_manager_v1) -{ - wl_proxy_destroy((struct wl_proxy *) zwp_virtual_keyboard_manager_v1); -} - -/** - * @ingroup iface_zwp_virtual_keyboard_manager_v1 - * - * Creates a new virtual keyboard associated to a seat. - * - * If the compositor enables a keyboard to perform arbitrary actions, it - * should present an error when an untrusted client requests a new - * keyboard. - */ -static inline struct zwp_virtual_keyboard_v1 * -zwp_virtual_keyboard_manager_v1_create_virtual_keyboard(struct zwp_virtual_keyboard_manager_v1 *zwp_virtual_keyboard_manager_v1, struct wl_seat *seat) -{ - struct wl_proxy *id; - - id = wl_proxy_marshal_flags((struct wl_proxy *) zwp_virtual_keyboard_manager_v1, - ZWP_VIRTUAL_KEYBOARD_MANAGER_V1_CREATE_VIRTUAL_KEYBOARD, &zwp_virtual_keyboard_v1_interface, wl_proxy_get_version((struct wl_proxy *) zwp_virtual_keyboard_manager_v1), 0, seat, NULL); - - return (struct zwp_virtual_keyboard_v1 *) id; -} - -#ifdef __cplusplus -} -#endif - -#endif diff --git a/virtual-keyboard-unstable-v1-protocol.c b/virtual-keyboard-unstable-v1-protocol.c deleted file mode 100644 index 699b27a..0000000 --- a/virtual-keyboard-unstable-v1-protocol.c +++ /dev/null @@ -1,78 +0,0 @@ -/* Generated by wayland-scanner 1.23.1 */ - -/* - * Copyright © 2008-2011 Kristian Høgsberg - * Copyright © 2010-2013 Intel Corporation - * Copyright © 2012-2013 Collabora, Ltd. - * Copyright © 2018 Purism SPC - * - * Permission is hereby granted, free of charge, to any person obtaining a - * copy of this software and associated documentation files (the "Software"), - * to deal in the Software without restriction, including without limitation - * the rights to use, copy, modify, merge, publish, distribute, sublicense, - * and/or sell copies of the Software, and to permit persons to whom the - * Software is furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice (including the next - * paragraph) shall be included in all copies or substantial portions of the - * Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL - * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING - * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER - * DEALINGS IN THE SOFTWARE. - */ - -#include -#include -#include -#include "wayland-util.h" - -#ifndef __has_attribute -# define __has_attribute(x) 0 /* Compatibility with non-clang compilers. */ -#endif - -#if (__has_attribute(visibility) || defined(__GNUC__) && __GNUC__ >= 4) -#define WL_PRIVATE __attribute__ ((visibility("hidden"))) -#else -#define WL_PRIVATE -#endif - -extern const struct wl_interface wl_seat_interface; -extern const struct wl_interface zwp_virtual_keyboard_v1_interface; - -static const struct wl_interface *virtual_keyboard_unstable_v1_types[] = { - NULL, - NULL, - NULL, - NULL, - &wl_seat_interface, - &zwp_virtual_keyboard_v1_interface, -}; - -static const struct wl_message zwp_virtual_keyboard_v1_requests[] = { - { "keymap", "uhu", virtual_keyboard_unstable_v1_types + 0 }, - { "key", "uuu", virtual_keyboard_unstable_v1_types + 0 }, - { "modifiers", "uuuu", virtual_keyboard_unstable_v1_types + 0 }, - { "destroy", "", virtual_keyboard_unstable_v1_types + 0 }, -}; - -WL_PRIVATE const struct wl_interface zwp_virtual_keyboard_v1_interface = { - "zwp_virtual_keyboard_v1", 1, - 4, zwp_virtual_keyboard_v1_requests, - 0, NULL, -}; - -static const struct wl_message zwp_virtual_keyboard_manager_v1_requests[] = { - { "create_virtual_keyboard", "on", virtual_keyboard_unstable_v1_types + 4 }, -}; - -WL_PRIVATE const struct wl_interface zwp_virtual_keyboard_manager_v1_interface = { - "zwp_virtual_keyboard_manager_v1", 1, - 1, zwp_virtual_keyboard_manager_v1_requests, - 0, NULL, -}; - diff --git a/wayland.c b/wayland.c deleted file mode 100644 index a29ac10..0000000 --- a/wayland.c +++ /dev/null @@ -1,573 +0,0 @@ -#include "dat.h" -#include "fn.h" - -#include -#include -#include -#include -#include -#include -#include -#include -#include "input-method-unstable-v2-client-protocol.h" -#include "virtual-keyboard-unstable-v1-client-protocol.h" - -static struct wl_display *dpy; -static struct wl_registry *reg; -static struct wl_seat *seat; -static struct zwp_input_method_manager_v2 *immgr; -static struct zwp_virtual_keyboard_manager_v1 *vkmgr; -static struct zwp_input_method_v2 *im; -static struct zwp_input_method_keyboard_grab_v2 *grab; -static struct zwp_virtual_keyboard_v1 *vk; -static struct xkb_context *xkb; -static struct xkb_keymap *keymap; -static struct xkb_state *xkbst; -static int active; -static int pending; -static int newactivation; -static int running; -static u32int imserial; -static u32int seatname; -static u32int immgrname; -static u32int vkmgrname; -static Channel *replyc; -static uvlong owner; -static Wlstate keys; - -static uvlong -nowms(void) -{ - struct timespec ts; - - if(clock_gettime(CLOCK_MONOTONIC, &ts) < 0) - return 0; - return (uvlong)ts.tv_sec * 1000 + ts.tv_nsec / 1000000; -} - -static void -sendkey(u32int ks, u32int mod, Keyres *res) -{ - Keyreq kr; - - memset(&kr, 0, sizeof kr); - kr.owner = owner; - kr.op = Keypress; - kr.ks = ks; - kr.mod = mod; - kr.want = 1; - kr.reply = replyc; - chansend(keyc, &kr); - chanrecv(replyc, res); -} - -static void -releaseowner(void) -{ - Keyreq kr; - Keyres res; - - if(owner == 0) - return; - memset(&kr, 0, sizeof kr); - kr.owner = owner; - kr.op = Keyrelease; - kr.reply = replyc; - chansend(keyc, &kr); - chanrecv(replyc, &res); - owner = 0; -} - -static u32int -kget(xkb_keysym_t ks) -{ - u32int c; - - c = xkb_keysym_to_utf32(ks); - if(c >= ' ' && c != 0x7f) - return c; - if(ks >= 0xff00 && ks <= 0xffff) - return Kspec + (ks - 0xff00); - return c; -} - -static u32int -mget(void) -{ - u32int m; - - m = 0; - if(xkbst == nil) - return 0; - if(xkb_state_mod_name_is_active(xkbst, - XKB_MOD_NAME_SHIFT, XKB_STATE_MODS_EFFECTIVE) > 0) - m |= Mshift; - if(xkb_state_mod_name_is_active(xkbst, - XKB_MOD_NAME_CTRL, XKB_STATE_MODS_EFFECTIVE) > 0) - m |= Mctrl; - if(xkb_state_mod_name_is_active(xkbst, - XKB_MOD_NAME_ALT, XKB_STATE_MODS_EFFECTIVE) > 0) - m |= Malt; - if(xkb_state_mod_name_is_active(xkbst, - XKB_MOD_NAME_LOGO, XKB_STATE_MODS_EFFECTIVE) > 0) - m |= Msuper; - return m; -} - -static void -putresult(Keyres *res) -{ - char commit[Maxutf], preedit[Maxutf]; - int plen; - - if(im == nil) - return; - stoutf(&res->commit, commit, sizeof commit); - stoutf(&res->preedit, preedit, sizeof preedit); - if(commit[0] != '\0') - zwp_input_method_v2_commit_string(im, commit); - plen = strlen(preedit); - zwp_input_method_v2_set_preedit_string(im, preedit, plen, plen); - zwp_input_method_v2_commit(im, imserial); -} - -static void -forwardkey(u32int time, u32int keycode, u32int state) -{ - if(vk != nil) - zwp_virtual_keyboard_v1_key(vk, time, keycode, state); -} - -static void -keypress(u32int time, u32int keycode) -{ - xkb_keysym_t ks; - u32int k, mod; - Keyres res; - int repeatable; - - if(xkbst == nil || keycode >= Wlkeymax){ - forwardkey(time, keycode, WL_KEYBOARD_KEY_STATE_PRESSED); - wlstatepress(&keys, keycode, 0, 0, nowms()); - return; - } - ks = xkb_state_key_get_one_sym(xkbst, keycode + 8); - k = kget(ks); - if(k == 0){ - forwardkey(time, keycode, WL_KEYBOARD_KEY_STATE_PRESSED); - wlstatepress(&keys, keycode, 0, 0, nowms()); - return; - } - mod = mget(); - sendkey(k, mod, &res); - putresult(&res); - repeatable = keymap != nil && - xkb_keymap_key_repeats(keymap, keycode + 8); - wlstatepress(&keys, keycode, res.eaten, repeatable, nowms()); - if(!res.eaten) - forwardkey(time, keycode, WL_KEYBOARD_KEY_STATE_PRESSED); -} - -static void -keyrepeat(u32int time, u32int keycode) -{ - xkb_keysym_t ks; - u32int k; - Keyres res; - - if(xkbst == nil) - return; - ks = xkb_state_key_get_one_sym(xkbst, keycode + 8); - k = kget(ks); - if(k == 0) - return; - sendkey(k, mget(), &res); - putresult(&res); - /* The original eaten press still owns its eventual physical release. */ - if(!res.eaten){ - forwardkey(time, keycode, WL_KEYBOARD_KEY_STATE_PRESSED); - forwardkey(time, keycode, WL_KEYBOARD_KEY_STATE_RELEASED); - } -} - -static void -kpress(u32int time, u32int keycode, u32int state) -{ - if(state == WL_KEYBOARD_KEY_STATE_PRESSED){ - keypress(time, keycode); - return; - } - if(wlstaterelease(&keys, keycode)) - forwardkey(time, keycode, state); -} - -static void -kg_keymap(void *data, struct zwp_input_method_keyboard_grab_v2 *g, - u32int format, int32_t fd, u32int size) -{ - char *s; - - (void)data; - (void)g; - wlstatecancelrepeat(&keys); - if(format != WL_KEYBOARD_KEYMAP_FORMAT_XKB_V1){ - close(fd); - return; - } - s = mmap(nil, size, PROT_READ, MAP_PRIVATE, fd, 0); - if(s != MAP_FAILED){ - if(xkbst != nil){ - xkb_state_unref(xkbst); - xkbst = nil; - } - if(keymap != nil) - xkb_keymap_unref(keymap); - keymap = xkb_keymap_new_from_string(xkb, s, - XKB_KEYMAP_FORMAT_TEXT_V1, - XKB_KEYMAP_COMPILE_NO_FLAGS); - if(keymap != nil) - xkbst = xkb_state_new(keymap); - munmap(s, size); - } - if(vk != nil) - zwp_virtual_keyboard_v1_keymap(vk, format, fd, size); - close(fd); -} - -static void -kg_key(void *data, struct zwp_input_method_keyboard_grab_v2 *g, - u32int serial, u32int time, u32int key, u32int state) -{ - (void)data; - (void)g; - (void)serial; - kpress(time, key, state); -} - -static void -kg_mods(void *data, struct zwp_input_method_keyboard_grab_v2 *g, - u32int serial, u32int dep, u32int lat, u32int lck, u32int group) -{ - (void)data; - (void)g; - (void)serial; - if(xkbst != nil) - xkb_state_update_mask(xkbst, dep, lat, lck, 0, 0, group); - if(vk != nil) - zwp_virtual_keyboard_v1_modifiers(vk, dep, lat, lck, group); -} - -static void -kg_repeat(void *data, struct zwp_input_method_keyboard_grab_v2 *g, - int32_t rate, int32_t delay) -{ - (void)data; - (void)g; - wlstaterepeatinfo(&keys, rate, delay); -} - -static const struct zwp_input_method_keyboard_grab_v2_listener -grab_listener = { - .keymap = kg_keymap, - .key = kg_key, - .modifiers = kg_mods, - .repeat_info = kg_repeat, -}; - -static void -im_activate(void *data, struct zwp_input_method_v2 *m) -{ - (void)data; - (void)m; - pending = 1; - newactivation = 1; -} - -static void -im_deactivate(void *data, struct zwp_input_method_v2 *m) -{ - (void)data; - (void)m; - pending = 0; - wlstateclear(&keys); -} - -static void -im_surrounding(void *data, struct zwp_input_method_v2 *m, - const char *text, u32int cursor, u32int anchor) -{ - (void)data; - (void)m; - (void)text; - (void)cursor; - (void)anchor; -} - -static void -im_textchange(void *data, struct zwp_input_method_v2 *m, u32int cause) -{ - (void)data; - (void)m; - (void)cause; -} - -static void -im_content(void *data, struct zwp_input_method_v2 *m, - u32int hint, u32int purpose) -{ - (void)data; - (void)m; - (void)hint; - (void)purpose; -} - -static void -endactivation(void) -{ - wlstateclear(&keys); - active = 0; - releaseowner(); - if(grab != nil){ - zwp_input_method_keyboard_grab_v2_release(grab); - grab = nil; - } -} - -static void -beginactivation(void) -{ - if(active) - endactivation(); - active = 1; - owner = ownernew(); - grab = zwp_input_method_v2_grab_keyboard(im); - if(grab != nil) - zwp_input_method_keyboard_grab_v2_add_listener(grab, - &grab_listener, nil); -} - -static void -im_done(void *data, struct zwp_input_method_v2 *m) -{ - (void)data; - (void)m; - imserial++; - if(newactivation && pending) - beginactivation(); - else if(!pending && active) - endactivation(); - newactivation = 0; -} - -static void -im_unavail(void *data, struct zwp_input_method_v2 *m) -{ - (void)data; - (void)m; - wlstateclear(&keys); - running = 0; - fprint(2, "strans: wayland: input-method unavailable\n"); -} - -static const struct zwp_input_method_v2_listener im_listener = { - .activate = im_activate, - .deactivate = im_deactivate, - .surrounding_text = im_surrounding, - .text_change_cause = im_textchange, - .content_type = im_content, - .done = im_done, - .unavailable = im_unavail, -}; - -static void -reg_global(void *data, struct wl_registry *r, u32int name, - const char *iface, u32int version) -{ - (void)data; - if(strcmp(iface, wl_seat_interface.name) == 0 && seat == nil){ - seatname = name; - seat = wl_registry_bind(r, name, &wl_seat_interface, - version < 5 ? version : 5); - }else if(strcmp(iface, - zwp_input_method_manager_v2_interface.name) == 0 && immgr == nil){ - immgrname = name; - immgr = wl_registry_bind(r, name, - &zwp_input_method_manager_v2_interface, 1); - }else if(strcmp(iface, - zwp_virtual_keyboard_manager_v1_interface.name) == 0 && vkmgr == nil){ - vkmgrname = name; - vkmgr = wl_registry_bind(r, name, - &zwp_virtual_keyboard_manager_v1_interface, 1); - } -} - -static void -reg_remove(void *data, struct wl_registry *r, u32int name) -{ - (void)data; - (void)r; - if(name == seatname || name == immgrname || name == vkmgrname) - running = 0; -} - -static const struct wl_registry_listener reg_listener = { - .global = reg_global, - .global_remove = reg_remove, -}; - -static int -dispatch(void) -{ - struct pollfd pfd; - u32int key; - uvlong now; - int flush, timeout, n; - - pfd.fd = wl_display_get_fd(dpy); - while(running){ - if(wl_display_dispatch_pending(dpy) < 0) - return -1; - if(!running) - break; - now = nowms(); - if(wlstaterepeat(&keys, now, &key)) - keyrepeat((u32int)now, key); - while(wl_display_prepare_read(dpy) != 0) - if(wl_display_dispatch_pending(dpy) < 0) - return -1; - flush = wl_display_flush(dpy); - if(flush < 0 && errno != EAGAIN){ - wl_display_cancel_read(dpy); - return -1; - } - pfd.events = POLLIN; - if(flush < 0) - pfd.events |= POLLOUT; - pfd.revents = 0; - timeout = wlstatetimeout(&keys, nowms()); - n = poll(&pfd, 1, timeout); - if(n < 0){ - wl_display_cancel_read(dpy); - if(errno == EINTR) - continue; - return -1; - } - if(n == 0){ - wl_display_cancel_read(dpy); - continue; - } - if(pfd.revents & POLLIN){ - if(wl_display_read_events(dpy) < 0) - return -1; - }else - wl_display_cancel_read(dpy); - if(pfd.revents & (POLLERR | POLLHUP | POLLNVAL)) - return -1; - if(pfd.revents & POLLOUT) - wl_display_flush(dpy); - } - return 0; -} - -static void -resetconnection(void) -{ - dpy = nil; - reg = nil; - seat = nil; - immgr = nil; - vkmgr = nil; - im = nil; - grab = nil; - vk = nil; - xkb = nil; - keymap = nil; - xkbst = nil; - active = 0; - pending = 0; - newactivation = 0; - running = 1; - imserial = 0; - seatname = 0; - immgrname = 0; - vkmgrname = 0; - owner = 0; - wlstateinit(&keys); -} - -static void -cleanup(void) -{ - running = 0; - wlstateclear(&keys); - releaseowner(); - active = 0; - if(xkbst != nil) - xkb_state_unref(xkbst); - if(keymap != nil) - xkb_keymap_unref(keymap); - if(xkb != nil) - xkb_context_unref(xkb); - if(grab != nil) - wl_proxy_destroy((struct wl_proxy*)grab); - if(vk != nil) - wl_proxy_destroy((struct wl_proxy*)vk); - if(im != nil) - wl_proxy_destroy((struct wl_proxy*)im); - if(vkmgr != nil) - wl_proxy_destroy((struct wl_proxy*)vkmgr); - if(immgr != nil) - wl_proxy_destroy((struct wl_proxy*)immgr); - if(seat != nil) - wl_proxy_destroy((struct wl_proxy*)seat); - if(reg != nil) - wl_registry_destroy(reg); - if(dpy != nil){ - wl_display_disconnect(dpy); - dpy = nil; - } -} - -static void -connectonce(void) -{ - resetconnection(); - dpy = wl_display_connect(nil); - if(dpy == nil) - return; - xkb = xkb_context_new(XKB_CONTEXT_NO_FLAGS); - if(xkb == nil) - return; - reg = wl_display_get_registry(dpy); - if(reg == nil) - return; - wl_registry_add_listener(reg, ®_listener, nil); - if(wl_display_roundtrip(dpy) < 0) - return; - if(!running) - return; - if(seat == nil || immgr == nil || vkmgr == nil){ - fprint(2, - "strans: wayland: compositor missing input-method-v2\n"); - return; - } - im = zwp_input_method_manager_v2_get_input_method(immgr, seat); - vk = zwp_virtual_keyboard_manager_v1_create_virtual_keyboard(vkmgr, seat); - if(im == nil || vk == nil) - return; - zwp_input_method_v2_add_listener(im, &im_listener, nil); - dispatch(); -} - -void -waylandthread(void *_) -{ - (void)_; - threadsetname("wayland"); - replyc = chancreate(sizeof(Keyres), 0); - for(;;){ - connectonce(); - cleanup(); - poll(nil, 0, 1000); - } -} diff --git a/wayland_state.c b/wayland_state.c deleted file mode 100644 index cc66308..0000000 --- a/wayland_state.c +++ /dev/null @@ -1,107 +0,0 @@ -#include "dat.h" -#include "fn.h" - -#include -#include - -enum { - Downforward = 1, - Downeaten = 2, -}; - -void -wlstateinit(Wlstate *s) -{ - memset(s, 0, sizeof *s); -} - -void -wlstatecancelrepeat(Wlstate *s) -{ - s->repeating = 0; - s->repeatkey = 0; - s->repeatat = 0; -} - -void -wlstateclear(Wlstate *s) -{ - memset(s->down, 0, sizeof s->down); - wlstatecancelrepeat(s); -} - -void -wlstaterepeatinfo(Wlstate *s, int rate, int delay) -{ - /* Settings changes end the old schedule; a later press starts a new one. */ - wlstatecancelrepeat(s); - s->rate = rate > 0 ? rate : 0; - s->delay = delay > 0 ? delay : 0; -} - -int -wlstatepress(Wlstate *s, u32int key, int eaten, int repeatable, uvlong now) -{ - uvlong delay; - - if(key >= Wlkeymax) - return 0; - s->down[key] = eaten ? Downeaten : Downforward; - wlstatecancelrepeat(s); - if(eaten && repeatable && s->rate > 0){ - delay = s->delay; - if(~(uvlong)0 - now < delay) - s->repeatat = ~(uvlong)0; - else - s->repeatat = now + delay; - s->repeatkey = key; - s->repeating = 1; - } - return 1; -} - -int -wlstaterelease(Wlstate *s, u32int key) -{ - int forward; - - if(key >= Wlkeymax) - return 1; - forward = s->down[key] != Downeaten; - s->down[key] = 0; - if(s->repeating && s->repeatkey == key) - wlstatecancelrepeat(s); - return forward; -} - -int -wlstatetimeout(Wlstate *s, uvlong now) -{ - uvlong d; - - if(!s->repeating) - return -1; - if(now >= s->repeatat) - return 0; - d = s->repeatat - now; - return d > INT_MAX ? INT_MAX : (int)d; -} - -int -wlstaterepeat(Wlstate *s, uvlong now, u32int *key) -{ - uvlong step; - - if(!s->repeating || now < s->repeatat) - return 0; - if(key != 0) - *key = s->repeatkey; - step = 1000 / s->rate; - if(step == 0) - step = 1; - if(~(uvlong)0 - now < step) - s->repeatat = ~(uvlong)0; - else - s->repeatat = now + step; - return 1; -}