mirror of
https://github.com/wizbright/waybox.git
synced 2025-10-29 05:40:20 -04:00
commit
4831239953
6 changed files with 90 additions and 1 deletions
18
include/waybox/cursor.h
Normal file
18
include/waybox/cursor.h
Normal file
|
|
@ -0,0 +1,18 @@
|
||||||
|
#ifndef CURSOR_H
|
||||||
|
#define CURSOR_H
|
||||||
|
#include <wayland-server.h>
|
||||||
|
#include <wlr/types/wlr_cursor.h>
|
||||||
|
#include <wlr/types/wlr_xcursor_manager.h>
|
||||||
|
|
||||||
|
struct wb_cursor {
|
||||||
|
struct wlr_cursor *cursor;
|
||||||
|
struct wlr_xcursor_manager *xcursor_manager;
|
||||||
|
|
||||||
|
struct wl_listener cursor_motion;
|
||||||
|
struct wl_listener cursor_motion_absolute;
|
||||||
|
};
|
||||||
|
|
||||||
|
struct wb_cursor *wb_cursor_create();
|
||||||
|
void wb_cursor_destroy(struct wb_cursor *cursor);
|
||||||
|
|
||||||
|
#endif // cursor.h
|
||||||
|
|
@ -19,9 +19,10 @@
|
||||||
#include <wlr/types/wlr_matrix.h>
|
#include <wlr/types/wlr_matrix.h>
|
||||||
#include <wlr/types/wlr_gamma_control.h>
|
#include <wlr/types/wlr_gamma_control.h>
|
||||||
#include <wlr/types/wlr_primary_selection.h>
|
#include <wlr/types/wlr_primary_selection.h>
|
||||||
|
#include <wlr/types/wlr_output_layout.h>
|
||||||
|
|
||||||
#include "waybox/output.h"
|
#include "waybox/output.h"
|
||||||
|
#include "waybox/cursor.h"
|
||||||
|
|
||||||
struct wb_server {
|
struct wb_server {
|
||||||
struct wl_display *wl_display;
|
struct wl_display *wl_display;
|
||||||
|
|
@ -30,7 +31,11 @@ struct wb_server {
|
||||||
struct wlr_backend *backend;
|
struct wlr_backend *backend;
|
||||||
struct wlr_compositor *compositor;
|
struct wlr_compositor *compositor;
|
||||||
|
|
||||||
|
struct wlr_output_layout *layout;
|
||||||
|
struct wb_cursor *cursor;
|
||||||
|
|
||||||
struct wl_listener new_output;
|
struct wl_listener new_output;
|
||||||
|
struct wl_listener new_input;
|
||||||
struct wl_list outputs; // wb_output::link
|
struct wl_list outputs; // wb_output::link
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
||||||
38
waybox/cursor.c
Normal file
38
waybox/cursor.c
Normal file
|
|
@ -0,0 +1,38 @@
|
||||||
|
#include <stdlib.h>
|
||||||
|
#include "waybox/cursor.h"
|
||||||
|
|
||||||
|
static void handle_cursor_motion(struct wl_listener *listener, void *data) {
|
||||||
|
struct wb_cursor *cursor = wl_container_of(listener, cursor, cursor_motion);
|
||||||
|
struct wlr_event_pointer_motion *event = data;
|
||||||
|
wlr_cursor_move(cursor->cursor, event->device, event->delta_x, event->delta_y);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void handle_cursor_motion_absolute(struct wl_listener *listener, void *data) {
|
||||||
|
struct wb_cursor *cursor = wl_container_of(listener, cursor, cursor_motion_absolute);
|
||||||
|
struct wlr_event_pointer_motion_absolute *event = data;
|
||||||
|
wlr_cursor_warp_absolute(cursor->cursor, event->device, event->x, event->y);
|
||||||
|
}
|
||||||
|
|
||||||
|
struct wb_cursor *wb_cursor_create() {
|
||||||
|
struct wb_cursor *cursor = malloc(sizeof(struct wb_cursor));
|
||||||
|
cursor->cursor = wlr_cursor_create();
|
||||||
|
cursor->xcursor_manager = wlr_xcursor_manager_create("default", 24);
|
||||||
|
|
||||||
|
cursor->cursor_motion.notify = handle_cursor_motion;
|
||||||
|
wl_signal_add(&cursor->cursor->events.motion, &cursor->cursor_motion);
|
||||||
|
|
||||||
|
cursor->cursor_motion_absolute.notify = handle_cursor_motion_absolute;
|
||||||
|
wl_signal_add(&cursor->cursor->events.motion_absolute, &cursor->cursor_motion_absolute);
|
||||||
|
|
||||||
|
return cursor;
|
||||||
|
}
|
||||||
|
|
||||||
|
void wb_cursor_destroy(struct wb_cursor *cursor) {
|
||||||
|
if (!cursor) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
wlr_xcursor_manager_destroy(cursor->xcursor_manager);
|
||||||
|
wlr_cursor_destroy(cursor->cursor);
|
||||||
|
free(cursor);
|
||||||
|
}
|
||||||
|
|
@ -1,4 +1,5 @@
|
||||||
wb_src = files(
|
wb_src = files(
|
||||||
|
'cursor.c',
|
||||||
'main.c',
|
'main.c',
|
||||||
'output.c',
|
'output.c',
|
||||||
'server.c',
|
'server.c',
|
||||||
|
|
|
||||||
|
|
@ -42,6 +42,7 @@ void output_frame_notify(struct wl_listener *listener, void *data) {
|
||||||
|
|
||||||
void output_destroy_notify(struct wl_listener *listener, void *data) {
|
void output_destroy_notify(struct wl_listener *listener, void *data) {
|
||||||
struct wb_output *output = wl_container_of(listener, output, destroy);
|
struct wb_output *output = wl_container_of(listener, output, destroy);
|
||||||
|
wlr_output_layout_remove(output->server->layout, output->wlr_output);
|
||||||
wl_list_remove(&output->link);
|
wl_list_remove(&output->link);
|
||||||
wl_list_remove(&output->destroy.link);
|
wl_list_remove(&output->destroy.link);
|
||||||
wl_list_remove(&output->frame.link);
|
wl_list_remove(&output->frame.link);
|
||||||
|
|
@ -72,4 +73,8 @@ void new_output_notify(struct wl_listener *listener, void *data) {
|
||||||
wl_signal_add(&wlr_output->events.destroy, &output->destroy);
|
wl_signal_add(&wlr_output->events.destroy, &output->destroy);
|
||||||
output->frame.notify = output_frame_notify;
|
output->frame.notify = output_frame_notify;
|
||||||
wl_signal_add(&wlr_output->events.frame, &output->frame);
|
wl_signal_add(&wlr_output->events.frame, &output->frame);
|
||||||
|
|
||||||
|
wlr_output_layout_add_auto(server->layout, output->wlr_output);
|
||||||
|
wlr_xcursor_manager_load(server->cursor->xcursor_manager, output->wlr_output->scale);
|
||||||
|
wlr_xcursor_manager_set_cursor_image(server->cursor->xcursor_manager, "left_ptr", server->cursor->cursor);
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -1,5 +1,17 @@
|
||||||
#include "waybox/server.h"
|
#include "waybox/server.h"
|
||||||
|
|
||||||
|
static void new_input_notify(struct wl_listener *listener, void *data) {
|
||||||
|
struct wlr_input_device *device = data;
|
||||||
|
struct wb_server *server = wl_container_of(listener, server, new_input);
|
||||||
|
switch (device->type) {
|
||||||
|
case WLR_INPUT_DEVICE_POINTER:
|
||||||
|
wlr_cursor_attach_input_device(server->cursor->cursor, device);
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
bool init_wb(struct wb_server* server) {
|
bool init_wb(struct wb_server* server) {
|
||||||
|
|
||||||
// create display
|
// create display
|
||||||
|
|
@ -21,6 +33,10 @@ bool init_wb(struct wb_server* server) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
server->layout = wlr_output_layout_create();
|
||||||
|
server->cursor = wb_cursor_create();
|
||||||
|
wlr_cursor_attach_output_layout(server->cursor->cursor, server->layout);
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -30,6 +46,9 @@ bool start_wb(struct wb_server* server) {
|
||||||
server->new_output.notify = new_output_notify;
|
server->new_output.notify = new_output_notify;
|
||||||
wl_signal_add(&server->backend->events.new_output, &server->new_output);
|
wl_signal_add(&server->backend->events.new_output, &server->new_output);
|
||||||
|
|
||||||
|
server->new_input.notify = new_input_notify;
|
||||||
|
wl_signal_add(&server->backend->events.new_input, &server->new_input);
|
||||||
|
|
||||||
const char *socket = wl_display_add_socket_auto(server->wl_display);
|
const char *socket = wl_display_add_socket_auto(server->wl_display);
|
||||||
assert(socket);
|
assert(socket);
|
||||||
|
|
||||||
|
|
@ -58,5 +77,8 @@ bool terminate_wb(struct wb_server* server) {
|
||||||
|
|
||||||
printf("Display destroyed.\n");
|
printf("Display destroyed.\n");
|
||||||
|
|
||||||
|
wb_cursor_destroy(server->cursor);
|
||||||
|
wlr_output_layout_destroy(server->layout);
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue