mirror of
https://gitlab.freedesktop.org/wlroots/wlroots.git
synced 2025-11-08 13:29:45 -05:00
Merge branch 'master' into feature/data-device-selection
This commit is contained in:
commit
a87b60e31e
16 changed files with 255 additions and 60 deletions
|
|
@ -16,12 +16,13 @@
|
|||
|
||||
static void usage(const char *name, int ret) {
|
||||
fprintf(stderr,
|
||||
"usage: %s [-C <FILE>]\n"
|
||||
"usage: %s [-C <FILE>] [-E <COMMAND>]\n"
|
||||
"\n"
|
||||
" -C <FILE> Path to the configuration file\n"
|
||||
" (default: rootston.ini).\n"
|
||||
" See `rootston.ini.example` for config\n"
|
||||
" file documentation.\n", name);
|
||||
" file documentation.\n"
|
||||
" -E <COMMAND> Command that will be ran at startup.\n" , name);
|
||||
|
||||
exit(ret);
|
||||
}
|
||||
|
|
@ -263,17 +264,24 @@ static int config_ini_handler(void *user, const char *section, const char *name,
|
|||
|
||||
struct roots_config *parse_args(int argc, char *argv[]) {
|
||||
struct roots_config *config = calloc(1, sizeof(struct roots_config));
|
||||
if (config == NULL) {
|
||||
return NULL;
|
||||
}
|
||||
|
||||
config->xwayland = true;
|
||||
wl_list_init(&config->outputs);
|
||||
wl_list_init(&config->devices);
|
||||
wl_list_init(&config->bindings);
|
||||
|
||||
int c;
|
||||
while ((c = getopt(argc, argv, "C:h")) != -1) {
|
||||
while ((c = getopt(argc, argv, "C:E:h")) != -1) {
|
||||
switch (c) {
|
||||
case 'C':
|
||||
config->config_path = strdup(optarg);
|
||||
break;
|
||||
case 'E':
|
||||
config->startup_cmd = strdup(optarg);
|
||||
break;
|
||||
case 'h':
|
||||
case '?':
|
||||
usage(argv[0], c != 'h');
|
||||
|
|
@ -296,7 +304,8 @@ struct roots_config *parse_args(int argc, char *argv[]) {
|
|||
int result = ini_parse(config->config_path, config_ini_handler, config);
|
||||
|
||||
if (result == -1) {
|
||||
wlr_log(L_DEBUG, "No config file found. Using empty config.");
|
||||
wlr_log(L_DEBUG, "No config file found. Using sensible defaults.");
|
||||
config->keyboard.meta_key = WLR_MODIFIER_LOGO;
|
||||
add_binding_config(&config->bindings, "Logo+Shift+e", "exit");
|
||||
add_binding_config(&config->bindings, "Ctrl+q", "close");
|
||||
add_binding_config(&config->bindings, "Alt+Tab", "next_window");
|
||||
|
|
|
|||
|
|
@ -17,6 +17,7 @@
|
|||
#include "rootston/config.h"
|
||||
#include "rootston/input.h"
|
||||
#include "rootston/desktop.h"
|
||||
#include "rootston/view.h"
|
||||
|
||||
const struct roots_input_event *get_input_event(struct roots_input *input,
|
||||
uint32_t serial) {
|
||||
|
|
@ -84,8 +85,8 @@ void cursor_update_position(struct roots_input *input, uint32_t time) {
|
|||
double sx, sy;
|
||||
switch (input->mode) {
|
||||
case ROOTS_CURSOR_PASSTHROUGH:
|
||||
view = view_at(desktop, input->cursor->x, input->cursor->y, &surface,
|
||||
&sx, &sy);
|
||||
view = view_at(desktop, input->cursor->x, input->cursor->y,
|
||||
&surface, &sx, &sy);
|
||||
bool set_compositor_cursor = !view && input->cursor_client;
|
||||
if (view) {
|
||||
struct wl_client *view_client =
|
||||
|
|
@ -106,32 +107,40 @@ void cursor_update_position(struct roots_input *input, uint32_t time) {
|
|||
break;
|
||||
case ROOTS_CURSOR_MOVE:
|
||||
if (input->active_view) {
|
||||
int dx = input->cursor->x - input->offs_x,
|
||||
dy = input->cursor->y - input->offs_y;
|
||||
input->active_view->x = input->view_x + dx;
|
||||
input->active_view->y = input->view_y + dy;
|
||||
double dx = input->cursor->x - input->offs_x;
|
||||
double dy = input->cursor->y - input->offs_y;
|
||||
view_set_position(input->active_view,
|
||||
input->view_x + dx, input->view_y + dy);
|
||||
}
|
||||
break;
|
||||
case ROOTS_CURSOR_RESIZE:
|
||||
if (input->active_view) {
|
||||
int dx = input->cursor->x - input->offs_x,
|
||||
dy = input->cursor->y - input->offs_y;
|
||||
int width = input->view_width,
|
||||
height = input->view_height;
|
||||
double dx = input->cursor->x - input->offs_x;
|
||||
double dy = input->cursor->y - input->offs_y;
|
||||
double active_x = input->active_view->x;
|
||||
double active_y = input->active_view->y;
|
||||
int width = input->view_width;
|
||||
int height = input->view_height;
|
||||
if (input->resize_edges & ROOTS_CURSOR_RESIZE_EDGE_TOP) {
|
||||
input->active_view->y = input->view_y + dy;
|
||||
active_y = input->view_y + dy;
|
||||
height -= dy;
|
||||
}
|
||||
if (input->resize_edges & ROOTS_CURSOR_RESIZE_EDGE_BOTTOM) {
|
||||
height += dy;
|
||||
}
|
||||
if (input->resize_edges & ROOTS_CURSOR_RESIZE_EDGE_LEFT) {
|
||||
input->active_view->x = input->view_x + dx;
|
||||
active_x = input->view_x + dx;
|
||||
width -= dx;
|
||||
}
|
||||
if (input->resize_edges & ROOTS_CURSOR_RESIZE_EDGE_RIGHT) {
|
||||
width += dx;
|
||||
}
|
||||
|
||||
// TODO we might need one configure event for this
|
||||
if (active_x != input->active_view->x ||
|
||||
active_y != input->active_view->y) {
|
||||
view_set_position(input->active_view, active_x, active_y);
|
||||
}
|
||||
view_resize(input->active_view, width, height);
|
||||
}
|
||||
break;
|
||||
|
|
@ -280,6 +289,56 @@ static void handle_cursor_button(struct wl_listener *listener, void *data) {
|
|||
(uint32_t)(event->time_usec / 1000), event->button, event->state);
|
||||
}
|
||||
|
||||
static void handle_touch_down(struct wl_listener *listener, void *data) {
|
||||
struct wlr_event_touch_down *event = data;
|
||||
struct roots_input *input =
|
||||
wl_container_of(listener, input, cursor_touch_down);
|
||||
struct roots_touch_point *point =
|
||||
calloc(1, sizeof(struct roots_touch_point));
|
||||
point->device = event->device->data;
|
||||
point->slot = event->slot;
|
||||
point->x = event->x_mm / event->width_mm;
|
||||
point->y = event->y_mm / event->height_mm;
|
||||
wlr_cursor_warp_absolute(input->cursor, event->device, point->x, point->y);
|
||||
cursor_update_position(input, (uint32_t)(event->time_usec / 1000));
|
||||
wl_list_insert(&input->touch_points, &point->link);
|
||||
do_cursor_button_press(input, input->cursor, event->device,
|
||||
(uint32_t)(event->time_usec / 1000), BTN_LEFT, 1);
|
||||
}
|
||||
|
||||
static void handle_touch_up(struct wl_listener *listener, void *data) {
|
||||
struct wlr_event_touch_up *event = data;
|
||||
struct roots_input *input =
|
||||
wl_container_of(listener, input, cursor_touch_up);
|
||||
struct roots_touch_point *point;
|
||||
wl_list_for_each(point, &input->touch_points, link) {
|
||||
if (point->slot == event->slot) {
|
||||
wl_list_remove(&point->link);
|
||||
break;
|
||||
}
|
||||
}
|
||||
do_cursor_button_press(input, input->cursor, event->device,
|
||||
(uint32_t)(event->time_usec / 1000), BTN_LEFT, 0);
|
||||
}
|
||||
|
||||
static void handle_touch_motion(struct wl_listener *listener, void *data) {
|
||||
struct wlr_event_touch_motion *event = data;
|
||||
struct roots_input *input =
|
||||
wl_container_of(listener, input, cursor_touch_motion);
|
||||
struct roots_touch_point *point;
|
||||
wl_list_for_each(point, &input->touch_points, link) {
|
||||
if (point->slot == event->slot) {
|
||||
point->x = event->x_mm / event->width_mm;
|
||||
point->y = event->y_mm / event->height_mm;
|
||||
wlr_cursor_warp_absolute(input->cursor, event->device,
|
||||
point->x, point->y);
|
||||
cursor_update_position(input,
|
||||
(uint32_t)(event->time_usec / 1000));
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
static void handle_tool_axis(struct wl_listener *listener, void *data) {
|
||||
struct roots_input *input = wl_container_of(listener, input, cursor_tool_axis);
|
||||
struct wlr_event_tablet_tool_axis *event = data;
|
||||
|
|
@ -390,6 +449,9 @@ static void handle_request_set_cursor(struct wl_listener *listener,
|
|||
|
||||
void cursor_initialize(struct roots_input *input) {
|
||||
struct wlr_cursor *cursor = input->cursor;
|
||||
|
||||
// TODO: Does this belong here
|
||||
wl_list_init(&input->touch_points);
|
||||
|
||||
wl_list_init(&input->cursor_motion.link);
|
||||
wl_signal_add(&cursor->events.motion, &input->cursor_motion);
|
||||
|
|
@ -408,6 +470,18 @@ void cursor_initialize(struct roots_input *input) {
|
|||
wl_signal_add(&cursor->events.axis, &input->cursor_axis);
|
||||
input->cursor_axis.notify = handle_cursor_axis;
|
||||
|
||||
wl_list_init(&input->cursor_touch_down.link);
|
||||
wl_signal_add(&cursor->events.touch_down, &input->cursor_touch_down);
|
||||
input->cursor_touch_down.notify = handle_touch_down;
|
||||
|
||||
wl_list_init(&input->cursor_touch_up.link);
|
||||
wl_signal_add(&cursor->events.touch_up, &input->cursor_touch_up);
|
||||
input->cursor_touch_up.notify = handle_touch_up;
|
||||
|
||||
wl_list_init(&input->cursor_touch_motion.link);
|
||||
wl_signal_add(&cursor->events.touch_motion, &input->cursor_touch_motion);
|
||||
input->cursor_touch_motion.notify = handle_touch_motion;
|
||||
|
||||
wl_list_init(&input->cursor_tool_axis.link);
|
||||
wl_signal_add(&cursor->events.tablet_tool_axis, &input->cursor_tool_axis);
|
||||
input->cursor_tool_axis.notify = handle_tool_axis;
|
||||
|
|
|
|||
|
|
@ -46,6 +46,16 @@ void view_get_size(struct roots_view *view, struct wlr_box *box) {
|
|||
box->height = view->wlr_surface->current->height;
|
||||
}
|
||||
|
||||
void view_set_position(struct roots_view *view, double x, double y) {
|
||||
if (view->set_position) {
|
||||
view->set_position(view, x, y);
|
||||
return;
|
||||
}
|
||||
|
||||
view->x = x;
|
||||
view->y = y;
|
||||
}
|
||||
|
||||
void view_activate(struct roots_view *view, bool activate) {
|
||||
if (view->activate) {
|
||||
view->activate(view, activate);
|
||||
|
|
|
|||
|
|
@ -37,7 +37,7 @@ static void input_add_notify(struct wl_listener *listener, void *data) {
|
|||
pointer_add(device, input);
|
||||
break;
|
||||
case WLR_INPUT_DEVICE_TOUCH:
|
||||
//touch_add(device, input);
|
||||
touch_add(device, input);
|
||||
break;
|
||||
case WLR_INPUT_DEVICE_TABLET_TOOL:
|
||||
tablet_tool_add(device, input);
|
||||
|
|
@ -58,7 +58,7 @@ static void input_remove_notify(struct wl_listener *listener, void *data) {
|
|||
pointer_remove(device, input);
|
||||
break;
|
||||
case WLR_INPUT_DEVICE_TOUCH:
|
||||
//touch_remove(device, input);
|
||||
touch_remove(device, input);
|
||||
break;
|
||||
case WLR_INPUT_DEVICE_TABLET_TOOL:
|
||||
tablet_tool_remove(device, input);
|
||||
|
|
|
|||
|
|
@ -1,6 +1,7 @@
|
|||
#define _POSIX_C_SOURCE 200112L
|
||||
#include <assert.h>
|
||||
#include <stdlib.h>
|
||||
#include <unistd.h>
|
||||
#include <wayland-server.h>
|
||||
#include <wlr/backend.h>
|
||||
#include <wlr/render.h>
|
||||
|
|
@ -42,6 +43,18 @@ int main(int argc, char **argv) {
|
|||
}
|
||||
|
||||
setenv("WAYLAND_DISPLAY", socket, true);
|
||||
|
||||
if (server.config->startup_cmd != NULL) {
|
||||
const char *cmd = server.config->startup_cmd;
|
||||
pid_t pid = fork();
|
||||
if (pid < 0) {
|
||||
wlr_log(L_ERROR, "cannot execute binding command: fork() failed");
|
||||
return 1;
|
||||
} else if (pid == 0) {
|
||||
execl("/bin/sh", "/bin/sh", "-c", cmd, (void *)NULL);
|
||||
}
|
||||
}
|
||||
|
||||
wl_display_run(server.wl_display);
|
||||
wlr_backend_destroy(server.backend);
|
||||
return 0;
|
||||
|
|
|
|||
|
|
@ -9,6 +9,7 @@ sources = [
|
|||
'output.c',
|
||||
'pointer.c',
|
||||
'tablet_tool.c',
|
||||
'touch.c',
|
||||
'xdg_shell_v6.c',
|
||||
'wl_shell.c',
|
||||
]
|
||||
|
|
|
|||
26
rootston/touch.c
Normal file
26
rootston/touch.c
Normal file
|
|
@ -0,0 +1,26 @@
|
|||
#include <stdlib.h>
|
||||
#include <wayland-server.h>
|
||||
#include <wlr/types/wlr_input_device.h>
|
||||
#include <wlr/types/wlr_pointer.h>
|
||||
#include "rootston/input.h"
|
||||
|
||||
// TODO: we'll likely want touch events to both control the cursor *and* be
|
||||
// submitted directly to the seat.
|
||||
|
||||
void touch_add(struct wlr_input_device *device, struct roots_input *input) {
|
||||
struct roots_touch *touch = calloc(sizeof(struct roots_touch), 1);
|
||||
device->data = touch;
|
||||
touch->device = device;
|
||||
touch->input = input;
|
||||
wl_list_insert(&input->touch, &touch->link);
|
||||
wlr_cursor_attach_input_device(input->cursor, device);
|
||||
cursor_load_config(input->server->config, input->cursor,
|
||||
input, input->server->desktop);
|
||||
}
|
||||
|
||||
void touch_remove(struct wlr_input_device *device, struct roots_input *input) {
|
||||
struct roots_touch *touch = device->data;
|
||||
wlr_cursor_detach_input_device(input->cursor, device);
|
||||
wl_list_remove(&touch->link);
|
||||
free(touch);
|
||||
}
|
||||
|
|
@ -109,19 +109,6 @@ void handle_wl_shell_surface(struct wl_listener *listener, void *data) {
|
|||
struct roots_view *view = calloc(1, sizeof(struct roots_view));
|
||||
view->type = ROOTS_WL_SHELL_VIEW;
|
||||
|
||||
if (surface->state == WLR_WL_SHELL_SURFACE_STATE_TRANSIENT) {
|
||||
// we need to map it relative to the parent
|
||||
int i =
|
||||
list_seq_find(desktop->views,
|
||||
shell_surface_compare_equals, surface->parent);
|
||||
if (i != -1) {
|
||||
struct roots_view *parent = desktop->views->items[i];
|
||||
view->x = parent->x + surface->transient_state->x;
|
||||
view->y = parent->y + surface->transient_state->y;
|
||||
}
|
||||
} else {
|
||||
view->x = view->y = 200;
|
||||
}
|
||||
view->wl_shell_surface = surface;
|
||||
view->roots_wl_shell_surface = roots_surface;
|
||||
view->wlr_surface = surface->surface;
|
||||
|
|
@ -131,4 +118,17 @@ void handle_wl_shell_surface(struct wl_listener *listener, void *data) {
|
|||
roots_surface->view = view;
|
||||
list_add(desktop->views, view);
|
||||
view_initialize(view);
|
||||
|
||||
if (surface->state == WLR_WL_SHELL_SURFACE_STATE_TRANSIENT) {
|
||||
// we need to map it relative to the parent
|
||||
int i =
|
||||
list_seq_find(desktop->views,
|
||||
shell_surface_compare_equals, surface->parent);
|
||||
if (i != -1) {
|
||||
struct roots_view *parent = desktop->views->items[i];
|
||||
view_set_position(view,
|
||||
parent->x + surface->transient_state->x,
|
||||
parent->y + surface->transient_state->y);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -26,6 +26,15 @@ static void resize(struct roots_view *view, uint32_t width, uint32_t height) {
|
|||
xwayland_surface->x, xwayland_surface->y, width, height);
|
||||
}
|
||||
|
||||
static void set_position(struct roots_view *view, double x, double y) {
|
||||
assert(view->type == ROOTS_XWAYLAND_VIEW);
|
||||
struct wlr_xwayland_surface *xwayland_surface = view->xwayland_surface;
|
||||
view->x = x;
|
||||
view->y = y;
|
||||
wlr_xwayland_surface_configure(view->desktop->xwayland, xwayland_surface,
|
||||
x, y, xwayland_surface->width, xwayland_surface->height);
|
||||
}
|
||||
|
||||
static void close(struct roots_view *view) {
|
||||
assert(view->type == ROOTS_XWAYLAND_VIEW);
|
||||
wlr_xwayland_surface_close(view->desktop->xwayland, view->xwayland_surface);
|
||||
|
|
@ -88,7 +97,12 @@ void handle_xwayland_surface(struct wl_listener *listener, void *data) {
|
|||
view->desktop = desktop;
|
||||
view->activate = activate;
|
||||
view->resize = resize;
|
||||
view->set_position = set_position;
|
||||
view->close = close;
|
||||
roots_surface->view = view;
|
||||
list_add(desktop->views, view);
|
||||
|
||||
if (!surface->override_redirect) {
|
||||
view_initialize(view);
|
||||
}
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue