Remove input structs

Looking at the functionality in the server library, it's clear (in
hindsight) that there are two different "things" in there: 1) The IPC
API, that is, everything that concerns wl_display, wl_client,
wl_resource and 2) and half-hearted attempt at sharing input code and
focus logic that leaves a lot of problematic structs in the API
surface, only to share less than 1000 lines of code.

We can just move those input structs and helper functions into weston
and cut libwayland-server down to just the core server side IPC API.
In the short term, compositors can copy those structs and functions
into their source, but longer term, they're probably better off
reimplementing those objects and logic their native framework
(QObject, GObject etc).
This commit is contained in:
Kristian Høgsberg 2013-04-18 15:07:23 -04:00
parent 83248317e4
commit e920572e5c
4 changed files with 1 additions and 1289 deletions

View file

@ -472,518 +472,6 @@ wl_client_destroy(struct wl_client *client)
free(client);
}
static void
lose_pointer_focus(struct wl_listener *listener, void *data)
{
struct wl_pointer *pointer =
container_of(listener, struct wl_pointer, focus_listener);
pointer->focus_resource = NULL;
}
static void
lose_keyboard_focus(struct wl_listener *listener, void *data)
{
struct wl_keyboard *keyboard =
container_of(listener, struct wl_keyboard, focus_listener);
keyboard->focus_resource = NULL;
}
static void
lose_touch_focus(struct wl_listener *listener, void *data)
{
struct wl_touch *touch =
container_of(listener, struct wl_touch, focus_listener);
touch->focus_resource = NULL;
}
static void
default_grab_focus(struct wl_pointer_grab *grab,
struct wl_surface *surface, wl_fixed_t x, wl_fixed_t y)
{
struct wl_pointer *pointer = grab->pointer;
if (pointer->button_count > 0)
return;
wl_pointer_set_focus(pointer, surface, x, y);
}
static void
default_grab_motion(struct wl_pointer_grab *grab,
uint32_t time, wl_fixed_t x, wl_fixed_t y)
{
struct wl_resource *resource;
resource = grab->pointer->focus_resource;
if (resource)
wl_pointer_send_motion(resource, time, x, y);
}
static void
default_grab_button(struct wl_pointer_grab *grab,
uint32_t time, uint32_t button, uint32_t state_w)
{
struct wl_pointer *pointer = grab->pointer;
struct wl_resource *resource;
uint32_t serial;
enum wl_pointer_button_state state = state_w;
resource = pointer->focus_resource;
if (resource) {
serial = wl_display_next_serial(resource->client->display);
wl_pointer_send_button(resource, serial, time, button, state_w);
}
if (pointer->button_count == 0 &&
state == WL_POINTER_BUTTON_STATE_RELEASED)
wl_pointer_set_focus(pointer, pointer->current,
pointer->current_x, pointer->current_y);
}
static const struct wl_pointer_grab_interface
default_pointer_grab_interface = {
default_grab_focus,
default_grab_motion,
default_grab_button
};
static void default_grab_touch_down(struct wl_touch_grab *grab,
uint32_t time,
int touch_id,
wl_fixed_t sx,
wl_fixed_t sy)
{
struct wl_touch *touch = grab->touch;
uint32_t serial;
if (touch->focus_resource && touch->focus) {
serial = wl_display_next_serial(touch->focus_resource->client->display);
wl_touch_send_down(touch->focus_resource, serial, time,
&touch->focus->resource, touch_id, sx, sy);
}
}
static void default_grab_touch_up(struct wl_touch_grab *grab,
uint32_t time,
int touch_id)
{
struct wl_touch *touch = grab->touch;
uint32_t serial;
if (touch->focus_resource) {
serial = wl_display_next_serial(touch->focus_resource->client->display);
wl_touch_send_up(touch->focus_resource, serial, time, touch_id);
}
}
static void default_grab_touch_motion(struct wl_touch_grab *grab,
uint32_t time,
int touch_id,
wl_fixed_t sx,
wl_fixed_t sy)
{
struct wl_touch *touch = grab->touch;
if (touch->focus_resource) {
wl_touch_send_motion(touch->focus_resource, time,
touch_id, sx, sy);
}
}
static const struct wl_touch_grab_interface default_touch_grab_interface = {
default_grab_touch_down,
default_grab_touch_up,
default_grab_touch_motion
};
static void
default_grab_key(struct wl_keyboard_grab *grab,
uint32_t time, uint32_t key, uint32_t state)
{
struct wl_keyboard *keyboard = grab->keyboard;
struct wl_resource *resource;
uint32_t serial;
resource = keyboard->focus_resource;
if (resource) {
serial = wl_display_next_serial(resource->client->display);
wl_keyboard_send_key(resource, serial, time, key, state);
}
}
static struct wl_resource *
find_resource_for_surface(struct wl_list *list, struct wl_surface *surface)
{
struct wl_resource *r;
if (!surface)
return NULL;
wl_list_for_each(r, list, link) {
if (r->client == surface->resource.client)
return r;
}
return NULL;
}
static void
default_grab_modifiers(struct wl_keyboard_grab *grab, uint32_t serial,
uint32_t mods_depressed, uint32_t mods_latched,
uint32_t mods_locked, uint32_t group)
{
struct wl_keyboard *keyboard = grab->keyboard;
struct wl_pointer *pointer = keyboard->seat->pointer;
struct wl_resource *resource, *pr;
resource = keyboard->focus_resource;
if (!resource)
return;
wl_keyboard_send_modifiers(resource, serial, mods_depressed,
mods_latched, mods_locked, group);
if (pointer && pointer->focus && pointer->focus != keyboard->focus) {
pr = find_resource_for_surface(&keyboard->resource_list,
pointer->focus);
if (pr) {
wl_keyboard_send_modifiers(pr,
serial,
keyboard->modifiers.mods_depressed,
keyboard->modifiers.mods_latched,
keyboard->modifiers.mods_locked,
keyboard->modifiers.group);
}
}
}
static const struct wl_keyboard_grab_interface
default_keyboard_grab_interface = {
default_grab_key,
default_grab_modifiers,
};
WL_EXPORT void
wl_pointer_init(struct wl_pointer *pointer)
{
memset(pointer, 0, sizeof *pointer);
wl_list_init(&pointer->resource_list);
pointer->focus_listener.notify = lose_pointer_focus;
pointer->default_grab.interface = &default_pointer_grab_interface;
pointer->default_grab.pointer = pointer;
pointer->grab = &pointer->default_grab;
wl_signal_init(&pointer->focus_signal);
/* FIXME: Pick better co-ords. */
pointer->x = wl_fixed_from_int(100);
pointer->y = wl_fixed_from_int(100);
}
WL_EXPORT void
wl_pointer_release(struct wl_pointer *pointer)
{
/* XXX: What about pointer->resource_list? */
if (pointer->focus_resource)
wl_list_remove(&pointer->focus_listener.link);
}
WL_EXPORT void
wl_keyboard_init(struct wl_keyboard *keyboard)
{
memset(keyboard, 0, sizeof *keyboard);
wl_list_init(&keyboard->resource_list);
wl_array_init(&keyboard->keys);
keyboard->focus_listener.notify = lose_keyboard_focus;
keyboard->default_grab.interface = &default_keyboard_grab_interface;
keyboard->default_grab.keyboard = keyboard;
keyboard->grab = &keyboard->default_grab;
wl_signal_init(&keyboard->focus_signal);
}
WL_EXPORT void
wl_keyboard_release(struct wl_keyboard *keyboard)
{
/* XXX: What about keyboard->resource_list? */
if (keyboard->focus_resource)
wl_list_remove(&keyboard->focus_listener.link);
wl_array_release(&keyboard->keys);
}
WL_EXPORT void
wl_touch_init(struct wl_touch *touch)
{
memset(touch, 0, sizeof *touch);
wl_list_init(&touch->resource_list);
touch->focus_listener.notify = lose_touch_focus;
touch->default_grab.interface = &default_touch_grab_interface;
touch->default_grab.touch = touch;
touch->grab = &touch->default_grab;
wl_signal_init(&touch->focus_signal);
}
WL_EXPORT void
wl_touch_release(struct wl_touch *touch)
{
/* XXX: What about touch->resource_list? */
if (touch->focus_resource)
wl_list_remove(&touch->focus_listener.link);
}
WL_EXPORT void
wl_seat_init(struct wl_seat *seat)
{
memset(seat, 0, sizeof *seat);
wl_signal_init(&seat->destroy_signal);
seat->selection_data_source = NULL;
wl_list_init(&seat->base_resource_list);
wl_signal_init(&seat->selection_signal);
wl_list_init(&seat->drag_resource_list);
wl_signal_init(&seat->drag_icon_signal);
}
WL_EXPORT void
wl_seat_release(struct wl_seat *seat)
{
wl_signal_emit(&seat->destroy_signal, seat);
if (seat->pointer)
wl_pointer_release(seat->pointer);
if (seat->keyboard)
wl_keyboard_release(seat->keyboard);
if (seat->touch)
wl_touch_release(seat->touch);
}
static void
seat_send_updated_caps(struct wl_seat *seat)
{
struct wl_resource *r;
enum wl_seat_capability caps = 0;
if (seat->pointer)
caps |= WL_SEAT_CAPABILITY_POINTER;
if (seat->keyboard)
caps |= WL_SEAT_CAPABILITY_KEYBOARD;
if (seat->touch)
caps |= WL_SEAT_CAPABILITY_TOUCH;
wl_list_for_each(r, &seat->base_resource_list, link)
wl_seat_send_capabilities(r, caps);
}
WL_EXPORT void
wl_seat_set_pointer(struct wl_seat *seat, struct wl_pointer *pointer)
{
if (pointer && (seat->pointer || pointer->seat))
return; /* XXX: error? */
if (!pointer && !seat->pointer)
return;
seat->pointer = pointer;
if (pointer)
pointer->seat = seat;
seat_send_updated_caps(seat);
}
WL_EXPORT void
wl_seat_set_keyboard(struct wl_seat *seat, struct wl_keyboard *keyboard)
{
if (keyboard && (seat->keyboard || keyboard->seat))
return; /* XXX: error? */
if (!keyboard && !seat->keyboard)
return;
seat->keyboard = keyboard;
if (keyboard)
keyboard->seat = seat;
seat_send_updated_caps(seat);
}
WL_EXPORT void
wl_seat_set_touch(struct wl_seat *seat, struct wl_touch *touch)
{
if (touch && (seat->touch || touch->seat))
return; /* XXX: error? */
if (!touch && !seat->touch)
return;
seat->touch = touch;
if (touch)
touch->seat = seat;
seat_send_updated_caps(seat);
}
WL_EXPORT void
wl_pointer_set_focus(struct wl_pointer *pointer, struct wl_surface *surface,
wl_fixed_t sx, wl_fixed_t sy)
{
struct wl_keyboard *kbd = pointer->seat->keyboard;
struct wl_resource *resource, *kr;
uint32_t serial;
resource = pointer->focus_resource;
if (resource && pointer->focus != surface) {
serial = wl_display_next_serial(resource->client->display);
wl_pointer_send_leave(resource, serial,
&pointer->focus->resource);
wl_list_remove(&pointer->focus_listener.link);
}
resource = find_resource_for_surface(&pointer->resource_list,
surface);
if (resource &&
(pointer->focus != surface ||
pointer->focus_resource != resource)) {
serial = wl_display_next_serial(resource->client->display);
if (kbd) {
kr = find_resource_for_surface(&kbd->resource_list,
surface);
if (kr) {
wl_keyboard_send_modifiers(kr,
serial,
kbd->modifiers.mods_depressed,
kbd->modifiers.mods_latched,
kbd->modifiers.mods_locked,
kbd->modifiers.group);
}
}
wl_pointer_send_enter(resource, serial, &surface->resource,
sx, sy);
wl_signal_add(&resource->destroy_signal,
&pointer->focus_listener);
pointer->focus_serial = serial;
}
pointer->focus_resource = resource;
pointer->focus = surface;
pointer->default_grab.focus = surface;
wl_signal_emit(&pointer->focus_signal, pointer);
}
WL_EXPORT void
wl_keyboard_set_focus(struct wl_keyboard *keyboard, struct wl_surface *surface)
{
struct wl_resource *resource;
uint32_t serial;
if (keyboard->focus_resource && keyboard->focus != surface) {
resource = keyboard->focus_resource;
serial = wl_display_next_serial(resource->client->display);
wl_keyboard_send_leave(resource, serial,
&keyboard->focus->resource);
wl_list_remove(&keyboard->focus_listener.link);
}
resource = find_resource_for_surface(&keyboard->resource_list,
surface);
if (resource &&
(keyboard->focus != surface ||
keyboard->focus_resource != resource)) {
serial = wl_display_next_serial(resource->client->display);
wl_keyboard_send_modifiers(resource, serial,
keyboard->modifiers.mods_depressed,
keyboard->modifiers.mods_latched,
keyboard->modifiers.mods_locked,
keyboard->modifiers.group);
wl_keyboard_send_enter(resource, serial, &surface->resource,
&keyboard->keys);
wl_signal_add(&resource->destroy_signal,
&keyboard->focus_listener);
keyboard->focus_serial = serial;
}
keyboard->focus_resource = resource;
keyboard->focus = surface;
wl_signal_emit(&keyboard->focus_signal, keyboard);
}
WL_EXPORT void
wl_keyboard_start_grab(struct wl_keyboard *keyboard,
struct wl_keyboard_grab *grab)
{
keyboard->grab = grab;
grab->keyboard = keyboard;
/* XXX focus? */
}
WL_EXPORT void
wl_keyboard_end_grab(struct wl_keyboard *keyboard)
{
keyboard->grab = &keyboard->default_grab;
}
WL_EXPORT void
wl_pointer_start_grab(struct wl_pointer *pointer, struct wl_pointer_grab *grab)
{
const struct wl_pointer_grab_interface *interface;
pointer->grab = grab;
interface = pointer->grab->interface;
grab->pointer = pointer;
if (pointer->current)
interface->focus(pointer->grab, pointer->current,
pointer->current_x, pointer->current_y);
}
WL_EXPORT void
wl_pointer_end_grab(struct wl_pointer *pointer)
{
const struct wl_pointer_grab_interface *interface;
pointer->grab = &pointer->default_grab;
interface = pointer->grab->interface;
interface->focus(pointer->grab, pointer->current,
pointer->current_x, pointer->current_y);
}
static void
current_surface_destroy(struct wl_listener *listener, void *data)
{
struct wl_pointer *pointer =
container_of(listener, struct wl_pointer, current_listener);
pointer->current = NULL;
}
WL_EXPORT void
wl_pointer_set_current(struct wl_pointer *pointer, struct wl_surface *surface)
{
if (pointer->current)
wl_list_remove(&pointer->current_listener.link);
pointer->current = surface;
if (!surface)
return;
wl_signal_add(&surface->resource.destroy_signal,
&pointer->current_listener);
pointer->current_listener.notify = current_surface_destroy;
}
WL_EXPORT void
wl_touch_start_grab(struct wl_touch *touch, struct wl_touch_grab *grab)
{
touch->grab = grab;
grab->touch = touch;
}
WL_EXPORT void
wl_touch_end_grab(struct wl_touch *touch)
{
touch->grab = &touch->default_grab;
}
static void
registry_bind(struct wl_client *client,
struct wl_resource *resource, uint32_t name,