mirror of
https://github.com/wizbright/waybox.git
synced 2025-10-29 05:40:20 -04:00
xdg-decoration support
This commit is contained in:
parent
87c32d58ab
commit
1bf513d9d6
11 changed files with 92 additions and 22 deletions
|
|
@ -1,10 +1,9 @@
|
||||||
#ifndef CURSOR_H
|
#ifndef _WB_CURSOR_H
|
||||||
#define CURSOR_H
|
#define _WB_CURSOR_H
|
||||||
#include <wayland-server.h>
|
|
||||||
#include <wlr/types/wlr_cursor.h>
|
#include <wlr/types/wlr_cursor.h>
|
||||||
#include <wlr/types/wlr_xcursor_manager.h>
|
#include <wlr/types/wlr_xcursor_manager.h>
|
||||||
|
|
||||||
#include "waybox/server.h"
|
struct wb_server;
|
||||||
|
|
||||||
enum wb_cursor_mode {
|
enum wb_cursor_mode {
|
||||||
WB_CURSOR_PASSTHROUGH,
|
WB_CURSOR_PASSTHROUGH,
|
||||||
|
|
@ -32,4 +31,4 @@ struct wb_cursor {
|
||||||
struct wb_cursor *wb_cursor_create(struct wb_server *server);
|
struct wb_cursor *wb_cursor_create(struct wb_server *server);
|
||||||
void wb_cursor_destroy(struct wb_cursor *cursor);
|
void wb_cursor_destroy(struct wb_cursor *cursor);
|
||||||
|
|
||||||
#endif // cursor.h
|
#endif /* cursor.h */
|
||||||
|
|
|
||||||
|
|
@ -1,5 +1,5 @@
|
||||||
#ifndef OUTPUT_H
|
#ifndef _WB_OUTPUT_H
|
||||||
#define OUTPUT_H
|
#define _WB_OUTPUT_H
|
||||||
|
|
||||||
#ifndef _POSIX_C_SOURCE
|
#ifndef _POSIX_C_SOURCE
|
||||||
#define _POSIX_C_SOURCE 200112L
|
#define _POSIX_C_SOURCE 200112L
|
||||||
|
|
@ -45,4 +45,4 @@ 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);
|
||||||
void new_output_notify(struct wl_listener* listener, void *data);
|
void new_output_notify(struct wl_listener* listener, void *data);
|
||||||
|
|
||||||
#endif // output.h
|
#endif /* output.h */
|
||||||
|
|
|
||||||
|
|
@ -6,7 +6,7 @@
|
||||||
#include <wlr/types/wlr_primary_selection_v1.h>
|
#include <wlr/types/wlr_primary_selection_v1.h>
|
||||||
#include <wlr/types/wlr_seat.h>
|
#include <wlr/types/wlr_seat.h>
|
||||||
|
|
||||||
#include "waybox/server.h"
|
struct wb_server;
|
||||||
|
|
||||||
struct wb_seat {
|
struct wb_seat {
|
||||||
struct wlr_seat *seat;
|
struct wlr_seat *seat;
|
||||||
|
|
|
||||||
|
|
@ -1,5 +1,5 @@
|
||||||
#ifndef SERVER_H
|
#ifndef _WB_SERVER_H
|
||||||
#define SERVER_H
|
#define _WB_SERVER_H
|
||||||
|
|
||||||
#ifndef _POSIX_C_SOURCE
|
#ifndef _POSIX_C_SOURCE
|
||||||
#define _POSIX_C_SOURCE 200112L
|
#define _POSIX_C_SOURCE 200112L
|
||||||
|
|
@ -25,38 +25,40 @@
|
||||||
#include <locale.h>
|
#include <locale.h>
|
||||||
#define _ gettext
|
#define _ gettext
|
||||||
|
|
||||||
#include "waybox/output.h"
|
|
||||||
#include "waybox/cursor.h"
|
#include "waybox/cursor.h"
|
||||||
|
#include "decoration.h"
|
||||||
|
#include "waybox/output.h"
|
||||||
#include "waybox/seat.h"
|
#include "waybox/seat.h"
|
||||||
|
|
||||||
struct wb_server {
|
struct wb_server {
|
||||||
struct wl_display *wl_display;
|
struct wl_display *wl_display;
|
||||||
|
|
||||||
|
struct wlr_allocator *allocator;
|
||||||
struct wlr_backend *backend;
|
struct wlr_backend *backend;
|
||||||
struct wlr_compositor *compositor;
|
struct wlr_compositor *compositor;
|
||||||
struct wlr_renderer *renderer;
|
|
||||||
struct wlr_allocator *allocator;
|
|
||||||
|
|
||||||
struct wlr_output_layout *layout;
|
struct wlr_output_layout *layout;
|
||||||
|
struct wlr_renderer *renderer;
|
||||||
|
|
||||||
struct wb_cursor *cursor;
|
struct wb_cursor *cursor;
|
||||||
struct wb_seat *seat;
|
struct wb_seat *seat;
|
||||||
|
|
||||||
struct wb_view *grabbed_view;
|
struct wb_view *grabbed_view;
|
||||||
double grab_x, grab_y;
|
|
||||||
struct wlr_box grab_geo_box;
|
struct wlr_box grab_geo_box;
|
||||||
|
double grab_x, grab_y;
|
||||||
uint32_t resize_edges;
|
uint32_t resize_edges;
|
||||||
|
struct wl_list views;
|
||||||
|
|
||||||
struct wlr_xdg_shell *xdg_shell;
|
struct wlr_xdg_shell *xdg_shell;
|
||||||
struct wl_listener new_xdg_surface;
|
struct wl_listener new_xdg_surface;
|
||||||
struct wl_list views;
|
struct wl_listener new_xdg_decoration;
|
||||||
|
|
||||||
struct wl_listener new_output;
|
|
||||||
struct wl_listener new_input;
|
struct wl_listener new_input;
|
||||||
struct wl_list outputs; // wb_output::link
|
struct wl_listener new_output;
|
||||||
|
struct wl_list outputs; /* wb_output::link */
|
||||||
};
|
};
|
||||||
|
|
||||||
bool wb_create_backend(struct wb_server* server);
|
bool wb_create_backend(struct wb_server* server);
|
||||||
bool wb_start_server(struct wb_server* server);
|
bool wb_start_server(struct wb_server* server);
|
||||||
bool wb_terminate(struct wb_server* server);
|
bool wb_terminate(struct wb_server* server);
|
||||||
|
|
||||||
#endif // server.h
|
#endif /* server.h */
|
||||||
|
|
|
||||||
|
|
@ -1,3 +1,6 @@
|
||||||
|
#ifndef _WB_XDG_SHELL_H
|
||||||
|
#define _WB_XDG_SHELL_H
|
||||||
|
|
||||||
#include "waybox/server.h"
|
#include "waybox/server.h"
|
||||||
|
|
||||||
void init_xdg_shell(struct wb_server *server);
|
void init_xdg_shell(struct wb_server *server);
|
||||||
|
|
@ -5,3 +8,4 @@ void focus_view(struct wb_view *view, struct wlr_surface *surface);
|
||||||
struct wb_view *desktop_view_at(
|
struct wb_view *desktop_view_at(
|
||||||
struct wb_server *server, double lx, double ly,
|
struct wb_server *server, double lx, double ly,
|
||||||
struct wlr_surface **surface, double *sx, double *sy);
|
struct wlr_surface **surface, double *sx, double *sy);
|
||||||
|
#endif
|
||||||
|
|
|
||||||
43
waybox/decoration.c
Normal file
43
waybox/decoration.c
Normal file
|
|
@ -0,0 +1,43 @@
|
||||||
|
#include "decoration.h"
|
||||||
|
|
||||||
|
static void destroy_xdg_toplevel_decoration(struct wl_listener *listener, void *data)
|
||||||
|
{
|
||||||
|
struct wb_decoration *decoration = wl_container_of(listener, decoration, toplevel_decoration_destroy);
|
||||||
|
wl_list_remove(&decoration->toplevel_decoration_destroy.link);
|
||||||
|
free(decoration);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void free_xdg_decoration_mode(struct wl_listener *listener, void *data)
|
||||||
|
{
|
||||||
|
struct wb_decoration *decoration = wl_container_of(listener, decoration, mode_destroy);
|
||||||
|
wl_list_remove(&decoration->mode_destroy.link);
|
||||||
|
wl_list_remove(&decoration->request_mode.link);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void handle_xdg_decoration_mode(struct wl_listener *listener, void *data)
|
||||||
|
{
|
||||||
|
struct wlr_xdg_toplevel_decoration_v1 *toplevel_decoration = data;
|
||||||
|
wlr_xdg_toplevel_decoration_v1_set_mode(toplevel_decoration, WLR_XDG_TOPLEVEL_DECORATION_V1_MODE_CLIENT_SIDE);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void handle_new_xdg_toplevel_decoration(struct wl_listener *listener, void *data)
|
||||||
|
{
|
||||||
|
struct wb_decoration *decoration = (struct wb_decoration *) calloc(1, sizeof(struct wb_decoration));
|
||||||
|
handle_xdg_decoration_mode(&decoration->request_mode, data);
|
||||||
|
struct wb_server *server = wl_container_of(listener, server, new_xdg_decoration);
|
||||||
|
decoration->server = server;
|
||||||
|
struct wlr_xdg_toplevel_decoration_v1 *toplevel_decoration = data;
|
||||||
|
decoration->toplevel_decoration_destroy.notify = destroy_xdg_toplevel_decoration;
|
||||||
|
wl_signal_add(&toplevel_decoration->manager->events.destroy, &decoration->toplevel_decoration_destroy);
|
||||||
|
decoration->request_mode.notify = handle_xdg_decoration_mode;
|
||||||
|
wl_signal_add(&toplevel_decoration->events.request_mode, &decoration->request_mode);
|
||||||
|
decoration->mode_destroy.notify = free_xdg_decoration_mode;
|
||||||
|
wl_signal_add(&toplevel_decoration->events.destroy, &decoration->mode_destroy);
|
||||||
|
}
|
||||||
|
|
||||||
|
void init_xdg_decoration(struct wb_server *server)
|
||||||
|
{
|
||||||
|
struct wlr_xdg_decoration_manager_v1 *decoration = wlr_xdg_decoration_manager_v1_create(server->wl_display);
|
||||||
|
server->new_xdg_decoration.notify = handle_new_xdg_toplevel_decoration;
|
||||||
|
wl_signal_add(&decoration->events.new_toplevel_decoration, &server->new_xdg_decoration);
|
||||||
|
}
|
||||||
20
waybox/decoration.h
Normal file
20
waybox/decoration.h
Normal file
|
|
@ -0,0 +1,20 @@
|
||||||
|
#ifndef _WB_DECORATION_H
|
||||||
|
#define _WB_DECORATION_H
|
||||||
|
|
||||||
|
#include <wlr/types/wlr_xdg_decoration_v1.h>
|
||||||
|
|
||||||
|
#include "waybox/server.h"
|
||||||
|
|
||||||
|
struct wb_decoration {
|
||||||
|
struct wb_server *server;
|
||||||
|
struct wlr_xdg_decoration_manager_v1 *decoration_manager;
|
||||||
|
struct wlr_xdg_toplevel_decoration_v1 *toplevel_decoration;
|
||||||
|
|
||||||
|
struct wl_listener toplevel_decoration_destroy;
|
||||||
|
struct wl_listener request_mode;
|
||||||
|
struct wl_listener mode_destroy;
|
||||||
|
int yes;
|
||||||
|
};
|
||||||
|
|
||||||
|
void init_xdg_decoration(struct wb_server *server);
|
||||||
|
#endif
|
||||||
|
|
@ -1,6 +1,5 @@
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
#include <unistd.h>
|
#include <unistd.h>
|
||||||
#include <wayland-server.h>
|
|
||||||
|
|
||||||
#include "waybox/server.h"
|
#include "waybox/server.h"
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -1,5 +1,6 @@
|
||||||
wb_src = files(
|
wb_src = files(
|
||||||
'cursor.c',
|
'cursor.c',
|
||||||
|
'decoration.c',
|
||||||
'main.c',
|
'main.c',
|
||||||
'output.c',
|
'output.c',
|
||||||
'seat.c',
|
'seat.c',
|
||||||
|
|
|
||||||
|
|
@ -69,6 +69,7 @@ bool wb_start_server(struct wb_server* server) {
|
||||||
|
|
||||||
wlr_data_device_manager_create(server->wl_display);
|
wlr_data_device_manager_create(server->wl_display);
|
||||||
wl_list_init(&server->views);
|
wl_list_init(&server->views);
|
||||||
|
init_xdg_decoration(server);
|
||||||
init_xdg_shell(server);
|
init_xdg_shell(server);
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
|
|
@ -76,6 +77,7 @@ bool wb_start_server(struct wb_server* server) {
|
||||||
|
|
||||||
bool wb_terminate(struct wb_server* server) {
|
bool wb_terminate(struct wb_server* server) {
|
||||||
wb_cursor_destroy(server->cursor);
|
wb_cursor_destroy(server->cursor);
|
||||||
|
wl_list_remove(&server->new_xdg_decoration.link); /* wb_decoration_destroy */
|
||||||
wb_seat_destroy(server->seat);
|
wb_seat_destroy(server->seat);
|
||||||
wl_display_destroy_clients(server->wl_display);
|
wl_display_destroy_clients(server->wl_display);
|
||||||
wl_display_destroy(server->wl_display);
|
wl_display_destroy(server->wl_display);
|
||||||
|
|
|
||||||
|
|
@ -86,7 +86,7 @@ static void begin_interactive(struct wb_view *view,
|
||||||
struct wb_server *server = view->server;
|
struct wb_server *server = view->server;
|
||||||
struct wlr_surface *focused_surface =
|
struct wlr_surface *focused_surface =
|
||||||
server->seat->seat->pointer_state.focused_surface;
|
server->seat->seat->pointer_state.focused_surface;
|
||||||
if (view->xdg_surface->surface != focused_surface) {
|
if (view->xdg_surface->surface != wlr_surface_get_root_surface(focused_surface)) {
|
||||||
/* Deny move/resize requests from unfocused clients. */
|
/* Deny move/resize requests from unfocused clients. */
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue