mirror of
https://github.com/hyprwm/wlroots-hyprland.git
synced 2024-11-26 06:35:58 +01:00
text_input_v3: Note features supported by the text field
With this information, consumers can realize they will never retrieve some state, and adjust their strategy.
This commit is contained in:
parent
68820d6c3d
commit
37adcac5d1
2 changed files with 17 additions and 1 deletions
|
@ -13,6 +13,12 @@
|
||||||
#include <wlr/types/wlr_seat.h>
|
#include <wlr/types/wlr_seat.h>
|
||||||
#include <wlr/types/wlr_surface.h>
|
#include <wlr/types/wlr_surface.h>
|
||||||
|
|
||||||
|
enum wlr_text_input_v3_features {
|
||||||
|
WLR_TEXT_INPUT_V3_FEATURE_SURROUNDING_TEXT = 1 << 0,
|
||||||
|
WLR_TEXT_INPUT_v3_FEATURE_CONTENT_TYPE = 1 << 1,
|
||||||
|
WLR_TEXT_INPUT_V3_FEATURE_CURSOR_RECTANGLE = 1 << 2,
|
||||||
|
};
|
||||||
|
|
||||||
struct wlr_text_input_v3_state {
|
struct wlr_text_input_v3_state {
|
||||||
struct {
|
struct {
|
||||||
char *text; // NULL is allowed and equivalent to empty string
|
char *text; // NULL is allowed and equivalent to empty string
|
||||||
|
@ -33,6 +39,10 @@ struct wlr_text_input_v3_state {
|
||||||
int32_t width;
|
int32_t width;
|
||||||
int32_t height;
|
int32_t height;
|
||||||
} cursor_rectangle;
|
} cursor_rectangle;
|
||||||
|
|
||||||
|
// Tracks which features were used in the current commit.
|
||||||
|
// Useful in the enabling commit, where usage means support.
|
||||||
|
uint32_t features; // OR'ed wlr_text_input_v3_features
|
||||||
};
|
};
|
||||||
|
|
||||||
struct wlr_text_input_v3 {
|
struct wlr_text_input_v3 {
|
||||||
|
@ -44,6 +54,8 @@ struct wlr_text_input_v3 {
|
||||||
uint32_t current_serial; // next in line to send
|
uint32_t current_serial; // next in line to send
|
||||||
bool pending_enabled;
|
bool pending_enabled;
|
||||||
bool current_enabled;
|
bool current_enabled;
|
||||||
|
// supported in the current text input, more granular than surface
|
||||||
|
uint32_t active_features; // OR'ed wlr_text_input_v3_features
|
||||||
|
|
||||||
struct wl_list link;
|
struct wl_list link;
|
||||||
|
|
||||||
|
|
|
@ -121,7 +121,7 @@ static void text_input_set_surrounding_text(struct wl_client *client,
|
||||||
if (!text_input->pending.surrounding.text) {
|
if (!text_input->pending.surrounding.text) {
|
||||||
wl_client_post_no_memory(client);
|
wl_client_post_no_memory(client);
|
||||||
}
|
}
|
||||||
|
text_input->pending.features |= WLR_TEXT_INPUT_V3_FEATURE_SURROUNDING_TEXT;
|
||||||
text_input->pending.surrounding.cursor = cursor;
|
text_input->pending.surrounding.cursor = cursor;
|
||||||
text_input->pending.surrounding.anchor = anchor;
|
text_input->pending.surrounding.anchor = anchor;
|
||||||
}
|
}
|
||||||
|
@ -141,6 +141,7 @@ static void text_input_set_content_type(struct wl_client *client,
|
||||||
if (!text_input) {
|
if (!text_input) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
text_input->pending.features |= WLR_TEXT_INPUT_v3_FEATURE_CONTENT_TYPE;
|
||||||
text_input->pending.content_type.hint = hint;
|
text_input->pending.content_type.hint = hint;
|
||||||
text_input->pending.content_type.purpose = purpose;
|
text_input->pending.content_type.purpose = purpose;
|
||||||
}
|
}
|
||||||
|
@ -152,6 +153,7 @@ static void text_input_set_cursor_rectangle(struct wl_client *client,
|
||||||
if (!text_input) {
|
if (!text_input) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
text_input->pending.features |= WLR_TEXT_INPUT_V3_FEATURE_CURSOR_RECTANGLE;
|
||||||
text_input->pending.cursor_rectangle.x = x;
|
text_input->pending.cursor_rectangle.x = x;
|
||||||
text_input->pending.cursor_rectangle.y = y;
|
text_input->pending.cursor_rectangle.y = y;
|
||||||
text_input->pending.cursor_rectangle.width = width;
|
text_input->pending.cursor_rectangle.width = width;
|
||||||
|
@ -180,8 +182,10 @@ static void text_input_commit(struct wl_client *client,
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!old_enabled && text_input->current_enabled) {
|
if (!old_enabled && text_input->current_enabled) {
|
||||||
|
text_input->active_features = text_input->current.features;
|
||||||
wlr_signal_emit_safe(&text_input->events.enable, text_input);
|
wlr_signal_emit_safe(&text_input->events.enable, text_input);
|
||||||
} else if (old_enabled && !text_input->current_enabled) {
|
} else if (old_enabled && !text_input->current_enabled) {
|
||||||
|
text_input->active_features = 0;
|
||||||
wlr_signal_emit_safe(&text_input->events.disable, text_input);
|
wlr_signal_emit_safe(&text_input->events.disable, text_input);
|
||||||
} else { // including never enabled
|
} else { // including never enabled
|
||||||
wlr_signal_emit_safe(&text_input->events.commit, text_input);
|
wlr_signal_emit_safe(&text_input->events.commit, text_input);
|
||||||
|
|
Loading…
Reference in a new issue