mirror of
https://github.com/wizbright/waybox.git
synced 2025-10-29 05:40:20 -04:00
parent
bceafa5b6b
commit
ae42d9d2f7
7 changed files with 86 additions and 57 deletions
|
|
@ -94,7 +94,7 @@ export WB_RC_XML
|
||||||
|
|
||||||
if which dbus-launch >/dev/null 2>&1;
|
if which dbus-launch >/dev/null 2>&1;
|
||||||
then
|
then
|
||||||
DBUS_LANCH="dbus-launch --exit-with-session"
|
DBUS_LAUNCH="dbus-launch --exit-with-session"
|
||||||
fi
|
fi
|
||||||
|
|
||||||
# No need to export these to Waybox
|
# No need to export these to Waybox
|
||||||
|
|
|
||||||
|
|
@ -71,8 +71,13 @@ struct wb_server {
|
||||||
|
|
||||||
struct wl_listener gamma_control_set_gamma;
|
struct wl_listener gamma_control_set_gamma;
|
||||||
struct wl_listener new_layer_surface;
|
struct wl_listener new_layer_surface;
|
||||||
struct wl_listener new_xdg_surface;
|
|
||||||
struct wl_listener new_xdg_decoration;
|
struct wl_listener new_xdg_decoration;
|
||||||
|
#if WLR_CHECK_VERSION(0, 18, 0)
|
||||||
|
struct wl_listener new_xdg_popup;
|
||||||
|
struct wl_listener new_xdg_toplevel;
|
||||||
|
#else
|
||||||
|
struct wl_listener new_xdg_surface;
|
||||||
|
#endif
|
||||||
|
|
||||||
struct wl_listener new_input;
|
struct wl_listener new_input;
|
||||||
struct wl_listener new_output;
|
struct wl_listener new_output;
|
||||||
|
|
|
||||||
|
|
@ -1,7 +1,7 @@
|
||||||
project(
|
project(
|
||||||
'Waybox',
|
'Waybox',
|
||||||
'c',
|
'c',
|
||||||
version: '0.2.2',
|
version: '0.2.3',
|
||||||
license: 'MIT',
|
license: 'MIT',
|
||||||
meson_version: '>=0.52.0',
|
meson_version: '>=0.52.0',
|
||||||
default_options: [
|
default_options: [
|
||||||
|
|
|
||||||
|
|
@ -1,3 +1,4 @@
|
||||||
|
#include <libxml/parser.h>
|
||||||
#include <libxml/xpath.h>
|
#include <libxml/xpath.h>
|
||||||
#include <libxml/xpathInternals.h>
|
#include <libxml/xpathInternals.h>
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -31,8 +31,10 @@ static void handle_new_xdg_toplevel_decoration(struct wl_listener *listener, voi
|
||||||
wl_signal_add(&toplevel_decoration->events.request_mode, &decoration->request_mode);
|
wl_signal_add(&toplevel_decoration->events.request_mode, &decoration->request_mode);
|
||||||
decoration->mode_destroy.notify = free_xdg_decoration_mode;
|
decoration->mode_destroy.notify = free_xdg_decoration_mode;
|
||||||
wl_signal_add(&toplevel_decoration->events.destroy, &decoration->mode_destroy);
|
wl_signal_add(&toplevel_decoration->events.destroy, &decoration->mode_destroy);
|
||||||
/* For some reason, a lot of clients don't emit the request_mode signal. */
|
#if !WLR_CHECK_VERSION (0, 18, 0)
|
||||||
|
/* In older versions, this had to be explicitly called for some window decorations to work. */
|
||||||
handle_xdg_decoration_mode(&decoration->request_mode, toplevel_decoration);
|
handle_xdg_decoration_mode(&decoration->request_mode, toplevel_decoration);
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
void init_xdg_decoration(struct wb_server *server) {
|
void init_xdg_decoration(struct wb_server *server) {
|
||||||
|
|
|
||||||
|
|
@ -45,7 +45,11 @@ bool wb_create_backend(struct wb_server* server) {
|
||||||
server->compositor =
|
server->compositor =
|
||||||
wlr_compositor_create(server->wl_display, 5, server->renderer);
|
wlr_compositor_create(server->wl_display, 5, server->renderer);
|
||||||
server->subcompositor = wlr_subcompositor_create(server->wl_display);
|
server->subcompositor = wlr_subcompositor_create(server->wl_display);
|
||||||
|
#if WLR_CHECK_VERSION(0, 18, 0)
|
||||||
|
server->output_layout = wlr_output_layout_create(server->wl_display);
|
||||||
|
#else
|
||||||
server->output_layout = wlr_output_layout_create();
|
server->output_layout = wlr_output_layout_create();
|
||||||
|
#endif
|
||||||
server->seat = wb_seat_create(server);
|
server->seat = wb_seat_create(server);
|
||||||
server->cursor = wb_cursor_create(server);
|
server->cursor = wb_cursor_create(server);
|
||||||
|
|
||||||
|
|
@ -116,9 +120,9 @@ bool wb_terminate(struct wb_server* server) {
|
||||||
wl_list_remove(&server->new_xdg_decoration.link); /* wb_decoration_destroy */
|
wl_list_remove(&server->new_xdg_decoration.link); /* wb_decoration_destroy */
|
||||||
deinit_config(server->config);
|
deinit_config(server->config);
|
||||||
wl_display_destroy_clients(server->wl_display);
|
wl_display_destroy_clients(server->wl_display);
|
||||||
|
wlr_output_layout_destroy(server->output_layout);
|
||||||
wl_display_destroy(server->wl_display);
|
wl_display_destroy(server->wl_display);
|
||||||
wb_seat_destroy(server->seat);
|
wb_seat_destroy(server->seat);
|
||||||
wlr_output_layout_destroy(server->output_layout);
|
|
||||||
wlr_scene_node_destroy(&server->scene->tree.node);
|
wlr_scene_node_destroy(&server->scene->tree.node);
|
||||||
|
|
||||||
wlr_log(WLR_INFO, "%s", _("Display destroyed"));
|
wlr_log(WLR_INFO, "%s", _("Display destroyed"));
|
||||||
|
|
|
||||||
|
|
@ -156,15 +156,13 @@ static void xdg_toplevel_destroy(struct wl_listener *listener, void *data) {
|
||||||
wl_list_remove(&toplevel->destroy.link);
|
wl_list_remove(&toplevel->destroy.link);
|
||||||
wl_list_remove(&toplevel->new_popup.link);
|
wl_list_remove(&toplevel->new_popup.link);
|
||||||
|
|
||||||
if (toplevel->xdg_toplevel->base->role == WLR_XDG_SURFACE_ROLE_TOPLEVEL) {
|
wl_list_remove(&toplevel->request_fullscreen.link);
|
||||||
wl_list_remove(&toplevel->request_fullscreen.link);
|
wl_list_remove(&toplevel->request_minimize.link);
|
||||||
wl_list_remove(&toplevel->request_minimize.link);
|
wl_list_remove(&toplevel->request_maximize.link);
|
||||||
wl_list_remove(&toplevel->request_maximize.link);
|
wl_list_remove(&toplevel->request_move.link);
|
||||||
wl_list_remove(&toplevel->request_move.link);
|
wl_list_remove(&toplevel->request_resize.link);
|
||||||
wl_list_remove(&toplevel->request_resize.link);
|
|
||||||
wl_list_remove(&toplevel->link);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
wl_list_remove(&toplevel->link);
|
||||||
free(toplevel);
|
free(toplevel);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -313,74 +311,93 @@ static void handle_new_popup(struct wl_listener *listener, void *data) {
|
||||||
wlr_xdg_popup_unconstrain_from_box(popup, &output_toplevel_box);
|
wlr_xdg_popup_unconstrain_from_box(popup, &output_toplevel_box);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void handle_new_xdg_surface(struct wl_listener *listener, void *data) {
|
static void handle_new_xdg_popup(struct wl_listener *listener, void *data) {
|
||||||
/* This event is raised when wlr_xdg_shell receives a new xdg surface from a
|
|
||||||
* client, either a toplevel (application window) or popup. */
|
|
||||||
struct wb_server *server =
|
|
||||||
wl_container_of(listener, server, new_xdg_surface);
|
|
||||||
struct wlr_xdg_surface *xdg_surface = data;
|
|
||||||
|
|
||||||
/* We must add xdg popups to the scene graph so they get rendered. The
|
/* We must add xdg popups to the scene graph so they get rendered. The
|
||||||
* wlroots scene graph provides a helper for this, but to use it we must
|
* wlroots scene graph provides a helper for this, but to use it we must
|
||||||
* provide the proper parent scene node of the xdg popup. To enable this,
|
* provide the proper parent scene node of the xdg popup. To enable this,
|
||||||
* we always set the user data field of xdg_surfaces to the corresponding
|
* we always set the user data field of xdg_surfaces to the corresponding
|
||||||
* scene node. */
|
* scene node. */
|
||||||
if (xdg_surface->role == WLR_XDG_SURFACE_ROLE_POPUP) {
|
struct wlr_xdg_popup *xdg_popup = data;
|
||||||
struct wlr_xdg_surface *parent = wlr_xdg_surface_try_from_wlr_surface(
|
struct wlr_xdg_surface *parent = wlr_xdg_surface_try_from_wlr_surface(
|
||||||
xdg_surface->popup->parent);
|
xdg_popup->parent);
|
||||||
if (parent != NULL) {
|
if (parent != NULL) {
|
||||||
|
struct wlr_scene_tree *parent_tree = parent->data;
|
||||||
struct wlr_scene_tree *parent_tree = parent->data;
|
xdg_popup->base->data = wlr_scene_xdg_surface_create(
|
||||||
xdg_surface->data = wlr_scene_xdg_surface_create(
|
parent_tree, xdg_popup->base);
|
||||||
parent_tree, xdg_surface);
|
|
||||||
}
|
|
||||||
/* The scene graph doesn't currently unconstrain popups, so keep going */
|
|
||||||
/* return; */
|
|
||||||
}
|
}
|
||||||
if (xdg_surface->role == WLR_XDG_SURFACE_ROLE_NONE)
|
}
|
||||||
return;
|
|
||||||
|
|
||||||
/* Allocate a wb_toplevel for this surface */
|
static void handle_new_xdg_toplevel(struct wl_listener *listener, void *data) {
|
||||||
|
struct wb_server *server =
|
||||||
|
#if WLR_CHECK_VERSION (0, 18,0)
|
||||||
|
wl_container_of(listener, server, new_xdg_toplevel);
|
||||||
|
#else
|
||||||
|
wl_container_of(listener, server, new_xdg_surface);
|
||||||
|
#endif
|
||||||
|
struct wlr_xdg_toplevel *xdg_toplevel = data;
|
||||||
|
|
||||||
|
/* Allocate a wb_toplevel for this toplevel */
|
||||||
struct wb_toplevel *toplevel =
|
struct wb_toplevel *toplevel =
|
||||||
calloc(1, sizeof(struct wb_toplevel));
|
calloc(1, sizeof(struct wb_toplevel));
|
||||||
toplevel->server = server;
|
toplevel->server = server;
|
||||||
toplevel->xdg_toplevel = xdg_surface->toplevel;
|
toplevel->xdg_toplevel = xdg_toplevel;
|
||||||
|
|
||||||
/* Listen to the various events it can emit */
|
/* Listen to the various events it can emit */
|
||||||
toplevel->map.notify = xdg_toplevel_map;
|
toplevel->map.notify = xdg_toplevel_map;
|
||||||
wl_signal_add(&xdg_surface->surface->events.map, &toplevel->map);
|
wl_signal_add(&xdg_toplevel->base->surface->events.map, &toplevel->map);
|
||||||
toplevel->unmap.notify = xdg_toplevel_unmap;
|
toplevel->unmap.notify = xdg_toplevel_unmap;
|
||||||
wl_signal_add(&xdg_surface->surface->events.unmap, &toplevel->unmap);
|
wl_signal_add(&xdg_toplevel->base->surface->events.unmap, &toplevel->unmap);
|
||||||
toplevel->destroy.notify = xdg_toplevel_destroy;
|
toplevel->destroy.notify = xdg_toplevel_destroy;
|
||||||
wl_signal_add(&xdg_surface->events.destroy, &toplevel->destroy);
|
#if WLR_CHECK_VERSION (0, 18, 0)
|
||||||
|
wl_signal_add(&xdg_toplevel->events.destroy, &toplevel->destroy);
|
||||||
|
#else
|
||||||
|
wl_signal_add(&xdg_toplevel->base->events.destroy, &toplevel->destroy);
|
||||||
|
#endif
|
||||||
toplevel->new_popup.notify = handle_new_popup;
|
toplevel->new_popup.notify = handle_new_popup;
|
||||||
wl_signal_add(&xdg_surface->events.new_popup, &toplevel->new_popup);
|
wl_signal_add(&xdg_toplevel->base->events.new_popup, &toplevel->new_popup);
|
||||||
|
|
||||||
|
toplevel->scene_tree = wlr_scene_xdg_surface_create(
|
||||||
|
&toplevel->server->scene->tree, xdg_toplevel->base);
|
||||||
|
toplevel->scene_tree->node.data = toplevel;
|
||||||
|
xdg_toplevel->base->data = toplevel->scene_tree;
|
||||||
|
|
||||||
|
toplevel->request_fullscreen.notify = xdg_toplevel_request_fullscreen;
|
||||||
|
wl_signal_add(&xdg_toplevel->events.request_fullscreen, &toplevel->request_fullscreen);
|
||||||
|
toplevel->request_maximize.notify = xdg_toplevel_request_maximize;
|
||||||
|
wl_signal_add(&xdg_toplevel->events.request_maximize, &toplevel->request_maximize);
|
||||||
|
toplevel->request_minimize.notify = xdg_toplevel_request_minimize;
|
||||||
|
wl_signal_add(&xdg_toplevel->events.request_minimize, &toplevel->request_minimize);
|
||||||
|
toplevel->request_move.notify = xdg_toplevel_request_move;
|
||||||
|
wl_signal_add(&xdg_toplevel->events.request_move, &toplevel->request_move);
|
||||||
|
toplevel->request_resize.notify = xdg_toplevel_request_resize;
|
||||||
|
wl_signal_add(&xdg_toplevel->events.request_resize, &toplevel->request_resize);
|
||||||
|
|
||||||
|
wl_list_insert(&toplevel->server->toplevels, &toplevel->link);
|
||||||
|
}
|
||||||
|
|
||||||
|
#if !WLR_CHECK_VERSION(0, 18, 0)
|
||||||
|
static void handle_new_xdg_surface(struct wl_listener *listener, void *data) {
|
||||||
|
struct wlr_xdg_surface *xdg_surface = data;
|
||||||
|
|
||||||
|
if (xdg_surface->role == WLR_XDG_SURFACE_ROLE_POPUP) {
|
||||||
|
handle_new_xdg_popup(listener, xdg_surface->popup);
|
||||||
|
}
|
||||||
if (xdg_surface->role == WLR_XDG_SURFACE_ROLE_TOPLEVEL) {
|
if (xdg_surface->role == WLR_XDG_SURFACE_ROLE_TOPLEVEL) {
|
||||||
toplevel->scene_tree = wlr_scene_xdg_surface_create(
|
handle_new_xdg_toplevel(listener, xdg_surface->toplevel);
|
||||||
&toplevel->server->scene->tree, toplevel->xdg_toplevel->base);
|
|
||||||
toplevel->scene_tree->node.data = toplevel;
|
|
||||||
xdg_surface->data = toplevel->scene_tree;
|
|
||||||
|
|
||||||
struct wlr_xdg_toplevel *xdg_toplevel = toplevel->xdg_toplevel;
|
|
||||||
toplevel->request_fullscreen.notify = xdg_toplevel_request_fullscreen;
|
|
||||||
wl_signal_add(&xdg_toplevel->events.request_fullscreen, &toplevel->request_fullscreen);
|
|
||||||
toplevel->request_maximize.notify = xdg_toplevel_request_maximize;
|
|
||||||
wl_signal_add(&xdg_toplevel->events.request_maximize, &toplevel->request_maximize);
|
|
||||||
toplevel->request_minimize.notify = xdg_toplevel_request_minimize;
|
|
||||||
wl_signal_add(&xdg_toplevel->events.request_minimize, &toplevel->request_minimize);
|
|
||||||
toplevel->request_move.notify = xdg_toplevel_request_move;
|
|
||||||
wl_signal_add(&xdg_toplevel->events.request_move, &toplevel->request_move);
|
|
||||||
toplevel->request_resize.notify = xdg_toplevel_request_resize;
|
|
||||||
wl_signal_add(&xdg_toplevel->events.request_resize, &toplevel->request_resize);
|
|
||||||
|
|
||||||
wl_list_insert(&toplevel->server->toplevels, &toplevel->link);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
void init_xdg_shell(struct wb_server *server) {
|
void init_xdg_shell(struct wb_server *server) {
|
||||||
/* xdg-shell version 3 */
|
/* xdg-shell version 3 */
|
||||||
server->xdg_shell = wlr_xdg_shell_create(server->wl_display, 3);
|
server->xdg_shell = wlr_xdg_shell_create(server->wl_display, 3);
|
||||||
|
#if WLR_CHECK_VERSION (0, 18, 0)
|
||||||
|
server->new_xdg_popup.notify = handle_new_xdg_popup;
|
||||||
|
wl_signal_add(&server->xdg_shell->events.new_popup, &server->new_xdg_popup);
|
||||||
|
server->new_xdg_toplevel.notify = handle_new_xdg_toplevel;
|
||||||
|
wl_signal_add(&server->xdg_shell->events.new_toplevel, &server->new_xdg_toplevel);
|
||||||
|
#else
|
||||||
server->new_xdg_surface.notify = handle_new_xdg_surface;
|
server->new_xdg_surface.notify = handle_new_xdg_surface;
|
||||||
wl_signal_add(&server->xdg_shell->events.new_surface, &server->new_xdg_surface);
|
wl_signal_add(&server->xdg_shell->events.new_surface, &server->new_xdg_surface);
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue