Move seat into extra file
This commit is contained in:
parent
89e9046ccc
commit
9732952cc4
9 changed files with 126 additions and 47 deletions
|
@ -39,7 +39,6 @@ struct kiwmi_cursor {
|
|||
struct wl_listener cursor_button;
|
||||
struct wl_listener cursor_axis;
|
||||
struct wl_listener cursor_frame;
|
||||
struct wl_listener seat_request_set_cursor;
|
||||
|
||||
struct {
|
||||
struct wl_signal button_down;
|
||||
|
|
|
@ -14,7 +14,7 @@ struct kiwmi_input {
|
|||
struct wl_list keyboards; // struct kiwmi_keyboard::link
|
||||
struct wl_listener new_input;
|
||||
struct kiwmi_cursor *cursor;
|
||||
struct wlr_seat *seat;
|
||||
struct kiwmi_seat *seat;
|
||||
|
||||
struct {
|
||||
struct wl_signal keyboard_new;
|
||||
|
|
25
include/input/seat.h
Normal file
25
include/input/seat.h
Normal file
|
@ -0,0 +1,25 @@
|
|||
/* Copyright (c), Niclas Meyer <niclas@countingsort.com>
|
||||
*
|
||||
* This Source Code Form is subject to the terms of the Mozilla Public
|
||||
* License, v. 2.0. If a copy of the MPL was not distributed with this file,
|
||||
* You can obtain one at https://mozilla.org/MPL/2.0/.
|
||||
*/
|
||||
|
||||
#ifndef KIWMI_INPUT_SEAT_H
|
||||
#define KIWMI_INPUT_SEAT_H
|
||||
|
||||
#include <wayland-server.h>
|
||||
|
||||
#include "input/input.h"
|
||||
|
||||
struct kiwmi_seat {
|
||||
struct kiwmi_input *input;
|
||||
struct wlr_seat *seat;
|
||||
|
||||
struct wl_listener request_set_cursor;
|
||||
};
|
||||
|
||||
struct kiwmi_seat *seat_create(struct kiwmi_input *input);
|
||||
void seat_destroy(struct kiwmi_seat *seat);
|
||||
|
||||
#endif /* KIWMI_INPUT_SEAT_H */
|
|
@ -12,6 +12,7 @@
|
|||
|
||||
#include "desktop/output.h"
|
||||
#include "input/cursor.h"
|
||||
#include "input/seat.h"
|
||||
#include "server.h"
|
||||
|
||||
void
|
||||
|
@ -89,7 +90,7 @@ view_focus(struct kiwmi_view *view)
|
|||
|
||||
struct kiwmi_desktop *desktop = view->desktop;
|
||||
struct kiwmi_server *server = wl_container_of(desktop, server, desktop);
|
||||
struct wlr_seat *seat = server->input.seat;
|
||||
struct wlr_seat *seat = server->input.seat->seat;
|
||||
|
||||
if (view == desktop->focused_view) {
|
||||
return;
|
||||
|
@ -174,7 +175,7 @@ view_begin_interactive(
|
|||
struct kiwmi_server *server = wl_container_of(desktop, server, desktop);
|
||||
struct kiwmi_cursor *cursor = server->input.cursor;
|
||||
struct wlr_surface *focused_surface =
|
||||
server->input.seat->pointer_state.focused_surface;
|
||||
server->input.seat->seat->pointer_state.focused_surface;
|
||||
struct wlr_surface *wlr_surface = view->wlr_surface;
|
||||
|
||||
if (wlr_surface != focused_surface) {
|
||||
|
|
|
@ -19,8 +19,8 @@
|
|||
|
||||
#include "desktop/desktop.h"
|
||||
#include "desktop/view.h"
|
||||
#include "input/seat.h"
|
||||
#include "server.h"
|
||||
#include "wlr/util/edges.h"
|
||||
|
||||
static void
|
||||
process_cursor_motion(struct kiwmi_server *server, uint32_t time)
|
||||
|
@ -28,7 +28,7 @@ process_cursor_motion(struct kiwmi_server *server, uint32_t time)
|
|||
struct kiwmi_desktop *desktop = &server->desktop;
|
||||
struct kiwmi_input *input = &server->input;
|
||||
struct kiwmi_cursor *cursor = input->cursor;
|
||||
struct wlr_seat *seat = input->seat;
|
||||
struct wlr_seat *seat = input->seat->seat;
|
||||
|
||||
switch (cursor->cursor_mode) {
|
||||
case KIWMI_CURSOR_MOVE: {
|
||||
|
@ -174,7 +174,7 @@ cursor_button_notify(struct wl_listener *listener, void *data)
|
|||
|
||||
if (!new_event.handled) {
|
||||
wlr_seat_pointer_notify_button(
|
||||
input->seat, event->time_msec, event->button, event->state);
|
||||
input->seat->seat, event->time_msec, event->button, event->state);
|
||||
}
|
||||
|
||||
cursor->cursor_mode = KIWMI_CURSOR_PASSTHROUGH;
|
||||
|
@ -190,7 +190,7 @@ cursor_axis_notify(struct wl_listener *listener, void *data)
|
|||
struct wlr_event_pointer_axis *event = data;
|
||||
|
||||
wlr_seat_pointer_notify_axis(
|
||||
input->seat,
|
||||
input->seat->seat,
|
||||
event->time_msec,
|
||||
event->orientation,
|
||||
event->delta,
|
||||
|
@ -206,32 +206,7 @@ cursor_frame_notify(struct wl_listener *listener, void *UNUSED(data))
|
|||
struct kiwmi_server *server = cursor->server;
|
||||
struct kiwmi_input *input = &server->input;
|
||||
|
||||
wlr_seat_pointer_notify_frame(input->seat);
|
||||
}
|
||||
|
||||
static void
|
||||
seat_request_set_cursor_notify(struct wl_listener *listener, void *data)
|
||||
{
|
||||
struct kiwmi_cursor *cursor =
|
||||
wl_container_of(listener, cursor, seat_request_set_cursor);
|
||||
struct wlr_seat_pointer_request_set_cursor_event *event = data;
|
||||
|
||||
struct wlr_surface *focused_surface =
|
||||
event->seat_client->seat->pointer_state.focused_surface;
|
||||
struct wl_client *focused_client = NULL;
|
||||
|
||||
if (focused_surface && focused_surface->resource) {
|
||||
focused_client = wl_resource_get_client(focused_surface->resource);
|
||||
}
|
||||
|
||||
if (event->seat_client->client != focused_client) {
|
||||
wlr_log(
|
||||
WLR_DEBUG, "Ignoring request to set cursor on unfocused client");
|
||||
return;
|
||||
}
|
||||
|
||||
wlr_cursor_set_surface(
|
||||
cursor->cursor, event->surface, event->hotspot_x, event->hotspot_y);
|
||||
wlr_seat_pointer_notify_frame(input->seat->seat);
|
||||
}
|
||||
|
||||
struct kiwmi_cursor *
|
||||
|
@ -278,11 +253,6 @@ cursor_create(
|
|||
cursor->cursor_frame.notify = cursor_frame_notify;
|
||||
wl_signal_add(&cursor->cursor->events.frame, &cursor->cursor_frame);
|
||||
|
||||
cursor->seat_request_set_cursor.notify = seat_request_set_cursor_notify;
|
||||
wl_signal_add(
|
||||
&server->input.seat->events.request_set_cursor,
|
||||
&cursor->seat_request_set_cursor);
|
||||
|
||||
wl_signal_init(&cursor->events.button_down);
|
||||
wl_signal_init(&cursor->events.button_up);
|
||||
wl_signal_init(&cursor->events.motion);
|
||||
|
@ -301,7 +271,6 @@ cursor_destroy(struct kiwmi_cursor *cursor)
|
|||
wl_list_remove(&cursor->cursor_button.link);
|
||||
wl_list_remove(&cursor->cursor_axis.link);
|
||||
wl_list_remove(&cursor->cursor_frame.link);
|
||||
wl_list_remove(&cursor->seat_request_set_cursor.link);
|
||||
|
||||
free(cursor);
|
||||
}
|
||||
|
|
|
@ -19,6 +19,7 @@
|
|||
#include "desktop/desktop.h"
|
||||
#include "input/cursor.h"
|
||||
#include "input/keyboard.h"
|
||||
#include "input/seat.h"
|
||||
#include "server.h"
|
||||
|
||||
static void
|
||||
|
@ -65,7 +66,7 @@ new_input_notify(struct wl_listener *listener, void *data)
|
|||
caps |= WL_SEAT_CAPABILITY_KEYBOARD;
|
||||
}
|
||||
|
||||
wlr_seat_set_capabilities(input->seat, caps);
|
||||
wlr_seat_set_capabilities(input->seat->seat, caps);
|
||||
}
|
||||
|
||||
bool
|
||||
|
@ -73,7 +74,10 @@ input_init(struct kiwmi_input *input)
|
|||
{
|
||||
struct kiwmi_server *server = wl_container_of(input, server, input);
|
||||
|
||||
input->seat = wlr_seat_create(server->wl_display, "seat-0");
|
||||
input->seat = seat_create(input);
|
||||
if (!input->seat) {
|
||||
return false;
|
||||
}
|
||||
|
||||
input->cursor = cursor_create(server, server->desktop.output_layout);
|
||||
if (!input->cursor) {
|
||||
|
@ -100,5 +104,7 @@ input_fini(struct kiwmi_input *input)
|
|||
free(keyboard);
|
||||
}
|
||||
|
||||
seat_destroy(input->seat);
|
||||
|
||||
cursor_destroy(input->cursor);
|
||||
}
|
||||
|
|
|
@ -18,6 +18,7 @@
|
|||
#include <wlr/util/log.h>
|
||||
#include <xkbcommon/xkbcommon.h>
|
||||
|
||||
#include "input/seat.h"
|
||||
#include "server.h"
|
||||
|
||||
static bool
|
||||
|
@ -46,9 +47,10 @@ keyboard_modifiers_notify(struct wl_listener *listener, void *UNUSED(data))
|
|||
{
|
||||
struct kiwmi_keyboard *keyboard =
|
||||
wl_container_of(listener, keyboard, modifiers);
|
||||
wlr_seat_set_keyboard(keyboard->server->input.seat, keyboard->device);
|
||||
wlr_seat_set_keyboard(keyboard->server->input.seat->seat, keyboard->device);
|
||||
wlr_seat_keyboard_notify_modifiers(
|
||||
keyboard->server->input.seat, &keyboard->device->keyboard->modifiers);
|
||||
keyboard->server->input.seat->seat,
|
||||
&keyboard->device->keyboard->modifiers);
|
||||
}
|
||||
|
||||
static void
|
||||
|
@ -87,9 +89,12 @@ keyboard_key_notify(struct wl_listener *listener, void *data)
|
|||
}
|
||||
|
||||
if (!handled) {
|
||||
wlr_seat_set_keyboard(server->input.seat, keyboard->device);
|
||||
wlr_seat_set_keyboard(server->input.seat->seat, keyboard->device);
|
||||
wlr_seat_keyboard_notify_key(
|
||||
server->input.seat, event->time_msec, event->keycode, event->state);
|
||||
server->input.seat->seat,
|
||||
event->time_msec,
|
||||
event->keycode,
|
||||
event->state);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -141,7 +146,7 @@ keyboard_create(struct kiwmi_server *server, struct wlr_input_device *device)
|
|||
xkb_context_unref(context);
|
||||
wlr_keyboard_set_repeat_info(device->keyboard, 25, 600);
|
||||
|
||||
wlr_seat_set_keyboard(server->input.seat, device);
|
||||
wlr_seat_set_keyboard(server->input.seat->seat, device);
|
||||
|
||||
wl_signal_init(&keyboard->events.key_down);
|
||||
wl_signal_init(&keyboard->events.key_up);
|
||||
|
|
73
kiwmi/input/seat.c
Normal file
73
kiwmi/input/seat.c
Normal file
|
@ -0,0 +1,73 @@
|
|||
/* Copyright (c), Niclas Meyer <niclas@countingsort.com>
|
||||
*
|
||||
* This Source Code Form is subject to the terms of the Mozilla Public
|
||||
* License, v. 2.0. If a copy of the MPL was not distributed with this file,
|
||||
* You can obtain one at https://mozilla.org/MPL/2.0/.
|
||||
*/
|
||||
|
||||
#include "input/seat.h"
|
||||
|
||||
#include <stdlib.h>
|
||||
|
||||
#include <wayland-server.h>
|
||||
#include <wlr/types/wlr_cursor.h>
|
||||
#include <wlr/types/wlr_seat.h>
|
||||
#include <wlr/util/log.h>
|
||||
|
||||
#include "input/cursor.h"
|
||||
#include "server.h"
|
||||
|
||||
static void
|
||||
request_set_cursor_notify(struct wl_listener *listener, void *data)
|
||||
{
|
||||
struct kiwmi_seat *seat =
|
||||
wl_container_of(listener, seat, request_set_cursor);
|
||||
struct kiwmi_cursor *cursor = seat->input->cursor;
|
||||
struct wlr_seat_pointer_request_set_cursor_event *event = data;
|
||||
|
||||
struct wlr_surface *focused_surface =
|
||||
event->seat_client->seat->pointer_state.focused_surface;
|
||||
struct wl_client *focused_client = NULL;
|
||||
|
||||
if (focused_surface && focused_surface->resource) {
|
||||
focused_client = wl_resource_get_client(focused_surface->resource);
|
||||
}
|
||||
|
||||
if (event->seat_client->client != focused_client) {
|
||||
wlr_log(
|
||||
WLR_DEBUG, "Ignoring request to set cursor on unfocused client");
|
||||
return;
|
||||
}
|
||||
|
||||
wlr_cursor_set_surface(
|
||||
cursor->cursor, event->surface, event->hotspot_x, event->hotspot_y);
|
||||
}
|
||||
|
||||
struct kiwmi_seat *
|
||||
seat_create(struct kiwmi_input *input)
|
||||
{
|
||||
struct kiwmi_server *server = wl_container_of(input, server, input);
|
||||
|
||||
struct kiwmi_seat *seat = malloc(sizeof(*seat));
|
||||
if (!seat) {
|
||||
wlr_log(WLR_ERROR, "Failed to allocate kiwmi_seat");
|
||||
return NULL;
|
||||
}
|
||||
|
||||
seat->input = input;
|
||||
seat->seat = wlr_seat_create(server->wl_display, "seat-0");
|
||||
|
||||
seat->request_set_cursor.notify = request_set_cursor_notify;
|
||||
wl_signal_add(
|
||||
&seat->seat->events.request_set_cursor, &seat->request_set_cursor);
|
||||
|
||||
return seat;
|
||||
}
|
||||
|
||||
void
|
||||
seat_destroy(struct kiwmi_seat *seat)
|
||||
{
|
||||
wl_list_remove(&seat->request_set_cursor.link);
|
||||
|
||||
free(seat);
|
||||
}
|
|
@ -9,6 +9,7 @@ kiwmi_sources = files(
|
|||
'input/cursor.c',
|
||||
'input/input.c',
|
||||
'input/keyboard.c',
|
||||
'input/seat.c',
|
||||
'luak/ipc.c',
|
||||
'luak/kiwmi_cursor.c',
|
||||
'luak/kiwmi_keyboard.c',
|
||||
|
|
Loading…
Reference in a new issue